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 {