diff --git a/.changeset/soft-cats-drum.md b/.changeset/soft-cats-drum.md new file mode 100644 index 00000000000..d35e7d54359 --- /dev/null +++ b/.changeset/soft-cats-drum.md @@ -0,0 +1,5 @@ +--- +'@tanstack/preact-query': patch +--- + +fix(preact-query/useQueries): keep unsubscribed idle diff --git a/packages/preact-query/src/__tests__/useQueries.test.tsx b/packages/preact-query/src/__tests__/useQueries.test.tsx index b4ee5e69869..b277dcc5bd9 100644 --- a/packages/preact-query/src/__tests__/useQueries.test.tsx +++ b/packages/preact-query/src/__tests__/useQueries.test.tsx @@ -64,6 +64,34 @@ describe('useQueries', () => { expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }]) }) + it('should not optimistically show fetching when unsubscribed', () => { + const key = queryKey() + const queryFn = vi.fn(() => Promise.resolve('data')) + + function Page() { + const [query] = useQueries({ + queries: [{ queryKey: key, queryFn }], + subscribed: false, + }) + + return ( +
+ isFetching: {String(query.isFetching)} + fetchStatus: {query.fetchStatus} +
+ ) + } + + const rendered = renderWithClient(queryClient, ) + + expect(queryFn).not.toHaveBeenCalled() + expect( + queryClient.getQueryCache().find({ queryKey: key })!.observers.length, + ).toBe(0) + rendered.getByText('isFetching: false') + rendered.getByText('fetchStatus: idle') + }) + it('should track results', async () => { const key1 = queryKey() const results: Array> = [] diff --git a/packages/preact-query/src/useQueries.ts b/packages/preact-query/src/useQueries.ts index b0ed8b0b806..c47e5a91b32 100644 --- a/packages/preact-query/src/useQueries.ts +++ b/packages/preact-query/src/useQueries.ts @@ -306,6 +306,7 @@ export function useQueries< const client = useQueryClient(queryClient) const isRestoring = useIsRestoring() const errorResetBoundary = useQueryErrorResetBoundary() + const subscribed = options.subscribed !== false const defaultedQueries = useMemo( () => @@ -317,11 +318,13 @@ export function useQueries< // Make sure the results are already in fetching state before subscribing or updating options defaultedOptions._optimisticResults = isRestoring ? 'isRestoring' - : 'optimistic' + : subscribed + ? 'optimistic' + : undefined return defaultedOptions }), - [queries, client, isRestoring], + [queries, client, isRestoring, subscribed], ) defaultedQueries.forEach((queryOptions) => { @@ -348,7 +351,7 @@ export function useQueries< (options as QueriesObserverOptions).combine, ) - const shouldSubscribe = !isRestoring && options.subscribed !== false + const shouldSubscribe = !isRestoring && subscribed useSyncExternalStore( useCallback( (onStoreChange) =>