Fix the revalidation condition of the first page #895
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes a
useSWRInfinite
bug introduced in #799 by me (thanks @pacocoursey for reporting). To reproduce, just simply userefreshInterval
withuseSWRInfinite
, and the first page will never be revalidated:Reproduction: https://codesandbox.io/s/swr-infinite-forked-mi7rf?file=/src/App.js
Postmortem and Fix
The cause of the bug is this LOC:
...to determine if we should fetch this page or not, which can break down into:
typeof force === 'undefined
: It's not a force revalidation, likemutate()
.i === 0
: It's the first page, we don't want to revalidate every page upon focus.originalData
: It's not the first render. This is the mistake.What we want to achieve for
useSWRInfinite
is this experience: If we have the cache and the screen is empty (first render), we display the cache ASAP. So we added the third condition above. But we should checkdataRef
instead oforiginalData
(originalData
is specifically for mutations).Also added another test.