"use client"; import { useMemo, useState } from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { ChevronDown, Moon, Sun, Menu, X, Lock } from "lucide-react"; import { cn } from "@/lib/utils"; import { useColorMode } from "@/components/providers/ColorModeProvider"; import { Button } from "@/components/ds"; import { COMMUNICATION_PORTAL, navForCommunication, filterNavForDisplay, } from "@/modules/communication/constants/portals"; import { useCommunicationCapabilities } from "@/modules/communication/hooks/useCommunicationCapabilities"; function isActive(pathname: string, href: string) { const base = href.split("?")[0]; if (base === "/communication") return pathname === "/communication"; return pathname === base || pathname.startsWith(`${base}/`); } export function CommunicationPortalShell({ children, title, }: { children: React.ReactNode; title?: string; }) { const pathname = usePathname(); const { mode, toggle } = useColorMode(); const caps = useCommunicationCapabilities(); const [openGroups, setOpenGroups] = useState>({}); const [mobileOpen, setMobileOpen] = useState(false); const nav = useMemo( () => filterNavForDisplay(navForCommunication(), caps.data?.features), [caps.data?.features] ); const autoOpen = useMemo(() => { const map: Record = {}; for (const g of nav) { if (g.href && isActive(pathname, g.href)) map[g.id] = true; if (g.items?.some((i) => isActive(pathname, i.href))) map[g.id] = true; } return map; }, [pathname, nav]); const expanded = { ...autoOpen, ...openGroups }; const sidebar = ( <>

Torbat Communication

{title ?? COMMUNICATION_PORTAL.label}

SMS Production Ready

); return (
{mobileOpen ? (
setMobileOpen(false)} />
) : null}
{COMMUNICATION_PORTAL.label}
{children}
); }