first commit
This commit is contained in:
151
src/App.tsx
Normal file
151
src/App.tsx
Normal file
@@ -0,0 +1,151 @@
|
||||
import React, { useEffect, useState } from 'react'
|
||||
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'
|
||||
import { useAppStore } from './store'
|
||||
import { ToastProvider } from './contexts/ToastContext'
|
||||
import AuthService from './services/authService'
|
||||
|
||||
// 懒加载页面组件
|
||||
const Login = React.lazy(() => import('./pages/Login'))
|
||||
const Lottery = React.lazy(() => import('./pages/Lottery'))
|
||||
const Home = React.lazy(() => import('./pages/Home'))
|
||||
const Admin = React.lazy(() => import('./pages/Admin'))
|
||||
const Records = React.lazy(() => import('./pages/Records'))
|
||||
const ClearRecords = React.lazy(() => import('./pages/ClearRecords'))
|
||||
const ConfettiDemo = React.lazy(() => import('./pages/ConfettiDemo'))
|
||||
const CrudTest = React.lazy(() => import('./pages/CrudTest'))
|
||||
const NetworkTest = React.lazy(() => import('./pages/NetworkTest'))
|
||||
const SimpleNetworkTest = React.lazy(() => import('./pages/SimpleNetworkTest'))
|
||||
|
||||
function App() {
|
||||
const { isAuthenticated, initializeApp, checkAuthStatus } = useAppStore()
|
||||
const [isInitializing, setIsInitializing] = useState(true)
|
||||
|
||||
useEffect(() => {
|
||||
const initApp = async () => {
|
||||
try {
|
||||
// 首先检查认证状态
|
||||
checkAuthStatus()
|
||||
|
||||
// 然后初始化应用
|
||||
await initializeApp()
|
||||
} catch (error) {
|
||||
console.error('应用初始化失败:', error)
|
||||
} finally {
|
||||
setIsInitializing(false)
|
||||
}
|
||||
}
|
||||
|
||||
initApp()
|
||||
}, [initializeApp, checkAuthStatus])
|
||||
|
||||
// 监听页面可见性变化,恢复时检查认证状态
|
||||
useEffect(() => {
|
||||
const handleVisibilityChange = () => {
|
||||
if (!document.hidden) {
|
||||
checkAuthStatus()
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('visibilitychange', handleVisibilityChange)
|
||||
|
||||
return () => {
|
||||
document.removeEventListener('visibilitychange', handleVisibilityChange)
|
||||
}
|
||||
}, [checkAuthStatus])
|
||||
|
||||
// 应用卸载时清理资源
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
const { cleanup } = useAppStore.getState()
|
||||
cleanup()
|
||||
}
|
||||
}, [])
|
||||
|
||||
// 应用初始化中的加载状态
|
||||
if (isInitializing) {
|
||||
return (
|
||||
<div className="min-h-screen bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900 flex items-center justify-center">
|
||||
<div className="text-center">
|
||||
<div className="w-16 h-16 border-4 border-white/30 border-t-white rounded-full animate-spin mx-auto mb-4"></div>
|
||||
<p className="text-white text-lg">正在初始化应用...</p>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<ToastProvider>
|
||||
<Router>
|
||||
<div className="min-h-screen bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900">
|
||||
|
||||
|
||||
{/* 背景装饰 */}
|
||||
<div className="fixed inset-0 overflow-hidden pointer-events-none">
|
||||
<div className="absolute top-1/4 left-1/4 w-96 h-96 bg-purple-500/10 rounded-full blur-3xl" />
|
||||
<div className="absolute top-3/4 right-1/4 w-96 h-96 bg-blue-500/10 rounded-full blur-3xl" />
|
||||
<div className="absolute bottom-1/4 left-1/2 w-96 h-96 bg-indigo-500/10 rounded-full blur-3xl" />
|
||||
</div>
|
||||
|
||||
{/* 路由配置 */}
|
||||
<React.Suspense fallback={
|
||||
<div className="min-h-screen flex items-center justify-center">
|
||||
<div className="text-center">
|
||||
<div className="w-16 h-16 border-4 border-white/30 border-t-white rounded-full animate-spin mx-auto mb-4"></div>
|
||||
<p className="text-white text-lg">正在加载页面...</p>
|
||||
</div>
|
||||
</div>
|
||||
}>
|
||||
<Routes>
|
||||
<Route
|
||||
path="/login"
|
||||
element={isAuthenticated ? <Navigate to="/" replace /> : <Login />}
|
||||
/>
|
||||
<Route
|
||||
path="/"
|
||||
element={isAuthenticated ? <Lottery /> : <Navigate to="/login" replace />}
|
||||
/>
|
||||
<Route
|
||||
path="/home"
|
||||
element={isAuthenticated ? <Home /> : <Navigate to="/login" replace />}
|
||||
/>
|
||||
<Route
|
||||
path="/admin"
|
||||
element={isAuthenticated ? <Admin /> : <Navigate to="/login" replace />}
|
||||
/>
|
||||
<Route
|
||||
path="/records"
|
||||
element={isAuthenticated ? <Records /> : <Navigate to="/login" replace />}
|
||||
/>
|
||||
<Route
|
||||
path="/clear-records"
|
||||
element={isAuthenticated ? <ClearRecords /> : <Navigate to="/login" replace />}
|
||||
/>
|
||||
<Route
|
||||
path="/confetti-demo"
|
||||
element={isAuthenticated ? <ConfettiDemo /> : <Navigate to="/login" replace />}
|
||||
/>
|
||||
<Route
|
||||
path="/crud-test"
|
||||
element={<CrudTest />}
|
||||
/>
|
||||
<Route
|
||||
path="/network-test"
|
||||
element={<NetworkTest />}
|
||||
/>
|
||||
<Route
|
||||
path="/simple-test"
|
||||
element={<SimpleNetworkTest />}
|
||||
/>
|
||||
<Route
|
||||
path="*"
|
||||
element={<Navigate to={isAuthenticated ? "/" : "/login"} replace />}
|
||||
/>
|
||||
</Routes>
|
||||
</React.Suspense>
|
||||
</div>
|
||||
</Router>
|
||||
</ToastProvider>
|
||||
)
|
||||
}
|
||||
|
||||
export default App
|
||||
Reference in New Issue
Block a user