Skip to content

Commit e78a470

Browse files
committed
remove onError callback
because errors are caught internally by persistQueryClient and the persisted client is then removed
1 parent 291b0a5 commit e78a470

2 files changed

Lines changed: 71 additions & 13 deletions

File tree

src/persistQueryClient/PersistQueryClientProvider.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,21 @@ export interface PersistQueryClientProviderProps
88
extends QueryClientProviderProps {
99
persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>
1010
onSuccess?: () => void
11-
onError?: (error: unknown) => Promise<unknown> | void
1211
}
1312

1413
export const PersistQueryClientProvider = ({
1514
client,
1615
children,
1716
persistOptions,
1817
onSuccess,
19-
onError,
2018
...props
2119
}: PersistQueryClientProviderProps): JSX.Element => {
2220
const [isHydrating, setIsHydrating] = React.useState(true)
23-
const refs = React.useRef({ persistOptions, onSuccess, onError })
21+
const refs = React.useRef({ persistOptions, onSuccess })
2422
const previousPromise = React.useRef(Promise.resolve())
2523

2624
React.useEffect(() => {
27-
refs.current = { persistOptions, onSuccess, onError }
25+
refs.current = { persistOptions, onSuccess }
2826
})
2927

3028
React.useEffect(() => {
@@ -40,8 +38,6 @@ export const PersistQueryClientProvider = ({
4038
previousPromise.current = promise
4139
await promise
4240
refs.current.onSuccess?.()
43-
} catch (error) {
44-
refs.current.onError?.(error)
4541
} finally {
4642
setIsHydrating(false)
4743
}

src/persistQueryClient/tests/PersistQueryClientProvider.test.tsx

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import React from 'react'
22
import { render, waitFor } from '@testing-library/react'
33

44
import { QueryClient, useQuery, UseQueryResult, useQueries } from '../..'
5-
import { queryKey } from '../../reactjs/tests/utils'
5+
import {
6+
createQueryClient,
7+
mockLogger,
8+
queryKey,
9+
} from '../../reactjs/tests/utils'
610
import { sleep } from '../../core/utils'
711
import { PersistedClient, Persister, persistQueryClientSave } from '../persist'
812
import { PersistQueryClientProvider } from '../PersistQueryClientProvider'
@@ -24,12 +28,31 @@ const createMockPersister = (): Persister => {
2428
}
2529
}
2630

31+
const createMockErrorPersister = (
32+
removeClient: Persister['removeClient']
33+
): [Error, Persister] => {
34+
const error = new Error('restore failed')
35+
return [
36+
error,
37+
{
38+
async persistClient() {
39+
// noop
40+
},
41+
async restoreClient() {
42+
await sleep(10)
43+
throw error
44+
},
45+
removeClient,
46+
},
47+
]
48+
}
49+
2750
describe('PersistQueryClientProvider', () => {
2851
test('restores cache from persister', async () => {
2952
const key = queryKey()
3053
const states: UseQueryResult<string>[] = []
3154

32-
const queryClient = new QueryClient()
55+
const queryClient = createQueryClient()
3356
await queryClient.prefetchQuery(key, () => Promise.resolve('hydrated'))
3457

3558
const persister = createMockPersister()
@@ -98,7 +121,7 @@ describe('PersistQueryClientProvider', () => {
98121
const key = queryKey()
99122
const states: UseQueryResult[] = []
100123

101-
const queryClient = new QueryClient()
124+
const queryClient = createQueryClient()
102125
await queryClient.prefetchQuery(key, () => Promise.resolve('hydrated'))
103126

104127
const persister = createMockPersister()
@@ -174,7 +197,7 @@ describe('PersistQueryClientProvider', () => {
174197
const key = queryKey()
175198
const states: UseQueryResult<string>[] = []
176199

177-
const queryClient = new QueryClient()
200+
const queryClient = createQueryClient()
178201
await queryClient.prefetchQuery(key, () => Promise.resolve('hydrated'))
179202

180203
const persister = createMockPersister()
@@ -252,7 +275,7 @@ describe('PersistQueryClientProvider', () => {
252275
const key = queryKey()
253276
const states: UseQueryResult<string>[] = []
254277

255-
const queryClient = new QueryClient()
278+
const queryClient = createQueryClient()
256279
await queryClient.prefetchQuery(key, () => Promise.resolve('hydrated'))
257280

258281
const persister = createMockPersister()
@@ -319,7 +342,7 @@ describe('PersistQueryClientProvider', () => {
319342
test('should call onSuccess after successful restoring', async () => {
320343
const key = queryKey()
321344

322-
const queryClient = new QueryClient()
345+
const queryClient = createQueryClient()
323346
await queryClient.prefetchQuery(key, () => Promise.resolve('hydrated'))
324347

325348
const persister = createMockPersister()
@@ -360,11 +383,50 @@ describe('PersistQueryClientProvider', () => {
360383
await waitFor(() => rendered.getByText('fetched'))
361384
})
362385

386+
test('should remove cache after non-successful restoring', async () => {
387+
const key = queryKey()
388+
jest.spyOn(console, 'warn').mockImplementation(() => undefined)
389+
jest.spyOn(console, 'error').mockImplementation(() => undefined)
390+
391+
const queryClient = createQueryClient()
392+
const removeClient = jest.fn()
393+
394+
const [error, persister] = createMockErrorPersister(removeClient)
395+
396+
function Page() {
397+
const state = useQuery(key, async () => {
398+
await sleep(10)
399+
return 'fetched'
400+
})
401+
402+
return (
403+
<div>
404+
<h1>{state.data}</h1>
405+
<h2>fetchStatus: {state.fetchStatus}</h2>
406+
</div>
407+
)
408+
}
409+
410+
const rendered = render(
411+
<PersistQueryClientProvider
412+
client={queryClient}
413+
persistOptions={{ persister }}
414+
>
415+
<Page />
416+
</PersistQueryClientProvider>
417+
)
418+
419+
await waitFor(() => rendered.getByText('fetched'))
420+
expect(removeClient).toHaveBeenCalledTimes(1)
421+
expect(mockLogger.error).toHaveBeenCalledTimes(1)
422+
expect(mockLogger.error).toHaveBeenCalledWith(error)
423+
})
424+
363425
test('should be able to persist into multiple clients', async () => {
364426
const key = queryKey()
365427
const states: UseQueryResult[] = []
366428

367-
const queryClient = new QueryClient()
429+
const queryClient = createQueryClient()
368430
await queryClient.prefetchQuery(key, () => Promise.resolve('hydrated'))
369431

370432
const persister = createMockPersister()

0 commit comments

Comments
 (0)