import React, { useState, useEffect, Suspense } from 'react'; import { Routes, Route, Navigate } from 'react-router-dom'; import type { User } from '@/types'; import { AuthContext, AuthContextType } from '@/contexts/AuthContext'; import { authAPI } from '@/api'; // Layouts(保留为即时加载,构成应用外壳) import FrontLayout from '@/components/layout/FrontLayout'; import AdminLayout from '@/components/layout/AdminLayout'; // 路由级代码分割:每个页面独立打包成 chunk,首屏只加载外壳与公共依赖, // 访问具体页面时才按需加载对应 chunk,显著加快首屏渲染与路由切换速度。 // #963: lazy() + .catch() fallback so element never undefined const safeLazy = (loader: () => Promise<{ default: React.ComponentType }>) => React.lazy(() => loader().catch((err) => { console.error('[qihu-lazy-load-failed]', err); return { default: () => ( React.createElement('div', { style: { padding: 20, color: '#dc2626' } }, 'Chunk load failed: ' + String((err as Error)?.message || err)) ) } as any; }) ); const LandingPage = safeLazy(() => import('@/pages/front/LandingPage')); const LoginPage = safeLazy(() => import('@/pages/front/LoginPage')); const ChatPage = safeLazy(() => import('@/pages/front/ChatPage')); const KnowledgePage = safeLazy(() => import('@/pages/front/KnowledgePage')); const MarketPage = safeLazy(() => import('@/pages/front/MarketPage')); const TokenDashboardPage = safeLazy(() => import('@/pages/front/TokenDashboardPage')); const PricingPage = safeLazy(() => import('@/pages/front/PricingPage')); const ProfilePage = safeLazy(() => import('@/pages/front/ProfilePage')); const NotificationPage = safeLazy(() => import('@/pages/front/NotificationPage')); const AssetsPage = safeLazy(() => import('@/pages/front/AssetsPage')); const NovelPreviewPage = safeLazy(() => import('@/pages/front/NovelPreviewPage')); const AgentCanvas = safeLazy(() => import('@/pages/front/AgentCanvas')); const EvolutionDashboard = safeLazy(() => import('@/pages/front/EvolutionDashboard')); const AdminDashboard = safeLazy(() => import('@/pages/admin/Dashboard')); const AdminUsers = safeLazy(() => import('@/pages/admin/Users')); const AdminModels = safeLazy(() => import('@/pages/admin/Models')); const AdminSiteSettings = safeLazy(() => import('@/pages/admin/SiteSettings')); const AdminSmsConfig = safeLazy(() => import('@/pages/admin/SmsConfig')); const AdminPayment = safeLazy(() => import('@/pages/admin/Payment')); const AdminServices = safeLazy(() => import('@/pages/admin/Services')); const AdminMembership = safeLazy(() => import('@/pages/admin/Membership')); const AdminAds = safeLazy(() => import('@/pages/admin/Ads')); const AdminMarket = safeLazy(() => import('@/pages/admin/Market')); const AdminMarketProducts = safeLazy(() => import('@/pages/admin/MarketProductsAdmin')); const AdminLogs = safeLazy(() => import('@/pages/admin/Logs')); const AdminSkills = safeLazy(() => import('@/pages/admin/Skills')); const AdminAgents = safeLazy(() => import('@/pages/admin/Agents')); const AdminCodeExec = safeLazy(() => import('@/pages/admin/CodeExec')); const DistributionBuilder = safeLazy(() => import('@/pages/admin/DistributionBuilder')); const ImBots = safeLazy(() => import('@/pages/admin/ImBots')); const PrivacySettings = safeLazy(() => import('@/pages/admin/PrivacySettings')); const Promotion = safeLazy(() => import('@/pages/admin/Promotion')); const Achievement = safeLazy(() => import('@/pages/admin/Achievement')); const Tenant = safeLazy(() => import('@/pages/admin/Tenant')); const Billing = safeLazy(() => import('@/pages/admin/Billing')); const Analytics = safeLazy(() => import('@/pages/admin/Analytics')); const AdminKnowledge = safeLazy(() => import('@/pages/admin/Knowledge')); const AdminWorkflow = safeLazy(() => import('@/pages/admin/Workflow')); const AdminStorage = safeLazy(() => import('@/pages/admin/Storage')); const AdminDeveloper = safeLazy(() => import('@/pages/admin/Developer')); const AdminDeveloperTools = safeLazy(() => import('@/pages/admin/DeveloperTools')); const AdminAutomation = safeLazy(() => import('@/pages/admin/Automation')); const AdminMcp = safeLazy(() => import('@/pages/admin/Mcp')); const AdminApps = safeLazy(() => import('@/pages/admin/Apps')); const AssetCenter = safeLazy(() => import('@/pages/admin/AssetCenter')); const UserPortal = safeLazy(() => import('@/pages/UserPortal')); const WechatBot = safeLazy(() => import('@/pages/front/WechatBot')); const ImBotHub = safeLazy(() => import('@/pages/front/ImBotHub')); const AppServices = safeLazy(() => import('@/pages/front/AppServices')); const MarketProducts = safeLazy(() => import('@/pages/front/MarketProducts')); const MarketProductDetail = safeLazy(() => import('@/pages/front/MarketProductDetail')); const MarketProductsAdmin = safeLazy(() => import('@/pages/admin/MarketProductsAdmin')); const pageFallback =
加载中...
; const App: React.FC = () => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); // 初始化:从localStorage恢复登录状态 useEffect(() => { const token = localStorage.getItem('aiflow_token'); const cachedUser = localStorage.getItem('aiflow_user'); if (token && cachedUser) { try { setUser(JSON.parse(cachedUser)); } catch { localStorage.removeItem('aiflow_token'); localStorage.removeItem('aiflow_user'); } } setLoading(false); }, []); const login = (u: User) => { setUser(u); localStorage.setItem('aiflow_user', JSON.stringify(u)); }; const logout = () => { setUser(null); localStorage.removeItem('aiflow_token'); localStorage.removeItem('aiflow_user'); }; const isAdmin = user?.role === 'admin' || user?.role === 'super_admin'; if (loading) { return
加载中...
; } return ( {/* Login */} : ) : } /> {/* Root - Landing for guests, redirect for authenticated users */} : ) : } /> {/* Front Routes (authenticated only) */} }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Admin Routes */} : }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* 公开前台首页:不受登录态拦截,供后台「访问前台」直接打开 */} } /> } /> ); }; export default App;