App.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { useEffect } from 'react'
  2. import { Routes, Route, Navigate } from 'react-router-dom'
  3. import { useAuthStore } from './stores/authStore'
  4. import { wsClient } from './api/client'
  5. import Layout from './components/Layout'
  6. import LoginPage from './pages/LoginPage'
  7. import WorkflowsPage from './pages/WorkflowsPage'
  8. import WorkflowEditorPage from './pages/WorkflowEditorPage'
  9. import ExecutionsPage from './pages/ExecutionsPage'
  10. import SettingsPage from './pages/SettingsPage'
  11. import NodesPage from './pages/NodesPage'
  12. import DatabasePage from './pages/DatabasePage'
  13. import CredentialsPage from './pages/CredentialsPage'
  14. function PrivateRoute({ children }: { children: React.ReactNode }) {
  15. const isAuthenticated = useAuthStore((state) => state.isAuthenticated)
  16. return isAuthenticated ? <>{children}</> : <Navigate to="/login" replace />
  17. }
  18. function App() {
  19. const isAuthenticated = useAuthStore((state) => state.isAuthenticated)
  20. // Connect WebSocket when app loads if already authenticated
  21. useEffect(() => {
  22. if (isAuthenticated) {
  23. wsClient.connect()
  24. }
  25. return () => {
  26. wsClient.disconnect()
  27. }
  28. }, [isAuthenticated])
  29. return (
  30. <Routes>
  31. <Route path="/login" element={<LoginPage />} />
  32. <Route
  33. path="/"
  34. element={
  35. <PrivateRoute>
  36. <Layout />
  37. </PrivateRoute>
  38. }
  39. >
  40. <Route index element={<Navigate to="/workflows" replace />} />
  41. <Route path="workflows" element={<WorkflowsPage />} />
  42. <Route path="workflows/:id" element={<WorkflowEditorPage />} />
  43. <Route path="executions" element={<ExecutionsPage />} />
  44. <Route path="nodes" element={<NodesPage />} />
  45. <Route path="credentials" element={<CredentialsPage />} />
  46. <Route path="database" element={<DatabasePage />} />
  47. <Route path="settings" element={<SettingsPage />} />
  48. </Route>
  49. </Routes>
  50. )
  51. }
  52. export default App