| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- import React from 'react';
- import { useNavigate } from 'react-router';
- import { useAuth } from './hooks/AuthProvider';
- import {
- Users,
- Settings,
- User,
- LogOut,
- BarChart3,
- LayoutDashboard,
- File
- } from 'lucide-react';
- export interface MenuItem {
- key: string;
- label: string;
- icon?: React.ReactNode;
- children?: MenuItem[];
- path?: string;
- permission?: string;
- onClick?: () => void;
- }
- /**
- * 菜单搜索 Hook
- * 封装菜单搜索相关逻辑
- */
- export const useMenuSearch = (menuItems: MenuItem[]) => {
- const [searchText, setSearchText] = React.useState('');
- // 过滤菜单项
- const filteredMenuItems = React.useMemo(() => {
- if (!searchText) return menuItems;
-
- const filterItems = (items: MenuItem[]): MenuItem[] => {
- return items
- .map(item => {
- // 克隆对象避免修改原数据
- const newItem = { ...item };
- if (newItem.children) {
- newItem.children = filterItems(newItem.children);
- }
- return newItem;
- })
- .filter(item => {
- // 保留匹配项或其子项匹配的项
- const match = item.label.toLowerCase().includes(searchText.toLowerCase());
- if (match) return true;
- if (item.children?.length) return true;
- return false;
- });
- };
-
- return filterItems(menuItems);
- }, [menuItems, searchText]);
- // 清除搜索
- const clearSearch = () => {
- setSearchText('');
- };
- return {
- searchText,
- setSearchText,
- filteredMenuItems,
- clearSearch
- };
- };
- export const useMenu = () => {
- const navigate = useNavigate();
- const { logout: handleLogout } = useAuth();
- const [collapsed, setCollapsed] = React.useState(false);
- // 基础菜单项配置
- const menuItems: MenuItem[] = [
- {
- key: 'dashboard',
- label: '控制台',
- icon: <LayoutDashboard className="h-4 w-4" />,
- path: '/admin/dashboard'
- },
- {
- key: 'users',
- label: '用户管理',
- icon: <Users className="h-4 w-4" />,
- path: '/admin/users',
- permission: 'user:manage'
- },
- {
- key: 'files',
- label: '文件管理',
- icon: <File className="h-4 w-4" />,
- path: '/admin/files',
- permission: 'file:manage'
- },
- {
- key: 'analytics',
- label: '数据分析',
- icon: <BarChart3 className="h-4 w-4" />,
- path: '/admin/analytics',
- permission: 'analytics:view'
- },
- {
- key: 'settings',
- label: '系统设置',
- icon: <Settings className="h-4 w-4" />,
- path: '/admin/settings',
- permission: 'settings:manage'
- },
- ];
- // 用户菜单项
- const userMenuItems = [
- {
- key: 'profile',
- label: '个人资料',
- icon: <User className="mr-2 h-4 w-4" />,
- onClick: () => navigate('/admin/profile')
- },
- {
- key: 'settings',
- label: '账户设置',
- icon: <Settings className="mr-2 h-4 w-4" />,
- onClick: () => navigate('/admin/account-settings')
- },
- {
- type: 'separator',
- key: 'divider',
- },
- {
- key: 'logout',
- label: '退出登录',
- icon: <LogOut className="mr-2 h-4 w-4" />,
- onClick: () => handleLogout()
- }
- ];
- // 处理菜单点击
- const handleMenuClick = (item: MenuItem) => {
- if (item.path) {
- navigate(item.path);
- }
- if (item.onClick) {
- item.onClick();
- }
- };
- return {
- menuItems,
- userMenuItems,
- collapsed,
- setCollapsed,
- handleMenuClick,
- };
- };
|