-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Turnkey Passkey POC #1481
base: main
Are you sure you want to change the base?
Changes from all commits
8277309
dc86610
5c6a62e
69c6852
3b8e9a7
55b92fe
a41dc1e
f7e9c94
6886ded
e187b7f
cd9fccc
c0317cb
44488df
8f0ebe4
8057fc3
5a58810
07f7878
6a1cb65
0c4ad0d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,4 +1,3 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Signer } from "ethers"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Alert } from "react-native"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// import { invalidateProfileSocialsQuery } from "../../data/helpers/profiles/profilesUpdate"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -13,8 +12,13 @@ import { awaitableAlert } from "../../utils/alert"; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import logger from "../../utils/logger"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { logoutAccount, waitForLogoutTasksDone } from "../../utils/logout"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { sentryTrackMessage } from "../../utils/sentry"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { createXmtpClientFromSigner } from "../../utils/xmtpRN/signIn"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
createXmtpClientFromSigner, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
createXmtpClientFromViemAccount, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from "../../utils/xmtpRN/signIn"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { getXmtpClient } from "../../utils/xmtpRN/sync"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Signer } from "ethers"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { LocalAccount } from "viem/accounts"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export async function initXmtpClient(args: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
signer: Signer; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -49,6 +53,39 @@ export async function initXmtpClient(args: { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export async function initXmtpClientFromViemAccount(args: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account: LocalAccount; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
privyAccountId?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isEphemeral?: boolean; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pkPath?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { account, address, ...restArgs } = args; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!account || !address) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error("No signer or address"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await createXmtpClientFromViemAccount(account, async () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await awaitableAlert( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
translate("current_installation_revoked"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
translate("current_installation_revoked_description") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error("Current installation revoked"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await connectWithAddress({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...restArgs, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await logoutAccount(address, false, true, () => {}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logger.error(e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw e; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+56
to
+87
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Reduce code duplication and improve error handling The + type BaseInitArgs = {
+ address: string;
+ privyAccountId?: string;
+ isEphemeral?: boolean;
+ pkPath?: string;
+ };
+
+ type InitXmtpArgs = BaseInitArgs & {
+ signer?: Signer;
+ account?: LocalAccount;
+ };
+
+ async function initXmtpBase(
+ createClient: () => Promise<void>,
+ args: BaseInitArgs
+ ) {
+ try {
+ await createClient();
+ await connectWithAddress(args);
+ } catch (e) {
+ await logoutAccount(args.address, false, true, () => {});
+ logger.error(e);
+ throw e;
+ }
+ }
+
- export async function initXmtpClientFromViemAccount(args: {
- account: LocalAccount;
- address: string;
- privyAccountId?: string;
- isEphemeral?: boolean;
- pkPath?: string;
- }) {
+ export async function initXmtpClientFromViemAccount(
+ args: InitXmtpArgs & Required<Pick<InitXmtpArgs, "account">>
+ ) {
const { account, address, ...restArgs } = args;
if (!account || !address) {
throw new Error("No account or address");
}
- try {
- await createXmtpClientFromViemAccount(account, async () => {
+ return initXmtpBase(
+ () => createXmtpClientFromViemAccount(account, async () => {
await awaitableAlert(
translate("current_installation_revoked"),
translate("current_installation_revoked_description")
);
throw new Error("Current installation revoked");
- });
- await connectWithAddress({
+ }),
+ {
address,
...restArgs,
- });
- } catch (e) {
- await logoutAccount(address, false, true, () => {});
- logger.error(e);
- throw e;
- }
+ }
+ );
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type IBaseArgs = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
address: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This isn’t proof of concept related, but I do not like the pattern of unnecessarily putting exhaust stand into context. Not sure why we would do this. Are there any benefits? |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,86 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { createContext, memo, useContext, useRef } from "react"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { createStore, useStore } from "zustand"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { LocalAccount } from "viem/accounts"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { TurnkeyStoreInfo } from "@/utils/passkeys/passkeys.interfaces"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type IPasskeyAuthStoreProps = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loading?: boolean; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
error?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
statusString?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account?: LocalAccount; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
turnkeyInfo?: TurnkeyStoreInfo; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
previousPasskeyName?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type IPasskeyAuthStoreState = IPasskeyAuthStoreProps & { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setLoading: (loading: boolean) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setError: (error: string | undefined) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setStatusString: (statusString: string | undefined) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setAccount: (account: LocalAccount | undefined) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setTurnkeyInfo: (turnkeyInfo: TurnkeyStoreInfo | undefined) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setPreviousPasskeyName: (previousPasskeyName: string | undefined) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
reset: () => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type IPasskeyAuthStoreProviderProps = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
React.PropsWithChildren<IPasskeyAuthStoreProps>; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type IPasskeyAuthStore = ReturnType<typeof createPasskeyAuthStore>; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const PasskeyAuthStoreContext = createContext<IPasskeyAuthStore | null>(null); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const PasskeyAuthStoreProvider = memo( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
({ children, ...props }: IPasskeyAuthStoreProviderProps) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const storeRef = useRef<IPasskeyAuthStore>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!storeRef.current) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
storeRef.current = createPasskeyAuthStore(props); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<PasskeyAuthStoreContext.Provider value={storeRef.current}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{children} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</PasskeyAuthStoreContext.Provider> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const createPasskeyAuthStore = (initProps: IPasskeyAuthStoreProps) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const DEFAULT_PROPS: IPasskeyAuthStoreProps = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loading: false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
error: undefined, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
statusString: undefined, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account: undefined, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
turnkeyInfo: undefined, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
previousPasskeyName: undefined, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return createStore<IPasskeyAuthStoreState>()((set) => ({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...DEFAULT_PROPS, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...initProps, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setLoading: (loading) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loading ? set({ loading, error: undefined }) : set({ loading: false }), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setError: (error) => set({ error, statusString: undefined }), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setStatusString: (statusString) => set({ statusString }), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setAccount: (account) => set({ account }), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setTurnkeyInfo: (turnkeyInfo) => set({ turnkeyInfo }), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setPreviousPasskeyName: (previousPasskeyName) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set({ previousPasskeyName }), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
reset: () => set(DEFAULT_PROPS), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Ensure consistent state reset The - reset: () => set(DEFAULT_PROPS),
+ reset: () => set({ ...DEFAULT_PROPS, ...initProps }),
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
})); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+55
to
+67
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add state update validation. The state setters don't validate input, which could lead to inconsistent state. Add validation to prevent invalid state updates: setTurnkeyInfo: (turnkeyInfo) =>
- set({ turnkeyInfo }),
+ set((state) => {
+ if (turnkeyInfo && (!turnkeyInfo.subOrganizationId || !turnkeyInfo.walletId)) {
+ console.warn('Invalid turnkey info provided');
+ return state;
+ }
+ return { turnkeyInfo };
+ }), 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export function usePasskeyAuthStoreContext<T>( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
selector: (state: IPasskeyAuthStoreState) => T | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): T { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const store = useContext(PasskeyAuthStoreContext); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!store) throw new Error("Missing PasskeyAuthStore.Provider in the tree"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return useStore(store, selector); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const usePasskeyAuthStore = () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const store = useContext(PasskeyAuthStoreContext); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!store) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"usePasskeyAuthStore must be used within a PasskeyAuthStoreProvider" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return store; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -8,6 +8,7 @@ export const en = { | |||||||||||||||||||||||||||||||||||||
title: "CONVERSE ACCOUNTS", | ||||||||||||||||||||||||||||||||||||||
connectViaPhone: "Connect via Phone", | ||||||||||||||||||||||||||||||||||||||
createEphemeral: "Create Ephemeral Account", | ||||||||||||||||||||||||||||||||||||||
connectViaPasskey: "Connect via Passkey", | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
installedApps: { | ||||||||||||||||||||||||||||||||||||||
title: "INSTALLED APPS", | ||||||||||||||||||||||||||||||||||||||
|
@@ -51,6 +52,12 @@ export const en = { | |||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
resendCodeIn: "Resend code in {{seconds}} seconds...", | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
passkey: { | ||||||||||||||||||||||||||||||||||||||
title: "Create Passkey", | ||||||||||||||||||||||||||||||||||||||
add_account_title: "Add account by passkey", | ||||||||||||||||||||||||||||||||||||||
subtitle: "Create a passkey to connect to Converse", | ||||||||||||||||||||||||||||||||||||||
createButton: "Create Passkey", | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
Comment on lines
+55
to
+60
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add missing error messages for passkey operations. The passkey translations should include error messages for common failure scenarios. Add these translations: passkey: {
title: "Create Passkey",
add_account_title: "Add account by passkey",
subtitle: "Create a passkey to connect to Converse",
createButton: "Create Passkey",
+ errors: {
+ creation_failed: "Failed to create passkey",
+ login_failed: "Failed to login with passkey",
+ invalid_name: "Invalid passkey name",
+ already_exists: "A passkey with this name already exists",
+ },
}, 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||
createEphemeral: { | ||||||||||||||||||||||||||||||||||||||
title: "Create an ephemeral account", | ||||||||||||||||||||||||||||||||||||||
subtitle: | ||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix incorrect error message
The error message refers to "signer" but the function checks for "account".
Apply this diff to fix the error message:
📝 Committable suggestion