import { LogOut } 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 { AdminHubChrome } from "@/components/admin/admin-hub-chrome"; import { AdminMobileWrapper } from "@/components/admin/admin-mobile-wrapper"; import { AdminNavLink } from "@/components/admin/admin-nav-link"; import { LanguageSwitcher } from "@/components/language-switcher"; import { ThemeSwitcher } from "@/components/theme-switcher"; import { requireStaff } from "@/lib/admin/guard"; import { ADMIN_NAV_GROUPS } from "@/lib/admin-nav"; import { prisma } from "@/lib/prisma"; import { siteSettings } from "@/lib/services/site-settings"; export const dynamic = "force-dynamic"; export default async function AdminLayout({ children, }: { children: ReactNode; }) { const staff = await requireStaff(); 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"); } return ( }>
{children}
); } async function Sidebar({ staff, }: { staff: { id: number; username: string; rank: number }; }) { const t = await getTranslations("pages.admin.nav"); const initial = staff.username.charAt(0).toUpperCase(); return ( ); } async function Topbar({ staff, }: { staff: { id: number; username: string; rank: number }; }) { const t = await getTranslations("pages.admin.nav"); return (

{t("housekeeping")}

{t("hotelManagementPanel")}
{staff.username} {t("rankLabel", { rank: staff.rank })}
); }