// dashboard/src/hooks/useAuth.ts import { useState, useEffect } from 'react'; import axios from 'axios'; export function useAuth() { const [isAuthenticated, setIsAuthenticated] = useState(null); const [password, setPassword] = useState(''); const [loginError, setLoginError] = useState(null); const [loggingIn, setLoggingIn] = useState(false); // 全局启用 Axios 跨域凭证 useEffect(() => { axios.defaults.withCredentials = true; }, []); // 校验登录状态 useEffect(() => { axios.get('/api/auth/check') .then(() => { setIsAuthenticated(true); }) .catch(() => { setIsAuthenticated(false); }); }, []); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); if (!password.trim()) { setLoginError('请输入访问密码!'); return; } setLoggingIn(true); setLoginError(null); try { const res = await axios.post('/api/auth/login', { password }); if (res.data && res.data.bookmarklet_key) { localStorage.setItem('bookmarklet_key', res.data.bookmarklet_key); } setIsAuthenticated(true); setLoginError(null); } catch (err: unknown) { console.error('登录校验失败:', err); const axiosError = err as { response?: { data?: string | { error?: string } } }; let errMsg = '密码错误,请重试。'; if (axiosError.response?.data) { const data = axiosError.response.data; if (typeof data === 'string') { errMsg = data; } else if (typeof data === 'object' && data !== null && 'error' in data) { errMsg = data.error || errMsg; } } setLoginError(errMsg); } finally { setLoggingIn(false); } }; const handleLogout = async () => { try { await axios.post('/api/auth/logout'); } catch (e) { console.error('登出失败:', e); } localStorage.removeItem('bookmarklet_key'); setIsAuthenticated(false); setPassword(''); }; return { isAuthenticated, password, setPassword, loginError, loggingIn, handleLogin, handleLogout, }; }