'use client'; import { useEffect } from 'react'; import { usePathname, useRouter } from 'next/navigation'; import { Inbox, Package, FolderKanban, Tag, Users, LayoutGrid, Lightbulb, Clock, Shield, Settings, Sparkles, TriangleAlert, MessageCircleQuestionMark, Activity } from 'lucide-react'; import { useHasPermission } from '@/components/auth/Guard'; import { useXiaobaoWarningRisks } from '@/hooks/useXiaobaoWarningRisks'; import { useWorkspaceWorkItems } from '@/hooks/useWorkspaceWorkItems'; import { useAuthStore } from '@/stores/useAuthStore'; import { useMemberStore } from '@/stores/useMemberStore'; import { useXiaobaoRiskStore } from '@/stores/useXiaobaoRiskStore'; import { useXiaobaoWarningReadStore } from '@/stores/useXiaobaoWarningReadStore'; import { getWorkspacePendingCount } from '@/lib/workspace-engine'; import { buildXiaobaoRiskInsightPendingKey } from '@/lib/xiaobao-risk-suggestion'; import { filterXiaobaoRiskWarnings, getXiaobaoWarningRiskCount, getXiaobaoWarningUnreadUpdateCount, } from '@/lib/xiaobao-warning-view'; type NavItemConfig = { label: string; path: string; icon: any; permission: string | null; badge?: 'xiaobao-risk' | 'workspace-pending'; }; const NAV_GROUPS = [ { label: '工作区', items: [ { label: 'AI 助手', path: '/wenfan-xiaobao', icon: MessageCircleQuestionMark, permission: null as string | null }, { label: '智能预警', path: '/xiaobao-warning', icon: TriangleAlert, permission: 'xiaobao.warning:view', badge: 'xiaobao-risk' as const }, { label: '与我相关', path: '/workspace', icon: Inbox, permission: null as string | null, badge: 'workspace-pending' as const }, { label: '产品', path: '/products', icon: Package, permission: 'product:view' }, { label: '项目', path: '/projects', icon: FolderKanban, permission: 'project:view' }, { label: '版本', path: '/versions', icon: Tag, permission: 'version:view' }, { label: '需求池', path: '/requirements', icon: Lightbulb, permission: 'requirement:view' }, { label: '加班记录', path: '/overtime', icon: Clock, permission: 'overtime:view' }, ], }, { label: '管理', items: [ { label: '成员', path: '/admin/members', icon: Users, permission: 'member:view' }, { label: '角色', path: '/admin/roles', icon: Shield, permission: 'role:view' }, { label: '运维', path: '/admin/ops', icon: Activity, permission: 'ops:view' }, { label: 'AI 配置', path: '/admin/ai-config', icon: Sparkles, permission: '*' }, ], }, ]; export function Sidebar() { const pathname = usePathname(); const router = useRouter(); const { workItems } = useWorkspaceWorkItems(); const workspacePendingCount = getWorkspacePendingCount(workItems); const isActive = (path: string) => pathname === path || (path !== '/' && pathname.startsWith(path)); return ( ); } function UserBlock() { const router = useRouter(); const user = useAuthStore((s) => s.user); const role = useMemberStore((s) => s.roles.find((r) => r.id === user?.roleId)); if (!user) { return (
未登录
{user.name}
{role?.name ?? '-'}
{label}