Skip to content

Commit 7afe29b

Browse files
authored
Fix useSWRInfinite doesn't revalidate the first page (#1301)
1 parent 97c49ba commit 7afe29b

File tree

3 files changed

+51
-11
lines changed

3 files changed

+51
-11
lines changed

infinite/index.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ export const infinite = ((<Data, Error>(useSWRNext: SWRHook) => (
105105
const data: Data[] = []
106106

107107
const pageSize = resolvePageSize()
108+
108109
let previousPageData = null
109110
for (let i = 0; i < pageSize; ++i) {
110111
const [pageKey, pageArgs] = serialize(
@@ -129,15 +130,11 @@ export const infinite = ((<Data, Error>(useSWRNext: SWRHook) => (
129130
revalidateAll ||
130131
force ||
131132
isUndefined(pageData) ||
132-
(isUndefined(force) && i === 0 && !isUndefined(dataRef.current)) ||
133+
(i === 0 && !isUndefined(dataRef.current)) ||
133134
(originalData && !config.compare(originalData[i], pageData))
134135

135136
if (fn && shouldFetchPage) {
136-
if (pageArgs !== null) {
137-
pageData = await fn(...pageArgs)
138-
} else {
139-
pageData = await fn(pageKey)
140-
}
137+
pageData = await fn(...pageArgs)
141138
cache.set(pageKey, pageData)
142139
}
143140

jest.config.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ module.exports = {
55
modulePathIgnorePatterns: ['<rootDir>/examples/'],
66
setupFilesAfterEnv: ['<rootDir>/jest-setup.ts'],
77
moduleNameMapper: {
8-
'^swr$': '<rootDir>/src'
8+
'^swr$': '<rootDir>/src',
9+
'^swr/infinite$': '<rootDir>/infinite/index.ts',
10+
'^swr/immutable$': '<rootDir>/immutable/index.ts'
911
},
1012
globals: {
1113
'ts-jest': {

test/use-swr-infinite.test.tsx

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'
22
import { render, fireEvent, act, screen } from '@testing-library/react'
33
import { mutate, createCache, SWRConfig } from 'swr'
44
import useSWRInfinite, { getInfiniteKey } from 'swr/infinite'
5-
import { sleep, createResponse } from './utils'
5+
import { sleep, createKey, createResponse } from './utils'
66

77
describe('useSWRInfinite', () => {
88
it('should render the first page component', async () => {
@@ -154,9 +154,11 @@ describe('useSWRInfinite', () => {
154154

155155
it('should skip fetching existing pages when loading more', async () => {
156156
let requests = 0
157+
const key = createKey()
158+
157159
function Page() {
158160
const { data, size, setSize } = useSWRInfinite<string, string>(
159-
index => [`pagetest-4`, index],
161+
index => [key, index],
160162
(_, index) => {
161163
requests++
162164
return createResponse(`page ${index}, `)
@@ -185,13 +187,13 @@ describe('useSWRInfinite', () => {
185187
fireEvent.click(screen.getByText('data:page 0,'))
186188

187189
await screen.findByText('data:page 0, page 1,') // mounted
188-
expect(requests).toEqual(2)
190+
expect(requests).toEqual(3) // revalidate page 1, load page 2
189191

190192
// load next page
191193
fireEvent.click(screen.getByText('data:page 0, page 1,'))
192194

193195
await screen.findByText('data:page 0, page 1, page 2,') // mounted
194-
expect(requests).toEqual(3)
196+
expect(requests).toEqual(5) // revalidate page 1, load page 3
195197
})
196198

197199
it('should cache page count', async () => {
@@ -572,6 +574,7 @@ describe('useSWRInfinite', () => {
572574
fireEvent.click(screen.getByText('data:'))
573575
await screen.findByText('data:')
574576
})
577+
575578
it('should mutate a cache with getInfiniteKey', async () => {
576579
let count = 0
577580
function Page() {
@@ -650,4 +653,42 @@ describe('useSWRInfinite', () => {
650653

651654
expect(loggedValues).toEqual([1])
652655
})
656+
657+
// https://github.com/vercel/swr/issues/908
658+
it('should revalidate first page after mutating', async () => {
659+
let renderedData
660+
const key = createKey()
661+
let v = 'old'
662+
663+
function Page() {
664+
const { data, size, mutate: boundMutate } = useSWRInfinite<
665+
string,
666+
string
667+
>(i => [key, i], () => v)
668+
renderedData = data
669+
670+
return (
671+
<div>
672+
<button
673+
onClick={() => {
674+
v = 'new'
675+
boundMutate([v])
676+
}}
677+
>
678+
mutate
679+
</button>
680+
<p>size=${size}</p>
681+
</div>
682+
)
683+
}
684+
685+
render(<Page />)
686+
687+
await screen.findByText('mutate')
688+
await act(() => sleep(1))
689+
expect(renderedData).toEqual(['old'])
690+
fireEvent.click(screen.getByText('mutate'))
691+
await act(() => sleep(1))
692+
expect(renderedData).toEqual(['new'])
693+
})
653694
})

0 commit comments

Comments
 (0)