/
lizardking
/
react_project
Обзор
Документация
Войти
/
lizardking
/
react_project
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/features/auth/model/AuthProvider.tsx
58 строк
2 KB
LizardKing
Task 6 - Router
17 окт 2025, 22:40
17 окт 2025, 22:40
476a0e6
Код
Авторство
О чём код?
import type { User } from 'entities/user' import type { ReactNode} from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' import { STORAGE_TOKEN_KEY, useLoginMutation, useLazyGetMeQuery } from '../api/authApi' import { AuthContext } from './AuthContext' type Props = { children: ReactNode } export function AuthProvider({ children } : Props) { const [token, setToken] = useState<string | null>(null) const [currentUser, setCurrentUser] = useState<User | null>(null) const [isInitializing, setIsInitializing] = useState<boolean>(true) const [loginRequest] = useLoginMutation() const [fetchMe] = useLazyGetMeQuery() useEffect(() => { const stored = localStorage.getItem(STORAGE_TOKEN_KEY) if (!stored) { setIsInitializing(false) return } setToken(stored) fetchMe() .unwrap() .then(setCurrentUser) .catch(() => { localStorage.removeItem(STORAGE_TOKEN_KEY) setToken(null) setCurrentUser(null) }) .finally(() => setIsInitializing(false)) }, [fetchMe]) const login = useCallback(async (email: string, password: string) => { const issued = await loginRequest({ email, password }).unwrap() localStorage.setItem(STORAGE_TOKEN_KEY, issued) setToken(issued) const me = await fetchMe().unwrap() setCurrentUser(me) }, [loginRequest, fetchMe]) const logout = useCallback(() => { localStorage.removeItem(STORAGE_TOKEN_KEY) setToken(null) setCurrentUser(null) }, []) const value = useMemo( () => ({ token, currentUser, isInitializing, login, logout }), [token, currentUser, isInitializing, login, logout], ) return <AuthContext.Provider value={value}>{children}</AuthContext.Provider> }