0

I have a Next.js application (main-app) that imports and uses UI components (widgets) and API hooks from a separate repository (abc-widgets).

These widgets internally use API hooks that rely on TanStack Query for caching and Axios for requests.
I am using TanStack Query (@tanstack/react-query v5.67.3) in my Next.js app (next v13.1.6, react v18.2.0).

My widgets package (index.js) does not explicitly wrap QueryClientProvider, as I assumed I could wrap it in my main Next.js app instead.

However, when using widgets that rely on useQuery, I get the following error:

Error: No QueryClient set, useQuery cannot be used without a QueryClientProvider

Below is the simplified structure of the two repos.

next-app/
│── src/
│   ├── components/
│   ├── pages/
│   ├── layout/
│   │   ├── Layout.jsx
│   │   └── QueryProvider.jsx  <-- Wraps the app in QueryClientProvider
│   ├── client/
│   │   ├── queryClient.js
│   ├── hooks/
│   ├── styles/
│── package.json  <-- imports "@abc/widgets" and "tanstack-query"
│── next.config.js
└── tsconfig.json
widgets/
│── src/
│   ├── components/
│   │   ├── ShipmentCard.jsx  <-- Uses useQuery()
│   │   ├── CampaignCard.jsx
│   │   ├── BigTask.jsx
│   │   ├── Performance.jsx
│   ├── index.js  <-- Exports all components
│── package.json
│── tsconfig.json
│── rollup.config.js 

Relevant Code Widgets Package (@abc/widgets)

export { default as ShipmentCard } from './components/ShipmentCard';
export { default as CampaignCard } from './components/CampaignCard';
// ...other exports

Next.js App (QueryProvider.jsx)

'use client';

import { QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { persistQueryClient } from '@tanstack/react-query-persist-client';
import { useEffect } from 'react';
import { queryClient } from '../client/queryClient';

export function QueryProvider({ children }) {
  useEffect(() => {
    if (typeof window !== 'undefined') {
      import('@tanstack/query-sync-storage-persister').then(({ createSyncStoragePersister }) => {
        const localStoragePersister = createSyncStoragePersister({
          storage: window.localStorage,
        });
        persistQueryClient({
          queryClient,
          persister: localStoragePersister,
        });
      });
    }
  }, []);

  return (
    <QueryClientProvider client={queryClient}>
      {children}
      <ReactQueryDevtools initialIsOpen={false} position="bottom-right" />
    </QueryClientProvider>
  );
}

Layout Wrapping the App (next-app/src/layout/Layout.jsx) simplified.

import { QueryProvider } from './QueryProvider';

function Layout({ children }) {
  return (
    <QueryProvider>
      <div>{children}</div>
    </QueryProvider>
  );
}

export default Layout;

✅ Confirmed that QueryProvider wraps the entire app through react dev tools – Expected this to provide a QueryClient context to all components, but components inside abc-widgets still threw the "No QueryClient set" error.

✅ Checked for multiple React instances (npm ls react) – Found that both repos use [email protected], so mismatched React versions shouldn’t be an issue.

✅ Ensured QueryClientProvider is NOT wrapped inside abc-widgets – The package only calls useQuery, relying on the provider from next-app.

✅ Tried adding @tanstack/react-query as a peerDependency in abc-widgets – Expected this to ensure a single react-query instance, but the error persisted.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.