"use client"; import { useMemo, useState } from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { ChevronDown, Moon, Sun, Menu, X } from "lucide-react"; import { cn } from "@/lib/utils"; import { useColorMode } from "@/components/providers/ColorModeProvider"; import { Button } from "@/components/ds"; import { EXPERIENCE_PORTAL, navForExperience, filterNavByCapabilities, } from "@/modules/experience/constants/portals"; import { useExperienceCapabilities } from "@/modules/experience/hooks/useExperienceCapabilities"; import { WorkspaceSwitcher } from "@/modules/experience/components/WorkspaceSwitcher"; function isActive(pathname: string, href: string) { const base = href.split("?")[0]; if (base === "/experience") return pathname === "/experience"; return pathname === base || pathname.startsWith(`${base}/`); } export function ExperiencePortalShell({ children, title, }: { children: React.ReactNode; title?: string; }) { const pathname = usePathname(); const { mode, toggle } = useColorMode(); const caps = useExperienceCapabilities(); const [openGroups, setOpenGroups] = useState>({}); const [mobileOpen, setMobileOpen] = useState(false); const nav = useMemo( () => filterNavByCapabilities(navForExperience(), 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 = ( <>

تربت پیجز

{title ?? EXPERIENCE_PORTAL.label}

تغییر پورتال
); return (
{mobileOpen ? (
{sidebar}
) : null}
{EXPERIENCE_PORTAL.label}
{children}
); }