useEffect scope
Some checks failed
Lint / lint (push) Failing after 10s

This commit is contained in:
Julien Valverdé
2025-01-15 23:22:43 +01:00
parent 010416f0b1
commit 9ff34addcd
2 changed files with 15 additions and 3 deletions

View File

@@ -1,9 +1,10 @@
import { Reffuse } from "@/reffuse"
import { TodosContext } from "@/todos/reffuse" import { TodosContext } from "@/todos/reffuse"
import { TodosState } from "@/todos/services" import { TodosState } from "@/todos/services"
import { VTodos } from "@/todos/views/VTodos" import { VTodos } from "@/todos/views/VTodos"
import { Container } from "@radix-ui/themes" import { Container } from "@radix-ui/themes"
import { createFileRoute } from "@tanstack/react-router" import { createFileRoute } from "@tanstack/react-router"
import { Layer } from "effect" import { Console, Effect, Layer } from "effect"
import { useMemo } from "react" import { useMemo } from "react"
@@ -17,6 +18,10 @@ function Index() {
Layer.provideMerge(TodosState.make("todos")) Layer.provideMerge(TodosState.make("todos"))
), []) ), [])
Reffuse.useEffect(Effect.addFinalizer(() => Console.log("Effect cleanup")).pipe(
Effect.flatMap(() => Console.log("Effect recalculated"))
))
return ( return (
<Container> <Container>

View File

@@ -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 React from "react"
import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseContext from "./ReffuseContext.js"
import * as ReffuseRuntime from "./ReffuseRuntime.js" import * as ReffuseRuntime from "./ReffuseRuntime.js"
@@ -75,7 +75,14 @@ export class Reffuse<R> {
): void { ): void {
const runSync = this.useRunSync() 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], ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync],
...(deps ?? []), ...(deps ?? []),
]) ])