Files
Ergo/src/authContext.jsx
T
2025-01-24 20:05:48 +01:00

178 lines
4.7 KiB
React

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 <div className="popup-container flex items-center justify-center">
<div className="">
<svg
style={{ margin: "auto", background: "transparent", display: " block", shapeRendering: "auto" }}
viewBox="0 0 100 100"
preserveAspectRatio="xMidYMid"
className="md:w-[100px] md:h-[100px] w-[80px] h-[80px]"
>
<path
fill="none"
stroke="#d0d5dd"
strokeWidth="6"
strokeDasharray="42.76482137044271 42.76482137044271"
d="M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40 C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z"
strokeLinecap="round"
style={{ transform: "scale(0.8)", transformOrigin: "50px 50px" }}
>
<animate
attributeName="stroke-dashoffset"
repeatCount="indefinite"
dur="1.882051282051282s"
keyTimes="0;1"
values="0;256.58892822265625"
></animate>
</path>
</svg>
</div>
</div>;
return (
<AuthContext.Provider
value={{
state,
dispatch,
}}
>
{children}
</AuthContext.Provider>
);
};
export default AuthProvider;