import { BarChart2, Settings, ShoppingCart, User, Users } from 'lucide-react'; import { Link, useLocation } from 'react-router-dom'; import { cn } from '@crux-kit/utils'; import { MenuConfig } from '#app/config/types'; import { useMenuConfig } from '#app/menu'; import { useMenu } from '#shared/hooks/useMenu'; import { createMenuPathMatcher } from '#shared/lib/menuPath'; import { Button } from '#shared/ui/Button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from '#shared/ui/DropdownMenu'; export function SidebarMenu() { const { pathname } = useLocation(); const { hasActiveChild } = useMenu(pathname); const config = useMenuConfig(); const menuConfig: MenuConfig = [ { title: 'Boards', icon: BarChart2, path: '/' }, { title: 'Profiles', icon: User, children: config?.[2].children }, { title: 'Account', icon: Settings, children: config?.[3].children }, { title: 'Store', icon: ShoppingCart, children: config?.[7].children }, { title: 'Network', icon: Users, children: config?.[4].children } ]; // A leaf highlights only when nothing deeper in the menu matches the route more closely. const isActive = createMenuPathMatcher(menuConfig, pathname); const buildMenu = (items: MenuConfig) => { return items.map((item, index) => (
{item.children ? ( {item.title} {buildMenuChildren(item.children)} ) : ( {item.icon && } {item.title} )}
)); }; const buildMenuChildren = (items: MenuConfig) => { return items.map((item, index) => { if (item.disabled) return null; if (item.separator) return ; if (item.children) { return ( {item.title} {item.title} {buildMenuChildren(item.children)} ); } return ( {item.title} ); }); }; return (
{buildMenu(menuConfig)}
); }