@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
72 lines (71 loc) • 3.36 kB
JavaScript
import { getErrorStatus } from "../shared/medusa-errors.js";
const defaultIsNotFoundError = (error)=>404 === getErrorStatus(error);
const buildCartSelectParams = (fields)=>{
if (!fields) return;
return {
fields
};
};
const sanitizeCartWriteParams = (params)=>{
if (!("country_code" in params)) return params;
const { country_code: _countryCode, ...rest } = params;
return rest;
};
function createMedusaCartService(sdk, config) {
const cartQuery = buildCartSelectParams(config?.cartFields);
const isNotFoundError = (error)=>defaultIsNotFoundError(error) || Boolean(config?.isNotFoundError?.(error));
return {
async retrieveCart (cartId, signal) {
try {
const fetchOptions = cartQuery ? {
query: cartQuery,
signal
} : {
signal
};
const { cart } = await sdk.client.fetch(`/store/carts/${cartId}`, fetchOptions);
return cart ?? null;
} catch (error) {
if (isNotFoundError(error)) return null;
throw error;
}
},
async createCart (params) {
const sanitizedParams = sanitizeCartWriteParams(params);
const { cart } = cartQuery ? await sdk.store.cart.create(sanitizedParams, cartQuery) : await sdk.store.cart.create(sanitizedParams);
if (!cart) throw new Error("Failed to create cart");
return cart;
},
async updateCart (cartId, params) {
const sanitizedParams = sanitizeCartWriteParams(params);
const { cart } = cartQuery ? await sdk.store.cart.update(cartId, sanitizedParams, cartQuery) : await sdk.store.cart.update(cartId, sanitizedParams);
if (!cart) throw new Error("Failed to update cart");
return cart;
},
async addLineItem (cartId, params) {
const { cart } = cartQuery ? await sdk.store.cart.createLineItem(cartId, params, cartQuery) : await sdk.store.cart.createLineItem(cartId, params);
if (!cart) throw new Error("Failed to add item to cart");
return cart;
},
async updateLineItem (cartId, lineItemId, params) {
const { cart } = cartQuery ? await sdk.store.cart.updateLineItem(cartId, lineItemId, params, cartQuery) : await sdk.store.cart.updateLineItem(cartId, lineItemId, params);
if (!cart) throw new Error("Failed to update line item");
return cart;
},
async removeLineItem (cartId, lineItemId) {
const { parent } = cartQuery ? await sdk.store.cart.deleteLineItem(cartId, lineItemId, cartQuery) : await sdk.store.cart.deleteLineItem(cartId, lineItemId);
if (!parent) throw new Error("Failed to remove line item");
return parent;
},
async transferCart (cartId) {
const { cart } = cartQuery ? await sdk.store.cart.transferCart(cartId, cartQuery) : await sdk.store.cart.transferCart(cartId);
if (!cart) throw new Error("Failed to transfer cart");
return cart;
},
async completeCart (cartId) {
const result = await sdk.store.cart.complete(cartId);
return result;
}
};
}
export { createMedusaCartService };