diff --git a/packages/core/src/bind/connectObservable.test.tsx b/packages/core/src/bind/connectObservable.test.tsx index 5dbe080..be053fc 100644 --- a/packages/core/src/bind/connectObservable.test.tsx +++ b/packages/core/src/bind/connectObservable.test.tsx @@ -315,6 +315,43 @@ describe("connectObservable", () => { expect(screen.queryByText("Waiting")).toBeNull() }) + it("doesn't enter suspense if the observable emits a promise", async () => { + const subject$ = new Subject>() + const [usePromise, promise$] = bind(subject$, null) + const Result: React.FC = () => { + const value = usePromise() + return ( +
+ {value === null + ? "default" + : value instanceof Promise + ? "promise" + : "wtf?"} +
+ ) + } + + const TestSuspense: React.FC = () => { + return ( +
+ Waiting}> + + +
+ ) + } + + render() + + expect(screen.queryByText("Waiting")).toBeNull() + expect(screen.queryByText("default")).not.toBeNull() + + act(() => subject$.next(new Promise(() => {}))) + + expect(screen.queryByText("Waiting")).toBeNull() + expect(screen.queryByText("promise")).not.toBeNull() + }) + it("correctly unsubscribes when the Subscribe component gets unmounted", async () => { const subject$ = new Subject() const [useNumber, number$] = bind(subject$.pipe(scan((a) => a + 1, 0))) diff --git a/packages/core/src/useStateObservable.ts b/packages/core/src/useStateObservable.ts index 3a87898..30bc58b 100644 --- a/packages/core/src/useStateObservable.ts +++ b/packages/core/src/useStateObservable.ts @@ -2,6 +2,7 @@ import { DefaultedStateObservable, liftSuspense, StateObservable, + StatePromise, SUSPENSE, } from "@rx-state/core" import { useRef, useState } from "react" @@ -25,7 +26,7 @@ export const useStateObservable = ( if (!callbackRef.current) { const getValue = (src: StateObservable) => { const result = src.getValue() - if (result instanceof Promise) throw result + if (result instanceof StatePromise) throw result return result as any }