import React, { useState, useEffect } from 'react'; import { Outlet, useNavigate, useLocation } from 'react-router-dom'; import { Layout, Menu, Button, Space, Select, Avatar, Card, Tag } from 'antd'; import { DashboardOutlined, ExperimentOutlined, VideoCameraOutlined, BellOutlined, UserOutlined, LogoutOutlined, AppstoreOutlined, SettingOutlined, MenuUnfoldOutlined, MenuFoldOutlined, CompressOutlined, ExpandOutlined } from '@ant-design/icons'; import { useTranslation } from 'react-i18next'; import logo from '../assets/logo.png'; import { useSelector } from 'react-redux'; import { RootState, useAppDispatch } from '../store'; import { logout } from '../store/userSlice'; import { setCurrentStation, clearStation } from '../store/stationSlice'; import { getMenuList } from '../api/mune'; import { getStationByUserId } from '../api/stationManage'; import LanguageSwitcher from './LanguageSwitcher'; import envConfig from '../../env'; const { Header, Sider, Content } = Layout; export default function AppLayout() { const { t } = useTranslation(); const [collapsed, setCollapsed] = useState(false); const [time, setTime] = useState(new Date().toLocaleString()); const [menuList, setMenuList] = useState([]); const [stationList, setStationList] = useState([]); const [isFullScreen, setIsFullScreen] = useState(false); const navigate = useNavigate(); const location = useLocation(); const dispatch = useAppDispatch(); const { userInfo } = useSelector((state: RootState) => state.user); const { currentStation, stationId } = useSelector((state: RootState) => state.station); const getStationData = () => { getStationByUserId().then(res => { if (res.code === 200) { const list = res.data || []; setStationList(list); if (!currentStation && list.length > 0) { dispatch(setCurrentStation(list[0])); } } }); }; const toggleFullScreen = () => { if (!document.fullscreenElement) { document.documentElement.requestFullscreen(); setIsFullScreen(true); } else { if (document.exitFullscreen) { document.exitFullscreen(); setIsFullScreen(false); } } }; const handleStationChange = (id: number) => { const station = stationList.find(s => s.id === id); if (station) { dispatch(setCurrentStation(station)); } }; const getIcon = (path) => { if (path.includes('overview')) return ; if (path.includes('device')) return ; if (path.includes('monitor')) return ; if (path.includes('alert')) return ; if (path.includes('user')) return ; if (path.includes('system')) return ; if (path.includes('menu')) return ; return ; }; const buildMenuTree = (list: any[]) => { const map = new Map(); const tree: any[] = []; list.forEach(item => { map.set(item.menuId, { key: item.path, label: item.menuName, icon: getIcon(item.path), children: [], }); }); list.forEach(item => { const node = map.get(item.menuId); if (item.parentId === 0) { tree.push(node); } else { const parent = map.get(item.parentId); if (parent) { parent.children.push(node); } } }); const sortMenu = (menus: any[]) => { menus.sort((a, b) => a.orderNum - b.orderNum); menus.forEach(menu => { if (menu.children.length) { sortMenu(menu.children); } else { delete menu.children; } }); }; sortMenu(tree); return tree; }; const renderMenuItems = (treeList, isChild = false) => { return treeList.map(item => { const hasChild = item.children && item.children.length > 0; const key = item.path || `/menu/${item.menuId}`; return { key, icon: isChild ? null : getIcon(item.path), label: item.menuName, ...(hasChild && { children: renderMenuItems(item.children, true), }), }; }); }; const handleLogout = async () => { await dispatch(logout()); dispatch(clearStation()); navigate('/login', { replace: true }); }; const getMenu = () => { getMenuList({ pageNum: 1, pageSize: 10000, }).then(res => { if (res.code === 200) { const menus = buildMenuTree(res.rows || []); setMenuList(menus); } }); }; useEffect(() => { const timer = setInterval(() => setTime(new Date().toLocaleString()), 1000); getMenu(); getStationData(); return () => clearInterval(timer); }, [userInfo]); useEffect(() => { const fullscreenChange = () => { setIsFullScreen(!!document.fullscreenElement); }; document.addEventListener('fullscreenchange', fullscreenChange); return () => document.removeEventListener('fullscreenchange', fullscreenChange); }, []); return (