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}
>
)
}