'use client'; import { useEffect, useState, Suspense, useRef } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { useLanguage } from '@/context/LanguageContext'; import { useAuth } from '@/context/AuthContext'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import toast from 'react-hot-toast'; function MagicLinkContent() { const router = useRouter(); const searchParams = useSearchParams(); const { locale: language } = useLanguage(); const { loginWithMagicLink } = useAuth(); const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); const [error, setError] = useState(''); const verificationAttempted = useRef(false); const token = searchParams.get('token'); useEffect(() => { // Prevent duplicate verification attempts (React StrictMode double-invokes effects) if (verificationAttempted.current) return; if (token) { verificationAttempted.current = true; verifyToken(); } else { setStatus('error'); setError(language === 'es' ? 'Token no encontrado' : 'Token not found'); } }, [token]); const verifyToken = async () => { try { await loginWithMagicLink(token!); setStatus('success'); toast.success(language === 'es' ? '¡Bienvenido!' : 'Welcome!'); setTimeout(() => { router.push('/dashboard'); }, 1500); } catch (err: any) { setStatus('error'); setError(err.message || (language === 'es' ? 'Enlace inválido o expirado' : 'Invalid or expired link')); } }; return (
{language === 'es' ? 'Por favor espera' : 'Please wait'}
> )} {status === 'success' && ( <>{language === 'es' ? 'Redirigiendo...' : 'Redirecting...'}
> )} {status === 'error' && ( <>{error}
> )}