UNPKG

@shopgate/pwa-common-commerce

Version:

Commerce library for the Shopgate Connect PWA.

95 lines • 11.5 kB
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);}import{createSelector}from'reselect';import uniq from'lodash/uniq';import appConfig from'@shopgate/pwa-common/helpers/config';import{hasNewServices}from'@shopgate/engage/core/helpers';import{getProducts,getProductId}from"../../product/selectors/product";import{getKnownRelatives}from"../../product/selectors/variants";var defaultIds=[];/** * @param {Object} state The global state. * @return {Object} */export var getFavoritesState=function getFavoritesState(state){return state.favorites||{};};/** * @param {Object} state The global state. * @return {Object} */export var getFavoritesListState=function getFavoritesListState(state){var _state$favorites;return((_state$favorites=state.favorites)===null||_state$favorites===void 0?void 0:_state$favorites.lists)||{};};/** * Returns a list of available wishlists to the user. * @param {Object} state The global state. * @return {Object} */export var getFavoritesLists=function getFavoritesLists(state){var _getFavoritesListStat;return((_getFavoritesListStat=getFavoritesListState(state))===null||_getFavoritesListStat===void 0?void 0:_getFavoritesListStat.lists)||[];};/** * @param {Object} state The global state. * @return {Object|null} */export var getFavoritesProducts=createSelector(getFavoritesState,function(state){if(!state.products){return null;}return state.products;});export var getFavoritesDefaultList=createSelector(getFavoritesLists,function(lists){var _lists$find;return(_lists$find=lists.find(function(list){return list.id==='DEFAULT';}))!==null&&_lists$find!==void 0?_lists$find:{id:'DEFAULT'};});export var hasMultipleFavoritesList=createSelector(getFavoritesLists,function(lists){return lists.length>1;});/** * A selector that gets the id of the favorites list by the given name * @param {Object} state The current application state. * @param {Object} props The component props. * @returns {string} the id of the favorites list */export var getFavoritesListIdByName=createSelector(getFavoritesLists,function(state,props){return props.listName;},function(favLists,listName){var _ref=favLists.find(function(list){return list.name===listName;})||{},id=_ref.id;return id;});/** * @param {Object} state The global state. * @returns {Array} * @deprecated */export var getFavoritesProductsIds=createSelector(getFavoritesProducts,function(products){if(!products||!products.byList){return defaultIds;}return uniq(Object.values(products.byList).map(function(l){return l.items.map(function(_ref2){var productId=_ref2.productId;return productId;});}).flat());});/** * @param {Object} state The global state. * @deprecated */export var getFavorites=createSelector(getFavoritesProductsIds,getProducts,function(productIds,products){return productIds.filter(function(id){return!!products[id]&&products[id].productData;}).map(function(id){return products[id].productData;});});/** * Creates a selector that selects all ids that belong * to the given favorite list. * @param {Function} getListCode Selects the list code. * @returns {Function} */export var makeGetFavoritesIdsByList=function makeGetFavoritesIdsByList(getListCode){return createSelector(getFavoritesProducts,getListCode,function(favProducts,listId){var _favProducts$byList$l;return(favProducts===null||favProducts===void 0?void 0:(_favProducts$byList$l=favProducts.byList[listId])===null||_favProducts$byList$l===void 0?void 0:_favProducts$byList$l.items.map(function(_ref3){var productId=_ref3.productId;return productId;}))||[];});};/** * Creates a selector that selects all products that belong * to the given favorite list. * @param {Function} getListCode Selects the list code. * @returns {Function} */export var makeGetFavorites=function makeGetFavorites(getListCode){return createSelector(getFavoritesProducts,getListCode,getProducts,function(favItems,listId,products){var _favItems$byList$list;var items=(favItems===null||favItems===void 0?void 0:(_favItems$byList$list=favItems.byList[listId])===null||_favItems$byList$list===void 0?void 0:_favItems$byList$list.items)||[];return items.map(function(item){var _products$item$produc;return _extends({},item,{product:(_products$item$produc=products[item.productId])===null||_products$item$produc===void 0?void 0:_products$item$produc.productData});});});};/** * Creates a selector that retrieves the amount of items on a specific favorites list * to the given favorite list. * @param {Function} getListCode Selects the list code. * @returns {Function} */export var makeGetFavoritesCountByList=function makeGetFavoritesCountByList(getListCode){var getFavoritesIdsByList=makeGetFavoritesIdsByList(getListCode);return createSelector(getFavoritesIdsByList,function(favorites){return favorites.length;});};/** * True when favorites where not yet fetched for the first time. * @param {Object} state The global state. * @returns {boolean} */export var isInitialLoading=createSelector(getFavoritesProducts,function(products){if(!products){return true;}return!Object.values(products===null||products===void 0?void 0:products.byList).every(function(l){return l.ready;});});/** * @param {Object} state The global state. * @param {Object} props The selector props * @param {boolean} [props.useItemQuantity=false] Whether to consider item quantity at calculation * @return {Function} */export var getFavoritesCount=createSelector(getFavoritesProducts,function(_,props){return(props===null||props===void 0?void 0:props.useItemQuantity)||false;},function(products,useItemQuantity){if(!(products===null||products===void 0?void 0:products.byList)){return 0;}return Object.values(products.byList).reduce(function(prev,list){return prev+list.items.reduce(function(acc,_ref4){var _ref4$quantity=_ref4.quantity,quantity=_ref4$quantity===void 0?1:_ref4$quantity;if(useItemQuantity){return acc+quantity;}return acc+1;},0);},0);});/** * @param {Object} state The global state. * @return {boolean} */export var hasFavorites=createSelector(getFavoritesCount,function(count){return!!count;});/** * @param {Object} state The global state. * @return {boolean} */export var isFetching=createSelector(getFavoritesProducts,function(products){if(!products){return false;}return Object.values(products.byList).some(function(l){return l.isFetching;});});/** * @param {Function} getProductCode Reads the product id. * @param {Function} getListCode Reads the list id. * @return {boolean} */export var makeIsProductOnSpecificFavoriteList=function makeIsProductOnSpecificFavoriteList(getProductCode,getListCode){return createSelector(getProductCode,getListCode,getFavoritesProducts,function(productId,listId,products){var _products$byList$list;return!!((_products$byList$list=products.byList[listId])===null||_products$byList$list===void 0?void 0:_products$byList$list.items.some(function(_ref5){var itemProductId=_ref5.productId;return itemProductId===productId;}));});};/** * @param {Function} getProductCode Reads the product id. * @return {boolean} */export var makeIsProductOnFavoriteList=function makeIsProductOnFavoriteList(getProductCode){return createSelector(getProductCode,getFavoritesProducts,function(productId,products){return!!Object.values(products.byList).find(function(list){var _list$items;return!!(list===null||list===void 0?void 0:(_list$items=list.items)===null||_list$items===void 0?void 0:_list$items.find(function(_ref6){var itemProductId=_ref6.productId;return itemProductId===productId;}));});});};/** * @param {Object} state The global state. * @return {boolean} */export var isCurrentProductOnFavoriteList=makeIsProductOnFavoriteList(getProductId);/** * Returns all relatives which are on favorites. * @param {Object} state Current state. * @param {string} productId * @returns {Array} */export var getProductRelativesOnFavorites=createSelector(getKnownRelatives,getFavoritesProducts,function(productRelativesIds,products){return productRelativesIds.filter(function(id){return!!Object.values(products.byList).find(function(list){return!!list.items.find(function(_ref7){var productId=_ref7.productId;return id===productId;});});});});/** * Returns all relatives which are on a specific favorites list. * @param {Function} getListCode Gets the list code. * @returns {Function} */export var makeGetProductRelativesOnFavorites=function makeGetProductRelativesOnFavorites(getListCode){return createSelector(getListCode,getKnownRelatives,getFavoritesProducts,function(listId,productRelativesIds,products){return productRelativesIds.filter(function(id){var _products$byList$list2;return(_products$byList$list2=products.byList[listId])===null||_products$byList$list2===void 0?void 0:_products$byList$list2.items.map(function(_ref8){var productId=_ref8.productId;return productId;}).find(function(p){return id===p;});});});};/** * Checks if product or any relative is on favorites list. * @param {Object} state Current state. * @param {string} productId Product id. * @return {boolean} */export var isRelativeProductOnList=createSelector(getProductRelativesOnFavorites,function(relativesOnFavorites){return relativesOnFavorites.length>0;});export var getCommentDialogSettings=createSelector(getFavoritesListState,getFavoritesProducts,getProducts,function(_ref9,favItems,products){var _favItems$byList$list2,_products$item$produc2;var commentDialog=_ref9.commentDialog;var _ref10=commentDialog||{},listId=_ref10.listId,productId=_ref10.productId;if(!listId||!productId){return undefined;}var items=((_favItems$byList$list2=favItems.byList[listId])===null||_favItems$byList$list2===void 0?void 0:_favItems$byList$list2.items)||[];var item=items.find(function(_ref11){var itemProductId=_ref11.productId;return productId===itemProductId;});if(!item){return undefined;}return{listId:listId,productId:productId,item:item,product:(_products$item$produc2=products[item.productId])===null||_products$item$produc2===void 0?void 0:_products$item$produc2.productData};});/** * Creates a selector that selects all products that belong * to the given favorite list. * @param {Function} getListCode Callback that's supposed to return a favorites list code * @returns {Function} */export var makeGetFavoritesProductsByList=function makeGetFavoritesProductsByList(getListCode){return createSelector(getFavoritesProducts,getListCode,function(favProducts,listId){var products=favProducts.byList[listId]||{};return products;});};/** * Creates a selector to check if the app has support for multiple favorites list. * @returns {Function} */export var getHasMultipleFavoritesListsSupport=function getHasMultipleFavoritesListsSupport(){var _appConfig$favoritesM;return hasNewServices()||(appConfig===null||appConfig===void 0?void 0:(_appConfig$favoritesM=appConfig.favoritesMode)===null||_appConfig$favoritesM===void 0?void 0:_appConfig$favoritesM.hasMultipleFavoritesLists);};/** * Creates a selector the determine if the PWA is supposed to fetch favorite list entries via the * "getFavoriteIds" pipeline instead of "getFavorites". * * This pipeline was introduced in PWA6 when support for more than 100 items per favorite list was * requested. PWA-1877 * @returns {Function} */export var getUseGetFavoriteIdsPipeline=function getUseGetFavoriteIdsPipeline(){return!hasNewServices();};