From d88eb6011cedcfbd5fcf02d61fe118060b33e192 Mon Sep 17 00:00:00 2001 From: aon <21188659+aon@users.noreply.github.com> Date: Tue, 4 Feb 2025 11:19:31 -0300 Subject: [PATCH] feat: add verify recovery view on the main page --- .../composables/useAccountLogin.ts | 48 +++++++++++++++---- .../composables/useRecoveryGuardian.ts | 14 ++++++ packages/auth-server/pages/index.vue | 12 ++++- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/packages/auth-server/composables/useAccountLogin.ts b/packages/auth-server/composables/useAccountLogin.ts index 28db66cd..57ca3379 100644 --- a/packages/auth-server/composables/useAccountLogin.ts +++ b/packages/auth-server/composables/useAccountLogin.ts @@ -8,16 +8,46 @@ export const useAccountLogin = (_chainId: MaybeRef) => { const { inProgress: loginInProgress, error: accountLoginError, execute: loginToAccount } = useAsync(async () => { const client = getPublicClient({ chainId: chainId.value }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { username, address, passkeyPublicKey } = await fetchAccount(client as any, { - contracts: contractsByChain[chainId.value], - }); - login({ - username, - address, - passkey: toHex(passkeyPublicKey), - }); + const credential = await navigator.credentials.get({ + publicKey: { + challenge: new Uint8Array(32), + userVerification: "discouraged", + }, + }) as PublicKeyCredential | null; + if (!credential) { + throw new Error("No credential found"); + } + + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { username, address, passkeyPublicKey } = await fetchAccount(client as any, { + contracts: contractsByChain[chainId.value], + uniqueAccountId: credential.id, + }); + + login({ + username, + address, + passkey: toHex(passkeyPublicKey), + }); + return { success: true } as const; + } catch { + const { checkRecoveryRequest } = useRecoveryGuardian(); + const recoveryRequest = await checkRecoveryRequest(credential.id); + if (recoveryRequest) { + return { + success: false, + recoveryRequest: { + account: recoveryRequest[0], + isReady: recoveryRequest[1], + remainingTime: recoveryRequest[2], + }, + } as const; + } else { + return { success: false } as const; + } + } }); return { diff --git a/packages/auth-server/composables/useRecoveryGuardian.ts b/packages/auth-server/composables/useRecoveryGuardian.ts index e3493c70..b92a4edd 100644 --- a/packages/auth-server/composables/useRecoveryGuardian.ts +++ b/packages/auth-server/composables/useRecoveryGuardian.ts @@ -147,6 +147,17 @@ export const useRecoveryGuardian = () => { return tx; }); + const { inProgress: checkRecoveryRequestInProgress, error: checkRecoveryRequestError, execute: checkRecoveryRequest } = useAsync(async (accountId: string) => { + const client = getPublicClient({ chainId: defaultChain.id }); + const tx = await client.readContract({ + address: contractsByChain[defaultChain.id].recovery, + abi: GuardianRecoveryModuleAbi, + functionName: "checkRecoveryRequest", + args: [accountId], + }); + return tx; + }); + return { confirmGuardianInProgress, confirmGuardianError, @@ -177,5 +188,8 @@ export const useRecoveryGuardian = () => { getRecoveryInProgress, getRecoveryError, getRecovery, + checkRecoveryRequestInProgress, + checkRecoveryRequestError, + checkRecoveryRequest, }; }; diff --git a/packages/auth-server/pages/index.vue b/packages/auth-server/pages/index.vue index 743dbbc3..81ec4094 100644 --- a/packages/auth-server/pages/index.vue +++ b/packages/auth-server/pages/index.vue @@ -68,7 +68,15 @@ const signUp = async () => { navigateTo("/dashboard"); }; const logIn = async () => { - await loginToAccount(); - navigateTo("/dashboard"); + const result = await loginToAccount(); + if (result?.success) { + navigateTo("/dashboard"); + return; + } + if (result?.recoveryRequest?.isReady === false) { + navigateTo("/recovery/account-not-ready"); + return; + } + // TODO: handle rest of the cases };