"use client" import { useContext, useMemo } from "react" import { AuthUIContext } from "../lib/auth-ui-provider" import { cn } from "../lib/utils" import type { AuthLocalization } from "../localization/auth-localization" import type { Profile } from "../types/profile" import { Skeleton } from "./ui/skeleton" import { UserAvatar, type UserAvatarClassNames } from "./user-avatar" export interface UserViewClassNames { base?: string avatar?: UserAvatarClassNames content?: string title?: string subtitle?: string skeleton?: string } export interface UserViewProps { className?: string classNames?: UserViewClassNames isPending?: boolean size?: "sm" | "default" | "lg" | null user?: Profile | null /** * @default authLocalization * @remarks `AuthLocalization` */ localization?: AuthLocalization } /** * Displays user information with avatar and details in a compact view * * Renders a user's profile information with appropriate fallbacks: * - Shows avatar alongside user name and email when available * - Shows loading skeletons when isPending is true * - Falls back to generic "User" text when neither name nor email is available * - Supports customization through classNames prop */ export function UserView({ className, classNames, isPending, size, user, localization: propLocalization }: UserViewProps) { const { localization: contextLocalization } = useContext(AuthUIContext) const localization = useMemo( () => ({ ...contextLocalization, ...propLocalization }), [contextLocalization, propLocalization] ) return (
{isPending ? ( <> {size !== "sm" && ( )} ) : ( <> {user?.displayName || user?.name || user?.fullName || user?.firstName || user?.displayUsername || user?.username || user?.email || localization?.USER} {!user?.isAnonymous && size !== "sm" && (user?.name || user?.username) && ( {user?.email} )} )}
) }