import { useEffect, useRef, useState } from 'react'; import { useSearchParams, Link, useNavigate } from 'react-router'; import { useTranslation } from 'react-i18next'; import { authApi } from '../api/auth'; import { useAuthStore } from '../store/auth'; import { useShallow } from 'zustand/shallow'; import { consumeCampaignSlug } from '../utils/campaign'; 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( useShallow((state) => ({ setTokens: state.setTokens, setUser: state.setUser, checkAdminStatus: state.checkAdminStatus, })), ); const hasVerified = useRef(false); useEffect(() => { if (hasVerified.current) return; const token = searchParams.get('token'); if (!token) { setStatus('error'); setError(t('common.error')); return; } hasVerified.current = true; let redirectTimer: ReturnType; const verify = async () => { try { const campaignSlug = consumeCampaignSlug(); const response = await authApi.verifyEmail(token, campaignSlug); // Save tokens and log user in tokenStorage.setTokens(response.access_token, response.refresh_token); setTokens(response.access_token, response.refresh_token); setUser(response.user); if (response.campaign_bonus) { useAuthStore.setState({ pendingCampaignBonus: response.campaign_bonus }); } checkAdminStatus(); setStatus('success'); // Redirect to dashboard after short delay redirectTimer = setTimeout(() => navigate('/', { replace: true }), 1500); } catch (err: unknown) { setStatus('error'); const error = err as { response?: { data?: { detail?: string } } }; setError(error.response?.data?.detail || t('emailVerification.failed')); } }; verify(); return () => clearTimeout(redirectTimer); }, [searchParams, t, navigate, setTokens, setUser, checkAdminStatus]); return (
{/* Language switcher in corner */}
{status === 'loading' && (

{t('emailVerification.verifying')}

{t('emailVerification.pleaseWait')}

)} {status === 'success' && (

{t('emailVerification.success')}

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

)} {status === 'error' && (

{t('emailVerification.failed')}

{error}

{t('emailVerification.goToLogin')}
)}
); }