{"ast":null,"code":"import React,{useState,useEffect}from'react';import{Layout,Menu,Avatar,Dropdown,Badge,Button,Space}from'antd';import{Outlet,useNavigate,useLocation}from'react-router-dom';import{DashboardOutlined,ProjectOutlined,UserOutlined,TeamOutlined,GlobalOutlined,NotificationOutlined,SettingOutlined,LogoutOutlined,HistoryOutlined,UserSwitchOutlined,FileSearchOutlined,BookOutlined,BankOutlined,ExperimentOutlined}from'@ant-design/icons';import{useAuth}from'../contexts/AuthContext';import{notificationsAPI}from'../services/api';import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";const{Header,Sider,Content}=Layout;const MainLayout=()=>{const[collapsed,setCollapsed]=useState(false);const[unreadCount,setUnreadCount]=useState(0);const{user,logout,isAdmin,isInvestmentManager}=useAuth();const navigate=useNavigate();const location=useLocation();useEffect(()=>{fetchUnreadCount();},[]);const fetchUnreadCount=async()=>{try{var _response$data$pagina;const response=await notificationsAPI.getAll({limit:1});setUnreadCount(((_response$data$pagina=response.data.pagination)===null||_response$data$pagina===void 0?void 0:_response$data$pagina.unread)||0);}catch(error){console.error('获取未读通知失败:',error);}};const menuItems=[{key:'/',icon:/*#__PURE__*/_jsx(DashboardOutlined,{}),label:'仪表板'},{key:'/candidate-projects',icon:/*#__PURE__*/_jsx(FileSearchOutlined,{}),label:'备选项目库'},{key:'/projects',icon:/*#__PURE__*/_jsx(ProjectOutlined,{}),label:'项目管理'},{key:'/incubation',icon:/*#__PURE__*/_jsx(ExperimentOutlined,{}),label:'机构孵化管理'},{key:'/investors',icon:/*#__PURE__*/_jsx(TeamOutlined,{}),label:'投资者管理'},{key:'/knowledge',icon:/*#__PURE__*/_jsx(BookOutlined,{}),label:'知识管理'},{key:'/news',icon:/*#__PURE__*/_jsx(GlobalOutlined,{}),label:'行业舆情'}];if(isAdmin()){menuItems.push({key:'/users',icon:/*#__PURE__*/_jsx(UserSwitchOutlined,{}),label:'用户管理'},{key:'/activity',icon:/*#__PURE__*/_jsx(HistoryOutlined,{}),label:'操作日志'});}menuItems.push({key:'/notifications',icon:/*#__PURE__*/_jsx(Badge,{count:unreadCount,size:\"small\",children:/*#__PURE__*/_jsx(NotificationOutlined,{})}),label:'通知中心'});const userMenu=[{key:'profile',icon:/*#__PURE__*/_jsx(UserOutlined,{}),label:'个人信息',onClick:()=>navigate('/profile')},{key:'settings',icon:/*#__PURE__*/_jsx(SettingOutlined,{}),label:'设置'},{type:'divider'},{key:'logout',icon:/*#__PURE__*/_jsx(LogoutOutlined,{}),label:'退出登录',onClick:()=>{logout();navigate('/login');}}];return/*#__PURE__*/_jsxs(Layout,{style:{minHeight:'100vh'},children:[/*#__PURE__*/_jsxs(Sider,{collapsible:true,collapsed:collapsed,onCollapse:setCollapsed,children:[/*#__PURE__*/_jsx(\"div\",{style:{height:64,display:'flex',alignItems:'center',justifyContent:'center',color:'#fff',fontSize:18,fontWeight:'bold'},children:collapsed?'SG':'松观投资公司'}),/*#__PURE__*/_jsx(Menu,{theme:\"dark\",selectedKeys:[location.pathname],mode:\"inline\",items:menuItems,onClick:_ref=>{let{key}=_ref;return navigate(key);},className:\"sidebar-menu\"})]}),/*#__PURE__*/_jsxs(Layout,{children:[/*#__PURE__*/_jsxs(Header,{className:\"layout-header\",children:[/*#__PURE__*/_jsx(\"div\",{}),/*#__PURE__*/_jsx(Space,{children:/*#__PURE__*/_jsx(Dropdown,{menu:{items:userMenu},placement:\"bottomRight\",children:/*#__PURE__*/_jsxs(Space,{style:{cursor:'pointer'},children:[/*#__PURE__*/_jsx(Avatar,{icon:/*#__PURE__*/_jsx(UserOutlined,{})}),/*#__PURE__*/_jsx(\"span\",{children:(user===null||user===void 0?void 0:user.fullName)||(user===null||user===void 0?void 0:user.username)})]})})})]}),/*#__PURE__*/_jsx(Content,{style:{margin:24,background:'#f0f2f5'},children:/*#__PURE__*/_jsx(\"div\",{className:\"layout-content\",children:/*#__PURE__*/_jsx(Outlet,{})})})]})]});};export default MainLayout;","map":{"version":3,"names":["React","useState","useEffect","Layout","Menu","Avatar","Dropdown","Badge","Button","Space","Outlet","useNavigate","useLocation","DashboardOutlined","ProjectOutlined","UserOutlined","TeamOutlined","GlobalOutlined","NotificationOutlined","SettingOutlined","LogoutOutlined","HistoryOutlined","UserSwitchOutlined","FileSearchOutlined","BookOutlined","BankOutlined","ExperimentOutlined","useAuth","notificationsAPI","jsx","_jsx","jsxs","_jsxs","Header","Sider","Content","MainLayout","collapsed","setCollapsed","unreadCount","setUnreadCount","user","logout","isAdmin","isInvestmentManager","navigate","location","fetchUnreadCount","_response$data$pagina","response","getAll","limit","data","pagination","unread","error","console","menuItems","key","icon","label","push","count","size","children","userMenu","onClick","type","style","minHeight","collapsible","onCollapse","height","display","alignItems","justifyContent","color","fontSize","fontWeight","theme","selectedKeys","pathname","mode","items","_ref","className","menu","placement","cursor","fullName","username","margin","background"],"sources":["/Users/nili/Documents/trae_projects/client/src/components/Layout.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { Layout, Menu, Avatar, Dropdown, Badge, Button, Space } from 'antd';\nimport { Outlet, useNavigate, useLocation } from 'react-router-dom';\nimport {\n  DashboardOutlined,\n  ProjectOutlined,\n  UserOutlined,\n  TeamOutlined,\n  GlobalOutlined,\n  NotificationOutlined,\n  SettingOutlined,\n  LogoutOutlined,\n  HistoryOutlined,\n  UserSwitchOutlined,\n  FileSearchOutlined,\n  BookOutlined,\n  BankOutlined,\n  ExperimentOutlined\n} from '@ant-design/icons';\nimport { useAuth } from '../contexts/AuthContext';\nimport { notificationsAPI } from '../services/api';\n\nconst { Header, Sider, Content } = Layout;\n\nconst MainLayout = () => {\n  const [collapsed, setCollapsed] = useState(false);\n  const [unreadCount, setUnreadCount] = useState(0);\n  const { user, logout, isAdmin, isInvestmentManager } = useAuth();\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  useEffect(() => {\n    fetchUnreadCount();\n  }, []);\n\n  const fetchUnreadCount = async () => {\n    try {\n      const response = await notificationsAPI.getAll({ limit: 1 });\n      setUnreadCount(response.data.pagination?.unread || 0);\n    } catch (error) {\n      console.error('获取未读通知失败:', error);\n    }\n  };\n\n  const menuItems = [\n    {\n      key: '/',\n      icon: <DashboardOutlined />,\n      label: '仪表板',\n    },\n    {\n      key: '/candidate-projects',\n      icon: <FileSearchOutlined />,\n      label: '备选项目库',\n    },\n    {\n      key: '/projects',\n      icon: <ProjectOutlined />,\n      label: '项目管理',\n    },\n    {\n      key: '/incubation',\n      icon: <ExperimentOutlined />,\n      label: '机构孵化管理',\n    },\n    {\n      key: '/investors',\n      icon: <TeamOutlined />,\n      label: '投资者管理',\n    },\n    {\n      key: '/knowledge',\n      icon: <BookOutlined />,\n      label: '知识管理',\n    },\n    {\n      key: '/news',\n      icon: <GlobalOutlined />,\n      label: '行业舆情',\n    },\n  ];\n\n  if (isAdmin()) {\n    menuItems.push(\n      {\n        key: '/users',\n        icon: <UserSwitchOutlined />,\n        label: '用户管理',\n      },\n      {\n        key: '/activity',\n        icon: <HistoryOutlined />,\n        label: '操作日志',\n      }\n    );\n  }\n\n  menuItems.push(\n    {\n      key: '/notifications',\n      icon: (\n        <Badge count={unreadCount} size=\"small\">\n          <NotificationOutlined />\n        </Badge>\n      ),\n      label: '通知中心',\n    }\n  );\n\n  const userMenu = [\n    {\n      key: 'profile',\n      icon: <UserOutlined />,\n      label: '个人信息',\n      onClick: () => navigate('/profile'),\n    },\n    {\n      key: 'settings',\n      icon: <SettingOutlined />,\n      label: '设置',\n    },\n    {\n      type: 'divider',\n    },\n    {\n      key: 'logout',\n      icon: <LogoutOutlined />,\n      label: '退出登录',\n      onClick: () => {\n        logout();\n        navigate('/login');\n      },\n    },\n  ];\n\n  return (\n    <Layout style={{ minHeight: '100vh' }}>\n      <Sider collapsible collapsed={collapsed} onCollapse={setCollapsed}>\n        <div style={{ height: 64, display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#fff', fontSize: 18, fontWeight: 'bold' }}>\n          {collapsed ? 'SG' : '松观投资公司'}\n        </div>\n        <Menu\n          theme=\"dark\"\n          selectedKeys={[location.pathname]}\n          mode=\"inline\"\n          items={menuItems}\n          onClick={({ key }) => navigate(key)}\n          className=\"sidebar-menu\"\n        />\n      </Sider>\n      <Layout>\n        <Header className=\"layout-header\">\n          <div></div>\n          <Space>\n            <Dropdown menu={{ items: userMenu }} placement=\"bottomRight\">\n              <Space style={{ cursor: 'pointer' }}>\n              <Avatar icon={<UserOutlined />} />\n              <span>{user?.fullName || user?.username}</span>\n              </Space>\n            </Dropdown>\n          </Space>\n        </Header>\n        <Content style={{ margin: 24, background: '#f0f2f5' }}>\n          <div className=\"layout-content\">\n            <Outlet />\n          </div>\n        </Content>\n      </Layout>\n    </Layout>\n  );\n};\n\nexport default MainLayout;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}