diff --git a/web/src/App.tsx b/web/src/App.tsx index 79f7e4853504..cd35eea3dc89 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,4 +1,6 @@ import { + lazy, + Suspense, useCallback, useEffect, useMemo, @@ -72,25 +74,27 @@ import { ProfileSwitcher } from "@/components/ProfileSwitcher"; import { ProfileScopeBanner } from "@/components/ProfileScopeBanner"; import { useSystemActions } from "@/contexts/useSystemActions"; import type { SystemAction } from "@/contexts/system-actions-context"; -import ConfigPage from "@/pages/ConfigPage"; -import DocsPage from "@/pages/DocsPage"; -import EnvPage from "@/pages/EnvPage"; -import FilesPage from "@/pages/FilesPage"; -import SessionsPage from "@/pages/SessionsPage"; -import LogsPage from "@/pages/LogsPage"; -import AnalyticsPage from "@/pages/AnalyticsPage"; -import ModelsPage from "@/pages/ModelsPage"; -import CronPage from "@/pages/CronPage"; -import ProfilesPage from "@/pages/ProfilesPage"; -import ProfileBuilderPage from "@/pages/ProfileBuilderPage"; -import SkillsPage from "@/pages/SkillsPage"; -import PluginsPage from "@/pages/PluginsPage"; -import McpPage from "@/pages/McpPage"; -import PairingPage from "@/pages/PairingPage"; -import ChannelsPage from "@/pages/ChannelsPage"; -import WebhooksPage from "@/pages/WebhooksPage"; -import SystemPage from "@/pages/SystemPage"; -import ChatPage from "@/pages/ChatPage"; +// Route pages are lazy-loaded so the initial dashboard shell does not pay for +// every admin surface (and heavy deps like xterm) up front. +const ConfigPage = lazy(() => import("@/pages/ConfigPage")); +const DocsPage = lazy(() => import("@/pages/DocsPage")); +const EnvPage = lazy(() => import("@/pages/EnvPage")); +const FilesPage = lazy(() => import("@/pages/FilesPage")); +const SessionsPage = lazy(() => import("@/pages/SessionsPage")); +const LogsPage = lazy(() => import("@/pages/LogsPage")); +const AnalyticsPage = lazy(() => import("@/pages/AnalyticsPage")); +const ModelsPage = lazy(() => import("@/pages/ModelsPage")); +const CronPage = lazy(() => import("@/pages/CronPage")); +const ProfilesPage = lazy(() => import("@/pages/ProfilesPage")); +const ProfileBuilderPage = lazy(() => import("@/pages/ProfileBuilderPage")); +const SkillsPage = lazy(() => import("@/pages/SkillsPage")); +const PluginsPage = lazy(() => import("@/pages/PluginsPage")); +const McpPage = lazy(() => import("@/pages/McpPage")); +const PairingPage = lazy(() => import("@/pages/PairingPage")); +const ChannelsPage = lazy(() => import("@/pages/ChannelsPage")); +const WebhooksPage = lazy(() => import("@/pages/WebhooksPage")); +const SystemPage = lazy(() => import("@/pages/SystemPage")); +const ChatPage = lazy(() => import("@/pages/ChatPage")); import { LanguageSwitcher } from "@/components/LanguageSwitcher"; import { ThemeSwitcher } from "@/components/ThemeSwitcher"; import { useI18n } from "@/i18n"; @@ -99,9 +103,25 @@ import { PluginPage, PluginSlot, usePlugins } from "@/plugins"; import type { PluginManifest } from "@/plugins"; import { useTheme } from "@/themes"; import { isDashboardEmbeddedChatEnabled } from "@/lib/dashboard-flags"; +import { latchChatActivation } from "@/lib/chat-activation"; import { api } from "@/lib/api"; import type { StatusResponse, UpdateCheckResponse } from "@/lib/api"; +function RouteFallback({ label = "Loading…" }: { label?: string }) { + return ( +