import React, { useReducer, useState } from "react"; import MkdSDK from "@/utils/MkdSDK"; export const AuthContext = React.createContext({ state: {} }); const initialState = { isAuthenticated: false, user: null, token: null, role: null, originalRole: null, sessionExpired: false, allowCheckVerification: false, }; const reducer = (state, action) => { switch (action.type) { case "LOGIN": localStorage.setItem("user", Number(action.payload.user_id)); localStorage.setItem("token", action.payload.token ?? action.payload.access_token); localStorage.setItem("role", action.payload.role); localStorage.setItem("originalRole", ((action.payload.originalRole === undefined) || action.payload.originalRole === "undefined") ? "customer" : action.payload.originalRole); return { ...state, isAuthenticated: true, user: Number(localStorage.getItem("user")), token: localStorage.getItem("token"), role: localStorage.getItem("role"), originalRole: localStorage.getItem("originalRole"), }; case "LOGOUT": localStorage.removeItem("user"); localStorage.removeItem("token"); return { ...state, isAuthenticated: false, user: null, sessionExpired: false, role: null, originalRole: null, }; case "SESSION_EXPIRED": return { ...state, sessionExpired: true, }; case "SWITCH_TO_HOST": localStorage.setItem("role", "host"); return { ...state, role: "host", }; case "SWITCH_TO_CUSTOMER": localStorage.setItem("role", "customer"); return { ...state, role: "customer", }; case "SWITCH_TO_ADMIN": localStorage.setItem("role", "admin"); return { ...state, role: "admin", }; case "ALLOW_CHECK_VERIFICATION": return { ...state, allowCheckVerification: true, }; case "DISALLOW_CHECK_VERIFICATION": return { ...state, allowCheckVerification: false, }; default: return state; } }; let sdk = new MkdSDK(); export const tokenExpireError = (dispatch, errorMessage) => { /** * either this or we pass the role as a parameter */ const role = localStorage.getItem("role"); if (errorMessage === "TOKEN_EXPIRED") { dispatch({ type: "SESSION_EXPIRED" }); } }; const AuthProvider = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); const [loading, setLoading] = useState(true); React.useEffect(() => { const user = localStorage.getItem("user"); const token = localStorage.getItem("token"); const role = localStorage.getItem("role"); const originalRole = localStorage.getItem("originalRole"); if (!token) { setLoading(false); return; } (async function () { setLoading(true); try { await sdk.check(originalRole); dispatch({ type: "LOGIN", payload: { user_id: user, token, role: role, originalRole: originalRole, }, }); } catch (error) { if (role) { dispatch({ type: "LOGOUT", }); window.location.href = "/" + role + "/login"; } else { dispatch({ type: "LOGOUT", }); window.location.href = "/"; } } setLoading(false); })(); }, []); if (loading) return