diff --git a/.changeset/fix-setwindow-promises.md b/.changeset/fix-setwindow-promises.md new file mode 100644 index 000000000..5cf337e8a --- /dev/null +++ b/.changeset/fix-setwindow-promises.md @@ -0,0 +1,5 @@ +--- +"@tanstack/react-db": patch +--- + +fix(react-db): handle rejected/stale setWindow promises in useLiveInfiniteQuery diff --git a/packages/react-db/src/useLiveInfiniteQuery.ts b/packages/react-db/src/useLiveInfiniteQuery.ts index 0351c6d0c..360505c2d 100644 --- a/packages/react-db/src/useLiveInfiniteQuery.ts +++ b/packages/react-db/src/useLiveInfiniteQuery.ts @@ -233,6 +233,7 @@ export function useLiveInfiniteQuery( if (!isCollection && !queryResult.isReady) return // Adjust the window + let cancelled = false const result = utils.setWindow({ offset: expectedOffset, limit: expectedLimit, @@ -240,12 +241,23 @@ export function useLiveInfiniteQuery( if (result !== true) { setIsFetchingNextPage(true) - result.then(() => { - setIsFetchingNextPage(false) - }) + result + .then(() => { + if (!cancelled) setIsFetchingNextPage(false) + }) + .catch((error: unknown) => { + if (!cancelled) { + setIsFetchingNextPage(false) + console.error(`useLiveInfiniteQuery: setWindow failed:`, error) + } + }) } else { setIsFetchingNextPage(false) } + + return () => { + cancelled = true + } }, [ isCollection, queryResult.collection,