'use client' import { useState } from 'react' import { useTranslations, useLocale } from 'next-intl' import { Turnstile } from '@/components/Turnstile' const ERROR_KEYS = ['invalidCredentials', 'missingFields', 'invalidRequest', 'captchaFailed'] as const export function LoginForm() { const t = useTranslations('Login') const locale = useLocale() const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [showPw, setShowPw] = useState(false) const [busy, setBusy] = useState(false) const [captcha, setCaptcha] = useState('') const [message, setMessage] = useState<{ ok: boolean; text: string } | null>(null) async function handleSubmit(e: React.FormEvent) { e.preventDefault() if (busy) return if (!email.trim() || !password) { setMessage({ ok: false, text: t('missingFields') }) return } setBusy(true) setMessage(null) try { const res = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin', body: JSON.stringify({ email: email.trim(), password, turnstileToken: captcha }), }) const data: { success?: boolean; needsSelection?: boolean; error?: string } = await res.json() if (data.success) { setMessage({ ok: true, text: t('success') }) // Navegación completa (no del lado cliente): fuerza que el servidor // re-renderice el layout/cabecera con la sesión nueva. Con router.push // el layout persiste y la cabecera seguía mostrando "Conectar". window.location.assign(`/${locale}${data.needsSelection ? '/select-account/' : '/my-account/'}`) return } else { const key = (ERROR_KEYS as readonly string[]).includes(data.error ?? '') ? data.error! : 'genericError' setMessage({ ok: false, text: t(key) }) setBusy(false) } } catch { setMessage({ ok: false, text: t('genericError') }) setBusy(false) } } return ( <>
setEmail(e.target.value)} />
setPassword(e.target.value)} /> setShowPw((v) => !v)} role="button" aria-label="toggle" />

{message && ( {message.text} )}
) }