'use client' import { useState } from 'react' import { usePathname } from 'next/navigation' import Link from 'next/link' import Image from 'next/image' import { cn } from '@/lib/utils' import { Button } from '@/registry/new-york/ui/button' import { ScrollArea } from '@/registry/new-york/ui/scroll-area' import type { NavigationData } from '@/types/navigation' import type { SiteConfig } from '@/types/site' import * as LucideIcons from 'lucide-react' import { ChevronDown, ChevronRight, X } from 'lucide-react' interface SidebarProps extends React.HTMLAttributes { navigationData: NavigationData siteInfo: SiteConfig onClose?: () => void } export function Sidebar({ className, navigationData, siteInfo, onClose }: SidebarProps) { const pathname = usePathname() const scrollToSection = (id: string) => { const element = document.getElementById(id) if (element) { element.scrollIntoView({ behavior: 'smooth' }) onClose?.() } } const handleCategoryClick = (categoryId: string) => { // 先跳转到对应区域 scrollToSection(categoryId) // 如果有子分类,切换展开/收起状态 const category = navigationData.navigationItems.find(cat => cat.id === categoryId) if (category?.subCategories && category.subCategories.length > 0) { toggleCategory(categoryId) } } const renderIcon = (iconName?: string) => { if (!iconName) return ; if (iconName.startsWith('/') || iconName.startsWith('http')) { return ( icon ); } // Convert icon name to match Lucide icon component name const IconComponent = (LucideIcons as any)[iconName] || LucideIcons.Folder; return ; } // 使用对象存储每个分类的展开状态 const [expandedCategories, setExpandedCategories] = useState>(() => { return navigationData.navigationItems.reduce((acc, category) => { acc[category.id] = false return acc }, {} as Record) }) const toggleCategory = (categoryId: string) => { setExpandedCategories(prev => ({ ...prev, [categoryId]: !prev[categoryId] })) } return (
{siteInfo.appearance.logo ? ( {siteInfo.basic.title} ) : ( )} {siteInfo.basic.title} {/* 移动模式下的关闭按钮 */} {onClose && ( )}
{navigationData.navigationItems.map((category) => (
{category.subCategories && category.subCategories.length > 0 && ( )}
{category.subCategories && category.subCategories.length > 0 && (
{category.subCategories.map((subCategory) => ( ))}
)}
))}
) }