Skip to content

Commit 9e23e7a

Browse files
authored
fix(persistQueryClient): rename isHydrating to isRestoring (#3512)
* fix(devtools): devtools should not import relatively from react-query * fix(hydration): properly remove unused hydration entry point hydration moved to the core, and the build entry point was already removed for v4. this is just a proper cleanup. * fix(persistQueryClient): rename isHydrating to isRestoring as we currently have no plans to re-use this for useHydrate, it would be confusing to not get true for this value in those cases * fix(persistQueryClient): document useIsRestoring * fix: make QueryErrorResetBoundary value stable we want a constant value for the lifetime of the QueryErrorResetBoundary component; useMemo doesn't guarantee that. * chore: remove resolutions from package.json as discussed here: #2688 (comment) * fix: log message we don't have a queryKey at this point if a string was used due to how the overloads try to spread things * Update docs/src/pages/plugins/persistQueryClient.md
1 parent a8ddd9b commit 9e23e7a

File tree

16 files changed

+40
-54
lines changed

16 files changed

+40
-54
lines changed

docs/src/pages/plugins/persistQueryClient.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@ ReactDOM.createRoot(rootElement).render(
220220
- will be called when the initial restore is finished
221221
- can be used to [resumePausedMutations](../reference/QueryClient#queryclientresumepausedmutations)
222222

223+
### useIsRestoring
224+
225+
If you are using the `PersistQueryClientProvider`, you can also use the `useIsRestoring` hook alongside it to check if a restore is currently in progress. `useQuery` and friends also check this internally to avoid race conditions between the restore and mounting queries.
226+
223227
## Persisters
224228

225229
### Persisters Interface

examples/offline/src/App.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
QueryClient,
66
MutationCache,
77
onlineManager,
8-
useIsHydrating,
8+
useisRestoring,
99
} from "react-query";
1010
import { ReactQueryDevtools } from "react-query/devtools";
1111
import toast, { Toaster } from "react-hot-toast";
@@ -76,7 +76,7 @@ export default function App() {
7676
}
7777

7878
function Movies() {
79-
const isHydrating = useIsHydrating();
79+
const isRestoring = isRestoring();
8080
return (
8181
<Router
8282
location={location}
@@ -93,7 +93,7 @@ function Movies() {
9393
queryClient.getQueryData(movieKeys.detail(movieId)) ??
9494
// do not load if we are offline or hydrating because it returns a promise that is pending until we go online again
9595
// we just let the Detail component handle it
96-
(onlineManager.isOnline() && !isHydrating
96+
(onlineManager.isOnline() && !isRestoring
9797
? queryClient.fetchQuery(movieKeys.detail(movieId), () =>
9898
api.fetchMovie(movieId)
9999
)

package.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,6 @@
147147
"type-fest": "^0.21.0",
148148
"typescript": "4.5.3"
149149
},
150-
"resolutions": {
151-
"@types/react": "^16.9.41",
152-
"@types/react-dom": "^16.9.8"
153-
},
154150
"bundlewatch": {
155151
"files": [
156152
{

src/core/query.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,7 @@ export class Query<
366366
if (!Array.isArray(this.options.queryKey)) {
367367
if (process.env.NODE_ENV !== 'production') {
368368
this.logger.error(
369-
'As of v4, queryKey needs to be an Array, but the queryKey used was:',
370-
JSON.stringify(this.options.queryKey)
369+
`As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`
371370
)
372371
}
373372
}

src/core/queryObserver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ export class QueryObserver<
439439
status = 'loading'
440440
}
441441
}
442-
if (options._optimisticResults === 'isHydrating') {
442+
if (options._optimisticResults === 'isRestoring') {
443443
fetchStatus = 'idle'
444444
}
445445
}

src/core/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ export interface QueryObserverOptions<
231231
*/
232232
placeholderData?: TQueryData | PlaceholderDataFunction<TQueryData>
233233

234-
_optimisticResults?: 'optimistic' | 'isHydrating'
234+
_optimisticResults?: 'optimistic' | 'isRestoring'
235235
}
236236

237237
type WithRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>

src/devtools/devtools.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import React from 'react'
22
import { useSyncExternalStore } from 'use-sync-external-store/shim'
3-
import { notifyManager } from '../core'
43
import {
54
Query,
65
useQueryClient,
76
onlineManager,
7+
notifyManager,
88
QueryCache,
99
QueryClient,
1010
QueryKey as QueryKeyType,

src/devtools/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react'
2-
import { Query } from '../core'
2+
import type { Query } from 'react-query'
33

44
import { Theme, useTheme } from './theme'
55
import useMediaQuery from './useMediaQuery'

src/hydration/index.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/persistQueryClient/PersistQueryClientProvider.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react'
22

33
import { persistQueryClient, PersistQueryClientOptions } from './persist'
44
import { QueryClientProvider, QueryClientProviderProps } from '../reactjs'
5-
import { IsHydratingProvider } from '../reactjs/Hydrate'
5+
import { IsRestoringProvider } from '../reactjs/isRestoring'
66

77
export type PersistQueryClientProviderProps = QueryClientProviderProps & {
88
persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>
@@ -16,7 +16,7 @@ export const PersistQueryClientProvider = ({
1616
onSuccess,
1717
...props
1818
}: PersistQueryClientProviderProps): JSX.Element => {
19-
const [isHydrating, setIsHydrating] = React.useState(true)
19+
const [isRestoring, setIsRestoring] = React.useState(true)
2020
const refs = React.useRef({ persistOptions, onSuccess })
2121

2222
React.useEffect(() => {
@@ -25,7 +25,7 @@ export const PersistQueryClientProvider = ({
2525

2626
React.useEffect(() => {
2727
let isStale = false
28-
setIsHydrating(true)
28+
setIsRestoring(true)
2929
const [unsubscribe, promise] = persistQueryClient({
3030
...refs.current.persistOptions,
3131
queryClient: client,
@@ -34,7 +34,7 @@ export const PersistQueryClientProvider = ({
3434
promise.then(() => {
3535
if (!isStale) {
3636
refs.current.onSuccess?.()
37-
setIsHydrating(false)
37+
setIsRestoring(false)
3838
}
3939
})
4040

@@ -46,7 +46,7 @@ export const PersistQueryClientProvider = ({
4646

4747
return (
4848
<QueryClientProvider client={client} {...props}>
49-
<IsHydratingProvider value={isHydrating}>{children}</IsHydratingProvider>
49+
<IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>
5050
</QueryClientProvider>
5151
)
5252
}

0 commit comments

Comments
 (0)