'use client'; import { useMemo } from 'react'; import Link from 'next/link'; import type { User } from '@supabase/supabase-js'; import { ChevronsUpDown, Cross, Home, LogOut, Shield, UserCircle, } from 'lucide-react'; import { Avatar, AvatarFallback, AvatarImage } from '@kit/ui/avatar'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@kit/ui/dropdown-menu'; import { If } from '@kit/ui/if'; import { SubMenuModeToggle } from '@kit/ui/mode-toggle'; import { ProfileAvatar } from '@kit/ui/profile-avatar'; import { Trans } from '@kit/ui/trans'; import { cn } from '@kit/ui/utils'; import { toTitleCase } from '~/lib/utils'; import { usePersonalAccountData } from '../hooks/use-personal-account-data'; import { ApplicationRole, ApplicationRoleEnum } from '../types/accounts'; const PERSONAL_ACCOUNT_SLUG = 'personal'; export function PersonalAccountDropdown({ className, user, signOutRequested, showProfileName = true, paths, features, account, accounts = [], }: { user: User; account?: { id: string | null; name: string | null; picture_url: string | null; application_role: ApplicationRole | null; }; accounts: { label: string | null; value: string | null; image?: string | null; application_role: ApplicationRole | null; }[]; signOutRequested: () => unknown; paths: { home: string; admin: string; doctor: string; personalAccountSettings: string; }; features: { enableThemeToggle: boolean; }; showProfileName?: boolean; className?: string; }) { const { data: personalAccountData } = usePersonalAccountData(user.id); const { name, last_name } = personalAccountData ?? {}; const firstNameLabel = toTitleCase(name) ?? '-'; const fullNameLabel = name && last_name ? toTitleCase(`${name} ${last_name}`) : '-'; const hasTotpFactor = useMemo(() => { const factors = user?.factors ?? []; return factors.some( (factor) => factor.factor_type === 'totp' && factor.status === 'verified', ); }, [user.factors]); const isSuperAdmin = useMemo(() => { const hasAdminRole = personalAccountData?.application_role === ApplicationRoleEnum.SuperAdmin; return hasAdminRole && hasTotpFactor; }, [personalAccountData, hasTotpFactor]); const isDoctor = useMemo(() => { const hasDoctorRole = personalAccountData?.application_role === ApplicationRoleEnum.Doctor; return hasDoctorRole && hasTotpFactor; }, [personalAccountData, hasTotpFactor]); return (
{firstNameLabel}
{fullNameLabel}
0}> {accounts.map((account) => (
{account.label ? account.label[0] : ''} {account.label}
))}
Super Admin
); }