From 8e6adc6b85dadf6692d471ba2be70c7735970e31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 15 Jan 2025 20:59:07 +0100 Subject: [PATCH] Todo work --- bun.lockb | Bin 138480 -> 175928 bytes packages/example/package.json | 5 +- packages/example/src/domain/Todo.ts | 15 ++++- packages/example/src/main.tsx | 1 - packages/example/src/routes/__root.tsx | 25 ++++++--- packages/example/src/routes/index.tsx | 5 +- .../example/src/todos/services/TodosState.ts | 9 ++- packages/example/src/todos/views/VNewTodo.tsx | 52 ++++++++++++++++++ packages/example/src/todos/views/VTodo.tsx | 25 ++++++++- packages/example/src/todos/views/VTodos.tsx | 19 ++++++- 10 files changed, 134 insertions(+), 22 deletions(-) create mode 100644 packages/example/src/todos/views/VNewTodo.tsx diff --git a/bun.lockb b/bun.lockb index 977532e85bc2e3abf6b28d66d9ba7073c8df4126..cf49da4d98555c57981f7416874eec14610e03f1 100755 GIT binary patch delta 52925 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 n+EImS`T=jAwGOq-eNUR("Todo")({ + _tag: Schema.tag("Todo"), id: Schema.String, content: Schema.String, - completedAt: Schema.DateTimeUtcFromSelf, + completedAt: Schema.OptionFromSelf(Schema.DateTimeUtcFromSelf), }) {} export const TodoFromJsonStruct = Schema.Struct({ ...Todo.fields, - completedAt: Schema.DateTimeUtc, + completedAt: Schema.Option(Schema.DateTimeUtc), }).pipe( ThSchema.assertEncodedJsonifiable ) export const TodoFromJson = TodoFromJsonStruct.pipe(Schema.compose(Todo)) + + +export const generateUniqueID = makeCuid.pipe( + Effect.provide(CuidState.layer("@reffuse/example")), + Effect.provide(GetRandomValues.CryptoRandom), + Effect.provide(DateTimes.Default), +) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 1f4673e..715d6e6 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -3,7 +3,6 @@ import { ReffuseRuntime } from "@thilawyn/reffuse" import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" -import "./index.css" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" import { FetchData } from "./services" diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index b152a32..beef033 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -1,5 +1,8 @@ +import { Container, Flex, Theme } from "@radix-ui/themes" +import "@radix-ui/themes/styles.css" import { createRootRoute, Link, Outlet } from "@tanstack/react-router" import { TanStackRouterDevtools } from "@tanstack/router-devtools" +import "../index.css" export const Route = createRootRoute({ @@ -7,14 +10,18 @@ export const Route = createRootRoute({ }) function Root() { - return <> -
- Index - Time - Count -
+ return ( + + + + Index + Time + Count + + - - - + + + + ) } diff --git a/packages/example/src/routes/index.tsx b/packages/example/src/routes/index.tsx index 8e2bdad..6de5c78 100644 --- a/packages/example/src/routes/index.tsx +++ b/packages/example/src/routes/index.tsx @@ -1,6 +1,7 @@ import { TodosContext } from "@/todos/reffuse" import { TodosState } from "@/todos/services" import { VTodos } from "@/todos/views/VTodos" +import { Container } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Layer } from "effect" import { useMemo } from "react" @@ -18,11 +19,11 @@ function Index() { return ( -
+ -
+ ) } diff --git a/packages/example/src/todos/services/TodosState.ts b/packages/example/src/todos/services/TodosState.ts index e683ddb..d9b2bea 100644 --- a/packages/example/src/todos/services/TodosState.ts +++ b/packages/example/src/todos/services/TodosState.ts @@ -2,16 +2,17 @@ import { Todo } from "@/domain" import { KeyValueStore } from "@effect/platform" import { BrowserKeyValueStore } from "@effect/platform-browser" import { PlatformError } from "@effect/platform/Error" -import { Cause, Chunk, Context, Effect, identity, Layer, ParseResult, Ref, Schema, SubscriptionRef } from "effect" +import { Chunk, Context, Effect, identity, Layer, ParseResult, Ref, Schema, SubscriptionRef } from "effect" export class TodosState extends Context.Tag("TodosState")> - readonly readFromLocalStorage: Effect.Effect + readonly readFromLocalStorage: Effect.Effect readonly saveToLocalStorage: Effect.Effect readonly prepend: (todo: Todo.Todo) => Effect.Effect + readonly replace: (index: number, todo: Todo.Todo) => Effect.Effect readonly remove: (index: number) => Effect.Effect // readonly moveUp: (index: number) => Effect.Effect // readonly moveDown: (index: number) => Effect.Effect @@ -30,6 +31,8 @@ export const make = (key: string) => Layer.effect(TodosState, Effect.gen(functio )), Effect.flatMap(v => Ref.set(todos, v)), + Effect.catchTag("NoSuchElementException", () => Ref.set(todos, Chunk.empty())), + Effect.provide(BrowserKeyValueStore.layerLocalStorage), ) @@ -46,6 +49,7 @@ export const make = (key: string) => Layer.effect(TodosState, Effect.gen(functio ) const prepend = (todo: Todo.Todo) => Ref.update(todos, Chunk.prepend(todo)) + const replace = (index: number, todo: Todo.Todo) => Ref.update(todos, Chunk.replace(index, todo)) const remove = (index: number) => Ref.update(todos, Chunk.remove(index)) // const moveUp = (index: number) => Effect.gen(function*() { @@ -59,6 +63,7 @@ export const make = (key: string) => Layer.effect(TodosState, Effect.gen(functio readFromLocalStorage, saveToLocalStorage, prepend, + replace, remove, } })) diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx new file mode 100644 index 0000000..c454ff0 --- /dev/null +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -0,0 +1,52 @@ +import { Todo } from "@/domain" +import { Box, Button, Card, Flex, TextArea } from "@radix-ui/themes" +import { Effect, Option } from "effect" +import { Reffuse } from "../reffuse" +import { TodosState } from "../services" + + +export function VNewTodo() { + + const runSync = Reffuse.useRunSync() + + const createEmptyTodo = Todo.generateUniqueID.pipe( + Effect.map(id => Todo.Todo.make({ + id, + content: "", + completedAt: Option.none(), + }, true)) + ) + + const todoRef = Reffuse.useRefFromEffect(createEmptyTodo) + const [todo, setTodo] = Reffuse.useRefState(todoRef) + + + return ( + + + +