import React, { useState } from "react"; import { LayoutDashboard, ChevronDown, ChevronRight, X } from "lucide-react"; export interface NavItem { key: string; label: string; icon?: React.ReactNode; active?: boolean; onClick?: () => void; children?: NavItem[]; } interface SidebarNavProps { items?: NavItem[]; isOpen?: boolean; onClose?: () => void; } export default function SidebarNav({ items = [] as NavItem[], isOpen = true, onClose }: SidebarNavProps) { const [expandedKeys, setExpandedKeys] = useState>(new Set(["configuration", "monitoring", "artifact", "cluster"])); const toggleExpand = (key: string) => { setExpandedKeys((prev) => { const next = new Set(prev); if (next.has(key)) { next.delete(key); } else { next.add(key); } return next; }); }; const handleItemClick = (item: NavItem, hasChildren: boolean) => { if (hasChildren) { toggleExpand(item.key); } else { if (item.onClick) { item.onClick(); } // 移动端点击后关闭侧边栏 if (onClose) { onClose(); } } }; const renderNavItem = (item: NavItem, level = 0) => { const hasChildren = Boolean(item.children && item.children.length > 0); const isExpanded = expandedKeys.has(item.key); return (
{hasChildren && isExpanded && (
{item.children!.map((child) => renderNavItem(child, level + 1))}
)}
); }; return ( <> {/* 移动端遮罩层 */} {isOpen && (
)} {/* 侧边栏 */} ); }