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("رمز عبور الزامی است")