import { Link } from "@/lib/router"; import { Menu } from "lucide-react"; import { useBreadcrumbs } from "../context/BreadcrumbContext"; import { useSidebar } from "../context/SidebarContext"; import { useCompany } from "../context/CompanyContext"; import { Button } from "@/components/ui/button"; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; import { Fragment, useMemo } from "react"; import { PluginSlotOutlet, usePluginSlots } from "@/plugins/slots"; import { PluginLauncherOutlet, usePluginLaunchers } from "@/plugins/launchers"; type GlobalToolbarContext = { companyId: string | null; companyPrefix: string | null }; function GlobalToolbarPlugins({ context }: { context: GlobalToolbarContext }) { const { slots } = usePluginSlots({ slotTypes: ["globalToolbarButton"], companyId: context.companyId }); const { launchers } = usePluginLaunchers({ placementZones: ["globalToolbarButton"], companyId: context.companyId, enabled: !!context.companyId }); if (slots.length === 0 && launchers.length === 0) return null; return (
); } export function BreadcrumbBar() { const { breadcrumbs } = useBreadcrumbs(); const { toggleSidebar, isMobile } = useSidebar(); const { selectedCompanyId, selectedCompany } = useCompany(); const globalToolbarSlotContext = useMemo( () => ({ companyId: selectedCompanyId ?? null, companyPrefix: selectedCompany?.issuePrefix ?? null, }), [selectedCompanyId, selectedCompany?.issuePrefix], ); const globalToolbarSlots = ; if (breadcrumbs.length === 0) { return (
{globalToolbarSlots}
); } const menuButton = isMobile && ( ); // Single breadcrumb = page title (uppercase) if (breadcrumbs.length === 1) { return (
{menuButton}

{breadcrumbs[0].label}

{globalToolbarSlots}
); } // Multiple breadcrumbs = breadcrumb trail return (
{menuButton}
{breadcrumbs.map((crumb, i) => { const isLast = i === breadcrumbs.length - 1; return ( {i > 0 && } {isLast || !crumb.href ? ( {crumb.label} ) : ( {crumb.label} )} ); })}
{globalToolbarSlots}
); }