From 6d3361f399318e4b14e01b3395d829af5ef38360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 11 Aug 2025 12:57:38 +0200 Subject: [PATCH] useContext refactoring --- packages/effect-fc/src/hooks/Hooks/useContext.ts | 14 ++++++++------ packages/example/src/todo/TodosState.service.ts | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/effect-fc/src/hooks/Hooks/useContext.ts b/packages/effect-fc/src/hooks/Hooks/useContext.ts index e334b5d..16516de 100644 --- a/packages/effect-fc/src/hooks/Hooks/useContext.ts +++ b/packages/effect-fc/src/hooks/Hooks/useContext.ts @@ -1,4 +1,4 @@ -import { type Context, Effect, type Layer, Scope } from "effect" +import { type Context, Effect, Layer, ManagedRuntime, Scope } from "effect" import type { ScopeOptions } from "./ScopeOptions.js" import { useMemo } from "./useMemo.js" import { useScope } from "./useScope.js" @@ -8,16 +8,18 @@ export const useContext: { ( layer: Layer.Layer, options?: ScopeOptions, - ): Effect.Effect, E, Exclude> + ): Effect.Effect, E, RIn> } = Effect.fnUntraced(function* ( layer: Layer.Layer, options?: ScopeOptions, ) { const scope = yield* useScope([layer], options) - return yield* useMemo(() => Effect.provideService( - Effect.provide(Effect.context(), layer), - Scope.Scope, - scope, + return yield* useMemo(() => Effect.context().pipe( + Effect.map(context => ManagedRuntime.make(Layer.provide(layer, Layer.succeedContext(context)))), + Effect.tap(runtime => Effect.addFinalizer(() => runtime.disposeEffect)), + Effect.andThen(runtime => runtime.runtimeEffect), + Effect.andThen(runtime => runtime.context), + Effect.provideService(Scope.Scope, scope), ), [scope]) }) diff --git a/packages/example/src/todo/TodosState.service.ts b/packages/example/src/todo/TodosState.service.ts index ce5d9b5..5b01c99 100644 --- a/packages/example/src/todo/TodosState.service.ts +++ b/packages/example/src/todo/TodosState.service.ts @@ -6,7 +6,7 @@ import { SubscriptionSubRef } from "effect-fc/types" export class TodosState extends Effect.Service()("TodosState", { - effect: Effect.fn("TodosState")(function*(key: string) { + scoped: Effect.fnUntraced(function*(key: string) { const kv = yield* KeyValueStore.KeyValueStore const readFromLocalStorage = Console.log("Reading todos from local storage...").pipe(