import { BackLink } from "@/client/components/ui/back-link"; import { Card } from "@/client/components/ui/card"; import { PageHeader } from "@/client/components/ui/page-header"; import { Skeleton } from "@/client/components/ui/skeleton"; import { useRequireSession } from "@/client/hooks/use-auth-guard"; import { type SessionUser } from "@/client/lib/auth-client"; import { fallbackHandle } from "@/client/lib/handle"; const ROW_CLASS = "flex flex-col gap-2 py-4 first:pt-0 last:pb-0 sm:flex-row sm:items-center sm:justify-between sm:gap-6"; const LABEL_CLASS = "font-mono text-xs font-medium uppercase tracking-wider text-zinc-500"; const VALUE_CLASS = "flex min-w-0 flex-wrap items-center gap-2 sm:justify-end"; const CODE_CLASS = "break-all rounded bg-zinc-800/60 px-2 py-1 font-mono text-xs text-zinc-100"; const AccountUserInfoSkeleton = () => (
{Array.from({ length: 4 }, (_, i) => (
))}
); export const AccountUserInfoPage = () => { const session = useRequireSession("/account/userinfo"); if (session.isPending || !session.data) { return ; } const sessionUser = session.data.user as SessionUser; // OIDC `sub` is the Better Auth user id — see src/worker/auth/index.ts // customAccessTokenClaims/customUserInfoClaims. Surfacing it here so users // can paste it into RP support tickets without inspecting a token. const sub = sessionUser.id; const verified = sessionUser.emailVerified === true; const preferredUsername = sessionUser.preferredUsername ?? fallbackHandle(sessionUser); const trimmedName = sessionUser.name?.trim() ?? ""; return (
Account
sub / tessera_sub
{sub}
email
{sessionUser.email} {verified ? "verified" : "unverified"}
preferred_username
{preferredUsername}
{trimmedName ? (
name
{trimmedName}
) : null}
); };