import { lazy, Suspense, useEffect } from "react"; import { Navigate, Route, Routes } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { ProtectedRoute } from "@/components/auth/ProtectedRoute"; import { AppLayout } from "@/components/layout/AppLayout"; import { ErrorBoundary } from "@/components/shared/ErrorBoundary"; import { LoadingSpinner } from "@/components/shared/LoadingSpinner"; import { Toaster } from "@/components/ui/toaster"; import { useUiStore } from "@/stores/ui"; import i18n from "@/i18n"; const LoginPage = lazy(() => import("@/pages/login/LoginPage").then((module) => ({ default: module.LoginPage }))); const DashboardPage = lazy(() => import("@/pages/dashboard/DashboardPage").then((module) => ({ default: module.DashboardPage }))); const AgentListPage = lazy(() => import("@/pages/agents/AgentListPage").then((module) => ({ default: module.AgentListPage }))); const SessionChatPage = lazy(() => import("@/pages/sessions/SessionChatPage").then((module) => ({ default: module.SessionChatPage }))); const ToolsPage = lazy(() => import("@/pages/tools/ToolsPage").then((module) => ({ default: module.ToolsPage }))); const KnowledgePage = lazy(() => import("@/pages/knowledge/KnowledgePage").then((module) => ({ default: module.KnowledgePage }))); const TeamsPage = lazy(() => import("@/pages/teams/TeamsPage").then((module) => ({ default: module.TeamsPage }))); const SkillsPage = lazy(() => import("@/pages/skills/SkillsPage").then((module) => ({ default: module.SkillsPage }))); const ModelProvidersPage = lazy(() => import("@/pages/models/ModelProvidersPage").then((module) => ({ default: module.ModelProvidersPage }))); const SettingsPage = lazy(() => import("@/pages/settings/SettingsPage").then((module) => ({ default: module.SettingsPage }))); export default function App() { const { t } = useTranslation(); return ( <> }> } /> } /> } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); } function ThemeSync() { const theme = useUiStore((state) => state.theme); useEffect(() => { document.documentElement.classList.toggle("dark", theme === "dark"); }, [theme]); return null; } function RoutePreloader() { useEffect(() => { const preload = () => { void Promise.all([ import("@/pages/dashboard/DashboardPage"), import("@/pages/agents/AgentListPage"), import("@/pages/sessions/SessionChatPage"), import("@/pages/tools/ToolsPage"), import("@/pages/knowledge/KnowledgePage"), import("@/pages/teams/TeamsPage"), import("@/pages/skills/SkillsPage"), import("@/pages/models/ModelProvidersPage"), import("@/pages/settings/SettingsPage"), ]); }; const requestIdle = window.requestIdleCallback ?? ((callback: IdleRequestCallback) => window.setTimeout(callback, 400)); const cancelIdle = window.cancelIdleCallback ?? window.clearTimeout; const handle = requestIdle(preload); return () => cancelIdle(handle); }, []); return null; } function LanguageSync() { const language = useUiStore((state) => state.language); useEffect(() => { if (language && i18n.language !== language) { i18n.changeLanguage(language); } }, [language]); return null; }