import { GET_USER_ROUTE, SET_LANGUAGE } from "@/core/data/apiRoutes"; import axios from "axios"; import { createContext, useCallback, useEffect, useReducer } from "react"; const initialUser = { isAuth: false, userChangedLanguage: false, token: null, user: {}, }; const reducer = (state, action) => { switch (action.type) { case "CLEAR_USER": return { ...state, user: {} }; case "CHANGE_USER": return { ...state, user: action.user }; case "CHANGE_USER_LANGUAGE": return { ...state, user: { ...state.user, user_language: action.language }, }; case "CHANGE_AUTH_STATE": return { ...state, isAuth: action.isAuth }; case "CHANGE_LANGUAGE_STATE": return { ...state, userChangedLanguage: action.userChangedLanguage }; case "CLEAR_TOKEN": localStorage.removeItem("_token"); return { ...state, token: null }; case "SET_TOKEN": localStorage.setItem("_token", action.token); return { ...state, token: action.token }; default: return state; } }; export const UserContext = createContext(); export const UserProvider = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialUser); const clearUser = useCallback(() => { dispatch({ type: "CLEAR_USER" }); }, []); const changeUser = useCallback((user) => { dispatch({ type: "CHANGE_USER", user }); }, []); const changeUserLanguage = useCallback( (language) => { dispatch({ type: "CHANGE_USER_LANGUAGE", language }); axios .post( SET_LANGUAGE, { language: language }, { headers: { authorization: `Bearer ${state.token}`, }, } ) .then(() => { getUser((data) => { changeUser(data); }); }); }, [state.token] ); const changeAuthState = useCallback((isAuth) => { dispatch({ type: "CHANGE_AUTH_STATE", isAuth }); }, []); const changeLanguageState = useCallback((userChangedLanguage) => { dispatch({ type: "CHANGE_LANGUAGE_STATE", userChangedLanguage }); }, []); const clearToken = useCallback(() => { dispatch({ type: "CLEAR_TOKEN" }); }, []); const setToken = useCallback((token) => { dispatch({ type: "SET_TOKEN", token }); }, []); const getUser = useCallback( (callback = () => {}) => { axios .get(GET_USER_ROUTE, { headers: { authorization: `Bearer ${state.token}` }, }) .then(({ data }) => { if (typeof callback === "function") callback(data); }); }, [state.token] ); useEffect(() => { const localToken = localStorage.getItem("_token"); if (localToken) dispatch({ type: "SET_TOKEN", token: localToken }); }, []); useEffect(() => { if (!state.token) { clearUser(); changeAuthState(false); changeLanguageState(false); return; } getUser((data) => { changeUser(data); changeAuthState(true); changeLanguageState(true); }); }, [state.token]); return ( {children} ); };