@shopgate/pwa-common-commerce
Version:
Commerce library for the Shopgate Connect PWA.
95 lines • 11.5 kB
JavaScript
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();};