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
5import { isAsyncResultLoading } from "./async-result";5import { isAsyncResultLoading } from "./async-result";
6 6
7describe("isAsyncResultLoading", () => {7describe("isAsyncResultLoading", () => {
8 it("treats initial and waiting async results as loading", () => {8 it("treats initial and waiting-without-value async results as loading", () => {
9 expect(isAsyncResultLoading(AsyncResult.initial())).toBe(true);9 expect(isAsyncResultLoading(AsyncResult.initial())).toBe(true);
10 expect(isAsyncResultLoading(AsyncResult.initial(true))).toBe(true);10 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 );
12 });14 });
13 15
14 it("does not treat settled success or failure as loading", () => {16 it("does not treat settled success or failure as loading", () => {
15 expect(isAsyncResultLoading(AsyncResult.success(["ready"]))).toBe(false);17 expect(isAsyncResultLoading(AsyncResult.success(["ready"]))).toBe(false);
16 expect(isAsyncResultLoading(AsyncResult.failure(Cause.fail("boom")))).toBe(false);18 expect(isAsyncResultLoading(AsyncResult.failure(Cause.fail("boom")))).toBe(false);
17 });19 });
20
21 it("keeps stale values rendered while a refresh is waiting", () => {
22 expect(isAsyncResultLoading(AsyncResult.success(["cached"], { waiting: true }))).toBe(false);
23 });
18});24});
packages/react/src/lib/async-result.ts+5−1
@@ -1,5 +1,9 @@
1import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";1import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
2import * as Option from "effect/Option";
2 3
3export function isAsyncResultLoading<A, E>(result: AsyncResult.AsyncResult<A, E>): boolean {4export 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 );
5}9}