diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 0bcfce7..9ba4b78 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -32,6 +32,7 @@ export default function Login() { const [isLoading, setIsLoading] = useState(false) const [isTelegramWebApp, setIsTelegramWebApp] = useState(false) const [logoLoaded, setLogoLoaded] = useState(() => isLogoPreloaded()) + const [registeredEmail, setRegisteredEmail] = useState(null) // Получаем URL для возврата после авторизации const getReturnUrl = useCallback(() => { @@ -134,10 +135,12 @@ export default function Login() { try { if (authMode === 'login') { await loginWithEmail(email, password) + navigate(getReturnUrl(), { replace: true }) } else { - await registerWithEmail(email, password, firstName || undefined, referralCode || undefined) + const result = await registerWithEmail(email, password, firstName || undefined, referralCode || undefined) + // Show "check your email" screen + setRegisteredEmail(result.email) } - navigate(getReturnUrl(), { replace: true }) } catch (err: unknown) { const error = err as { response?: { status?: number; data?: { detail?: string } } } const status = error.response?.status @@ -146,11 +149,15 @@ export default function Login() { 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')) + if (detail?.includes('verify your email')) { + setError(t('auth.emailNotVerified', 'Please verify your email first')) + } else { + setError(t('auth.invalidCredentials', 'Invalid email or password')) + } } else if (status === 429) { setError(t('auth.tooManyAttempts', 'Too many attempts. Please try again later')) } else { - setError(t('common.error')) + setError(detail || t('common.error')) } } finally { setIsLoading(false) @@ -208,7 +215,36 @@ export default function Login() { )} - {/* Card */} + {/* Check Email Screen */} + {registeredEmail ? ( +
+
+ + + +
+

+ {t('auth.checkEmail', 'Check your email')} +

+

+ {t('auth.verificationSent', 'We sent a verification link to:')} +

+

{registeredEmail}

+

+ {t('auth.clickLinkToVerify', 'Click the link in the email to verify your account and log in.')} +

+ +
+ ) : ( + /* Card */
{/* Tabs */}
@@ -389,6 +425,7 @@ export default function Login() {
)}
+ )} ) diff --git a/src/pages/VerifyEmail.tsx b/src/pages/VerifyEmail.tsx index ee670f6..b44eda0 100644 --- a/src/pages/VerifyEmail.tsx +++ b/src/pages/VerifyEmail.tsx @@ -1,14 +1,18 @@ import { useEffect, useState } from 'react' -import { useSearchParams, Link } from 'react-router-dom' +import { useSearchParams, Link, useNavigate } from 'react-router-dom' import { useTranslation } from 'react-i18next' import { authApi } from '../api/auth' +import { useAuthStore } from '../store/auth' +import { tokenStorage } from '../utils/token' import LanguageSwitcher from '../components/LanguageSwitcher' export default function VerifyEmail() { const { t } = useTranslation() + const navigate = useNavigate() const [searchParams] = useSearchParams() const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading') const [error, setError] = useState('') + const { setTokens, setUser, checkAdminStatus } = useAuthStore() useEffect(() => { const token = searchParams.get('token') @@ -21,8 +25,15 @@ export default function VerifyEmail() { const verify = async () => { try { - await authApi.verifyEmail(token) + const response = await authApi.verifyEmail(token) + // Save tokens and log user in + tokenStorage.setTokens(response.access_token, response.refresh_token) + setTokens(response.access_token, response.refresh_token) + setUser(response.user) + checkAdminStatus() setStatus('success') + // Redirect to dashboard after short delay + setTimeout(() => navigate('/', { replace: true }), 1500) } catch (err: unknown) { setStatus('error') const error = err as { response?: { data?: { detail?: string } } } @@ -31,7 +42,7 @@ export default function VerifyEmail() { } verify() - }, [searchParams, t]) + }, [searchParams, t, navigate, setTokens, setUser, checkAdminStatus]) return (
@@ -54,12 +65,10 @@ export default function VerifyEmail() {

{t('emailVerification.success')}

- {t('emailVerification.successMessage')} + {t('emailVerification.redirecting', 'Redirecting to dashboard...')}

-
- - {t('emailVerification.goToLogin')} - +
+
)}