diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 19a4748..f09baa6 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -17,8 +17,9 @@ export class Reffuse< runtime: Runtime.Runtime, parent?: Reffuse, ) { - // TODO: split into makeProvider and makeScopedProvider - this.Provider = ReffuseReactContext.makeProvider(runtime, this.Context, parent) + this.Provider = parent + ? ReffuseReactContext.makeNestedProvider(runtime, this.Context, parent) + : ReffuseReactContext.makeRootProvider(runtime, this.Context) } diff --git a/packages/reffuse/src/ReffuseReactContext.tsx b/packages/reffuse/src/ReffuseReactContext.tsx index dee25a0..a712014 100644 --- a/packages/reffuse/src/ReffuseReactContext.tsx +++ b/packages/reffuse/src/ReffuseReactContext.tsx @@ -24,7 +24,29 @@ export interface ProviderProps< readonly children?: React.ReactNode } -export function makeProvider< +export function makeRootProvider( + runtime: Runtime.Runtime, + ReactContext: React.Context>, +): Provider { + return function ReffuseRootReactContextProvider(props) { + const value = React.useMemo(() => ({ + runtime, + context: Effect.context().pipe( + Effect.provide(props.layer), + Runtime.runSync(runtime), + ), + }), [props.layer]) + + return ( + + ) + } +} + +export function makeNestedProvider< RuntimeR, ContextR extends ParentContextR | OwnContextR, OwnContextR, @@ -32,43 +54,25 @@ export function makeProvider< >( runtime: Runtime.Runtime, ReactContext: React.Context>, - parent?: Reffuse.Reffuse, + parent: Reffuse.Reffuse, ): Provider { - return parent - ? function ReffuseReactContextProvider(props) { - const parentContext = parent.useContext() + return function ReffuseNestedReactContextProvider(props) { + const parentContext = parent.useContext() - const value = React.useMemo(() => ({ - runtime, - context: Effect.context().pipe( - Effect.provide(props.layer), - Effect.provide(parentContext), - Runtime.runSync(runtime), - ), - }), [props.layer, parentContext]) + const value = React.useMemo(() => ({ + runtime, + context: Effect.context().pipe( + Effect.provide(props.layer), + Effect.provide(parentContext), + Runtime.runSync(runtime), + ), + }), [props.layer, parentContext]) - return ( - - ) - } - : function ReffuseReactContextProvider(props) { - const value = React.useMemo(() => ({ - runtime, - context: Effect.context().pipe( - Effect.provide(props.layer), - Effect.provide(Context.empty() as Context.Context), // Required for type safety - Runtime.runSync(runtime), - ), - }), [props.layer]) - - return ( - - ) - } + return ( + + ) + } }