From 7a1017916b99dc3d90d2888bdde6f14fad3d96b5 Mon Sep 17 00:00:00 2001 From: Saiful Alom Date: Wed, 17 Jun 2026 10:58:34 +0600 Subject: [PATCH] refactor(auth): modularize login hook and remove duplicate schema - Rename and relocate `use-log-in.ts` hook to `modules/auth/auth.hooks.ts` - Remove deprecated global `src/schema/login.ts` file - Fix state naming mismatch in `LogInForm` component (`isPending` -> `isLoading`) - Update import mappings to use local module schemas and hooks --- src/hooks/use-form-action.ts | 2 +- .../auth/auth.hooks.ts} | 6 ++-- src/modules/auth/components/login.tsx | 14 ++++----- src/schema/login.ts | 30 ------------------- 4 files changed, 11 insertions(+), 41 deletions(-) rename src/{hooks/use-log-in.ts => modules/auth/auth.hooks.ts} (89%) delete mode 100644 src/schema/login.ts diff --git a/src/hooks/use-form-action.ts b/src/hooks/use-form-action.ts index 3586f75..5e34a4e 100644 --- a/src/hooks/use-form-action.ts +++ b/src/hooks/use-form-action.ts @@ -13,7 +13,7 @@ interface UseFormActionOptions { } interface UseFormActionReturn { - form: UseFormReturn; // Add 'any' context parameter to align return types + form: UseFormReturn; onSubmit: (data: TFieldValues) => void; } diff --git a/src/hooks/use-log-in.ts b/src/modules/auth/auth.hooks.ts similarity index 89% rename from src/hooks/use-log-in.ts rename to src/modules/auth/auth.hooks.ts index 89ea51b..9a339bc 100644 --- a/src/hooks/use-log-in.ts +++ b/src/modules/auth/auth.hooks.ts @@ -2,8 +2,8 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { actions } from "astro:actions"; import { navigate } from "astro:transitions/client"; -import { type LoginInput, loginSchema } from "@/schema/login"; import { useAction } from "@/hooks/use-action"; +import { LoginInput, loginSchema } from "./auth.schema"; export default function useLogIn() { const form = useForm({ @@ -15,7 +15,7 @@ export default function useLogIn() { }); // Setup the action runner using your custom hook - const { execute } = useAction( + const { execute, isLoading } = useAction( async (data: LoginInput) => { const result = await actions.login(data); @@ -45,5 +45,5 @@ export default function useLogIn() { execute(data); }; - return { form, onSubmit }; + return { form, onSubmit, isLoading }; } \ No newline at end of file diff --git a/src/modules/auth/components/login.tsx b/src/modules/auth/components/login.tsx index 04ae785..f1834a7 100644 --- a/src/modules/auth/components/login.tsx +++ b/src/modules/auth/components/login.tsx @@ -1,13 +1,13 @@ +import { FormInput } from "@/components/ui/form-input"; import { logInFields } from "@/config/login-fields"; +import { Spinner } from "@/components/ui/spinner"; import { Toaster } from "@/components/ui/sonner"; import { Button } from "@/components/ui/button"; import { Form } from "@/components/ui/form"; -import { FormInput } from "@/components/ui/form-input"; -import useLogIn from "@/hooks/use-log-in"; -import { Spinner } from "@/components/ui/spinner"; +import useLogIn from "../auth.hooks"; export function LogInForm() { - const { form, isPending, onSubmit } = useLogIn(); + const { form, isLoading, onSubmit } = useLogIn(); return (
@@ -22,11 +22,11 @@ export function LogInForm() { label={field.label} placeholder={field.placeholder} type={field.type} - disabled={isPending} + disabled={isLoading} /> ))} -
diff --git a/src/schema/login.ts b/src/schema/login.ts deleted file mode 100644 index 25575c6..0000000 --- a/src/schema/login.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { z } from 'astro:schema'; - -// Single Source of Truth for Constants -export const AUTH_CONFIG = { - PASSWORD_MIN_LENGTH: 6, - PASSWORD_MAX_LENGTH: 50, -} as const; - -// Single Source of Truth for Validation Messages -export const AUTH_MESSAGES = { - EMAIL_INVALID: "Please enter a valid business email address.", - PASSWORD_TOO_SHORT: `Password must be at least ${AUTH_CONFIG.PASSWORD_MIN_LENGTH} characters long.`, - PASSWORD_TOO_LONG: `Password cannot exceed ${AUTH_CONFIG.PASSWORD_MAX_LENGTH} characters.`, -} as const; - -// User-Friendly Schema Configuration -export const loginSchema = z.object({ - email: z - .string() - .trim() - .toLowerCase() - .email({ message: AUTH_MESSAGES.EMAIL_INVALID }), - - password: z - .string() - .min(AUTH_CONFIG.PASSWORD_MIN_LENGTH, { message: AUTH_MESSAGES.PASSWORD_TOO_SHORT }) - .max(AUTH_CONFIG.PASSWORD_MAX_LENGTH, { message: AUTH_MESSAGES.PASSWORD_TOO_LONG }), -}); - -export type LoginInput = z.infer; \ No newline at end of file