import React, { useState } from 'react'; import { useAuth } from '../contexts/AuthContext'; import { useLanguage } from '../contexts/LanguageContext'; import { t } from '../i18n/translations'; import { Header } from './Header'; export function LoginPage() { const { language } = useLanguage(); const { login, verifyOTP } = useAuth(); const [step, setStep] = useState<'login' | 'otp'>('login'); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [otpCode, setOtpCode] = useState(''); const [userID, setUserID] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); const result = await login(email, password); if (result.success) { if (result.requiresOTP && result.userID) { setUserID(result.userID); setStep('otp'); } } else { setError(result.message || t('loginFailed', language)); } setLoading(false); }; const handleOTPVerify = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); const result = await verifyOTP(userID, otpCode); if (!result.success) { setError(result.message || t('verificationFailed', language)); } // 成功的话AuthContext会自动处理登录状态 setLoading(false); }; return (
{/* Logo */}
NOFX

{t('loginTitle', language)}

{step === 'login' ? t('loginTitle', language) : t('enterOTPCode', language)}

{/* Login Form */}
{step === 'login' ? (
setEmail(e.target.value)} className="w-full px-3 py-2 rounded" style={{ background: '#0B0E11', border: '1px solid #2B3139', color: '#EAECEF' }} placeholder={t('emailPlaceholder', language)} required />
setPassword(e.target.value)} className="w-full px-3 py-2 rounded" style={{ background: '#0B0E11', border: '1px solid #2B3139', color: '#EAECEF' }} placeholder={t('passwordPlaceholder', language)} required />
{error && (
{error}
)}
) : (
📱

{t('scanQRCodeInstructions', language)}
{t('enterOTPCode', language)}

setOtpCode(e.target.value.replace(/\D/g, '').slice(0, 6))} className="w-full px-3 py-2 rounded text-center text-2xl font-mono" style={{ background: '#0B0E11', border: '1px solid #2B3139', color: '#EAECEF' }} placeholder={t('otpPlaceholder', language)} maxLength={6} required />
{error && (
{error}
)}
)}
{/* Register Link */}

{t('noAccount', language)}{' '}

); }