UNPKG

@shopgate/pwa-common-commerce

Version:

Commerce library for the Shopgate Connect PWA.

14 lines 4.6 kB
import _regeneratorRuntime from"@babel/runtime/regenerator";function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value;}catch(error){reject(error);return;}if(info.done){resolve(value);}else{Promise.resolve(value).then(_next,_throw);}}function _asyncToGenerator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value);}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err);}_next(undefined);});};}import PipelineRequest from'@shopgate/pwa-core/classes/PipelineRequest';import{PROCESS_SEQUENTIAL}from'@shopgate/pwa-core/constants/ProcessTypes';import{mutable}from'@shopgate/pwa-common/helpers/redux';import{SHOPGATE_CART_ADD_PRODUCTS}from"../constants/Pipelines";import createPipelineErrorList from"../helpers/createPipelineErrorList";import{ECART}from"../constants/PipelineErrors";import addProductsToCart from"../action-creators/addProductsToCart";import successAddProductsToCart from"../action-creators/successAddProductsToCart";import errorAddProductsToCart from"../action-creators/errorAddProductsToCart";import setCartProductPendingCount from"../action-creators/setCartProductPendingCount";import{getProductPendingCount,getAddToCartMetadata,getCartItems}from"../selectors";import{getProduct}from"../../product/selectors/product";import{messagesHaveErrors,createErrorMessageList}from"../helpers";import{getDisplayedProductQuantity}from"../helpers/quantity";import{handleFulfillmentSlots}from"../helpers/fulfillmentSlots";/** * Adds products to the cart. * @param {Array} data The options for the products to be added. * @return {Function} A redux thunk. */function addToCart(data){return(/*#__PURE__*/function(){var _ref=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(dispatch,getState){var state,preCartItems,pendingProductCount,quantity,products,request;return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:state=getState();preCartItems=getCartItems(state);pendingProductCount=getProductPendingCount(state);quantity=0;products=data.map(function(product){var productData=getProduct(state,{productId:product.productId})||{};// Count quantity for pending count. quantity+=getDisplayedProductQuantity(_extends({},product,{product:productData}),preCartItems);// Restructure into a productId and a variantId (only productId if not adding a variant) var productId=productData.baseProductId||product.productId;var variantId=productData.baseProductId?productData.id:undefined;var metadata=getAddToCartMetadata(state,{productId:productId,variantId:variantId});// Return the current product if it already had metadata, otherwise add some, if any available return product.metadata&&product||_extends({},product,{},metadata&&{metadata:metadata});});_context.next=7;return handleFulfillmentSlots(state,products);case 7:products=_context.sent;// Dispatch pipeline request. dispatch(addProductsToCart(products));dispatch(setCartProductPendingCount(pendingProductCount+quantity));request=new PipelineRequest(SHOPGATE_CART_ADD_PRODUCTS).setInput({products:products}).setResponseProcessed(PROCESS_SEQUENTIAL).setRetries(0).setErrorBlacklist(ECART).dispatch();request.then(function(result){if(result.messages&&messagesHaveErrors(result.messages)){/** * @deprecated: The property "messages" is not supposed to be part of the * pipeline response. Specification demands errors to be returned as response * object with an "error" property. This code snippet needs to be removed after * fixing the `@shopgate/legacy-cart` extension. */dispatch(errorAddProductsToCart(products,createErrorMessageList(SHOPGATE_CART_ADD_PRODUCTS,result.messages)));return;}dispatch(successAddProductsToCart());})["catch"](function(error){dispatch(errorAddProductsToCart(products,createPipelineErrorList(SHOPGATE_CART_ADD_PRODUCTS,error)));});return _context.abrupt("return",request);case 13:case"end":return _context.stop();}},_callee);}));return function(_x,_x2){return _ref.apply(this,arguments);};}());}/** @mixes {MutableFunction} */export default mutable(addToCart);