import { useState, useCallback } from 'react'; import { useAuthStore } from '../store/auth'; import logoImg from '../assets/logo_32.png'; import styles from './LoginModal.module.css'; interface Props { isOpen: boolean; onClose: () => void; onSuccess: () => void; } export function LoginModal({ isOpen, onClose, onSuccess }: Props) { const login = useAuthStore((s) => s.login); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const handleSubmit = useCallback(async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!username.trim()) { setError('请输入用户名或邮箱'); return; } if (password.length < 6) { setError('密码至少6位'); return; } setLoading(true); try { await login(username, password); onSuccess(); } catch (err: any) { const msg = err.response?.data?.message || err.response?.data?.error || '登录失败,请重试'; setError(msg); } finally { setLoading(false); } }, [username, password, login, onSuccess]); if (!isOpen) return null; return (
{ if (e.target === e.currentTarget) (e.currentTarget as HTMLElement).dataset.mouseDownOnOverlay = 'true'; }} onMouseUp={(e) => { if ((e.currentTarget as HTMLElement).dataset.mouseDownOnOverlay === 'true' && e.target === e.currentTarget) onClose(); (e.currentTarget as HTMLElement).dataset.mouseDownOnOverlay = ''; }} >
Air Drama
setUsername(e.target.value)} placeholder="请输入用户名或邮箱" autoFocus />
setPassword(e.target.value)} placeholder="请输入密码" />
{error &&
{error}
}

目前仅限受邀创作者体验

); }