ads-marketing/frontend/src/context/UserContext.js
2025-07-23 17:45:31 +05:00

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);
}