diff --git a/web/src/store/verify.ts b/web/src/store/verify.ts index 0e600f6..a573359 100644 --- a/web/src/store/verify.ts +++ b/web/src/store/verify.ts @@ -2,15 +2,19 @@ import { create } from "zustand"; import type { UserProfile } from "@/types"; import { confirmEmailApi, + finishVerificationApi, requestEmailOtpApi, type ConfirmEmailRequest, } from "@/api/verify"; import { useAuth } from "./auth"; +import { uploadAvatarApi } from "@/api/avatar"; export type VerifyStep = "email" | "avatar" | "review"; export interface IVerifyState { - step: VerifyStep | null; + step: VerifyStep | null | false; + + redirect: string | null; loadStep: (profile: UserProfile) => void; @@ -20,14 +24,25 @@ export interface IVerifyState { confirming: boolean; confirmOTP: (req: ConfirmEmailRequest) => Promise; + + uploading: boolean; + uploadAvatar: (image: File) => Promise; + + verifying: boolean; + verify: () => Promise; + + setRedirect: (redirect: string) => void; } export const useVerify = create((set) => ({ step: null, + redirect: null, requesting: false, requested: false, confirming: false, + uploading: false, + verifying: false, loadStep: (profile) => { if (!profile.email_verified) { @@ -45,7 +60,7 @@ export const useVerify = create((set) => ({ return; } - set({ step: null }); + set({ step: false }); }, requestOTP: async () => { @@ -73,4 +88,34 @@ export const useVerify = create((set) => ({ set({ confirming: false }); } }, + + uploadAvatar: async (image) => { + set({ uploading: true }); + + try { + await uploadAvatarApi(image); + await useAuth.getState().authenticate(); + } catch (err) { + console.log("ERR: Failed to request OTP:", err); + } finally { + set({ uploading: false }); + } + }, + + setRedirect: (redirect) => { + set({ redirect }); + }, + + verify: async () => { + set({ verifying: true }); + + try { + await finishVerificationApi(); + useAuth.getState().authenticate(); + } catch (err) { + console.log("ERR: Failed to finish verification:", err); + } finally { + set({ verifying: false }); + } + }, }));