| import React, { useState } from 'react' |
| import { NavLink, useLocation, useNavigate } from 'react-router-dom' |
| import { |
| Home, |
| BookOpen, |
| ChevronDown, |
| } from 'lucide-react' |
| import '../App.css' |
| |
| const menuItems = [ |
| { id: 'home', label: '首页', icon: Home, path: '/home' }, |
| { id: 'notebooks', label: '笔记管理', icon: BookOpen, path: '/notebooks' }, |
| // { id: 'activity', label: '活动中心', icon: Activity, path: '/activity' }, |
| // { id: 'notes', label: '笔记灵感', icon: BookOpen, path: '/notes' }, |
| // { id: 'creator', label: '创作学院', icon: Users, path: '/creator' }, |
| // { id: 'journal', label: '创作日刊', icon: BookOpen, path: '/journal' }, |
| ] |
| |
| export default function Sidebar() { |
| const [expandedMenu, setExpandedMenu] = useState(null) |
| const location = useLocation() |
| const navigate = useNavigate() |
| |
| const toggleMenu = item => { |
| if (item.submenu) { |
| setExpandedMenu(expandedMenu === item.id ? null : item.id) |
| } else { |
| navigate(item.path) |
| setExpandedMenu(null) |
| } |
| } |
| |
| return ( |
| <aside className="sidebar"> |
| {/* 发布笔记 按钮 */} |
| <button |
| className="publish-btn" |
| onClick={() => navigate('/posts/new')} |
| > |
| 发布笔记 |
| </button> |
| |
| <nav className="nav-menu"> |
| {menuItems.map(item => ( |
| <div key={item.id} className="nav-item"> |
| <a |
| href="#" |
| className={`nav-link${location.pathname === item.path ? ' active' : ''}`} |
| onClick={e => { e.preventDefault(); toggleMenu(item) }} |
| > |
| <item.icon size={16} /> |
| <span>{item.label}</span> |
| {item.submenu && ( |
| <ChevronDown |
| size={16} |
| style={{ |
| marginLeft: 'auto', |
| transform: expandedMenu === item.id ? 'rotate(180deg)' : 'rotate(0deg)', |
| transition: 'transform 0.3s ease' |
| }} |
| /> |
| )} |
| </a> |
| {item.submenu && expandedMenu === item.id && ( |
| <div className="nav-submenu"> |
| {item.submenu.map(sub => ( |
| <NavLink |
| key={sub.id} |
| to={sub.path} |
| className={({ isActive }) => `nav-link${isActive ? ' active' : ''}`} |
| > |
| {sub.label} |
| </NavLink> |
| ))} |
| </div> |
| )} |
| </div> |
| ))} |
| </nav> |
| </aside> |
| ) |
| } |