diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index def5d5c..a2a073d 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -11,11 +11,7 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const deepRef = R.useRef({ value: "poulet" }) - const deepValueRef = R.useSubRefFromGetSet( - deepRef, - b => b.value, - (b, a) => ({ ...b, value: a }), - ) + const deepValueRef = R.useSubRefFromPath(deepRef, ["value"]) // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( // Effect.andThen(makeUuid4), diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 1ad1d10..98e80e3 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -2,7 +2,7 @@ import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -import { SetStateAction, SubscriptionSubRef } from "./types/index.js" +import { PropertyPath, SetStateAction, SubscriptionSubRef } from "./types/index.js" export interface RenderOptions { @@ -396,6 +396,17 @@ export abstract class ReffuseNamespace { ) } + useSubRefFromPath, R>( + this: ReffuseNamespace, + parent: SubscriptionRef.SubscriptionRef, + path: P, + ): SubscriptionSubRef.SubscriptionSubRef, B> { + return React.useMemo( + () => SubscriptionSubRef.makeFromPath(parent, path), + [parent], + ) + } + useSubscribeRefs< const Refs extends readonly SubscriptionRef.SubscriptionRef[], R,