From 80d770822763ae51ea4851cd4111ef4e56f73b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Oliva?= Date: Tue, 30 Aug 2022 10:12:01 +0200 Subject: [PATCH] Fix observable of promises triggering suspense --- .../core/src/bind/connectObservable.test.tsx | 37 +++++++++++++++++++ packages/core/src/useStateObservable.ts | 3 +- 2 files changed, 39 insertions(+), 1 deletion(-) 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 }