import { useState, useEffect, type ComponentType } from 'react'; export interface ModuleConfig { id: string; label: string; icon: ComponentType<{ size?: number; className?: string }>; component: ComponentType; } /** path 到模块 id 的映射 */ const PATH_MAP: Record = { '/vehicle': 'assets', '/assets': 'assets', '/mileage': 'mileage', }; function getInitialModule(modules: ModuleConfig[]): string { // 优先看 hash const hash = window.location.hash.slice(1); if (modules.some((m) => m.id === hash)) return hash; // 再看 pathname const pathModule = PATH_MAP[window.location.pathname]; if (pathModule && modules.some((m) => m.id === pathModule)) return pathModule; // 默认第一个 return modules[0]?.id ?? ''; } function getHashModule(modules: ModuleConfig[]): string { const hash = window.location.hash.slice(1); return modules.some((m) => m.id === hash) ? hash : ''; } export function Shell({ modules }: { modules: ModuleConfig[] }) { const [activeModule, setActiveModule] = useState(() => getInitialModule(modules)); useEffect(() => { const onHashChange = () => { const h = getHashModule(modules); if (h) setActiveModule(h); }; window.addEventListener('hashchange', onHashChange); return () => window.removeEventListener('hashchange', onHashChange); }, [modules]); useEffect(() => { // 同步 hash 到当前模块 if (window.location.hash.slice(1) !== activeModule) { window.location.hash = activeModule; } }, [activeModule]); const switchModule = (id: string) => { window.location.hash = id; }; const ActiveComponent = modules.find((m) => m.id === activeModule)?.component ?? modules[0]?.component; return (
{/* Web 侧边栏 (md 及以上) */} {/* 内容区 */}
{ActiveComponent && }
{/* 移动端底部导航 (md 以下) */}
); }