b9803adeb9
- /security-token: diseño completo del original (info + advertencia + NOTA 7 días), fecha en formato HH:MM:SS DD-MM-YYYY, botón "Token enviado", enlace a /recover. - /recover: 4 opciones (contraseña por usuario, nombre de cuenta, token de seguridad y enlace de activación por correo); recuperación de token nueva; Turnstile por envío. - /vote-points: caja de info con las 7 secciones Q&A + panel "Sitios de votación" con tarjetas inline-div (imagen, PV, último voto), botón refrescar; abre el sitio y acredita PV al volver. lib/vote.ts + getVoteSitesForAccount. - /rename-guild: renombra una hermandad de la que la cuenta es Maestro por 1000 PD + token de seguridad; SOAP .guild rename con comillas; reembolsa los PD si SOAP falla. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { getTranslations, setRequestLocale } from 'next-intl/server'
|
|
import { PageShell } from '@/components/PageShell'
|
|
import { RecoverForm } from './RecoverForm'
|
|
|
|
export default async function RecoverPage({ params }: { params: Promise<{ locale: string }> }) {
|
|
const { locale } = await params
|
|
setRequestLocale(locale)
|
|
const t = await getTranslations('Recover')
|
|
const sections = t.raw('infoSections') as { h: string; lines: string[] }[]
|
|
|
|
return (
|
|
<PageShell title={t('title')}>
|
|
<div className="box-content">
|
|
<div className="title-box-content">
|
|
<h2>{t('infoTitle')}</h2>
|
|
</div>
|
|
<div className="body-box-content justified">
|
|
{sections.map((s, i) => (
|
|
<div key={i}>
|
|
<span>{s.h}</span>
|
|
{s.lines.map((l, j) => (
|
|
<p key={j}>{l}</p>
|
|
))}
|
|
{i < sections.length - 1 && <br />}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
<div className="box-content">
|
|
<div className="title-box-content">
|
|
<h2>{t('reqTitle')}</h2>
|
|
</div>
|
|
<div className="body-box-content centered">
|
|
<RecoverForm />
|
|
</div>
|
|
</div>
|
|
</PageShell>
|
|
)
|
|
}
|