From 03eca8a1af6c8d139c696f2333b784df2b1b4051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 23 Oct 2025 16:36:53 +0200 Subject: [PATCH] Fix useOnChange --- packages/effect-fc/src/Component.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index 641c7de..17e26ac 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -489,18 +489,28 @@ export const useOnMount: { return yield* React.useState(() => Runtime.runSync(runtime)(Effect.cached(f())))[0] }) +export namespace useOnChange { + export type Options = useScope.Options +} + export const useOnChange: { ( f: () => Effect.Effect, deps: React.DependencyList, - ): Effect.Effect + options?: useOnChange.Options, + ): Effect.Effect> } = Effect.fnUntraced(function* ( f: () => Effect.Effect, deps: React.DependencyList, + options?: useOnChange.Options, ) { - const runtime = yield* Effect.runtime() - // biome-ignore lint/correctness/useExhaustiveDependencies: use of React.DependencyList - return yield* React.useMemo(() => Runtime.runSync(runtime)(Effect.cached(f())), deps) + const runtime = yield* Effect.runtime>() + const scope = yield* useScope(deps, options) + + // biome-ignore lint/correctness/useExhaustiveDependencies: only reactive on "scope" + return yield* React.useMemo(() => Runtime.runSync(runtime)( + Effect.cached(Effect.provideService(f(), Scope.Scope, scope)) + ), [scope]) }) export namespace useReactEffect {