import ExpandMore from "@mui/icons-material/ExpandMore"; import Inventory2Outlined from "@mui/icons-material/Inventory2Outlined"; import Logout from "@mui/icons-material/Logout"; import Menu from "@mui/icons-material/Menu"; import MenuOpen from "@mui/icons-material/MenuOpen"; import NotificationsNoneOutlined from "@mui/icons-material/NotificationsNoneOutlined"; import Person from "@mui/icons-material/Person"; import Refresh from "@mui/icons-material/Refresh"; import Search from "@mui/icons-material/Search"; import MuiMenu from "@mui/material/Menu"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { lazy, Suspense, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useAppScope } from "@/app/app-scope/AppScopeProvider.jsx"; import { useAuth } from "@/app/auth/AuthProvider.jsx"; import { PERMISSIONS } from "@/app/permissions"; import { listNotifications } from "@/features/notifications/api"; import { useAdminQuery } from "@/shared/hooks/useAdminQuery.js"; import { IconButton } from "@/shared/ui/IconButton.jsx"; import { useToast } from "@/shared/ui/ToastProvider.jsx"; const SearchDialog = lazy(() => import("@/features/search/components/SearchDialog.jsx").then((module) => ({ default: module.SearchDialog }))); export function Header({ activeLabel, isSidebarCollapsed, onRefresh, onToggleSidebar }) { const [searchOpen, setSearchOpen] = useState(false); const [searchMounted, setSearchMounted] = useState(false); const [userMenuAnchor, setUserMenuAnchor] = useState(null); const navigate = useNavigate(); const { can, logout, user } = useAuth(); const appScope = useAppScope(); const { showToast } = useToast(); const ToggleIcon = isSidebarCollapsed ? MenuOpen : Menu; const userMenuOpen = Boolean(userMenuAnchor); const canViewNotifications = can(PERMISSIONS.notificationView); const { data: notificationState } = useAdminQuery(() => listNotifications(), { enabled: canViewNotifications, initialData: { items: [], unread: 0 }, queryKey: ["notifications", "unread"], refetchInterval: 30000 }); const unread = notificationState?.unread || 0; useEffect(() => { if (searchOpen) { setSearchMounted(true); return undefined; } const timeout = window.setTimeout(() => setSearchMounted(false), 280); return () => window.clearTimeout(timeout); }, [searchOpen]); const openSearch = () => { setSearchMounted(true); setSearchOpen(true); }; const closeUserMenu = () => { setUserMenuAnchor(null); }; const handleLogout = async () => { closeUserMenu(); await logout(); navigate("/login", { replace: true }); }; const handleSearchSelect = (result) => { if (result?.target) { navigate(result.target); } }; const openNotifications = () => { navigate("/notifications"); }; const refresh = () => { onRefresh(); showToast("已刷新当前页面", "success"); }; return (
HYApp 管理平台 Admin Platform
{activeLabel}
appScope.setAppCode(event.target.value)} > {appScope.apps.length ? ( appScope.apps.map((app) => ( {app.appName || app.appCode} )) ) : ( {appScope.appCode} )} {canViewNotifications ? ( ) : null} 退出
{searchMounted ? ( setSearchOpen(false)} onSelect={handleSearchSelect} /> ) : null}
); }