import { Ban, Gavel, LogOut, Radio, Shield, Ticket, Users } from "lucide-react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import type { ReactNode } from "react"; import { LanguageSwitcher } from "@/components/language-switcher"; import { ThemeSwitcher } from "@/components/theme-switcher"; import { requireMod } from "@/lib/admin/guard"; import { setCsrfCookie } from "@/lib/foundation/security"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; import { siteSettings } from "@/lib/services/site-settings"; export const dynamic = "force-dynamic"; export default async function ModLayout({ children }: { children: ReactNode }) { const staff = await requireMod(); let csrfToken = ""; try { csrfToken = await setCsrfCookie(); } catch { csrfToken = ""; } if (await siteSettings.getBool("force_staff_2fa", false)) { const u = await prisma.user .findUnique({ where: { id: staff.id }, select: { twoFactorConfirmedAt: true }, }) .catch(() => null); if (!u?.twoFactorConfirmedAt) redirect("/settings/2fa?error=staffrequired"); } const t = await getTranslations("pages.mod"); const { permissions } = await getAdminContext(); const showCfh = canAccess(permissions, PERMS.MOD_CFH_VIEW, staff.rank) || canAccess(permissions, PERMS.MODERATION_VIEW, staff.rank); const showActions = canAccess(permissions, PERMS.MOD_ACTIONS, staff.rank) || canAccess(permissions, PERMS.MODERATION_EDIT, staff.rank); const showBans = canAccess(permissions, PERMS.MOD_BANS_VIEW, staff.rank) || canAccess(permissions, PERMS.BANS_VIEW, staff.rank); const showTickets = canAccess(permissions, PERMS.MOD_TICKETS_VIEW, staff.rank) || canAccess(permissions, PERMS.TICKETS_VIEW, staff.rank); const showTeam = canAccess(permissions, PERMS.MOD_TEAM_VIEW, staff.rank) || canAccess(permissions, PERMS.MODERATION_VIEW, staff.rank); const showAdmin = canAccess(permissions, PERMS.ADMIN_DASHBOARD, staff.rank); const nav = [ { href: "/mod", label: t("nav.overview"), icon: Shield, show: true }, { href: "/mod/cfh", label: t("nav.cfh"), icon: Radio, show: showCfh }, { href: "/mod/tickets", label: t("nav.tickets"), icon: Ticket, show: showTickets, }, { href: "/mod/actions", label: t("nav.actions"), icon: Gavel, show: showActions, }, { href: "/mod/bans", label: t("nav.bans"), icon: Ban, show: showBans }, { href: "/mod/team", label: t("nav.team"), icon: Users, show: showTeam }, ].filter((item) => item.show); return ( <> {csrfToken ? : null}

{t("badge")}

{t("title")}

{staff.username} ยท rank {staff.rank}

{showAdmin ? ( {t("nav.fullAdmin")} ) : null} {t("nav.backToSite")}
{children}
); }