Files
DataClaw/frontend/src/App.tsx
T

181 lines
5.1 KiB
TypeScript
Raw Normal View History

2026-03-14 19:20:37 +08:00
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
2026-03-14 15:52:27 +08:00
import { Sidebar } from "./components/Sidebar";
2026-03-16 16:12:35 +08:00
import { ProjectSwitcher } from "./components/ProjectSwitcher";
2026-03-14 15:52:27 +08:00
import { ChatInterface } from "./components/ChatInterface";
import { Dashboard } from "./pages/Dashboard";
import { Skills } from "./pages/Skills";
import { Settings } from "./pages/Settings";
2026-03-14 19:20:37 +08:00
import { Users } from "./pages/Users";
2026-03-16 16:12:35 +08:00
import { Projects } from "./pages/Projects";
2026-03-14 19:20:37 +08:00
import { Login } from "./pages/Login";
2026-03-14 19:56:34 +08:00
import { ModelConfigs } from "./pages/ModelConfigs";
2026-03-29 14:44:32 +08:00
import { EmbeddingModels } from "./pages/EmbeddingModels";
import { KnowledgeBases } from "./pages/KnowledgeBases";
2026-03-15 19:36:02 +08:00
import { DataSources } from "./pages/DataSources";
2026-03-16 22:18:23 +08:00
import { Modeling } from "./pages/Modeling";
2026-03-28 01:01:13 +08:00
import { Subagents } from "./pages/Subagents";
2026-03-29 19:34:58 +08:00
import { WebSearchConfig } from "./pages/WebSearchConfig";
2026-03-29 17:12:46 +08:00
import { VerifyEmail } from "./pages/VerifyEmail";
2026-03-14 19:20:37 +08:00
import { useAuthStore } from "./store/authStore";
2026-03-28 16:25:35 +08:00
import { ThemeToggle } from "./components/ThemeToggle";
2026-03-14 19:20:37 +08:00
// Protected Route Component
function ProtectedRoute({ children, requireAdmin = false }: { children: React.ReactNode, requireAdmin?: boolean }) {
const { isAuthenticated, user } = useAuthStore();
if (!isAuthenticated) {
return <Navigate to="/login" replace />;
}
if (requireAdmin && !user?.is_admin) {
return <Navigate to="/" replace />;
}
return <>{children}</>;
}
function MainLayout({ children }: { children: React.ReactNode }) {
return (
<div className="flex h-screen w-full bg-background text-foreground overflow-hidden">
<Sidebar />
2026-03-29 09:17:32 +08:00
<main className="flex-1 flex flex-col overflow-hidden h-screen">
<div className="h-14 shrink-0 flex items-center justify-between z-30 px-4">
<div className="flex-1">
2026-03-28 16:25:35 +08:00
{/* Left side empty for balance */}
</div>
2026-03-29 09:17:32 +08:00
<div className="flex-1 flex justify-center">
2026-03-22 16:48:41 +08:00
<ProjectSwitcher />
</div>
2026-03-29 09:17:32 +08:00
<div className="flex-1 flex justify-end">
2026-03-28 16:25:35 +08:00
<ThemeToggle />
</div>
2026-03-16 16:12:35 +08:00
</div>
2026-03-29 09:17:32 +08:00
<div className="flex-1 min-h-0 overflow-hidden">
2026-03-16 16:12:35 +08:00
{children}
</div>
2026-03-14 19:20:37 +08:00
</main>
</div>
);
}
2026-03-14 15:52:27 +08:00
function App() {
return (
<BrowserRouter>
2026-03-14 19:20:37 +08:00
<Routes>
<Route path="/login" element={<Login />} />
2026-03-29 17:12:46 +08:00
<Route path="/verify-email" element={<VerifyEmail />} />
2026-03-14 19:20:37 +08:00
{/* Protected Routes */}
<Route path="/" element={
<ProtectedRoute>
<MainLayout>
2026-03-28 16:25:35 +08:00
<div className="h-full overflow-hidden bg-background">
2026-03-15 11:07:18 +08:00
<ChatInterface />
2026-03-14 15:52:27 +08:00
</div>
2026-03-14 19:20:37 +08:00
</MainLayout>
</ProtectedRoute>
} />
<Route path="/dashboard" element={
<ProtectedRoute>
<MainLayout>
<Dashboard />
</MainLayout>
</ProtectedRoute>
} />
<Route path="/skills" element={
<ProtectedRoute>
<MainLayout>
<Skills />
</MainLayout>
</ProtectedRoute>
} />
<Route path="/settings" element={
<ProtectedRoute>
<MainLayout>
<Settings />
</MainLayout>
</ProtectedRoute>
} />
2026-03-16 16:12:35 +08:00
<Route path="/projects" element={
<ProtectedRoute>
<MainLayout>
<Projects />
</MainLayout>
</ProtectedRoute>
} />
2026-03-28 01:01:13 +08:00
<Route path="/projects/:projectId/subagents" element={
<ProtectedRoute>
<MainLayout>
<Subagents />
</MainLayout>
</ProtectedRoute>
} />
2026-03-14 19:20:37 +08:00
<Route path="/users" element={
<ProtectedRoute requireAdmin={true}>
<MainLayout>
<Users />
</MainLayout>
</ProtectedRoute>
} />
2026-03-14 19:56:34 +08:00
<Route path="/model-configs" element={
<ProtectedRoute>
<MainLayout>
<ModelConfigs />
</MainLayout>
</ProtectedRoute>
} />
2026-03-29 14:44:32 +08:00
<Route path="/embedding-models" element={
<ProtectedRoute>
<MainLayout>
<EmbeddingModels />
</MainLayout>
</ProtectedRoute>
} />
2026-03-29 19:34:58 +08:00
<Route path="/web-search-config" element={
<ProtectedRoute requireAdmin={true}>
<MainLayout>
<WebSearchConfig />
</MainLayout>
</ProtectedRoute>
} />
2026-03-29 14:44:32 +08:00
<Route path="/knowledge-bases" element={
<ProtectedRoute>
<MainLayout>
<KnowledgeBases />
</MainLayout>
</ProtectedRoute>
} />
2026-03-15 19:36:02 +08:00
<Route path="/datasources" element={
<ProtectedRoute requireAdmin={true}>
<MainLayout>
<DataSources />
</MainLayout>
</ProtectedRoute>
} />
2026-03-16 22:18:23 +08:00
<Route path="/modeling/:id" element={
<ProtectedRoute requireAdmin={true}>
<MainLayout>
<Modeling />
</MainLayout>
</ProtectedRoute>
} />
2026-03-14 19:20:37 +08:00
</Routes>
2026-03-14 15:52:27 +08:00
</BrowserRouter>
);
}
export default App;