useCurrentUser.ts
1 import { type NLoginType, NUser, useNostrLogin } from '@nostrify/react/login'; 2 import { useNostr } from '@nostrify/react'; 3 import { useCallback, useMemo } from 'react'; 4 5 import { useAuthor } from './useAuthor.ts'; 6 7 export function useCurrentUser() { 8 const { nostr } = useNostr(); 9 const { logins } = useNostrLogin(); 10 11 const loginToUser = useCallback((login: NLoginType): NUser => { 12 switch (login.type) { 13 case 'nsec': // Nostr login with secret key 14 return NUser.fromNsecLogin(login); 15 case 'bunker': // Nostr login with NIP-46 "bunker://" URI 16 return NUser.fromBunkerLogin(login, nostr); 17 case 'extension': // Nostr login with NIP-07 browser extension 18 return NUser.fromExtensionLogin(login); 19 // Other login types can be defined here 20 default: 21 throw new Error(`Unsupported login type: ${login.type}`); 22 } 23 }, [nostr]); 24 25 const users = useMemo(() => { 26 const users: NUser[] = []; 27 28 for (const login of logins) { 29 try { 30 const user = loginToUser(login); 31 users.push(user); 32 } catch (error) { 33 console.warn('Skipped invalid login', login.id, error); 34 } 35 } 36 37 return users; 38 }, [logins, loginToUser]); 39 40 const user = users[0] as NUser | undefined; 41 const author = useAuthor(user?.pubkey); 42 43 return { 44 user, 45 users, 46 ...author.data, 47 }; 48 }