'use client'; import { useState, useEffect, Suspense } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { verifyEmail } from '@/api/auth'; const loadMaterialComponents = async () => { await Promise.all([ import('@material/web/button/filled-button.js'), import('@material/web/button/text-button.js'), ]); }; function VerifyEmailContent() { const router = useRouter(); const searchParams = useSearchParams(); const token = searchParams.get('token'); const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); const [message, setMessage] = useState(''); const [componentsLoaded, setComponentsLoaded] = useState(false); useEffect(() => { loadMaterialComponents().then(() => setComponentsLoaded(true)); }, []); useEffect(() => { if (!componentsLoaded || !token) { if (!token) { setStatus('error'); setMessage('Отсутствует ссылка для подтверждения. Проверьте письмо или запросите новое.'); } return; } let cancelled = false; verifyEmail(token) .then((res) => { if (cancelled) return; if (res.success) { setStatus('success'); setMessage('Email успешно подтверждён. Теперь вы можете войти в аккаунт.'); } else { setStatus('error'); setMessage(res.message || 'Не удалось подтвердить email.'); } }) .catch((err: any) => { if (cancelled) return; setStatus('error'); const msg = err.response?.data?.error?.message || err.response?.data?.detail || 'Неверная или устаревшая ссылка. Запросите новое письмо с подтверждением.'; setMessage(msg); }); return () => { cancelled = true; }; }, [token, componentsLoaded]); if (!componentsLoaded) { return (
Подтверждение email...
Подтверждение email
{status === 'loading' && (Загрузка...
} >