'use client'; import { createContext, useState, useEffect, useContext } from 'react'; import { TokenContextType, TokenType } from '@/types/user'; import { TokenProps } from '@/types/user'; import { useRouter, usePathname } from '@/src/navigation'; import { isSignedIn as tokenIsSinedIn, isAdmin as tokenIsAdmin, checkSignInPage as tokenCheckSignInPage, } from './token'; import { ToastContext } from './ToastProvider'; const LOCAL_STORAGE_KEY = 'testplat-auth-token'; function storeTokenToLocalStorage(token: TokenType) { localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(token)); } function removeTokenFromLocalStorage() { localStorage.removeItem(LOCAL_STORAGE_KEY); } const defaultContext = { token: { access_token: '', user: null, }, isSignedIn: () => false, isAdmin: () => false, setToken: (token: TokenType) => {}, storeTokenToLocalStorage, removeTokenFromLocalStorage, }; const TokenContext = createContext(defaultContext); const TokenProvider = ({ toastMessages, locale, children }: TokenProps) => { const router = useRouter(); const pathname = usePathname(); const toastContext = useContext(ToastContext); const [hasRestoreFinished, setHasRestoreFinished] = useState(false); const [token, setToken] = useState({ access_token: '', expires_at: 0, user: null, }); const isSignedIn = () => { return tokenIsSinedIn(token); }; const isAdmin = () => { return tokenIsAdmin(token); }; const tokenContext = { token, isSignedIn, isAdmin, setToken, storeTokenToLocalStorage, removeTokenFromLocalStorage, }; const restoreTokenFromLocalStorage = () => { const tokenString = localStorage.getItem(LOCAL_STORAGE_KEY); if (tokenString) { const restoredToken = JSON.parse(tokenString); setToken(restoredToken); } setHasRestoreFinished(true); }; useEffect(() => { restoreTokenFromLocalStorage(); }, []); useEffect(() => { tokenCheckSignInPage(token, pathname); }, [pathname, hasRestoreFinished]); return {children}; }; export { TokenContext }; export default TokenProvider;