diff --git a/bun.lock b/bun.lock index 238d47b..5743f6a 100644 --- a/bun.lock +++ b/bun.lock @@ -45,6 +45,7 @@ "name": "@reffuse/extension-lazyref", "version": "0.1.0", "peerDependencies": { + "@typed/lazy-ref": "^0.3.3", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 16f34b6..8ca9de8 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -29,6 +29,7 @@ "clean:node": "rm -rf node_modules" }, "peerDependencies": { + "@typed/lazy-ref": "^0.3.3", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index e69de29..301509a 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -0,0 +1,29 @@ +import * as LazyRef from "@typed/lazy-ref" +import { Effect, Stream } from "effect" +import * as React from "react" +import { ReffuseExtension, ReffuseHelpers, SetStateAction } from "reffuse" + + +export const withLazyRef = ReffuseExtension.make(() => ({ + useLazyRefState( + this: ReffuseHelpers.ReffuseHelpers, + ref: LazyRef.LazyRef, + ): [A, React.Dispatch>] { + const runSync = this.useRunSync() + + const initialState = React.useMemo(() => runSync(ref), []) + const [reactStateValue, setReactStateValue] = React.useState(initialState) + + this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => + setReactStateValue(v) + )), [ref]) + + const setValue = React.useCallback((setStateAction: React.SetStateAction) => + runSync(LazyRef.update(ref, prevState => + SetStateAction.value(setStateAction, prevState) + )), + [ref]) + + return [reactStateValue, setValue] + }, +}))