import { lazy, Suspense, useEffect } from 'react' import { App as AntdApp, ConfigProvider, Skeleton } from 'antd' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { BrowserRouter, Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom' import zhCN from 'antd/locale/zh_CN' import { useAuthStore } from '../stores/auth' const LoginPage = lazy(() => import('../pages/LoginPage')) const DashboardPage = lazy(() => import('../pages/DashboardPage')) const AccountPage = lazy(() => import('../pages/AccountPage')) const UsersPage = lazy(() => import('../pages/UsersPage')) const SsoCallbackPage = lazy(() => import('../pages/SsoCallbackPage')) const SsoBindPage = lazy(() => import('../pages/SsoBindPage')) const AppShell = lazy(() => import('../layout/AppShell')) const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false, }, }, }) function ProtectedRoute() { const token = useAuthStore((state) => state.token) const location = useLocation() if (!token) return return } function SessionExpiryBridge() { const navigate = useNavigate() useEffect(() => { const onExpired = () => navigate(`/login?redirect=${encodeURIComponent(location.pathname + location.search + location.hash)}`, { replace: true }) window.addEventListener('mingxu-session-expired', onExpired) return () => window.removeEventListener('mingxu-session-expired', onExpired) }, [navigate]) return null } function AppRoutes() { return ( }> } /> } /> } /> }> } /> } /> } /> } /> } /> ) } export default function App() { return ( ) }