@entropy-softworks/ui 2026.8.23 → 2026.8.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/auth/LockOverlay.d.ts +9 -11
- package/lib/components/auth/LockOverlay.d.ts.map +1 -1
- package/lib/components/auth/LockOverlay.jsx +58 -35
- package/lib/components/auth/LockOverlay.jsx.map +1 -1
- package/lib/hooks/index.d.ts +1 -1
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useAuth.d.ts +20 -2
- package/lib/hooks/useAuth.d.ts.map +1 -1
- package/lib/hooks/useAuth.jsx +14 -7
- package/lib/hooks/useAuth.jsx.map +1 -1
- package/package.json +1 -1
- package/src/components/auth/LockOverlay.tsx +97 -55
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useAuth.tsx +47 -9
|
@@ -11,17 +11,15 @@ interface LockOverlayProps {
|
|
|
11
11
|
successMessage?: string;
|
|
12
12
|
/**
|
|
13
13
|
* Optional biometric/passkey unlock. When provided, this fires
|
|
14
|
-
* AUTOMATICALLY once on mount
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* would fire immediately and unprompted on every single mount since
|
|
24
|
-
* this path is now automatic.
|
|
14
|
+
* AUTOMATICALLY once on mount, and the password field/Unlock button
|
|
15
|
+
* are not rendered at all until this settles — see the mode-switching
|
|
16
|
+
* comment below for why. This overlay has no opinion on *how* unlock
|
|
17
|
+
* happens (passkey PRF, platform secure-storage, etc.) — the caller
|
|
18
|
+
* owns the whole ceremony and is expected to swallow expected failure
|
|
19
|
+
* modes (user cancel, nothing enrolled) rather than throw; a throw
|
|
20
|
+
* here surfaces the same generic "unlock failed" error the password
|
|
21
|
+
* path does, which is the wrong message for "you tapped cancel on the
|
|
22
|
+
* Face ID prompt".
|
|
25
23
|
*/
|
|
26
24
|
onBiometricUnlock?: () => Promise<void> | void;
|
|
27
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LockOverlay.d.ts","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"LockOverlay.d.ts","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAiB3D,UAAU,gBAAgB;IACxB;;;OAGG;IACH,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,4CAA4C;IAC5C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAChD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,cAAc,EACd,iBAAiB,GAClB,EAAE,gBAAgB,qBA0NlB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useState } from "react";
|
|
1
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
2
2
|
import { Platform, Pressable, View } from "react-native";
|
|
3
3
|
import { Ionicons } from "@expo/vector-icons";
|
|
4
4
|
import Toast from "react-native-toast-message";
|
|
@@ -24,19 +24,27 @@ export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUn
|
|
|
24
24
|
const [biometricState, setBiometricState] = useState("idle");
|
|
25
25
|
const [error, setError] = useState("");
|
|
26
26
|
const pulse = useSharedValue(1);
|
|
27
|
-
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
27
|
+
const hasAutoPrompted = useRef(false);
|
|
28
|
+
// Two distinct screens, not one screen with an extra button:
|
|
29
|
+
// "biometric" — fingerprint icon only. No password field, no Unlock
|
|
30
|
+
// button anywhere in the tree.
|
|
31
|
+
// "password" — the normal password form, shown once biometric
|
|
32
|
+
// unlock isn't offered at all, OR once an attempt has
|
|
33
|
+
// settled (succeeded or failed — a real success
|
|
34
|
+
// unmounts this whole overlay from the parent almost
|
|
35
|
+
// immediately, so briefly being in "password" mode in
|
|
36
|
+
// that case is never visible).
|
|
37
|
+
// The password field being ABSENT from the tree during "biometric"
|
|
38
|
+
// mode is load-bearing, not cosmetic: Android's Autofill Framework
|
|
39
|
+
// triggers independently of the passkey ceremony, purely from a
|
|
40
|
+
// password-type field being mounted and focusable on screen. With
|
|
41
|
+
// both mounted together, the passkey ceremony's own Credential
|
|
42
|
+
// Manager UI and Bitwarden's separately-triggered autofill prompt
|
|
43
|
+
// fought each other — dismiss one, the other reopens immediately,
|
|
44
|
+
// neither settling — reported as a black screen the app never
|
|
45
|
+
// recovered from, root-caused on 2026-08-17. There is no such field
|
|
46
|
+
// for Android to react to until biometric unlock has actually failed.
|
|
47
|
+
const [mode, setMode] = useState(onBiometricUnlock ? "biometric" : "password");
|
|
40
48
|
const triggerBiometricUnlock = React.useCallback(async () => {
|
|
41
49
|
if (!onBiometricUnlock) {
|
|
42
50
|
return;
|
|
@@ -47,8 +55,15 @@ export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUn
|
|
|
47
55
|
}
|
|
48
56
|
finally {
|
|
49
57
|
setBiometricState("idle");
|
|
58
|
+
setMode("password");
|
|
50
59
|
}
|
|
51
60
|
}, [onBiometricUnlock]);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (onBiometricUnlock && !hasAutoPrompted.current) {
|
|
63
|
+
hasAutoPrompted.current = true;
|
|
64
|
+
void triggerBiometricUnlock();
|
|
65
|
+
}
|
|
66
|
+
}, [onBiometricUnlock, triggerBiometricUnlock]);
|
|
52
67
|
useEffect(() => {
|
|
53
68
|
if (biometricState === "prompting") {
|
|
54
69
|
pulse.value = withRepeat(withTiming(1.12, { duration: 650, easing: Easing.inOut(Easing.ease) }), -1, true);
|
|
@@ -94,6 +109,27 @@ export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUn
|
|
|
94
109
|
setLoading(false);
|
|
95
110
|
}
|
|
96
111
|
};
|
|
112
|
+
if (mode === "biometric") {
|
|
113
|
+
return (<View className="flex-1 items-center justify-center bg-background dark:bg-black px-6">
|
|
114
|
+
<View className="mb-8 flex-row items-center justify-center">
|
|
115
|
+
<Logo width={56} height={56}/>
|
|
116
|
+
<Text className="font-sans-bold text-[28px] text-foreground dark:text-white">
|
|
117
|
+
{appName}
|
|
118
|
+
</Text>
|
|
119
|
+
</View>
|
|
120
|
+
<Pressable onPress={triggerBiometricUnlock} accessibilityRole="button" accessibilityLabel="Unlock with biometrics" testID="lock-biometric-icon" className="items-center">
|
|
121
|
+
<Animated.View style={pulseStyle} className="h-24 w-24 items-center justify-center rounded-full bg-neutral-100 dark:bg-neutral-900">
|
|
122
|
+
<Ionicons name="finger-print" size={52} color={isDark ? "#FFFFFF" : "#000000"}/>
|
|
123
|
+
</Animated.View>
|
|
124
|
+
<MutedText className="mt-3 text-sm">
|
|
125
|
+
{biometricState === "prompting" ? "Authenticating…" : "Tap to unlock"}
|
|
126
|
+
</MutedText>
|
|
127
|
+
</Pressable>
|
|
128
|
+
<Text className="mt-10 text-xs text-muted-foreground dark:text-neutral-500" onPress={onSignOut} accessibilityRole="button" accessibilityLabel="Sign out">
|
|
129
|
+
Sign out
|
|
130
|
+
</Text>
|
|
131
|
+
</View>);
|
|
132
|
+
}
|
|
97
133
|
return (<View className="flex-1 items-center justify-center bg-background dark:bg-black">
|
|
98
134
|
<View className="w-full max-w-[340px] items-center px-6">
|
|
99
135
|
<View className="mb-2 flex-row items-center justify-center">
|
|
@@ -106,21 +142,10 @@ export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUn
|
|
|
106
142
|
Enter your master password to unlock
|
|
107
143
|
</MutedText>
|
|
108
144
|
|
|
109
|
-
{onBiometricUnlock ? (
|
|
110
|
-
<
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
</Animated.View>
|
|
114
|
-
<MutedText className="mt-2 text-xs">
|
|
115
|
-
{biometricState === "prompting" ? "Authenticating…" : "Tap to unlock"}
|
|
116
|
-
</MutedText>
|
|
117
|
-
</Pressable>
|
|
118
|
-
<View className="mb-3 w-full flex-row items-center gap-3">
|
|
119
|
-
<View className="h-px flex-1 bg-border dark:bg-neutral-800"/>
|
|
120
|
-
<MutedText className="text-xs">or use your password</MutedText>
|
|
121
|
-
<View className="h-px flex-1 bg-border dark:bg-neutral-800"/>
|
|
122
|
-
</View>
|
|
123
|
-
</>) : null}
|
|
145
|
+
{onBiometricUnlock ? (<Pressable onPress={() => setMode("biometric")} accessibilityRole="button" accessibilityLabel="Try biometrics again" className="mb-6 flex-row items-center gap-2">
|
|
146
|
+
<Ionicons name="finger-print" size={16} color={isDark ? "#A3A3A3" : "#737373"}/>
|
|
147
|
+
<MutedText className="text-xs">Try biometrics again</MutedText>
|
|
148
|
+
</Pressable>) : null}
|
|
124
149
|
|
|
125
150
|
<View className="w-full gap-3">
|
|
126
151
|
<PasswordInput value={password} onChangeText={(text) => {
|
|
@@ -130,12 +155,10 @@ export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUn
|
|
|
130
155
|
}
|
|
131
156
|
}} placeholder="Master password" error={error}
|
|
132
157
|
// Web: autofocus on a login-style page is expected desktop
|
|
133
|
-
// UX. Native:
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
// reported as a real annoyance on 2026-08-17. Unlock should
|
|
138
|
-
// wait for an explicit tap on the field.
|
|
158
|
+
// UX. Native: autofocus here pops the on-screen keyboard
|
|
159
|
+
// unprompted the moment the password fallback appears —
|
|
160
|
+
// reported as a real annoyance previously. Wait for an
|
|
161
|
+
// explicit tap on the field.
|
|
139
162
|
autoFocus={Platform.OS === "web"} returnKeyType="done" onSubmitEditing={handleUnlock} accessibilityLabel="Master password" testID="lock-password-input"/>
|
|
140
163
|
<Button className="w-full" onPress={handleUnlock} isLoading={loading} accessibilityLabel="Unlock" accessibilityRole="button" testID="lock-unlock-button">
|
|
141
164
|
Unlock
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LockOverlay.jsx","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"LockOverlay.jsx","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"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"}
|
package/lib/hooks/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AuthProvider, useAuth, useRole, useRequireAuth, useSession, type AuthProviderProps, type AuthContextType, type PasskeyLoginResult, } from "./useAuth";
|
|
1
|
+
export { AuthProvider, useAuth, useRole, useRequireAuth, useSession, type AuthProviderProps, type AuthContextType, type PasskeyLoginResult, type LoginWithPasskeyOptions, } from "./useAuth";
|
|
2
2
|
export { useShakeAnimation } from "./useShakeAnimation";
|
|
3
3
|
export { useDebouncedValue } from "./useDebouncedValue";
|
|
4
4
|
export { useAutoLock, type UseAutoLockOptions } from "./useAutoLock";
|
package/lib/hooks/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/lib/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,GAKX,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,WAAW,EAA2B,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAA4B,MAAM,oBAAoB,CAAC"}
|
package/lib/hooks/useAuth.d.ts
CHANGED
|
@@ -17,6 +17,24 @@ export interface PasskeyLoginResult {
|
|
|
17
17
|
unlocked: boolean;
|
|
18
18
|
user: User;
|
|
19
19
|
}
|
|
20
|
+
export interface LoginWithPasskeyOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Request the "immediately-available-only, zero cross-app UI" variant
|
|
23
|
+
* of the ceremony (native `getImmediate` / web `mediation: "silent"`):
|
|
24
|
+
* succeeds only if a credential is available locally, with no
|
|
25
|
+
* Credential Manager picker across other registered providers and no
|
|
26
|
+
* modal at all on failure. Use for an auto-fired, opportunistic
|
|
27
|
+
* attempt (e.g. a lock screen prompting for biometrics the moment it
|
|
28
|
+
* mounts) — the normal path's full cross-app arbitration is correct
|
|
29
|
+
* for an explicit "sign in with a passkey" tap, but was observed
|
|
30
|
+
* colliding with another installed password manager's own autofill
|
|
31
|
+
* prompt when fired automatically on every app launch. When true,
|
|
32
|
+
* this call also skips the shared `isLoading`/`error` state below —
|
|
33
|
+
* a background opportunistic check should not flash a loading state
|
|
34
|
+
* or surface an error banner anywhere else in the app on failure.
|
|
35
|
+
*/
|
|
36
|
+
silent?: boolean;
|
|
37
|
+
}
|
|
20
38
|
interface AuthContextType {
|
|
21
39
|
user: User | null;
|
|
22
40
|
isLoading: boolean;
|
|
@@ -29,7 +47,7 @@ interface AuthContextType {
|
|
|
29
47
|
* to a `useEffect` cleanup so unmounting the screen tears the OS
|
|
30
48
|
* prompt down instead of leaving an orphaned resolution.
|
|
31
49
|
*/
|
|
32
|
-
loginWithPasskey: (email?: string, signal?: AbortSignal) => Promise<PasskeyLoginResult>;
|
|
50
|
+
loginWithPasskey: (email?: string, signal?: AbortSignal, opts?: LoginWithPasskeyOptions) => Promise<PasskeyLoginResult>;
|
|
33
51
|
/**
|
|
34
52
|
* Complete a non-PRF passkey unlock by deriving the local key from
|
|
35
53
|
* the master password. Available when the consumer provided
|
|
@@ -73,7 +91,7 @@ export interface AuthProviderProps {
|
|
|
73
91
|
* the flow; returning `{ unlocked: false }` keeps the session but tells
|
|
74
92
|
* the screen to collect the master password and call `unlockWithPassword`.
|
|
75
93
|
*/
|
|
76
|
-
loginWithPasskey?: (email?: string, signal?: AbortSignal) => Promise<PasskeyLoginResult>;
|
|
94
|
+
loginWithPasskey?: (email?: string, signal?: AbortSignal, opts?: LoginWithPasskeyOptions) => Promise<PasskeyLoginResult>;
|
|
77
95
|
/**
|
|
78
96
|
* Optional master-password unlock. Used by the passkey flow when the
|
|
79
97
|
* authenticator did not honor PRF.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAoB,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErF;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;;;;;;OAMG;IACH,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAoB,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErF;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;;;;;;OAMG;IACH,gBAAgB,EAAE,CAChB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,uBAAuB,KAC3B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClF,8DAA8D;IAC9D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrF;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CACjB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,uBAAuB,KAC3B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAAE,wBAAwB,EAC1C,kBAAkB,EAAE,0BAA0B,EAC9C,OAAO,GACR,EAAE,iBAAiB,qBAgXnB;AAED,wBAAgB,OAAO,IAAI,eAAe,CAMzC;AAED,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,wBAAgB,OAAO,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAS/D;AAED,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI;;;EAa/C;AAED,wBAAgB,UAAU;;EAuCzB;AAKD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAExF,eAAe,OAAO,CAAC"}
|
package/lib/hooks/useAuth.jsx
CHANGED
|
@@ -275,25 +275,32 @@ export function AuthProvider({ children, onAfterLogin, onAfterRegister, onBefore
|
|
|
275
275
|
setIsLoading(false);
|
|
276
276
|
}
|
|
277
277
|
}, [onBeforeLogout, router, routes]);
|
|
278
|
-
const loginWithPasskey = useCallback(async (email, signal) => {
|
|
278
|
+
const loginWithPasskey = useCallback(async (email, signal, opts) => {
|
|
279
279
|
if (!providedLoginWithPasskey) {
|
|
280
280
|
throw new Error("entropy-ui: loginWithPasskey() called but AuthProvider wasn't given a loginWithPasskey handler.");
|
|
281
281
|
}
|
|
282
|
+
const silent = opts?.silent ?? false;
|
|
282
283
|
try {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
284
|
+
if (!silent) {
|
|
285
|
+
setIsLoading(true);
|
|
286
|
+
setError(null);
|
|
287
|
+
}
|
|
288
|
+
const result = await providedLoginWithPasskey(email, signal, opts);
|
|
286
289
|
setUser(result.user);
|
|
287
290
|
setIsAuthenticated(true);
|
|
288
291
|
return result;
|
|
289
292
|
}
|
|
290
293
|
catch (err) {
|
|
291
|
-
|
|
292
|
-
|
|
294
|
+
if (!silent) {
|
|
295
|
+
const message = err instanceof Error ? err.message : "Passkey sign-in failed";
|
|
296
|
+
setError(message);
|
|
297
|
+
}
|
|
293
298
|
throw err;
|
|
294
299
|
}
|
|
295
300
|
finally {
|
|
296
|
-
|
|
301
|
+
if (!silent) {
|
|
302
|
+
setIsLoading(false);
|
|
303
|
+
}
|
|
297
304
|
}
|
|
298
305
|
}, [providedLoginWithPasskey]);
|
|
299
306
|
const unlockWithPassword = useCallback(async (password) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.jsx","sourceRoot":"","sources":["../../src/hooks/useAuth.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAuth.jsx","sourceRoot":"","sources":["../../src/hooks/useAuth.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useState } from "react";
|
|
1
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
2
2
|
import { Platform, Pressable, View } from "react-native";
|
|
3
3
|
import { Ionicons } from "@expo/vector-icons";
|
|
4
4
|
import Toast from "react-native-toast-message";
|
|
@@ -27,17 +27,15 @@ interface LockOverlayProps {
|
|
|
27
27
|
successMessage?: string;
|
|
28
28
|
/**
|
|
29
29
|
* Optional biometric/passkey unlock. When provided, this fires
|
|
30
|
-
* AUTOMATICALLY once on mount
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* would fire immediately and unprompted on every single mount since
|
|
40
|
-
* this path is now automatic.
|
|
30
|
+
* AUTOMATICALLY once on mount, and the password field/Unlock button
|
|
31
|
+
* are not rendered at all until this settles — see the mode-switching
|
|
32
|
+
* comment below for why. This overlay has no opinion on *how* unlock
|
|
33
|
+
* happens (passkey PRF, platform secure-storage, etc.) — the caller
|
|
34
|
+
* owns the whole ceremony and is expected to swallow expected failure
|
|
35
|
+
* modes (user cancel, nothing enrolled) rather than throw; a throw
|
|
36
|
+
* here surfaces the same generic "unlock failed" error the password
|
|
37
|
+
* path does, which is the wrong message for "you tapped cancel on the
|
|
38
|
+
* Face ID prompt".
|
|
41
39
|
*/
|
|
42
40
|
onBiometricUnlock?: () => Promise<void> | void;
|
|
43
41
|
}
|
|
@@ -63,20 +61,31 @@ export function LockOverlay({
|
|
|
63
61
|
const [biometricState, setBiometricState] = useState<"idle" | "prompting">("idle");
|
|
64
62
|
const [error, setError] = useState("");
|
|
65
63
|
const pulse = useSharedValue(1);
|
|
64
|
+
const hasAutoPrompted = useRef(false);
|
|
65
|
+
|
|
66
|
+
// Two distinct screens, not one screen with an extra button:
|
|
67
|
+
// "biometric" — fingerprint icon only. No password field, no Unlock
|
|
68
|
+
// button anywhere in the tree.
|
|
69
|
+
// "password" — the normal password form, shown once biometric
|
|
70
|
+
// unlock isn't offered at all, OR once an attempt has
|
|
71
|
+
// settled (succeeded or failed — a real success
|
|
72
|
+
// unmounts this whole overlay from the parent almost
|
|
73
|
+
// immediately, so briefly being in "password" mode in
|
|
74
|
+
// that case is never visible).
|
|
75
|
+
// The password field being ABSENT from the tree during "biometric"
|
|
76
|
+
// mode is load-bearing, not cosmetic: Android's Autofill Framework
|
|
77
|
+
// triggers independently of the passkey ceremony, purely from a
|
|
78
|
+
// password-type field being mounted and focusable on screen. With
|
|
79
|
+
// both mounted together, the passkey ceremony's own Credential
|
|
80
|
+
// Manager UI and Bitwarden's separately-triggered autofill prompt
|
|
81
|
+
// fought each other — dismiss one, the other reopens immediately,
|
|
82
|
+
// neither settling — reported as a black screen the app never
|
|
83
|
+
// recovered from, root-caused on 2026-08-17. There is no such field
|
|
84
|
+
// for Android to react to until biometric unlock has actually failed.
|
|
85
|
+
const [mode, setMode] = useState<"biometric" | "password">(
|
|
86
|
+
onBiometricUnlock ? "biometric" : "password"
|
|
87
|
+
);
|
|
66
88
|
|
|
67
|
-
// Fires only on explicit tap of the fingerprint icon below — NOT
|
|
68
|
-
// automatically on mount (that was here briefly). On Android, a
|
|
69
|
-
// passkey/WebAuthn ceremony goes through the OS's Credential Manager,
|
|
70
|
-
// which surfaces EVERY registered credential provider on the device —
|
|
71
|
-
// including other password managers like Bitwarden if one is set as
|
|
72
|
-
// an autofill/credential provider. Firing that automatically on every
|
|
73
|
-
// single mount raced against Bitwarden's own autofill prompt for this
|
|
74
|
-
// app, the two fighting each other: dismiss one, the other reopens
|
|
75
|
-
// immediately, with vault's own UI never getting a chance to paint
|
|
76
|
-
// underneath — reported as a black screen that wouldn't go away, on
|
|
77
|
-
// 2026-08-17. Requiring an explicit tap avoids ever entering that
|
|
78
|
-
// credential-provider arbitration unless the user actually asked for
|
|
79
|
-
// it just now.
|
|
80
89
|
const triggerBiometricUnlock = React.useCallback(async () => {
|
|
81
90
|
if (!onBiometricUnlock) {
|
|
82
91
|
return;
|
|
@@ -86,9 +95,17 @@ export function LockOverlay({
|
|
|
86
95
|
await onBiometricUnlock();
|
|
87
96
|
} finally {
|
|
88
97
|
setBiometricState("idle");
|
|
98
|
+
setMode("password");
|
|
89
99
|
}
|
|
90
100
|
}, [onBiometricUnlock]);
|
|
91
101
|
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (onBiometricUnlock && !hasAutoPrompted.current) {
|
|
104
|
+
hasAutoPrompted.current = true;
|
|
105
|
+
void triggerBiometricUnlock();
|
|
106
|
+
}
|
|
107
|
+
}, [onBiometricUnlock, triggerBiometricUnlock]);
|
|
108
|
+
|
|
92
109
|
useEffect(() => {
|
|
93
110
|
if (biometricState === "prompting") {
|
|
94
111
|
pulse.value = withRepeat(
|
|
@@ -141,6 +158,44 @@ export function LockOverlay({
|
|
|
141
158
|
}
|
|
142
159
|
};
|
|
143
160
|
|
|
161
|
+
if (mode === "biometric") {
|
|
162
|
+
return (
|
|
163
|
+
<View className="flex-1 items-center justify-center bg-background dark:bg-black px-6">
|
|
164
|
+
<View className="mb-8 flex-row items-center justify-center">
|
|
165
|
+
<Logo width={56} height={56} />
|
|
166
|
+
<Text className="font-sans-bold text-[28px] text-foreground dark:text-white">
|
|
167
|
+
{appName}
|
|
168
|
+
</Text>
|
|
169
|
+
</View>
|
|
170
|
+
<Pressable
|
|
171
|
+
onPress={triggerBiometricUnlock}
|
|
172
|
+
accessibilityRole="button"
|
|
173
|
+
accessibilityLabel="Unlock with biometrics"
|
|
174
|
+
testID="lock-biometric-icon"
|
|
175
|
+
className="items-center"
|
|
176
|
+
>
|
|
177
|
+
<Animated.View
|
|
178
|
+
style={pulseStyle}
|
|
179
|
+
className="h-24 w-24 items-center justify-center rounded-full bg-neutral-100 dark:bg-neutral-900"
|
|
180
|
+
>
|
|
181
|
+
<Ionicons name="finger-print" size={52} color={isDark ? "#FFFFFF" : "#000000"} />
|
|
182
|
+
</Animated.View>
|
|
183
|
+
<MutedText className="mt-3 text-sm">
|
|
184
|
+
{biometricState === "prompting" ? "Authenticating…" : "Tap to unlock"}
|
|
185
|
+
</MutedText>
|
|
186
|
+
</Pressable>
|
|
187
|
+
<Text
|
|
188
|
+
className="mt-10 text-xs text-muted-foreground dark:text-neutral-500"
|
|
189
|
+
onPress={onSignOut}
|
|
190
|
+
accessibilityRole="button"
|
|
191
|
+
accessibilityLabel="Sign out"
|
|
192
|
+
>
|
|
193
|
+
Sign out
|
|
194
|
+
</Text>
|
|
195
|
+
</View>
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
144
199
|
return (
|
|
145
200
|
<View className="flex-1 items-center justify-center bg-background dark:bg-black">
|
|
146
201
|
<View className="w-full max-w-[340px] items-center px-6">
|
|
@@ -155,30 +210,19 @@ export function LockOverlay({
|
|
|
155
210
|
</MutedText>
|
|
156
211
|
|
|
157
212
|
{onBiometricUnlock ? (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
</Animated.View>
|
|
172
|
-
<MutedText className="mt-2 text-xs">
|
|
173
|
-
{biometricState === "prompting" ? "Authenticating…" : "Tap to unlock"}
|
|
174
|
-
</MutedText>
|
|
175
|
-
</Pressable>
|
|
176
|
-
<View className="mb-3 w-full flex-row items-center gap-3">
|
|
177
|
-
<View className="h-px flex-1 bg-border dark:bg-neutral-800" />
|
|
178
|
-
<MutedText className="text-xs">or use your password</MutedText>
|
|
179
|
-
<View className="h-px flex-1 bg-border dark:bg-neutral-800" />
|
|
180
|
-
</View>
|
|
181
|
-
</>
|
|
213
|
+
<Pressable
|
|
214
|
+
onPress={() => setMode("biometric")}
|
|
215
|
+
accessibilityRole="button"
|
|
216
|
+
accessibilityLabel="Try biometrics again"
|
|
217
|
+
className="mb-6 flex-row items-center gap-2"
|
|
218
|
+
>
|
|
219
|
+
<Ionicons
|
|
220
|
+
name="finger-print"
|
|
221
|
+
size={16}
|
|
222
|
+
color={isDark ? "#A3A3A3" : "#737373"}
|
|
223
|
+
/>
|
|
224
|
+
<MutedText className="text-xs">Try biometrics again</MutedText>
|
|
225
|
+
</Pressable>
|
|
182
226
|
) : null}
|
|
183
227
|
|
|
184
228
|
<View className="w-full gap-3">
|
|
@@ -193,12 +237,10 @@ export function LockOverlay({
|
|
|
193
237
|
placeholder="Master password"
|
|
194
238
|
error={error}
|
|
195
239
|
// Web: autofocus on a login-style page is expected desktop
|
|
196
|
-
// UX. Native:
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
//
|
|
200
|
-
// reported as a real annoyance on 2026-08-17. Unlock should
|
|
201
|
-
// wait for an explicit tap on the field.
|
|
240
|
+
// UX. Native: autofocus here pops the on-screen keyboard
|
|
241
|
+
// unprompted the moment the password fallback appears —
|
|
242
|
+
// reported as a real annoyance previously. Wait for an
|
|
243
|
+
// explicit tap on the field.
|
|
202
244
|
autoFocus={Platform.OS === "web"}
|
|
203
245
|
returnKeyType="done"
|
|
204
246
|
onSubmitEditing={handleUnlock}
|
package/src/hooks/index.ts
CHANGED
package/src/hooks/useAuth.tsx
CHANGED
|
@@ -29,6 +29,25 @@ export interface PasskeyLoginResult {
|
|
|
29
29
|
user: User;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
export interface LoginWithPasskeyOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Request the "immediately-available-only, zero cross-app UI" variant
|
|
35
|
+
* of the ceremony (native `getImmediate` / web `mediation: "silent"`):
|
|
36
|
+
* succeeds only if a credential is available locally, with no
|
|
37
|
+
* Credential Manager picker across other registered providers and no
|
|
38
|
+
* modal at all on failure. Use for an auto-fired, opportunistic
|
|
39
|
+
* attempt (e.g. a lock screen prompting for biometrics the moment it
|
|
40
|
+
* mounts) — the normal path's full cross-app arbitration is correct
|
|
41
|
+
* for an explicit "sign in with a passkey" tap, but was observed
|
|
42
|
+
* colliding with another installed password manager's own autofill
|
|
43
|
+
* prompt when fired automatically on every app launch. When true,
|
|
44
|
+
* this call also skips the shared `isLoading`/`error` state below —
|
|
45
|
+
* a background opportunistic check should not flash a loading state
|
|
46
|
+
* or surface an error banner anywhere else in the app on failure.
|
|
47
|
+
*/
|
|
48
|
+
silent?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
32
51
|
interface AuthContextType {
|
|
33
52
|
user: User | null;
|
|
34
53
|
isLoading: boolean;
|
|
@@ -41,7 +60,11 @@ interface AuthContextType {
|
|
|
41
60
|
* to a `useEffect` cleanup so unmounting the screen tears the OS
|
|
42
61
|
* prompt down instead of leaving an orphaned resolution.
|
|
43
62
|
*/
|
|
44
|
-
loginWithPasskey: (
|
|
63
|
+
loginWithPasskey: (
|
|
64
|
+
email?: string,
|
|
65
|
+
signal?: AbortSignal,
|
|
66
|
+
opts?: LoginWithPasskeyOptions
|
|
67
|
+
) => Promise<PasskeyLoginResult>;
|
|
45
68
|
/**
|
|
46
69
|
* Complete a non-PRF passkey unlock by deriving the local key from
|
|
47
70
|
* the master password. Available when the consumer provided
|
|
@@ -88,7 +111,11 @@ export interface AuthProviderProps {
|
|
|
88
111
|
* the flow; returning `{ unlocked: false }` keeps the session but tells
|
|
89
112
|
* the screen to collect the master password and call `unlockWithPassword`.
|
|
90
113
|
*/
|
|
91
|
-
loginWithPasskey?: (
|
|
114
|
+
loginWithPasskey?: (
|
|
115
|
+
email?: string,
|
|
116
|
+
signal?: AbortSignal,
|
|
117
|
+
opts?: LoginWithPasskeyOptions
|
|
118
|
+
) => Promise<PasskeyLoginResult>;
|
|
92
119
|
/**
|
|
93
120
|
* Optional master-password unlock. Used by the passkey flow when the
|
|
94
121
|
* authenticator did not honor PRF.
|
|
@@ -405,25 +432,36 @@ export function AuthProvider({
|
|
|
405
432
|
);
|
|
406
433
|
|
|
407
434
|
const loginWithPasskey = useCallback(
|
|
408
|
-
async (
|
|
435
|
+
async (
|
|
436
|
+
email?: string,
|
|
437
|
+
signal?: AbortSignal,
|
|
438
|
+
opts?: LoginWithPasskeyOptions
|
|
439
|
+
): Promise<PasskeyLoginResult> => {
|
|
409
440
|
if (!providedLoginWithPasskey) {
|
|
410
441
|
throw new Error(
|
|
411
442
|
"entropy-ui: loginWithPasskey() called but AuthProvider wasn't given a loginWithPasskey handler."
|
|
412
443
|
);
|
|
413
444
|
}
|
|
445
|
+
const silent = opts?.silent ?? false;
|
|
414
446
|
try {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
447
|
+
if (!silent) {
|
|
448
|
+
setIsLoading(true);
|
|
449
|
+
setError(null);
|
|
450
|
+
}
|
|
451
|
+
const result = await providedLoginWithPasskey(email, signal, opts);
|
|
418
452
|
setUser(result.user);
|
|
419
453
|
setIsAuthenticated(true);
|
|
420
454
|
return result;
|
|
421
455
|
} catch (err) {
|
|
422
|
-
|
|
423
|
-
|
|
456
|
+
if (!silent) {
|
|
457
|
+
const message = err instanceof Error ? err.message : "Passkey sign-in failed";
|
|
458
|
+
setError(message);
|
|
459
|
+
}
|
|
424
460
|
throw err;
|
|
425
461
|
} finally {
|
|
426
|
-
|
|
462
|
+
if (!silent) {
|
|
463
|
+
setIsLoading(false);
|
|
464
|
+
}
|
|
427
465
|
}
|
|
428
466
|
},
|
|
429
467
|
[providedLoginWithPasskey]
|