'use client' import { useEffect, useState } from 'react' import { createBrowserClient } from '@supabase/ssr' import { useRouter } from 'next/navigation' type Stage = 'validating' | 'ready' | 'submitting' | 'error' export default function ConfirmPage() { const [stage, setStage] = useState('validating') const [error, setError] = useState(null) const [showPassword, setShowPassword] = useState(false) const router = useRouter() const supabase = createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! ) useEffect(() => { // Supabase emite PASSWORD_RECOVERY tanto para recovery como para invite // cuando el token de la URL (#access_token) es válido. const { data: listener } = supabase.auth.onAuthStateChange((event) => { if (event === 'PASSWORD_RECOVERY') setStage('ready') }) // Carrera posible: si el token ya se procesó antes de montar el listener, // ya hay sesión activa aunque el evento no se vuelva a emitir. supabase.auth.getSession().then(({ data: { session } }) => { setStage((s) => (s === 'validating' && session ? 'ready' : s)) }) // Sin evento ni sesión tras unos segundos = token inválido/vencido/ausente. const timeout = setTimeout(() => { setStage((s) => (s === 'validating' ? 'error' : s)) }, 8000) return () => { listener.subscription.unsubscribe() clearTimeout(timeout) } }, [supabase]) async function handleSubmit(e: React.FormEvent) { e.preventDefault() const fd = new FormData(e.currentTarget) const password = String(fd.get('password') ?? '') const confirmPassword = String(fd.get('confirmPassword') ?? '') if (password.length < 8) { setError('La contraseña debe tener al menos 8 caracteres.') return } if (password !== confirmPassword) { setError('Las contraseñas no coinciden.') return } setError(null) setStage('submitting') const { error: updateErr } = await supabase.auth.updateUser({ password }) if (updateErr) { setError('No pudimos guardar tu contraseña. Probá de nuevo.') setStage('ready') return } router.push('/dashboard') router.refresh() } if (stage === 'validating') { return (

Validando tu invitación...

) } if (stage === 'error') { return (

Link inválido o vencido

Pedile al administrador que te envíe una nueva invitación.

) } return (

Creá tu contraseña

{error && (

{error}

)}
) }