import { Onborda, OnbordaProvider } from 'onborda'; import { useMemo, useState } from 'react'; import { createBrowserRouter, Navigate, RouterProvider, useNavigate } from 'react-router-dom'; import { Toaster } from 'sonner'; import { RouteError } from '@/components/error/RouteError'; import { AppLayout } from '@/components/layout/AppLayout'; import { buildChatTour } from '@/components/tour/chatTourSteps'; import { TourCard } from '@/components/tour/TourCard'; import { UploadProvider } from '@/context/UploadContext'; import { useTranslation } from '@/i18n/useI18n'; import { ChatPage } from '@/pages/chat'; import { CredentialPage } from '@/pages/credential'; import { KnowledgePage } from '@/pages/knowledge'; import { SchedulePage } from '@/pages/schedule'; import { SetupPage } from '@/pages/setup'; function SetupPageRoute() { const navigate = useNavigate(); return ( <>
navigate('/')} />
); } const router = createBrowserRouter([ { element: , errorElement: , children: [ { // Content-level boundary: a crash in a page replaces only // the Outlet area, so AppLayout (the icon rail / nav) stays // usable. The parent route keeps its own errorElement as a // last-resort catch-all for AppLayout/AppSidebar crashes. errorElement: , children: [ { path: '/', element: }, { path: '/chat/:agentId?/:sessionId?/:memberId?', element: , }, { path: '/schedule', element: }, { path: '/credential', element: }, { path: '/knowledge', element: }, { path: '/knowledge/:kbId', element: }, ], }, ], }, { path: '/setup', element: , errorElement: }, ]); function App() { const { t } = useTranslation(); const [setupComplete, setSetupComplete] = useState(() => !!localStorage.getItem('server_url')); const tours = useMemo(() => [buildChatTour(t)], [t]); if (!setupComplete) { return setSetupComplete(true)} />; } return ( ); } export default App;