From 3813e6398272b42b0103a6a1d61c95c2f46e74ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 15 Jan 2025 20:09:00 +0100 Subject: [PATCH] Todo work --- bun.lockb | Bin 135736 -> 138480 bytes bunfig.toml | 2 + packages/example/package.json | 5 ++ packages/example/src/domain/Todo.ts | 19 ++++++ packages/example/src/domain/index.ts | 1 + packages/example/src/routes/index.tsx | 24 +++---- packages/example/src/todos/reffuse.ts | 8 +++ .../example/src/todos/services/TodosState.ts | 64 ++++++++++++++++++ packages/example/src/todos/services/index.ts | 1 + packages/example/src/todos/views/VTodo.tsx | 21 ++++++ packages/example/src/todos/views/VTodos.tsx | 21 ++++++ 11 files changed, 153 insertions(+), 13 deletions(-) create mode 100644 bunfig.toml create mode 100644 packages/example/src/domain/Todo.ts create mode 100644 packages/example/src/todos/reffuse.ts create mode 100644 packages/example/src/todos/services/TodosState.ts create mode 100644 packages/example/src/todos/services/index.ts create mode 100644 packages/example/src/todos/views/VTodo.tsx create mode 100644 packages/example/src/todos/views/VTodos.tsx diff --git a/bun.lockb b/bun.lockb index 8da25e415c9c6f20f454a380650b7ada14e3c489..977532e85bc2e3abf6b28d66d9ba7073c8df4126 100755 GIT binary patch delta 26508 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 H30?Vrw7*I! delta 25244 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⪙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 diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 0000000..4fe1e6e --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,2 @@ +[install.scopes] +"@thilawyn" = "https://git.valverde.cloud/api/packages/thilawyn/npm/" diff --git a/packages/example/package.json b/packages/example/package.json index eb4afd7..f9c93b6 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -14,6 +14,7 @@ "@tanstack/react-router": "^1.95.3", "@tanstack/router-devtools": "^1.95.3", "@tanstack/router-plugin": "^1.95.3", + "@thilawyn/thilaschema": "^0.1.4", "@types/react": "^19.0.4", "@types/react-dom": "^19.0.2", "@vitejs/plugin-react": "^4.3.4", @@ -30,5 +31,9 @@ "typescript": "~5.6.2", "typescript-eslint": "^8.18.2", "vite": "^6.0.5" + }, + "dependencies": { + "@effect/platform": "^0.73.1", + "@effect/platform-browser": "^0.52.1" } } diff --git a/packages/example/src/domain/Todo.ts b/packages/example/src/domain/Todo.ts new file mode 100644 index 0000000..5eb8474 --- /dev/null +++ b/packages/example/src/domain/Todo.ts @@ -0,0 +1,19 @@ +import { ThSchema } from "@thilawyn/thilaschema" +import { Schema } from "effect" + + +export class Todo extends Schema.Class("Todo")({ + id: Schema.String, + content: Schema.String, + completedAt: Schema.DateTimeUtcFromSelf, +}) {} + + +export const TodoFromJsonStruct = Schema.Struct({ + ...Todo.fields, + completedAt: Schema.DateTimeUtc, +}).pipe( + ThSchema.assertEncodedJsonifiable +) + +export const TodoFromJson = TodoFromJsonStruct.pipe(Schema.compose(Todo)) diff --git a/packages/example/src/domain/index.ts b/packages/example/src/domain/index.ts index a099a8a..4bf1f83 100644 --- a/packages/example/src/domain/index.ts +++ b/packages/example/src/domain/index.ts @@ -1 +1,2 @@ export * as Post from "./Post" +export * as Todo from "./Todo" diff --git a/packages/example/src/routes/index.tsx b/packages/example/src/routes/index.tsx index c955348..8e2bdad 100644 --- a/packages/example/src/routes/index.tsx +++ b/packages/example/src/routes/index.tsx @@ -1,10 +1,9 @@ -import { Reffuse } from "@/reffuse" -import { FetchData } from "@/services" -import { PostsContext } from "@/views/posts/reffuse" -import { PostsState } from "@/views/posts/services" -import { VPosts } from "@/views/posts/VPosts" +import { TodosContext } from "@/todos/reffuse" +import { TodosState } from "@/todos/services" +import { VTodos } from "@/todos/views/VTodos" import { createFileRoute } from "@tanstack/react-router" -import { Effect } from "effect" +import { Layer } from "effect" +import { useMemo } from "react" export const Route = createFileRoute("/")({ @@ -13,17 +12,16 @@ export const Route = createFileRoute("/")({ function Index() { - const postsLayer = Reffuse.useMemo(FetchData.FetchData.pipe( - Effect.flatMap(({ fetchPosts }) => fetchPosts), - Effect.map(PostsState.make), - )) + const todosLayer = useMemo(() => Layer.empty.pipe( + Layer.provideMerge(TodosState.make("todos")) + ), []) return (

- - - + + +
) diff --git a/packages/example/src/todos/reffuse.ts b/packages/example/src/todos/reffuse.ts new file mode 100644 index 0000000..47b83d1 --- /dev/null +++ b/packages/example/src/todos/reffuse.ts @@ -0,0 +1,8 @@ +import { GlobalContext } from "@/reffuse" +import { ReffuseContext } from "@thilawyn/reffuse" +import { make } from "@thilawyn/reffuse/Reffuse" +import { TodosState } from "./services" + + +export const TodosContext = ReffuseContext.make() +export const Reffuse = make(GlobalContext, TodosContext) diff --git a/packages/example/src/todos/services/TodosState.ts b/packages/example/src/todos/services/TodosState.ts new file mode 100644 index 0000000..e683ddb --- /dev/null +++ b/packages/example/src/todos/services/TodosState.ts @@ -0,0 +1,64 @@ +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" + + +export class TodosState extends Context.Tag("TodosState")> + + readonly readFromLocalStorage: Effect.Effect + readonly saveToLocalStorage: Effect.Effect + + readonly prepend: (todo: Todo.Todo) => Effect.Effect + readonly remove: (index: number) => Effect.Effect + // readonly moveUp: (index: number) => Effect.Effect + // readonly moveDown: (index: number) => Effect.Effect +}>() {} + + +export const make = (key: string) => Layer.effect(TodosState, Effect.gen(function*() { + const todos = yield* SubscriptionRef.make(Chunk.empty()) + + const readFromLocalStorage = KeyValueStore.KeyValueStore.pipe( + Effect.flatMap(kv => kv.get(key)), + Effect.flatMap(identity), + Effect.flatMap(Schema.parseJson().pipe( + Schema.compose(Schema.Chunk(Todo.TodoFromJson)), + Schema.decode, + )), + Effect.flatMap(v => Ref.set(todos, v)), + + Effect.provide(BrowserKeyValueStore.layerLocalStorage), + ) + + const saveToLocalStorage = Effect.all([KeyValueStore.KeyValueStore, todos]).pipe( + Effect.flatMap(([kv, values]) => values.pipe( + Schema.parseJson().pipe( + Schema.compose(Schema.Chunk(Todo.TodoFromJson)), + Schema.encode, + ), + Effect.flatMap(v => kv.set(key, v)), + )), + + Effect.provide(BrowserKeyValueStore.layerLocalStorage), + ) + + const prepend = (todo: Todo.Todo) => Ref.update(todos, Chunk.prepend(todo)) + const remove = (index: number) => Ref.update(todos, Chunk.remove(index)) + + // const moveUp = (index: number) => Effect.gen(function*() { + + // }) + + yield* readFromLocalStorage + + return { + todos, + readFromLocalStorage, + saveToLocalStorage, + prepend, + remove, + } +})) diff --git a/packages/example/src/todos/services/index.ts b/packages/example/src/todos/services/index.ts new file mode 100644 index 0000000..5d1c39e --- /dev/null +++ b/packages/example/src/todos/services/index.ts @@ -0,0 +1 @@ +export * as TodosState from "./TodosState" diff --git a/packages/example/src/todos/views/VTodo.tsx b/packages/example/src/todos/views/VTodo.tsx new file mode 100644 index 0000000..b34c96a --- /dev/null +++ b/packages/example/src/todos/views/VTodo.tsx @@ -0,0 +1,21 @@ +import { Todo } from "@/domain" +import { Reffuse } from "../reffuse" + + +export interface VTodoProps { + readonly index: number + readonly todo: Todo.Todo +} + +export function VTodo({ index, todo }: VTodoProps) { + + const runSync = Reffuse.useRunSync() + + + return ( +
+ +
+ ) + +} diff --git a/packages/example/src/todos/views/VTodos.tsx b/packages/example/src/todos/views/VTodos.tsx new file mode 100644 index 0000000..b3cb2c6 --- /dev/null +++ b/packages/example/src/todos/views/VTodos.tsx @@ -0,0 +1,21 @@ +import { Effect, Stream } from "effect" +import { Reffuse } from "../reffuse" +import { TodosState } from "../services" + + +export function VTodos() { + + // Sync changes to the todos with the local storage + Reffuse.useFork(TodosState.TodosState.pipe( + Effect.flatMap(state => + Stream.runForEach(state.todos, () => state.saveToLocalStorage) + ) + )) + + const todosRef = Reffuse.useMemo(TodosState.TodosState.pipe(Effect.map(state => state.todos))) + const [todos] = Reffuse.useRefState(todosRef) + + + return <> + +}