Rhys Sullivanrework sourcesd61734b8 months agoHistory
133 lines · 3.5 KB · TypeScript
RawDownload
import * as React from "react";import {  RouterProvider,  createRootRoute,  createRoute,  createRouter,  useNavigate,} from "@tanstack/react-router";import { ExecutorReactProvider } from "@executor/react"; import "./globals.css"; import { AppShell } from "./components/shell";import { HomePage } from "./views/home";import { EditSourcePage, NewSourcePage } from "./views/source-editor";import { SourceDetailPage } from "./views/source-detail";import { SecretsPage } from "./views/secrets";import { AddSourcePage } from "./views/add-source"; // ---------------------------------------------------------------------------// Route search schema// --------------------------------------------------------------------------- type SourceRouteSearch = {  tab: "model" | "discover";  tool?: string;  query?: string;}; const sourceTabs = ["model", "discover"] as const; // ---------------------------------------------------------------------------// Routes// --------------------------------------------------------------------------- const rootRoute = createRootRoute({  component: AppShell,}); const homeRoute = createRoute({  getParentRoute: () => rootRoute,  path: "/",  component: HomePage,}); const newSourceRoute = createRoute({  getParentRoute: () => rootRoute,  path: "/sources/new",  component: NewSourcePage,}); const addSourceRoute = createRoute({  getParentRoute: () => rootRoute,  path: "/sources/add",  component: AddSourcePage,}); const sourceRoute = createRoute({  getParentRoute: () => rootRoute,  path: "/sources/$sourceId",  validateSearch: (search: Record<string, unknown>): SourceRouteSearch => ({    tab:      typeof search.tab === "string" && sourceTabs.includes(search.tab as SourceRouteSearch["tab"])        ? (search.tab as SourceRouteSearch["tab"])        : "model",    tool: typeof search.tool === "string" && search.tool.length > 0 ? search.tool : undefined,    query: typeof search.query === "string" ? search.query : undefined,  }),  component: SourceDetailPageWrapper,}); const editSourceRoute = createRoute({  getParentRoute: () => rootRoute,  path: "/sources/$sourceId/edit",  component: EditSourcePageWrapper,}); const secretsRoute = createRoute({  getParentRoute: () => rootRoute,  path: "/secrets",  component: SecretsPage,});  function SourceDetailPageWrapper() {  const { sourceId } = sourceRoute.useParams();  const search = sourceRoute.useSearch();  const navigate = useNavigate({ from: sourceRoute.fullPath });   return (    <SourceDetailPage      sourceId={sourceId}      search={search}      navigate={navigate as any}    />  );} function EditSourcePageWrapper() {  const { sourceId } = editSourceRoute.useParams();  return <EditSourcePage sourceId={sourceId} />;} // ---------------------------------------------------------------------------// Router// --------------------------------------------------------------------------- const routeTree = rootRoute.addChildren([homeRoute, newSourceRoute, addSourceRoute, sourceRoute, editSourceRoute, secretsRoute]); const router = createRouter({  routeTree,  defaultPreload: "intent",}); declare module "@tanstack/react-router" {  interface Register {    router: typeof router;  }} // ---------------------------------------------------------------------------// App// --------------------------------------------------------------------------- export function App() {  return (    <React.StrictMode>      <ExecutorReactProvider>        <RouterProvider router={router} />      </ExecutorReactProvider>    </React.StrictMode>  );}