63 lines
1.7 KiB
JavaScript
63 lines
1.7 KiB
JavaScript
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
|
|
const UserContext = createContext();
|
|
|
|
export function UserProvider({ children }) {
|
|
const [user, setUser] = useState(null);
|
|
const [token, setToken] = useState(null);
|
|
const [isCheckingAuth, setIsCheckingAuth] = useState(true);
|
|
|
|
useEffect(() => {
|
|
// Инициализация из localStorage
|
|
const storedUser = localStorage.getItem('user');
|
|
const storedToken = localStorage.getItem('token');
|
|
if (storedUser && storedToken) {
|
|
setUser(JSON.parse(storedUser));
|
|
setToken(storedToken);
|
|
// Проверка токена
|
|
fetch('/api/auth/verify', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${storedToken}` },
|
|
body: JSON.stringify({ token: storedToken })
|
|
})
|
|
.then(res => {
|
|
if (!res.ok) throw new Error('Invalid token');
|
|
return res.json();
|
|
})
|
|
.then(() => {
|
|
setIsCheckingAuth(false);
|
|
})
|
|
.catch(() => {
|
|
logout();
|
|
window.location.href = '/login';
|
|
});
|
|
} else {
|
|
setIsCheckingAuth(false);
|
|
}
|
|
// eslint-disable-next-line
|
|
}, []);
|
|
|
|
const login = (user, token) => {
|
|
setUser(user);
|
|
setToken(token);
|
|
localStorage.setItem('user', JSON.stringify(user));
|
|
localStorage.setItem('token', token);
|
|
};
|
|
|
|
const logout = () => {
|
|
setUser(null);
|
|
setToken(null);
|
|
localStorage.removeItem('user');
|
|
localStorage.removeItem('token');
|
|
};
|
|
|
|
return (
|
|
<UserContext.Provider value={{ user, token, login, logout, isCheckingAuth }}>
|
|
{children}
|
|
</UserContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useUser() {
|
|
return useContext(UserContext);
|
|
}
|