import { getTranslations, setRequestLocale } from 'next-intl/server' import { redirect, Link } from '@/i18n/navigation' import { getSession } from '@/lib/session' import { getAccountDashboard } from '@/lib/account' import { isAdmin } from '@/lib/admin' import { PageShell } from '@/components/PageShell' export const dynamic = 'force-dynamic' // Grupos de servicios con su icono del sprite real (acc-icon ). type ToolItem = { href: string; icon: string; label: string; desc: string } export default async function AccountPage({ params }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations('Account') const session = await getSession() if (!session.bnetId) redirect({ href: '/login', locale }) if (!session.username) redirect({ href: '/select-account', locale }) const data = await getAccountDashboard(session) const admin = await isAdmin(session) const groups: { title: string; items: ToolItem[] }[] = [ { title: t('accountSettings'), items: [ { href: '/change-password', icon: 'password-icon', label: t('svcChangePassword'), desc: t('svcChangePasswordDesc') }, { href: '/change-email', icon: 'email-icon', label: t('svcChangeEmail'), desc: t('svcChangeEmailDesc') }, { href: '/security-token', icon: 'token-icon', label: t('svcToken'), desc: t('svcTokenDesc') }, ], }, { title: t('servicesTitle'), items: [ { href: '/rename', icon: 'rename-icon', label: t('svcRename'), desc: t('svcRenameDesc') }, { href: '/customize', icon: 'customize-icon', label: t('svcCustomize'), desc: t('svcCustomizeDesc') }, { href: '/change-race', icon: 'change-race-icon', label: t('svcChangeRace'), desc: t('svcChangeRaceDesc') }, { href: '/change-faction', icon: 'change-faction-icon', label: t('svcChangeFaction'), desc: t('svcChangeFactionDesc') }, { href: '/level-up', icon: 'level-up-icon', label: t('svcLevelUp'), desc: t('svcLevelUpDesc') }, { href: '/gold', icon: 'gold-icon', label: t('svcGold'), desc: t('svcGoldDesc') }, { href: '/transfer', icon: 'tranfer-char-icon', label: t('svcTransfer'), desc: t('svcTransferDesc') }, ], }, { title: t('utilitiesTitle'), items: [ { href: '/revive', icon: 'revive-icon', label: t('svcRevive'), desc: t('svcReviveDesc') }, { href: '/unstuck', icon: 'unstuck-icon', label: t('svcUnstuck'), desc: t('svcUnstuckDesc') }, ], }, { title: t('communityTitle'), items: [ { href: '/vote-points', icon: 'vote-icon', label: t('svcVote'), desc: t('svcVoteDesc') }, { href: '/recruit', icon: 'recruit-a-friend-icon', label: t('svcRecruit'), desc: t('svcRecruitDesc') }, { href: '/battlepay', icon: 'store-icon', label: t('svcStore'), desc: t('svcStoreDesc') }, ], }, ] return ( {/* Información de la cuenta */}

{t('infoTitle')}

{t('bnetAccount')} {data.bnetEmail}
{t('gameAccount')} {data.gameAccount}
{t('dp')} {data.dp}
{t('vp')} {data.vp}
{t('battlepayCredits')} {data.battlepayCredits}
{t('securityToken')} {data.securityTokenDate ? ( {t('requested')} — {new Date(data.securityTokenDate).toLocaleString(locale)} ) : ( {t('notRequested')} )}
{/* Personajes */}

{t('characters')}

{data.characters.length === 0 ? (

{t('noCharacters')}

) : ( data.characters.map((c) => (
{/* eslint-disable-next-line @next/next/no-img-element */} {c.raceName} {c.name}
{t('level')} {c.level} · {c.raceName} {c.className}
📍 {c.zone}
{c.gold} {/* eslint-disable-next-line @next/next/no-img-element */} g {c.silver} {/* eslint-disable-next-line @next/next/no-img-element */} s {c.copper} {/* eslint-disable-next-line @next/next/no-img-element */} c
)) )}
{/* Utilidades y Herramientas */}

{t('toolsTitle')}

{admin && (
🛡️ {t('adminPanel')}
{t('adminPanelDesc')}
)} {groups.map((g) => (

{g.title}

{rows(g.items).map((pair, i) => ( {pair.map((it) => ( ))} {pair.length === 1 && ))}
{it.label}
{it.desc}
}
))}
) } // Agrupa los items de dos en dos (2 columnas, como el my-account de Django). function rows(items: T[]): T[][] { const out: T[][] = [] for (let i = 0; i < items.length; i += 2) out.push(items.slice(i, i + 2)) return out }