diff --git a/src/components/auth/LoginDialog.tsx b/src/components/auth/LoginDialog.tsx index ca86a08..8a3f21d 100644 --- a/src/components/auth/LoginDialog.tsx +++ b/src/components/auth/LoginDialog.tsx @@ -16,7 +16,7 @@ import { useLoginActions } from '@/hooks/useLoginActions'; import { useToast } from '@/hooks/useToast'; import { cn } from '@/lib/utils'; import { openAmberForLogin, subscribeToAmberReturn } from '@/lib/amber'; -import { getAmberPublicKeyViaPlugin, isAmberInstalled } from '@/lib/capacitorAmberSigner'; +import { getAmberPublicKeyViaPlugin } from '@/lib/capacitorAmberSigner'; interface LoginDialogProps { @@ -54,23 +54,23 @@ export const LoginDialog: React.FC = ({ isOpen, onClose, onLog if (isCapacitor) { // ── Native path (ZapStore/Capacitor APK) ──────────────────────────────── - // Check Amber is installed first for a clear error message - const installed = await isAmberInstalled(); - if (!installed) { - setAmberError('Amber is not installed. Install it from the ZapStore or GitHub.'); - setAmberStep('error'); - return; - } + // Attempt login directly — skip isExternalSignerInstalled() check because + // Android 11+ package visibility rules can make it return false even when + // Amber IS installed (requires in AndroidManifest.xml). try { // This opens Amber natively, user approves, pubkey comes back as a Promise const pubkey = await getAmberPublicKeyViaPlugin(); completeAmberLogin(pubkey); } catch (e: unknown) { - // User cancelled or Amber threw const msg = (e as Error)?.message ?? 'Amber login failed'; - setAmberError(msg.includes('cancelled') || msg.includes('cancel') - ? 'Login cancelled. Tap "Open Amber" to try again.' - : msg); + // Distinguish: user cancelled vs Amber not installed vs other error + if (msg.toLowerCase().includes('cancel') || msg.toLowerCase().includes('denied')) { + setAmberError('Login cancelled. Tap "Open Amber" to try again.'); + } else if (msg.toLowerCase().includes('not found') || msg.toLowerCase().includes('no activity') || msg.toLowerCase().includes('resolve')) { + setAmberError('Amber not found. Make sure Amber is installed from the ZapStore.'); + } else { + setAmberError(msg); + } setAmberStep('error'); } return;