@shopgate/engage
Version:
Shopgate's ENGAGE library.
13 lines • 2.36 kB
JavaScript
import{createSelector}from'reselect';import find from'lodash/find';import{getProductVariants}from'@shopgate/pwa-common-commerce/product';import isEqual from'lodash/isEqual';/**
* Creates a selector that retrieves a product by a characteristic.
* @returns {Function}
*/export function makeGetProductByCharacteristics(){var _ref=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},strict=_ref.strict;return createSelector(function(_,props){return props.characteristics;},getProductVariants,function(characteristics,variants){if(!characteristics||!variants||!variants.products||variants.products.length===0){return null;}var product;if(strict){product=variants.products.find(function(_product){return isEqual(_product.characteristics,characteristics);});}else{product=find(variants.products,{characteristics:characteristics});}if(!product){return null;}return product;});}/**
* Creates a selector that retrieves the featured image URL for a selected characteristic.
* @returns {Function}
*/export function makeGetCharacteristicsFeaturedImage(){var getProductByCharacteristics=makeGetProductByCharacteristics();return createSelector(getProductByCharacteristics,function(product){if(!product||!product.featuredImageBaseUrl){return null;}return product.featuredImageBaseUrl;});}/**
* Creates a selector that retrieves the featured media for a selected characteristic.
* @returns {Function}
*/export function makeGetCharacteristicsFeaturedMedia(){var getProductByCharacteristics=makeGetProductByCharacteristics();return createSelector(getProductByCharacteristics,function(state,props){return props.type;},function(product,type){if(!product||!product.featuredMedia||type&&product.featuredMedia.type!==type){return null;}return product.featuredMedia;});}/**
* Creates a selector that retrieves the currently selected characteristics.
* @returns {Function}
*/export function makeGetSelectedCharacteristic(){return createSelector(getProductVariants,function(state,props){return props.characteristics;},function(variants,characteristics){var selected=[];if(!variants||!characteristics){return selected;}Object.keys(characteristics).forEach(function(key){var item=characteristics[key];var variant=find(variants.characteristics,{id:key});var value=find(variant.values,{id:item});selected.push({label:variant.label,value:value.label});});return selected;});}