import type { ReactNode } from 'react';
import { Menu } from '@arco-design/web-react';
import {
IconApps,
IconDashboard,
IconFile,
IconSettings,
IconUser,
IconVideoCamera,
} from '@arco-design/web-react/icon';
import type { AdminProfile } from '../api/types';
import { hasPermissions } from '../utils/permission';
export type MenuConfig = {
key: string;
label: string;
icon?: ReactNode;
requiredPermissions?: string[];
children?: MenuConfig[];
};
export const SYSTEM_MENU_KEY = '/system';
export const menuItems: MenuConfig[] = [
{ key: '/dashboard', label: '工作台', icon: },
{ key: '/dramas', label: '短剧管理', icon: , requiredPermissions: ['drama:read'] },
{ key: '/data', label: '数据管理', icon: , requiredPermissions: ['data:read'] },
{ key: '/users', label: '用户管理', icon: , requiredPermissions: ['user:read'] },
{
key: SYSTEM_MENU_KEY,
label: '系统管理',
icon: ,
children: [
{ key: '/roles', label: '角色管理', icon: , requiredPermissions: ['role:read'] },
{ key: '/personnel', label: '人员管理', icon: , requiredPermissions: ['admin-user:read'] },
{ key: '/profile', label: '个人中心', icon: },
{ key: '/logs', label: '日志管理', icon: , requiredPermissions: ['log:read'] },
],
},
];
export function filterMenuItems(items: MenuConfig[], profile: AdminProfile | null): MenuConfig[] {
return items
.map((item) => {
if (item.children) {
const children = filterMenuItems(item.children, profile);
return children.length ? { ...item, children } : null;
}
return hasPermissions(profile, item.requiredPermissions) ? item : null;
})
.filter((item): item is MenuConfig => Boolean(item));
}
export function findCurrentMenu(pathname: string) {
for (const item of menuItems) {
if (item.children) {
const child = item.children.find((childItem) => pathname.startsWith(childItem.key));
if (child) {
return { item: child, parent: item };
}
}
if (pathname.startsWith(item.key)) {
return { item };
}
}
return undefined;
}
export function renderMenuItem(item: MenuConfig) {
if (item.children) {
return (
{item.icon}{item.label}}>
{item.children.map((child) => renderMenuItem(child))}
);
}
return {item.icon}{item.label};
}