import LoginDialog from '@/components/LoginDialog' import LogoutDialog from '@/components/LogoutDialog' import { KeyboardShortcutsHelpButton } from '@/components/KeyboardShortcutsHelp' import KeyboardShortcutsHelpSidebarButton from '@/components/Sidebar/KeyboardShortcutsHelpSidebarButton' 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 { cn } from '@/lib/utils' import { usePrimaryPage } from '@/contexts/primary-page-context' import { useNostr } from '@/providers/NostrProvider' import { ArrowDownUp, 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() return ( <> navigate('profile')}> {t('Profile')} navigate('settings')}> {t('Settings')} {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 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 { username, avatar } = profile || { username: fallbackUsername, avatar: defaultAvatar } return ( ) } function TitlebarAccountMenu({ onSwitchAccount, onLogoutClick }: { onSwitchAccount: () => void onLogoutClick: () => void }) { const { t } = useTranslation() const { profile } = useNostr() const { current, display } = usePrimaryPage() const defaultAvatar = useMemo( () => (profile?.pubkey ? generateImageByPubkey(profile.pubkey) : ''), [profile] ) const active = useMemo(() => current === 'profile' && display, [display, current]) return ( ) } /** * Help (?) + account avatar with the same dropdown on sidebar (desktop) and titlebar (mobile). */ export default function HelpAndAccountMenu({ variant }: { variant: HelpAndAccountMenuVariant }) { const { t } = useTranslation() const { pubkey, checkLogin } = useNostr() const [loginDialogOpen, setLoginDialogOpen] = useState(false) const [logoutDialogOpen, setLogoutDialogOpen] = useState(false) const help = variant === 'sidebar' ? : 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 ( <>
{help} {account}
) }