UNPKG

@techsio/storefront-data

Version:

Medusa-first storefront data layer built on TanStack Query.

38 lines (37 loc) • 2.18 kB
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 };