Skip to content

Commit

Permalink
fix: isLoading and isValidating should always respect cache value (#2048
Browse files Browse the repository at this point in the history
)

* fix: isLoading and isValidating should always respect cache value

fix #2030

* test: case for #2030
  • Loading branch information
promer94 committed Jun 24, 2022
1 parent 790e044 commit 5b3af2b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
4 changes: 2 additions & 2 deletions core/use-swr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,8 @@ export const useSWRHandler = <Data = any, Error = any>(
isInitialMount &&
shouldDoInitialRevalidation
)
const isValidating = cached.isValidating || defaultValidatingState
const isLoading = cached.isLoading || defaultValidatingState
const isValidating = isUndefined(cached.isValidating) ? defaultValidatingState : cached.isValidating
const isLoading = isUndefined(cached.isLoading) ? defaultValidatingState : cached.isLoading

// The revalidation function is a carefully crafted wrapper of the original
// `fetcher`, to correctly handle the many edge cases.
Expand Down
19 changes: 19 additions & 0 deletions test/use-swr-loading.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -318,4 +318,23 @@ describe('useSWR - loading', () => {
screen.getByText('loading,validating')
await screen.findByText('ready,ready')
})
it('isLoading and isValidating should always respect cache value', async () => {
const key = createKey()
const Page = () => {
const { data } = useSWR(key, () => createResponse('result', { delay: 10 }))
const { data: response } = useSWR(data, () => createResponse('data', { delay: 10 }))
// eslint-disable-next-line react/display-name
const Component = ((_: any) => () => {
// eslint-disable-next-line react-hooks/rules-of-hooks
const { data: result, isLoading, isValidating } = useSWR(key, () => createResponse('result', { delay: 10 }))
return (
<div>{`result is ${result ? result : 'null'},${isLoading},${isValidating}`}</div>
)
})(response)
return <Component></Component>
}
renderWithConfig(<Page />)
screen.getByText('result is null,true,true')
await screen.findByText('result is result,false,false')
})
})

0 comments on commit 5b3af2b

Please sign in to comment.