Skip to content

Commit 79ad5a9

Browse files
feat(query): add 'getObserversCount' util (TanStack#2130)
* feat(query): add 'getObserversCount' util * refactor: replace usage of private observers with getter
1 parent 2e8f38c commit 79ad5a9

File tree

5 files changed

+36
-9
lines changed

5 files changed

+36
-9
lines changed

src/core/query.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ export class Query<
342342
}
343343
}
344344

345+
getObserversCount(): number {
346+
return this.observers.length
347+
}
348+
345349
invalidate(): void {
346350
if (!this.state.isInvalidated) {
347351
this.dispatch({ type: 'invalidate' })

src/core/tests/query.test.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,4 +447,29 @@ describe('query', () => {
447447
await sleep(100)
448448
expect(queryCache.find(key)).toBeDefined()
449449
})
450+
451+
test('should return proper count of observers', async () => {
452+
const key = queryKey()
453+
const options = { queryKey: key, queryFn: async () => 'data' }
454+
const observer = new QueryObserver(queryClient, options)
455+
const observer2 = new QueryObserver(queryClient, options)
456+
const observer3 = new QueryObserver(queryClient, options)
457+
const query = queryCache.find(key)
458+
459+
expect(query?.getObserversCount()).toEqual(0)
460+
461+
const unsubscribe1 = observer.subscribe()
462+
const unsubscribe2 = observer2.subscribe()
463+
const unsubscribe3 = observer3.subscribe()
464+
expect(query?.getObserversCount()).toEqual(3)
465+
466+
unsubscribe3()
467+
expect(query?.getObserversCount()).toEqual(2)
468+
469+
unsubscribe2()
470+
expect(query?.getObserversCount()).toEqual(1)
471+
472+
unsubscribe1()
473+
expect(query?.getObserversCount()).toEqual(0)
474+
})
450475
})

src/devtools/devtools.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ export function ReactQueryDevtools({
306306
}
307307

308308
const getStatusRank = q =>
309-
q.state.isFetching ? 0 : !q.observers.length ? 3 : q.isStale() ? 2 : 1
309+
q.state.isFetching ? 0 : !q.getObserversCount() ? 3 : q.isStale() ? 2 : 1
310310

311311
const sortFns = {
312312
'Status > Last Updated': (a, b) =>
@@ -613,7 +613,7 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
613613
: 'white',
614614
}}
615615
>
616-
{query.observers.length}
616+
{query.getObserversCount()}
617617
</div>
618618
<Code
619619
suppressHydrationWarning
@@ -689,7 +689,7 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
689689
justifyContent: 'space-between',
690690
}}
691691
>
692-
Observers: <Code>{activeQuery.observers.length}</Code>
692+
Observers: <Code>{activeQuery.getObserversCount()}</Code>
693693
</div>
694694
<div
695695
style={{

src/devtools/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ export function getQueryStatusColor(query, theme) {
1212
? theme.active
1313
: query.isStale()
1414
? theme.warning
15-
: !query.observers.length
15+
: !query.getObserversCount()
1616
? theme.gray
1717
: theme.success
1818
}
1919

2020
export function getQueryStatusLabel(query) {
2121
return query.state.isFetching
2222
? 'fetching'
23-
: !query.observers.length
23+
: !query.getObserversCount()
2424
? 'inactive'
2525
: query.isStale()
2626
? 'stale'

src/react/tests/suspense.test.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,12 @@ describe("useQuery's in Suspense mode", () => {
162162
fireEvent.click(rendered.getByLabelText('toggle'))
163163
await waitFor(() => rendered.getByText('rendered'))
164164

165-
// @ts-expect-error
166-
expect(queryCache.find(key)?.observers.length).toBe(1)
165+
expect(queryCache.find(key)?.getObserversCount()).toBe(1)
167166

168167
fireEvent.click(rendered.getByLabelText('toggle'))
169168

170169
expect(rendered.queryByText('rendered')).toBeNull()
171-
// @ts-expect-error
172-
expect(queryCache.find(key)?.observers.length).toBe(0)
170+
expect(queryCache.find(key)?.getObserversCount()).toBe(0)
173171
})
174172

175173
it('should call onSuccess on the first successful call', async () => {

0 commit comments

Comments
 (0)