'use client' import {useState, useMemo, useCallback} from 'react' import Link from 'next/link' import {usePathname} from 'next/navigation' import {ChevronRight} from 'lucide-react' type Props = { collapsed?: boolean } // 菜单配置 const MENU_ITEMS = [ { group: '产品文档', items: [ {key: 'product/product-overview', label: '产品介绍'}, {key: 'product/choose-product', label: '如何选择产品'}, {key: 'product/why-verify', label: '为什么需要实名认证'}, {key: 'product/city-lines', label: '有哪些城市线路'}, {key: 'product/api-docs', label: 'ip提取接口文档'}, // 服务条款 ], }, { group: '操作指南', items: [ {key: 'operation/profile-settings', label: '修改个人信息和重置密码'}, {key: 'operation/whitelist-guide', label: '如何添加白名单'}, {key: 'operation/verify-guide', label: '如何进行实名认证'}, {key: 'operation/extract-link', label: '如何生成提取链接'}, {key: 'operation/payment-records', label: '查看支付和使用记录'}, ], }, { group: '客户端教程', items: [ {key: 'client/browser-proxy', label: '浏览器设置代理教程'}, {key: 'client/ios-proxy', label: 'iOS设置代理教程'}, {key: 'client/android-proxy', label: '安卓手机设置代理教程'}, {key: 'client/windows10-proxy', label: 'Windows10设置代理教程'}, ], }, { group: '常见问题', items: [ {key: 'faqs/faq-general', label: '常见问题总览'}, {key: 'faqs/faq-billing', label: '计费与套餐问题'}, // 业务场景集成方案 // 故障排查 ], }, { group: '新闻资讯', items: [ {key: 'news/news-latest', label: '了解代理服务器的工作原理'}, {key: 'news/news-announce', label: '网站公告'}, ], }, ] export default function Sidebar({collapsed = false}: Props) { const pathname = usePathname() // 获取当前文档 key const getCurrentKey = useCallback(() => { const parts = pathname?.split('/') || [] return parts[2] || '' }, [pathname]) const currentKey = getCurrentKey() // 展开/收起状态 const [expandedGroups, setExpandedGroups] = useState>({}) // 初始化:自动展开包含当前活跃项的分组 const initialExpandedGroups = useMemo(() => { const result: Record = {} MENU_ITEMS.forEach((section, index) => { const hasActive = section.items.some(item => item.key === currentKey) if (hasActive || index === 0) { result[section.group] = true } }) return result }, [currentKey]) // 合并自动展开和用户手动切换 const finalExpandedGroups = useMemo(() => { return {...initialExpandedGroups, ...expandedGroups} }, [initialExpandedGroups, expandedGroups]) const toggleGroup = (group: string) => { setExpandedGroups(prev => ({ ...prev, [group]: !finalExpandedGroups[group], })) } const getItemHref = (key: string) => `/docs/${key}` return ( ) }