import { useEffect, useMemo } from "react"; import { useParams } from "@/lib/router"; import { useBreadcrumbs } from "@/context/BreadcrumbContext"; import { useCompany } from "@/context/CompanyContext"; import { PluginSlotMount, usePluginSlots } from "@/plugins/slots"; import { NotFoundPage } from "./NotFound"; export function CompanySettingsPluginPage() { const params = useParams<{ companyPrefix?: string; settingsRoutePath?: string; }>(); const { companyPrefix: routeCompanyPrefix, settingsRoutePath } = params; const { companies, selectedCompanyId } = useCompany(); const { setBreadcrumbs } = useBreadcrumbs(); const routeCompany = useMemo(() => { if (!routeCompanyPrefix) return null; const requested = routeCompanyPrefix.toUpperCase(); return companies.find((company) => company.issuePrefix.toUpperCase() === requested) ?? null; }, [companies, routeCompanyPrefix]); const hasInvalidCompanyPrefix = Boolean(routeCompanyPrefix) && !routeCompany; const resolvedCompanyId = routeCompany?.id ?? (routeCompanyPrefix ? null : selectedCompanyId ?? null); const companyPrefix = resolvedCompanyId ? companies.find((company) => company.id === resolvedCompanyId)?.issuePrefix ?? null : null; const { slots, isLoading, errorMessage } = usePluginSlots({ slotTypes: ["companySettingsPage"], companyId: resolvedCompanyId, enabled: Boolean(resolvedCompanyId && settingsRoutePath), }); const pageSlots = useMemo(() => { if (!settingsRoutePath) return []; return slots.filter((slot) => slot.routePath === settingsRoutePath); }, [settingsRoutePath, slots]); const pageSlot = pageSlots.length === 1 ? pageSlots[0] : null; useEffect(() => { if (!pageSlot) return; setBreadcrumbs([ { label: "Settings", href: "/company/settings" }, { label: pageSlot.displayName }, ]); }, [pageSlot, setBreadcrumbs]); if (!resolvedCompanyId) { if (hasInvalidCompanyPrefix) { return ; } return
Select a company to view this page.
; } if (!settingsRoutePath || isLoading) { return
Loading...
; } if (errorMessage) { return (
Plugin extensions unavailable: {errorMessage}
); } if (pageSlots.length > 1) { return (
Multiple plugins declare the company settings route {settingsRoutePath}. Disable one plugin or change its route.
); } if (!pageSlot) { return ; } return ( ); }