'use client' import { useEffect, useRef, useState } from 'react' import { useTranslations } from 'next-intl' import { Link } from '@/i18n/navigation' const ERROR_KEYS = ['invalidLink', 'expiredLink'] as const export function ActivateClient({ hash }: { hash: string }) { const t = useTranslations('Activate') const [state, setState] = useState<'loading' | 'ok' | 'error'>('loading') const [errorKey, setErrorKey] = useState('invalidLink') const ran = useRef(false) useEffect(() => { if (ran.current) return // evita doble POST en StrictMode ran.current = true if (!hash) { setErrorKey('invalidLink') setState('error') return } fetch('/api/auth/activate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ hash }), }) .then((r) => r.json()) .then((d: { success?: boolean; error?: string }) => { if (d.success) setState('ok') else { setErrorKey((ERROR_KEYS as readonly string[]).includes(d.error ?? '') ? d.error! : 'invalidLink') setState('error') } }) .catch(() => setState('error')) }, [hash]) return (
{state === 'loading' &&

{t('activating')}

} {state === 'ok' && ( <> {t('success')}

{t('goLogin')}

)} {state === 'error' && {t(errorKey)}}
) }