'use client'; import { useState } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { Check, ChevronsUpDown, LogOut, MessageCircleQuestion, Plus, Settings, Shield, User, Users, } from 'lucide-react'; import { usePersonalAccountData } from '@kit/accounts/hooks/use-personal-account-data'; import { useSignOut } from '@kit/supabase/hooks/use-sign-out'; import { JWTUserData } from '@kit/supabase/types'; import { CreateTeamAccountDialog } from '@kit/team-accounts/components'; import { Avatar, AvatarFallback, AvatarImage } from '@kit/ui/avatar'; import { Button } from '@kit/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, 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 { useSidebar } from '@kit/ui/sidebar'; import { Trans } from '@kit/ui/trans'; import featuresFlagConfig from '~/config/feature-flags.config'; import pathsConfig from '~/config/paths.config'; export type AccountModel = { label: string | null; value: string | null; image: string | null; }; interface WorkspaceDropdownProps { user: JWTUserData; accounts: AccountModel[]; selectedAccount?: string; workspace?: { id: string | null; name: string | null; picture_url: string | null; }; } export function WorkspaceDropdown({ user, accounts, selectedAccount, workspace, }: WorkspaceDropdownProps) { const router = useRouter(); const { open: isSidebarOpen } = useSidebar(); const signOutMutation = useSignOut(); const [isCreatingTeam, setIsCreatingTeam] = useState(false); const collapsed = !isSidebarOpen; const isTeamContext = !!selectedAccount; const { data: personalAccountData } = usePersonalAccountData( user.id, workspace, ); const displayName = personalAccountData?.name ?? user.email ?? ''; const userEmail = user.email ?? ''; const isSuperAdmin = user.app_metadata.role === 'super-admin' && user.aal === 'aal2'; const currentTeam = accounts.find((a) => a.value === selectedAccount); const currentLabel = isTeamContext ? (currentTeam?.label ?? selectedAccount) : displayName; const currentAvatar = isTeamContext ? (currentTeam?.image ?? null) : (personalAccountData?.picture_url ?? null); const settingsPath = selectedAccount ? pathsConfig.app.accountSettings.replace('[account]', selectedAccount) : pathsConfig.app.personalAccountSettings; const switchToPersonal = () => { if (!featuresFlagConfig.enableTeamsOnly) { router.replace(pathsConfig.app.home); } }; const switchToTeam = (slug: string) => { router.replace(pathsConfig.app.accountHome.replace('[account]', slug)); }; return (
{collapsed ? (
{isTeamContext ? ( (currentLabel ?? '').charAt(0).toUpperCase() ) : ( )} } />
) : ( {isTeamContext ? ( (currentLabel ?? '').charAt(0).toUpperCase() ) : ( )} {currentLabel} } /> )}
{displayName} {userEmail}
{!isTeamContext && }
{accounts.length > 0 && ( <> {accounts.map((account) => ( { if ( account.value && account.value !== selectedAccount ) { switchToTeam(account.value); } }} > {(account.label ?? '').charAt(0).toUpperCase()}
{account.label}
{selectedAccount === account.value && ( )}
))} )} setIsCreatingTeam(true)} data-test="create-team-trigger" className="bg-background/50 sticky bottom-0 mt-1 flex h-10 w-full gap-2 border backdrop-blur-lg" >
} /> Super Admin } /> } /> signOutMutation.mutate()} >
); }