import { useState } from 'react'; import { ChevronDown, LogOut, User, UserPlus } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu.tsx'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar.tsx'; import { Button } from '@/components/ui/button.tsx'; import { useNostrLogin } from '@nostrify/react/login'; import { useQuery } from '@tanstack/react-query'; import { useNostr } from '@nostrify/react'; import { NSchema as n, NostrEvent, NostrMetadata } from '@nostrify/nostrify'; import LoginForm from './LoginForm'; import SignupForm from './SignupForm'; export function AccountSwitcher() { const { nostr } = useNostr(); const { logins, setLogin, removeLogin } = useNostrLogin(); const [loginDialogOpen, setLoginDialogOpen] = useState(false); const [signupDialogOpen, setSignupDialogOpen] = useState(false); const { data: authors } = useQuery({ queryKey: ['logins', logins], queryFn: async () => { const events = await nostr.query([{ kinds: [0], authors: logins.map((l) => l.pubkey) }]); return logins.map(({ id, pubkey }): { id: string; pubkey: string; event?: NostrEvent; metadata: NostrMetadata } => { const event = events.find((e) => e.pubkey === pubkey); try { const metadata = n.json().pipe(n.metadata()).parse(event?.content); return { id, pubkey, metadata, event }; } catch { return { id, pubkey, metadata: {}, event }; } }); } }); const [currentUser, ...otherUsers] = authors || []; const isLoggedIn = !!currentUser; const handleLogin = () => { setLoginDialogOpen(false); setSignupDialogOpen(false); }; if (!isLoggedIn) { return ( ); } return ( <>
Switch Account
{otherUsers.map((user) => ( setLogin(user.id)} className='flex items-center gap-2 cursor-pointer p-2 rounded-md' > {user.metadata.name?.charAt(0)}

{user.metadata.name}

{user.id === currentUser.id &&
}
))} setLoginDialogOpen(true)} className='flex items-center gap-2 cursor-pointer p-2 rounded-md' > Add another account removeLogin(currentUser.id)} className='flex items-center gap-2 cursor-pointer p-2 rounded-md text-red-500' > Log out
setLoginDialogOpen(false)} onLogin={handleLogin} onSignup={() => setSignupDialogOpen(true)} /> setSignupDialogOpen(false)} /> ); }