import { useState, useEffect } from 'react'; import { X, User, Lock, Mail, Eye, EyeOff } from 'lucide-react'; import { login, register } from '../utils/api'; import { auth } from '../utils/auth'; import { useToast } from '../contexts/ToastContext'; interface AuthModalProps { isOpen: boolean; onClose: () => void; onLoginSuccess: (user: any) => void; } export function AuthModal({ isOpen, onClose, onLoginSuccess }: AuthModalProps) { const [isLogin, setIsLogin] = useState(true); const [loading, setLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const toast = useToast(); const [formData, setFormData] = useState({ username: '', password: '', email: '', fullName: '' }); // Reset form when modal opens useEffect(() => { if (isOpen) { setFormData({ username: '', password: '', email: '', fullName: '' }); setIsLogin(true); setShowPassword(false); } }, [isOpen]); if (!isOpen) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); try { let data; if (isLogin) { data = await login(formData.username, formData.password); } else { data = await register( formData.username, formData.password, formData.email || undefined, formData.fullName || undefined ); } // Store token and user info auth.setToken(data.access_token); auth.setUser(data.user); toast.success(isLogin ? '登录成功!' : '注册成功!正在为您登录...'); onLoginSuccess(data.user); onClose(); } catch (err: any) { console.error('Auth error:', err); const msg = err.response?.data?.detail || '操作失败,请重试'; const errorMsg = typeof msg === 'string' ? msg : JSON.stringify(msg); toast.error(errorMsg); } finally { setLoading(false); } }; const handleChange = (e: React.ChangeEvent) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const toggleMode = () => { setIsLogin(!isLogin); }; return (
e.stopPropagation()} // Prevent closing when clicking inside > {/* Header */}

{isLogin ? '欢迎回来' : '创建账号'}

Cosmo - Deep Space Explorer

{/* Form */}
{!isLogin && ( <>
)}
{/* Footer */}

{isLogin ? '还没有账号?' : '已有账号?'}

); }