Root cause: LoginDialog and useCurrentUser detected the native app via
window.Capacitor, which is unreliable inside the WebView (false at mount / not
attached in some builds). So the ZapStore APK fell into the web intent:// redirect
flow and never opened Amber ("Waiting for Amber…" hang).
Fix: add isNativeAmberAvailable() in capacitorAmberSigner.ts using the imported
@capacitor/core Capacitor + native plugin presence, and use it (evaluated at
click time) in LoginDialog.handleAmberLogin and in useCurrentUser's signer
selection. The APK now calls getAmberPublicKeyViaPlugin() → native intent → Amber
opens directly, no redirects.
Bump version to 1.1.7.
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
66 lines
2.3 KiB
TypeScript
66 lines
2.3 KiB
TypeScript
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,
|
|
};
|
|
}
|