@shopgate/engage 7.29.0-alpha.1 → 7.29.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/View/components/Content/index.js +4 -1
- package/components/index.js +1 -1
- package/core/actions/grantCameraPermissions.js +1 -1
- package/core/constants/index.js +1 -1
- package/core/constants/merchantSettings.js +1 -1
- package/core/constants/shopSettings.js +1 -1
- package/core/hooks/events/useLongPress.js +1 -1
- package/core/reducers/merchantSettings.js +1 -1
- package/core/reducers/shopSettings.js +1 -1
- package/core/selectors/index.js +1 -1
- package/core/selectors/merchantSettings.js +5 -2
- package/core/selectors/shopSettings.js +5 -2
- package/development/action-creators/settings.js +6 -2
- package/development/components/ClientInformation/ClientInformation.js +5 -0
- package/development/components/ClientInformation/actions.js +4 -0
- package/development/components/ClientInformation/index.js +1 -0
- package/development/components/DevelopmentSettings/DevelopmentSettings.js +9 -0
- package/development/components/DevelopmentSettings/index.js +1 -0
- package/development/components/DevelopmentTools/hooks.js +2 -2
- package/development/components/index.js +1 -1
- package/development/constants/actionTypes.js +1 -1
- package/development/reducers/settings.js +3 -3
- package/development/selectors/settings.js +4 -1
- package/package.json +7 -7
- package/page/action-creators/index.js +6 -6
- package/page/components/ResponsiveWidgetImage/ResponsiveWidgetImage.js +7 -0
- package/page/components/ResponsiveWidgetImage/index.js +1 -0
- package/page/components/WidgetHeadline/WidgetHeadline.js +7 -0
- package/page/components/WidgetHeadline/index.js +1 -0
- package/page/components/WidgetRichText/WidgetRichText.js +6 -0
- package/page/components/WidgetRichText/index.js +1 -0
- package/page/components/Widgets/Widget.js +4 -2
- package/page/components/Widgets/Widgets.js +2 -2
- package/page/components/Widgets/helpers.js +7 -7
- package/page/components/Widgets/types.d.ts +5 -0
- package/page/components/index.js +1 -1
- package/page/helpers/index.d.ts +8 -0
- package/page/helpers/index.js +6 -1
- package/page/hooks/index.js +18 -6
- package/page/reducers/index.js +11 -2
- package/page/selectors/index.js +9 -1
- package/page/widgets/CategoryList/CategoryList.js +2 -2
- package/page/widgets/CategoryList/hooks.js +4 -2
- package/page/widgets/Headline/Headline.js +2 -3
- package/page/widgets/HeroBanner/HeroBanner.js +3 -0
- package/page/widgets/HeroBanner/hooks.js +14 -0
- package/page/widgets/HeroBanner/index.js +1 -0
- package/page/widgets/Image/Image.js +4 -0
- package/page/widgets/Image/hooks.js +19 -0
- package/page/widgets/Image/index.js +1 -0
- package/page/widgets/ImageRow/ImageRow.js +4 -0
- package/page/widgets/ImageRow/hooks.js +15 -0
- package/page/widgets/ImageRow/index.js +1 -0
- package/page/widgets/ImageSlider/ImageSlider.js +4 -0
- package/page/widgets/ImageSlider/hooks.js +33 -0
- package/page/widgets/ImageSlider/index.js +1 -0
- package/page/widgets/ProductList/ProductList.js +2 -2
- package/page/widgets/ProductList/hooks.js +3 -1
- package/page/widgets/ProductSlider/ProductSlider.js +3 -3
- package/page/widgets/ProductSlider/hooks.js +3 -1
- package/page/widgets/RichText/RichText.js +3 -0
- package/page/widgets/RichText/hooks.js +10 -0
- package/page/widgets/RichText/index.js +1 -0
- package/page/widgets/index.js +1 -1
- package/page/widgets/widgets.json +18 -3
- package/product/components/PriceInfo/PriceInfo.connector.js +1 -1
- package/product/components/PriceInfo/PriceInfo.js +2 -1
- package/styles/theme/createTheme/createBreakpoints.d.ts +4 -4
- package/page/widgets/Headline/hooks.js +0 -8
|
@@ -15,7 +15,10 @@ function _extends(){_extends=Object.assign||function(target){for(var i=1;i<argum
|
|
|
15
15
|
* @returns {Object}
|
|
16
16
|
*/_inherits(ViewContent,_Component);return _createClass(ViewContent,[{key:"componentDidMount",value:/**
|
|
17
17
|
* Restore the scroll position of the page.
|
|
18
|
-
*/function componentDidMount(){var scrollTop=this.context.state.scrollTop
|
|
18
|
+
*/function componentDidMount(){var _this3=this;var scrollTop=this.context.state.scrollTop;// This trick ensures the scroll position is restored correctly. Without it there where
|
|
19
|
+
// situations where scroll position was restored before the content was rendered.
|
|
20
|
+
// In that case restoration didn't have any effect.
|
|
21
|
+
window.requestAnimationFrame(function(){if(_this3.ref.current===window){window.scrollTo(0,scrollTop||0);}else{_this3.ref.current.scrollTop=scrollTop;}});}/**
|
|
19
22
|
* Removes the keyboardWillChange listener.
|
|
20
23
|
*/},{key:"componentWillUnmount",value:function componentWillUnmount(){var scrollTop;if(this.ref.current===window){scrollTop=window.scrollY;}else{scrollTop=this.ref.current.scrollTop;}router.update(this.context.id,{scrollTop:scrollTop},false);event.removeCallback(EVENT_KEYBOARD_WILL_CHANGE,this.handleKeyboardChange);if(isIOs){window.removeEventListener('focusin',this.handleInputFocusChange);window.removeEventListener('focusout',this.handleInputFocusChange);}}/**
|
|
21
24
|
* @returns {Object}
|
package/components/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
export{default as Backdrop}from'@shopgate/pwa-common/components/Backdrop';export{default as BaseButton}from'@shopgate/pwa-common/components/Button';export{default as BaseCheckbox}from'@shopgate/pwa-common/components/Checkbox';export{default as Consume}from'@shopgate/pwa-common/components/Consume';export{default as CountdownTimer}from'@shopgate/pwa-common/components/CountdownTimer';export{default as Drawer}from'@shopgate/pwa-common/components/Drawer';export{default as Dropdown}from'@shopgate/pwa-common/components/Dropdown';export{default as Ellipsis}from'@shopgate/pwa-common/components/Ellipsis';export{default as ErrorBoundary}from'@shopgate/pwa-common/components/ErrorBoundary';export{default as Grid}from'@shopgate/pwa-common/components/Grid';export{default as HtmlSanitizer}from'@shopgate/pwa-common/components/HtmlSanitizer';export{default as I18n}from'@shopgate/pwa-common/components/I18n';export{default as Icon}from'@shopgate/pwa-common/components/Icon';export{default as Image}from'@shopgate/pwa-common/components/Image';export{default as InfiniteContainer}from'@shopgate/pwa-common/components/InfiniteContainer';export{default as Input}from'@shopgate/pwa-common/components/Input';export{default as KeyboardConsumer}from'@shopgate/pwa-common/components/KeyboardConsumer';export{default as Link}from'@shopgate/pwa-common/components/Link';export{default as List}from'@shopgate/pwa-common/components/List';export{default as Loading}from'@shopgate/pwa-common/components/Loading';export{default as Modal}from'@shopgate/pwa-common/components/Modal';export{default as ModalContainer,MODAL_EVENTS}from'@shopgate/pwa-common/components/ModalContainer';export{default as Picker}from"./Picker";export{default as Portal}from'@shopgate/pwa-common/components/Portal';export{default as RangeSlider}from"./RangeSlider";export{default as Route}from'@shopgate/pwa-common/components/Route';export{default as ScannerContainer}from'@shopgate/pwa-common/components/ScannerContainer';export{default as BaseSelect}from'@shopgate/pwa-common/components/Select';export{default as SelectBox}from'@shopgate/pwa-common/components/SelectBox';export{default as Slider}from'@shopgate/pwa-common/components/Slider';export{default as SurroundPortals}from'@shopgate/pwa-common/components/SurroundPortals';export{default as Swiper}from'@shopgate/pwa-common/components/Swiper';export{default as Toaster}from'@shopgate/pwa-common/components/Toaster';export{default as Transition}from'@shopgate/pwa-common/components/Transition';export{default as Widgets}from'@shopgate/pwa-common/components/Widgets';// iOS
|
|
6
6
|
export{default as AppBarIOS}from'@shopgate/pwa-ui-ios/AppBar';export{default as BaseDialogIOS}from'@shopgate/pwa-ui-ios/BaseDialog';// ANDROID
|
|
7
7
|
export{default as Accordion}from'@shopgate/pwa-ui-material/Accordion';export{default as AppBarAndroid}from'@shopgate/pwa-ui-material/AppBar';export{default as BaseDialogAndroid}from'@shopgate/pwa-ui-material/BaseDialog';export{default as FloatingActionButton}from'@shopgate/pwa-ui-material/FloatingActionButton';export{default as NavDrawer}from'@shopgate/pwa-ui-material/NavDrawer';export{default as SnackBar}from'@shopgate/pwa-ui-material/SnackBar';// SHARED
|
|
8
|
-
export{default as AccordionContainer}from'@shopgate/pwa-ui-shared/AccordionContainer';export{default as ActionButton}from'@shopgate/pwa-ui-shared/ActionButton';export{default as AddToCartButton}from'@shopgate/pwa-ui-shared/AddToCartButton';export{default as Availability}from'@shopgate/pwa-ui-shared/Availability';export{default as Button}from'@shopgate/pwa-ui-shared/Button';export{default as ButtonLink}from'@shopgate/pwa-ui-shared/ButtonLink';export{default as Card}from'@shopgate/pwa-ui-shared/Card';export{default as CardList}from'@shopgate/pwa-ui-shared/CardList';export{default as CartTotalLine}from'@shopgate/pwa-ui-shared/CartTotalLine';export{default as Chip}from'@shopgate/pwa-ui-shared/Chip';export{default as
|
|
8
|
+
export{default as AccordionContainer}from'@shopgate/pwa-ui-shared/AccordionContainer';export{default as ActionButton}from'@shopgate/pwa-ui-shared/ActionButton';export{default as AddToCartButton}from'@shopgate/pwa-ui-shared/AddToCartButton';export{default as Availability}from'@shopgate/pwa-ui-shared/Availability';export{default as Button}from'@shopgate/pwa-ui-shared/Button';export{default as ButtonLink}from'@shopgate/pwa-ui-shared/ButtonLink';export{default as Card}from'@shopgate/pwa-ui-shared/Card';export{default as CardList}from'@shopgate/pwa-ui-shared/CardList';export{default as CartTotalLine}from'@shopgate/pwa-ui-shared/CartTotalLine';export{default as Chip}from'@shopgate/pwa-ui-shared/Chip';export{default as ContextMenu}from'@shopgate/pwa-ui-shared/ContextMenu';export{default as Dialog}from'@shopgate/pwa-ui-shared/Dialog';export{default as DiscountBadge}from'@shopgate/pwa-ui-shared/DiscountBadge';export{default as FavoritesButton}from'@shopgate/pwa-ui-shared/FavoritesButton';export{default as Checkbox}from'@shopgate/pwa-ui-shared/Form/Checkbox';export{default as Password}from'@shopgate/pwa-ui-shared/Form/Password';export{default as RadioGroup}from'@shopgate/pwa-ui-shared/Form/RadioGroup';export{default as RadioGroupItem}from'@shopgate/pwa-ui-shared/Form/RadioGroup/components/Item';export{default as Select}from'@shopgate/pwa-ui-shared/Form/Select';export{default as TextField}from'@shopgate/pwa-ui-shared/Form/TextField';export{default as FormElement}from'@shopgate/pwa-ui-shared/FormElement';export{default as Glow}from'@shopgate/pwa-ui-shared/Glow';export{default as IndicatorCircle}from'@shopgate/pwa-ui-shared/IndicatorCircle';export{default as LoadingIndicator}from'@shopgate/pwa-ui-shared/LoadingIndicator';export{default as Manufacturer}from'@shopgate/pwa-ui-shared/Manufacturer';export{default as NoResults}from'@shopgate/pwa-ui-shared/NoResults';export{default as Placeholder}from'@shopgate/pwa-ui-shared/Placeholder';export{default as PlaceholderLabel}from'@shopgate/pwa-ui-shared/PlaceholderLabel';export{default as PlaceholderParagraph}from'@shopgate/pwa-ui-shared/PlaceholderParagraph';export{default as Price}from'@shopgate/pwa-ui-shared/Price';export{default as PriceInfo}from'@shopgate/pwa-ui-shared/PriceInfo';export{default as PriceStriked}from'@shopgate/pwa-ui-shared/PriceStriked';export{default as ProductProperties}from'@shopgate/pwa-ui-shared/ProductProperties';export{default as ProgressBar}from'@shopgate/pwa-ui-shared/ProgressBar';export{default as RadioButton}from'@shopgate/pwa-ui-shared/RadioButton';export{default as RatingNumber}from'@shopgate/pwa-ui-shared/RatingNumber';export{default as RatingStars}from'@shopgate/pwa-ui-shared/RatingStars';export{default as Ripple}from'@shopgate/pwa-ui-shared/Ripple';export{default as RippleButton}from'@shopgate/pwa-ui-shared/RippleButton';export{default as ScannerOverlay}from'@shopgate/pwa-ui-shared/ScannerOverlay';export{default as Sheet,SHEET_EVENTS}from'@shopgate/pwa-ui-shared/Sheet';export{default as TaxDisclaimer}from'@shopgate/pwa-ui-shared/TaxDisclaimer';export{default as ToggleIcon}from'@shopgate/pwa-ui-shared/ToggleIcon';// ICONS IOS
|
|
9
9
|
export{default as CartIconIOS}from'@shopgate/pwa-ui-ios/icons/CartIcon';export{default as FilterIconIOS}from'@shopgate/pwa-ui-ios/icons/FilterIcon';export{default as HomeIconIOS}from'@shopgate/pwa-ui-ios/icons/HomeIcon';export{default as ShareIconIOS}from'@shopgate/pwa-ui-ios/icons/ShareIcon';// ICONS ANDROID
|
|
10
10
|
export{default as ShareIconAndroid}from'@shopgate/pwa-ui-material/icons/ShareIcon';// ICONS SHARED
|
|
11
11
|
export{default as AccountBoxIcon}from'@shopgate/pwa-ui-shared/icons/AccountBoxIcon';export{default as AddMoreIcon}from'@shopgate/pwa-ui-shared/icons/AddMoreIcon';export{default as ArrowDropIcon}from'@shopgate/pwa-ui-shared/icons/ArrowDropIcon';export{default as ArrowIcon}from'@shopgate/pwa-ui-shared/icons/ArrowIcon';export{default as BarcodeScannerIcon}from'@shopgate/pwa-ui-shared/icons/BarcodeScannerIcon';export{default as BoxIcon}from'@shopgate/pwa-ui-shared/icons/BoxIcon';export{default as BrowseIcon}from'@shopgate/pwa-ui-shared/icons/BrowseIcon';export{default as BurgerIcon}from'@shopgate/pwa-ui-shared/icons/BurgerIcon';export{default as CartIcon}from'@shopgate/pwa-ui-shared/icons/CartIcon';export{default as CartPlusIcon}from'@shopgate/pwa-ui-shared/icons/CartPlusIcon';export{default as CartCouponIcon}from'@shopgate/pwa-ui-shared/icons/CartCouponIcon';export{default as CheckedIcon}from'@shopgate/pwa-ui-shared/icons/CheckedIcon';export{default as CheckIcon}from'@shopgate/pwa-ui-shared/icons/CheckIcon';export{default as ChevronIcon}from'@shopgate/pwa-ui-shared/icons/ChevronIcon';export{default as CreditCardIcon}from'@shopgate/pwa-ui-shared/icons/CreditCardIcon';export{default as CrossIcon}from'@shopgate/pwa-ui-shared/icons/CrossIcon';export{default as DescriptionIcon}from'@shopgate/pwa-ui-shared/icons/DescriptionIcon';export{default as FilterIcon}from'@shopgate/pwa-ui-shared/icons/FilterIcon';export{default as FlashEnabledIcon}from'@shopgate/pwa-ui-shared/icons/FlashEnabledIcon';export{default as FlashDisabledIcon}from'@shopgate/pwa-ui-shared/icons/FlashDisabledIcon';export{default as GridIcon}from'@shopgate/pwa-ui-shared/icons/GridIcon';export{default as HeartIcon}from'@shopgate/pwa-ui-shared/icons/HeartIcon';export{default as HeartOutlineIcon}from'@shopgate/pwa-ui-shared/icons/HeartOutlineIcon';export{default as HeartPlusIcon}from'@shopgate/pwa-ui-shared/icons/HeartPlusIcon';export{default as HeartPlusOutlineIcon}from'@shopgate/pwa-ui-shared/icons/HeartPlusOutlineIcon';export{default as HomeIcon}from'@shopgate/pwa-ui-shared/icons/HomeIcon';export{default as InfoIcon}from'@shopgate/pwa-ui-shared/icons/InfoIcon';export{default as InfoOutlineIcon}from'@shopgate/pwa-ui-shared/icons/InfoOutlineIcon';export{default as ListIcon}from'@shopgate/pwa-ui-shared/icons/ListIcon';export{default as LocatorIcon}from'@shopgate/pwa-ui-shared/icons/LocatorIcon';export{default as LocalShippingIcon}from'@shopgate/pwa-ui-shared/icons/LocalShippingIcon';export{default as LocationIcon}from'@shopgate/pwa-ui-shared/icons/LocationIcon';export{default as LockIcon}from'@shopgate/pwa-ui-shared/icons/LockIcon';export{default as LogoutIcon}from'@shopgate/pwa-ui-shared/icons/LogoutIcon';export{default as MagnifierIcon}from'@shopgate/pwa-ui-shared/icons/MagnifierIcon';export{default as MoreIcon}from'@shopgate/pwa-ui-shared/icons/MoreIcon';export{default as MoreVertIcon}from'@shopgate/pwa-ui-shared/icons/MoreVertIcon';export{default as PersonIcon}from'@shopgate/pwa-ui-shared/icons/PersonIcon';export{default as PhoneIcon}from'@shopgate/pwa-ui-shared/icons/PhoneIcon';export{default as PlaceholderIcon}from'@shopgate/pwa-ui-shared/icons/PlaceholderIcon';export{default as RadioCheckedIcon}from'@shopgate/pwa-ui-shared/icons/RadioCheckedIcon';export{default as RadioUncheckedIcon}from'@shopgate/pwa-ui-shared/icons/RadioUncheckedIcon';export{default as SecurityIcon}from'@shopgate/pwa-ui-shared/icons/SecurityIcon';export{default as ShoppingCartIcon}from'@shopgate/pwa-ui-shared/icons/ShoppingCartIcon';export{default as SortIcon}from'@shopgate/pwa-ui-shared/icons/SortIcon';export{default as StarHalfIcon}from'@shopgate/pwa-ui-shared/icons/StarHalfIcon';export{default as StarIcon}from'@shopgate/pwa-ui-shared/icons/StarIcon';export{default as StarOutlineIcon}from'@shopgate/pwa-ui-shared/icons/StarOutlineIcon';export{default as TickIcon}from'@shopgate/pwa-ui-shared/icons/TickIcon';export{default as TrashIcon}from'@shopgate/pwa-ui-shared/icons/TrashIcon';export{default as TrashOutlineIcon}from'@shopgate/pwa-ui-shared/icons/TrashOutlineIcon';export{default as UncheckedIcon}from'@shopgate/pwa-ui-shared/icons/UncheckedIcon';export{default as ViewListIcon}from'@shopgate/pwa-ui-shared/icons/ViewListIcon';export{default as VisibilityIcon}from'@shopgate/pwa-ui-shared/icons/VisibilityIcon';export{default as VisibilityOffIcon}from'@shopgate/pwa-ui-shared/icons/VisibilityOffIcon';export{default as TimeIcon}from'@shopgate/pwa-ui-shared/icons/TimeIcon';export{default as NotificationIcon}from'@shopgate/pwa-ui-shared/icons/NotificationIcon';// LOCAL
|
|
@@ -12,4 +12,4 @@ function _extends(){_extends=Object.assign||function(target){for(var i=1;i<argum
|
|
|
12
12
|
* @param {string} options.modal.dismiss Label for the dismiss button.
|
|
13
13
|
* @param {Object} options.modal.params Additional parameters for i18n strings.
|
|
14
14
|
* @return { Function } A redux thunk.
|
|
15
|
-
*/var grantCameraPermissions=function grantCameraPermissions(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return function(dispatch){var _options$useSettingsM=options.useSettingsModal,useSettingsModal=_options$useSettingsM===void 0?false:_options$useSettingsM,_options$modal=options.modal,modal=_options$modal===void 0?{}:_options$modal;return dispatch(grantPermissions({permissionId:PERMISSION_ID_CAMERA,useSettingsModal:useSettingsModal,modal:_extends({title:null,message:'permissions.access_denied.camera_message',confirm:'permissions.access_denied.settings_button'},modal)}));};};export default grantCameraPermissions;
|
|
15
|
+
*/var grantCameraPermissions=function grantCameraPermissions(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return function(dispatch){var _options$useSettingsM=options.useSettingsModal,useSettingsModal=_options$useSettingsM===void 0?false:_options$useSettingsM,_options$modal=options.modal,modal=_options$modal===void 0?{}:_options$modal;return dispatch(grantPermissions({permissionId:PERMISSION_ID_CAMERA,useSettingsModal:useSettingsModal,modal:_extends({title:null,message:'permissions.access_denied.camera_message',confirm:'permissions.access_denied.settings_button',dismiss:'common.close'},modal)}));};};export default grantCameraPermissions;
|
package/core/constants/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{INDEX_PATH,INDEX_PATH_DEEPLINK,LOGIN_PATH}from'@shopgate/pwa-common/constants/RoutePaths';export{RECEIVE_SHOP_SETTINGS,ERROR_SHOP_SETTINGS,CACHE_LEASE_SHOP_SETTINGS,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT,SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT,SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP,SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB,SHOP_SETTING_PRODUCTS_SORT_ORDER,SHOP_SETTING_COOKIE_CONSENT_MODE,SHOP_SETTING_DISPLAY_PRICE_PER_MEASURE_UNIT,SHOP_SETTING_IMAGES,SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,SHOP_SETTING_IMAGES_FAVICON,SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,SHOP_SETTING_REGISTRATION_MODE_SIMPLE,SHOP_SETTING_REGISTRATION_MODE_EXTENDED,SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE}from"./shopSettings";export{RECEIVE_MERCHANT_SETTINGS,MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES,MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED,MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,MERCHANT_SETTINGS_DEFAULT_CURRENCY,MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION,MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY}from"./merchantSettings";export{SHOPGATE_CORE_GET_SHOP_SETTINGS,EUNAUTHORIZED,EAUTHENTICATION}from"./pipelines";export*from"./actionTypes";export*from"./appFeatures";export*from"./deviceTypes";export*from"./geolocationRequest";export*from"./optIns";// Core Constants
|
|
1
|
+
import{INDEX_PATH,INDEX_PATH_DEEPLINK,LOGIN_PATH}from'@shopgate/pwa-common/constants/RoutePaths';export{RECEIVE_SHOP_SETTINGS,ERROR_SHOP_SETTINGS,CACHE_LEASE_SHOP_SETTINGS,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT,SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT,SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP,SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB,SHOP_SETTING_PRODUCTS_SORT_ORDER,SHOP_SETTING_COOKIE_CONSENT_MODE,SHOP_SETTING_DISPLAY_PRICE_PER_MEASURE_UNIT,SHOP_SETTING_IMAGES,SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,SHOP_SETTING_IMAGES_FAVICON,SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,SHOP_SETTING_REGISTRATION_MODE_SIMPLE,SHOP_SETTING_REGISTRATION_MODE_EXTENDED,SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE,SHOP_SETTING_ENABLE_CMS_2_FOR_ALL_SHOPPERS}from"./shopSettings";export{RECEIVE_MERCHANT_SETTINGS,MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES,MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED,MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,MERCHANT_SETTINGS_DEFAULT_CURRENCY,MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION,MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY,MERCHANT_SETTINGS_ENABLED_CMS_VERSION}from"./merchantSettings";export{SHOPGATE_CORE_GET_SHOP_SETTINGS,EUNAUTHORIZED,EAUTHENTICATION}from"./pipelines";export*from"./actionTypes";export*from"./appFeatures";export*from"./deviceTypes";export*from"./geolocationRequest";export*from"./optIns";// Core Constants
|
|
2
2
|
export*from'@shopgate/pwa-core/constants/ErrorManager';export*from'@shopgate/pwa-core/constants/AppEvents';export*from'@shopgate/pwa-core/constants/AppPermissions';export*from'@shopgate/pwa-core/constants/ErrorHandleTypes';export*from'@shopgate/pwa-core/constants/Pipeline';export*from'@shopgate/pwa-core/constants/ProcessTypes';export*from'@shopgate/pwa-core/constants/Scanner';export*from'@shopgate/pwa-core/constants/Trilean';// Common Constants
|
|
3
3
|
export*from'@shopgate/pwa-common/constants/ActionTypes';export*from'@shopgate/pwa-common/constants/Configuration';export*from'@shopgate/pwa-common/constants/Device';export*from'@shopgate/pwa-common/constants/DisplayOptions';export*from'@shopgate/pwa-common/constants/Pipelines';export*from'@shopgate/pwa-common/constants/Portals';// CLIENT CONSTANTS
|
|
4
4
|
export*from'@shopgate/pwa-common/constants/client';// MENU CONSTANTS
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export var RECEIVE_MERCHANT_SETTINGS='RECEIVE_MERCHANT_SETTINGS';export var MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED='locationBasedShoppingEnabled';export var MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED='enableSubstitutionPreferences';export var MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES='customerAttributes';export var MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED='enableFulfillmentScheduling';export var MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS='restrictMultiLocationOrders';export var MERCHANT_SETTINGS_DEFAULT_CURRENCY='defaultCurrency';export var MERCHANT_SETTINGS_ENABLE_WEB_INDEXING='enableWebIndexing';export var MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION='productShowAlternativeLocation';export var MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY='productListShowInventory';
|
|
1
|
+
export var RECEIVE_MERCHANT_SETTINGS='RECEIVE_MERCHANT_SETTINGS';export var MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED='locationBasedShoppingEnabled';export var MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED='enableSubstitutionPreferences';export var MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES='customerAttributes';export var MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED='enableFulfillmentScheduling';export var MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS='restrictMultiLocationOrders';export var MERCHANT_SETTINGS_DEFAULT_CURRENCY='defaultCurrency';export var MERCHANT_SETTINGS_ENABLE_WEB_INDEXING='enableWebIndexing';export var MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION='productShowAlternativeLocation';export var MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY='productListShowInventory';export var MERCHANT_SETTINGS_ENABLED_CMS_VERSION='enabledCmsVersion';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export var RECEIVE_SHOP_SETTINGS='RECEIVE_SHOP_SETTINGS';export var ERROR_SHOP_SETTINGS='ERROR_SHOP_SETTINGS';export var CACHE_LEASE_SHOP_SETTINGS=10*60*1000;// 10 minutes in milliseconds
|
|
2
|
-
export var SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE='googleSiteVerificationCode';export var SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT='cartSupplementalContent';export var SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT='orderSupplementalContent';export var SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP='showShopLogoInApp';export var SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB='showShopLogoInWeb';export var SHOP_SETTING_PRODUCTS_SORT_ORDER='productsSortOrder';export var SHOP_SETTING_WISHLIST_MODE='wishlistMode';export var SHOP_SETTING_COOKIE_CONSENT_MODE='cookieConsentMode';export var SHOP_SETTING_DISPLAY_PRICE_PER_MEASURE_UNIT='displayPricePerMeasureUnit';export var SHOP_SETTING_IMAGES='images';export var SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER='productPlaceholder';export var SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER='categoryPlaceholder';export var SHOP_SETTING_IMAGES_FAVICON='favicon';export var SHOP_SETTING_NUMBER_OF_ADDRESS_LINES='numberOfAddressLines';export var SHOP_SETTINGS_SHOW_CATEGORY_IMAGES='showCategoryImages';export var SHOP_SETTING_REGISTRATION_MODE='registrationMode';export var SHOP_SETTING_REGISTRATION_MODE_SIMPLE='simple';export var SHOP_SETTING_REGISTRATION_MODE_EXTENDED='extended';export var SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED='wishlistItemQuantityEnabled';export var SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED='wishlistItemNotesEnabled';export var SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED='loadWishlistOnAppStartEnabled';export var SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE='showWishlistItemsCountBadge';export var WISHLIST_MODE_PERSIST_ON_ADD='persistOnAdd';
|
|
2
|
+
export var SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE='googleSiteVerificationCode';export var SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT='cartSupplementalContent';export var SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT='orderSupplementalContent';export var SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP='showShopLogoInApp';export var SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB='showShopLogoInWeb';export var SHOP_SETTING_PRODUCTS_SORT_ORDER='productsSortOrder';export var SHOP_SETTING_WISHLIST_MODE='wishlistMode';export var SHOP_SETTING_COOKIE_CONSENT_MODE='cookieConsentMode';export var SHOP_SETTING_DISPLAY_PRICE_PER_MEASURE_UNIT='displayPricePerMeasureUnit';export var SHOP_SETTING_IMAGES='images';export var SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER='productPlaceholder';export var SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER='categoryPlaceholder';export var SHOP_SETTING_IMAGES_FAVICON='favicon';export var SHOP_SETTING_NUMBER_OF_ADDRESS_LINES='numberOfAddressLines';export var SHOP_SETTINGS_SHOW_CATEGORY_IMAGES='showCategoryImages';export var SHOP_SETTING_REGISTRATION_MODE='registrationMode';export var SHOP_SETTING_REGISTRATION_MODE_SIMPLE='simple';export var SHOP_SETTING_REGISTRATION_MODE_EXTENDED='extended';export var SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED='wishlistItemQuantityEnabled';export var SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED='wishlistItemNotesEnabled';export var SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED='loadWishlistOnAppStartEnabled';export var SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE='showWishlistItemsCountBadge';export var SHOP_SETTING_ENABLE_CMS_2_FOR_ALL_SHOPPERS='enableCms2ForAllShoppers';export var WISHLIST_MODE_PERSIST_ON_ADD='persistOnAdd';
|
|
@@ -9,5 +9,5 @@ import{useRef,useCallback}from'react';/** @typedef {import('./useLongPress').Lon
|
|
|
9
9
|
* @param {(e: Event) => void} callback - Function to call on long press.
|
|
10
10
|
* @param {UseLongPressOptions} [options={}] - Configuration and lifecycle callbacks.
|
|
11
11
|
* @returns {LongPressHandlers} An object containing event handlers for mouse and touch events.
|
|
12
|
-
*/export default function useLongPress(callback){var _ref=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},_ref$threshold=_ref.threshold,threshold=_ref$threshold===void 0?1000:_ref$threshold,onStart=_ref.onStart,onFinish=_ref.onFinish,onCancel=_ref.onCancel
|
|
12
|
+
*/export default function useLongPress(callback){var _ref=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},_ref$threshold=_ref.threshold,threshold=_ref$threshold===void 0?1000:_ref$threshold,onStart=_ref.onStart,onFinish=_ref.onFinish,onCancel=_ref.onCancel;/** @type {import('react').MutableRefObject<number | undefined>} */var timerRef=useRef(undefined);var triggeredRef=useRef(false);var start=useCallback(function(e){if(onStart)onStart(e);triggeredRef.current=false;timerRef.current=window.setTimeout(function(){callback(e);triggeredRef.current=true;if(onFinish)onFinish(e);},threshold);},[onStart,threshold,callback,onFinish]);var cancel=useCallback(function(e){window.clearTimeout(timerRef.current);if(!triggeredRef.current&&onCancel){onCancel(e);}},[onCancel]);return{onMouseDown:start,onTouchStart:start,onMouseUp:cancel,onMouseLeave:cancel,onTouchEnd:cancel,// prevents right-click or long-press menu
|
|
13
13
|
onContextMenu:preventContextMenu};}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{produce}from'immer';import appConfig from'@shopgate/pwa-common/helpers/config';import{RECEIVE_MERCHANT_SETTINGS,MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,MERCHANT_SETTINGS_DEFAULT_CURRENCY,MERCHANT_SETTINGS_ENABLE_WEB_INDEXING}from"../constants";var _appConfig$locales=appConfig.locales,_appConfig$locales2=_appConfig$locales===void 0?{}:_appConfig$locales,_appConfig$locales2$c=_appConfig$locales2.currency,currency=_appConfig$locales2$c===void 0?null:_appConfig$locales2$c;var defaultState=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,false),MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,false),MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,false),MERCHANT_SETTINGS_DEFAULT_CURRENCY,currency),MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,false);/**
|
|
1
|
+
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{produce}from'immer';import appConfig from'@shopgate/pwa-common/helpers/config';import{RECEIVE_MERCHANT_SETTINGS,MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,MERCHANT_SETTINGS_DEFAULT_CURRENCY,MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,MERCHANT_SETTINGS_ENABLED_CMS_VERSION}from"../constants";var _appConfig$locales=appConfig.locales,_appConfig$locales2=_appConfig$locales===void 0?{}:_appConfig$locales,_appConfig$locales2$c=_appConfig$locales2.currency,currency=_appConfig$locales2$c===void 0?null:_appConfig$locales2$c;var defaultState=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,false),MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,false),MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,false),MERCHANT_SETTINGS_DEFAULT_CURRENCY,currency),MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,false),MERCHANT_SETTINGS_ENABLED_CMS_VERSION,'v1');/**
|
|
2
2
|
* Stores the merchant settings.
|
|
3
3
|
* @param {Object} [state={}] The current state.
|
|
4
4
|
* @param {Object} action The action object.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var _defaultState;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 _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{produce}from'immer';import{SORT_RELEVANCE}from'@shopgate/pwa-common/constants/DisplayOptions';import{RECEIVE_SHOP_SETTINGS,ERROR_SHOP_SETTINGS,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT,SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT,SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB,SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP,SHOP_SETTING_PRODUCTS_SORT_ORDER,SHOP_SETTING_IMAGES,SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,SHOP_SETTING_IMAGES_FAVICON,SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE}from"../constants";var defaultState=(_defaultState={},_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defaultState,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,null),SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT,null),SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT,null),SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB,true),SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP,true),SHOP_SETTING_PRODUCTS_SORT_ORDER,SORT_RELEVANCE),SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,2),SHOP_SETTING_IMAGES,_defineProperty(_defineProperty(_defineProperty({},SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,null),SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,null),SHOP_SETTING_IMAGES_FAVICON,null)),SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,false),SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,false),_defineProperty(_defineProperty(_defaultState,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,true),SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE,true));/**
|
|
1
|
+
var _defaultState;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 _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{produce}from'immer';import{SORT_RELEVANCE}from'@shopgate/pwa-common/constants/DisplayOptions';import{RECEIVE_SHOP_SETTINGS,ERROR_SHOP_SETTINGS,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT,SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT,SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB,SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP,SHOP_SETTING_PRODUCTS_SORT_ORDER,SHOP_SETTING_IMAGES,SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,SHOP_SETTING_IMAGES_FAVICON,SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE,SHOP_SETTING_ENABLE_CMS_2_FOR_ALL_SHOPPERS}from"../constants";var defaultState=(_defaultState={},_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defaultState,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,null),SHOP_SETTING_CART_SUPPLEMENTAL_CONTENT,null),SHOP_SETTING_ORDER_SUPPLEMENTAL_CONTENT,null),SHOP_SETTING_SHOW_SHOP_LOGO_IN_WEB,true),SHOP_SETTING_SHOW_SHOP_LOGO_IN_APP,true),SHOP_SETTING_PRODUCTS_SORT_ORDER,SORT_RELEVANCE),SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,2),SHOP_SETTING_IMAGES,_defineProperty(_defineProperty(_defineProperty({},SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,null),SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,null),SHOP_SETTING_IMAGES_FAVICON,null)),SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,false),SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,false),_defineProperty(_defineProperty(_defineProperty(_defaultState,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,true),SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE,true),SHOP_SETTING_ENABLE_CMS_2_FOR_ALL_SHOPPERS,false));/**
|
|
2
2
|
* Stores the product locations by the location code.
|
|
3
3
|
* @param {Object} [state={}] The current state.
|
|
4
4
|
* @param {Object} action The action object.
|
package/core/selectors/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export{getState as getShopSettingsState,makeGetShopSettingByKey,makeGetShopSettings,getProductImagePlaceholder,getCategoryImagePlaceholder,getFavicon,getNumberOfAddressLines,getGoogleSiteVerificationCode,getRegistrationMode,getWishlistItemQuantityEnabled,getWishlistItemNotesEnabled,getShowWishlistItemsCountBadge,getLoadWishlistOnAppStartEnabled}from"./shopSettings";export{getIsLocationBasedShopping,getFulfillmentSchedulingEnabled,getRestrictMultiLocationOrders,getDefaultCurrency,getEnableWebIndexing,getProductShowAlternativeLocation,getProductListShowInventory}from"./merchantSettings";export*from"../config/config.selectors";export*from"./app";// --------------- CLIENT --------------- //
|
|
1
|
+
export{getState as getShopSettingsState,makeGetShopSettingByKey,makeGetShopSettings,getProductImagePlaceholder,getCategoryImagePlaceholder,getFavicon,getNumberOfAddressLines,getGoogleSiteVerificationCode,getRegistrationMode,getWishlistItemQuantityEnabled,getWishlistItemNotesEnabled,getShowWishlistItemsCountBadge,getLoadWishlistOnAppStartEnabled,getEnableCms2ForAllShoppers}from"./shopSettings";export{getIsLocationBasedShopping,getFulfillmentSchedulingEnabled,getRestrictMultiLocationOrders,getDefaultCurrency,getEnableWebIndexing,getProductShowAlternativeLocation,getProductListShowInventory,getEnabledCMSVersion}from"./merchantSettings";export*from"../config/config.selectors";export*from"./app";// --------------- CLIENT --------------- //
|
|
2
2
|
export*from'@shopgate/pwa-common/selectors/client';// --------------- ROUTER --------------- //
|
|
3
3
|
export*from'@shopgate/pwa-common/selectors/router';export*from'@shopgate/pwa-common/selectors/history';// --------------- URL --------------- //
|
|
4
4
|
export*from'@shopgate/pwa-common/selectors/url';// --------------- MENU --------------- //
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createSelector}from'reselect';import{MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES,MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED,MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,MERCHANT_SETTINGS_DEFAULT_CURRENCY,MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION,MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY}from"../constants";/**
|
|
1
|
+
import{createSelector}from'reselect';import{MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES,MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED,MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,MERCHANT_SETTINGS_DEFAULT_CURRENCY,MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION,MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY,MERCHANT_SETTINGS_ENABLED_CMS_VERSION}from"../constants";/**
|
|
2
2
|
* Retrieves the merchantSettings state from the store.
|
|
3
3
|
* @param {Object} state The current application state.
|
|
4
4
|
* @return {Object} The locations state.
|
|
@@ -7,4 +7,7 @@ import{createSelector}from'reselect';import{MERCHANT_SETTINGS_LOCATION_BASED_SHO
|
|
|
7
7
|
* @param {string} key The key of the merchant setting
|
|
8
8
|
* @param {*} [fallback=null] The fallback value when no value can be determined.
|
|
9
9
|
* @returns {Function}
|
|
10
|
-
*/var makeGetMerchantSettingByKey=function makeGetMerchantSettingByKey(key){var fallback=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;return createSelector(getState,function(state){return typeof(state===null||state===void 0?void 0:state[key])!=='undefined'?state===null||state===void 0?void 0:state[key]:fallback;});};export var getIsLocationBasedShopping=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,false);export var getSubstitutionPreferencesEnabled=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,false);export var getMerchantCustomerAttributes=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES,[]);export var getFulfillmentSchedulingEnabled=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED,false);export var getRestrictMultiLocationOrders=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,false);export var getDefaultCurrency=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_DEFAULT_CURRENCY);export var getEnableWebIndexing=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,false);export var getProductShowAlternativeLocation=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION,false);export var getProductListShowInventory=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY,false)
|
|
10
|
+
*/var makeGetMerchantSettingByKey=function makeGetMerchantSettingByKey(key){var fallback=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;return createSelector(getState,function(state){return typeof(state===null||state===void 0?void 0:state[key])!=='undefined'?state===null||state===void 0?void 0:state[key]:fallback;});};export var getIsLocationBasedShopping=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_LOCATION_BASED_SHOPPING_ENABLED,false);export var getSubstitutionPreferencesEnabled=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_SUBSTITUTION_PREFERENCES_ENABLED,false);export var getMerchantCustomerAttributes=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_CUSTOMER_ATTRIBUTES,[]);export var getFulfillmentSchedulingEnabled=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_FULFILLMENT_SCHEDULED_ENABLED,false);export var getRestrictMultiLocationOrders=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_RESTRICT_MULTI_LOCATION_ORDERS,false);export var getDefaultCurrency=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_DEFAULT_CURRENCY);export var getEnableWebIndexing=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_ENABLE_WEB_INDEXING,false);export var getProductShowAlternativeLocation=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_PRODUCT_SHOW_ALTERNATIVE_LOCATION,false);export var getProductListShowInventory=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_PRODUCTLIST_SHOW_INVENTORY,false);/**
|
|
11
|
+
* Selector that retrieves the enabled CMS version.
|
|
12
|
+
* @type {(state: RootState) => "v1" | "v2" | "both"}
|
|
13
|
+
*/export var getEnabledCMSVersion=makeGetMerchantSettingByKey(MERCHANT_SETTINGS_ENABLED_CMS_VERSION,'v1');export{getState};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createSelector}from'reselect';import{WISHLIST_MODE_PERSIST_ON_ADD,SHOP_SETTING_WISHLIST_MODE,SHOP_SETTING_IMAGES,SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,SHOP_SETTING_IMAGES_FAVICON,SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,SHOP_SETTINGS_SHOW_CATEGORY_IMAGES,SHOP_SETTING_REGISTRATION_MODE,SHOP_SETTING_REGISTRATION_MODE_EXTENDED,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE}from"../constants/shopSettings";/**
|
|
1
|
+
import{createSelector}from'reselect';import{WISHLIST_MODE_PERSIST_ON_ADD,SHOP_SETTING_WISHLIST_MODE,SHOP_SETTING_IMAGES,SHOP_SETTING_IMAGES_PRODUCT_PLACEHOLDER,SHOP_SETTING_IMAGES_CATEGORY_PLACEHOLDER,SHOP_SETTING_IMAGES_FAVICON,SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,SHOP_SETTINGS_SHOW_CATEGORY_IMAGES,SHOP_SETTING_REGISTRATION_MODE,SHOP_SETTING_REGISTRATION_MODE_EXTENDED,SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE,SHOP_SETTING_ENABLE_CMS_2_FOR_ALL_SHOPPERS}from"../constants/shopSettings";/**
|
|
2
2
|
* Retrieves the shopSettings state from the store.
|
|
3
3
|
* @param {Object} state The current application state.
|
|
4
4
|
* @return {Object} The locations state.
|
|
@@ -22,4 +22,7 @@ import{createSelector}from'reselect';import{WISHLIST_MODE_PERSIST_ON_ADD,SHOP_SE
|
|
|
22
22
|
*/export var getNumberOfAddressLines=makeGetShopSettingByKey(SHOP_SETTING_NUMBER_OF_ADDRESS_LINES,2);export var getGoogleSiteVerificationCode=makeGetShopSettingByKey(SHOP_SETTING_GOOGLE_SITE_VERIFICATION_CODE,'');export var getShowCategoryImages=makeGetShopSettingByKey(SHOP_SETTINGS_SHOW_CATEGORY_IMAGES,true);/**
|
|
23
23
|
* Creates a selector to retrieve the current active registration mode.
|
|
24
24
|
* When the selector returns "simple" the form will not contain any address related fields.
|
|
25
|
-
*/export var getRegistrationMode=makeGetShopSettingByKey(SHOP_SETTING_REGISTRATION_MODE,SHOP_SETTING_REGISTRATION_MODE_EXTENDED);export var getWishlistItemQuantityEnabled=makeGetShopSettingByKey(SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,false);export var getWishlistItemNotesEnabled=makeGetShopSettingByKey(SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,false);export var getLoadWishlistOnAppStartEnabled=makeGetShopSettingByKey(SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,true);export var getShowWishlistItemsCountBadge=createSelector(getLoadWishlistOnAppStartEnabled,makeGetShopSettingByKey(SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE,true),function(loadWishlistOnAppStartEnabled,showWishlistItemsCountBadge){return loadWishlistOnAppStartEnabled?showWishlistItemsCountBadge:false;})
|
|
25
|
+
*/export var getRegistrationMode=makeGetShopSettingByKey(SHOP_SETTING_REGISTRATION_MODE,SHOP_SETTING_REGISTRATION_MODE_EXTENDED);export var getWishlistItemQuantityEnabled=makeGetShopSettingByKey(SHOP_SETTING_WISHLIST_ITEM_QUANTITY_ENABLED,false);export var getWishlistItemNotesEnabled=makeGetShopSettingByKey(SHOP_SETTING_WISHLIST_ITEM_NOTES_ENABLED,false);export var getLoadWishlistOnAppStartEnabled=makeGetShopSettingByKey(SHOP_SETTING_LOAD_WISHLIST_ON_APP_START_ENABLED,true);export var getShowWishlistItemsCountBadge=createSelector(getLoadWishlistOnAppStartEnabled,makeGetShopSettingByKey(SHOP_SETTING_SHOW_WISHLIST_ITEMS_COUNT_BADGE,true),function(loadWishlistOnAppStartEnabled,showWishlistItemsCountBadge){return loadWishlistOnAppStartEnabled?showWishlistItemsCountBadge:false;});/**
|
|
26
|
+
* Selector that determines if CMS 2 is enabled for all shoppers.
|
|
27
|
+
* @type {(state: RootState) => boolean}
|
|
28
|
+
*/export var getEnableCms2ForAllShoppers=makeGetShopSettingByKey(SHOP_SETTING_ENABLE_CMS_2_FOR_ALL_SHOPPERS,false);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{DEVELOPMENT_TOOLS_TOGGLE_INSETS,DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT}from"../constants";/**
|
|
1
|
+
import{DEVELOPMENT_TOOLS_TOGGLE_INSETS,DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT,DEVELOPMENT_TOOLS_TOGGLE_CMS2_PREVIEW}from"../constants";/**
|
|
2
2
|
* Toggles the simulation of iOS safe area insets.
|
|
3
3
|
* @param {boolean} visible Whether the insets should be visible or not.
|
|
4
4
|
* @returns {Object} The action object.
|
|
@@ -6,4 +6,8 @@ import{DEVELOPMENT_TOOLS_TOGGLE_INSETS,DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT}
|
|
|
6
6
|
* Toggles the highlighting of the simulated iOS safe area insets.
|
|
7
7
|
* @param {boolean} visible Whether the insets should be visible or not.
|
|
8
8
|
* @returns {Object} The action object.
|
|
9
|
-
*/export var toggleInsetHighlight=function toggleInsetHighlight(){var visible=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;return{type:DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT,visible:visible};}
|
|
9
|
+
*/export var toggleInsetHighlight=function toggleInsetHighlight(){var visible=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;return{type:DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT,visible:visible};};/**
|
|
10
|
+
* Toggles the CMS 2.0 preview mode.
|
|
11
|
+
* @param {boolean} enabled Whether the CMS 2.0 preview should be enabled or not.
|
|
12
|
+
* @returns {Object} The action object.
|
|
13
|
+
*/export var toggleCms2Preview=function toggleCms2Preview(){var enabled=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;return{type:DEVELOPMENT_TOOLS_TOGGLE_CMS2_PREVIEW,enabled:enabled};};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
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 _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest();}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}function _iterableToArrayLimit(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr;}import React,{useState}from'react';import{useSelector}from'react-redux';import{makeStyles}from'@shopgate/engage/styles';import{useLongPress}from'@shopgate/engage/core/hooks';import{getClientInformation}from'@shopgate/engage/core/selectors';import DevelopmentSettings from"../DevelopmentSettings";var useStyles=makeStyles()(function(theme){return{root:{position:'relative',textAlign:'center',color:theme.palette.grey[500],fontSize:12,paddingBottom:20},unselectable:{WebkitTouchCallout:'none',WebkitUserSelect:'none',userSelect:'none'},deviceId:{wordBreak:['keep-all','break-word'],hyphens:'auto',padding:theme.spacing(0,2)}};});/**
|
|
2
|
+
* @param {Object} props The component props.
|
|
3
|
+
* @returns {JSX.Element}
|
|
4
|
+
*/var ClientInformation=function ClientInformation(){var _useStyles=useStyles(),classes=_useStyles.classes,cx=_useStyles.cx;var _useState=useState(false),_useState2=_slicedToArray(_useState,2),deviceIdVisible=_useState2[0],setDeviceIdVisible=_useState2[1];var _useState3=useState(false),_useState4=_slicedToArray(_useState3,2),developmentSettingsVisible=_useState4[0],setDevelopmentSettingsVisible=_useState4[1];// Press handler to show the device ID
|
|
5
|
+
var longPressAttrs=useLongPress(function(){if(!deviceIdVisible){setDeviceIdVisible(true);}else{setDevelopmentSettingsVisible(true);}},{threshold:5000});var _useSelector=useSelector(getClientInformation),appVersion=_useSelector.appVersion,codebaseVersion=_useSelector.codebaseVersion,deviceId=_useSelector.deviceId,libVersion=_useSelector.libVersion;if(!codebaseVersion){return null;}return React.createElement("div",_extends({className:cx('ui-shared__client-information',classes.root)},longPressAttrs,{"aria-hidden":true}),React.createElement("p",{className:classes.unselectable},"App Version: ".concat(appVersion," (").concat(codebaseVersion,")"),React.createElement("br",null),"Lib Version: ".concat(libVersion)),deviceIdVisible&&React.createElement(React.Fragment,null,React.createElement("p",{className:classes.deviceId},"Device ID: ".concat(deviceId!==null&&deviceId!==void 0?deviceId:'')),React.createElement(DevelopmentSettings,{isOpen:developmentSettingsVisible,onClose:function onClose(){return setDevelopmentSettingsVisible(false);}})));};export default ClientInformation;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{DataRequest}from'@shopgate/engage/core/classes';import{setDebugLoggingEnabled}from'@shopgate/engage/core/commands';/**
|
|
2
|
+
* Enable debug logging.
|
|
3
|
+
* @return {Function} A redux thunk.
|
|
4
|
+
*/export var enableDebugLogging=function enableDebugLogging(){return function(){setDebugLoggingEnabled();new DataRequest('ajax_started_live_logging').dispatch();};};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./ClientInformation";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from'react';import PropTypes from'prop-types';import{useSelector,useDispatch}from'react-redux';import{SheetDrawer,RippleButton}from'@shopgate/engage/components';import{makeStyles}from'@shopgate/engage/styles';import{getEnabledCMSVersion,getEnableCms2ForAllShoppers}from'@shopgate/engage/core/selectors';import{getIsCMS2PreviewEnabled}from"../../selectors";import{toggleCms2Preview}from"../../action-creators";var useStyles=makeStyles()(function(theme){return{container:{padding:theme.spacing(2,2,4),display:'flex',justifyContent:'center'},button:{fontWeight:'normal'}};});/**
|
|
2
|
+
* Development settings component.
|
|
3
|
+
* @param {Object} props The component props.
|
|
4
|
+
* @param {boolean} props.isOpen Whether the drawer is open.
|
|
5
|
+
* @param {Function} props.onClose The function to call when the drawer should be closed.
|
|
6
|
+
* @returns {JSX.Element}
|
|
7
|
+
*/var DevelopmentSettings=function DevelopmentSettings(_ref){var isOpen=_ref.isOpen,onClose=_ref.onClose;var _useStyles=useStyles(),classes=_useStyles.classes;var dispatch=useDispatch();var enabledCMSVersion=useSelector(getEnabledCMSVersion);var enableCms2ForAllShoppers=useSelector(getEnableCms2ForAllShoppers);var isCMS2PreviewEnabled=useSelector(getIsCMS2PreviewEnabled);// No need to show the preview toggle if CMS 2.0 is not available for the merchant or if it's
|
|
8
|
+
// already enabled for all shoppers.
|
|
9
|
+
if(enableCms2ForAllShoppers||enabledCMSVersion==='v1'){return null;}return React.createElement(SheetDrawer,{title:" ",isOpen:isOpen,onClose:onClose},React.createElement("div",{className:classes.container},React.createElement(RippleButton,{className:classes.button,type:"simple",onClick:function onClick(){onClose();setTimeout(function(){dispatch(toggleCms2Preview(!isCMS2PreviewEnabled));},300);}},"".concat(isCMS2PreviewEnabled?'Disable':'Enable'," CMS 2.0 Preview"))));};export default DevelopmentSettings;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./DevelopmentSettings";
|
|
@@ -4,5 +4,5 @@ import{useEffect,useCallback}from'react';/**
|
|
|
4
4
|
*
|
|
5
5
|
* @param {string} shortcut - Shortcut string using mac-style notation, e.g. 'cmd+i'.
|
|
6
6
|
* @param {Function} callback - Function to call when the shortcut is triggered.
|
|
7
|
-
*/export function useShortcut(shortcut,callback){var normalizeShortcut=useCallback(function(){return shortcut.toLowerCase().split('+').map(function(k){return k.trim();}).sort().join('+');},[shortcut]);var handleKeyDown=useCallback(function(event){var keys=[];if(event.ctrlKey)keys.push('ctrl');if(event.metaKey)keys.push('cmd');// Treat meta as cmd
|
|
8
|
-
if(event.altKey)keys.push('alt');if(event.shiftKey)keys.push('shift');var key=event.key.toLowerCase();if(!['control','meta','alt','shift'].includes(key)){keys.push(key);}var pressed=keys.sort().join('+');if(pressed===normalizeShortcut()){event.preventDefault();callback(event);}},[callback,normalizeShortcut]);useEffect(function(){window.addEventListener('keydown',handleKeyDown);return function(){return window.removeEventListener('keydown',handleKeyDown);};},[handleKeyDown]);}
|
|
7
|
+
*/export function useShortcut(shortcut,callback){var normalizeShortcut=useCallback(function(){return shortcut.toLowerCase().split('+').map(function(k){return k.trim();}).sort().join('+');},[shortcut]);var handleKeyDown=useCallback(function(event){var _event$key;var keys=[];if(event.ctrlKey)keys.push('ctrl');if(event.metaKey)keys.push('cmd');// Treat meta as cmd
|
|
8
|
+
if(event.altKey)keys.push('alt');if(event.shiftKey)keys.push('shift');var key=(_event$key=event.key)===null||_event$key===void 0?void 0:_event$key.toLowerCase();if(!['control','meta','alt','shift'].includes(key)){keys.push(key);}var pressed=keys.sort().join('+');if(pressed===normalizeShortcut()){event.preventDefault();callback(event);}},[callback,normalizeShortcut]);useEffect(function(){window.addEventListener('keydown',handleKeyDown);return function(){return window.removeEventListener('keydown',handleKeyDown);};},[handleKeyDown]);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{default as DevelopmentTools}from"./DevelopmentTools";
|
|
1
|
+
export{default as DevelopmentTools}from"./DevelopmentTools";export{default as ClientInformation}from"./ClientInformation";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export var DEVELOPMENT_TOOLS_TOGGLE_INSETS='DEVELOPMENT_TOOLS_TOGGLE_INSETS';export var DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT='DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT';export var DEVELOPMENT_TOOLS_UPDATE_STATUS_BAR_STYLE_STORAGE='DEVELOPMENT_TOOLS_UPDATE_STATUS_BAR_STYLE_STORAGE';
|
|
1
|
+
export var DEVELOPMENT_TOOLS_TOGGLE_INSETS='DEVELOPMENT_TOOLS_TOGGLE_INSETS';export var DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT='DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT';export var DEVELOPMENT_TOOLS_UPDATE_STATUS_BAR_STYLE_STORAGE='DEVELOPMENT_TOOLS_UPDATE_STATUS_BAR_STYLE_STORAGE';export var DEVELOPMENT_TOOLS_TOGGLE_CMS2_PREVIEW='DEVELOPMENT_TOOLS_TOGGLE_CMS2_PREVIEW';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{produce}from'immer';import{isDev}from'@shopgate/engage/core/helpers';import{DEVELOPMENT_TOOLS_TOGGLE_INSETS,DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT}from"../constants";/**
|
|
1
|
+
import{produce}from'immer';import{isDev}from'@shopgate/engage/core/helpers';import{DEVELOPMENT_TOOLS_TOGGLE_INSETS,DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT,DEVELOPMENT_TOOLS_TOGGLE_CMS2_PREVIEW}from"../constants";/**
|
|
2
2
|
* @typedef {Object} DevToolsSettingsState
|
|
3
3
|
* @property {boolean} showInsets
|
|
4
4
|
* @property {boolean} showInsetHighlight
|
|
5
|
-
*/ /** @type DevToolsSettingsState */var initialState={showInsets:null,showInsetHighlight:false};/**
|
|
5
|
+
*/ /** @type DevToolsSettingsState */var initialState={showInsets:null,showInsetHighlight:false,cms2PreviewEnabled:false};/**
|
|
6
6
|
* The reducer for all development tools settings related states.
|
|
7
7
|
* @param {Object} state The application state.
|
|
8
8
|
* @param {Object} action The redux action.
|
|
9
9
|
* @returns {Object}
|
|
10
|
-
*/export default function settingsReducer(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:initialState;var action=arguments.length>1?arguments[1]:undefined;/* eslint-disable no-param-reassign */var producer=produce(/** @param {DevToolsSettingsState} draft The draft */function(draft){
|
|
10
|
+
*/export default function settingsReducer(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:initialState;var action=arguments.length>1?arguments[1]:undefined;/* eslint-disable no-param-reassign */var producer=produce(/** @param {DevToolsSettingsState} draft The draft */function(draft){switch(action.type){case DEVELOPMENT_TOOLS_TOGGLE_INSETS:{if(isDev){draft.showInsets=action.visible;}break;}case DEVELOPMENT_TOOLS_TOGGLE_INSET_HIGHLIGHT:{if(isDev){draft.showInsetHighlight=action.visible;}break;}case DEVELOPMENT_TOOLS_TOGGLE_CMS2_PREVIEW:{draft.cms2PreviewEnabled=action.enabled;break;}default:break;}});/* eslint-enable no-param-reassign */return producer(state);}
|
|
@@ -18,4 +18,7 @@ import{createSelector}from'reselect';import MobileDetect from'mobile-detect';imp
|
|
|
18
18
|
if(!isDev){return false;}// No insets injected if PWA is running inside the app
|
|
19
19
|
if(hasSGJavaScriptBridge()){return false;}// If the state contains a bool value, respect is.
|
|
20
20
|
if(typeof insetsVisible==='boolean'){return insetsVisible;}// Show insets on simulated iOS devices by default if insets decision is not set.
|
|
21
|
-
return insetsVisible===null&&md.os()==='iOS';})
|
|
21
|
+
return insetsVisible===null&&md.os()==='iOS';});/**
|
|
22
|
+
* Creates a selector to determine if the CMS2 preview is enabled.
|
|
23
|
+
* @type {(state: any) => boolean}
|
|
24
|
+
*/export var getIsCMS2PreviewEnabled=createSelector(getState,function(settings){return!!settings.cms2PreviewEnabled;});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shopgate/engage",
|
|
3
|
-
"version": "7.29.0-alpha.
|
|
3
|
+
"version": "7.29.0-alpha.10",
|
|
4
4
|
"description": "Shopgate's ENGAGE library.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Shopgate <support@shopgate.com>",
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@emotion/react": "^11.14.0",
|
|
19
19
|
"@shopgate/native-modules": "1.0.0-beta.25",
|
|
20
|
-
"@shopgate/pwa-common": "7.29.0-alpha.
|
|
21
|
-
"@shopgate/pwa-common-commerce": "7.29.0-alpha.
|
|
22
|
-
"@shopgate/pwa-core": "7.29.0-alpha.
|
|
23
|
-
"@shopgate/pwa-ui-ios": "7.29.0-alpha.
|
|
24
|
-
"@shopgate/pwa-ui-material": "7.29.0-alpha.
|
|
25
|
-
"@shopgate/pwa-ui-shared": "7.29.0-alpha.
|
|
20
|
+
"@shopgate/pwa-common": "7.29.0-alpha.10",
|
|
21
|
+
"@shopgate/pwa-common-commerce": "7.29.0-alpha.10",
|
|
22
|
+
"@shopgate/pwa-core": "7.29.0-alpha.10",
|
|
23
|
+
"@shopgate/pwa-ui-ios": "7.29.0-alpha.10",
|
|
24
|
+
"@shopgate/pwa-ui-material": "7.29.0-alpha.10",
|
|
25
|
+
"@shopgate/pwa-ui-shared": "7.29.0-alpha.10",
|
|
26
26
|
"@stripe/react-stripe-js": "^1.16.5",
|
|
27
27
|
"@stripe/stripe-js": "^1.3.1",
|
|
28
28
|
"@virtuous/conductor": "~2.5.0",
|
|
@@ -3,20 +3,20 @@ import{REQUEST_PAGE_CONFIG_V2,RECEIVE_PAGE_CONFIG_V2,ERROR_PAGE_CONFIG_V2}from".
|
|
|
3
3
|
*/ /**
|
|
4
4
|
* Creates the dispatched REQUEST_PAGE_CONFIG_V2 action object.
|
|
5
5
|
* @param {Object} params The action params
|
|
6
|
-
* @param {PageType} params.type The type of the page.
|
|
6
|
+
* @param {PageType} [params.type="cms"] The type of the page.
|
|
7
7
|
* @param {string} [params.slug=null] The slug of the page (optional).
|
|
8
8
|
* @returns {Object} The dispatched action object.
|
|
9
|
-
*/export var requestPageConfigV2=function requestPageConfigV2(_ref){var type=_ref.type,_ref$slug=_ref.slug,slug=_ref$slug===void 0?null:_ref$slug;return{type:REQUEST_PAGE_CONFIG_V2,pageType:type,pageSlug:slug};};/**
|
|
9
|
+
*/export var requestPageConfigV2=function requestPageConfigV2(_ref){var _ref$type=_ref.type,type=_ref$type===void 0?'cms':_ref$type,_ref$slug=_ref.slug,slug=_ref$slug===void 0?null:_ref$slug;return{type:REQUEST_PAGE_CONFIG_V2,pageType:type,pageSlug:slug};};/**
|
|
10
10
|
* Creates the dispatched RECEIVE_PAGE_CONFIG_V2 action object.
|
|
11
11
|
* @param {Object} params The action params
|
|
12
|
-
* @param {PageType} params.type The type of the page.
|
|
12
|
+
* @param {PageType} [params.type="cms"] The type of the page.
|
|
13
13
|
* @param {Object} params.data The page data
|
|
14
14
|
* @param {string} [params.slug=null] The slug of the page (optional).
|
|
15
15
|
* @returns {Object} The dispatched action object.
|
|
16
|
-
*/export var receivePageConfigV2=function receivePageConfigV2(_ref2){var type=_ref2.type,data=_ref2.data,_ref2$slug=_ref2.slug,slug=_ref2$slug===void 0?null:_ref2$slug;return{type:RECEIVE_PAGE_CONFIG_V2,pageType:type,pageSlug:slug,data:data};};/**
|
|
16
|
+
*/export var receivePageConfigV2=function receivePageConfigV2(_ref2){var _ref2$type=_ref2.type,type=_ref2$type===void 0?'cms':_ref2$type,data=_ref2.data,_ref2$slug=_ref2.slug,slug=_ref2$slug===void 0?null:_ref2$slug;return{type:RECEIVE_PAGE_CONFIG_V2,pageType:type,pageSlug:slug,data:data};};/**
|
|
17
17
|
* Creates the dispatched ERROR_PAGE_CONFIG_V2 action object.
|
|
18
18
|
* @param {Object} params The action params
|
|
19
|
-
* @param {PageType} params.type The type of the page.
|
|
19
|
+
* @param {PageType} [params.type="cms"] The type of the page.
|
|
20
20
|
* @param {string} [params.slug=null] The slug of the page (optional).
|
|
21
21
|
* @returns {Object} The dispatched action object.
|
|
22
|
-
*/export var errorPageConfigV2=function errorPageConfigV2(_ref3){var type=_ref3.type,_ref3$slug=_ref3.slug,slug=_ref3$slug===void 0?null:_ref3$slug;return{type:ERROR_PAGE_CONFIG_V2,pageType:type,pageSlug:slug};};
|
|
22
|
+
*/export var errorPageConfigV2=function errorPageConfigV2(_ref3){var _ref3$type=_ref3.type,type=_ref3$type===void 0?'cms':_ref3$type,_ref3$slug=_ref3.slug,slug=_ref3$slug===void 0?null:_ref3$slug;return{type:ERROR_PAGE_CONFIG_V2,pageType:type,pageSlug:slug};};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var _excluded=["src","alt","breakpoint"];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 _objectWithoutProperties(source,excluded){if(source==null)return{};var target=_objectWithoutPropertiesLoose(source,excluded);var key,i;if(Object.getOwnPropertySymbols){var sourceSymbolKeys=Object.getOwnPropertySymbols(source);for(i=0;i<sourceSymbolKeys.length;i++){key=sourceSymbolKeys[i];if(excluded.indexOf(key)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(source,key))continue;target[key]=source[key];}}return target;}function _objectWithoutPropertiesLoose(source,excluded){if(source==null)return{};var target={};var sourceKeys=Object.keys(source);var key,i;for(i=0;i<sourceKeys.length;i++){key=sourceKeys[i];if(excluded.indexOf(key)>=0)continue;target[key]=source[key];}return target;}import React,{useMemo}from'react';import PropTypes from'prop-types';import{useTheme,makeStyles}from'@shopgate/engage/styles';import{parseImageUrl}from"../../helpers";/** @typedef {import('@shopgate/engage/styles').Theme} Theme */ /** @typedef {Theme['breakpoints']['keys'][0]} Breakpoint */ /** @typedef {React.ImgHTMLAttributes<HTMLImageElement>} ImgProps */ /** @typedef {{breakpoint: Breakpoint} & ImgProps} ResponsiveImageProps */var useStyles=makeStyles()({preventSave:{userSelect:'none',' img':{userSelect:'none',pointerEvents:'none'}}});/**
|
|
2
|
+
* The ResponsiveWidgetImage component renders an image that adapts to different screen sizes.
|
|
3
|
+
* It uses the <picture> element to provide a higher resolution image for medium and larger screens.
|
|
4
|
+
*
|
|
5
|
+
* @param {ResponsiveImageProps} props The component props.
|
|
6
|
+
* @returns {JSX.Element}
|
|
7
|
+
*/var ResponsiveWidgetImage=function ResponsiveWidgetImage(_ref){var src=_ref.src,alt=_ref.alt,breakpoint=_ref.breakpoint,imgProps=_objectWithoutProperties(_ref,_excluded);var _useTheme=useTheme(),breakpoints=_useTheme.breakpoints;var _useStyles=useStyles(),classes=_useStyles.classes;var src2x=useMemo(function(){return parseImageUrl(src,true);},[src]);if(!src){return null;}return React.createElement("picture",{onContextMenu:function onContextMenu(e){return e.preventDefault();},className:classes.preventSave},React.createElement("source",{media:"(width >= ".concat(breakpoints.values[breakpoint],"px)"),srcSet:src2x}),React.createElement("img",_extends({src:src,alt:alt,loading:"lazy"},imgProps)));};ResponsiveWidgetImage.defaultProps={alt:null,breakpoint:'md'};export default ResponsiveWidgetImage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./ResponsiveWidgetImage";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
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 React,{useMemo}from'react';import{makeStyles}from'@shopgate/engage/styles';import{Typography}from'@shopgate/engage/components';import PropTypes from'prop-types';var useStyles=makeStyles()(function(theme){return{root:{padding:theme.spacing(2)}};});/**
|
|
2
|
+
* The WidgetHeadline is used to display a headline for the widget.
|
|
3
|
+
* @param {Object} props The component props.
|
|
4
|
+
* @param {Object} props.headline The headline props.
|
|
5
|
+
* @returns {JSX.Element}
|
|
6
|
+
*/var WidgetHeadline=function WidgetHeadline(_ref){var headline=_ref.headline,className=_ref.className;var _useStyles=useStyles(),classes=_useStyles.classes,cx=_useStyles.cx,css=_useStyles.css;var _ref2=headline||{},_ref2$typography=_ref2.typography,typography=_ref2$typography===void 0?'h3':_ref2$typography,text=_ref2.text,textAlign=_ref2.textAlign,bold=_ref2.bold,italic=_ref2.italic,underline=_ref2.underline;var styles=useMemo(function(){return _extends({},bold&&{fontWeight:'bold'},{},italic&&{fontStyle:'italic'},{},underline&&{textDecoration:'underline'});},[bold,italic,underline]);if(!text)return null;return React.createElement(Typography,{variant:typography,align:textAlign// && increases the specificity of the styles which guarantees that defaults are overridden
|
|
7
|
+
,className:cx(css({'&&':_extends({},styles)}),classes.root,className)},text);};WidgetHeadline.defaultProps={className:null};export default WidgetHeadline;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./WidgetHeadline";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
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 React from'react';import PropTypes from'prop-types';import{HtmlSanitizer}from'@shopgate/engage/components';import{makeStyles}from'@shopgate/engage/styles';var useStyles=makeStyles()(function(theme){return{root:{width:'100%','& > :first-child':{marginTop:0},'& > :last-child':{marginBottom:0},'& p':{margin:'0px 0px 1rem 0px',':empty':{minHeight:'1rem'}},'ul, ol':{paddingLeft:'40px'},'ul li':{listStyleType:'disc'},'ol li':{listStyleType:'decimal'},h1:_extends({},theme.typography.h1,{margin:'0px 0px 1rem 0px'}),h2:_extends({},theme.typography.h2,{margin:'0px 0px 1rem 0px'}),h3:_extends({},theme.typography.h3,{margin:'0px 0px 1rem 0px'}),h4:_extends({},theme.typography.h4,{margin:'0px 0px 1rem 0px'}),h5:_extends({},theme.typography.h5,{margin:'0px 0px 1rem 0px'}),h6:_extends({},theme.typography.h6,{margin:'0px 0px 1rem 0px'})}};});/**
|
|
2
|
+
* @param {Object} props The component props.
|
|
3
|
+
* @param {string} props.content The rich text content.
|
|
4
|
+
* @param {string} [props.className] An optional class name.
|
|
5
|
+
* @returns {JSX.Element}
|
|
6
|
+
*/var WidgetRichText=function WidgetRichText(_ref){var content=_ref.content,className=_ref.className;var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;if(!content)return null;return React.createElement(HtmlSanitizer,{processStyles:true,settings:{html:content},className:cx(classes.root,className)},content);};WidgetRichText.defaultProps={content:'',className:null};export default WidgetRichText;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./WidgetRichText";
|
|
@@ -8,8 +8,10 @@ function _extends(){_extends=Object.assign||function(target){for(var i=1;i<argum
|
|
|
8
8
|
* @param {React.ComponentType} props.component The widget component to render.
|
|
9
9
|
* @param {WidgetDefinition} props.definition The widget definition data.
|
|
10
10
|
* @param {boolean} props.isPreview Whether the widget is in preview mode.
|
|
11
|
+
* @param {boolean} props.isCustomLegacyWidget Whether the widget is a legacy custom widget provided
|
|
12
|
+
* by an extension that's configured via an HTML comment inside a HTML widget.
|
|
11
13
|
* @returns {JSX.Element}
|
|
12
|
-
*/var Widget=function Widget(_ref2){var _ref3,_definition$layout,_ref4,_definition$layout2,_ref5,_definition$layout3,_ref6,_definition$layout4,_definition$layout5,_definition$layout6,_definition$layout7,_definition$layout8,_definition$meta,_definition$meta$sche,_definition$meta2,_definition$meta2$sch,_definition$meta3,_definition$meta3$sch,_definition$meta4,_definition$meta4$hid,_definition$meta5,_definition$meta5$hid;var Component=_ref2.component,definition=_ref2.definition,isPreview=_ref2.isPreview;var _useStyles=useStyles({marginTop:(_ref3=definition===null||definition===void 0?void 0:(_definition$layout=definition.layout)===null||_definition$layout===void 0?void 0:_definition$layout.marginTop)!==null&&_ref3!==void 0?_ref3:0,marginBottom:(_ref4=definition===null||definition===void 0?void 0:(_definition$layout2=definition.layout)===null||_definition$layout2===void 0?void 0:_definition$layout2.marginBottom)!==null&&_ref4!==void 0?_ref4:0,marginLeft:(_ref5=definition===null||definition===void 0?void 0:(_definition$layout3=definition.layout)===null||_definition$layout3===void 0?void 0:_definition$layout3.marginLeft)!==null&&_ref5!==void 0?_ref5:0,marginRight:(_ref6=definition===null||definition===void 0?void 0:(_definition$layout4=definition.layout)===null||_definition$layout4===void 0?void 0:_definition$layout4.marginRight)!==null&&_ref6!==void 0?_ref6:0}),classes=_useStyles.classes,cx=_useStyles.cx;var _useWidgetsPreview=useWidgetsPreview(),setActiveWidget=_useWidgetsPreview.setActiveWidget,activeWidget=_useWidgetsPreview.activeWidget;// Handle clicks on the widget container in preview mode. Take care that highlighting only happens
|
|
14
|
+
*/var Widget=function Widget(_ref2){var _ref3,_definition$layout,_ref4,_definition$layout2,_ref5,_definition$layout3,_ref6,_definition$layout4,_definition$layout5,_definition$layout6,_definition$layout7,_definition$layout8,_definition$meta,_definition$meta$sche,_definition$meta2,_definition$meta2$sch,_definition$meta3,_definition$meta3$sch,_definition$meta4,_definition$meta4$hid,_definition$meta5,_definition$meta5$hid;var Component=_ref2.component,definition=_ref2.definition,isPreview=_ref2.isPreview,isCustomLegacyWidget=_ref2.isCustomLegacyWidget;var _useStyles=useStyles({marginTop:(_ref3=definition===null||definition===void 0?void 0:(_definition$layout=definition.layout)===null||_definition$layout===void 0?void 0:_definition$layout.marginTop)!==null&&_ref3!==void 0?_ref3:0,marginBottom:(_ref4=definition===null||definition===void 0?void 0:(_definition$layout2=definition.layout)===null||_definition$layout2===void 0?void 0:_definition$layout2.marginBottom)!==null&&_ref4!==void 0?_ref4:0,marginLeft:(_ref5=definition===null||definition===void 0?void 0:(_definition$layout3=definition.layout)===null||_definition$layout3===void 0?void 0:_definition$layout3.marginLeft)!==null&&_ref5!==void 0?_ref5:0,marginRight:(_ref6=definition===null||definition===void 0?void 0:(_definition$layout4=definition.layout)===null||_definition$layout4===void 0?void 0:_definition$layout4.marginRight)!==null&&_ref6!==void 0?_ref6:0}),classes=_useStyles.classes,cx=_useStyles.cx;var _useWidgetsPreview=useWidgetsPreview(),setActiveWidget=_useWidgetsPreview.setActiveWidget,activeWidget=_useWidgetsPreview.activeWidget;// Handle clicks on the widget container in preview mode. Take care that highlighting only happens
|
|
13
15
|
// when the widget is not already active, otherwise it would be confusing when users want to
|
|
14
16
|
// interact with widget elements.
|
|
15
|
-
var handleInteraction=useCallback(function(){setActiveWidget(definition.code,activeWidget!==definition.code);if(activeWidget!==definition.code){dispatchWidgetPreviewEvent('widget-clicked',definition.code);}},[activeWidget,definition.code,setActiveWidget]);var handlers=usePressHandler(handleInteraction);if(!Component){return null;}return React.createElement("section",_extends({id:"widget-code-".concat(definition.code),className:cx(classes.root,_defineProperty({},classes.preview,isPreview)),style:{marginTop:definition===null||definition===void 0?void 0:(_definition$layout5=definition.layout)===null||_definition$layout5===void 0?void 0:_definition$layout5.marginTop,marginBottom:definition===null||definition===void 0?void 0:(_definition$layout6=definition.layout)===null||_definition$layout6===void 0?void 0:_definition$layout6.marginBottom,marginLeft:definition===null||definition===void 0?void 0:(_definition$layout7=definition.layout)===null||_definition$layout7===void 0?void 0:_definition$layout7.marginLeft,marginRight:definition===null||definition===void 0?void 0:(_definition$layout8=definition.layout)===null||_definition$layout8===void 0?void 0:_definition$layout8.marginRight},"data-widget-name":definition.widgetConfigDefinitionCode},isPreview&&_extends({},handlers)),isPreview&&(definition===null||definition===void 0?void 0:definition.meta)&&React.createElement("div",{className:classes.widgetInfo},((_definition$meta=definition.meta)===null||_definition$meta===void 0?void 0:(_definition$meta$sche=_definition$meta.scheduled)===null||_definition$meta$sche===void 0?void 0:_definition$meta$sche.isScheduled)&&React.createElement(Tooltip,{text:(_definition$meta2=definition.meta)===null||_definition$meta2===void 0?void 0:(_definition$meta2$sch=_definition$meta2.scheduled)===null||_definition$meta2$sch===void 0?void 0:_definition$meta2$sch.tooltip},React.createElement(TimeIcon,{className:cx(classes.scheduledIcon,_defineProperty({},classes.scheduledIconExpired,(_definition$meta3=definition.meta)===null||_definition$meta3===void 0?void 0:(_definition$meta3$sch=_definition$meta3.scheduled)===null||_definition$meta3$sch===void 0?void 0:_definition$meta3$sch.isExpired))})),((_definition$meta4=definition.meta)===null||_definition$meta4===void 0?void 0:(_definition$meta4$hid=_definition$meta4.hidden)===null||_definition$meta4$hid===void 0?void 0:_definition$meta4$hid.isHidden)&&React.createElement(Tooltip,{text:(_definition$meta5=definition.meta)===null||_definition$meta5===void 0?void 0:(_definition$meta5$hid=_definition$meta5.hidden)===null||_definition$meta5$hid===void 0?void 0:_definition$meta5$hid.tooltip},React.createElement(VisibilityOffIcon,{className:classes.visibilityIcon}))),React.createElement(WidgetProvider,{definition:definition,isPreview:isPreview},React.createElement(Suspense,{fallback:React.createElement(Loading,null)},React.createElement(Component,
|
|
17
|
+
var handleInteraction=useCallback(function(){setActiveWidget(definition.code,activeWidget!==definition.code);if(activeWidget!==definition.code){dispatchWidgetPreviewEvent('widget-clicked',definition.code);}},[activeWidget,definition.code,setActiveWidget]);var handlers=usePressHandler(handleInteraction);if(!Component){return null;}return React.createElement("section",_extends({id:"widget-code-".concat(definition.code),className:cx(classes.root,_defineProperty({},classes.preview,isPreview)),style:{marginTop:definition===null||definition===void 0?void 0:(_definition$layout5=definition.layout)===null||_definition$layout5===void 0?void 0:_definition$layout5.marginTop,marginBottom:definition===null||definition===void 0?void 0:(_definition$layout6=definition.layout)===null||_definition$layout6===void 0?void 0:_definition$layout6.marginBottom,marginLeft:definition===null||definition===void 0?void 0:(_definition$layout7=definition.layout)===null||_definition$layout7===void 0?void 0:_definition$layout7.marginLeft,marginRight:definition===null||definition===void 0?void 0:(_definition$layout8=definition.layout)===null||_definition$layout8===void 0?void 0:_definition$layout8.marginRight},"data-widget-name":definition.widgetConfigDefinitionCode},isPreview&&_extends({},handlers)),isPreview&&(definition===null||definition===void 0?void 0:definition.meta)&&React.createElement("div",{className:classes.widgetInfo},((_definition$meta=definition.meta)===null||_definition$meta===void 0?void 0:(_definition$meta$sche=_definition$meta.scheduled)===null||_definition$meta$sche===void 0?void 0:_definition$meta$sche.isScheduled)&&React.createElement(Tooltip,{text:(_definition$meta2=definition.meta)===null||_definition$meta2===void 0?void 0:(_definition$meta2$sch=_definition$meta2.scheduled)===null||_definition$meta2$sch===void 0?void 0:_definition$meta2$sch.tooltip},React.createElement(TimeIcon,{className:cx(classes.scheduledIcon,_defineProperty({},classes.scheduledIconExpired,(_definition$meta3=definition.meta)===null||_definition$meta3===void 0?void 0:(_definition$meta3$sch=_definition$meta3.scheduled)===null||_definition$meta3$sch===void 0?void 0:_definition$meta3$sch.isExpired))})),((_definition$meta4=definition.meta)===null||_definition$meta4===void 0?void 0:(_definition$meta4$hid=_definition$meta4.hidden)===null||_definition$meta4$hid===void 0?void 0:_definition$meta4$hid.isHidden)&&React.createElement(Tooltip,{text:(_definition$meta5=definition.meta)===null||_definition$meta5===void 0?void 0:(_definition$meta5$hid=_definition$meta5.hidden)===null||_definition$meta5$hid===void 0?void 0:_definition$meta5$hid.tooltip},React.createElement(VisibilityOffIcon,{className:classes.visibilityIcon}))),React.createElement(WidgetProvider,{definition:definition,isPreview:isPreview},React.createElement(Suspense,{fallback:React.createElement(Loading,null)},React.createElement(Component,isCustomLegacyWidget?{settings:definition.widgetConfig}:{}))));};Widget.defaultProps={isCustomLegacyWidget:false};export default Widget;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo,useRef}from'react';import PropTypes from'prop-types';import{makeStyles}from'@shopgate/engage/styles';import{useRoute,useThemeWidgets}from'@shopgate/engage/core/hooks';import{PAGE_PREVIEW_PATTERN}from'@shopgate/engage/page/constants';import{ConditionalWrapper}from'@shopgate/engage/components';import WidgetsPreviewProvider from"./WidgetsPreviewProvider";import Widget from"./Widget";import Overlay from"./Overlay";import{usePreviewIframeCommunication}from"./hooks";/**
|
|
1
|
+
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo,useRef}from'react';import PropTypes from'prop-types';import{makeStyles}from'@shopgate/engage/styles';import{useRoute,useThemeWidgets}from'@shopgate/engage/core/hooks';import{PAGE_PREVIEW_PATTERN}from'@shopgate/engage/page/constants';import{ConditionalWrapper}from'@shopgate/engage/components';import WidgetsPreviewProvider from"./WidgetsPreviewProvider";import Widget from"./Widget";import Overlay from"./Overlay";import{checkScheduled}from"./helpers";import{usePreviewIframeCommunication}from"./hooks";/**
|
|
2
2
|
* @typedef {import('./types').WidgetDefinition} WidgetDefinition
|
|
3
3
|
*/var PLACEHOLDER_COMPONENT='@shopgate/widgetsInternal/Placeholder';var useStyles=makeStyles()({preview:{'& *':{scrollbarWidth:'thin'}}});/**
|
|
4
4
|
* The Widgets component renders a list of widgets.
|
|
@@ -8,4 +8,4 @@ function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj
|
|
|
8
8
|
*/var Widgets=function Widgets(_ref){var _ref$widgets=_ref.widgets,widgetsProp=_ref$widgets===void 0?[]:_ref$widgets;var _useStyles=useStyles(),classes=_useStyles.classes,cx=_useStyles.cx;var _useRoute=useRoute(),pattern=_useRoute.pattern;var widgetsRef=useRef(null);var isPreview=pattern===PAGE_PREVIEW_PATTERN;var widgetComponents=useThemeWidgets('v2');usePreviewIframeCommunication(isPreview);// Create sanitized widgets array that only includes widgets with valid components.
|
|
9
9
|
var widgets=useMemo(function(){if(isPreview){// All widgets are allowed in preview mode.
|
|
10
10
|
return widgetsProp;}// Remove widgets that do not have a valid component.
|
|
11
|
-
return widgetsProp.filter(function(widget){return!!widgetComponents[widget.widgetConfigDefinitionCode];});},[isPreview,widgetComponents,widgetsProp]);if(!Array.isArray(widgets)||widgets.length===0){return null;}return React.createElement(ConditionalWrapper,{condition:isPreview,wrapper:function wrapper(children){return React.createElement(WidgetsPreviewProvider,null,children,React.createElement(Overlay,{containerRef:widgetsRef}));}},React.createElement("div",{className:cx('engage__widgets',_defineProperty({},classes.preview,isPreview)),ref:widgetsRef},widgets.map(function(widget){var component=widgetComponents[widget.widgetConfigDefinitionCode]||widgetComponents[PLACEHOLDER_COMPONENT];return React.createElement(Widget,{key:widget.code,definition:widget,isPreview:isPreview,component:component});})));};Widgets.defaultProps={widgets:null};export default Widgets;
|
|
11
|
+
return widgetsProp.filter(function(widget){return!!widgetComponents[widget.widgetConfigDefinitionCode]&&checkScheduled({from:widget===null||widget===void 0?void 0:widget.visibility.scheduleStartDate,to:widget===null||widget===void 0?void 0:widget.visibility.scheduleEndDate}).isActive;});},[isPreview,widgetComponents,widgetsProp]);if(!Array.isArray(widgets)||widgets.length===0){return null;}return React.createElement(ConditionalWrapper,{condition:isPreview,wrapper:function wrapper(children){return React.createElement(WidgetsPreviewProvider,null,children,React.createElement(Overlay,{containerRef:widgetsRef}));}},React.createElement("div",{className:cx('engage__widgets',_defineProperty({},classes.preview,isPreview)),ref:widgetsRef},widgets.map(function(widget){var component=widgetComponents[widget.widgetConfigDefinitionCode]||widgetComponents[PLACEHOLDER_COMPONENT];return React.createElement(Widget,{key:widget.code,definition:widget,isPreview:isPreview,component:component,isCustomLegacyWidget:widget.isCustomLegacyWidget});})));};Widgets.defaultProps={widgets:null};export default Widgets;
|
|
@@ -4,19 +4,19 @@ import{PAGE_PREVIEW_PATTERN}from'@shopgate/engage/page/constants';/**
|
|
|
4
4
|
* @returns {HTMLElement|null}
|
|
5
5
|
*/export var getScrollContainer=function getScrollContainer(){return document.querySelector(".route__".concat(PAGE_PREVIEW_PATTERN.replace(/^\/+/,'')));};/**
|
|
6
6
|
* @typedef {Object} ScheduledParams
|
|
7
|
-
* @
|
|
8
|
-
* @
|
|
9
|
-
* @
|
|
7
|
+
* @property {string} [from] The start date of the scheduling in ISO format.
|
|
8
|
+
* @property {string} [to] The end date of the scheduling in ISO format.
|
|
9
|
+
* @property {number} [timezoneOffset] The timezone offset in minutes. If not provided, the local
|
|
10
10
|
* timezone offset will be used.
|
|
11
11
|
*/ /**
|
|
12
12
|
* @typedef {Object} ScheduledStatus
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
13
|
+
* @property {boolean} isScheduled Indicates if the widget is scheduled.
|
|
14
|
+
* @property {boolean} isActive Indicates if the widget is currently active within the
|
|
15
15
|
* scheduled time frame.
|
|
16
|
-
* @
|
|
16
|
+
* @property {boolean} isExpired Indicates if the scheduled time frame has expired.
|
|
17
17
|
*/ /**
|
|
18
18
|
* Retrieves the scheduling status of a widget based on the provided parameters.
|
|
19
|
-
* @param {ScheduledParams} params The parameters for the function.
|
|
19
|
+
* @param {ScheduledParams} [params] The parameters for the function.
|
|
20
20
|
* @returns {ScheduledStatus} An object containing the scheduling status.
|
|
21
21
|
*/export function checkScheduled(){var _ref=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},from=_ref.from,to=_ref.to,timezoneOffset=_ref.timezoneOffset;var now=new Date();// Convert current time to provided or local timezone
|
|
22
22
|
var localOffset=timezoneOffset!==null&&timezoneOffset!==void 0?timezoneOffset:-now.getTimezoneOffset();// in minutes
|
|
@@ -54,6 +54,11 @@ export interface WidgetDefinition {
|
|
|
54
54
|
* Individual configuration for the widget.
|
|
55
55
|
*/
|
|
56
56
|
widgetConfig: Record<string, any>;
|
|
57
|
+
/**
|
|
58
|
+
* Whether the widget is a legacy custom widget provided by an extension that's configured
|
|
59
|
+
* via an HTML comment inside a HTML widget.
|
|
60
|
+
*/
|
|
61
|
+
isCustomLegacyWidget?: boolean;
|
|
57
62
|
/**
|
|
58
63
|
* Visibility settings for the widget.
|
|
59
64
|
*/
|
package/page/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{default as NotFound}from"./NotFound";export{default as Widgets}from"./Widgets";
|
|
1
|
+
export{default as NotFound}from"./NotFound";export{default as Widgets}from"./Widgets";export{default as ResponsiveWidgetImage}from"./ResponsiveWidgetImage";export{default as WidgetRichText}from"./WidgetRichText";
|
package/page/helpers/index.d.ts
CHANGED
|
@@ -45,3 +45,11 @@ export type GetProductSearchParamsFromProductsInputConfigReturnValue = {
|
|
|
45
45
|
export declare function getProductSearchParamsFromProductsInputConfig(
|
|
46
46
|
products: ProductsWidgetInputConfig
|
|
47
47
|
): GetProductSearchParamsFromProductsInputConfigReturnValue;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Helper to parse the image URL to return a high resolution version if required.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseImageUrl(
|
|
53
|
+
url: string,
|
|
54
|
+
useHighRes?: boolean
|
|
55
|
+
): string;
|
package/page/helpers/index.js
CHANGED
|
@@ -9,4 +9,9 @@
|
|
|
9
9
|
* @param {ProductsWidgetInputConfig} products Config object of the "Products" input.
|
|
10
10
|
* @returns {GetProductSearchParamsFromProductsInputConfigReturnValue}
|
|
11
11
|
*/export var getProductSearchParamsFromProductsInputConfig=function getProductSearchParamsFromProductsInputConfig(){var products=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var _ref=products||{},productSelectorType=_ref.productSelectorType,productsBrand=_ref.productsBrand,productsCategory=_ref.productsCategory,productsItemNumbers=_ref.productsItemNumbers,productsManualItemNumbers=_ref.productsManualItemNumbers,productsSelectorItemNumbers=_ref.productsSelectorItemNumbers,productsSearchTerm=_ref.productsSearchTerm;var productsSearchType=productSelectorType;/** @type {string|string[]} */var productsSearchValue='';switch(productSelectorType){case'brand':productsSearchValue=productsBrand;break;case'category':productsSearchValue=productsCategory;break;// Kept for backward compatibility - was replaces by 'manualItemNumbers' and 'productSelector'
|
|
12
|
-
case'itemNumbers':productsSearchValue=productsItemNumbers.split(',').map(function(item){return item.trim();});break;case'manualItemNumbers':productsSearchValue=productsManualItemNumbers;break;case'productSelector':productsSearchValue=productsSelectorItemNumbers;break;case'searchTerm':default:productsSearchValue=productsSearchTerm;}if(['itemNumbers','manualItemNumbers','productSelector'].includes(productSelectorType)){productsSearchType='productIds';}return{productsSearchType:productsSearchType,productsSearchValue:productsSearchValue};}
|
|
12
|
+
case'itemNumbers':productsSearchValue=productsItemNumbers.split(',').map(function(item){return item.trim();});break;case'manualItemNumbers':productsSearchValue=productsManualItemNumbers;break;case'productSelector':productsSearchValue=productsSelectorItemNumbers;break;case'searchTerm':default:productsSearchValue=productsSearchTerm;}if(['itemNumbers','manualItemNumbers','productSelector'].includes(productSelectorType)){productsSearchType='productIds';}return{productsSearchType:productsSearchType,productsSearchValue:productsSearchValue};};/**
|
|
13
|
+
* Parses the image URL to return a high resolution version if required.
|
|
14
|
+
* @param {string} url The original image URL.
|
|
15
|
+
* @param {boolean} useHighRes Whether to return a high resolution version.
|
|
16
|
+
* @returns {string} The parsed image URL.
|
|
17
|
+
*/export var parseImageUrl=function parseImageUrl(url,useHighRes){if(!url||!useHighRes){return url;}var match=url.match(/^(.*)\.([^./]+)$/);return!match?url:"".concat(match[1],"@2x.").concat(match[2]);};
|
package/page/hooks/index.js
CHANGED
|
@@ -11,15 +11,27 @@ import _regeneratorRuntime from"@babel/runtime/regenerator";function asyncGenera
|
|
|
11
11
|
* Retrieves the products for the current widget.
|
|
12
12
|
* @param {UseWidgetProductsOptions} options Hook options
|
|
13
13
|
* @returns {UseWidgetProductsResult} The products and a function to fetch more products.
|
|
14
|
-
*/export var useWidgetProducts=function useWidgetProducts(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var type=options.type,value=options.value,_options$limit=options.limit,limit=_options$limit===void 0?ITEMS_PER_LOAD:_options$limit,_options$sort=options.sort,sort=_options$sort===void 0?'relevance':_options$sort;var dispatch=useDispatch();var _useWidget=useWidget(),_useWidget$code=_useWidget.code,code=_useWidget$code===void 0?"".concat(type,"_").concat(value,"_").concat(limit,"_").concat(sort):_useWidget$code;// ###### Products selection ######
|
|
14
|
+
*/export var useWidgetProducts=function useWidgetProducts(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var type=options.type,value=options.value,_options$limit=options.limit,limit=_options$limit===void 0?ITEMS_PER_LOAD:_options$limit,_options$sort=options.sort,sort=_options$sort===void 0?'relevance':_options$sort;var dispatch=useDispatch();var _useWidget=useWidget(),_useWidget$code=_useWidget.code,code=_useWidget$code===void 0?"".concat(type,"_").concat(value,"_").concat(limit,"_").concat(sort):_useWidget$code,isPreview=_useWidget.isPreview;// ###### Products selection ######
|
|
15
15
|
var showInventoryInProductLists=useSelector(showInventoryInLists);var selectorOptions=useMemo(function(){return _extends({sort:transformDisplayOptions(sort),value:value,useDefaultRequestForProductIds:true},showInventoryInProductLists&&{useDefaultRequestForProductIds:true});},[showInventoryInProductLists,sort,value]);var getWidgetProducts=useMemo(function(){return makeGetWidgetProducts(type,selectorOptions,code);},[code,selectorOptions,type]);var widgetProducts=useSelector(getWidgetProducts);// ###### Products request ######
|
|
16
|
-
|
|
16
|
+
// Outside the preview mode the offset and hasNext state are initialized based on previously
|
|
17
|
+
// fetched product data. That ensures that users see the same product list when they leave
|
|
18
|
+
// the page and come back later.
|
|
19
|
+
var _useState=useState(isPreview?0:widgetProducts.products.length),_useState2=_slicedToArray(_useState,2),offset=_useState2[0],setOffset=_useState2[1];var _useState3=useState(isPreview?true:widgetProducts.totalProductCount>widgetProducts.products.length),_useState4=_slicedToArray(_useState3,2),hasNext=_useState4[0],setHasNext=_useState4[1];var isFetching=widgetProducts.isFetching;var baseRequestOptions=useMemo(function(){return _extends({limit:limit,sort:transformDisplayOptions(sort),useDefaultRequestForProductIds:true},showInventoryInProductLists&&{useDefaultRequestForProductIds:true});},[limit,showInventoryInProductLists,sort]);/**
|
|
17
20
|
* Callback to dispatch the initial fetch request for products when the hook mounts,
|
|
18
21
|
* or when its parameters change.
|
|
19
|
-
*/var fetchInitial=useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(){var initialOptions,result;return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(value){_context.next=3;break;}setHasNext(false);return _context.abrupt("return");case 3:// Initial request needs to start at offset 0
|
|
22
|
+
*/var fetchInitial=useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(){var _result$totalProductC;var initialOptions,result;return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(value){_context.next=3;break;}setHasNext(false);return _context.abrupt("return");case 3:// Initial request needs to start at offset 0
|
|
20
23
|
initialOptions=_extends({},baseRequestOptions,{offset:0});_context.next=6;return dispatch(fetchProductsByQuery(REQUEST_TYPE_MAPPING[type],value,initialOptions,code));case 6:result=_context.sent;// Re-initialize offset and hasNext based on the result
|
|
21
|
-
setOffset(limit)
|
|
22
|
-
|
|
24
|
+
setOffset(limit);// When the result comes from a real pipeline request there will be "totalProductCount".
|
|
25
|
+
// When the result are cached products, it can also be "totalResultCount".
|
|
26
|
+
setHasNext(((_result$totalProductC=result.totalProductCount)!==null&&_result$totalProductC!==void 0?_result$totalProductC:result.totalResultCount)>limit);case 9:case"end":return _context.stop();}},_callee);})),[code,dispatch,type,value,limit,baseRequestOptions]);// Effect to trigger the initial fetch when the component mounts or the parameters change.
|
|
27
|
+
useEffect(function(){if(!isPreview&&offset===0||isPreview){fetchInitial();}// This effect should only run at first render or when the fetchInitial callback updates.
|
|
28
|
+
// fetchInitial will never be updated on a real "page" at runtime since its dependencies
|
|
29
|
+
// are static.
|
|
30
|
+
// In preview mode updates of fetchInitial are an essential part of the preview system.
|
|
31
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
32
|
+
},[fetchInitial]);/**
|
|
23
33
|
* Callback to fetch the next chunk of products when e.g. users interacted with a "Load More"
|
|
24
34
|
* button.
|
|
25
|
-
*/var fetchNext=useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(){var nextOptions,result;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:if(!(!hasNext||isFetching||!value)){_context2.next=2;break;}return _context2.abrupt("return");case 2:nextOptions=_extends({},baseRequestOptions,{offset:offset});_context2.next=5;return dispatch(fetchProductsByQuery(REQUEST_TYPE_MAPPING[type],value,nextOptions,code));case 5:result=_context2.sent;setOffset(offset+limit)
|
|
35
|
+
*/var fetchNext=useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(){var _result$totalProductC2;var nextOptions,result;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:if(!(!hasNext||isFetching||!value)){_context2.next=2;break;}return _context2.abrupt("return");case 2:nextOptions=_extends({},baseRequestOptions,{offset:offset});_context2.next=5;return dispatch(fetchProductsByQuery(REQUEST_TYPE_MAPPING[type],value,nextOptions,code));case 5:result=_context2.sent;setOffset(offset+limit);// When the result comes from a real pipeline request there will be "totalProductCount".
|
|
36
|
+
// When the result are cached products, it can also be "totalResultCount".
|
|
37
|
+
setHasNext(((_result$totalProductC2=result.totalProductCount)!==null&&_result$totalProductC2!==void 0?_result$totalProductC2:result.totalResultCount)>offset+limit);case 8:case"end":return _context2.stop();}},_callee2);})),[code,dispatch,hasNext,isFetching,value,offset,limit,baseRequestOptions,type]);return{fetchNext:fetchNext,hasNext:hasNext,isFetching:isFetching,results:widgetProducts.products.slice(0,offset),totalResultCount:widgetProducts.totalProductCount};};
|
package/page/reducers/index.js
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
import{produce}from'immer';import{REQUEST_PAGE_CONFIG_V2,RECEIVE_PAGE_CONFIG_V2,ERROR_PAGE_CONFIG_V2,PAGE_STATE_LIFETIME}from"../constants";var
|
|
1
|
+
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{produce}from'immer';import{APP_WILL_START}from'@shopgate/engage/core/constants';import{REQUEST_PAGE_CONFIG_V2,RECEIVE_PAGE_CONFIG_V2,ERROR_PAGE_CONFIG_V2,PAGE_STATE_LIFETIME}from"../constants";var customWidgetRegex=/<!\x2D\x2DWidget((?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)\x2D\x2D>/gm;/**
|
|
2
|
+
* Decodes entities from a HTML string
|
|
3
|
+
* @param {string} html HTML string to decode
|
|
4
|
+
* @returns {string}
|
|
5
|
+
*/var decodeHTMLEntities=function decodeHTMLEntities(){var html=arguments.length>0&&arguments[0]!==undefined?arguments[0]:'';var textarea=document.createElement('textarea');textarea.innerHTML=html;return textarea.value;};/**
|
|
6
|
+
* @param {Object} data The page data object
|
|
7
|
+
* @returns {Object} The sanitized page data
|
|
8
|
+
*/var transformCustomLegacyWidgets=function transformCustomLegacyWidgets(data){var _data$dropzones;if(!Array.isArray(data===null||data===void 0?void 0:(_data$dropzones=data.dropzones)===null||_data$dropzones===void 0?void 0:_data$dropzones.cmsWidgetList)){return data;}var cmsWidgetList=data.dropzones.cmsWidgetList;var transformedWidgets=cmsWidgetList.map(function(widget){var _widget$widgetConfig;if(widget.widgetConfigDefinitionCode!=='@shopgate/widgets/htmlWidget'||!(widget===null||widget===void 0?void 0:(_widget$widgetConfig=widget.widgetConfig)===null||_widget$widgetConfig===void 0?void 0:_widget$widgetConfig.html)){return widget;}var content=decodeHTMLEntities(widget.widgetConfig.html.trim());if(content.startsWith('<!--Widget')){try{var settings=customWidgetRegex.exec(content);customWidgetRegex.lastIndex=0;if(settings[0]===content){var customLegacyWidget=JSON.parse(settings[1]);// Convert legacy widget data to the new format
|
|
9
|
+
return _extends({},widget,{widgetConfig:customLegacyWidget.settings||{},widgetConfigDefinitionCode:customLegacyWidget.type||'',isCustomLegacyWidget:true});}}catch(err){// Nothing to do here
|
|
10
|
+
}}return widget;});return _extends({},data,{dropzones:_extends({},data.dropzones,{cmsWidgetList:transformedWidgets})});};var defaultState={};/**
|
|
2
11
|
* Stores state of the v2 implementation of pages.
|
|
3
12
|
* @param {Object} [state={}] The current state.
|
|
4
13
|
* @param {Object} action The action object.
|
|
5
14
|
* @returns {Object} The new state.
|
|
6
|
-
*/export function pageV2(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:defaultState;var action=arguments.length>1?arguments[1]:undefined;/* eslint-disable no-param-reassign */var producer=produce(function(draft){switch(action.type){case REQUEST_PAGE_CONFIG_V2:{var pageType=action.pageType,pageSlug=action.pageSlug;draft[pageType]=draft[pageType]||{};draft[pageType][pageSlug]={data:null,isFetching:true,expires:0};break;}case RECEIVE_PAGE_CONFIG_V2:{var _pageType=action.pageType,_pageSlug=action.pageSlug,data=action.data;draft[_pageType]=draft[_pageType]||{};draft[_pageType][_pageSlug]={data:data,isFetching:false,expires:Date.now()+PAGE_STATE_LIFETIME};break;}case ERROR_PAGE_CONFIG_V2:{var _pageType2=action.pageType,_pageSlug2=action.pageSlug;draft[_pageType2]=draft[_pageType2]||{};draft[_pageType2][_pageSlug2]={data:null,isFetching:false};break;}default:break;}});/* eslint-enable no-param-reassign */return producer(state);}
|
|
15
|
+
*/export function pageV2(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:defaultState;var action=arguments.length>1?arguments[1]:undefined;/* eslint-disable no-param-reassign */var producer=produce(function(draft){switch(action.type){case REQUEST_PAGE_CONFIG_V2:{var pageType=action.pageType,pageSlug=action.pageSlug;draft[pageType]=draft[pageType]||{};draft[pageType][pageSlug]={data:null,isFetching:true,expires:0};break;}case RECEIVE_PAGE_CONFIG_V2:{var _pageType=action.pageType,_pageSlug=action.pageSlug,data=action.data;draft[_pageType]=draft[_pageType]||{};draft[_pageType][_pageSlug]={data:transformCustomLegacyWidgets(data),isFetching:false,expires:Date.now()+PAGE_STATE_LIFETIME};break;}case ERROR_PAGE_CONFIG_V2:{var _pageType2=action.pageType,_pageSlug2=action.pageSlug;draft[_pageType2]=draft[_pageType2]||{};draft[_pageType2][_pageSlug2]={data:null,isFetching:false};break;}case APP_WILL_START:{Object.keys(draft).forEach(function(pageType){Object.keys(draft[pageType]).forEach(function(pageCode){draft[pageType][pageCode].expires=0;});});break;}default:break;}});/* eslint-enable no-param-reassign */return producer(state);}
|
package/page/selectors/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
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{makeGetMenu,makeGetIsFetchingMenu}from'@shopgate/engage/core/selectors';import{getFulfillmentParams,getPopulatedProductsResult,SHOPGATE_CATALOG_GET_HIGHLIGHT_PRODUCTS}from'@shopgate/engage/product';import{getProductState}from'@shopgate/engage/product/selectors/product';import{LEGAL_MENU,SORT_PRICE_ASC,SORT_PRICE_DESC}from'@shopgate/engage/core/constants';import{hasNewServices,transformDisplayOptions,generateResultHash}from'@shopgate/engage/core/helpers';import{PRIVACY_PATH}from"../constants";export*from'@shopgate/pwa-common/selectors/page';/**
|
|
1
|
+
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{makeGetMenu,makeGetIsFetchingMenu,getEnableCms2ForAllShoppers}from'@shopgate/engage/core/selectors';import{getFulfillmentParams,getPopulatedProductsResult,SHOPGATE_CATALOG_GET_HIGHLIGHT_PRODUCTS}from'@shopgate/engage/product';import{getProductState}from'@shopgate/engage/product/selectors/product';import{LEGAL_MENU,SORT_PRICE_ASC,SORT_PRICE_DESC}from'@shopgate/engage/core/constants';import{hasNewServices,transformDisplayOptions,generateResultHash}from'@shopgate/engage/core/helpers';import{getIsCMS2PreviewEnabled}from'@shopgate/engage/development/selectors';import{makeGetPageConfigById}from'@shopgate/pwa-common/selectors/page';import{PRIVACY_PATH}from"../constants";export*from'@shopgate/pwa-common/selectors/page';/**
|
|
2
2
|
* Creates a selector that retrieves the privacy policy link.
|
|
3
3
|
*
|
|
4
4
|
* When the new services are active, the link is extracted from the "shopgate.cms.getMenu" response.
|
|
@@ -29,6 +29,14 @@ function _extends(){_extends=Object.assign||function(target){for(var i=1;i<argum
|
|
|
29
29
|
* @param {string|null} [params.slug=null] The slug of the page (optional).
|
|
30
30
|
* @returns {Function} A selector function that retrieves the widget list.
|
|
31
31
|
*/export var makeGetWidgetsFromPage=function makeGetWidgetsFromPage(_ref2){var _ref2$type=_ref2.type,type=_ref2$type===void 0?'cms':_ref2$type,_ref2$slug=_ref2.slug,slug=_ref2$slug===void 0?null:_ref2$slug,_ref2$dropzone=_ref2.dropzone,dropzone=_ref2$dropzone===void 0?'cmsWidgetList':_ref2$dropzone;var getPage=makeGetPage({type:type,slug:slug});return createSelector(getPage,function(page){var _ref3,_page$data,_page$data$dropzones;if(!page){return undefined;}return(_ref3=(_page$data=page.data)===null||_page$data===void 0?void 0:(_page$data$dropzones=_page$data.dropzones)===null||_page$data$dropzones===void 0?void 0:_page$data$dropzones[dropzone])!==null&&_ref3!==void 0?_ref3:[];});};/**
|
|
32
|
+
* Determines whether the new CMS version 2 is enabled.
|
|
33
|
+
*/export var getIsCms2Enabled=createSelector(getEnableCms2ForAllShoppers,getIsCMS2PreviewEnabled,function(shopSettingEnabled,previewEnabled){return shopSettingEnabled||previewEnabled;});/**
|
|
34
|
+
* Creates a selector that retrieves unified CMS page data. Depending on the CMS version,
|
|
35
|
+
* the data is retrieved from different sources, but returned in a consistent format.
|
|
36
|
+
* @param {Object} params The selector parameters.
|
|
37
|
+
* @param {string} params.slug The slug of the page.
|
|
38
|
+
* @returns {Function} A selector function that retrieves the unified CMS page data.
|
|
39
|
+
*/export var makeGetUnifiedCMSPageData=function makeGetUnifiedCMSPageData(_ref4){var slug=_ref4.slug;var getPageV2=makeGetPage({type:'cms',slug:slug});var getPageV1=makeGetPageConfigById({pageId:slug});return createSelector(getIsCms2Enabled,getPageV1,getPageV2,function(isCms2Enabled,pageV1,pageV2){var _ref8,_ref9;if(isCms2Enabled){var _ref5,_ref6,_pageV2$data,_pageV2$data2,_ref7,_pageV2$data3,_pageV2$data3$dropzon;if(!pageV2)return undefined;return{isFetching:(_ref5=pageV2===null||pageV2===void 0?void 0:pageV2.isFetching)!==null&&_ref5!==void 0?_ref5:false,expires:(_ref6=pageV2===null||pageV2===void 0?void 0:pageV2.expires)!==null&&_ref6!==void 0?_ref6:null,title:(pageV2===null||pageV2===void 0?void 0:(_pageV2$data=pageV2.data)===null||_pageV2$data===void 0?void 0:_pageV2$data.pageTitle)||(pageV2===null||pageV2===void 0?void 0:(_pageV2$data2=pageV2.data)===null||_pageV2$data2===void 0?void 0:_pageV2$data2.name)||'',widgets:(_ref7=pageV2===null||pageV2===void 0?void 0:(_pageV2$data3=pageV2.data)===null||_pageV2$data3===void 0?void 0:(_pageV2$data3$dropzon=_pageV2$data3.dropzones)===null||_pageV2$data3$dropzon===void 0?void 0:_pageV2$data3$dropzon['cmsWidgetList'])!==null&&_ref7!==void 0?_ref7:[],cmsVersion:2};}if(!pageV1)return undefined;return{isFetching:(_ref8=pageV1===null||pageV1===void 0?void 0:pageV1.isFetching)!==null&&_ref8!==void 0?_ref8:false,expires:(_ref9=pageV1===null||pageV1===void 0?void 0:pageV1.expires)!==null&&_ref9!==void 0?_ref9:null,title:(pageV1===null||pageV1===void 0?void 0:pageV1.title)||'',widgets:(pageV1===null||pageV1===void 0?void 0:pageV1.widgets)||[],cmsVersion:1};});};/**
|
|
32
40
|
* Creates a selector that generates a hash to select results for widget products.
|
|
33
41
|
* @param {'searchTerm' | 'productIds' | 'brand' | 'category' |'highlights'} type Type of the
|
|
34
42
|
* request to make.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from'react';import{CategoryList}from'@shopgate/engage/category/components';import{useCategoryListWidget}from"./hooks";/**
|
|
1
|
+
import React from'react';import{CategoryList}from'@shopgate/engage/category/components';import{makeStyles}from'@shopgate/engage/styles';import{useCategoryListWidget}from"./hooks";import WidgetHeadline from"../../components/WidgetHeadline";var useStyles=makeStyles()(function(theme){return{headline:{paddingBottom:theme.spacing(0)}};});/**
|
|
2
2
|
* The CategoryListWidget is used to display category lists.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var CategoryListWidget=function CategoryListWidget(){var _useCategoryListWidge=useCategoryListWidget(),parentCategory=_useCategoryListWidge.parentCategory,categories=_useCategoryListWidge.categories,showImages=_useCategoryListWidge.showImages;if(!categories){return null;}return React.createElement(CategoryList,{categories:categories,parentCategory:parentCategory,showLeftSideImages:showImages});};export default CategoryListWidget;
|
|
4
|
+
*/var CategoryListWidget=function CategoryListWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useCategoryListWidge=useCategoryListWidget(),parentCategory=_useCategoryListWidge.parentCategory,categories=_useCategoryListWidge.categories,showImages=_useCategoryListWidge.showImages,showHeadline=_useCategoryListWidge.showHeadline,headline=_useCategoryListWidge.headline;if(!categories){return null;}return React.createElement(React.Fragment,null,showHeadline&&headline&&categories.length?React.createElement(WidgetHeadline,{headline:headline,className:classes.headline}):null,React.createElement(CategoryList,{categories:categories,parentCategory:parentCategory,showLeftSideImages:showImages}));};export default CategoryListWidget;
|
|
@@ -3,12 +3,14 @@ import _camelCase from"lodash/camelCase";import{useEffect,useMemo}from'react';im
|
|
|
3
3
|
* @property {string} category The parent category ID to display categories for.
|
|
4
4
|
* @property {string} [sort] The sort order for categories
|
|
5
5
|
* @property {boolean} [showImages] Whether to display images for categories.
|
|
6
|
+
* @property {boolean} [showHeadline] Whether to show the headline.
|
|
7
|
+
* @property {Object} [headline] The headline to be displayed.
|
|
6
8
|
*/ /**
|
|
7
9
|
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
8
10
|
* .useWidget<CategoryListWidgetConfig> >} UseWidgetReturnType
|
|
9
11
|
*/ // eslint-disable-next-line valid-jsdoc
|
|
10
12
|
/**
|
|
11
13
|
* Hook to access the Category List widget configuration and data.
|
|
12
|
-
*/export var useCategoryListWidget=function useCategoryListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var dispatch=useDispatch();var category=config.category,sort=config.sort,showImages=config.showImages;var sortCC=useMemo(function(){return _camelCase(sort);},[sort]);// Get the parent category object from the selected category
|
|
14
|
+
*/export var useCategoryListWidget=function useCategoryListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var dispatch=useDispatch();var category=config.category,sort=config.sort,showImages=config.showImages,_config$showHeadline=config.showHeadline,showHeadline=_config$showHeadline===void 0?false:_config$showHeadline,headline=config.headline;var sortCC=useMemo(function(){return _camelCase(sort);},[sort]);// Get the parent category object from the selected category
|
|
13
15
|
var parentCategory=useSelector(function(state){return category?getCategory(state,{categoryId:category}):null;});// Get category children of the selected category (pipeline handles sorting)
|
|
14
|
-
var categories=useSelector(function(state){return typeof category==='string'?getCategoriesById(state,{categoryId:category}):null;});var sortedCategories=useMemo(function(){if(!categories){return[];}if(sortCC==='relevance'){return categories;}var isAsc=sortCC==='nameAsc';return[].concat(categories).sort(function(a,b){return a.name.localeCompare(b.name,undefined,{sensitivity:'base'})*(isAsc?1:-1);});},[categories,sortCC]);useEffect(function(){dispatch(fetchCategoryOrRootCategories(category));},[category,dispatch]);return{parentCategory:parentCategory,showImages:showImages,categories:sortedCategories};};
|
|
16
|
+
var categories=useSelector(function(state){return typeof category==='string'?getCategoriesById(state,{categoryId:category}):null;});var sortedCategories=useMemo(function(){if(!categories){return[];}if(sortCC==='relevance'){return categories;}var isAsc=sortCC==='nameAsc';return[].concat(categories).sort(function(a,b){return a.name.localeCompare(b.name,undefined,{sensitivity:'base'})*(isAsc?1:-1);});},[categories,sortCC]);useEffect(function(){dispatch(fetchCategoryOrRootCategories(category));},[category,dispatch]);return{parentCategory:parentCategory,showImages:showImages,categories:sortedCategories,showHeadline:showHeadline,headline:headline};};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import React from'react';import WidgetHeadline from"../../components/WidgetHeadline";import{useWidget}from"../../hooks";/**
|
|
2
2
|
* The HeadlineWidget is used to display a headline text.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var Headline=function Headline(){var
|
|
5
|
-
,{className:cx(css({'&&':_extends({},styles)}),classes.root),variant:variant,align:align,gutterBottom:true},headline);};export default Headline;
|
|
4
|
+
*/var Headline=function Headline(){var _useWidget=useWidget(),config=_useWidget.config;var headline=config.headline;if(!headline)return null;return React.createElement(WidgetHeadline,{headline:headline});};export default Headline;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React from'react';import{ConditionalWrapper,Link}from'@shopgate/engage/components';import{WidgetRichText,ResponsiveWidgetImage}from'@shopgate/engage/page/components';import{makeStyles}from'@shopgate/engage/styles';import{useHeroBannerWidget}from"./hooks";var useStyles=makeStyles()(function(theme){return{link:{width:'100%'},content:_defineProperty({width:'100%',position:'relative',display:'flex',alignItems:'center',minHeight:300},theme.breakpoints.up('md'),{minHeight:400}),richText:{position:'relative',zIndex:2,padding:theme.spacing(2)},image:{position:'absolute',width:'100%',height:'100%',top:0,left:0,objectFit:'cover',zIndex:0,pointerEvents:'none'}};});/**
|
|
2
|
+
* @returns {JSX.Element}
|
|
3
|
+
*/var HeroBanner=function HeroBanner(){var _useHeroBannerWidget=useHeroBannerWidget(),text=_useHeroBannerWidget.text,backgroundImage=_useHeroBannerWidget.backgroundImage,link=_useHeroBannerWidget.link;var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;return React.createElement(ConditionalWrapper,{condition:!!link,wrapper:function wrapper(children){return React.createElement(Link,{href:link,className:cx(classes.link)},children);}},React.createElement("div",{className:cx(classes.content)},React.createElement(WidgetRichText,{content:text,className:cx(classes.richText)}),React.createElement(ResponsiveWidgetImage,{src:backgroundImage===null||backgroundImage===void 0?void 0:backgroundImage.url,alt:backgroundImage===null||backgroundImage===void 0?void 0:backgroundImage.alt,className:cx(classes.image)})));};export default HeroBanner;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import{useWidget}from'@shopgate/engage/page/hooks';/**
|
|
2
|
+
* @typedef {Object} HeroBanner
|
|
3
|
+
* @property {string} text Banner text content
|
|
4
|
+
* @property {Object} backgroundImage Banner background image
|
|
5
|
+
* @property {string} backgroundImage.url Banner background image URL
|
|
6
|
+
* @property {string} backgroundImage.alt Banner background image alt text
|
|
7
|
+
* @property {string} link Optional banner link
|
|
8
|
+
*/ /**
|
|
9
|
+
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
10
|
+
* .useWidget<HeroBanner> >} UseWidgetReturnType
|
|
11
|
+
*/ // eslint-disable-next-line valid-jsdoc
|
|
12
|
+
/**
|
|
13
|
+
* Hook to access the Image widget configuration and data.
|
|
14
|
+
*/export var useHeroBannerWidget=function useHeroBannerWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;return config;};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./HeroBanner";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Link,ConditionalWrapper}from'@shopgate/engage/components';import{ResponsiveWidgetImage}from'@shopgate/engage/page/components';import{useImageWidget}from"./hooks";var useStyles=makeStyles()(function(){return{link:{},image:{width:'100%'}};});/**
|
|
2
|
+
* The ImageWidget is used to display a image.
|
|
3
|
+
* @returns {JSX.Element}
|
|
4
|
+
*/var Image=function Image(){var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;var _useImageWidget=useImageWidget(),link=_useImageWidget.link,altText=_useImageWidget.altText,url=_useImageWidget.url;if(!url)return null;return React.createElement(ConditionalWrapper,{condition:!!link,wrapper:function wrapper(children){return React.createElement(Link,{href:link,className:cx(classes.link)},children);}},React.createElement(ResponsiveWidgetImage,{src:url,alt:altText,className:cx(classes.image)}));};export default Image;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import{useWidget}from'@shopgate/engage/page/hooks';import{useResponsiveValue}from'@shopgate/engage/styles';/**
|
|
2
|
+
* @typedef {Object} ImageWidgetConfig
|
|
3
|
+
* @property {Object} image The image object.
|
|
4
|
+
* @property {string} image.url The image URL.
|
|
5
|
+
* @property {string} [image.altText] The image alt text.
|
|
6
|
+
* @property {Object} imageWide The wide image object.
|
|
7
|
+
* @property {string} imageWide.url The wide image URL.
|
|
8
|
+
* @property {string} [imageWide.altText] The wide image alt text.
|
|
9
|
+
* @property {boolean} [useImageWide] Whether to use the wide image on
|
|
10
|
+
* medium and larger screens.
|
|
11
|
+
* @property {string} [link] The link URL.
|
|
12
|
+
*/ /**
|
|
13
|
+
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
14
|
+
* .useWidget<ImageWidgetConfig> >} UseWidgetReturnType
|
|
15
|
+
*/ // eslint-disable-next-line valid-jsdoc
|
|
16
|
+
/**
|
|
17
|
+
* Hook to access the Image widget configuration and data.
|
|
18
|
+
* Handles responsive image URLs and alt texts.
|
|
19
|
+
*/export var useImageWidget=function useImageWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var _ref=config||{},image=_ref.image,imageWide=_ref.imageWide,link=_ref.link,useImageWide=_ref.useImageWide;var resolved=useResponsiveValue({xs:{url:image===null||image===void 0?void 0:image.url,altText:image===null||image===void 0?void 0:image.altText},md:{url:useImageWide&&(imageWide===null||imageWide===void 0?void 0:imageWide.url)?imageWide.url:image===null||image===void 0?void 0:image.url,altText:useImageWide&&(imageWide===null||imageWide===void 0?void 0:imageWide.altText)?imageWide.altText:image===null||image===void 0?void 0:image.altText}});return{url:resolved.url,altText:resolved.altText,link:link};};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./Image";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Link,ConditionalWrapper,Grid}from'@shopgate/engage/components';import{useImageRowWidget}from"./hooks";import ResponsiveWidgetImage from"../../components/ResponsiveWidgetImage";var useStyles=makeStyles()(function(theme,_ref){var imageSpacing=_ref.imageSpacing;return{imageContainer:{width:'100%',display:'flex',overflowX:'hidden',alignItems:'flex-start',flexWrap:'wrap',gap:"".concat(imageSpacing,"px")},image:{maxWidth:'100%',height:'auto',flexShrink:1,display:'block',width:'100%',objectFit:'contain'},itemContainerDense:_defineProperty(_defineProperty({},theme.breakpoints.down('md'),{flex:"1 1 calc(33% - ".concat(imageSpacing,"px)")}),theme.breakpoints.up('md'),{flex:"1 1 calc(16% - ".concat(imageSpacing,"px)")}),itemContainerDefault:_defineProperty(_defineProperty({},theme.breakpoints.down('md'),{flex:"1 1 calc(50% - ".concat(imageSpacing,"px)")}),theme.breakpoints.up('md'),{flex:"1 1 calc(25% - ".concat(imageSpacing,"px)")}),itemContainerNoWrap:{flex:' 1 1 0%'}};});/**
|
|
2
|
+
* The ImageRowWidget is used to display images in one or more rows.
|
|
3
|
+
* @returns {JSX.Element}
|
|
4
|
+
*/var ImageRow=function ImageRow(){var _useImageRowWidget=useImageRowWidget(),images=_useImageRowWidget.images,imageWrapping=_useImageRowWidget.imageWrapping,imageSpacing=_useImageRowWidget.imageSpacing;var _useStyles=useStyles({imageSpacing:imageSpacing}),cx=_useStyles.cx,classes=_useStyles.classes;if(images.length===0)return null;return React.createElement(Grid,{className:cx(classes.imageContainer),component:"div"},images.map(function(img){return React.createElement(Grid.Item,{key:img.url,component:"div",className:cx(_defineProperty(_defineProperty(_defineProperty({},classes.itemContainerDefault,imageWrapping==='responsiveDefault'),classes.itemContainerDense,imageWrapping==='responsiveDense'),classes.itemContainerNoWrap,imageWrapping==='responsiveNoWrap'))},React.createElement(ConditionalWrapper,{condition:!!img.link,wrapper:function wrapper(children){return React.createElement(Link,{href:img.link,className:cx(classes.image)},children);}},React.createElement(ResponsiveWidgetImage,{src:img.url,alt:img.altText,className:cx(classes.image)})));}));};export default ImageRow;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import{useWidget}from'@shopgate/engage/page/hooks';import{useMemo}from'react';/**
|
|
2
|
+
* @typedef {Object} ImageRowWidgetConfig
|
|
3
|
+
* @property {Array} images The images array.
|
|
4
|
+
* @property {string} imageWrapping The imageWrapping setting,
|
|
5
|
+
* one of: responsiveDefault | responsiveDense | responsiveNoWrap.
|
|
6
|
+
* @property {string} [link] The optional link URL.
|
|
7
|
+
* @property {number} [imageSpacing] An optional gap between images (in pixels).
|
|
8
|
+
*/ /**
|
|
9
|
+
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
10
|
+
* .useWidget<ImageRowWidgetConfig> >} UseWidgetReturnType
|
|
11
|
+
*/ // eslint-disable-next-line valid-jsdoc
|
|
12
|
+
/**
|
|
13
|
+
* Hook to access the Image row widget configuration and data.
|
|
14
|
+
* Handles responsive image URLs and alt texts.
|
|
15
|
+
*/export var useImageRowWidget=function useImageRowWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var _ref=config||{},_ref$images=_ref.images,images=_ref$images===void 0?[]:_ref$images,imageWrapping=_ref.imageWrapping,_ref$imageSpacing=_ref.imageSpacing,imageSpacing=_ref$imageSpacing===void 0?0:_ref$imageSpacing;var mappedImages=useMemo(function(){return images.map(function(_ref2){var image=_ref2.image,link=_ref2.link;var _ref3=image||{},url=_ref3.url,altText=_ref3.altText;return{url:url,altText:altText,link:link};}).filter(function(img){return img.url;});},[images]);return{images:mappedImages,imageWrapping:imageWrapping,imageSpacing:imageSpacing};};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./ImageRow";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
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 React from'react';import{makeStyles}from'@shopgate/engage/styles';import{Swiper,Link,ConditionalWrapper}from'@shopgate/engage/components';import{ResponsiveWidgetImage}from'@shopgate/engage/page/components';import{useImageSliderWidget}from"./hooks";var useStyles=makeStyles()({image:{width:'100%'}});/**
|
|
2
|
+
* The ImageSliderWidget is used to display an image slider.
|
|
3
|
+
* @returns {JSX.Element}
|
|
4
|
+
*/var ImageSliderWidget=function ImageSliderWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useImageSliderWidget=useImageSliderWidget(),slides=_useImageSliderWidget.slides,swiperProps=_useImageSliderWidget.swiperProps;if(slides.length===0){return null;}return React.createElement(Swiper,_extends({indicators:true},swiperProps),slides.map(function(slide){if(!slide.image.url){return null;}return React.createElement(Swiper.Item,{key:slide.image.url},React.createElement(ConditionalWrapper,{condition:!!slide.link,wrapper:function wrapper(children){return React.createElement(Link,{href:slide.link},children);}},React.createElement(ResponsiveWidgetImage,{className:classes.image,src:slide.image.url,alt:slide.image.altText||''})));}));};export default ImageSliderWidget;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
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 _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{useMemo}from'react';import{useWidget}from'@shopgate/engage/page/hooks';import{useTheme}from'@shopgate/engage/styles';/**
|
|
2
|
+
* @typedef {import('swiper/react').SwiperProps} SwiperCmpProps
|
|
3
|
+
*/ /**
|
|
4
|
+
* @typedef {Object} ImageSliderImageData
|
|
5
|
+
* @property {string} url The image URL.
|
|
6
|
+
* @property {string} [altText] The image alt text.
|
|
7
|
+
*/ /**
|
|
8
|
+
* @typedef {Object} ImageSliderImage
|
|
9
|
+
* @property {ImageSliderImageData} image The image data object.
|
|
10
|
+
* @property {string} [link] The link URL.
|
|
11
|
+
*/ /**
|
|
12
|
+
* @typedef {Object} ImageWidgetConfig
|
|
13
|
+
* @property {ImageSliderImage[]} images The image objects.
|
|
14
|
+
* @property {boolean} slideAutomatic Whether the slider should automatically slide.
|
|
15
|
+
* @property {boolean} endlessSlider Whether the slider should loop endlessly.
|
|
16
|
+
* @property {number} sliderSpeed The speed (in ms) for the slider autoplay.
|
|
17
|
+
* @property {"default"|"dense"|"custom"} slidesPerView
|
|
18
|
+
* @property {number} slidesPerViewCustomSmall Slides per view for small screens.
|
|
19
|
+
* @property {number} slidesPerViewCustomMedium Slides per view for medium screens.
|
|
20
|
+
* @property {number} slidesPerViewCustomLarge Slides per view for large screens.
|
|
21
|
+
* @property {number} imageSpacing Optional gap between image slides (in pixels).
|
|
22
|
+
*/ /**
|
|
23
|
+
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
24
|
+
* .useWidget<ImageWidgetConfig> >} UseWidgetReturnType
|
|
25
|
+
*/ // eslint-disable-next-line valid-jsdoc
|
|
26
|
+
/**
|
|
27
|
+
* Hook to access the ImageSlider widget configuration and data.
|
|
28
|
+
*/export var useImageSliderWidget=function useImageSliderWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config,isPreview=_useWidget.isPreview;var theme=useTheme();var images=config.images,slideAutomatic=config.slideAutomatic,endlessSlider=config.endlessSlider,sliderSpeed=config.sliderSpeed,slidesPerView=config.slidesPerView,slidesPerViewCustomSmall=config.slidesPerViewCustomSmall,slidesPerViewCustomMedium=config.slidesPerViewCustomMedium,slidesPerViewCustomLarge=config.slidesPerViewCustomLarge,imageSpacing=config.imageSpacing;/**
|
|
29
|
+
* @type {SwiperCmpProps}
|
|
30
|
+
*/var swiperProps=useMemo(function(){var slidesPerViewSmall=1.0;var slidesPerViewMedium=1.3;var slidesPerViewLarge=1.6;if(slidesPerView==='dense'){slidesPerViewSmall=1.3;slidesPerViewMedium=1.8;slidesPerViewLarge=2.3;}else if(slidesPerView==='custom'){slidesPerViewSmall=slidesPerViewCustomSmall;slidesPerViewMedium=slidesPerViewCustomMedium;slidesPerViewLarge=slidesPerViewCustomLarge;}var breakpoints=_defineProperty(_defineProperty({},theme.breakpoints.values.sm,{slidesPerView:slidesPerViewMedium}),theme.breakpoints.values.md,{slidesPerView:slidesPerViewLarge});return _extends({autoplay:slideAutomatic?{delay:sliderSpeed}:false,loop:endlessSlider,slidesPerView:slidesPerViewSmall,breakpoints:breakpoints,spaceBetween:imageSpacing},isPreview?{// Improves interaction with the slider in the CMS preview iframe
|
|
31
|
+
touchStartPreventDefault:true,// Create a component key from breakpoint settings to force remount on breakpoint change.
|
|
32
|
+
// This fixes issues with the Swiper when breakpoint settings change during runtime.
|
|
33
|
+
key:JSON.stringify(_extends({slidesPerView:slidesPerView,spaceBetween:imageSpacing},breakpoints))}:{});},[isPreview,slidesPerView,slideAutomatic,sliderSpeed,endlessSlider,theme.breakpoints.values,slidesPerViewCustomMedium,slidesPerViewCustomLarge,slidesPerViewCustomSmall,imageSpacing]);return{slides:images.filter(function(img){var _img$image;return img===null||img===void 0?void 0:(_img$image=img.image)===null||_img$image===void 0?void 0:_img$image.url;}),swiperProps:swiperProps};};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./ImageSlider";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import React from'react';import{ActionButton,I18n}from'@shopgate/engage/components';import{ProductGrid}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{makeStyles}from'@shopgate/engage/styles';import{useProductListWidget}from"./hooks";var useStyles=makeStyles()({root:{// Prevent that the ActionButton margin messes with the layout of the sibling widgets
|
|
1
|
+
import React from'react';import{ActionButton,I18n}from'@shopgate/engage/components';import{ProductGrid}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{makeStyles}from'@shopgate/engage/styles';import{useProductListWidget}from"./hooks";import WidgetHeadline from"../../components/WidgetHeadline";var useStyles=makeStyles()({root:{// Prevent that the ActionButton margin messes with the layout of the sibling widgets
|
|
2
2
|
overflow:'hidden'},grid:{'&&':{marginTop:0}}});/**
|
|
3
3
|
* The ProductListWidget is used to display product lists.
|
|
4
4
|
* @returns {JSX.Element}
|
|
5
|
-
*/var ProductListWidget=function ProductListWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useProductListWidget=useProductListWidget(),productsSearchType=_useProductListWidget.productsSearchType,productsSearchValue=_useProductListWidget.productsSearchValue,sort=_useProductListWidget.sort,productCount=_useProductListWidget.productCount,showLoadMore=_useProductListWidget.showLoadMore,flags=_useProductListWidget.flags;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),fetchNext=_useWidgetProducts.fetchNext,hasNext=_useWidgetProducts.hasNext,isFetching=_useWidgetProducts.isFetching,results=_useWidgetProducts.results;return React.createElement("div",{className:classes.root},React.createElement(ProductGrid,{products:results,flags:flags,scope:"widgets",infiniteLoad:false,className:classes.grid}),hasNext&&showLoadMore&&React.createElement(ActionButton,{loading:isFetching,onClick:fetchNext},React.createElement(I18n.Text,{string:"common.load_more"})));};export default ProductListWidget;
|
|
5
|
+
*/var ProductListWidget=function ProductListWidget(){var _useStyles=useStyles(),classes=_useStyles.classes;var _useProductListWidget=useProductListWidget(),productsSearchType=_useProductListWidget.productsSearchType,productsSearchValue=_useProductListWidget.productsSearchValue,sort=_useProductListWidget.sort,productCount=_useProductListWidget.productCount,showLoadMore=_useProductListWidget.showLoadMore,flags=_useProductListWidget.flags,showHeadline=_useProductListWidget.showHeadline,headline=_useProductListWidget.headline;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),fetchNext=_useWidgetProducts.fetchNext,hasNext=_useWidgetProducts.hasNext,isFetching=_useWidgetProducts.isFetching,results=_useWidgetProducts.results;return React.createElement("div",{className:classes.root},showHeadline&&headline&&results.length?React.createElement(WidgetHeadline,{headline:headline}):null,React.createElement(ProductGrid,{products:results,flags:flags,scope:"widgets",infiniteLoad:false,className:classes.grid}),hasNext&&showLoadMore&&React.createElement(ActionButton,{loading:isFetching,onClick:fetchNext},React.createElement(I18n.Text,{string:"common.load_more"})));};export default ProductListWidget;
|
|
@@ -10,10 +10,12 @@ import _camelCase from"lodash/camelCase";function _extends(){_extends=Object.ass
|
|
|
10
10
|
* @property {boolean} showName Whether to display product names
|
|
11
11
|
* @property {boolean} showPrice Whether to display product prices
|
|
12
12
|
* @property {boolean} showRating Whether to display product ratings
|
|
13
|
+
* @property {boolean} [showHeadline] Whether to show the headline.
|
|
14
|
+
* @property {Object} [headline] The headline to be displayed.
|
|
13
15
|
*/ /**
|
|
14
16
|
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
15
17
|
* .useWidget<ProductListWidgetConfig> >} UseWidgetReturnType
|
|
16
18
|
*/ // eslint-disable-next-line valid-jsdoc
|
|
17
19
|
/**
|
|
18
20
|
* Hook to access the Product List widget configuration.
|
|
19
|
-
*/export var useProductListWidget=function useProductListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var products=config.products,productCount=config.productCount,sort=config.sort,_config$loadMoreButto=config.loadMoreButton,loadMoreButton=_config$loadMoreButto===void 0?false:_config$loadMoreButto,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var flags=useMemo(function(){return{name:showName,price:showPrice,reviews:showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,showLoadMore:loadMoreButton,flags:flags});};
|
|
21
|
+
*/export var useProductListWidget=function useProductListWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;var products=config.products,productCount=config.productCount,sort=config.sort,_config$loadMoreButto=config.loadMoreButton,loadMoreButton=_config$loadMoreButto===void 0?false:_config$loadMoreButto,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating,_config$showHeadline=config.showHeadline,showHeadline=_config$showHeadline===void 0?false:_config$showHeadline,headline=config.headline;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var flags=useMemo(function(){return{name:showName,price:showPrice,reviews:showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,showLoadMore:loadMoreButton,flags:flags,showHeadline:showHeadline,headline:headline});};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
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 _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo}from'react';import{ProductSlider}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{useTheme}from'@shopgate/engage/styles';import{useProductSliderWidget}from"./hooks";/**
|
|
1
|
+
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 _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo}from'react';import{ProductSlider}from'@shopgate/engage/product/components';import{useWidgetProducts}from'@shopgate/engage/page/hooks';import{useTheme}from'@shopgate/engage/styles';import{useProductSliderWidget}from"./hooks";import WidgetHeadline from"../../components/WidgetHeadline";/**
|
|
2
2
|
* The ProductSliderWidget is used to display a product slider.
|
|
3
3
|
* @returns {JSX.Element}
|
|
4
|
-
*/var ProductSliderWidget=function ProductSliderWidget(){var _useProductSliderWidg=useProductSliderWidget(),productsSearchType=_useProductSliderWidg.productsSearchType,productsSearchValue=_useProductSliderWidg.productsSearchValue,sort=_useProductSliderWidg.sort,productCount=_useProductSliderWidg.productCount,swiperProps=_useProductSliderWidg.swiperProps,productItemProps=_useProductSliderWidg.productItemProps,isPreview=_useProductSliderWidg.isPreview;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),results=_useWidgetProducts.results;var theme=useTheme();var productIds=useMemo(function(){return results===null||results===void 0?void 0:results.map(function(result){return result.id;});},[results]);if(!productIds||!productIds.length){return null;}return React.createElement(ProductSlider,_extends({productIds:productIds,scope:"widgets",productItemProps:productItemProps,slidesPerView:2.3// Improves interaction with the slider in the CMS preview iframe
|
|
5
|
-
},isPreview?{touchStartPreventDefault:true}:{},{breakpoints:_defineProperty(_defineProperty(_defineProperty({},theme.breakpoints.values.sm,{slidesPerView:3.3}),theme.breakpoints.values.md,{slidesPerView:4.3}),theme.breakpoints.values.lg,{slidesPerView:5.3})},swiperProps));};export default ProductSliderWidget;
|
|
4
|
+
*/var ProductSliderWidget=function ProductSliderWidget(){var _useProductSliderWidg=useProductSliderWidget(),productsSearchType=_useProductSliderWidg.productsSearchType,productsSearchValue=_useProductSliderWidg.productsSearchValue,sort=_useProductSliderWidg.sort,productCount=_useProductSliderWidg.productCount,swiperProps=_useProductSliderWidg.swiperProps,productItemProps=_useProductSliderWidg.productItemProps,isPreview=_useProductSliderWidg.isPreview,showHeadline=_useProductSliderWidg.showHeadline,headline=_useProductSliderWidg.headline;var _useWidgetProducts=useWidgetProducts({type:productsSearchType,value:productsSearchValue,limit:productCount,sort:sort}),results=_useWidgetProducts.results;var theme=useTheme();var productIds=useMemo(function(){return results===null||results===void 0?void 0:results.map(function(result){return result.id;});},[results]);if(!productIds||!productIds.length){return null;}return React.createElement(React.Fragment,null,showHeadline&&headline&&productIds.length?React.createElement(WidgetHeadline,{headline:headline}):null,React.createElement(ProductSlider,_extends({productIds:productIds,scope:"widgets",productItemProps:productItemProps,slidesPerView:2.3// Improves interaction with the slider in the CMS preview iframe
|
|
5
|
+
},isPreview?{touchStartPreventDefault:true}:{},{breakpoints:_defineProperty(_defineProperty(_defineProperty({},theme.breakpoints.values.sm,{slidesPerView:3.3}),theme.breakpoints.values.md,{slidesPerView:4.3}),theme.breakpoints.values.lg,{slidesPerView:5.3})},swiperProps)));};export default ProductSliderWidget;
|
|
@@ -13,10 +13,12 @@ import _camelCase from"lodash/camelCase";function _extends(){_extends=Object.ass
|
|
|
13
13
|
* @property {boolean} [endlessSlider] Whether the slider should loop endlessly.
|
|
14
14
|
* @property {number} [sliderSpeed] The speed (in ms) for the slider autoplay.
|
|
15
15
|
* @property {boolean} [isPreview] Whether the widget is in preview mode.
|
|
16
|
+
* @property {boolean} [showHeadline] Whether to show the headline.
|
|
17
|
+
* @property {Object} [headline] The headline to be displayed.
|
|
16
18
|
*/ /**
|
|
17
19
|
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
18
20
|
* .useWidget<ProductSliderWidgetConfig> >} UseWidgetReturnType
|
|
19
21
|
*/ // eslint-disable-next-line valid-jsdoc
|
|
20
22
|
/**
|
|
21
23
|
* Hook to access the Product Slider widget configuration.
|
|
22
|
-
*/export var useProductSliderWidget=function useProductSliderWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config,isPreview=_useWidget.isPreview;var products=config.products,productCount=config.productCount,sort=config.sort,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating,_config$slideAutomati=config.slideAutomatic,slideAutomatic=_config$slideAutomati===void 0?true:_config$slideAutomati,_config$endlessSlider=config.endlessSlider,endlessSlider=_config$endlessSlider===void 0?true:_config$endlessSlider,_config$sliderSpeed=config.sliderSpeed,sliderSpeed=_config$sliderSpeed===void 0?7000:_config$sliderSpeed;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var swiperProps=useMemo(function(){return{autoplay:slideAutomatic,delay:sliderSpeed,loop:endlessSlider};},[slideAutomatic,sliderSpeed,endlessSlider]);var productItemProps=useMemo(function(){return{hideName:!showName,hidePrice:!showPrice,hideRating:!showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,swiperProps:swiperProps,productItemProps:productItemProps,isPreview:isPreview});};
|
|
24
|
+
*/export var useProductSliderWidget=function useProductSliderWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config,isPreview=_useWidget.isPreview;var products=config.products,productCount=config.productCount,sort=config.sort,_config$showName=config.showName,showName=_config$showName===void 0?false:_config$showName,_config$showPrice=config.showPrice,showPrice=_config$showPrice===void 0?false:_config$showPrice,_config$showRating=config.showRating,showRating=_config$showRating===void 0?false:_config$showRating,_config$slideAutomati=config.slideAutomatic,slideAutomatic=_config$slideAutomati===void 0?true:_config$slideAutomati,_config$endlessSlider=config.endlessSlider,endlessSlider=_config$endlessSlider===void 0?true:_config$endlessSlider,_config$sliderSpeed=config.sliderSpeed,sliderSpeed=_config$sliderSpeed===void 0?7000:_config$sliderSpeed,_config$showHeadline=config.showHeadline,showHeadline=_config$showHeadline===void 0?false:_config$showHeadline,headline=config.headline;var productSearchParams=useMemo(function(){return getProductSearchParamsFromProductsInputConfig(products);},[products]);var swiperProps=useMemo(function(){return{autoplay:slideAutomatic,delay:sliderSpeed,loop:endlessSlider};},[slideAutomatic,sliderSpeed,endlessSlider]);var productItemProps=useMemo(function(){return{hideName:!showName,hidePrice:!showPrice,hideRating:!showRating};},[showName,showPrice,showRating]);return _extends({},productSearchParams,{sort:_camelCase(sort),productCount:productCount,swiperProps:swiperProps,productItemProps:productItemProps,isPreview:isPreview,showHeadline:showHeadline,headline:headline});};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import React from'react';import{makeStyles}from'@shopgate/engage/styles';import{WidgetRichText}from'@shopgate/engage/page/components';import{useRichTextWidget}from"./hooks";var useStyles=makeStyles()(function(theme){return{root:{padding:theme.spacing(1)}};});/**
|
|
2
|
+
* @returns {JSX.Element}
|
|
3
|
+
*/var RichText=function RichText(){var _useRichTextWidget=useRichTextWidget(),richText=_useRichTextWidget.richText;var _useStyles=useStyles(),cx=_useStyles.cx,classes=_useStyles.classes;if(!richText)return null;return React.createElement(WidgetRichText,{content:richText,className:cx(classes.root)});};export default RichText;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{useWidget}from'@shopgate/engage/page/hooks';/**
|
|
2
|
+
* @typedef {Object} RichTextWidgetConfig
|
|
3
|
+
* @property {string} text The rich text content.
|
|
4
|
+
*/ /**
|
|
5
|
+
* @typedef {ReturnType< typeof import('@shopgate/engage/page/hooks')
|
|
6
|
+
* .useWidget<RichTextWidgetConfig> >} UseWidgetReturnType
|
|
7
|
+
*/ // eslint-disable-next-line valid-jsdoc
|
|
8
|
+
/**
|
|
9
|
+
* Hook to access the Image widget configuration and data.
|
|
10
|
+
*/export var useRichTextWidget=function useRichTextWidget(){/** @type {UseWidgetReturnType} */var _useWidget=useWidget(),config=_useWidget.config;return{richText:config===null||config===void 0?void 0:config.text};};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{default}from"./RichText";
|
package/page/widgets/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{default as PlaceholderWidget}from"./Placeholder";export{default as ProductListWidget}from"./ProductList";export{default as CategoryListWidget}from"./CategoryList";export{default as HtmlWidget}from"./HTML";export{default as ProductSliderWidget}from"./ProductSlider";export{default as HeadlineWidget}from"./Headline";
|
|
1
|
+
export{default as PlaceholderWidget}from"./Placeholder";export{default as ProductListWidget}from"./ProductList";export{default as CategoryListWidget}from"./CategoryList";export{default as HtmlWidget}from"./HTML";export{default as ProductSliderWidget}from"./ProductSlider";export{default as HeadlineWidget}from"./Headline";export{default as ImageWidget}from"./Image";export{default as ImageRowWidget}from"./ImageRow";export{default as ImageSliderWidget}from"./ImageSlider";export{default as RichTextWidget}from"./RichText";export{default as HeroBannerWidget}from"./HeroBanner";
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"@shopgate/widgetsInternal/Placeholder": {
|
|
3
|
-
"path": "@shopgate/engage/page/widgets/Placeholder"
|
|
4
|
-
},
|
|
5
2
|
"@shopgate/widgets/productListWidget": {
|
|
6
3
|
"path": "@shopgate/engage/page/widgets/ProductList"
|
|
7
4
|
},
|
|
@@ -16,5 +13,23 @@
|
|
|
16
13
|
},
|
|
17
14
|
"@shopgate/widgets/headlineWidget": {
|
|
18
15
|
"path": "@shopgate/engage/page/widgets/Headline"
|
|
16
|
+
},
|
|
17
|
+
"@shopgate/widgets/imageWidget": {
|
|
18
|
+
"path": "@shopgate/engage/page/widgets/Image"
|
|
19
|
+
},
|
|
20
|
+
"@shopgate/widgets/imageRowWidget": {
|
|
21
|
+
"path": "@shopgate/engage/page/widgets/ImageRow"
|
|
22
|
+
},
|
|
23
|
+
"@shopgate/widgets/imageSliderWidget": {
|
|
24
|
+
"path": "@shopgate/engage/page/widgets/ImageSlider"
|
|
25
|
+
},
|
|
26
|
+
"@shopgate/widgets/richTextWidget": {
|
|
27
|
+
"path": "@shopgate/engage/page/widgets/RichText"
|
|
28
|
+
},
|
|
29
|
+
"@shopgate/widgets/heroBannerWidget": {
|
|
30
|
+
"path": "@shopgate/engage/page/widgets/HeroBanner"
|
|
31
|
+
},
|
|
32
|
+
"@shopgate/widgetsInternal/Placeholder": {
|
|
33
|
+
"path": "@shopgate/engage/page/widgets/Placeholder"
|
|
19
34
|
}
|
|
20
35
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import{connect}from'react-redux';import{makeGetShopSettingByKey}from"../../../core/selectors/shopSettings";import{SHOP_SETTING_DISPLAY_PRICE_PER_MEASURE_UNIT}from"../../../core/constants";/**
|
|
2
2
|
* Creates the mapStateToProps connector function.
|
|
3
3
|
* @returns {Function}
|
|
4
|
-
*/var makeMapStateToProps=function makeMapStateToProps(){var getShopSetting=makeGetShopSettingByKey(SHOP_SETTING_DISPLAY_PRICE_PER_MEASURE_UNIT,
|
|
4
|
+
*/var makeMapStateToProps=function makeMapStateToProps(){var getShopSetting=makeGetShopSettingByKey(SHOP_SETTING_DISPLAY_PRICE_PER_MEASURE_UNIT,true);return function(state,props){return{displayPricePerMeasureUnit:getShopSetting(state,props)};};};export default connect(makeMapStateToProps);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import React,{useMemo}from'react';import PropTypes from'prop-types';import{css}from'glamor';import classNames from'classnames';import{i18n}from'@shopgate/engage/core';import{ConditionalWrapper}from'@shopgate/engage/components';import{themeConfig}from'@shopgate/pwa-common/helpers/config';import connect from"./PriceInfo.connector";var styles={container:css({color:themeConfig.colors.shade3}).toString(),noWrap:css({whiteSpace:'nowrap'}).toString()};/**
|
|
2
2
|
* The price info component
|
|
3
3
|
* @returns {JSX}
|
|
4
|
-
*/var PriceInfo=function PriceInfo(_ref){var product=_ref.product,className=_ref.className,wrapper=_ref.wrapper,displayPricePerMeasureUnit=_ref.displayPricePerMeasureUnit,externalCurrency=_ref.currency;var _ref2=product||{},_ref2$price=_ref2.price,price=_ref2$price===void 0?{}:_ref2$price,unitPriceRefValue=_ref2.unitPriceRefValue,unitPriceRefUom=_ref2.unitPriceRefUom;var pricePerMeasureUnit=price.pricePerMeasureUnit,info=price.info,currency=price.currency;var content=useMemo(function(){if(!displayPricePerMeasureUnit){return info;}if(!pricePerMeasureUnit){return null;}var unitKey="formats.unitOfMeasurement.".concat(unitPriceRefUom);var unit=i18n.text(unitKey);if(unit===unitKey){unit=unitPriceRefUom;}return i18n.text('price.pricePerMeasurementFormat',{price:i18n.price(pricePerMeasureUnit,currency||externalCurrency,2)
|
|
4
|
+
*/var PriceInfo=function PriceInfo(_ref){var product=_ref.product,className=_ref.className,wrapper=_ref.wrapper,displayPricePerMeasureUnit=_ref.displayPricePerMeasureUnit,externalCurrency=_ref.currency;var _ref2=product||{},_ref2$price=_ref2.price,price=_ref2$price===void 0?{}:_ref2$price,unitPriceRefValue=_ref2.unitPriceRefValue,unitPriceRefUom=_ref2.unitPriceRefUom;var pricePerMeasureUnit=price.pricePerMeasureUnit,info=price.info,currency=price.currency;var content=useMemo(function(){if(!displayPricePerMeasureUnit||!pricePerMeasureUnit){return info;}if(!pricePerMeasureUnit){return null;}var unitKey="formats.unitOfMeasurement.".concat(unitPriceRefUom);var unit=i18n.text(unitKey);if(unit===unitKey){unit=unitPriceRefUom;}return i18n.text('price.pricePerMeasurementFormat',{price:i18n.price(pricePerMeasureUnit,currency||externalCurrency,2),// Don't show base prices like 1.99€/1kg, but show 1.99€/kg instead
|
|
5
|
+
refValue:!!unitPriceRefValue&&unitPriceRefValue!==1?unitPriceRefValue:'',refUom:unit});},[currency,displayPricePerMeasureUnit,externalCurrency,info,pricePerMeasureUnit,unitPriceRefUom,unitPriceRefValue]);if(!content){return null;}return React.createElement(ConditionalWrapper,{condition:!!wrapper,wrapper:wrapper},React.createElement("div",{className:classNames(styles.container,className,'engage__product__price-info',_defineProperty({},styles.noWrap,content!==info)),dangerouslySetInnerHTML:{__html:content},"data-test-id":"priceInfo: ".concat(content)}));};PriceInfo.defaultProps={product:null,className:null,currency:null,wrapper:null,displayPricePerMeasureUnit:false};export default connect(PriceInfo);
|
|
@@ -10,13 +10,13 @@ export interface Breakpoints {
|
|
|
10
10
|
* // extra-small
|
|
11
11
|
* xs: 0,
|
|
12
12
|
* // small
|
|
13
|
-
* sm:
|
|
13
|
+
* sm: 480,
|
|
14
14
|
* // medium
|
|
15
|
-
* md:
|
|
15
|
+
* md: 768,
|
|
16
16
|
* // large
|
|
17
|
-
* lg:
|
|
17
|
+
* lg: 1024,
|
|
18
18
|
* // extra-large
|
|
19
|
-
* xl:
|
|
19
|
+
* xl: 1280,
|
|
20
20
|
* }
|
|
21
21
|
*/
|
|
22
22
|
values: { [key in Breakpoint]: number };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
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{useWidget}from'@shopgate/engage/page/hooks';/**
|
|
2
|
-
* @typedef {Object} HeadlineWidgetConfig
|
|
3
|
-
* @property {Object} [headline] - The headline configuration object.
|
|
4
|
-
* @property {string} [headline.text] - The text to display as the headline.
|
|
5
|
-
*/ // eslint-disable-next-line valid-jsdoc
|
|
6
|
-
/**
|
|
7
|
-
* Custom hook to retrieve the headline widget configuration.
|
|
8
|
-
*/export var useHeadlineWidget=function useHeadlineWidget(){var _useWidget=useWidget(),config=_useWidget.config;var _config$headline=config.headline,bold=_config$headline.bold,italic=_config$headline.italic,text=_config$headline.text,underline=_config$headline.underline,textAlign=_config$headline.textAlign,typography=_config$headline.typography;var styles=_extends({},bold&&{fontWeight:'bold'},{},italic&&{fontStyle:'italic'},{},underline&&{textDecoration:'underline'});return{headline:text,variant:typography!==null&&typography!==void 0?typography:'h3',align:textAlign,styles:styles};};
|