diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index a3683a3..90e7cdc 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -12,10 +12,13 @@ export default function Login() { const { t } = useTranslation() const navigate = useNavigate() const location = useLocation() - const { isAuthenticated, loginWithTelegram, loginWithEmail } = useAuthStore() + const { isAuthenticated, loginWithTelegram, loginWithEmail, registerWithEmail } = useAuthStore() const [activeTab, setActiveTab] = useState<'telegram' | 'email'>('telegram') + const [authMode, setAuthMode] = useState<'login' | 'register'>('login') const [email, setEmail] = useState('') const [password, setPassword] = useState('') + const [confirmPassword, setConfirmPassword] = useState('') + const [firstName, setFirstName] = useState('') const [error, setError] = useState('') const [isLoading, setIsLoading] = useState(false) const [isTelegramWebApp, setIsTelegramWebApp] = useState(false) @@ -94,22 +97,49 @@ export default function Login() { tryTelegramAuth() }, [loginWithTelegram, navigate, t, getReturnUrl]) - const handleEmailLogin = async (e: React.FormEvent) => { + const handleEmailSubmit = async (e: React.FormEvent) => { e.preventDefault() setError('') + + // Валидация email + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + if (!email.trim() || !emailRegex.test(email.trim())) { + setError(t('auth.invalidEmail', 'Please enter a valid email address')) + return + } + + if (authMode === 'register') { + // Валидация для регистрации + if (password !== confirmPassword) { + setError(t('auth.passwordMismatch', 'Passwords do not match')) + return + } + if (password.length < 8) { + setError(t('auth.passwordTooShort', 'Password must be at least 8 characters')) + return + } + } + setIsLoading(true) try { - await loginWithEmail(email, password) + if (authMode === 'login') { + await loginWithEmail(email, password) + } else { + await registerWithEmail(email, password, firstName || undefined) + } navigate(getReturnUrl(), { replace: true }) } catch (err: unknown) { const error = err as { response?: { status?: number; data?: { detail?: string } } } - // Show user-friendly error messages without exposing sensitive server details const status = error.response?.status - if (status === 401 || status === 403) { - setError(t('auth.invalidCredentials', 'Неверный email или пароль')) + const detail = error.response?.data?.detail + + if (status === 400 && detail?.includes('already registered')) { + setError(t('auth.emailAlreadyRegistered', 'This email is already registered')) + } else if (status === 401 || status === 403) { + setError(t('auth.invalidCredentials', 'Invalid email or password')) } else if (status === 429) { - setError(t('auth.tooManyAttempts', 'Слишком много попыток. Попробуйте позже')) + setError(t('auth.tooManyAttempts', 'Too many attempts. Please try again later')) } else { setError(t('common.error')) } @@ -205,60 +235,137 @@ export default function Login() { )} ) : ( -