import { createContext, useContext, useEffect, useState } from 'react'; import { useNavigate } from "react-router-dom"; import { authApi, IAuthUser } from "@/shared/api"; import { ROUTES } from "@/shared/lib/hooks/useNavigation"; interface IAuthContext { user: IAuthUser | null; loading: boolean; updateUserContext?: (newValues: Partial) => void; } const AuthContext = createContext({ user: null, loading: true, }); export const useAuth = () => { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within AuthProvider'); } return context; }; export function AuthProvider({ children }: { children: React.ReactNode }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const navigate = useNavigate(); const validateToken = async () => { const accessToken = window.localStorage.getItem("accessToken"); const refreshToken = window.localStorage.getItem("refreshToken"); if (!accessToken) { // Токена нет → отправляем на регистрацию navigate(ROUTES.REGISTER, { replace: true }); setLoading(false); return; } try { const { data } = await authApi.validateToken(); if (data.success) { // Токен валиден setUser(data.user); } else if (refreshToken) { // Токен устарел → обновляем const { data: refreshData } = await authApi.refreshToken({ refreshToken }); if (refreshData.accessToken) { window.localStorage.setItem("accessToken", refreshData.accessToken); // Повторная валидация после обновления токена const { data: validated } = await authApi.validateToken(); if (validated.success) setUser(validated.user); } else { // Не удалось обновить → отправляем на логин navigate(ROUTES.LOGIN, { replace: true }); } } else { // Нет refresh токена → отправляем на логин navigate(ROUTES.LOGIN, { replace: true }); } } catch (err) { /* eslint-disable */ console.error('Ошибка при проверке токена', err); /* eslint-enable */ navigate(ROUTES.LOGIN, { replace: true }); } finally { setLoading(false); } }; useEffect(() => { validateToken() }, []); const updateUserContext = (newValues: Partial) => { if (newValues.user !== undefined) { setUser(newValues.user); } }; const contextValue: IAuthContext = { user, loading, updateUserContext }; return ( {children} ); }