From 87af1834cf651d0c2de8a63511699f4ec431ad22 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Sat, 7 Jun 2025 01:34:28 +0200 Subject: [PATCH] feat: email verify state --- web/src/store/verify.ts | 44 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/web/src/store/verify.ts b/web/src/store/verify.ts index 7bd79bc..0e600f6 100644 --- a/web/src/store/verify.ts +++ b/web/src/store/verify.ts @@ -1,6 +1,11 @@ import { create } from "zustand"; -import { useAuth } from "./auth"; import type { UserProfile } from "@/types"; +import { + confirmEmailApi, + requestEmailOtpApi, + type ConfirmEmailRequest, +} from "@/api/verify"; +import { useAuth } from "./auth"; export type VerifyStep = "email" | "avatar" | "review"; @@ -8,11 +13,22 @@ export interface IVerifyState { step: VerifyStep | null; loadStep: (profile: UserProfile) => void; + + requesting: boolean; + requested: boolean; + requestOTP: () => Promise; + + confirming: boolean; + confirmOTP: (req: ConfirmEmailRequest) => Promise; } export const useVerify = create((set) => ({ step: null, + requesting: false, + requested: false, + confirming: false, + loadStep: (profile) => { if (!profile.email_verified) { set({ step: "email" }); @@ -31,4 +47,30 @@ export const useVerify = create((set) => ({ set({ step: null }); }, + + requestOTP: async () => { + set({ requesting: true, requested: false }); + + try { + await requestEmailOtpApi(); + set({ requested: true }); + } catch (err) { + console.log("ERR: Failed to request OTP:", err); + } finally { + set({ requesting: false }); + } + }, + + confirmOTP: async (req: ConfirmEmailRequest) => { + set({ confirming: true }); + + try { + await confirmEmailApi(req); + await useAuth.getState().authenticate(); + } catch (err) { + console.log("ERR: Failed to request OTP:", err); + } finally { + set({ confirming: false }); + } + }, }));