@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
38 lines (37 loc) • 2.18 kB
JavaScript
import { createCacheConfig } from "../shared/cache-config.js";
import { createDefaultListParams, stripDetailInput, withCustomerScope } from "./input-utils.js";
import { createProductListQueryKeys } from "./query-keys.js";
function createProductListQueryOptionsFactory({ service, buildListParams, buildDetailParams, buildListKeyParams, buildDetailKeyParams, queryKeys, queryKeyNamespace = "storefront-data", cacheConfig, defaultPageSize = 20 }) {
const resolvedCacheConfig = cacheConfig ?? createCacheConfig();
const resolvedQueryKeys = queryKeys ?? createProductListQueryKeys(queryKeyNamespace);
const buildList = buildListParams ?? ((input)=>createDefaultListParams(input, defaultPageSize));
const buildDetail = buildDetailParams ?? ((input)=>stripDetailInput(input));
const buildListKey = buildListKeyParams ?? ((input, params)=>withCustomerScope(params, input));
const buildDetailKey = buildDetailKeyParams ?? ((input, params)=>withCustomerScope(params, input));
return {
getListQueryOptions: (input, options)=>{
const listParams = buildList(input);
const cacheStrategy = options?.cacheStrategy ?? "userData";
return {
queryKey: resolvedQueryKeys.list(buildListKey(input, listParams)),
queryFn: ({ signal })=>service.listProductLists(listParams, signal),
...resolvedCacheConfig[cacheStrategy],
...options?.queryOptions ?? {}
};
},
getDetailQueryOptions: (input, options)=>{
const detailParams = buildDetail(input);
const cacheStrategy = options?.cacheStrategy ?? "userData";
return {
queryKey: resolvedQueryKeys.detail(buildDetailKey(input, detailParams)),
queryFn: ({ signal })=>{
if (!input.id) throw new Error("Product list id is required");
return service.getProductList(detailParams, signal);
},
...resolvedCacheConfig[cacheStrategy],
...options?.queryOptions ?? {}
};
}
};
}
export { createProductListQueryOptionsFactory };