Skip to content

Commit 457723f

Browse files
committed
Merge branch 'main' into alpha
# Conflicts: # packages/query-async-storage-persister/package.json # packages/query-broadcast-client-experimental/package.json # packages/query-core/package.json # packages/query-core/src/mutation.ts # packages/query-core/src/query.ts # packages/query-core/src/utils.ts # packages/query-persist-client-core/package.json # packages/query-sync-storage-persister/package.json # packages/react-query-devtools/package.json # packages/react-query-persist-client/package.json # packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx # packages/react-query/package.json # packages/react-query/src/__tests__/useQuery.test.tsx # packages/solid-query/package.json # packages/svelte-query/package.json # packages/vue-query/package.json
2 parents e4700c1 + 878d85e commit 457723f

File tree

8 files changed

+69
-17
lines changed

8 files changed

+69
-17
lines changed

packages/query-core/src/mutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ export class Mutation<
119119
}
120120

121121
addObserver(observer: MutationObserver<any, any, any, any>): void {
122-
if (this.#observers.indexOf(observer) === -1) {
122+
if (!this.#observers.includes(observer)) {
123123
this.#observers.push(observer)
124124

125125
// Stop the mutation from being garbage collected

packages/query-core/src/onlineManager.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ type SetupFn = (
55
setOnline: (online?: boolean) => void,
66
) => (() => void) | undefined
77

8+
const onlineEvents = ['online', 'offline'] as const
9+
810
export class OnlineManager extends Subscribable {
911
#online?: boolean
1012
#cleanup?: () => void
@@ -19,13 +21,15 @@ export class OnlineManager extends Subscribable {
1921
if (!isServer && window.addEventListener) {
2022
const listener = () => onOnline()
2123
// Listen to online
22-
window.addEventListener('online', listener, false)
23-
window.addEventListener('offline', listener, false)
24+
onlineEvents.forEach((event) => {
25+
window.addEventListener(event, listener, false)
26+
})
2427

2528
return () => {
2629
// Be sure to unsubscribe if a new handler is set
27-
window.removeEventListener('online', listener)
28-
window.removeEventListener('offline', listener)
30+
onlineEvents.forEach((event) => {
31+
window.removeEventListener(event, listener)
32+
})
2933
}
3034
}
3135

packages/query-core/src/queriesObserver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Subscribable } from './subscribable'
1111
import { replaceEqualDeep } from './utils'
1212

1313
function difference<T>(array1: T[], array2: T[]): T[] {
14-
return array1.filter((x) => array2.indexOf(x) === -1)
14+
return array1.filter((x) => !array2.includes(x))
1515
}
1616

1717
function replaceAt<T>(array: T[], index: number, value: T): T[] {

packages/query-core/src/query.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ export class Query<
281281
}
282282

283283
addObserver(observer: QueryObserver<any, any, any, any, any>): void {
284-
if (this.#observers.indexOf(observer) === -1) {
284+
if (!this.#observers.includes(observer)) {
285285
this.#observers.push(observer)
286286

287287
// Stop the query from being garbage collected
@@ -292,7 +292,7 @@ export class Query<
292292
}
293293

294294
removeObserver(observer: QueryObserver<any, any, any, any, any>): void {
295-
if (this.#observers.indexOf(observer) !== -1) {
295+
if (this.#observers.includes(observer)) {
296296
this.#observers = this.#observers.filter((x) => x !== observer)
297297

298298
if (!this.#observers.length) {

packages/query-core/src/queryObserver.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ export class QueryObserver<
191191
}
192192

193193
// Update result
194-
this.#updateResult(notifyOptions)
194+
this.updateResult(notifyOptions)
195195

196196
// Update stale interval if needed
197197
if (
@@ -291,7 +291,7 @@ export class QueryObserver<
291291
...fetchOptions,
292292
cancelRefetch: fetchOptions.cancelRefetch ?? true,
293293
}).then(() => {
294-
this.#updateResult()
294+
this.updateResult()
295295
return this.#currentResult
296296
})
297297
}
@@ -337,7 +337,7 @@ export class QueryObserver<
337337

338338
this.#staleTimeoutId = setTimeout(() => {
339339
if (!this.#currentResult.isStale) {
340-
this.#updateResult()
340+
this.updateResult()
341341
}
342342
}, timeout)
343343
}
@@ -561,7 +561,7 @@ export class QueryObserver<
561561
return result as QueryObserverResult<TData, TError>
562562
}
563563

564-
#updateResult(notifyOptions?: NotifyOptions): void {
564+
updateResult(notifyOptions?: NotifyOptions): void {
565565
const prevResult = this.#currentResult as
566566
| QueryObserverResult<TData, TError>
567567
| undefined
@@ -637,7 +637,7 @@ export class QueryObserver<
637637
}
638638

639639
onQueryUpdate(): void {
640-
this.#updateResult()
640+
this.updateResult()
641641

642642
if (this.hasListeners()) {
643643
this.#updateTimers()

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,13 @@ describe('PersistQueryClientProvider', () => {
303303

304304
queryClient.clear()
305305

306+
let fetched = false
307+
306308
function Page() {
307309
const state = useQuery({
308310
queryKey: key,
309311
queryFn: async () => {
312+
fetched = true
310313
await sleep(10)
311314
return 'fetched'
312315
},
@@ -336,7 +339,9 @@ describe('PersistQueryClientProvider', () => {
336339
await waitFor(() => rendered.getByText('data: null'))
337340
await waitFor(() => rendered.getByText('data: hydrated'))
338341

339-
expect(states).toHaveLength(2)
342+
expect(states).toHaveLength(3)
343+
344+
expect(fetched).toBe(false)
340345

341346
expect(states[0]).toMatchObject({
342347
status: 'pending',
@@ -349,6 +354,9 @@ describe('PersistQueryClientProvider', () => {
349354
fetchStatus: 'idle',
350355
data: 'hydrated',
351356
})
357+
358+
// #5443 seems like we get an extra render now ...
359+
expect(states[1]).toStrictEqual(states[2])
352360
})
353361

354362
test('should call onSuccess after successful restoring', async () => {

packages/react-query/src/__tests__/useQuery.test.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5960,4 +5960,37 @@ describe('useQuery', () => {
59605960

59615961
await waitFor(() => rendered.getByText('data: custom client'))
59625962
})
5963+
5964+
it('should be notified of updates between create and subscribe', async () => {
5965+
const key = queryKey()
5966+
5967+
function Page() {
5968+
const mounted = React.useRef<boolean>(false)
5969+
const { data, status } = useQuery({
5970+
enabled: false,
5971+
queryKey: key,
5972+
queryFn: async () => {
5973+
await sleep(10)
5974+
return 5
5975+
},
5976+
})
5977+
5978+
// this simulates a synchronous update between the time the query is created
5979+
// and the time it is subscribed to that could be missed otherwise
5980+
if (!mounted.current) {
5981+
mounted.current = true
5982+
queryClient.setQueryData(key, 1)
5983+
}
5984+
5985+
return (
5986+
<div>
5987+
<span>status: {status}</span>
5988+
<span>data: {data}</span>
5989+
</div>
5990+
)
5991+
}
5992+
const rendered = renderWithClient(queryClient, <Page />)
5993+
await waitFor(() => rendered.getByText('status: success'))
5994+
await waitFor(() => rendered.getByText('data: 1'))
5995+
})
59635996
})

packages/react-query/src/useBaseQuery.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,17 @@ export function useBaseQuery<
5858

5959
React.useSyncExternalStore(
6060
React.useCallback(
61-
(onStoreChange) =>
62-
isRestoring
61+
(onStoreChange) => {
62+
const unsubscribe = isRestoring
6363
? () => undefined
64-
: observer.subscribe(notifyManager.batchCalls(onStoreChange)),
64+
: observer.subscribe(notifyManager.batchCalls(onStoreChange))
65+
66+
// Update result to make sure we did not miss any query updates
67+
// between creating the observer and subscribing to it.
68+
observer.updateResult()
69+
70+
return unsubscribe
71+
},
6572
[observer, isRestoring],
6673
),
6774
() => observer.getCurrentResult(),

0 commit comments

Comments
 (0)