From f13f1ccaf1154c876c239ca62e4689852bb64f1d Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Tue, 7 Oct 2025 11:59:22 +0700 Subject: [PATCH] :adhesive_bandage: (simple-fix) fix handler error request --- features/auth/models/submitRegisterForm.ts | 25 ++++++++++++++++--- .../auth/ui/components/ProvisionInput.tsx | 9 ++++++- .../lib/sendCallbackToServer.ts | 11 ++------ shared/lib/ky/errorHandler.ts | 16 +++++++++--- shared/types/ServerRequestCallback.ts | 7 ++++++ 5 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 shared/types/ServerRequestCallback.ts diff --git a/features/auth/models/submitRegisterForm.ts b/features/auth/models/submitRegisterForm.ts index c305571..cf2b2a5 100644 --- a/features/auth/models/submitRegisterForm.ts +++ b/features/auth/models/submitRegisterForm.ts @@ -1,8 +1,27 @@ "use server"; +import { apiErrorHandler } from "@/shared/lib/ky/errorHandler"; import { RegisterInputs } from "../ui/components/ProvisionInput"; +import { ServerRequestCallback } from "@/shared/types/serverRequestCallback"; -export const submitRegisterForm = async (data: RegisterInputs) => { - await new Promise((resolve) => setTimeout(resolve, 3000)); - return data; +export const submitRegisterForm = async ( + data: RegisterInputs +): Promise => { + if (data.password !== data.confirmPassword) + return apiErrorHandler([], { + success: false, + status: 400, + text: { message: "Password and Confirm Password do not match" }, + }); + + try { + await new Promise((resolve) => setTimeout(resolve, 3000)); + return { + success: true, + status: 200, + text: { message: "Registration successful" }, + }; + } catch (error) { + return apiErrorHandler(error); + } }; diff --git a/features/auth/ui/components/ProvisionInput.tsx b/features/auth/ui/components/ProvisionInput.tsx index 1356036..4751a09 100644 --- a/features/auth/ui/components/ProvisionInput.tsx +++ b/features/auth/ui/components/ProvisionInput.tsx @@ -1,7 +1,7 @@ "use client"; import React, { useState } from "react"; -import { Button, Form, Input } from "@heroui/react"; +import { addToast, Button, Form, Input } from "@heroui/react"; import { SubmitHandler, useForm } from "react-hook-form"; import { submitRegisterForm } from "../../models/submitRegisterForm"; @@ -22,9 +22,16 @@ const ProvisionInput = ({ fullname }: Props) => { const [submitStatus, setSubmitStatus] = useState(false); const onSubmit: SubmitHandler = async (data) => { + setSubmitStatus(true); console.log("Mensubmit"); const returnData = await submitRegisterForm(data); console.log(returnData); + addToast({ + color: "danger", + title: "😬 Oops, something went wrong!", + description: returnData.text.message, + }); + setSubmitStatus(false); }; return ( diff --git a/features/oauth-callback/lib/sendCallbackToServer.ts b/features/oauth-callback/lib/sendCallbackToServer.ts index c726260..2e01020 100644 --- a/features/oauth-callback/lib/sendCallbackToServer.ts +++ b/features/oauth-callback/lib/sendCallbackToServer.ts @@ -1,14 +1,7 @@ "use server"; import { api } from "@/shared/lib/ky/connector"; import { apiErrorHandler } from "@/shared/lib/ky/errorHandler"; -import { HTTPError } from "ky"; - -interface SendCallbackResponse { - success: boolean; - status: number; - text: { message: string }; - data?: any; -} +import { ServerRequestCallback } from "@/shared/types/serverRequestCallback"; /** * @function SendCallbackToServer @@ -64,7 +57,7 @@ interface SendCallbackResponse { export const SendCallbackToServer = async ( data: string, provider: string -): Promise => { +): Promise => { // Construct the backend and frontend handler URLs const backendHandlerUrl = `auth/${provider}/callback/`; const frontendHandlerUrl = `${process.env diff --git a/shared/lib/ky/errorHandler.ts b/shared/lib/ky/errorHandler.ts index d8b09b5..e452faa 100644 --- a/shared/lib/ky/errorHandler.ts +++ b/shared/lib/ky/errorHandler.ts @@ -2,9 +2,15 @@ import { HTTPError } from "ky"; +export type CallApiErrorHandler = { + success?: boolean; + status?: number; + text?: { message?: string }; +}; + export const apiErrorHandler = async ( error: unknown, - safeFail: boolean = false + safeFail?: CallApiErrorHandler ) => { if (error instanceof HTTPError) { return { @@ -16,9 +22,11 @@ export const apiErrorHandler = async ( if (safeFail) { return { - success: false, - status: 500, - text: { message: "An unexpected error occurred" }, + success: safeFail.success || false, + status: safeFail.status || 500, + text: { + message: safeFail.text?.message || "An unexpected error occurred", + }, }; } else { throw error; diff --git a/shared/types/ServerRequestCallback.ts b/shared/types/ServerRequestCallback.ts new file mode 100644 index 0000000..7b33c27 --- /dev/null +++ b/shared/types/ServerRequestCallback.ts @@ -0,0 +1,7 @@ +export type ServerRequestCallback = { + success: boolean; + status: number; + text: { message: string }; + data?: any; + error?: unknown; +};