diff --git a/bun.lockb b/bun.lockb
index a6e4ede..f12491a 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/packages/webui/package.json b/packages/webui/package.json
index 69a4ce8..1da50bf 100644
--- a/packages/webui/package.json
+++ b/packages/webui/package.json
@@ -11,6 +11,7 @@
"dependencies": {
"@effect/schema": "^0.68.17",
"@tanstack/react-query": "4",
+ "@tanstack/react-router": "^1.44.2",
"@thilawyn/thilalib": "^0.1.5",
"@todo-tests/common": "workspace:*",
"@trpc/client": "^10.45.2",
@@ -23,6 +24,8 @@
"react-dom": "^18.3.1"
},
"devDependencies": {
+ "@tanstack/router-devtools": "^1.44.2",
+ "@tanstack/router-plugin": "^1.44.3",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^7.15.0",
diff --git a/packages/webui/src/App.tsx b/packages/webui/src/App.tsx
deleted file mode 100644
index 89b745e..0000000
--- a/packages/webui/src/App.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { PrimeReactProvider } from "primereact/api"
-import "primereact/resources/themes/lara-light-cyan/theme.css"
-import "./index.css"
-import { VTodosSubscription } from "./todo/VTodosSubscription"
-import { TRPCClientProvider } from "./trpc/TRPCClientProvider"
-
-
-export function App() {
-
- return (
-
-
- {/* */}
-
-
-
- )
-
-}
diff --git a/packages/webui/src/Index.tsx b/packages/webui/src/Index.tsx
deleted file mode 100644
index 1e33d3b..0000000
--- a/packages/webui/src/Index.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Schema as S } from "@effect/schema"
-import { JsonifiableTodo } from "@todo-tests/common/data"
-import { flow } from "effect"
-import { observable } from "mobx"
-import { Todo } from "./data"
-import { VTodos } from "./todo/VTodos"
-import { trpc } from "./trpc/trpc"
-
-
-const decodeTodos = flow(
- S.decodeSync(
- S.mutable(S.Array(
- JsonifiableTodo.pipe(S.compose(Todo))
- ))
- ),
-
- observable.array,
-)
-
-
-export function Index() {
-
- const todosQuery = trpc.todos.all.useQuery(undefined, { select: decodeTodos })
-
-
- return <>
-
-
Todos
-
- {function() {
- switch (todosQuery.status) {
- case "success":
- return
-
- case "error":
- return
Failed.
-
- case "loading":
- return
Loading...
- }
- }()}
-
- >
-
-}
diff --git a/packages/webui/src/main.tsx b/packages/webui/src/main.tsx
index d9b858e..5451a81 100644
--- a/packages/webui/src/main.tsx
+++ b/packages/webui/src/main.tsx
@@ -1,10 +1,29 @@
+import { RouterProvider, createRouter } from "@tanstack/react-router"
+import { PrimeReactProvider } from "primereact/api"
import React from "react"
import ReactDOM from "react-dom/client"
-import { App } from "./App"
+import { routeTree } from "./routeTree.gen"
+import { TRPCClientProvider } from "./trpc/TRPCClientProvider"
+
+import "primereact/resources/themes/lara-light-cyan/theme.css"
+import "./index.css"
+
+
+const router = createRouter({ routeTree })
+
+declare module "@tanstack/react-router" {
+ interface Register {
+ router: typeof router
+ }
+}
ReactDOM.createRoot(document.getElementById("root")!).render(
-
+
+
+
+
+
)
diff --git a/packages/webui/src/routeTree.gen.ts b/packages/webui/src/routeTree.gen.ts
new file mode 100644
index 0000000..e8428b4
--- /dev/null
+++ b/packages/webui/src/routeTree.gen.ts
@@ -0,0 +1,62 @@
+/* prettier-ignore-start */
+
+/* eslint-disable */
+
+// @ts-nocheck
+
+// noinspection JSUnusedGlobalSymbols
+
+// This file is auto-generated by TanStack Router
+
+import { createFileRoute } from '@tanstack/react-router'
+
+// Import Routes
+
+import { Route as rootRoute } from './routes/__root'
+
+// Create Virtual Routes
+
+const IndexLazyImport = createFileRoute('/')()
+
+// Create/Update Routes
+
+const IndexLazyRoute = IndexLazyImport.update({
+ path: '/',
+ getParentRoute: () => rootRoute,
+} as any).lazy(() => import('./routes/index.lazy').then((d) => d.Route))
+
+// Populate the FileRoutesByPath interface
+
+declare module '@tanstack/react-router' {
+ interface FileRoutesByPath {
+ '/': {
+ id: '/'
+ path: '/'
+ fullPath: '/'
+ preLoaderRoute: typeof IndexLazyImport
+ parentRoute: typeof rootRoute
+ }
+ }
+}
+
+// Create and export the route tree
+
+export const routeTree = rootRoute.addChildren({ IndexLazyRoute })
+
+/* prettier-ignore-end */
+
+/* ROUTE_MANIFEST_START
+{
+ "routes": {
+ "__root__": {
+ "filePath": "__root.tsx",
+ "children": [
+ "/"
+ ]
+ },
+ "/": {
+ "filePath": "index.lazy.tsx"
+ }
+ }
+}
+ROUTE_MANIFEST_END */
diff --git a/packages/webui/src/routes/__root.tsx b/packages/webui/src/routes/__root.tsx
new file mode 100644
index 0000000..98306c6
--- /dev/null
+++ b/packages/webui/src/routes/__root.tsx
@@ -0,0 +1,12 @@
+import { Outlet, createRootRoute } from "@tanstack/react-router"
+
+
+export function Root() {
+ return <>
+
+
+
+ >
+}
+
+export const Route = createRootRoute({ component: Root })
diff --git a/packages/webui/src/routes/index.lazy.tsx b/packages/webui/src/routes/index.lazy.tsx
new file mode 100644
index 0000000..7bc912b
--- /dev/null
+++ b/packages/webui/src/routes/index.lazy.tsx
@@ -0,0 +1,9 @@
+import { createLazyFileRoute } from "@tanstack/react-router"
+import { VTodosSubscription } from "../todo/VTodosSubscription"
+
+
+export function Index() {
+ return
+}
+
+export const Route = createLazyFileRoute("/")({ component: Index })
diff --git a/packages/webui/vite.config.ts b/packages/webui/vite.config.ts
index 5a33944..0949385 100644
--- a/packages/webui/vite.config.ts
+++ b/packages/webui/vite.config.ts
@@ -1,7 +1,13 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
+import { TanStackRouterVite } from "@tanstack/router-plugin/vite"
+import { default as react, default as viteReact } from "@vitejs/plugin-react"
+import { defineConfig } from "vite"
+
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [react()],
+ plugins: [
+ TanStackRouterVite(),
+ viteReact(),
+ react(),
+ ]
})