"use client"; import React, { CSSProperties } from 'react' import { Link, usePathname } from "@/components/navigation"; import { useState } from "react"; import { ChevronDown, Dot, LucideIcon } from "lucide-react"; import { GripVertical } from 'lucide-react'; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { DropdownMenuArrow } from "@radix-ui/react-dropdown-menu"; import { ScrollArea } from "@/components/ui/scroll-area" import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from "@/components/ui/tooltip"; import { DropdownMenu, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuPortal, DropdownMenuSubContent } from "@/components/ui/dropdown-menu"; import { Icon } from "@/components/ui/icon"; import { Submenu } from "@/lib/menus" // for dnd import { useSortable, arrayMove, SortableContext, verticalListSortingStrategy, horizontalListSortingStrategy, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { useConfig } from '@/hooks/use-config'; import { MultiCollapseMenuButton } from './classic-multi-collapse-button'; import { useMediaQuery } from '@/hooks/use-media-query'; import { useMobileMenuConfig } from '@/hooks/use-mobile-menu'; import { useMenuHoverConfig } from '@/hooks/use-menu-hover'; interface CollapseMenuButtonProps { icon: string; label: string; active: boolean; submenus: Submenu[]; collapsed: boolean | undefined; id: string } export function CollapseMenuButton({ icon, label, active, submenus, collapsed, id, }: CollapseMenuButtonProps) { const pathname = usePathname(); const isSubmenuActive = submenus.some((submenu) => submenu.active || pathname.startsWith(submenu.href)); const [isCollapsed, setIsCollapsed] = useState(isSubmenuActive); const [mobileMenuConfig, setMobileMenuConfig] = useMobileMenuConfig() const [config] = useConfig(); const [hoverConfig] = useMenuHoverConfig(); const { hovered } = hoverConfig; const sidebarTheme = config.sidebarTheme !== 'light' ? `dark theme-${config.sidebarTheme}` : `theme-${config.sidebarTheme}` const isDesktop = useMediaQuery("(min-width: 1280px)"); const { transform, transition, setNodeRef, isDragging, attributes, listeners } = useSortable({ id: id, }) React.useEffect(() => { setIsCollapsed(isSubmenuActive); }, [isSubmenuActive, pathname]); const style: CSSProperties = { transform: CSS.Transform.toString(transform), transition: transition, opacity: isDragging ? 0.8 : 1, zIndex: isDragging ? 1 : 0, position: "relative", }; if (config.sidebar === 'compact' && isDesktop) { return ( {submenus.map(({ href, label, active }, index) => ( ))} ) } return !collapsed || hovered ? (
{submenus.map(({ href, label, active, children: subChildren }, index) => ( subChildren?.length === 0 ? ( ) : ( ) ))}
) : ( {label} {label} {submenus.map(({ href, label, icon, active, children }, index) => ( children?.length === 0 ? ( {icon && ( )}

{label}

) : ( {label} {children?.map(({ href, label, active }, index) => ( {label} ))} ) ))}
); }