import type { ReactNode } from "react"; import { FolderKanban, Globe2, ImageIcon, Languages, LayoutDashboard, LogOut, Palette, PlusSquare, ShieldAlert, SwatchBook, Tags, Type, } from "lucide-react"; import Link from "next/link"; import { AdminFlash } from "@/components/admin/admin-flash"; import { DashboardLayout } from "@/components/dashboard/dashboard-layout"; import { MotionFade } from "@/components/motion-fade"; import { SidebarMaintenanceControl } from "@/components/admin/sidebar-maintenance-control"; import { SoundToggle } from "@/components/sound-toggle"; import { ThemeToggle } from "@/components/theme-toggle"; import { Button } from "@/components/ui/button"; import { buildSiteUrl, getAdminAppPath } from "@/lib/admin-routing"; import { getMaintenanceMode, getSiteSettingsMediaBindings } from "@/lib/app-config"; import { getAdminNavigation } from "@/lib/admin-navigation"; import type { FlashMessages } from "@/lib/admin-feedback"; import { updateMaintenanceModeAction } from "@/app/_admin/maintenance/actions"; type AdminDashboardCopy = { title: string; subtitle: string; overview: string; maintenance: string; uiKit: string; portfolio: string; media: string; siteSettings: string; brandSettings?: string; localizationSettings?: string; marquee?: string; smtp?: string; logout: string; backToSite: string; }; type AdminDashboardShellProps = { copy: AdminDashboardCopy; active: "overview" | "maintenance" | "ui-kit" | "portfolio" | "media" | "site-settings" | "smtp" | "marquee"; portfolioChild?: "overview" | "projects" | "new-project" | "categories"; siteSettingsChild?: "brand" | "localization"; flash?: FlashMessages; logoutAction: () => Promise; headerTitle: string; headerDescription: string; headerActions?: ReactNode; sidebarTopContent?: ReactNode; toolbar?: ReactNode; children: ReactNode; }; export async function AdminDashboardShell({ copy, active, portfolioChild, siteSettingsChild, flash, logoutAction, headerTitle, headerDescription, headerActions, sidebarTopContent, toolbar, children, }: AdminDashboardShellProps) { const [mediaBindings, maintenanceEnabled] = await Promise.all([ getSiteSettingsMediaBindings(), getMaintenanceMode(), ]); const sidebarItems = getAdminNavigation(copy, active, portfolioChild, siteSettingsChild); const normalizedSidebarItems = sidebarItems.filter( (item) => item.href !== getAdminAppPath("/maintenance") && item.href !== getAdminAppPath("/ui-kit") && item.href !== getAdminAppPath("/smtp") && item.href !== getAdminAppPath("/marquee"), ); const footerSidebarItems = [getAdminAppPath("/marquee"), getAdminAppPath("/smtp")] .map((href) => sidebarItems.find((item) => item.href === href)) .filter((item): item is NonNullable => Boolean(item)); const headerIcon = active === "overview" ? LayoutDashboard : active === "maintenance" ? ShieldAlert : active === "ui-kit" ? SwatchBook : active === "site-settings" ? siteSettingsChild === "localization" ? Languages : siteSettingsChild === "brand" ? Palette : Globe2 : active === "marquee" ? Type : active === "smtp" ? ShieldAlert : active === "media" ? ImageIcon : portfolioChild === "categories" ? Tags : portfolioChild === "new-project" ? PlusSquare : FolderKanban; return (
} headerActions={
{headerActions}
} >
{flash?.success || flash?.error ? ( ) : null} {toolbar ? {toolbar} : null} {children}
); }