import { IIdentity_Response_DTO, ILogin_DTO, ILogin_Response_DTO } from "@shared/contexts"; import secureLocalStorage from "react-secure-storage"; import { IAuthActions } from "../hooks"; import { createAxiosInstance } from "./axiosInstance"; export const createAxiosAuthActions = ( apiUrl: string, httpClient = createAxiosInstance() ): IAuthActions => ({ login: async ({ email, password }: ILogin_DTO) => { // eslint-disable-next-line no-useless-catch try { const result = await httpClient.request({ url: `${apiUrl}/auth/login`, method: "POST", data: { email, password, }, }); const { data } = result; secureLocalStorage.setItem("uecko.auth", data); return { success: true, data, redirectTo: "/home", }; } catch (error) { return { success: false, error: { message: "Login failed", name: "Invalid email or password", }, }; } }, logout: () => { secureLocalStorage.clear(); return Promise.resolve({ success: true, redirectTo: "/login", }); }, check: () => { const profile = secureLocalStorage.getItem("uecko.auth") as ILogin_Response_DTO; return Promise.resolve( profile?.token ? { authenticated: true, } : { authenticated: false, redirectTo: "/login" } ); }, getIdentity: async () => { const errorResult = { message: "Identification failed", name: "Invalid profile or identification", }; try { const result = await httpClient.request({ url: `${apiUrl}/auth/identity`, method: "GET", }); const { data } = result; const profile = secureLocalStorage.getItem("uecko.auth") as ILogin_Response_DTO; if (profile?.id === data?.id) { secureLocalStorage.setItem("uecko.profile", data); return Promise.resolve(data); } return Promise.reject(errorResult); } catch (error) { return Promise.reject(errorResult); } }, onError: (error: any) => { console.error(error); secureLocalStorage.clear(); return Promise.resolve({ error, logout: true, }); }, });