Files
NightSpire/web-next/app/[locale]/log-in/page.tsx
T
Inna 61ca63a55f Arreglar cierre de sesión solo: <Link> prefetcheaba /log-out
Regresión del commit anterior. /log-out es un GET que destruye la sesión, y yo
lo enlacé con <Link>: el router de Next lo prefetchea al entrar en pantalla, así
que la cookie se borraba sin que nadie pulsara. La página se renderizaba en el
servidor con la sesión («¡Ya estás conectado!») y al recargar ya no había sesión.

Reproducido: una petición de prefetch (RSC: 1, Next-Router-Prefetch: 1) a
/es/log-out responde `set-cookie: nightspire_session=; Max-Age=0`.

Se enlaza con <a> plano, que es justo como lo hace SiteHeader. Queda comentado
en ambos sitios para que no vuelva a colarse.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 18:27:02 +00:00

58 lines
2.0 KiB
TypeScript

import { getTranslations, setRequestLocale } from 'next-intl/server'
import { Link } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { PageShell } from '@/components/PageShell'
import { LoginForm } from './LoginForm'
// Lee la sesión (cookies), así que no se puede prerenderizar.
export const dynamic = 'force-dynamic'
export default async function LoginPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
setRequestLocale(locale)
const t = await getTranslations('Login')
// Ya conectado: `bnetId` basta, es lo que da por buena la sesión el resto del
// sitio. Sin esto se ofrecía el formulario a quien ya tenía sesión.
const session = await getSession()
if (session.bnetId) {
return (
<PageShell title={t('title')}>
<div className="box-content">
<div className="body-box-content centered">
<p>{t('alreadyLogged')}</p>
<br />
{/* `<a>` plano, NUNCA <Link>: /log-out es un GET que destruye la sesión,
y <Link> lo prefetcharía al entrar en pantalla, cerrándola sola sin
que nadie pulse. SiteHeader lo enlaza así por lo mismo. */}
<p>{t.rich('alreadyLoggedOther', { logout: (c) => <a href={`/${locale}/log-out`}>{c}</a> })}</p>
</div>
</div>
</PageShell>
)
}
return (
<PageShell title={t('title')}>
<div className="box-content">
<div className="body-box-content centered">
<LoginForm />
<br />
<p>
<Link href="/recover">{t('forgot')}</Link>
</p>
<p>
<Link href="/recover">{t('forgotActivation')}</Link>
</p>
<br />
<p>
{t('newHere')} <Link href="/create-account">{t('createAccount')}</Link>
</p>
<br />
<p className="grey-info2">{t('publicNote')}</p>
</div>
</div>
</PageShell>
)
}