supermemory/packages/ui/other/anonymous-auth.tsx
2025-08-21 08:40:44 -07:00

150 lines
4.1 KiB
TypeScript

"use client";
import { authClient } from "@lib/auth";
import { useRouter } from "next/navigation";
import { useEffect } from "react";
export const AnonymousAuth = ({
dashboardPath = "/dashboard",
loginPath = "/login",
}) => {
const router = useRouter();
useEffect(() => {
const createAnonymousSession = async () => {
const session = await authClient.getSession();
if (!session?.session) {
console.debug(
"[ANONYMOUS_AUTH] No session found, creating anonymous session...",
);
try {
// Create anonymous session
console.debug("[ANONYMOUS_AUTH] Calling signIn.anonymous()...");
const res = await authClient.signIn.anonymous();
if (!res.token) {
throw new Error("Failed to get anonymous token");
}
// Get the new session
console.debug(
"[ANONYMOUS_AUTH] Getting new session with anonymous token...",
);
const newSession = await authClient.getSession();
console.debug("[ANONYMOUS_AUTH] New session retrieved:", newSession);
if (!newSession?.session || !newSession?.user) {
console.error(
"[ANONYMOUS_AUTH] Failed to create anonymous session - missing session or user",
);
throw new Error("Failed to create anonymous session");
}
// Get the user's organization
console.debug(
"[ANONYMOUS_AUTH] Fetching organizations for anonymous user...",
);
const orgs = await authClient.organization.list();
console.debug("[ANONYMOUS_AUTH] Organizations retrieved:", {
count: orgs?.length || 0,
orgs: orgs?.map((o) => ({
id: o.id,
name: o.name,
slug: o.slug,
})),
});
const org = orgs?.[0];
if (!org) {
console.error(
"[ANONYMOUS_AUTH] No organization found for anonymous user",
);
throw new Error("Failed to get organization for anonymous user");
}
// Redirect to the organization dashboard
console.debug(
`[ANONYMOUS_AUTH] Redirecting anonymous user to /${org.slug}${dashboardPath}`,
);
router.push(dashboardPath);
} catch (error) {
console.error(
"[ANONYMOUS_AUTH] Anonymous session creation error:",
error,
);
console.error("[ANONYMOUS_AUTH] Error details:", {
message: error instanceof Error ? error.message : "Unknown error",
stack: error instanceof Error ? error.stack : undefined,
});
router.push(loginPath);
}
} else if (session.session) {
// Session exists, handle organization routing
console.debug(
"[ANONYMOUS_AUTH] Session exists, checking organization...",
);
if (!session.session.activeOrganizationId) {
console.debug(
"[ANONYMOUS_AUTH] No active organization ID, fetching organizations...",
);
const orgs = await authClient.organization.list();
console.debug("[ANONYMOUS_AUTH] Organizations for existing user:", {
count: orgs?.length || 0,
orgs: orgs?.map((o) => ({
id: o.id,
name: o.name,
slug: o.slug,
})),
});
if (orgs?.[0]) {
console.debug(
`[ANONYMOUS_AUTH] Setting active organization to ${orgs[0].id}`,
);
await authClient.organization.setActive({
organizationId: orgs[0].id,
});
console.debug(
`[ANONYMOUS_AUTH] Redirecting to /${orgs[0].slug}${dashboardPath}`,
);
router.push(dashboardPath);
}
} else {
console.debug(
`[ANONYMOUS_AUTH] Active organization ID: ${session.session.activeOrganizationId}`,
);
console.debug(
"[ANONYMOUS_AUTH] Fetching full organization details...",
);
const org = await authClient.organization.getFullOrganization({
query: {
organizationId: session.session.activeOrganizationId,
},
});
console.debug("[ANONYMOUS_AUTH] Full organization retrieved:", {
id: org.id,
name: org.name,
slug: org.slug,
});
console.debug(
`[ANONYMOUS_AUTH] Redirecting to /${org.slug}${dashboardPath}`,
);
router.push(dashboardPath);
}
}
};
createAnonymousSession();
}, [router.push]);
// Return null as this component only handles the redirect logic
return null;
};