@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
64 lines (63 loc) • 2.49 kB
JavaScript
const stripEnabled = (query)=>{
const { enabled: _enabled, ...rest } = query;
return rest;
};
function createMedusaCategoryService(sdk, config) {
const { listPath = "/store/product-categories", defaultListFields, defaultDetailFields, normalizeListQuery, normalizeDetailQuery, transformCategory, transformListCategory, transformDetailCategory } = config ?? {};
const baseTransform = transformCategory ?? ((category)=>category);
const mapListCategory = transformListCategory ?? ((category, _context)=>baseTransform(category));
const mapDetailCategory = transformDetailCategory ?? ((category, _context)=>baseTransform(category));
const buildListQuery = (params)=>{
const query = normalizeListQuery ? normalizeListQuery(params) : {
...params,
...defaultListFields && !params.fields ? {
fields: defaultListFields
} : {}
};
return stripEnabled(query);
};
const buildDetailQuery = (params)=>{
const query = normalizeDetailQuery ? normalizeDetailQuery(params) : {
...params,
...defaultDetailFields && !params.fields ? {
fields: defaultDetailFields
} : {}
};
const { id: _id, ...withoutId } = query;
return stripEnabled(withoutId);
};
return {
async getCategories (params, signal) {
const query = buildListQuery(params);
const response = await sdk.client.fetch(listPath, {
query,
signal
});
const categories = (response.product_categories ?? []).map((category)=>mapListCategory(category, {
params,
query,
response
}));
return {
categories,
count: response.count ?? categories.length
};
},
async getCategory (params, signal) {
if (!params.id) return null;
const query = buildDetailQuery(params);
const response = await sdk.client.fetch(`${listPath}/${params.id}`, {
query,
signal
});
const category = response.product_category;
if (!category) return null;
return mapDetailCategory(category, {
params,
query,
response
});
}
};
}
export { createMedusaCategoryService };