"use client"; import React, { useState } from "react"; import { SidebarNav } from "@app/components/SidebarNav"; import { OrgSelector } from "@app/components/OrgSelector"; import { cn } from "@app/lib/cn"; import { ListUserOrgsResponse } from "@server/routers/org"; import SupporterStatus from "@app/components/SupporterStatus"; import { Button } from "@app/components/ui/button"; import { ExternalLink, Menu, X, Server } from "lucide-react"; import Image from "next/image"; import ProfileIcon from "@app/components/ProfileIcon"; import { Sheet, SheetContent, SheetTrigger, SheetTitle, SheetDescription } from "@app/components/ui/sheet"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { Breadcrumbs } from "@app/components/Breadcrumbs"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { useUserContext } from "@app/hooks/useUserContext"; import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; interface LayoutProps { children: React.ReactNode; orgId?: string; orgs?: ListUserOrgsResponse["orgs"]; navItems?: Array<{ title: string; href: string; icon?: React.ReactNode; children?: Array<{ title: string; href: string; icon?: React.ReactNode; }>; }>; showSidebar?: boolean; showBreadcrumbs?: boolean; showHeader?: boolean; showTopBar?: boolean; } export function Layout({ children, orgId, orgs, navItems = [], showSidebar = true, showBreadcrumbs = true, showHeader = true, showTopBar = true }: LayoutProps) { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const { env } = useEnvContext(); const pathname = usePathname(); const isAdminPage = pathname?.startsWith("/admin"); const { user } = useUserContext(); const { isUnlocked } = useLicenseStatusContext(); return (
{/* Full width header */} {showHeader && (
{showSidebar && (
Navigation Menu Main navigation menu for the application
setIsMobileMenuOpen( false ) } />
{!isAdminPage && user.serverAdmin && (
setIsMobileMenuOpen( false ) } > Server Admin
)}
{env?.app?.version && (
v{env.app.version}
)}
)} Pangolin Logo {showBreadcrumbs && (
)}
{showTopBar && (
Documentation
)}
{showBreadcrumbs && (
)}
)}
{/* Desktop Sidebar */} {showSidebar && (
{!isAdminPage && user.serverAdmin && (
Server Admin
)}
{!isUnlocked() ? "Community Edition" : "Commercial Edition"}
{env?.app?.version && (
v{env.app.version}
)}
)} {/* Main content */}
{children}
); }