Skip to content

Commit de28254

Browse files
authored
fix: useInfiniteQuery suspense bug (TanStack#2119)
* fix useInfiniteQuery suspense bug * real fix * move fix to infiniteQueryObserver
1 parent 2050773 commit de28254

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

src/core/infiniteQueryObserver.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,21 @@ export class InfiniteQueryObserver<
7575
})
7676
}
7777

78+
getOptimisticResult(
79+
options: InfiniteQueryObserverOptions<
80+
TQueryFnData,
81+
TError,
82+
TData,
83+
TQueryData
84+
>
85+
): InfiniteQueryObserverResult<TData, TError> {
86+
options.behavior = infiniteQueryBehavior()
87+
return super.getOptimisticResult(options) as InfiniteQueryObserverResult<
88+
TData,
89+
TError
90+
>
91+
}
92+
7893
fetchNextPage(
7994
options?: FetchNextPageOptions
8095
): Promise<InfiniteQueryObserverResult<TData, TError>> {

src/react/tests/suspense.test.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,20 @@ describe("useQuery's in Suspense mode", () => {
7272
const states: UseInfiniteQueryResult<number>[] = []
7373

7474
function Page() {
75+
const [multiplier, setMultiplier] = React.useState(1)
7576
const state = useInfiniteQuery(
76-
key,
77-
({ pageParam = 0 }) => Number(pageParam),
77+
`${key}_${multiplier}`,
78+
({ pageParam = 1 }) => Number(pageParam * multiplier),
7879
{
7980
suspense: true,
8081
getNextPageParam: lastPage => lastPage + 1,
8182
}
8283
)
8384
states.push(state)
84-
return null
85+
return <button onClick={() => setMultiplier(2)}>next</button>
8586
}
8687

87-
renderWithClient(
88+
const rendered = renderWithClient(
8889
queryClient,
8990
<React.Suspense fallback="loading">
9091
<Page />
@@ -95,7 +96,16 @@ describe("useQuery's in Suspense mode", () => {
9596

9697
expect(states.length).toBe(1)
9798
expect(states[0]).toMatchObject({
98-
data: { pages: [0], pageParams: [undefined] },
99+
data: { pages: [1], pageParams: [undefined] },
100+
status: 'success',
101+
})
102+
103+
fireEvent.click(rendered.getByText('next'))
104+
await sleep(10)
105+
106+
expect(states.length).toBe(3)
107+
expect(states[2]).toMatchObject({
108+
data: { pages: [2], pageParams: [undefined] },
99109
status: 'success',
100110
})
101111
})

0 commit comments

Comments
 (0)