From ddcd681ca455c5f4ab6e62a43461ee7b3895b0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 16:08:04 +0100 Subject: [PATCH] Provider refactoring --- packages/reffuse/src/ReffuseContext.ts | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 8f50a81..6467c68 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -1,4 +1,4 @@ -import { Array, Context, Effect, Layer, Runtime } from "effect" +import { Array, Context, Effect, Layer, Ref, Runtime, Scope } from "effect" import * as React from "react" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -31,10 +31,27 @@ const makeProvider = (Context: React.Context>): ReactProvi return function ReffuseContextReactProvider(props) { const runtime = ReffuseRuntime.useRuntime() - const value = React.useMemo(() => Effect.context().pipe( - Effect.provide(props.layer), + const makeScopeAndContext = React.useMemo(() => Scope.make().pipe( + Effect.flatMap(scope => Effect.context().pipe( + Effect.map(context => [scope, context] as const), + + Effect.provide(props.layer), + Effect.provideService(Scope.Scope, scope), + )) + ), [props.layer]) + + const [initialScope, initialValue, isInitialRun] = React.useMemo(() => makeScopeAndContext.pipe( + Effect.flatMap(v => Ref.make(true).pipe( + Effect.map(isInitialRun => [...v, isInitialRun] as const) + )), Runtime.runSync(runtime), - ), [props.layer, runtime]) + ), []) + + const [value, setValue] = React.useState(initialValue) + + React.useEffect(() => { + + }, []) return React.createElement(Context, { ...props, value }) }