"use client" import * as React from "react" import { cn } from "@/lib/utils" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "@/components/ui/sidebar" import { ExxatProductLogo, ExxatProductMark } from "@/components/exxat-product-logo" import { useProduct, type Product } from "@/contexts/product-context" import { useProductSwitch } from "@/contexts/product-route-sync" import { expandSwitcherProducts, resolveActiveSwitcherEntry, type SwitcherProductEntry, } from "@/lib/product-switcher-catalog" // Exxat One ships as **two siblings** because School-side and Site-side have // different navs, scope hierarchies, and primary personas — see // `apps/web/docs/multi-product-routing-pattern.md`. Both share the corporate // Exxat One wordmark; the `scope` sub-line below the wordmark in the dropdown // disambiguates them visually for sighted users (the `label` carries the full // accessible name for screen readers). export function ProductSwitcher() { const { product, customProducts, activeCustomIndex, hiddenProducts } = useProduct() const switchProduct = useProductSwitch() const { state, isMobile } = useSidebar() const products = React.useMemo( () => expandSwitcherProducts(customProducts, hiddenProducts), [customProducts, hiddenProducts], ) const isCurrentProduct = React.useCallback( (entry: SwitcherProductEntry) => entry.id === product && (entry.customIndex === undefined || entry.customIndex === activeCustomIndex), [activeCustomIndex, product], ) const current = resolveActiveSwitcherEntry( products, product, activeCustomIndex, customProducts, isCurrentProduct, ) const iconRail = state === "collapsed" && !isMobile const expandedOrMobile = state === "expanded" || isMobile return ( {iconRail ? ( // Collapsed icon-rail product mark — same frame as school avatar. ) : ( <>