History

Keep stale data rendered while a refresh is waiting

Rhys Sullivan committed 4 months ago

Commit 8841d311 parent cc34a0d2 files · +13 −3Browse files

Unified · Split

2 files
  1. packages/react/src/lib/async-result.test.ts +8 −2
  2. packages/react/src/lib/async-result.ts +5 −1
packages/react/src/lib/async-result.test.ts+8−2
@@ -5,14 +5,20 @@ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"; · 4 unmodified lines
55 import { isAsyncResultLoading } from "./async-result";
66
77 describe("isAsyncResultLoading", () => {
8− it("treats initial and waiting async results as loading", () => {
8+ it("treats initial and waiting-without-value async results as loading", () => {
99 expect(isAsyncResultLoading(AsyncResult.initial())).toBe(true);
1010 expect(isAsyncResultLoading(AsyncResult.initial(true))).toBe(true);
11− expect(isAsyncResultLoading(AsyncResult.success(["cached"], { waiting: true }))).toBe(true);
11+ expect(isAsyncResultLoading(AsyncResult.failure(Cause.fail("boom"), { waiting: true }))).toBe(
12+ true,
13+ );
1214 });
1315
1416 it("does not treat settled success or failure as loading", () => {
1517 expect(isAsyncResultLoading(AsyncResult.success(["ready"]))).toBe(false);
1618 expect(isAsyncResultLoading(AsyncResult.failure(Cause.fail("boom")))).toBe(false);
1719 });
20+
21+ it("keeps stale values rendered while a refresh is waiting", () => {
22+ expect(isAsyncResultLoading(AsyncResult.success(["cached"], { waiting: true }))).toBe(false);
23+ });
1824 });
packages/react/src/lib/async-result.ts+5−1
@@ -1,5 +1,9 @@
11 import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
2+import * as Option from "effect/Option";
23
34 export function isAsyncResultLoading<A, E>(result: AsyncResult.AsyncResult<A, E>): boolean {
4− return AsyncResult.isInitial(result) || AsyncResult.isWaiting(result);
5+ return (
6+ AsyncResult.isInitial(result) ||
7+ (AsyncResult.isWaiting(result) && Option.isNone(AsyncResult.value(result)))
8+ );
59 }