diff --git a/bun.lockb b/bun.lockb index 54f6226..9235380 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/packages/webui/package.json b/packages/webui/package.json index b7abf00..a085bb6 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -14,6 +14,9 @@ "@thilawyn/thilalib": "^0.1.5", "@trpc/client": "^10.45.2", "@trpc/react-query": "^10.45.2", + "effect": "^3.4.7", + "mobx": "^6.13.0", + "mobx-react-lite": "^4.0.7", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/packages/webui/src/Index.tsx b/packages/webui/src/Index.tsx index 20f1370..1e33d3b 100644 --- a/packages/webui/src/Index.tsx +++ b/packages/webui/src/Index.tsx @@ -1,15 +1,20 @@ 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 = S.decodeSync( - S.mutable( - S.Array( +const decodeTodos = flow( + S.decodeSync( + S.mutable(S.Array( JsonifiableTodo.pipe(S.compose(Todo)) - ) - ) + )) + ), + + observable.array, ) @@ -22,7 +27,18 @@ export function Index() {

Todos

+ {function() { + switch (todosQuery.status) { + case "success": + return + case "error": + return

Failed.

+ + case "loading": + return

Loading...

+ } + }()}
diff --git a/packages/webui/src/todo/VTodo.tsx b/packages/webui/src/todo/VTodo.tsx new file mode 100644 index 0000000..4837945 --- /dev/null +++ b/packages/webui/src/todo/VTodo.tsx @@ -0,0 +1,19 @@ +import { observer } from "mobx-react-lite" +import { Todo } from "../data" + + +export interface VTodoProps { + todo: Todo +} + + +export const VTodo = observer(({ todo }: VTodoProps) => { + + return ( +
+

{todo.title}

+

{todo.content}

+
+ ) + +}) diff --git a/packages/webui/src/todo/VTodos.tsx b/packages/webui/src/todo/VTodos.tsx new file mode 100644 index 0000000..5dd8e12 --- /dev/null +++ b/packages/webui/src/todo/VTodos.tsx @@ -0,0 +1,29 @@ +import { Option, identity } from "effect" +import { IObservableArray } from "mobx" +import { observer } from "mobx-react-lite" +import { Todo } from "../data" +import { VTodo } from "./VTodo" + + +export interface VTodosProps { + todos: IObservableArray +} + + +/** + * Displays a vertical list of todos + */ +export const VTodos = observer(({ todos }: VTodosProps) => ( +
+ {todos.map((todo, index) => ( + index, + })} + + todo={todo} + /> + ))} +
+))