UNPKG

@techsio/storefront-data

Version:

Medusa-first storefront data layer built on TanStack Query.

72 lines (71 loc) • 3.36 kB
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 };