link0518
重构
b88ce1b
import { createContext, useContext, useState, useEffect } from 'react';
const AuthContext = createContext(null);
export function AuthProvider({ children }) {
const [token, setToken] = useState(localStorage.getItem('adminToken') || '');
const [isAuthenticated, setIsAuthenticated] = useState(false);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
verifySession();
}, [token]);
const verifySession = async () => {
if (!token) {
setIsAuthenticated(false);
setIsLoading(false);
return;
}
try {
const response = await fetch('/admin/verify', {
headers: { 'X-Admin-Token': token }
});
if (response.ok) {
setIsAuthenticated(true);
} else {
logout();
}
} catch (error) {
console.error('Session verification failed:', error);
setIsAuthenticated(false); // Don't logout immediately on network error, but for now safe
} finally {
setIsLoading(false);
}
};
const login = async (password) => {
try {
const response = await fetch('/admin/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ password })
});
const data = await response.json();
if (response.ok && data.success) {
setToken(data.token);
localStorage.setItem('adminToken', data.token);
setIsAuthenticated(true);
return { success: true };
} else {
return { success: false, error: data.error || 'Login failed' };
}
} catch (error) {
return { success: false, error: error.message };
}
};
const logout = async () => {
try {
await fetch('/admin/logout', {
method: 'POST',
headers: { 'X-Admin-Token': token }
});
} catch (e) {
// Ignore logout errors
}
setToken('');
localStorage.removeItem('adminToken');
setIsAuthenticated(false);
};
return (
<AuthContext.Provider value={{ token, isAuthenticated, isLoading, login, logout }}>
{children}
</AuthContext.Provider>
);
}
export const useAuth = () => useContext(AuthContext);