/
zemars
/
it-dashboard
Обзор
Документация
Войти
/
zemars
/
it-dashboard
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
frontend/src/context/AuthContext.jsx
69 строк
2 KB
Дмитрий
fix(docs): актуализировать risk_log и docstring init_db
26 май 2026, 22:07
26 май 2026, 22:07
9981d43
Код
Авторство
О чём код?
// Автор: Никита Синадский — контекст авторизации. // Хранит токен и пользователя ТОЛЬКО в памяти (по требованию NFR-03, // никакого localStorage). При перезагрузке страницы — нужно логиниться заново. import { createContext, useContext, useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import { setAuthToken, setUnauthorizedHandler, } from '../api/axiosInstance.js' import { login as apiLogin } from '../api/auth.js' const AuthContext = createContext(null) export function AuthProvider({ children }) { const [token, setToken] = useState(null) const [user, setUser] = useState(null) const [loginError, setLoginError] = useState('') const navigate = useNavigate() // Прокидываем токен в axios-инстанс useEffect(() => { setAuthToken(token) }, [token]) // На 401 — выходим useEffect(() => { setUnauthorizedHandler(() => { setToken(null) setUser(null) navigate('/login', { replace: true }) }) }, [navigate]) async function login(username, password) { setLoginError('') try { const data = await apiLogin(username, password) setToken(data.access_token) setUser({ username: data.username, role: data.role, }) return true } catch (e) { const detail = e?.response?.data?.detail setLoginError(detail || 'Не удалось войти. Проверьте логин и пароль.') return false } } function logout() { setToken(null) setUser(null) navigate('/login', { replace: true }) } const value = useMemo( () => ({ token, user, loginError, login, logout }), [token, user, loginError] ) return <AuthContext.Provider value={value}>{children}</AuthContext.Provider> } export function useAuth() { const ctx = useContext(AuthContext) if (!ctx) throw new Error('useAuth должен вызываться внутри <AuthProvider>') return ctx }