'use client'; import { createContext, useContext, useEffect, useState, ReactNode, FC, SetStateAction, Dispatch, } from 'react'; import axios from 'axios'; import { useRouter } from 'next/navigation'; interface AuthContextType { user: User | null; login: (login: string, password: string) => Promise; checkUserLoggedIn: () => Promise; logout: () => Promise; userIsLoading: boolean; setUserIsLoading: Dispatch>; userLogedIn: boolean | undefined; setUserLogedIn: Dispatch>; } interface User { id: number; login: string; created_at: string; updated_at: string; } interface AuthProviderProps { children: ReactNode; } const AuthContext = createContext(undefined); export const AuthProvider: FC = ({ children }) => { const [user, setUser] = useState(null); const [userLogedIn, setUserLogedIn] = useState(); const router = useRouter(); const [userIsLoading, setUserIsLoading] = useState(false); useEffect(() => { checkUserLoggedIn(); }, []); const checkUserLoggedIn = async () => { setUserIsLoading(true); const token = localStorage.getItem('access_token'); if (token) { try { const res = await axios.post( 'https://extra.turkmentv.gov.tm/api/auth/me', {}, { headers: { Authorization: `Bearer ${token}` }, }, ); setUser(res.data); router.push('/sms/dashboard'); setUserIsLoading(false); } catch (error) { await refreshAccessToken(); } } else { router.push('/sms/sign_up'); setUserIsLoading(false); } }; const login = async (login: string, password: string) => { try { const res = await axios.post('https://extra.turkmentv.gov.tm/api/auth/login', { login: login, password: password, }); localStorage.setItem('access_token', res.data.access_token); setUser(res.data); router.push('/sms/dashboard'); setUserIsLoading(false); } catch (error) { setUserLogedIn(false); } }; const refreshAccessToken = async () => { const token = localStorage.getItem('access_token'); if (token) { try { const res = await axios.post( 'https://extra.turkmentv.gov.tm/api/auth/refresh', {}, { headers: { Authorization: `Bearer ${token}` }, }, ); localStorage.setItem('access_token', res.data.access_token); const meRes = await axios.post( 'https://extra.turkmentv.gov.tm/api/auth/me', {}, { headers: { Authorization: `Bearer ${res.data.access_token}` }, }, ); setUser(meRes.data); setUserIsLoading(false); } catch (error) { localStorage.removeItem('access_token'); setUser(null); router.push('/sms/sign_up'); setUserIsLoading(false); } } }; const logout = async () => { const token = localStorage.getItem('access_token'); if (token) { await axios.post( 'https://extra.turkmentv.gov.tm/api/auth/logout', {}, { headers: { Authorization: `Bearer ${token}` }, }, ); localStorage.removeItem('access_token'); setUser(null); router.push('/sms/sign_up'); setUserIsLoading(false); setUserLogedIn(undefined); } }; return ( {children} ); }; export { AuthContext };