import { lazy, Suspense, useEffect, useMemo, useState } from "react"; import { Shell } from "./components/Shell"; import AuthProvider from "./auth/AuthProvider"; import { useAuth } from "./auth/useAuth"; import UnauthorizedPage from "./auth/UnauthorizedPage"; import { canAccessEnergy } from "./shared/auth/roles"; import { LoadingState, SkeletonBlock, SurfaceCard } from "./components/ui/surface"; import { buildModules } from "./app/modules"; import { normalizeBrowserPath, readBrowserRoute, } from "./app/routing"; const EleImportPage = lazy(() => import("./modules/ele/EleImportPage")); const FeedbackAdminPage = lazy(() => import("./modules/admin/FeedbackAdminPage")); normalizeBrowserPath(); function AuthGate() { const { isLoading, isAuthenticated, error, user } = useAuth(); const [route, setRoute] = useState(readBrowserRoute); const { routeKey, pathSet } = route; // 监听 hashchange / popstate,让 a href="#/..." 跳转与浏览器前进后退能即时生效 useEffect(() => { const update = () => { setRoute(readBrowserRoute()); }; window.addEventListener("hashchange", update); window.addEventListener("popstate", update); return () => { window.removeEventListener("hashchange", update); window.removeEventListener("popstate", update); }; }, []); useEffect(() => { document.title = pathSet === "energy" ? "羚牛氢能-能源BI" : "羚牛氢能-资产BI"; }, [pathSet]); const modules = useMemo( () => buildModules(pathSet, user?.roles), [pathSet, user?.roles], ); if (isLoading) { return (
LN BI ACCESS
正在进入羚牛氢能 BI
校验登录态、权限与本地开发环境配置
{[0, 1, 2, 3].map(item => )}
); } if (!isAuthenticated) { return ; } // 隐藏后端管理页:通过路径或 hash 直接访问,主导航不出现 if (routeKey === "ele/import") { return ( }> ); } if (routeKey === "admin/feedback") { return ( }> ); } // /energy 整组按能源权限控制 if (pathSet === "energy" && !canAccessEnergy(user?.roles)) { return ; } // key={pathSet} 让两套底栏切换时 Shell 内部 state 重置,避免残留旧 activeModule return ; } export default function App() { return ( ); }