From a1703aae37afdaa8512be5b0b8edfcef8af1a545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 21 Jan 2025 03:46:41 +0100 Subject: [PATCH] useMemoScoped --- packages/reffuse/src/Reffuse.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 9e3b4cc..597c8b5 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -133,6 +133,29 @@ export class Reffuse { ]) } + useMemoScoped( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): A { + const runSync = this.useRunSync() + + const initialValue = React.useMemo(() => runSync(Effect.scoped(effect)), []) + const [value, setValue] = React.useState(initialValue) + + React.useEffect(() => { + const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) + setValue(runSync(Effect.provideService(effect, Scope.Scope, scope))) + + return () => { runSync(Scope.close(scope, Exit.void)) } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...(deps ?? []), + ]) + + return value + } + /** * Reffuse equivalent to `React.useEffect`. *