diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 456f5c2..f3e3987 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -1,3 +1,5 @@ +import { FetchHttpClient } from "@effect/platform" +import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { createRouter, RouterProvider } from "@tanstack/react-router" import { ReffuseRuntime } from "@thilawyn/reffuse" import { Layer } from "effect" @@ -7,7 +9,12 @@ import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" -const layer = Layer.empty +const layer = Layer.empty.pipe( + Layer.provideMerge(Clipboard.layer), + Layer.provideMerge(Geolocation.layer), + Layer.provideMerge(Permissions.layer), + Layer.provideMerge(FetchHttpClient.layer), +) const router = createRouter({ routeTree }) diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index c499743..beba3d3 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -1,5 +1,13 @@ +import { HttpClient } from "@effect/platform" +import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { Reffuse, ReffuseContext } from "reffuse" -export const GlobalContext = ReffuseContext.make() +export const GlobalContext = ReffuseContext.make< + | Clipboard.Clipboard + | Geolocation.Geolocation + | Permissions.Permissions + | HttpClient.HttpClient +>() + export const R = Reffuse.make(GlobalContext) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 4915b94..f3a95fa 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -2,6 +2,7 @@ import { Context, Effect, ExecutionStrategy, Exit, Fiber, Option, Ref, Runtime, import React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" +import * as SetStateAction from "./SetStateAction.js" export class Reffuse { @@ -271,9 +272,7 @@ export class Reffuse { const setValue = React.useCallback((setStateAction: React.SetStateAction) => runSync(Ref.update(ref, previousState => - typeof setStateAction === "function" - ? (setStateAction as (prevState: A) => A)(previousState) - : setStateAction + SetStateAction.get(setStateAction, previousState) )), [ref]) diff --git a/packages/reffuse/src/SetStateAction.ts b/packages/reffuse/src/SetStateAction.ts new file mode 100644 index 0000000..5f42d7b --- /dev/null +++ b/packages/reffuse/src/SetStateAction.ts @@ -0,0 +1,12 @@ +import { Function } from "effect" +import type React from "react" + + +export const get: { + (prevState: S): (setStateAction: React.SetStateAction) => S + (setStateAction: React.SetStateAction, prevState: S): S +} = Function.dual(2, (self: React.SetStateAction, prevState: S): S => + typeof self === "function" + ? (self as (prevState: S) => S)(prevState) + : prevState +) diff --git a/packages/reffuse/src/index.ts b/packages/reffuse/src/index.ts index f73c43c..01c00cb 100644 --- a/packages/reffuse/src/index.ts +++ b/packages/reffuse/src/index.ts @@ -1,3 +1,4 @@ export * as Reffuse from "./Reffuse.js" export * as ReffuseContext from "./ReffuseContext.js" export * as ReffuseRuntime from "./ReffuseRuntime.js" +export * as SetStateAction from "./SetStateAction.js"