diff --git a/packages/webui/src/App.tsx b/packages/webui/src/App.tsx index 92951ce..b1f5dcd 100644 --- a/packages/webui/src/App.tsx +++ b/packages/webui/src/App.tsx @@ -1,5 +1,5 @@ -import { Index } from "./Index" import "./index.css" +import { VTodosSubscription } from "./todo/VTodosSubscription" import { TRPCClientProvider } from "./trpc/TRPCClientProvider" @@ -7,7 +7,8 @@ export function App() { return ( - + {/* */} + ) diff --git a/packages/webui/src/todo/VTodosSubscription.tsx b/packages/webui/src/todo/VTodosSubscription.tsx new file mode 100644 index 0000000..5b35c2b --- /dev/null +++ b/packages/webui/src/todo/VTodosSubscription.tsx @@ -0,0 +1,52 @@ +import { Schema as S } from "@effect/schema" +import { JsonifiableTodo } from "@todo-tests/common/data" +import { Option, flow, identity } from "effect" +import { IObservableArray, observable } from "mobx" +import { observer } from "mobx-react-lite" +import { useState } from "react" +import { Todo } from "../data" +import { trpc } from "../trpc/trpc" +import { VTodo } from "./VTodo" + + +const decodeTodos = flow( + S.decodeSync( + S.mutable(S.Array( + JsonifiableTodo.pipe(S.compose(Todo)) + )) + ), + + observable.array, +) + + +/** + * Shows a vertical list of todos + */ +export const VTodosSubscription = observer(() => { + + const [todos, setTodos] = useState>(observable.array()) + + trpc.todos.changes.useSubscription(undefined, { + onData(data) { + setTodos(decodeTodos(data)) + } + }) + + + return ( +
+ {todos.map(todo => ( + todo.order, + })} + + todo={todo} + /> + ))} +
+ ) + +})