From 2cb2059f9e45df560684b5207d828576aac26c13 Mon Sep 17 00:00:00 2001 From: i701 Date: Thu, 17 Apr 2025 23:25:06 +0500 Subject: [PATCH] feat: integrate backend mobile login and enhance user verification flow --- actions/auth-actions.ts | 20 ++++++++++++++++++-- queries/authentication.ts | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/actions/auth-actions.ts b/actions/auth-actions.ts index 7ac4ab2..238fc48 100644 --- a/actions/auth-actions.ts +++ b/actions/auth-actions.ts @@ -2,7 +2,7 @@ import { signUpFormSchema } from "@/lib/schemas"; import { backendRegister, checkIdOrPhone } from "@/queries/authentication"; -import { tryCatch } from "@/utils/tryCatch"; +import { handleApiResponse, tryCatch } from "@/utils/tryCatch"; import { redirect } from "next/navigation"; import { z } from "zod"; const formSchema = z.object({ @@ -11,7 +11,7 @@ const formSchema = z.object({ .regex(/^[7|9][0-9]{2}-[0-9]{4}$/, "Please enter a valid phone number"), }); -type FilterUserResponse = { +export type FilterUserResponse = { ok: boolean; verified: boolean; }; @@ -184,3 +184,19 @@ export const sendOtp = async (phoneNumber: string, code: string) => { console.log(data); return data; }; + +export async function backendMobileLogin({ mobile }: { mobile: string }) { + const response = await fetch( + `${process.env.SARLINK_API_BASE_URL}/auth/mobile/`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + mobile, + }), + }, + ); + return handleApiResponse<{ detail: string }>(response, "backendMobileLogin"); +} diff --git a/queries/authentication.ts b/queries/authentication.ts index fcf8107..9052841 100644 --- a/queries/authentication.ts +++ b/queries/authentication.ts @@ -1,8 +1,13 @@ "use server"; -import type { ActionState } from "@/actions/auth-actions"; +import { + type ActionState, + type FilterUserResponse, + backendMobileLogin, +} from "@/actions/auth-actions"; import type { TAuthUser, User } from "@/lib/types/user"; import axiosInstance from "@/utils/axiosInstance"; -import { handleApiResponse } from "@/utils/tryCatch"; +import { handleApiResponse, tryCatch } from "@/utils/tryCatch"; +import { redirect } from "next/navigation"; import { z } from "zod"; export async function login({ @@ -63,7 +68,7 @@ export async function checkIdOrPhone({ }, }, ); - const data = await response.json(); + const data = (await response.json()) as FilterUserResponse; return data; } @@ -145,6 +150,31 @@ export async function VerifyRegistrationOTP( ); const data = (await response.json()) as { message: string }; + const [error, userVerified] = await tryCatch( + checkIdOrPhone({ phone_number: mobile as string }), + ); + + if (error) { + return { + message: "Your account could not be verified. Please contact support.", + status: "verify_error", + }; + } + if (userVerified.verified) { + const [mobileLoginError, mobileLoginResponse] = await tryCatch( + backendMobileLogin({ mobile: mobile as string }), + ); + if (mobileLoginError) { + return { + message: "Your account could not be verified. Please contact support.", + status: "verify_error", + }; + } + if (mobileLoginResponse) { + redirect(`/auth/verify-otp?phone_number=${mobile}`); + } + } + return { message: data.message, status: response.status === 200 ? "success" : "error",