blob: 26118b24e9fe1a01848b45b17e970a41b62fe176 [file] [log] [blame]
wueb6e6ca2025-06-15 10:35:32 +08001import React, { useState, useEffect } from 'react'
2import { NavLink, useLocation, useNavigate } from 'react-router-dom'
3import {
4 Home,
5 BookOpen,
6 BarChart3,
7 Activity,
8 Users,
9 ChevronDown,
10} from 'lucide-react'
wua80b90d2025-06-15 10:36:02 +080011import '../App.css'
wueb6e6ca2025-06-15 10:35:32 +080012
13const menuItems = [
14 { id: 'home', label: '首页', icon: Home, path: '/home' },
15 { id: 'notebooks', label: '笔记管理', icon: BookOpen, path: '/notebooks' },
16 {
17 id: 'dashboard',
18 label: '数据看板',
19 icon: BarChart3,
20 path: '/dashboard',
21 submenu: [
22 { id: 'overview', label: '账号概况', path: '/dashboard/overview' },
23 { id: 'content', label: '内容分析', path: '/dashboard/content' },
24 { id: 'fans', label: '粉丝数据', path: '/dashboard/fans' },
25 ]
26 },
27 { id: 'activity', label: '活动中心', icon: Activity, path: '/activity' },
28 { id: 'notes', label: '笔记灵感', icon: BookOpen, path: '/notes' },
29 { id: 'creator', label: '创作学院', icon: Users, path: '/creator' },
30 { id: 'journal', label: '创作日刊', icon: BookOpen, path: '/journal' },
31]
32
33export default function Sidebar() {
34 const [expandedMenu, setExpandedMenu] = useState(null)
35 const location = useLocation()
36 const navigate = useNavigate()
37
wua80b90d2025-06-15 10:36:02 +080038 // 打开 dashboard 下拉时保持展开
wueb6e6ca2025-06-15 10:35:32 +080039 useEffect(() => {
40 if (location.pathname.startsWith('/dashboard')) {
41 setExpandedMenu('dashboard')
42 }
43 }, [location.pathname])
44
45 const toggleMenu = item => {
46 if (item.submenu) {
47 setExpandedMenu(expandedMenu === item.id ? null : item.id)
48 } else {
49 navigate(item.path)
50 setExpandedMenu(null)
51 }
52 }
53
54 return (
55 <aside className="sidebar">
wua80b90d2025-06-15 10:36:02 +080056 {/* 发布笔记 按钮 */}
57 <button
58 className="publish-btn"
59 onClick={() => navigate('/posts/new')}
60 >
61 发布笔记
62 </button>
63
wueb6e6ca2025-06-15 10:35:32 +080064 <nav className="nav-menu">
65 {menuItems.map(item => (
66 <div key={item.id} className="nav-item">
67 <a
68 href="#"
69 className={`nav-link${location.pathname === item.path ? ' active' : ''}`}
70 onClick={e => { e.preventDefault(); toggleMenu(item) }}
71 >
72 <item.icon size={16} />
73 <span>{item.label}</span>
74 {item.submenu && (
75 <ChevronDown
76 size={16}
77 style={{
78 marginLeft: 'auto',
79 transform: expandedMenu === item.id ? 'rotate(180deg)' : 'rotate(0deg)',
80 transition: 'transform 0.3s ease'
81 }}
82 />
83 )}
84 </a>
85 {item.submenu && expandedMenu === item.id && (
86 <div className="nav-submenu">
87 {item.submenu.map(sub => (
88 <NavLink
89 key={sub.id}
90 to={sub.path}
91 className={({ isActive }) => `nav-link${isActive ? ' active' : ''}`}
92 >
93 {sub.label}
94 </NavLink>
95 ))}
96 </div>
97 )}
98 </div>
99 ))}
100 </nav>
101 </aside>
102 )
wua80b90d2025-06-15 10:36:02 +0800103}