import { type NLoginType, NUser, useNostrLogin } from '@nostrify/react/login'; import { useNostr } from '@nostrify/react'; import { useCallback, useMemo } from 'react'; import { useAuthor } from './useAuthor.ts'; import { AmberSigner } from '@/lib/amber'; import { CapacitorAmberSigner, isNativeAmberAvailable } from '@/lib/capacitorAmberSigner'; import type { AmberLoginType } from './useLoginActions'; /** Extended login type that includes Amber */ type ExtendedLoginType = NLoginType | AmberLoginType; export function useCurrentUser() { const { nostr } = useNostr(); const { logins } = useNostrLogin(); const loginToUser = useCallback((login: ExtendedLoginType): NUser => { switch (login.type) { case 'nsec': // Nostr login with secret key return NUser.fromNsecLogin(login); case 'bunker': // Nostr login with NIP-46 "bunker://" URI return NUser.fromBunkerLogin(login, nostr); case 'extension': // Nostr login with NIP-07 browser extension return NUser.fromExtensionLogin(login); case 'x-amber': { // Nostr login with Amber (NIP-55) const amberLogin = login as AmberLoginType; // On Capacitor (ZapStore APK) use the native plugin signer so all // signing operations go through Amber via native intents. // On web/PWA fall back to the URL-redirect based AmberSigner. // Use the reliable module-level Capacitor check (not window.Capacitor). const signer = isNativeAmberAvailable() ? new CapacitorAmberSigner(amberLogin.pubkey) : new AmberSigner(amberLogin.pubkey); return new NUser('x-amber', amberLogin.pubkey, signer); } // Other login types can be defined here default: throw new Error(`Unsupported login type: ${(login as ExtendedLoginType).type}`); } }, [nostr]); const users = useMemo(() => { const users: NUser[] = []; for (const login of logins) { try { const user = loginToUser(login); users.push(user); } catch (error) { console.warn('Skipped invalid login', login.id, error); } } return users; }, [logins, loginToUser]); const user = users[0] as NUser | undefined; const author = useAuthor(user?.pubkey); return { user, users, isLoadingProfile: author.isLoading, ...author.data, }; }