cosmo/frontend/src/Router.tsx

101 lines
4.7 KiB
TypeScript
Raw Normal View History

2025-11-29 15:10:00 +00:00
/**
* Router configuration
*/
2026-07-21 12:09:51 +00:00
import { lazy, Suspense } from 'react';
2025-11-29 15:10:00 +00:00
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { auth } from './utils/auth';
2025-11-30 02:43:47 +00:00
import { ToastProvider } from './contexts/ToastContext';
2026-07-21 12:09:51 +00:00
const App = lazy(() => import('./App'));
const Login = lazy(() => import('./pages/Login').then((module) => ({ default: module.Login })));
const RocketSimulator = lazy(() => import('./pages/RocketSimulator').then((module) => ({ default: module.RocketSimulator })));
const AdminLayout = lazy(() => import('./pages/admin/AdminLayout').then((module) => ({ default: module.AdminLayout })));
const Dashboard = lazy(() => import('./pages/admin/Dashboard').then((module) => ({ default: module.Dashboard })));
const CelestialBodies = lazy(() => import('./pages/admin/CelestialBodies').then((module) => ({ default: module.CelestialBodies })));
const CelestialEvents = lazy(() => import('./pages/admin/CelestialEvents').then((module) => ({ default: module.CelestialEvents })));
const StarSystems = lazy(() => import('./pages/admin/StarSystems').then((module) => ({ default: module.StarSystems })));
const StaticData = lazy(() => import('./pages/admin/StaticData').then((module) => ({ default: module.StaticData })));
const Users = lazy(() => import('./pages/admin/Users').then((module) => ({ default: module.Users })));
const NASADownload = lazy(() => import('./pages/admin/NASADownload').then((module) => ({ default: module.NASADownload })));
const SystemSettings = lazy(() => import('./pages/admin/SystemSettings').then((module) => ({ default: module.SystemSettings })));
const Tasks = lazy(() => import('./pages/admin/Tasks').then((module) => ({ default: module.Tasks })));
const ScheduledJobs = lazy(() => import('./pages/admin/ScheduledJobs').then((module) => ({ default: module.ScheduledJobs })));
const UserProfile = lazy(() => import('./pages/admin/UserProfile').then((module) => ({ default: module.UserProfile })));
const ChangePassword = lazy(() => import('./pages/admin/ChangePassword').then((module) => ({ default: module.ChangePassword })));
const MyCelestialBodies = lazy(() => import('./pages/admin/MyCelestialBodies').then((module) => ({ default: module.MyCelestialBodies })));
const Rockets = lazy(() => import('./pages/admin/Rockets').then((module) => ({ default: module.Rockets })));
function RouteFallback() {
return (
<div className="fixed inset-0 flex items-center justify-center bg-black" role="status" aria-label="页面加载中">
<div className="h-10 w-10 animate-spin rounded-full border-2 border-white/20 border-t-green-500" />
</div>
);
}
2025-11-29 15:10:00 +00:00
// Protected Route wrapper
function ProtectedRoute({ children }: { children: React.ReactNode }) {
if (!auth.isLoggedIn()) {
return <Navigate to="/login" replace />;
}
return <>{children}</>;
}
export function Router() {
return (
2025-11-30 02:43:47 +00:00
<ToastProvider>
<BrowserRouter>
2026-07-21 12:09:51 +00:00
<Suspense fallback={<RouteFallback />}>
<Routes>
2025-11-30 02:43:47 +00:00
{/* Public routes */}
<Route path="/login" element={<Login />} />
2025-11-29 15:10:00 +00:00
2025-11-30 02:43:47 +00:00
{/* Main app (3D visualization) */}
<Route path="/" element={<App />} />
2026-07-21 12:09:51 +00:00
<Route path="/rocket-simulator" element={<RocketSimulator />} />
2025-11-29 15:10:00 +00:00
2025-12-26 01:21:15 +00:00
{/* User routes (protected) */}
<Route
path="/user"
element={
<ProtectedRoute>
<AdminLayout />
</ProtectedRoute>
}
>
<Route path="profile" element={<UserProfile />} />
<Route path="follow" element={<MyCelestialBodies />} />
</Route>
2025-11-30 02:43:47 +00:00
{/* Admin routes (protected) */}
<Route
path="/admin"
element={
<ProtectedRoute>
<AdminLayout />
</ProtectedRoute>
}
>
<Route path="dashboard" element={<Dashboard />} />
2025-12-26 01:21:15 +00:00
<Route path="change-password" element={<ChangePassword />} />
2025-11-30 02:43:47 +00:00
<Route path="celestial-bodies" element={<CelestialBodies />} />
2025-12-26 01:21:15 +00:00
<Route path="celestial-events" element={<CelestialEvents />} />
2025-12-06 09:06:39 +00:00
<Route path="star-systems" element={<StarSystems />} />
2025-11-30 02:43:47 +00:00
<Route path="static-data" element={<StaticData />} />
<Route path="users" element={<Users />} />
2025-11-30 05:25:41 +00:00
<Route path="nasa-data" element={<NASADownload />} />
<Route path="tasks" element={<Tasks />} />
2025-12-26 01:21:15 +00:00
<Route path="scheduled-jobs" element={<ScheduledJobs />} />
2025-11-30 05:25:41 +00:00
<Route path="settings" element={<SystemSettings />} />
2026-07-21 12:09:51 +00:00
<Route path="rockets" element={<Rockets />} />
2025-11-30 02:43:47 +00:00
</Route>
2025-11-29 15:10:00 +00:00
2025-11-30 02:43:47 +00:00
{/* Fallback */}
<Route path="*" element={<Navigate to="/" replace />} />
2026-07-21 12:09:51 +00:00
</Routes>
</Suspense>
2025-11-30 02:43:47 +00:00
</BrowserRouter>
</ToastProvider>
2025-11-29 15:10:00 +00:00
);
}