Skip to content

Commit f7ead29

Browse files
committed
Merge branch 'main' into beta
# Conflicts: # packages/react-query-persist-client/package.json # packages/react-query-persist-client/src/PersistQueryClientProvider.tsx
2 parents 66f45c8 + bbcdaa2 commit f7ead29

File tree

2 files changed

+85
-11
lines changed

2 files changed

+85
-11
lines changed

packages/react-query-persist-client/src/PersistQueryClientProvider.tsx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,34 @@ export const PersistQueryClientProvider = ({
2020
}: PersistQueryClientProviderProps): JSX.Element => {
2121
const [isRestoring, setIsRestoring] = React.useState(true)
2222
const refs = React.useRef({ persistOptions, onSuccess })
23+
const didRestore = React.useRef(false)
2324

2425
React.useEffect(() => {
2526
refs.current = { persistOptions, onSuccess }
2627
})
2728

2829
React.useEffect(() => {
29-
let isStale = false
30-
setIsRestoring(true)
31-
const [unsubscribe, promise] = persistQueryClient({
32-
...refs.current.persistOptions,
33-
queryClient: client,
34-
})
30+
if (!didRestore.current) {
31+
didRestore.current = true
32+
setIsRestoring(true)
33+
const [unsubscribe, promise] = persistQueryClient({
34+
...refs.current.persistOptions,
35+
queryClient: client,
36+
})
3537

3638
promise.then(async () => {
37-
if (!isStale) {
3839
try {
3940
await refs.current.onSuccess?.()
4041
} finally {
4142
setIsRestoring(false)
4243
}
43-
}
4444
})
4545

46-
return () => {
47-
isStale = true
48-
unsubscribe()
46+
return () => {
47+
unsubscribe()
48+
}
4949
}
50+
return undefined
5051
}, [client])
5152

5253
return (

packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,4 +629,77 @@ describe('PersistQueryClientProvider', () => {
629629
data: 'queryFn2',
630630
})
631631
})
632+
633+
test('should only restore once in StrictMode', async () => {
634+
let restoreCount = 0
635+
const createPersister = (): Persister => {
636+
let storedState: PersistedClient | undefined
637+
638+
return {
639+
async persistClient(persistClient) {
640+
storedState = persistClient
641+
},
642+
async restoreClient() {
643+
restoreCount++
644+
await sleep(10)
645+
return storedState
646+
},
647+
removeClient() {
648+
storedState = undefined
649+
},
650+
}
651+
}
652+
653+
const key = queryKey()
654+
655+
const queryClient = createQueryClient()
656+
await queryClient.prefetchQuery({
657+
queryKey: key,
658+
queryFn: () => Promise.resolve('hydrated'),
659+
})
660+
661+
const persister = createPersister()
662+
663+
const onSuccess = vi.fn()
664+
665+
await persistQueryClientSave({ queryClient, persister })
666+
667+
queryClient.clear()
668+
669+
function Page() {
670+
const state = useQuery({
671+
queryKey: key,
672+
queryFn: async () => {
673+
await sleep(10)
674+
return 'fetched'
675+
},
676+
})
677+
678+
return (
679+
<div>
680+
<h1>{state.data}</h1>
681+
<h2>fetchStatus: {state.fetchStatus}</h2>
682+
</div>
683+
)
684+
}
685+
686+
const rendered = render(
687+
<React.StrictMode>
688+
<PersistQueryClientProvider
689+
client={queryClient}
690+
persistOptions={{ persister }}
691+
onSuccess={onSuccess}
692+
>
693+
<Page />
694+
</PersistQueryClientProvider>
695+
</React.StrictMode>,
696+
)
697+
698+
await waitFor(() => rendered.getByText('fetchStatus: idle'))
699+
await waitFor(() => rendered.getByText('hydrated'))
700+
await waitFor(() => rendered.getByText('fetched'))
701+
702+
expect(onSuccess).toHaveBeenCalledTimes(1)
703+
expect(restoreCount).toBe(1)
704+
})
632705
})

0 commit comments

Comments
 (0)