'use client'; import { useEffect, useState, Suspense } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { useLanguage } from '@/context/LanguageContext'; import { useAuth } from '@/context/AuthContext'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import Input from '@/components/ui/Input'; import { authApi } from '@/lib/api'; import { authClient } from '@/lib/auth-client'; import toast from 'react-hot-toast'; /** * Progressive-account claim. The claim email contains a magic link that signs * the user in (via /auth/magic-link) and redirects here; this page then asks * for a password and completes the claim against /api/auth-ext/claim-account. */ function ClaimAccountContent() { const router = useRouter(); const { locale: language } = useLanguage(); const { refreshUser } = useAuth(); const [loading, setLoading] = useState(false); const [checking, setChecking] = useState(true); const [hasSession, setHasSession] = useState(false); const [alreadyClaimed, setAlreadyClaimed] = useState(false); const [formData, setFormData] = useState({ password: '', confirmPassword: '', }); useEffect(() => { let cancelled = false; authClient .getSession() .then(({ data }) => { if (cancelled) return; const user: any = data?.user; setHasSession(!!user); setAlreadyClaimed(!!user && user.isClaimed && user.accountStatus === 'active'); }) .finally(() => { if (!cancelled) setChecking(false); }); return () => { cancelled = true; }; }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (formData.password !== formData.confirmPassword) { toast.error(language === 'es' ? 'Las contraseñas no coinciden' : 'Passwords do not match'); return; } if (formData.password.length < 10) { toast.error( language === 'es' ? 'La contraseña debe tener al menos 10 caracteres' : 'Password must be at least 10 characters' ); return; } setLoading(true); try { await authApi.confirmClaimAccount(formData.password); await refreshUser(); toast.success(language === 'es' ? '¡Cuenta activada!' : 'Account activated!'); router.push('/dashboard'); } catch (error: any) { toast.error(error.message || (language === 'es' ? 'Error' : 'Failed')); } finally { setLoading(false); } }; if (checking) { return (
); } if (alreadyClaimed) { // Signed-in and already active: nothing to claim router.push('/dashboard'); return null; } if (!hasSession) { return (

{language === 'es' ? 'Enlace Inválido' : 'Invalid Link'}

{language === 'es' ? 'Este enlace de activación no es válido o ha expirado. Solicita uno nuevo con "Enlace por Email" en la página de inicio de sesión.' : 'This activation link is invalid or has expired. Request a new one using "Email Link" on the login page.'}

); } return (

{language === 'es' ? 'Activar tu Cuenta' : 'Activate Your Account'}

{language === 'es' ? 'Configura una contraseña para acceder a tu cuenta' : 'Set a password to access your account'}

{language === 'es' ? 'Tu cuenta fue creada durante una reservación. Establece una contraseña para acceder a tu historial de entradas y más.' : 'Your account was created during a booking. Set a password to access your ticket history and more.'}

setFormData({ ...formData, password: e.target.value })} required />

{language === 'es' ? 'Mínimo 10 caracteres' : 'Minimum 10 characters'}

setFormData({ ...formData, confirmPassword: e.target.value })} required />

{language === 'es' ? '¿Ya tienes acceso?' : 'Already have access?'}{' '} {language === 'es' ? 'Iniciar Sesión' : 'Log In'}

); } function LoadingFallback() { return (
); } export default function ClaimAccountPage() { return ( }> ); }