From d1ba4148f2b6314b2131d58430a0250972838904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 11 Apr 2025 02:10:21 +0200 Subject: [PATCH] useRefsState work --- packages/reffuse/src/ReffuseHelpers.ts | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 3cc3adf..737661e 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -410,6 +410,38 @@ export abstract class ReffuseHelpers { return [reactStateValue, setValue] } + useRefsState< + Refs extends { [K in keyof Refs]: SubscriptionRef.SubscriptionRef }, + R, + >( + this: ReffuseHelpers, + refs: Refs, + ): { + [K in keyof Refs]: readonly [ + Effect.Effect, + React.Dispatch>>, + ] + } { + const initialState = this.useMemo(() => Effect.Do.pipe( + Effect.bindAll(() => refs) + ), [], { doNotReExecuteOnRuntimeOrContextChange: true }) + + const [reactStateValue, setReactStateValue] = React.useState(initialState) + + this.useFork(() => Stream.runForEach( + Stream.changesWith(ref.changes, (x, y) => x === y), + v => Effect.sync(() => setReactStateValue(v)), + ), [ref]) + + const setValue = this.useCallbackSync((setStateAction: React.SetStateAction) => + Ref.update(ref, prevState => + SetStateAction.value(setStateAction, prevState) + ), + [ref]) + + return [reactStateValue, setValue] + } + useStreamFromValues( this: ReffuseHelpers, values: A,