From 9ff34addcd7f3cdc3a338c51e9f9347f7c475346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 15 Jan 2025 23:22:43 +0100 Subject: [PATCH] useEffect scope --- packages/example/src/routes/index.tsx | 7 ++++++- packages/reffuse/src/Reffuse.ts | 11 +++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/example/src/routes/index.tsx b/packages/example/src/routes/index.tsx index 6de5c78..91f6a3e 100644 --- a/packages/example/src/routes/index.tsx +++ b/packages/example/src/routes/index.tsx @@ -1,9 +1,10 @@ +import { Reffuse } from "@/reffuse" 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 { Console, Effect, Layer } from "effect" import { useMemo } from "react" @@ -17,6 +18,10 @@ function Index() { Layer.provideMerge(TodosState.make("todos")) ), []) + Reffuse.useEffect(Effect.addFinalizer(() => Console.log("Effect cleanup")).pipe( + Effect.flatMap(() => Console.log("Effect recalculated")) + )) + return ( diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 1d7b3d3..8c52a14 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,4 +1,4 @@ -import { Context, Effect, Fiber, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Context, Effect, Exit, Fiber, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -75,7 +75,14 @@ export class Reffuse { ): void { const runSync = this.useRunSync() - return React.useEffect(() => { runSync(Effect.scoped(effect)) }, [ + return React.useEffect(() => { + const scope = Scope.make().pipe( + Effect.tap(scope => Scope.use(effect, scope)), + runSync, + ) + + return () => runSync(Scope.close(scope, Exit.void)) + }, [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], ...(deps ?? []), ])