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 NotificationsPage = lazy(() => import('../pages/NotificationsPage')) const MyTimetablePage = lazy(() => import('../pages/MyTimetablePage')) const ExamsPage = lazy(() => import('../pages/ExamsPage')) const StudentGradesPage = lazy(() => import('../pages/StudentGradesPage')) const StudentWarningsPage = lazy(() => import('../pages/StudentWarningsPage')) const StudentProfilePage = lazy(() => import('../pages/StudentProfilePage')) const StudentAttendancePage = lazy(() => import('../pages/StudentAttendancePage')) const CourseSelectionPage = lazy(() => import('../pages/CourseSelectionPage')) const StudentCurriculumPage = lazy(() => import('../pages/StudentCurriculumPage')) const AcademicOverviewPage = lazy(() => import('../pages/AcademicOverviewPage')) const FreeClassroomsPage = lazy(() => import('../pages/FreeClassroomsPage')) const StudentStatusChangesPage = lazy(() => import('../pages/StudentStatusChangesPage')) const OfficialDocumentsPage = lazy(() => import('../pages/OfficialDocumentsPage')) const GraduationAuditPage = lazy(() => import('../pages/GraduationAuditPage')) const TuitionPage = lazy(() => import('../pages/TuitionPage')) const AcademicCalendarPage = lazy(() => import('../pages/AcademicCalendarPage')) const OtherExamsPage = lazy(() => import('../pages/OtherExamsPage')) const MakeupExamsPage = lazy(() => import('../pages/MakeupExamsPage')) const EvaluationsPage = lazy(() => import('../pages/EvaluationsPage')) const AcademicPlanningPage = lazy(() => import('../pages/AcademicPlanningPage')) const PhysicalFitnessPage = lazy(() => import('../pages/PhysicalFitnessPage')) const DegreeAwardsPage = lazy(() => import('../pages/DegreeAwardsPage')) const GraduationClearancePage = lazy(() => import('../pages/GraduationClearancePage')) const StudentExperimentsPage = lazy(() => import('../pages/StudentExperimentsPage')) const StudentExperimentGradesPage = lazy(() => import('../pages/StudentExperimentGradesPage')) const CampusRegistrationsPage = lazy(() => import('../pages/CampusRegistrationsPage')) const StudentApprovalsPage = lazy(() => import('../pages/StudentApprovalsPage')) const TeacherRosterPage = lazy(() => import('../pages/TeacherRosterPage')) const TeacherAttendancePage = lazy(() => import('../pages/TeacherAttendancePage')) const AccountActivationPage = lazy(() => import('../pages/AccountActivationPage')) const OfficialDocumentVerifyPage = lazy(() => import('../pages/OfficialDocumentVerifyPage')) const ClassroomRepairReportPage = lazy(() => import('../pages/ClassroomRepairReportPage')) const VenueDisplayPage = lazy(() => import('../pages/VenueDisplayPage')) 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 ( ) }