Files
NightSpire/web-next/app/[locale]/create-account/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.1 KiB
TypeScript

import type { Metadata } from 'next'
import { getTranslations, setRequestLocale } from 'next-intl/server'
import { getSession } from '@/lib/session'
import { PageShell } from '@/components/PageShell'
import { RegisterForm } from './RegisterForm'
// Lee la sesión (cookies), así que no se puede prerenderizar.
export const dynamic = 'force-dynamic'
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
const { locale } = await params
const t = await getTranslations({ locale, namespace: 'Register' })
return { title: t('title') }
}
export default async function CreateAccountPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
setRequestLocale(locale)
const t = await getTranslations('Register')
// El cuadro informativo se queda: sigue explicando cómo son las cuentas aunque
// ya tengas sesión. Lo que se sustituye es el formulario.
const session = await getSession()
return (
<PageShell title={t('title')}>
<div className="box-content" tabIndex={-1}>
<div className="body-box-content info-box-light justified">
<p>{t('bnetType')}</p>
<p>{t('passwordRule')}</p>
<p>{t('emailRule')}</p>
<br />
<p>{t('activation1')}</p>
<p>{t('activation2')}</p>
<p>
<i className="fas fa-exclamation-triangle"></i> {t('loginHint')}
</p>
</div>
</div>
<div className="box-content">
<div className="body-box-content centered">
{session.bnetId ? (
<>
<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('alreadyLoggedCreate', { logout: (c) => <a href={`/${locale}/log-out`}>{c}</a> })}</p>
</>
) : (
<RegisterForm />
)}
</div>
</div>
</PageShell>
)
}