From 861e462ebdf1f06907c9543dc13ec75d133212fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 18 May 2025 13:52:39 +0200 Subject: [PATCH] Todos example work --- packages/example/src/domain/Todo.ts | 10 ++----- packages/example/src/todos/views/VNewTodo.tsx | 12 ++++---- packages/example/src/todos/views/VTodo.tsx | 28 ++++++++----------- packages/example/src/todos/views/VTodos.tsx | 15 ++++++++-- 4 files changed, 31 insertions(+), 34 deletions(-) diff --git a/packages/example/src/domain/Todo.ts b/packages/example/src/domain/Todo.ts index cd120b3..f543d18 100644 --- a/packages/example/src/domain/Todo.ts +++ b/packages/example/src/domain/Todo.ts @@ -1,6 +1,5 @@ import { ThSchema } from "@thilawyn/thilaschema" -import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Effect, Schema } from "effect" +import { Schema } from "effect" export class Todo extends Schema.Class("Todo")({ @@ -18,9 +17,4 @@ export const TodoFromJsonStruct = Schema.Struct({ ThSchema.assertEncodedJsonifiable ) -export const TodoFromJson = TodoFromJsonStruct.pipe(Schema.compose(Todo)) - - -export const generateUniqueID = makeUuid4.pipe( - Effect.provide(GetRandomValues.CryptoRandom) -) +export const TodoFromJson = Schema.compose(TodoFromJsonStruct, Todo) diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx index c090df6..64d47ac 100644 --- a/packages/example/src/todos/views/VNewTodo.tsx +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -1,21 +1,21 @@ import { Todo } from "@/domain" import { Box, Button, Card, Flex, TextArea } from "@radix-ui/themes" +import { GetRandomValues, makeUuid4 } from "@typed/id" import { Effect, Option, Ref } from "effect" import { R } from "../reffuse" import { TodosState } from "../services" -const createEmptyTodo = Effect.map(Todo.generateUniqueID, id => Todo.Todo.make({ - id, - content: "", - completedAt: Option.none(), -}, true)) +const createEmptyTodo = makeUuid4.pipe( + Effect.map(id => Todo.Todo.make({ id, content: "", completedAt: Option.none()}, true)), + Effect.provide(GetRandomValues.CryptoRandom), +) export function VNewTodo() { const todoRef = R.useRef(() => createEmptyTodo) - const [content, setContent] = R.useRefState(R.useSubRef(todoRef, ["content"])) + const [content, setContent] = R.useRefState(R.useSubRefFromPath(todoRef, ["content"])) const add = R.useCallbackSync(() => Effect.all([TodosState.TodosState, todoRef]).pipe( Effect.flatMap(([state, todo]) => state.prepend(todo)), diff --git a/packages/example/src/todos/views/VTodo.tsx b/packages/example/src/todos/views/VTodo.tsx index 4a442bc..11a7c43 100644 --- a/packages/example/src/todos/views/VTodo.tsx +++ b/packages/example/src/todos/views/VTodo.tsx @@ -1,20 +1,20 @@ import { Todo } from "@/domain" import { Box, Card, Flex, IconButton, TextArea } from "@radix-ui/themes" -import { Effect } from "effect" +import { Effect, Ref, SubscriptionRef } from "effect" import { Delete } from "lucide-react" import { useState } from "react" import { R } from "../reffuse" -import { TodosState } from "../services" export interface VTodoProps { - readonly index: number - readonly todo: Todo.Todo + readonly todoRef: SubscriptionRef.SubscriptionRef + readonly remove: Effect.Effect } -export function VTodo({ index, todo }: VTodoProps) { +export function VTodo({ todoRef, remove }: VTodoProps) { const runSync = R.useRunSync() + const [todo] = R.useSubscribeRefs(todoRef) const editorMode = useState(false) @@ -24,12 +24,11 @@ export function VTodo({ index, todo }: VTodoProps) {