@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
66 lines (65 loc) • 2.58 kB
JavaScript
import { QueryClient, defaultShouldDehydrateQuery, isServer } from "@tanstack/react-query";
import { getErrorStatus } from "./medusa-errors.js";
const defaultQueryClientConfig = {
defaultOptions: {
queries: {
staleTime: 60000,
gcTime: 300000,
retry: (failureCount, error)=>{
const status = getErrorStatus(error);
if (status && status >= 400 && status < 500) return false;
return failureCount < 3;
},
retryDelay: (attemptIndex)=>Math.min(1000 * 2 ** attemptIndex, 30000)
},
mutations: {
retry: 1,
retryDelay: 1000
},
dehydrate: {
shouldDehydrateQuery: (query)=>defaultShouldDehydrateQuery(query) || "pending" === query.state.status,
shouldRedactErrors: ()=>true
}
}
};
const mergeQueryClientConfig = (baseConfig, overrides)=>{
if (!overrides) return baseConfig;
return {
...baseConfig,
...overrides,
defaultOptions: {
...baseConfig.defaultOptions,
...overrides.defaultOptions,
queries: {
...baseConfig.defaultOptions?.queries,
...overrides.defaultOptions?.queries
},
mutations: {
...baseConfig.defaultOptions?.mutations,
...overrides.defaultOptions?.mutations
},
dehydrate: {
...baseConfig.defaultOptions?.dehydrate,
...overrides.defaultOptions?.dehydrate
},
hydrate: {
...baseConfig.defaultOptions?.hydrate,
...overrides.defaultOptions?.hydrate
}
}
};
};
function createQueryClientConfig(overrides) {
return mergeQueryClientConfig(defaultQueryClientConfig, overrides);
}
function makeQueryClient(overrides) {
return new QueryClient(createQueryClientConfig(overrides));
}
let browserQueryClient;
function getQueryClient(overrides) {
if (isServer) return makeQueryClient(overrides);
if (browserQueryClient && overrides && "undefined" != typeof process && process.env?.NODE_ENV !== "production") console.warn("[getQueryClient] Browser QueryClient already exists; overrides will be ignored. Pass overrides only on first initialisation or use makeQueryClient for a fresh instance.");
if (!browserQueryClient) browserQueryClient = makeQueryClient(overrides);
return browserQueryClient;
}
export { createQueryClientConfig, getQueryClient, makeQueryClient };