import { Component, lazy, Suspense, useEffect, useState, type ErrorInfo, type ReactNode } from 'react' import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom' import { Toaster } from 'sonner' import { Button } from '@/components/ui/button' import { BrandProvider, useBrand } from '@/brand/BrandContext' import { verifyToken } from '@/api/auth' import { getToken } from '@/api/client' const HomePage = lazy(() => import('@/viewer/pages/HomePage')) const WatchPage = lazy(() => import('@/viewer/pages/WatchPage')) const AdminLayout = lazy(() => import('@/admin/AdminLayout')) const LoginPage = lazy(() => import('@/admin/LoginPage')) const Dashboard = lazy(() => import('@/admin/pages/Dashboard')) const LiveBoard = lazy(() => import('@/admin/pages/LiveBoard')) const StreamList = lazy(() => import('@/admin/pages/StreamList')) const StreamForm = lazy(() => import('@/admin/pages/StreamForm')) const ReplayEditor = lazy(() => import('@/admin/pages/ReplayEditor')) const NodeManager = lazy(() => import('@/admin/pages/NodeManager')) const SettingsPage = lazy(() => import('@/admin/pages/Settings')) const SwaggerPage = lazy(() => import('@/admin/pages/SwaggerPage')) class PageErrorBoundary extends Component<{ children: ReactNode }, { failed: boolean }> { state = { failed: false } static getDerivedStateFromError() { return { failed: true } } componentDidCatch(error: Error, info: ErrorInfo) { console.error('Page render failed', error, info) } render() { if (this.state.failed) { return (

页面加载失败

页面遇到异常,请重新加载后再试。

) } return this.props.children } } function AdminGuard({ children }: { children: ReactNode }) { const [authed, setAuthed] = useState(null) useEffect(() => { const token = getToken() if (!token) { setAuthed(false) return } verifyToken().then(setAuthed) }, []) if (authed === null) return null if (!authed) return return <>{children} } function RouteShell() { const { brand } = useBrand() useEffect(() => { document.title = brand.brand_name }, [brand.brand_name]) return (
} > } /> } /> } > } /> } /> } /> } /> } /> } /> } /> } /> } />
) } export default function App() { return ( ) }