import React, { 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'; interface Account { id: string; pubkey: string; event?: NostrEvent; metadata: NostrMetadata; } 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.map((l) => l.id).join(';')], queryFn: async ({ signal }) => { let events: NostrEvent[] = []; try { events = await nostr.query( [{ kinds: [0], authors: logins.map((l) => l.pubkey) }], { signal: AbortSignal.any([signal, AbortSignal.timeout(500)]) }, ); } catch (error) { console.error('Error fetching accounts:', error); return []; } return logins.map(({ id, pubkey }): Account => { 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 [_, ...otherUsers] = (authors || []) as [Account | undefined, ...Account[]]; const handleLogin = () => { setLoginDialogOpen(false); setSignupDialogOpen(false); }; const currentUser: Account | undefined = (() => { const login = logins[0]; if (!login) return undefined; const author = authors.find((a) => a.id === login.id); return { metadata: {}, ...author, id: login.id, pubkey: login.pubkey }; })(); if (!currentUser) { return ( <> setLoginDialogOpen(false)} onLogin={handleLogin} onSignup={() => setSignupDialogOpen(true)} /> setSignupDialogOpen(false)} /> ); } 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)} /> ); }