diff --git a/.changeset/thirty-parks-fall.md b/.changeset/thirty-parks-fall.md new file mode 100644 index 0000000..fee53d5 --- /dev/null +++ b/.changeset/thirty-parks-fall.md @@ -0,0 +1,5 @@ +--- +"solid-relay": patch +--- + +fix: consistently handle loading states across primitives diff --git a/src/primitives/createFragment.ts b/src/primitives/createFragment.ts index 9ead7ed..6f733de 100644 --- a/src/primitives/createFragment.ts +++ b/src/primitives/createFragment.ts @@ -35,7 +35,7 @@ type FragmentResult = | { data: undefined; error: undefined; - pending: true; + pending: boolean; }; /** diff --git a/src/primitives/createLazyLoadQuery.ts b/src/primitives/createLazyLoadQuery.ts index 10f0c55..165d5ef 100644 --- a/src/primitives/createLazyLoadQuery.ts +++ b/src/primitives/createLazyLoadQuery.ts @@ -49,7 +49,7 @@ type QueryResult = | { data: undefined; error: undefined; - pending: true; + pending: boolean; }; /** @@ -254,7 +254,7 @@ export function createLazyLoadQueryInternal(params { data: undefined, error: undefined, - pending: true, + pending: false, }, () => cacheEntry()?.resource, ); @@ -263,34 +263,47 @@ export function createLazyLoadQueryInternal(params batch(() => { setResult("data", undefined); setResult("error", undefined); - setResult("pending", true); - }); + setResult("pending", false); - const operation = params.query(); - const env = environment(); - if (!operation || !env) return; + const operation = params.query(); + const env = environment(); + if (!operation || !env) return; - const fragmentSubscription = observeFragment( - env, - params.fragment(), - getQueryRef(operation), - ).subscribe({ - next(state) { - batch(() => { - if (state.state === "ok") { - setResult("error", undefined); - setResult("pending", false); - setResult("data", reconcile(cleanSnapshot(state.value), { key: "__id", merge: true })); - } else if (state.state === "error") { - setResult("data", undefined); - setResult("error", state.error); - setResult("pending", false); - } - }); - }, - }); - onCleanup(() => { - fragmentSubscription.unsubscribe(); + setResult("pending", true); + + const fragmentSubscription = observeFragment( + env, + params.fragment(), + getQueryRef(operation), + ).subscribe({ + next(state) { + batch(() => { + switch (state.state) { + case "ok": + setResult("error", undefined); + setResult("pending", false); + setResult( + "data", + reconcile(cleanSnapshot(state.value), { key: "__id", merge: true }), + ); + break; + case "error": + setResult("data", undefined); + setResult("error", state.error); + setResult("pending", false); + break; + case "loading": + setResult("data", undefined); + setResult("error", undefined); + setResult("pending", true); + break; + } + }); + }, + }); + onCleanup(() => { + fragmentSubscription.unsubscribe(); + }); }); });