@tanstack/solid-query 4.24.10 → 5.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/index.js +300 -0
- package/build/cjs/index.js.map +1 -0
- package/build/esm/index.js +285 -0
- package/build/esm/index.js.map +1 -0
- package/build/source/QueryClientProvider.jsx +21 -0
- package/build/source/__tests__/QueryClientProvider.test.jsx +120 -0
- package/build/{solid → source}/__tests__/createInfiniteQuery.test.jsx +228 -372
- package/build/{solid → source}/__tests__/createMutation.test.jsx +174 -165
- package/build/{solid → source}/__tests__/createQueries.test.jsx +86 -367
- package/build/{solid → source}/__tests__/createQuery.test.jsx +991 -943
- package/build/{solid → source}/__tests__/createQuery.types.test.jsx +35 -24
- package/build/{solid → source}/__tests__/suspense.test.jsx +177 -148
- package/build/{solid → source}/__tests__/transition.test.jsx +7 -4
- package/build/{solid → source}/__tests__/useIsFetching.test.jsx +68 -85
- package/build/{solid → source}/__tests__/useIsMutating.test.jsx +78 -93
- package/build/{solid → source}/__tests__/utils.jsx +3 -9
- package/build/source/createBaseQuery.js +147 -0
- package/build/source/createInfiniteQuery.js +8 -0
- package/build/{solid → source}/createMutation.js +7 -9
- package/build/source/createQueries.js +32 -0
- package/build/source/createQuery.js +6 -0
- package/build/{solid → source}/index.js +5 -3
- package/build/source/setBatchUpdatesFn.js +3 -0
- package/build/source/useIsFetching.js +12 -0
- package/build/source/useIsMutating.js +12 -0
- package/build/source/utils.js +7 -0
- package/build/types/QueryClientProvider.d.ts +9 -0
- package/build/{lib → types}/__tests__/utils.d.ts +3 -8
- package/build/types/createBaseQuery.d.ts +4 -0
- package/build/types/createInfiniteQuery.d.ts +3 -0
- package/build/types/createMutation.d.ts +3 -0
- package/build/{lib → types}/createQueries.d.ts +10 -8
- package/build/types/createQuery.d.ts +11 -0
- package/build/{lib → types}/index.d.ts +4 -3
- package/build/types/setBatchUpdatesFn.d.ts +1 -0
- package/build/types/types.d.ts +33 -0
- package/build/types/useIsFetching.d.ts +8 -0
- package/build/types/useIsMutating.d.ts +8 -0
- package/build/types/utils.d.ts +1 -0
- package/build/umd/index.js +2 -0
- package/build/umd/index.js.map +1 -0
- package/package.json +25 -17
- package/src/QueryClientProvider.tsx +17 -86
- package/src/__tests__/QueryClientProvider.test.tsx +37 -140
- package/src/__tests__/createInfiniteQuery.test.tsx +277 -508
- package/src/__tests__/createMutation.test.tsx +177 -225
- package/src/__tests__/createQueries.test.tsx +180 -528
- package/src/__tests__/createQuery.test.tsx +970 -1200
- package/src/__tests__/createQuery.types.test.tsx +30 -25
- package/src/__tests__/suspense.test.tsx +141 -178
- package/src/__tests__/transition.test.tsx +7 -4
- package/src/__tests__/useIsFetching.test.tsx +77 -122
- package/src/__tests__/useIsMutating.test.tsx +83 -128
- package/src/__tests__/utils.tsx +4 -11
- package/src/createBaseQuery.ts +148 -60
- package/src/createInfiniteQuery.ts +16 -94
- package/src/createMutation.ts +9 -63
- package/src/createQueries.ts +44 -55
- package/src/createQuery.ts +42 -127
- package/src/index.ts +6 -3
- package/src/setBatchUpdatesFn.ts +4 -0
- package/src/types.ts +81 -75
- package/src/useIsFetching.ts +12 -44
- package/src/useIsMutating.ts +13 -29
- package/src/utils.ts +5 -79
- package/build/lib/QueryClientProvider.d.ts +0 -24
- package/build/lib/QueryClientProvider.esm.js +0 -74
- package/build/lib/QueryClientProvider.esm.js.map +0 -1
- package/build/lib/QueryClientProvider.js +0 -80
- package/build/lib/QueryClientProvider.js.map +0 -1
- package/build/lib/QueryClientProvider.mjs +0 -74
- package/build/lib/QueryClientProvider.mjs.map +0 -1
- package/build/lib/createBaseQuery.d.ts +0 -4
- package/build/lib/createBaseQuery.esm.js +0 -93
- package/build/lib/createBaseQuery.esm.js.map +0 -1
- package/build/lib/createBaseQuery.js +0 -97
- package/build/lib/createBaseQuery.js.map +0 -1
- package/build/lib/createBaseQuery.mjs +0 -93
- package/build/lib/createBaseQuery.mjs.map +0 -1
- package/build/lib/createInfiniteQuery.d.ts +0 -5
- package/build/lib/createInfiniteQuery.esm.js +0 -20
- package/build/lib/createInfiniteQuery.esm.js.map +0 -1
- package/build/lib/createInfiniteQuery.js +0 -24
- package/build/lib/createInfiniteQuery.js.map +0 -1
- package/build/lib/createInfiniteQuery.mjs +0 -20
- package/build/lib/createInfiniteQuery.mjs.map +0 -1
- package/build/lib/createMutation.d.ts +0 -6
- package/build/lib/createMutation.esm.js +0 -45
- package/build/lib/createMutation.esm.js.map +0 -1
- package/build/lib/createMutation.js +0 -49
- package/build/lib/createMutation.js.map +0 -1
- package/build/lib/createMutation.mjs +0 -45
- package/build/lib/createMutation.mjs.map +0 -1
- package/build/lib/createQueries.esm.js +0 -54
- package/build/lib/createQueries.esm.js.map +0 -1
- package/build/lib/createQueries.js +0 -58
- package/build/lib/createQueries.js.map +0 -1
- package/build/lib/createQueries.mjs +0 -54
- package/build/lib/createQueries.mjs.map +0 -1
- package/build/lib/createQuery.d.ts +0 -23
- package/build/lib/createQuery.esm.js +0 -25
- package/build/lib/createQuery.esm.js.map +0 -1
- package/build/lib/createQuery.js +0 -29
- package/build/lib/createQuery.js.map +0 -1
- package/build/lib/createQuery.mjs +0 -25
- package/build/lib/createQuery.mjs.map +0 -1
- package/build/lib/index.esm.js +0 -9
- package/build/lib/index.esm.js.map +0 -1
- package/build/lib/index.js +0 -31
- package/build/lib/index.js.map +0 -1
- package/build/lib/index.mjs +0 -9
- package/build/lib/index.mjs.map +0 -1
- package/build/lib/types.d.ts +0 -47
- package/build/lib/useIsFetching.d.ts +0 -7
- package/build/lib/useIsFetching.esm.js +0 -29
- package/build/lib/useIsFetching.esm.js.map +0 -1
- package/build/lib/useIsFetching.js +0 -33
- package/build/lib/useIsFetching.js.map +0 -1
- package/build/lib/useIsFetching.mjs +0 -29
- package/build/lib/useIsFetching.mjs.map +0 -1
- package/build/lib/useIsMutating.d.ts +0 -8
- package/build/lib/useIsMutating.esm.js +0 -22
- package/build/lib/useIsMutating.esm.js.map +0 -1
- package/build/lib/useIsMutating.js +0 -26
- package/build/lib/useIsMutating.js.map +0 -1
- package/build/lib/useIsMutating.mjs +0 -22
- package/build/lib/useIsMutating.mjs.map +0 -1
- package/build/lib/utils.d.ts +0 -14
- package/build/lib/utils.esm.js +0 -63
- package/build/lib/utils.esm.js.map +0 -1
- package/build/lib/utils.js +0 -72
- package/build/lib/utils.js.map +0 -1
- package/build/lib/utils.mjs +0 -63
- package/build/lib/utils.mjs.map +0 -1
- package/build/solid/QueryClientProvider.jsx +0 -49
- package/build/solid/__tests__/QueryClientProvider.test.jsx +0 -185
- package/build/solid/createBaseQuery.js +0 -81
- package/build/solid/createInfiniteQuery.js +0 -16
- package/build/solid/createQueries.js +0 -39
- package/build/solid/createQuery.js +0 -16
- package/build/solid/useIsFetching.js +0 -23
- package/build/solid/useIsMutating.js +0 -16
- package/build/solid/utils.js +0 -45
- package/build/umd/index.development.js +0 -3577
- package/build/umd/index.development.js.map +0 -1
- package/build/umd/index.production.js +0 -2
- package/build/umd/index.production.js.map +0 -1
- /package/build/{solid → source}/types.js +0 -0
- /package/build/{lib → types}/__tests__/QueryClientProvider.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createInfiniteQuery.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createMutation.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createQueries.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createQuery.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createQuery.types.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/suspense.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/transition.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/useIsFetching.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/useIsMutating.test.d.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { fireEvent, render, screen, waitFor } from 'solid-testing-library';
|
|
2
2
|
import { createQueryClient, sleep } from './utils';
|
|
3
3
|
import { createEffect, createRenderEffect, createSignal, For, Index, Match, Switch, } from 'solid-js';
|
|
4
|
-
import { createInfiniteQuery, QueryCache, QueryClientProvider } from '..';
|
|
4
|
+
import { createInfiniteQuery, QueryCache, QueryClientProvider, keepPreviousData, } from '..';
|
|
5
5
|
import { Blink, queryKey, setActTimeout } from './utils';
|
|
6
6
|
const pageSize = 10;
|
|
7
7
|
const fetchItems = async (page, ts, noNext, noPrev) => {
|
|
@@ -20,9 +20,12 @@ describe('useInfiniteQuery', () => {
|
|
|
20
20
|
const key = queryKey();
|
|
21
21
|
const states = [];
|
|
22
22
|
function Page() {
|
|
23
|
-
const state = createInfiniteQuery(
|
|
23
|
+
const state = createInfiniteQuery(() => ({
|
|
24
|
+
queryKey: key,
|
|
25
|
+
queryFn: ({ pageParam }) => Number(pageParam),
|
|
24
26
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
25
|
-
|
|
27
|
+
defaultPageParam: 0,
|
|
28
|
+
}));
|
|
26
29
|
createRenderEffect(() => {
|
|
27
30
|
states.push({ ...state });
|
|
28
31
|
});
|
|
@@ -43,8 +46,8 @@ describe('useInfiniteQuery', () => {
|
|
|
43
46
|
errorUpdateCount: 0,
|
|
44
47
|
fetchNextPage: expect.any(Function),
|
|
45
48
|
fetchPreviousPage: expect.any(Function),
|
|
46
|
-
hasNextPage:
|
|
47
|
-
hasPreviousPage:
|
|
49
|
+
hasNextPage: false,
|
|
50
|
+
hasPreviousPage: false,
|
|
48
51
|
isError: false,
|
|
49
52
|
isFetched: false,
|
|
50
53
|
isFetchedAfterMount: false,
|
|
@@ -52,22 +55,21 @@ describe('useInfiniteQuery', () => {
|
|
|
52
55
|
isPaused: false,
|
|
53
56
|
isFetchingNextPage: false,
|
|
54
57
|
isFetchingPreviousPage: false,
|
|
58
|
+
isPending: true,
|
|
55
59
|
isLoading: true,
|
|
56
60
|
isInitialLoading: true,
|
|
57
61
|
isLoadingError: false,
|
|
58
62
|
isPlaceholderData: false,
|
|
59
|
-
isPreviousData: false,
|
|
60
63
|
isRefetchError: false,
|
|
61
64
|
isRefetching: false,
|
|
62
65
|
isStale: true,
|
|
63
66
|
isSuccess: false,
|
|
64
67
|
refetch: expect.any(Function),
|
|
65
|
-
|
|
66
|
-
status: 'loading',
|
|
68
|
+
status: 'pending',
|
|
67
69
|
fetchStatus: 'fetching',
|
|
68
70
|
});
|
|
69
71
|
expect(states[1]).toEqual({
|
|
70
|
-
data: { pages: [0], pageParams: [
|
|
72
|
+
data: { pages: [0], pageParams: [0] },
|
|
71
73
|
dataUpdatedAt: expect.any(Number),
|
|
72
74
|
error: null,
|
|
73
75
|
errorUpdatedAt: 0,
|
|
@@ -77,7 +79,7 @@ describe('useInfiniteQuery', () => {
|
|
|
77
79
|
fetchNextPage: expect.any(Function),
|
|
78
80
|
fetchPreviousPage: expect.any(Function),
|
|
79
81
|
hasNextPage: true,
|
|
80
|
-
hasPreviousPage:
|
|
82
|
+
hasPreviousPage: false,
|
|
81
83
|
isError: false,
|
|
82
84
|
isFetched: true,
|
|
83
85
|
isFetchedAfterMount: true,
|
|
@@ -85,17 +87,16 @@ describe('useInfiniteQuery', () => {
|
|
|
85
87
|
isPaused: false,
|
|
86
88
|
isFetchingNextPage: false,
|
|
87
89
|
isFetchingPreviousPage: false,
|
|
90
|
+
isPending: false,
|
|
88
91
|
isLoading: false,
|
|
89
92
|
isInitialLoading: false,
|
|
90
93
|
isLoadingError: false,
|
|
91
94
|
isPlaceholderData: false,
|
|
92
|
-
isPreviousData: false,
|
|
93
95
|
isRefetchError: false,
|
|
94
96
|
isRefetching: false,
|
|
95
97
|
isStale: true,
|
|
96
98
|
isSuccess: true,
|
|
97
99
|
refetch: expect.any(Function),
|
|
98
|
-
remove: expect.any(Function),
|
|
99
100
|
status: 'success',
|
|
100
101
|
fetchStatus: 'idle',
|
|
101
102
|
});
|
|
@@ -105,16 +106,19 @@ describe('useInfiniteQuery', () => {
|
|
|
105
106
|
let noThrow;
|
|
106
107
|
function Page() {
|
|
107
108
|
const start = 1;
|
|
108
|
-
const state = createInfiniteQuery(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
const state = createInfiniteQuery(() => ({
|
|
110
|
+
queryKey: key,
|
|
111
|
+
queryFn: async ({ pageParam }) => {
|
|
112
|
+
if (pageParam === 2) {
|
|
113
|
+
throw new Error('error');
|
|
114
|
+
}
|
|
115
|
+
return Number(pageParam);
|
|
116
|
+
},
|
|
114
117
|
retry: 1,
|
|
115
118
|
retryDelay: 10,
|
|
119
|
+
defaultPageParam: start,
|
|
116
120
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
117
|
-
});
|
|
121
|
+
}));
|
|
118
122
|
createEffect(() => {
|
|
119
123
|
const fetchNextPage = state.fetchNextPage;
|
|
120
124
|
setActTimeout(() => {
|
|
@@ -132,19 +136,22 @@ describe('useInfiniteQuery', () => {
|
|
|
132
136
|
</QueryClientProvider>));
|
|
133
137
|
await waitFor(() => expect(noThrow).toBe(true));
|
|
134
138
|
});
|
|
135
|
-
it('should keep the previous data when
|
|
139
|
+
it('should keep the previous data when placeholderData is set', async () => {
|
|
136
140
|
const key = queryKey();
|
|
137
141
|
const states = [];
|
|
138
142
|
function Page() {
|
|
139
143
|
const [order, setOrder] = createSignal('desc');
|
|
140
|
-
const state = createInfiniteQuery(() =>
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
+
const state = createInfiniteQuery(() => ({
|
|
145
|
+
queryKey: [key, order()],
|
|
146
|
+
queryFn: async ({ pageParam }) => {
|
|
147
|
+
await sleep(10);
|
|
148
|
+
return `${pageParam}-${order()}`;
|
|
149
|
+
},
|
|
144
150
|
getNextPageParam: () => 1,
|
|
145
|
-
|
|
151
|
+
defaultPageParam: 0,
|
|
152
|
+
placeholderData: keepPreviousData,
|
|
146
153
|
notifyOnChangeProps: 'all',
|
|
147
|
-
});
|
|
154
|
+
}));
|
|
148
155
|
createRenderEffect(() => {
|
|
149
156
|
states.push({ ...state });
|
|
150
157
|
});
|
|
@@ -170,28 +177,28 @@ describe('useInfiniteQuery', () => {
|
|
|
170
177
|
isFetching: true,
|
|
171
178
|
isFetchingNextPage: false,
|
|
172
179
|
isSuccess: false,
|
|
173
|
-
|
|
180
|
+
isPlaceholderData: false,
|
|
174
181
|
});
|
|
175
182
|
expect(states[1]).toMatchObject({
|
|
176
183
|
data: { pages: ['0-desc'] },
|
|
177
184
|
isFetching: false,
|
|
178
185
|
isFetchingNextPage: false,
|
|
179
186
|
isSuccess: true,
|
|
180
|
-
|
|
187
|
+
isPlaceholderData: false,
|
|
181
188
|
});
|
|
182
189
|
expect(states[2]).toMatchObject({
|
|
183
190
|
data: { pages: ['0-desc'] },
|
|
184
191
|
isFetching: true,
|
|
185
192
|
isFetchingNextPage: true,
|
|
186
193
|
isSuccess: true,
|
|
187
|
-
|
|
194
|
+
isPlaceholderData: false,
|
|
188
195
|
});
|
|
189
196
|
expect(states[3]).toMatchObject({
|
|
190
197
|
data: { pages: ['0-desc', '1-desc'] },
|
|
191
198
|
isFetching: false,
|
|
192
199
|
isFetchingNextPage: false,
|
|
193
200
|
isSuccess: true,
|
|
194
|
-
|
|
201
|
+
isPlaceholderData: false,
|
|
195
202
|
});
|
|
196
203
|
// Set state
|
|
197
204
|
expect(states[4]).toMatchObject({
|
|
@@ -199,26 +206,30 @@ describe('useInfiniteQuery', () => {
|
|
|
199
206
|
isFetching: true,
|
|
200
207
|
isFetchingNextPage: false,
|
|
201
208
|
isSuccess: true,
|
|
202
|
-
|
|
209
|
+
isPlaceholderData: true,
|
|
203
210
|
});
|
|
204
211
|
expect(states[5]).toMatchObject({
|
|
205
212
|
data: { pages: ['0-asc'] },
|
|
206
213
|
isFetching: false,
|
|
207
214
|
isFetchingNextPage: false,
|
|
208
215
|
isSuccess: true,
|
|
209
|
-
|
|
216
|
+
isPlaceholderData: false,
|
|
210
217
|
});
|
|
211
218
|
});
|
|
212
219
|
it('should be able to select a part of the data', async () => {
|
|
213
220
|
const key = queryKey();
|
|
214
221
|
const states = [];
|
|
215
222
|
function Page() {
|
|
216
|
-
const state = createInfiniteQuery(
|
|
223
|
+
const state = createInfiniteQuery(() => ({
|
|
224
|
+
queryKey: key,
|
|
225
|
+
queryFn: () => ({ count: 1 }),
|
|
217
226
|
select: (data) => ({
|
|
218
227
|
pages: data.pages.map((x) => `count: ${x.count}`),
|
|
219
228
|
pageParams: data.pageParams,
|
|
220
229
|
}),
|
|
221
|
-
|
|
230
|
+
getNextPageParam: () => undefined,
|
|
231
|
+
defaultPageParam: 0,
|
|
232
|
+
}));
|
|
222
233
|
createRenderEffect(() => {
|
|
223
234
|
states.push({ ...state });
|
|
224
235
|
});
|
|
@@ -243,7 +254,9 @@ describe('useInfiniteQuery', () => {
|
|
|
243
254
|
const states = [];
|
|
244
255
|
let selectCalled = 0;
|
|
245
256
|
function Page() {
|
|
246
|
-
const state = createInfiniteQuery(
|
|
257
|
+
const state = createInfiniteQuery(() => ({
|
|
258
|
+
queryKey: key,
|
|
259
|
+
queryFn: () => ({ count: 1 }),
|
|
247
260
|
select: (data) => {
|
|
248
261
|
selectCalled++;
|
|
249
262
|
return {
|
|
@@ -251,7 +264,9 @@ describe('useInfiniteQuery', () => {
|
|
|
251
264
|
pageParams: data.pageParams,
|
|
252
265
|
};
|
|
253
266
|
},
|
|
254
|
-
|
|
267
|
+
getNextPageParam: () => undefined,
|
|
268
|
+
defaultPageParam: 0,
|
|
269
|
+
}));
|
|
255
270
|
createRenderEffect(() => {
|
|
256
271
|
states.push({ ...state });
|
|
257
272
|
});
|
|
@@ -276,23 +291,25 @@ describe('useInfiniteQuery', () => {
|
|
|
276
291
|
const key = queryKey();
|
|
277
292
|
const states = [];
|
|
278
293
|
function Page() {
|
|
279
|
-
const state = createInfiniteQuery(
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
294
|
+
const state = createInfiniteQuery(() => ({
|
|
295
|
+
queryKey: key,
|
|
296
|
+
queryFn: async ({ pageParam }) => {
|
|
297
|
+
await sleep(10);
|
|
298
|
+
return Number(pageParam);
|
|
299
|
+
},
|
|
283
300
|
select: (data) => ({
|
|
284
301
|
pages: [...data.pages].reverse(),
|
|
285
302
|
pageParams: [...data.pageParams].reverse(),
|
|
286
303
|
}),
|
|
287
304
|
notifyOnChangeProps: 'all',
|
|
288
|
-
|
|
305
|
+
getNextPageParam: () => 1,
|
|
306
|
+
defaultPageParam: 0,
|
|
307
|
+
}));
|
|
289
308
|
createRenderEffect(() => {
|
|
290
309
|
states.push({ ...state });
|
|
291
310
|
});
|
|
292
311
|
return (<div>
|
|
293
|
-
<button onClick={() => state.fetchNextPage(
|
|
294
|
-
fetchNextPage
|
|
295
|
-
</button>
|
|
312
|
+
<button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
|
|
296
313
|
<div>data: {state.data?.pages.join(',') ?? 'null'}</div>
|
|
297
314
|
<div>isFetching: {state.isFetching}</div>
|
|
298
315
|
</div>);
|
|
@@ -326,13 +343,17 @@ describe('useInfiniteQuery', () => {
|
|
|
326
343
|
const states = [];
|
|
327
344
|
function Page() {
|
|
328
345
|
const start = 10;
|
|
329
|
-
const state = createInfiniteQuery(
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
346
|
+
const state = createInfiniteQuery(() => ({
|
|
347
|
+
queryKey: key,
|
|
348
|
+
queryFn: async ({ pageParam }) => {
|
|
349
|
+
await sleep(10);
|
|
350
|
+
return Number(pageParam);
|
|
351
|
+
},
|
|
352
|
+
getNextPageParam: (lastPage) => lastPage + 1,
|
|
333
353
|
getPreviousPageParam: (firstPage) => firstPage - 1,
|
|
354
|
+
defaultPageParam: start,
|
|
334
355
|
notifyOnChangeProps: 'all',
|
|
335
|
-
});
|
|
356
|
+
}));
|
|
336
357
|
createRenderEffect(() => {
|
|
337
358
|
states.push({ ...state });
|
|
338
359
|
});
|
|
@@ -351,8 +372,8 @@ describe('useInfiniteQuery', () => {
|
|
|
351
372
|
expect(states.length).toBe(4);
|
|
352
373
|
expect(states[0]).toMatchObject({
|
|
353
374
|
data: undefined,
|
|
354
|
-
hasNextPage:
|
|
355
|
-
hasPreviousPage:
|
|
375
|
+
hasNextPage: false,
|
|
376
|
+
hasPreviousPage: false,
|
|
356
377
|
isFetching: true,
|
|
357
378
|
isFetchingNextPage: false,
|
|
358
379
|
isFetchingPreviousPage: false,
|
|
@@ -360,7 +381,7 @@ describe('useInfiniteQuery', () => {
|
|
|
360
381
|
});
|
|
361
382
|
expect(states[1]).toMatchObject({
|
|
362
383
|
data: { pages: [10] },
|
|
363
|
-
hasNextPage:
|
|
384
|
+
hasNextPage: true,
|
|
364
385
|
hasPreviousPage: true,
|
|
365
386
|
isFetching: false,
|
|
366
387
|
isFetchingNextPage: false,
|
|
@@ -369,7 +390,7 @@ describe('useInfiniteQuery', () => {
|
|
|
369
390
|
});
|
|
370
391
|
expect(states[2]).toMatchObject({
|
|
371
392
|
data: { pages: [10] },
|
|
372
|
-
hasNextPage:
|
|
393
|
+
hasNextPage: true,
|
|
373
394
|
hasPreviousPage: true,
|
|
374
395
|
isFetching: true,
|
|
375
396
|
isFetchingNextPage: false,
|
|
@@ -378,7 +399,7 @@ describe('useInfiniteQuery', () => {
|
|
|
378
399
|
});
|
|
379
400
|
expect(states[3]).toMatchObject({
|
|
380
401
|
data: { pages: [9, 10] },
|
|
381
|
-
hasNextPage:
|
|
402
|
+
hasNextPage: true,
|
|
382
403
|
hasPreviousPage: true,
|
|
383
404
|
isFetching: false,
|
|
384
405
|
isFetchingNextPage: false,
|
|
@@ -386,113 +407,21 @@ describe('useInfiniteQuery', () => {
|
|
|
386
407
|
isSuccess: true,
|
|
387
408
|
});
|
|
388
409
|
});
|
|
389
|
-
it('should be able to refetch when providing page params manually', async () => {
|
|
390
|
-
const key = queryKey();
|
|
391
|
-
const states = [];
|
|
392
|
-
function Page() {
|
|
393
|
-
const state = createInfiniteQuery(key, async ({ pageParam = 10 }) => {
|
|
394
|
-
await sleep(10);
|
|
395
|
-
return Number(pageParam);
|
|
396
|
-
});
|
|
397
|
-
createRenderEffect(() => {
|
|
398
|
-
states.push({ ...state });
|
|
399
|
-
});
|
|
400
|
-
return (<div>
|
|
401
|
-
<button onClick={() => state.fetchNextPage({ pageParam: 11 })}>
|
|
402
|
-
fetchNextPage
|
|
403
|
-
</button>
|
|
404
|
-
<button onClick={() => state.fetchPreviousPage({ pageParam: 9 })}>
|
|
405
|
-
fetchPreviousPage
|
|
406
|
-
</button>
|
|
407
|
-
<button onClick={() => state.refetch()}>refetch</button>
|
|
408
|
-
<div>data: {state.data?.pages.join(',') ?? 'null'}</div>
|
|
409
|
-
<div>isFetching: {String(state.isFetching)}</div>
|
|
410
|
-
</div>);
|
|
411
|
-
}
|
|
412
|
-
render(() => (<QueryClientProvider client={queryClient}>
|
|
413
|
-
<Page />
|
|
414
|
-
</QueryClientProvider>));
|
|
415
|
-
await waitFor(() => screen.getByText('data: 10'));
|
|
416
|
-
fireEvent.click(screen.getByRole('button', { name: /fetchNextPage/i }));
|
|
417
|
-
await waitFor(() => screen.getByText('data: 10,11'));
|
|
418
|
-
fireEvent.click(screen.getByRole('button', { name: /fetchPreviousPage/i }));
|
|
419
|
-
await waitFor(() => screen.getByText('data: 9,10,11'));
|
|
420
|
-
fireEvent.click(screen.getByRole('button', { name: /refetch/i }));
|
|
421
|
-
await waitFor(() => screen.getByText('isFetching: false'));
|
|
422
|
-
await waitFor(() => expect(states.length).toBe(8));
|
|
423
|
-
// Initial fetch
|
|
424
|
-
expect(states[0]).toMatchObject({
|
|
425
|
-
data: undefined,
|
|
426
|
-
isFetching: true,
|
|
427
|
-
isFetchingNextPage: false,
|
|
428
|
-
isRefetching: false,
|
|
429
|
-
});
|
|
430
|
-
// Initial fetch done
|
|
431
|
-
expect(states[1]).toMatchObject({
|
|
432
|
-
data: { pages: [10] },
|
|
433
|
-
isFetching: false,
|
|
434
|
-
isFetchingNextPage: false,
|
|
435
|
-
isRefetching: false,
|
|
436
|
-
});
|
|
437
|
-
// Fetch next page
|
|
438
|
-
expect(states[2]).toMatchObject({
|
|
439
|
-
data: { pages: [10] },
|
|
440
|
-
isFetching: true,
|
|
441
|
-
isFetchingNextPage: true,
|
|
442
|
-
isRefetching: false,
|
|
443
|
-
});
|
|
444
|
-
// Fetch next page done
|
|
445
|
-
expect(states[3]).toMatchObject({
|
|
446
|
-
data: { pages: [10, 11] },
|
|
447
|
-
isFetching: false,
|
|
448
|
-
isFetchingNextPage: false,
|
|
449
|
-
isRefetching: false,
|
|
450
|
-
});
|
|
451
|
-
// Fetch previous page
|
|
452
|
-
expect(states[4]).toMatchObject({
|
|
453
|
-
data: { pages: [10, 11] },
|
|
454
|
-
isFetching: true,
|
|
455
|
-
isFetchingNextPage: false,
|
|
456
|
-
isFetchingPreviousPage: true,
|
|
457
|
-
isRefetching: false,
|
|
458
|
-
});
|
|
459
|
-
// Fetch previous page done
|
|
460
|
-
expect(states[5]).toMatchObject({
|
|
461
|
-
data: { pages: [9, 10, 11] },
|
|
462
|
-
isFetching: false,
|
|
463
|
-
isFetchingNextPage: false,
|
|
464
|
-
isFetchingPreviousPage: false,
|
|
465
|
-
isRefetching: false,
|
|
466
|
-
});
|
|
467
|
-
// Refetch
|
|
468
|
-
expect(states[6]).toMatchObject({
|
|
469
|
-
data: { pages: [9, 10, 11] },
|
|
470
|
-
isFetching: true,
|
|
471
|
-
isFetchingNextPage: false,
|
|
472
|
-
isFetchingPreviousPage: false,
|
|
473
|
-
isRefetching: true,
|
|
474
|
-
});
|
|
475
|
-
// Refetch done
|
|
476
|
-
expect(states[7]).toMatchObject({
|
|
477
|
-
data: { pages: [9, 10, 11] },
|
|
478
|
-
isFetching: false,
|
|
479
|
-
isFetchingNextPage: false,
|
|
480
|
-
isFetchingPreviousPage: false,
|
|
481
|
-
isRefetching: false,
|
|
482
|
-
});
|
|
483
|
-
});
|
|
484
410
|
it('should be able to refetch when providing page params automatically', async () => {
|
|
485
411
|
const key = queryKey();
|
|
486
412
|
const states = [];
|
|
487
413
|
function Page() {
|
|
488
|
-
const state = createInfiniteQuery(
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
414
|
+
const state = createInfiniteQuery(() => ({
|
|
415
|
+
queryKey: key,
|
|
416
|
+
queryFn: async ({ pageParam }) => {
|
|
417
|
+
await sleep(10);
|
|
418
|
+
return Number(pageParam);
|
|
419
|
+
},
|
|
492
420
|
getPreviousPageParam: (firstPage) => firstPage - 1,
|
|
493
421
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
422
|
+
defaultPageParam: 10,
|
|
494
423
|
notifyOnChangeProps: 'all',
|
|
495
|
-
});
|
|
424
|
+
}));
|
|
496
425
|
createRenderEffect(() => {
|
|
497
426
|
states.push({ ...state });
|
|
498
427
|
});
|
|
@@ -578,94 +507,21 @@ describe('useInfiniteQuery', () => {
|
|
|
578
507
|
isRefetching: false,
|
|
579
508
|
});
|
|
580
509
|
});
|
|
581
|
-
it('should be able to refetch only specific pages when refetchPages is provided', async () => {
|
|
582
|
-
const key = queryKey();
|
|
583
|
-
const states = [];
|
|
584
|
-
function Page() {
|
|
585
|
-
let multiplier = 1;
|
|
586
|
-
const state = createInfiniteQuery(key, async ({ pageParam = 10 }) => {
|
|
587
|
-
await sleep(10);
|
|
588
|
-
return Number(pageParam) * multiplier;
|
|
589
|
-
}, {
|
|
590
|
-
getNextPageParam: (lastPage) => lastPage + 1,
|
|
591
|
-
notifyOnChangeProps: 'all',
|
|
592
|
-
});
|
|
593
|
-
createRenderEffect(() => {
|
|
594
|
-
states.push({ ...state });
|
|
595
|
-
});
|
|
596
|
-
return (<div>
|
|
597
|
-
<button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
|
|
598
|
-
<button onClick={() => {
|
|
599
|
-
multiplier = 2;
|
|
600
|
-
state.refetch({
|
|
601
|
-
refetchPage: (_, index) => index === 0,
|
|
602
|
-
});
|
|
603
|
-
}}>
|
|
604
|
-
refetchPage
|
|
605
|
-
</button>
|
|
606
|
-
<div>data: {state.data?.pages.join(',') ?? 'null'}</div>
|
|
607
|
-
<div>isFetching: {String(state.isFetching)}</div>
|
|
608
|
-
</div>);
|
|
609
|
-
}
|
|
610
|
-
render(() => (<QueryClientProvider client={queryClient}>
|
|
611
|
-
<Page />
|
|
612
|
-
</QueryClientProvider>));
|
|
613
|
-
await waitFor(() => screen.getByText('data: 10'));
|
|
614
|
-
fireEvent.click(screen.getByRole('button', { name: /fetchNextPage/i }));
|
|
615
|
-
await waitFor(() => screen.getByText('data: 10,11'));
|
|
616
|
-
fireEvent.click(screen.getByRole('button', { name: /refetchPage/i }));
|
|
617
|
-
await waitFor(() => screen.getByText('data: 20,11'));
|
|
618
|
-
await waitFor(() => screen.getByText('isFetching: false'));
|
|
619
|
-
await waitFor(() => expect(states.length).toBe(6));
|
|
620
|
-
// Initial fetch
|
|
621
|
-
expect(states[0]).toMatchObject({
|
|
622
|
-
data: undefined,
|
|
623
|
-
isFetching: true,
|
|
624
|
-
isFetchingNextPage: false,
|
|
625
|
-
});
|
|
626
|
-
// Initial fetch done
|
|
627
|
-
expect(states[1]).toMatchObject({
|
|
628
|
-
data: { pages: [10] },
|
|
629
|
-
isFetching: false,
|
|
630
|
-
isFetchingNextPage: false,
|
|
631
|
-
});
|
|
632
|
-
// Fetch next page
|
|
633
|
-
expect(states[2]).toMatchObject({
|
|
634
|
-
data: { pages: [10] },
|
|
635
|
-
isFetching: true,
|
|
636
|
-
isFetchingNextPage: true,
|
|
637
|
-
});
|
|
638
|
-
// Fetch next page done
|
|
639
|
-
expect(states[3]).toMatchObject({
|
|
640
|
-
data: { pages: [10, 11] },
|
|
641
|
-
isFetching: false,
|
|
642
|
-
isFetchingNextPage: false,
|
|
643
|
-
});
|
|
644
|
-
// Refetch
|
|
645
|
-
expect(states[4]).toMatchObject({
|
|
646
|
-
data: { pages: [10, 11] },
|
|
647
|
-
isFetching: true,
|
|
648
|
-
isFetchingNextPage: false,
|
|
649
|
-
});
|
|
650
|
-
// Refetch done, only page one has been refetched and multiplied
|
|
651
|
-
expect(states[5]).toMatchObject({
|
|
652
|
-
data: { pages: [20, 11] },
|
|
653
|
-
isFetching: false,
|
|
654
|
-
isFetchingNextPage: false,
|
|
655
|
-
});
|
|
656
|
-
});
|
|
657
510
|
it('should silently cancel any ongoing fetch when fetching more', async () => {
|
|
658
511
|
const key = queryKey();
|
|
659
512
|
const states = [];
|
|
660
513
|
function Page() {
|
|
661
514
|
const start = 10;
|
|
662
|
-
const state = createInfiniteQuery(
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
515
|
+
const state = createInfiniteQuery(() => ({
|
|
516
|
+
queryKey: key,
|
|
517
|
+
queryFn: async ({ pageParam }) => {
|
|
518
|
+
await sleep(50);
|
|
519
|
+
return Number(pageParam);
|
|
520
|
+
},
|
|
666
521
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
522
|
+
defaultPageParam: start,
|
|
667
523
|
notifyOnChangeProps: 'all',
|
|
668
|
-
});
|
|
524
|
+
}));
|
|
669
525
|
createRenderEffect(() => {
|
|
670
526
|
states.push({ ...state });
|
|
671
527
|
});
|
|
@@ -686,7 +542,7 @@ describe('useInfiniteQuery', () => {
|
|
|
686
542
|
await sleep(300);
|
|
687
543
|
expect(states.length).toBe(5);
|
|
688
544
|
expect(states[0]).toMatchObject({
|
|
689
|
-
hasNextPage:
|
|
545
|
+
hasNextPage: false,
|
|
690
546
|
data: undefined,
|
|
691
547
|
isFetching: true,
|
|
692
548
|
isFetchingNextPage: false,
|
|
@@ -726,22 +582,23 @@ describe('useInfiniteQuery', () => {
|
|
|
726
582
|
const start = 10;
|
|
727
583
|
const onAborts = [];
|
|
728
584
|
const abortListeners = [];
|
|
729
|
-
const fetchPage = jest.fn(async ({ pageParam
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
signal.addEventListener('abort', abortListener);
|
|
737
|
-
}
|
|
585
|
+
const fetchPage = jest.fn(async ({ pageParam, signal }) => {
|
|
586
|
+
const onAbort = jest.fn();
|
|
587
|
+
const abortListener = jest.fn();
|
|
588
|
+
onAborts.push(onAbort);
|
|
589
|
+
abortListeners.push(abortListener);
|
|
590
|
+
signal.onabort = onAbort;
|
|
591
|
+
signal.addEventListener('abort', abortListener);
|
|
738
592
|
await sleep(50);
|
|
739
593
|
return Number(pageParam);
|
|
740
594
|
});
|
|
741
595
|
function Page() {
|
|
742
|
-
const state = createInfiniteQuery(
|
|
596
|
+
const state = createInfiniteQuery(() => ({
|
|
597
|
+
queryKey: key,
|
|
598
|
+
queryFn: fetchPage,
|
|
743
599
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
744
|
-
|
|
600
|
+
defaultPageParam: start,
|
|
601
|
+
}));
|
|
745
602
|
createEffect(() => {
|
|
746
603
|
const { fetchNextPage } = state;
|
|
747
604
|
setActTimeout(() => {
|
|
@@ -763,26 +620,26 @@ describe('useInfiniteQuery', () => {
|
|
|
763
620
|
expect(abortListeners).toHaveLength(expectedCallCount);
|
|
764
621
|
let callIndex = 0;
|
|
765
622
|
const firstCtx = fetchPage.mock.calls[callIndex][0];
|
|
766
|
-
expect(firstCtx.pageParam).
|
|
767
|
-
expect(firstCtx.queryKey).toEqual(key
|
|
623
|
+
expect(firstCtx.pageParam).toEqual(start);
|
|
624
|
+
expect(firstCtx.queryKey).toEqual(key);
|
|
768
625
|
expect(firstCtx.signal).toBeInstanceOf(AbortSignal);
|
|
769
|
-
expect(firstCtx.signal
|
|
626
|
+
expect(firstCtx.signal.aborted).toBe(false);
|
|
770
627
|
expect(onAborts[callIndex]).not.toHaveBeenCalled();
|
|
771
628
|
expect(abortListeners[callIndex]).not.toHaveBeenCalled();
|
|
772
629
|
callIndex = 1;
|
|
773
630
|
const secondCtx = fetchPage.mock.calls[callIndex][0];
|
|
774
631
|
expect(secondCtx.pageParam).toBe(11);
|
|
775
|
-
expect(secondCtx.queryKey).toEqual(key
|
|
632
|
+
expect(secondCtx.queryKey).toEqual(key);
|
|
776
633
|
expect(secondCtx.signal).toBeInstanceOf(AbortSignal);
|
|
777
|
-
expect(secondCtx.signal
|
|
634
|
+
expect(secondCtx.signal.aborted).toBe(true);
|
|
778
635
|
expect(onAborts[callIndex]).toHaveBeenCalledTimes(1);
|
|
779
636
|
expect(abortListeners[callIndex]).toHaveBeenCalledTimes(1);
|
|
780
637
|
callIndex = 2;
|
|
781
638
|
const thirdCtx = fetchPage.mock.calls[callIndex][0];
|
|
782
639
|
expect(thirdCtx.pageParam).toBe(11);
|
|
783
|
-
expect(thirdCtx.queryKey).toEqual(key
|
|
640
|
+
expect(thirdCtx.queryKey).toEqual(key);
|
|
784
641
|
expect(thirdCtx.signal).toBeInstanceOf(AbortSignal);
|
|
785
|
-
expect(thirdCtx.signal
|
|
642
|
+
expect(thirdCtx.signal.aborted).toBe(false);
|
|
786
643
|
expect(onAborts[callIndex]).not.toHaveBeenCalled();
|
|
787
644
|
expect(abortListeners[callIndex]).not.toHaveBeenCalled();
|
|
788
645
|
});
|
|
@@ -791,22 +648,23 @@ describe('useInfiniteQuery', () => {
|
|
|
791
648
|
const start = 10;
|
|
792
649
|
const onAborts = [];
|
|
793
650
|
const abortListeners = [];
|
|
794
|
-
const fetchPage = jest.fn(async ({ pageParam
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
signal.addEventListener('abort', abortListener);
|
|
802
|
-
}
|
|
651
|
+
const fetchPage = jest.fn(async ({ pageParam, signal }) => {
|
|
652
|
+
const onAbort = jest.fn();
|
|
653
|
+
const abortListener = jest.fn();
|
|
654
|
+
onAborts.push(onAbort);
|
|
655
|
+
abortListeners.push(abortListener);
|
|
656
|
+
signal.onabort = onAbort;
|
|
657
|
+
signal.addEventListener('abort', abortListener);
|
|
803
658
|
await sleep(50);
|
|
804
659
|
return Number(pageParam);
|
|
805
660
|
});
|
|
806
661
|
function Page() {
|
|
807
|
-
const state = createInfiniteQuery(
|
|
662
|
+
const state = createInfiniteQuery(() => ({
|
|
663
|
+
queryKey: key,
|
|
664
|
+
queryFn: fetchPage,
|
|
808
665
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
809
|
-
|
|
666
|
+
defaultPageParam: start,
|
|
667
|
+
}));
|
|
810
668
|
createEffect(() => {
|
|
811
669
|
const { fetchNextPage } = state;
|
|
812
670
|
setActTimeout(() => {
|
|
@@ -828,18 +686,18 @@ describe('useInfiniteQuery', () => {
|
|
|
828
686
|
expect(abortListeners).toHaveLength(expectedCallCount);
|
|
829
687
|
let callIndex = 0;
|
|
830
688
|
const firstCtx = fetchPage.mock.calls[callIndex][0];
|
|
831
|
-
expect(firstCtx.pageParam).
|
|
832
|
-
expect(firstCtx.queryKey).toEqual(key
|
|
689
|
+
expect(firstCtx.pageParam).toEqual(start);
|
|
690
|
+
expect(firstCtx.queryKey).toEqual(key);
|
|
833
691
|
expect(firstCtx.signal).toBeInstanceOf(AbortSignal);
|
|
834
|
-
expect(firstCtx.signal
|
|
692
|
+
expect(firstCtx.signal.aborted).toBe(false);
|
|
835
693
|
expect(onAborts[callIndex]).not.toHaveBeenCalled();
|
|
836
694
|
expect(abortListeners[callIndex]).not.toHaveBeenCalled();
|
|
837
695
|
callIndex = 1;
|
|
838
696
|
const secondCtx = fetchPage.mock.calls[callIndex][0];
|
|
839
697
|
expect(secondCtx.pageParam).toBe(11);
|
|
840
|
-
expect(secondCtx.queryKey).toEqual(key
|
|
698
|
+
expect(secondCtx.queryKey).toEqual(key);
|
|
841
699
|
expect(secondCtx.signal).toBeInstanceOf(AbortSignal);
|
|
842
|
-
expect(secondCtx.signal
|
|
700
|
+
expect(secondCtx.signal.aborted).toBe(false);
|
|
843
701
|
expect(onAborts[callIndex]).not.toHaveBeenCalled();
|
|
844
702
|
expect(abortListeners[callIndex]).not.toHaveBeenCalled();
|
|
845
703
|
});
|
|
@@ -848,13 +706,16 @@ describe('useInfiniteQuery', () => {
|
|
|
848
706
|
const states = [];
|
|
849
707
|
function Page() {
|
|
850
708
|
const start = 10;
|
|
851
|
-
const state = createInfiniteQuery(
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
709
|
+
const state = createInfiniteQuery(() => ({
|
|
710
|
+
queryKey: key,
|
|
711
|
+
queryFn: async ({ pageParam }) => {
|
|
712
|
+
await sleep(50);
|
|
713
|
+
return Number(pageParam);
|
|
714
|
+
},
|
|
855
715
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
716
|
+
defaultPageParam: start,
|
|
856
717
|
notifyOnChangeProps: 'all',
|
|
857
|
-
});
|
|
718
|
+
}));
|
|
858
719
|
createRenderEffect(() => {
|
|
859
720
|
states.push({ ...state });
|
|
860
721
|
});
|
|
@@ -872,7 +733,7 @@ describe('useInfiniteQuery', () => {
|
|
|
872
733
|
await sleep(100);
|
|
873
734
|
expect(states.length).toBe(2);
|
|
874
735
|
expect(states[0]).toMatchObject({
|
|
875
|
-
hasNextPage:
|
|
736
|
+
hasNextPage: false,
|
|
876
737
|
data: undefined,
|
|
877
738
|
isFetching: true,
|
|
878
739
|
isFetchingNextPage: false,
|
|
@@ -891,16 +752,19 @@ describe('useInfiniteQuery', () => {
|
|
|
891
752
|
let fetches = 0;
|
|
892
753
|
const initialData = { pages: [1, 2, 3, 4], pageParams: [0, 1, 2, 3] };
|
|
893
754
|
function List() {
|
|
894
|
-
createInfiniteQuery(
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
755
|
+
createInfiniteQuery(() => ({
|
|
756
|
+
queryKey: key,
|
|
757
|
+
queryFn: async ({ pageParam, signal: _ }) => {
|
|
758
|
+
fetches++;
|
|
759
|
+
await sleep(50);
|
|
760
|
+
return Number(pageParam) * 10;
|
|
761
|
+
},
|
|
899
762
|
initialData,
|
|
900
763
|
getNextPageParam: (_, allPages) => {
|
|
901
764
|
return allPages.length === 4 ? undefined : allPages.length;
|
|
902
765
|
},
|
|
903
|
-
|
|
766
|
+
defaultPageParam: 0,
|
|
767
|
+
}));
|
|
904
768
|
return null;
|
|
905
769
|
}
|
|
906
770
|
function Page() {
|
|
@@ -917,87 +781,34 @@ describe('useInfiniteQuery', () => {
|
|
|
917
781
|
</QueryClientProvider>));
|
|
918
782
|
await sleep(300);
|
|
919
783
|
expect(fetches).toBe(2);
|
|
920
|
-
expect(queryClient.getQueryState(key
|
|
784
|
+
expect(queryClient.getQueryState(key)).toMatchObject({
|
|
921
785
|
data: initialData,
|
|
922
786
|
status: 'success',
|
|
923
787
|
error: null,
|
|
924
788
|
});
|
|
925
789
|
});
|
|
926
|
-
it('should be able to override the cursor in the fetchNextPage callback', async () => {
|
|
927
|
-
const key = queryKey();
|
|
928
|
-
const states = [];
|
|
929
|
-
function Page() {
|
|
930
|
-
const state = createInfiniteQuery(key, async ({ pageParam = 0 }) => {
|
|
931
|
-
await sleep(10);
|
|
932
|
-
return Number(pageParam);
|
|
933
|
-
}, {
|
|
934
|
-
getNextPageParam: (lastPage) => lastPage + 1,
|
|
935
|
-
notifyOnChangeProps: 'all',
|
|
936
|
-
});
|
|
937
|
-
createRenderEffect(() => {
|
|
938
|
-
states.push({ ...state });
|
|
939
|
-
});
|
|
940
|
-
createEffect(() => {
|
|
941
|
-
const { fetchNextPage } = state;
|
|
942
|
-
setActTimeout(() => {
|
|
943
|
-
fetchNextPage({ pageParam: 5 });
|
|
944
|
-
}, 20);
|
|
945
|
-
});
|
|
946
|
-
return null;
|
|
947
|
-
}
|
|
948
|
-
render(() => (<QueryClientProvider client={queryClient}>
|
|
949
|
-
<Page />
|
|
950
|
-
</QueryClientProvider>));
|
|
951
|
-
await sleep(100);
|
|
952
|
-
expect(states.length).toBe(4);
|
|
953
|
-
expect(states[0]).toMatchObject({
|
|
954
|
-
hasNextPage: undefined,
|
|
955
|
-
data: undefined,
|
|
956
|
-
isFetching: true,
|
|
957
|
-
isFetchingNextPage: false,
|
|
958
|
-
isSuccess: false,
|
|
959
|
-
});
|
|
960
|
-
expect(states[1]).toMatchObject({
|
|
961
|
-
hasNextPage: true,
|
|
962
|
-
data: { pages: [0] },
|
|
963
|
-
isFetching: false,
|
|
964
|
-
isFetchingNextPage: false,
|
|
965
|
-
isSuccess: true,
|
|
966
|
-
});
|
|
967
|
-
expect(states[2]).toMatchObject({
|
|
968
|
-
hasNextPage: true,
|
|
969
|
-
data: { pages: [0] },
|
|
970
|
-
isFetching: true,
|
|
971
|
-
isFetchingNextPage: true,
|
|
972
|
-
isSuccess: true,
|
|
973
|
-
});
|
|
974
|
-
expect(states[3]).toMatchObject({
|
|
975
|
-
hasNextPage: true,
|
|
976
|
-
data: { pages: [0, 5] },
|
|
977
|
-
isFetching: false,
|
|
978
|
-
isFetchingNextPage: false,
|
|
979
|
-
isSuccess: true,
|
|
980
|
-
});
|
|
981
|
-
});
|
|
982
790
|
it('should be able to set new pages with the query client', async () => {
|
|
983
791
|
const key = queryKey();
|
|
984
792
|
const states = [];
|
|
985
793
|
function Page() {
|
|
986
794
|
const [firstPage, setFirstPage] = createSignal(0);
|
|
987
|
-
const state = createInfiniteQuery(
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
795
|
+
const state = createInfiniteQuery(() => ({
|
|
796
|
+
queryKey: key,
|
|
797
|
+
queryFn: async ({ pageParam }) => {
|
|
798
|
+
await sleep(10);
|
|
799
|
+
return Number(pageParam);
|
|
800
|
+
},
|
|
991
801
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
992
802
|
notifyOnChangeProps: 'all',
|
|
993
|
-
|
|
803
|
+
defaultPageParam: firstPage(),
|
|
804
|
+
}));
|
|
994
805
|
createRenderEffect(() => {
|
|
995
806
|
states.push({ ...state });
|
|
996
807
|
});
|
|
997
808
|
createEffect(() => {
|
|
998
809
|
const { refetch } = state;
|
|
999
810
|
setActTimeout(() => {
|
|
1000
|
-
queryClient.setQueryData(key
|
|
811
|
+
queryClient.setQueryData(key, { pages: [7, 8], pageParams: [7, 8] });
|
|
1001
812
|
setFirstPage(7);
|
|
1002
813
|
}, 20);
|
|
1003
814
|
setActTimeout(() => {
|
|
@@ -1012,7 +823,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1012
823
|
await sleep(100);
|
|
1013
824
|
expect(states.length).toBe(5);
|
|
1014
825
|
expect(states[0]).toMatchObject({
|
|
1015
|
-
hasNextPage:
|
|
826
|
+
hasNextPage: false,
|
|
1016
827
|
data: undefined,
|
|
1017
828
|
isFetching: true,
|
|
1018
829
|
isFetchingNextPage: false,
|
|
@@ -1055,14 +866,17 @@ describe('useInfiniteQuery', () => {
|
|
|
1055
866
|
const key = queryKey();
|
|
1056
867
|
const states = [];
|
|
1057
868
|
function Page() {
|
|
1058
|
-
const state = createInfiniteQuery(
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
869
|
+
const state = createInfiniteQuery(() => ({
|
|
870
|
+
queryKey: key,
|
|
871
|
+
queryFn: async ({ pageParam }) => {
|
|
872
|
+
await sleep(10);
|
|
873
|
+
return pageParam;
|
|
874
|
+
},
|
|
1062
875
|
initialData: { pages: [1], pageParams: [1] },
|
|
1063
876
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
877
|
+
defaultPageParam: 0,
|
|
1064
878
|
notifyOnChangeProps: 'all',
|
|
1065
|
-
});
|
|
879
|
+
}));
|
|
1066
880
|
createRenderEffect(() => {
|
|
1067
881
|
states.push({ ...state });
|
|
1068
882
|
});
|
|
@@ -1112,9 +926,12 @@ describe('useInfiniteQuery', () => {
|
|
|
1112
926
|
const key = queryKey();
|
|
1113
927
|
const states = [];
|
|
1114
928
|
function Page() {
|
|
1115
|
-
const state = createInfiniteQuery(
|
|
929
|
+
const state = createInfiniteQuery(() => ({
|
|
930
|
+
queryKey: key,
|
|
931
|
+
queryFn: ({ pageParam }) => Number(pageParam),
|
|
932
|
+
defaultPageParam: 1,
|
|
1116
933
|
getNextPageParam: () => undefined,
|
|
1117
|
-
});
|
|
934
|
+
}));
|
|
1118
935
|
createRenderEffect(() => {
|
|
1119
936
|
states.push({ ...state });
|
|
1120
937
|
});
|
|
@@ -1127,7 +944,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1127
944
|
expect(states.length).toBe(2);
|
|
1128
945
|
expect(states[0]).toMatchObject({
|
|
1129
946
|
data: undefined,
|
|
1130
|
-
hasNextPage:
|
|
947
|
+
hasNextPage: false,
|
|
1131
948
|
isFetching: true,
|
|
1132
949
|
isFetchingNextPage: false,
|
|
1133
950
|
isSuccess: false,
|
|
@@ -1144,10 +961,13 @@ describe('useInfiniteQuery', () => {
|
|
|
1144
961
|
const key = queryKey();
|
|
1145
962
|
const states = [];
|
|
1146
963
|
function Page() {
|
|
1147
|
-
const state = createInfiniteQuery(
|
|
1148
|
-
|
|
964
|
+
const state = createInfiniteQuery(() => ({
|
|
965
|
+
queryKey: key,
|
|
966
|
+
queryFn: ({ pageParam }) => pageParam,
|
|
967
|
+
defaultPageParam: 10,
|
|
968
|
+
initialData: { pages: [10], pageParams: [10] },
|
|
1149
969
|
getNextPageParam: (lastPage) => (lastPage === 10 ? 11 : undefined),
|
|
1150
|
-
});
|
|
970
|
+
}));
|
|
1151
971
|
createRenderEffect(() => {
|
|
1152
972
|
states.push({ ...state });
|
|
1153
973
|
});
|
|
@@ -1177,10 +997,13 @@ describe('useInfiniteQuery', () => {
|
|
|
1177
997
|
const key = queryKey();
|
|
1178
998
|
const states = [];
|
|
1179
999
|
function Page() {
|
|
1180
|
-
const state = createInfiniteQuery(
|
|
1181
|
-
|
|
1000
|
+
const state = createInfiniteQuery(() => ({
|
|
1001
|
+
queryKey: key,
|
|
1002
|
+
queryFn: ({ pageParam }) => pageParam,
|
|
1003
|
+
defaultPageParam: 10,
|
|
1004
|
+
initialData: { pages: [10], pageParams: [10] },
|
|
1182
1005
|
getNextPageParam: () => undefined,
|
|
1183
|
-
});
|
|
1006
|
+
}));
|
|
1184
1007
|
createRenderEffect(() => {
|
|
1185
1008
|
states.push({ ...state });
|
|
1186
1009
|
});
|
|
@@ -1210,13 +1033,16 @@ describe('useInfiniteQuery', () => {
|
|
|
1210
1033
|
const key = queryKey();
|
|
1211
1034
|
const states = [];
|
|
1212
1035
|
function Page() {
|
|
1213
|
-
const state = createInfiniteQuery(
|
|
1214
|
-
|
|
1036
|
+
const state = createInfiniteQuery(() => ({
|
|
1037
|
+
queryKey: key,
|
|
1038
|
+
queryFn: ({ pageParam }) => Number(pageParam),
|
|
1039
|
+
defaultPageParam: 1,
|
|
1040
|
+
getNextPageParam: (lastPage) => (lastPage === 1 ? 2 : undefined),
|
|
1215
1041
|
select: (data) => ({
|
|
1216
1042
|
pages: data.pages.map((x) => x.toString()),
|
|
1217
1043
|
pageParams: data.pageParams,
|
|
1218
1044
|
}),
|
|
1219
|
-
});
|
|
1045
|
+
}));
|
|
1220
1046
|
createRenderEffect(() => {
|
|
1221
1047
|
states.push({ ...state });
|
|
1222
1048
|
});
|
|
@@ -1229,7 +1055,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1229
1055
|
expect(states.length).toBe(2);
|
|
1230
1056
|
expect(states[0]).toMatchObject({
|
|
1231
1057
|
data: undefined,
|
|
1232
|
-
hasNextPage:
|
|
1058
|
+
hasNextPage: false,
|
|
1233
1059
|
isFetching: true,
|
|
1234
1060
|
isFetchingNextPage: false,
|
|
1235
1061
|
isSuccess: false,
|
|
@@ -1257,9 +1083,12 @@ describe('useInfiniteQuery', () => {
|
|
|
1257
1083
|
};
|
|
1258
1084
|
function Page() {
|
|
1259
1085
|
let fetchCountRef = 0;
|
|
1260
|
-
const state = createInfiniteQuery(
|
|
1086
|
+
const state = createInfiniteQuery(() => ({
|
|
1087
|
+
queryKey: key,
|
|
1088
|
+
queryFn: ({ pageParam }) => fetchItemsWithLimit(pageParam, fetchCountRef++),
|
|
1089
|
+
defaultPageParam: 0,
|
|
1261
1090
|
getNextPageParam: (lastPage) => lastPage.nextId,
|
|
1262
|
-
});
|
|
1091
|
+
}));
|
|
1263
1092
|
return (<div>
|
|
1264
1093
|
<h1>Pagination</h1>
|
|
1265
1094
|
<Switch fallback={<>
|
|
@@ -1291,7 +1120,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1291
1120
|
// makes an actual network request
|
|
1292
1121
|
// and calls invalidateQueries in an onSuccess
|
|
1293
1122
|
items.splice(4, 1);
|
|
1294
|
-
queryClient.invalidateQueries(key
|
|
1123
|
+
queryClient.invalidateQueries({ queryKey: key });
|
|
1295
1124
|
}}>
|
|
1296
1125
|
Remove item
|
|
1297
1126
|
</button>
|
|
@@ -1300,7 +1129,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1300
1129
|
{!state.isFetchingNextPage ? 'Background Updating...' : null}
|
|
1301
1130
|
</div>
|
|
1302
1131
|
</>}>
|
|
1303
|
-
<Match when={state.status === '
|
|
1132
|
+
<Match when={state.status === 'pending'}>Loading...</Match>
|
|
1304
1133
|
<Match when={state.status === 'error'}>
|
|
1305
1134
|
<span>Error: {state.error.message}</span>
|
|
1306
1135
|
</Match>
|
|
@@ -1349,9 +1178,12 @@ describe('useInfiniteQuery', () => {
|
|
|
1349
1178
|
function Page() {
|
|
1350
1179
|
let fetchCountRef = 0;
|
|
1351
1180
|
const [isRemovedLastPage, setIsRemovedLastPage] = createSignal(false);
|
|
1352
|
-
const state = createInfiniteQuery(
|
|
1181
|
+
const state = createInfiniteQuery(() => ({
|
|
1182
|
+
queryKey: key,
|
|
1183
|
+
queryFn: ({ pageParam }) => fetchItems(pageParam, fetchCountRef++, pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage())),
|
|
1184
|
+
defaultPageParam: 0,
|
|
1353
1185
|
getNextPageParam: (lastPage) => lastPage.nextId,
|
|
1354
|
-
});
|
|
1186
|
+
}));
|
|
1355
1187
|
return (<div>
|
|
1356
1188
|
<h1>Pagination</h1>
|
|
1357
1189
|
<Switch fallback={<>
|
|
@@ -1387,7 +1219,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1387
1219
|
: null}
|
|
1388
1220
|
</div>
|
|
1389
1221
|
</>}>
|
|
1390
|
-
<Match when={state.status === '
|
|
1222
|
+
<Match when={state.status === 'pending'}>Loading...</Match>
|
|
1391
1223
|
<Match when={state.status === 'error'}>
|
|
1392
1224
|
<span>Error: {state.error.message}</span>
|
|
1393
1225
|
</Match>
|
|
@@ -1442,7 +1274,12 @@ describe('useInfiniteQuery', () => {
|
|
|
1442
1274
|
return promise;
|
|
1443
1275
|
};
|
|
1444
1276
|
function Page() {
|
|
1445
|
-
const state = createInfiniteQuery(
|
|
1277
|
+
const state = createInfiniteQuery(() => ({
|
|
1278
|
+
queryKey: key,
|
|
1279
|
+
queryFn,
|
|
1280
|
+
getNextPageParam: () => undefined,
|
|
1281
|
+
defaultPageParam: 0,
|
|
1282
|
+
}));
|
|
1446
1283
|
return (<div>
|
|
1447
1284
|
<h1>Status: {state.status}</h1>
|
|
1448
1285
|
</div>);
|
|
@@ -1455,4 +1292,23 @@ describe('useInfiniteQuery', () => {
|
|
|
1455
1292
|
await waitFor(() => screen.getByText('off'));
|
|
1456
1293
|
expect(cancelFn).toHaveBeenCalled();
|
|
1457
1294
|
});
|
|
1295
|
+
it('should use provided custom queryClient', async () => {
|
|
1296
|
+
const key = queryKey();
|
|
1297
|
+
const queryFn = () => {
|
|
1298
|
+
return Promise.resolve('custom client');
|
|
1299
|
+
};
|
|
1300
|
+
function Page() {
|
|
1301
|
+
const state = createInfiniteQuery(() => ({
|
|
1302
|
+
queryKey: key,
|
|
1303
|
+
queryFn,
|
|
1304
|
+
getNextPageParam: () => undefined,
|
|
1305
|
+
defaultPageParam: 0,
|
|
1306
|
+
}), () => queryClient);
|
|
1307
|
+
return (<div>
|
|
1308
|
+
<h1>Status: {state.data?.pages[0]}</h1>
|
|
1309
|
+
</div>);
|
|
1310
|
+
}
|
|
1311
|
+
render(() => <Page />);
|
|
1312
|
+
await waitFor(() => screen.getByText('Status: custom client'));
|
|
1313
|
+
});
|
|
1458
1314
|
});
|