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;