From d45f588fa77fabd676c72593b7bcf11443db3798 Mon Sep 17 00:00:00 2001 From: hosseintaromi Date: Fri, 18 Jul 2025 13:06:06 +0330 Subject: [PATCH] feat(auth): implement authentication structure - Add auth helper functions (getAuth, postLogout) - Add postLogin API request function - Add useLogin custom hook with React Query - Update validation schema from email to username --- src/pages/auth/core/_hooks.ts | 34 ++++++++++++++++++++++++++++++++ src/pages/auth/core/_requests.ts | 19 ++++++++++++++++++ src/pages/auth/index.ts | 20 +++++++++++++++++++ src/utils/validationSchemas.ts | 6 +++--- 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 src/pages/auth/core/_hooks.ts create mode 100644 src/pages/auth/core/_requests.ts create mode 100644 src/pages/auth/index.ts diff --git a/src/pages/auth/core/_hooks.ts b/src/pages/auth/core/_hooks.ts new file mode 100644 index 0000000..a905945 --- /dev/null +++ b/src/pages/auth/core/_hooks.ts @@ -0,0 +1,34 @@ +import { QUERY_KEYS } from "@/utils/query-key"; +import { useMutation } from "@tanstack/react-query"; +import { postLogin } from "./_requests"; +import { LoginRequest, LoginResponse } from "@/types/auth"; +import toast from "react-hot-toast"; + +export const useLogin = () => { + return useMutation({ + mutationKey: [QUERY_KEYS.ADMIN_LOGIN], + mutationFn: (credentials: LoginRequest) => postLogin(credentials), + onSuccess: (response: LoginResponse) => { + localStorage.setItem("admin_token", response.tokens.access_token); + localStorage.setItem( + "admin_refresh_token", + response.tokens.refresh_token + ); + localStorage.setItem("admin_user", JSON.stringify(response.admin_user)); + localStorage.setItem( + "admin_permissions", + JSON.stringify(response.admin_user.permissions) + ); + localStorage.setItem( + "admin_all_permissions", + JSON.stringify(response.permissions) + ); + + toast.success("ورود موفقیت‌آمیز بود"); + }, + onError: (error: any) => { + console.error("Login error:", error); + toast.error(error?.message || "خطا در ورود"); + }, + }); +}; diff --git a/src/pages/auth/core/_requests.ts b/src/pages/auth/core/_requests.ts new file mode 100644 index 0000000..0ad61ce --- /dev/null +++ b/src/pages/auth/core/_requests.ts @@ -0,0 +1,19 @@ +import { httpPostRequest, APIUrlGenerator } from "@/utils/baseHttpService"; +import { API_ROUTES } from "@/constant/routes"; +import { LoginRequest, LoginResponse } from "@/types/auth"; + +export const postLogin = async (credentials: LoginRequest) => { + const response = await httpPostRequest( + APIUrlGenerator(API_ROUTES.ADMIN_LOGIN), + credentials + ); + return response.data; +}; + +export const postLogout = () => { + localStorage.removeItem("admin_token"); + localStorage.removeItem("admin_refresh_token"); + localStorage.removeItem("admin_user"); + localStorage.removeItem("admin_permissions"); + localStorage.removeItem("admin_all_permissions"); +}; diff --git a/src/pages/auth/index.ts b/src/pages/auth/index.ts new file mode 100644 index 0000000..d709001 --- /dev/null +++ b/src/pages/auth/index.ts @@ -0,0 +1,20 @@ +export const getAuth = async () => { + const token = localStorage.getItem("admin_token"); + const userStr = localStorage.getItem("admin_user"); + + if (token && userStr) { + try { + const user = JSON.parse(userStr); + return { token, user }; + } catch (error) { + localStorage.removeItem("admin_token"); + localStorage.removeItem("admin_refresh_token"); + localStorage.removeItem("admin_user"); + localStorage.removeItem("admin_permissions"); + localStorage.removeItem("admin_all_permissions"); + return null; + } + } + + return null; +}; diff --git a/src/utils/validationSchemas.ts b/src/utils/validationSchemas.ts index 2baf829..9eb8805 100644 --- a/src/utils/validationSchemas.ts +++ b/src/utils/validationSchemas.ts @@ -1,10 +1,10 @@ import * as yup from "yup"; export const loginSchema = yup.object({ - email: yup + username: yup .string() - .required("ایمیل الزامی است") - .email("فرمت ایمیل صحیح نیست"), + .required("نام کاربری الزامی است") + .min(3, "نام کاربری باید حداقل ۳ کاراکتر باشد"), password: yup .string() .required("رمز عبور الزامی است")