From 6cf255eed852b2fa4077d4d1fa646143c7eee092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Oliva?= Date: Tue, 19 Sep 2023 11:43:57 +0200 Subject: [PATCH] kinda fixed? --- packages/context-state/src/subtree.test.ts | 4 +-- packages/context-state/src/subtree.ts | 37 ++++++++++++++++++---- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/context-state/src/subtree.test.ts b/packages/context-state/src/subtree.test.ts index 6623159..4715002 100644 --- a/packages/context-state/src/subtree.test.ts +++ b/packages/context-state/src/subtree.test.ts @@ -2,7 +2,7 @@ import { Subject } from "rxjs" import { describe, expect, it } from "vitest" import { createRoot } from "./create-root" import { substate } from "./substate" -import { subtree } from "./subtree" +import { activeObs$, subtree } from "./subtree" describe("subtree", () => { it("creates instances of another root", () => { @@ -28,7 +28,7 @@ describe("subtree", () => { const subnode$ = new Subject() const subnode = substate(mainRoot, () => subnode$) - const otherRootCopy = substate(subnode, (_, getObs$) => getObs$(otherRoot)) + const otherRootCopy = substate(subnode, () => activeObs$(otherRoot)) const otherRoot = createRoot().withTypes<{ value: string }>() subtree(subnode, (ctx) => otherRoot.run(null, { value: ctx(subnode) })) diff --git a/packages/context-state/src/subtree.ts b/packages/context-state/src/subtree.ts index 92d4ade..c3496db 100644 --- a/packages/context-state/src/subtree.ts +++ b/packages/context-state/src/subtree.ts @@ -1,10 +1,5 @@ -import { Observable } from "rxjs" -import { - NestedMap, - createStateNode, - getInternals, - trackParentChanges, -} from "./internal" +import { Observable, defer, filter, switchMap, take } from "rxjs" +import { NestedMap, getInternals, trackParentChanges } from "./internal" import { GetObservableFn, GetValueFn, @@ -57,3 +52,31 @@ export function subtree( onRemoved: teardown, }) } + +export function activeObs$(node: StateNode): Observable +export function activeObs$( + node: StateNode, + key: K, +): Observable +export function activeObs$( + node: StateNode, + key: K = {} as any, +): Observable { + const internalNode = getInternals(node) + + return defer(() => { + try { + return internalNode.getInstance(key).getState$() + } catch (ex) { + return internalNode.instanceChange$.pipe( + filter( + (change) => + change.type === "ready" && + internalNode.keysOrder.every((k) => change.key[k] === key[k]), + ), + take(1), + switchMap(() => node.getState$(key)), + ) + } + }) +}