diff --git a/packages/reffuse/src/ReffuseContext.tsx b/packages/reffuse/src/ReffuseContext.tsx index ad281ac..caf5a2a 100644 --- a/packages/reffuse/src/ReffuseContext.tsx +++ b/packages/reffuse/src/ReffuseContext.tsx @@ -1,47 +1,52 @@ -import { Context, Effect, Layer } from "effect" +import { Context, Effect, Layer, Runtime } from "effect" import React from "react" +import * as ReffuseRuntime from "./ReffuseRuntime.js" -export interface ReffuseContext { - readonly Context: React.Context> +export class ReffuseContext { + + readonly Context = React.createContext>(null!) readonly Provider: ReffuseContextReactProvider + + constructor() { + this.Provider = (props) => { + const runtime = ReffuseRuntime.use() + + const value = React.useMemo(() => Effect.context().pipe( + Effect.provide(props.layer), + Runtime.runSync(runtime), + ), [runtime, props.layer]) + + return ( + + ) + } + this.Provider.displayName = "ReffuseContextReactProvider" + } + + + use(): Context.Context { + return React.useContext(this.Context) + } + + useLayer(): Layer.Layer { + const context = this.use() + return React.useMemo(() => Layer.effectContext(Effect.succeed(context)), [context]) + } + } export type ReffuseContextReactProvider = React.FC<{ - readonly layer: Layer.Layer + readonly layer: Layer.Layer readonly children?: React.ReactNode }> export type R = T extends ReffuseContext ? R : never -export function make(): ReffuseContext { - const Context = React.createContext>(null!) - - return { - Context, - - Provider: function ReffuseContextReactProvider(props) { - return ( - - ) - }, - } +export function make() { + return new ReffuseContext() } - - -declare const MyService1: ReturnType> -declare const MyService2: ReturnType> - -declare const Context1: Context.Context -declare const Context2: Context.Context - -declare const MyService3: ReturnType> -declare const MyService3Live: Layer.Layer - - -const res = MyService3Live.pipe( - Layer.provide(Layer.effectContext(Effect.succeed(Context1))) -) diff --git a/packages/reffuse/src/ReffuseRuntime.ts b/packages/reffuse/src/ReffuseRuntime.ts deleted file mode 100644 index e987872..0000000 --- a/packages/reffuse/src/ReffuseRuntime.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { Runtime } from "effect" -import React from "react" - - -export interface ReffuseRuntime extends React.Context> {} diff --git a/packages/reffuse/src/ReffuseRuntime.tsx b/packages/reffuse/src/ReffuseRuntime.tsx new file mode 100644 index 0000000..7174597 --- /dev/null +++ b/packages/reffuse/src/ReffuseRuntime.tsx @@ -0,0 +1,15 @@ +import { Runtime } from "effect" +import React from "react" + + +export const Context = React.createContext>(null!) + +export const Provider = (props: { readonly children?: React.ReactNode }) => ( + +) +Provider.displayName = "ReffuseRuntimeReactProvider" + +export const use = () => React.useContext(Context)