@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
37 lines (36 loc) • 1.79 kB
JavaScript
import { appendQueryKey } from "../shared/query-keys.js";
import { applyRegion } from "../shared/region.js";
const resolveProductQueryInput = (input, region)=>{
const { enabled: _inputEnabled, ...baseInput } = input;
return applyRegion(baseInput, region);
};
const createProductListQueryDefinition = ({ input, region, service, buildListParams, queryKeys, useGlobalFetcher, transformInput })=>{
const resolvedInput = resolveProductQueryInput(input, region);
const normalizedInput = transformInput ? transformInput(resolvedInput) : resolvedInput;
const listParams = buildListParams(normalizedInput);
const globalFetcher = useGlobalFetcher ? service.getProductsGlobal : void 0;
const queryKey = globalFetcher ? appendQueryKey(queryKeys.list(listParams), {
fetcher: "global"
}) : queryKeys.list(listParams);
return {
resolvedInput: normalizedInput,
listParams,
useGlobalFetcher: Boolean(globalFetcher),
queryKey,
queryFn: ({ signal })=>globalFetcher ? globalFetcher(listParams, signal) : service.getProducts(listParams, signal)
};
};
const createProductDetailQueryDefinition = ({ input, region, service, buildDetailParams, queryKeys })=>{
const resolvedInput = resolveProductQueryInput(input, region);
const detailParams = buildDetailParams(resolvedInput);
return {
resolvedInput,
detailParams,
queryKey: queryKeys.detail(detailParams),
queryFn: ({ signal })=>{
if (!resolvedInput.handle) throw new Error("Product handle is required for product queries");
return service.getProductByHandle(detailParams, signal);
}
};
};
export { createProductDetailQueryDefinition, createProductListQueryDefinition, resolveProductQueryInput };