import LoginDialog from '@/components/LoginDialog' import LogoutDialog from '@/components/LogoutDialog' import SidebarItem from '@/components/Sidebar/SidebarItem' import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { Skeleton } from '@/components/ui/skeleton' import { formatPubkey, formatNpub, generateImageByPubkey, pubkeyToNpub } from '@/lib/pubkey' import { isVideo } from '@/lib/url' import { cn } from '@/lib/utils' import { useCacheBrowser } from '../contexts/cache-browser-context' import { usePrimaryPage } from '@/contexts/primary-page-context' import { useFetchProfile } from '@/hooks/useFetchProfile' import { useNostr } from '@/providers/NostrProvider' import { ArrowDownUp, Database, LogIn, LogOut, Settings, User, UserRound } from 'lucide-react' import { useMemo, useState, type ReactNode } from 'react' import { useTranslation } from 'react-i18next' export type HelpAndAccountMenuVariant = 'sidebar' | 'titlebar' function AccountDropdownItems({ onSwitchAccount, onLogoutClick }: { onSwitchAccount: () => void onLogoutClick: () => void }) { const { t } = useTranslation() const { navigate } = usePrimaryPage() const { openBrowseCache } = useCacheBrowser() return ( <> navigate('profile')}> {t('Profile')} navigate('settings')}> {t('Settings')} { openBrowseCache() }} > {t('Browse Cache')} {t('Switch account')} {t('Logout')} ) } function SidebarAccountMenu({ onSwitchAccount, onLogoutClick }: { onSwitchAccount: () => void onLogoutClick: () => void }) { const { t } = useTranslation() const { account, profile } = useNostr() const { current, display } = usePrimaryPage() const pubkey = account?.pubkey const { profile: fetchedProfile } = useFetchProfile(pubkey) const active = useMemo(() => current === 'profile' && display, [display, current]) if (!pubkey) return null const defaultAvatar = generateImageByPubkey(pubkey) const npub = pubkeyToNpub(pubkey) const fallbackUsername = npub ? formatNpub(npub) : formatPubkey(pubkey) const resolvedProfile = fetchedProfile ?? profile const { username, avatar } = resolvedProfile || { username: fallbackUsername, avatar: defaultAvatar } return ( ) } function TitlebarAccountMenu({ onSwitchAccount, onLogoutClick }: { onSwitchAccount: () => void onLogoutClick: () => void }) { const { t } = useTranslation() const { account, profile } = useNostr() const pubkey = account?.pubkey const { profile: fetchedProfile } = useFetchProfile(pubkey) const resolvedProfile = fetchedProfile ?? profile const { current, display } = usePrimaryPage() const defaultAvatar = useMemo( () => (resolvedProfile?.pubkey ? generateImageByPubkey(resolvedProfile.pubkey) : ''), [resolvedProfile] ) const active = useMemo(() => current === 'profile' && display, [display, current]) return ( ) } /** Sidebar: account / login stack. Titlebar (mobile): compact account or login control. */ export default function HelpAndAccountMenu({ variant }: { variant: HelpAndAccountMenuVariant }) { const { t } = useTranslation() const { pubkey, checkLogin } = useNostr() const [loginDialogOpen, setLoginDialogOpen] = useState(false) const [logoutDialogOpen, setLogoutDialogOpen] = useState(false) let account: ReactNode if (pubkey) { account = variant === 'sidebar' ? ( setLoginDialogOpen(true)} onLogoutClick={() => setLogoutDialogOpen(true)} /> ) : ( setLoginDialogOpen(true)} onLogoutClick={() => setLogoutDialogOpen(true)} /> ) } else if (variant === 'sidebar') { account = ( checkLogin()} title="Login"> ) } else { account = ( ) } const wrapClass = variant === 'titlebar' ? 'flex shrink-0 items-center gap-1' : 'flex flex-col space-y-2' return ( <>
{account}
) }