import { Suspense, lazy } from 'react' import { BrowserRouter, Navigate, Route, Routes, useLocation } from 'react-router-dom' import { ConfigProvider, App as AntdApp, Spin } from 'antd' import zhCN from 'antd/locale/zh_CN' import { AuthProvider } from './store/auth' import { useAuth } from './store/authContext' import MainLayout from './layouts/MainLayout' import Login from './pages/Login' import type { ReactNode } from 'react' // 路由级懒加载:把原先 1.6MB 的首屏单包按页面拆分。 // Login 与 MainLayout 保持同步加载——它们是未登录用户和登录后首帧的必经路径, // 懒加载只会凭空多一次往返。 const Dashboard = lazy(() => import('./pages/Dashboard')) const OpenApiDocs = lazy(() => import('./pages/OpenApiDocs')) const ApiDebugger = lazy(() => import('./pages/ApiDebugger')) const Delivery = lazy(() => import('./pages/Delivery')) const MerchantCenter = lazy(() => import('./pages/MerchantCenter')) const MerchantRecharge = lazy(() => import('./pages/MerchantRecharge')) const AlertSettings = lazy(() => import('./pages/AlertSettings')) const PlatformMerchants = lazy(() => import('./pages/PlatformMerchants')) const PlatformOrders = lazy(() => import('./pages/PlatformOrders')) const PlatformProducts = lazy(() => import('./pages/PlatformProducts')) const PlatformUsers = lazy(() => import('./pages/PlatformUsers')) const PlatformRock = lazy(() => import('./pages/PlatformRock')) // RouteFallback 是懒加载页面与权限校验的统一占位,避免切换时白屏。 function RouteFallback() { return
} function PrivateRoute({ children }: { children: ReactNode }) { const { token } = useAuth() if (!token) return return <>{children} } function AdminRoute({ children }: { children: ReactNode }) { const { isAdmin } = useAuth() if (!isAdmin) return return <>{children} } const tabPermissions: Record = { products: 'products:manage', orders: 'orders:manage', wallet: 'wallet:ledger', api: 'api:manage', callbacks: 'callbacks:manage', members: 'members:manage', } function MerchantPermissionRoute({ permission, children }: { permission?: string; children: ReactNode }) { const { isAdmin, merchantLoading, merchantPermissions } = useAuth() if (isAdmin || !permission) return <>{children} if (merchantLoading) { return } return merchantPermissions.includes(permission) ? <>{children} : } function MerchantCenterRoute() { const location = useLocation() const requestedTab = new URLSearchParams(location.search).get('tab') || 'products' const tab = requestedTab in tabPermissions ? requestedTab : 'products' return ( ) } function AppRoutes() { return ( } /> } /> } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ) } export default function App() { return ( }> ) }