@@ -31,11 +31,15 @@ const initialItems = (page: number): Result => {
31
31
}
32
32
}
33
33
34
- const fetchItems = async ( page : number , ts : number ) : Promise < Result > => {
34
+ const fetchItems = async (
35
+ page : number ,
36
+ ts : number ,
37
+ nextId ?: any
38
+ ) : Promise < Result > => {
35
39
await sleep ( 10 )
36
40
return {
37
41
items : [ ...new Array ( 10 ) ] . fill ( null ) . map ( ( _ , d ) => page * pageSize + d ) ,
38
- nextId : page + 1 ,
42
+ nextId : nextId ?? page + 1 ,
39
43
ts,
40
44
}
41
45
}
@@ -1108,4 +1112,137 @@ describe('useInfiniteQuery', () => {
1108
1112
// ensure that Item: 4 is no longer rendered
1109
1113
expect ( rendered . queryAllByText ( 'Item: 4' ) ) . toHaveLength ( 0 )
1110
1114
} )
1115
+
1116
+ it ( 'should compute canFetchMore correctly for falsy getFetchMore return value on refetching' , async ( ) => {
1117
+ const key = queryKey ( )
1118
+ const MAX = 2
1119
+
1120
+ function Page ( ) {
1121
+ const fetchCountRef = React . useRef ( 0 )
1122
+ const [ isRemovedLastPage , setIsRemovedLastPage ] = React . useState < boolean > (
1123
+ false
1124
+ )
1125
+ const {
1126
+ status,
1127
+ data,
1128
+ error,
1129
+ isFetching,
1130
+ isFetchingMore,
1131
+ fetchMore,
1132
+ canFetchMore,
1133
+ refetch,
1134
+ } = useInfiniteQuery < Result , Error > (
1135
+ key ,
1136
+ ( _key , nextId = 0 ) =>
1137
+ fetchItems (
1138
+ nextId ,
1139
+ fetchCountRef . current ++ ,
1140
+ nextId === MAX || ( nextId === MAX - 1 && isRemovedLastPage )
1141
+ ? false
1142
+ : undefined
1143
+ ) ,
1144
+ {
1145
+ getFetchMore : ( lastGroup , _allGroups ) => lastGroup . nextId ,
1146
+ }
1147
+ )
1148
+
1149
+ return (
1150
+ < div >
1151
+ < h1 > Pagination</ h1 >
1152
+ { status === 'loading' ? (
1153
+ 'Loading...'
1154
+ ) : status === 'error' ? (
1155
+ < span > Error: { error ?. message } </ span >
1156
+ ) : (
1157
+ < >
1158
+ < div > Data:</ div >
1159
+ { data ?. map ( ( page , i ) => (
1160
+ < div key = { i } >
1161
+ < div >
1162
+ Page { i } : { page . ts }
1163
+ </ div >
1164
+ < div key = { i } >
1165
+ { page . items . map ( item => (
1166
+ < p key = { item } > Item: { item } </ p >
1167
+ ) ) }
1168
+ </ div >
1169
+ </ div >
1170
+ ) ) }
1171
+ < div >
1172
+ < button
1173
+ onClick = { ( ) => fetchMore ( ) }
1174
+ disabled = { ! canFetchMore || Boolean ( isFetchingMore ) }
1175
+ >
1176
+ { isFetchingMore
1177
+ ? 'Loading more...'
1178
+ : canFetchMore
1179
+ ? 'Load More'
1180
+ : 'Nothing more to load' }
1181
+ </ button >
1182
+ < button onClick = { ( ) => refetch ( ) } > Refetch</ button >
1183
+ < button onClick = { ( ) => setIsRemovedLastPage ( true ) } >
1184
+ Remove Last Page
1185
+ </ button >
1186
+ </ div >
1187
+ < div >
1188
+ { isFetching && ! isFetchingMore
1189
+ ? 'Background Updating...'
1190
+ : null }
1191
+ </ div >
1192
+ </ >
1193
+ ) }
1194
+ </ div >
1195
+ )
1196
+ }
1197
+
1198
+ const rendered = renderWithClient ( client , < Page /> )
1199
+
1200
+ rendered . getByText ( 'Loading...' )
1201
+
1202
+ await waitFor ( ( ) => {
1203
+ rendered . getByText ( 'Item: 9' )
1204
+ rendered . getByText ( 'Page 0: 0' )
1205
+ } )
1206
+
1207
+ fireEvent . click ( rendered . getByText ( 'Load More' ) )
1208
+
1209
+ await waitFor ( ( ) => rendered . getByText ( 'Loading more...' ) )
1210
+
1211
+ await waitFor ( ( ) => {
1212
+ rendered . getByText ( 'Item: 19' )
1213
+ rendered . getByText ( 'Page 0: 0' )
1214
+ rendered . getByText ( 'Page 1: 1' )
1215
+ } )
1216
+
1217
+ fireEvent . click ( rendered . getByText ( 'Load More' ) )
1218
+
1219
+ await waitFor ( ( ) => rendered . getByText ( 'Loading more...' ) )
1220
+
1221
+ await waitFor ( ( ) => {
1222
+ rendered . getByText ( 'Item: 29' )
1223
+ rendered . getByText ( 'Page 0: 0' )
1224
+ rendered . getByText ( 'Page 1: 1' )
1225
+ rendered . getByText ( 'Page 2: 2' )
1226
+ } )
1227
+
1228
+ rendered . getByText ( 'Nothing more to load' )
1229
+
1230
+ fireEvent . click ( rendered . getByText ( 'Remove Last Page' ) )
1231
+
1232
+ await sleep ( 10 )
1233
+
1234
+ fireEvent . click ( rendered . getByText ( 'Refetch' ) )
1235
+
1236
+ await waitFor ( ( ) => rendered . getByText ( 'Background Updating...' ) )
1237
+
1238
+ await waitFor ( ( ) => {
1239
+ rendered . getByText ( 'Page 0: 3' )
1240
+ rendered . getByText ( 'Page 1: 4' )
1241
+ } )
1242
+
1243
+ expect ( rendered . queryByText ( 'Item: 29' ) ) . toBeNull ( )
1244
+ expect ( rendered . queryByText ( 'Page 2: 5' ) ) . toBeNull ( )
1245
+
1246
+ rendered . getByText ( 'Nothing more to load' )
1247
+ } )
1111
1248
} )
0 commit comments