@shopgate/engage 7.32.0-beta.2 → 7.32.0-beta.20
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/account/components/Profile/Profile.provider.d.ts +1 -1
- package/account/components/Profile/ProfileAddressBook.d.ts.map +1 -1
- package/account/components/Profile/ProfileAddressBook.js +13 -22
- package/account/components/Profile/ProfileAddressCard.d.ts.map +1 -1
- package/account/components/Profile/ProfileAddressCard.js +9 -18
- package/account/components/Profile/ProfileForm.d.ts.map +1 -1
- package/account/components/Profile/ProfileForm.js +15 -42
- package/account/components/ProfileContact/ProfileContact.js +13 -21
- package/admin-preview/components/FrontendSettingsPreviewBridge/FrontendSettingsPreviewBridge.d.ts +2 -1
- package/admin-preview/components/FrontendSettingsPreviewBridge/FrontendSettingsPreviewBridge.d.ts.map +1 -1
- package/admin-preview/components/FrontendSettingsPreviewBridge/FrontendSettingsPreviewBridge.js +61 -5
- package/admin-preview/components/FrontendSettingsPreviewBridge/helpers.d.ts +7 -1
- package/admin-preview/components/FrontendSettingsPreviewBridge/helpers.d.ts.map +1 -1
- package/admin-preview/components/FrontendSettingsPreviewBridge/helpers.js +14 -2
- package/admin-preview/components/FrontendSettingsPreviewBridge/types.d.ts +15 -2
- package/admin-preview/components/FrontendSettingsPreviewBridge/types.d.ts.map +1 -1
- package/admin-preview/constants/index.d.ts +9 -22
- package/admin-preview/constants/index.d.ts.map +1 -1
- package/admin-preview/constants/index.js +10 -27
- package/admin-preview/{detection.d.ts → helpers/_internal/detection.d.ts} +12 -8
- package/admin-preview/helpers/_internal/detection.d.ts.map +1 -0
- package/admin-preview/helpers/_internal/detection.js +93 -0
- package/admin-preview/helpers/_internal/origins.d.ts +20 -0
- package/admin-preview/helpers/_internal/origins.d.ts.map +1 -0
- package/admin-preview/helpers/_internal/origins.js +72 -0
- package/admin-preview/helpers/index.d.ts +20 -0
- package/admin-preview/helpers/index.d.ts.map +1 -1
- package/admin-preview/helpers/index.js +26 -2
- package/admin-preview/hooks/index.d.ts +9 -7
- package/admin-preview/hooks/index.d.ts.map +1 -1
- package/admin-preview/hooks/index.js +21 -18
- package/admin-preview/initialization/_internal/initialFrontendSettings.d.ts +32 -0
- package/admin-preview/initialization/_internal/initialFrontendSettings.d.ts.map +1 -0
- package/admin-preview/initialization/_internal/initialFrontendSettings.js +43 -0
- package/admin-preview/initialization/awaitInitialFrontendSettings.d.ts +23 -0
- package/admin-preview/initialization/awaitInitialFrontendSettings.d.ts.map +1 -0
- package/admin-preview/initialization/awaitInitialFrontendSettings.js +88 -0
- package/back-in-stock/components/BackInStockButton/index.js +5 -5
- package/back-in-stock/components/Subscriptions/components/Subscription/index.js +2 -5
- package/cart/components/CartItem/CartItemProductLayout.js +2 -1
- package/cart/components/CartItem/CartItemProductLayoutWide.js +2 -2
- package/cart/components/CartItem/CartItemProductLayoutWideRemoveItem.js +7 -14
- package/cart/components/CartItem/CartItemQuantityPicker.js +3 -2
- package/cart/components/CartItems/CartItemCardReservationLabelChangeStore.js +6 -24
- package/cart/components/CartItems/CartItems.js +8 -10
- package/cart/components/CartItems/CartItemsSubstitution.js +3 -2
- package/cart/components/CartSummaryWide/CartSummaryWide.js +2 -2
- package/cart/components/CartSummaryWide/CartSummaryWideCheckoutButton.js +9 -23
- package/cart/components/PaymentBar/PaymentBarCheckoutButton.js +8 -30
- package/cart/components/PaymentBar/testUtils/mockFactories.js +4 -11
- package/category/components/CategoryImage/index.js +24 -17
- package/checkout/components/AddressBook/AddressList.js +14 -23
- package/checkout/components/Checkout/CheckoutActions.js +4 -3
- package/checkout/components/Checkout/CheckoutAddress.js +8 -0
- package/checkout/components/Checkout/CheckoutSection.js +6 -2
- package/checkout/components/CheckoutConfirmation/CheckoutConfirmation.js +6 -7
- package/checkout/components/ResponsiveBackButton/ResponsiveBackButton.js +7 -17
- package/components/Badge/Badge.d.ts +30 -0
- package/components/Badge/Badge.d.ts.map +1 -0
- package/components/Badge/Badge.js +49 -0
- package/components/Badge/index.d.ts +3 -0
- package/components/Badge/index.d.ts.map +1 -0
- package/components/Badge/index.js +1 -0
- package/components/Card/Card.d.ts +27 -0
- package/components/Card/Card.d.ts.map +1 -0
- package/components/Card/Card.js +57 -0
- package/components/Card/index.d.ts +4 -0
- package/components/Card/index.d.ts.map +1 -0
- package/components/Card/index.js +2 -0
- package/components/Card/useCardAppearance.d.ts +11 -0
- package/components/Card/useCardAppearance.d.ts.map +1 -0
- package/components/Card/useCardAppearance.js +22 -0
- package/components/ChipLayout/index.js +2 -4
- package/components/NavigationHandler/connector.js +1 -1
- package/components/NavigationHandler/index.d.ts +2 -2
- package/components/Paper/Paper.d.ts +48 -0
- package/components/Paper/Paper.d.ts.map +1 -0
- package/components/Paper/Paper.js +64 -0
- package/components/Paper/index.d.ts +3 -0
- package/components/Paper/index.d.ts.map +1 -0
- package/components/Paper/index.js +1 -0
- package/components/RadioCard/RadioCard.d.ts.map +1 -1
- package/components/RadioCard/RadioCard.js +2 -1
- package/components/SheetList/components/Item/index.js +8 -8
- package/components/Tabs/components/Tab.d.ts.map +1 -1
- package/components/Tabs/components/Tab.js +14 -16
- package/components/Typography/Typography.d.ts +1 -1
- package/components/Typography/Typography.d.ts.map +1 -1
- package/components/Typography/Typography.js +2 -0
- package/components/View/components/Content/index.d.ts.map +1 -1
- package/components/View/components/Content/index.js +4 -1
- package/components/constants.d.ts +6 -0
- package/components/constants.d.ts.map +1 -0
- package/components/index.d.ts +6 -1
- package/components/index.d.ts.map +1 -1
- package/components/index.js +6 -2
- package/components/v2/Button/Button.d.ts +24 -13
- package/components/v2/Button/Button.d.ts.map +1 -1
- package/components/v2/Button/Button.js +139 -41
- package/components/v2/ButtonBase/ButtonBase.d.ts +50 -10
- package/components/v2/ButtonBase/ButtonBase.d.ts.map +1 -1
- package/components/v2/ButtonBase/ButtonBase.js +192 -17
- package/components/v2/ButtonBase/hooks.d.ts +0 -1
- package/components/v2/ButtonBase/hooks.d.ts.map +1 -1
- package/components/v2/ButtonBase/hooks.js +36 -12
- package/components/v2/ButtonGroup/ButtonGroup.d.ts +11 -5
- package/components/v2/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/components/v2/ButtonGroup/ButtonGroup.js +49 -26
- package/components/v2/CircularProgress/CircularProgress.d.ts.map +1 -1
- package/components/v2/CircularProgress/CircularProgress.js +10 -5
- package/components/v2/IconButton/IconButton.d.ts +72 -0
- package/components/v2/IconButton/IconButton.d.ts.map +1 -0
- package/components/v2/IconButton/IconButton.js +169 -0
- package/components/v2/IconButton/index.d.ts +3 -0
- package/components/v2/IconButton/index.d.ts.map +1 -0
- package/components/v2/IconButton/index.js +1 -0
- package/components/v2/index.d.ts +1 -0
- package/components/v2/index.d.ts.map +1 -1
- package/components/v2/index.js +1 -0
- package/core/helpers/getFullImageSource.d.ts +5 -1
- package/core/helpers/getFullImageSource.d.ts.map +1 -1
- package/core/helpers/getFullImageSource.js +30 -14
- package/core/helpers/i18n.d.ts +4 -0
- package/core/helpers/i18n.d.ts.map +1 -1
- package/core/helpers/i18n.js +3 -0
- package/core/hooks/events/appEvents.d.ts +31 -46
- package/core/hooks/events/appEvents.d.ts.map +1 -0
- package/core/hooks/events/appEvents.js +26 -29
- package/core/hooks/events/index.d.ts +4 -4
- package/core/hooks/events/index.d.ts.map +1 -1
- package/core/hooks/events/useLongPress.d.ts +55 -58
- package/core/hooks/events/useLongPress.d.ts.map +1 -0
- package/core/hooks/events/useLongPress.js +23 -16
- package/core/hooks/events/usePressHandler.d.ts +32 -21
- package/core/hooks/events/usePressHandler.d.ts.map +1 -1
- package/core/hooks/events/usePressHandler.js +12 -10
- package/core/hooks/events/useScrollDirectionChange.d.ts +72 -61
- package/core/hooks/events/useScrollDirectionChange.d.ts.map +1 -0
- package/core/hooks/events/useScrollDirectionChange.js +36 -43
- package/core/hooks/html/useLoadImage.d.ts +3 -3
- package/core/hooks/html/useLoadImage.d.ts.map +1 -1
- package/core/hooks/html/useLoadImage.js +2 -2
- package/core/hooks/useLocalStorage.d.ts +8 -0
- package/core/hooks/useLocalStorage.d.ts.map +1 -1
- package/core/hooks/useLocalStorage.js +22 -15
- package/core/hooks/useNavigation.d.ts +10 -2
- package/core/hooks/useNavigation.d.ts.map +1 -1
- package/core/hooks/useNavigation.js +1 -2
- package/core/initialization/fetchSettings.d.ts +12 -0
- package/core/initialization/fetchSettings.d.ts.map +1 -0
- package/core/initialization/fetchSettings.js +134 -0
- package/core/initialization/index.d.ts +33 -2
- package/core/initialization/index.d.ts.map +1 -1
- package/core/initialization/index.js +44 -103
- package/core/router/conductor.d.ts +9 -0
- package/core/router/helpers.d.ts +28 -15
- package/core/router/helpers.d.ts.map +1 -1
- package/core/router/helpers.js +8 -8
- package/development/action-creators/index.d.ts +3 -0
- package/development/action-creators/index.d.ts.map +1 -0
- package/development/action-creators/settings.d.ts +45 -0
- package/development/action-creators/settings.d.ts.map +1 -0
- package/development/action-creators/settings.js +21 -10
- package/development/action-creators/storage.d.ts +17 -0
- package/development/action-creators/storage.d.ts.map +1 -0
- package/development/action-creators/storage.js +7 -4
- package/development/components/ClientInformation/ClientInformation.d.ts +6 -0
- package/development/components/ClientInformation/ClientInformation.d.ts.map +1 -0
- package/development/components/ClientInformation/ClientInformation.js +7 -4
- package/development/components/ClientInformation/actions.d.ts +6 -0
- package/development/components/ClientInformation/actions.d.ts.map +1 -0
- package/development/components/ClientInformation/actions.js +1 -1
- package/development/components/ClientInformation/index.d.ts +2 -0
- package/development/components/ClientInformation/index.d.ts.map +1 -0
- package/development/components/DevelopmentSettings/DevelopmentSettings.d.ts +16 -0
- package/development/components/DevelopmentSettings/DevelopmentSettings.d.ts.map +1 -0
- package/development/components/DevelopmentSettings/DevelopmentSettings.js +43 -30
- package/development/components/DevelopmentSettings/index.d.ts +2 -0
- package/development/components/DevelopmentSettings/index.d.ts.map +1 -0
- package/development/components/DevelopmentTools/DevelopmentTools.d.ts +10 -0
- package/development/components/DevelopmentTools/DevelopmentTools.d.ts.map +1 -0
- package/development/components/DevelopmentTools/DevelopmentTools.js +8 -8
- package/development/components/DevelopmentTools/Shortcuts.d.ts +6 -0
- package/development/components/DevelopmentTools/Shortcuts.d.ts.map +1 -0
- package/development/components/DevelopmentTools/Shortcuts.js +0 -1
- package/development/components/DevelopmentTools/hooks.d.ts +8 -0
- package/development/components/DevelopmentTools/hooks.d.ts.map +1 -0
- package/development/components/DevelopmentTools/hooks.js +2 -3
- package/development/components/DevelopmentTools/index.d.ts +2 -0
- package/development/components/DevelopmentTools/index.d.ts.map +1 -0
- package/development/components/SimulatedInsets/SimulatedInsetBottom.d.ts +7 -0
- package/development/components/SimulatedInsets/SimulatedInsetBottom.d.ts.map +1 -0
- package/development/components/SimulatedInsets/SimulatedInsetBottom.js +1 -6
- package/development/components/SimulatedInsets/SimulatedInsetTop.d.ts +7 -0
- package/development/components/SimulatedInsets/SimulatedInsetTop.d.ts.map +1 -0
- package/development/components/SimulatedInsets/SimulatedInsetTop.js +2 -7
- package/development/components/SimulatedInsets/SimulatedInsets.d.ts +13 -0
- package/development/components/SimulatedInsets/SimulatedInsets.d.ts.map +1 -0
- package/development/components/SimulatedInsets/SimulatedInsets.js +2 -7
- package/development/components/SimulatedInsets/index.d.ts +2 -0
- package/development/components/SimulatedInsets/index.d.ts.map +1 -0
- package/development/components/SimulatedInsets/types.d.ts +15 -0
- package/development/components/SimulatedInsets/types.d.ts.map +1 -0
- package/development/components/SimulatedInsets/types.js +1 -0
- package/development/components/index.d.ts +3 -0
- package/development/components/index.d.ts.map +1 -0
- package/development/constants/actionTypes.d.ts +6 -0
- package/development/constants/actionTypes.d.ts.map +1 -0
- package/development/constants/actionTypes.js +2 -1
- package/development/constants/index.d.ts +2 -0
- package/development/constants/index.d.ts.map +1 -0
- package/development/reducers/index.d.ts +24 -0
- package/development/reducers/index.d.ts.map +1 -0
- package/development/reducers/settings.d.ts +17 -0
- package/development/reducers/settings.d.ts.map +1 -0
- package/development/reducers/settings.js +48 -35
- package/development/reducers/storage.d.ts +17 -0
- package/development/reducers/storage.d.ts.map +1 -0
- package/development/reducers/storage.js +24 -24
- package/development/selectors/index.d.ts +3 -0
- package/development/selectors/index.d.ts.map +1 -0
- package/development/selectors/settings.d.ts +52 -0
- package/development/selectors/settings.d.ts.map +1 -0
- package/development/selectors/settings.js +21 -11
- package/development/selectors/storage.d.ts +10 -0
- package/development/selectors/storage.d.ts.map +1 -0
- package/development/selectors/storage.js +6 -18
- package/development/streams/index.d.ts +2 -0
- package/development/streams/index.d.ts.map +1 -0
- package/development/streams/insets.d.ts +8 -0
- package/development/streams/insets.d.ts.map +1 -0
- package/development/streams/insets.js +1 -3
- package/development/subscriptions/index.d.ts +15 -0
- package/development/subscriptions/index.d.ts.map +1 -0
- package/development/subscriptions/index.js +6 -2
- package/development/types/development.d.ts +68 -0
- package/development/types/development.d.ts.map +1 -0
- package/development/types/development.js +1 -0
- package/development/types/index.d.ts +2 -0
- package/development/types/index.d.ts.map +1 -0
- package/development/types/index.js +1 -0
- package/favorites/components/FavoriteButtonWide/FavoriteButtonWide.js +7 -17
- package/favorites/components/Item/Item.d.ts +1 -1
- package/favorites/components/Item/Item.d.ts.map +1 -1
- package/favorites/components/Item/Item.js +2 -5
- package/favorites/components/List/List.d.ts +1 -1
- package/favorites/components/List/List.d.ts.map +1 -1
- package/favorites/components/List/List.js +0 -1
- package/favorites/components/List/ListContent.js +4 -5
- package/favorites/components/Lists/Lists.js +4 -5
- package/filter/components/FilterItem/index.js +12 -2
- package/filter/components/FilterPageContent/components/ApplyButton/index.d.ts +21 -0
- package/filter/components/FilterPageContent/components/ApplyButton/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/components/ApplyButton/index.js +27 -56
- package/filter/components/FilterPageContent/components/FilterButtonBar/index.d.ts +8 -0
- package/filter/components/FilterPageContent/components/FilterButtonBar/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/components/FilterButtonBar/index.js +63 -0
- package/filter/components/FilterPageContent/components/ResetButton/index.d.ts +17 -0
- package/filter/components/FilterPageContent/components/ResetButton/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/components/ResetButton/index.js +26 -46
- package/filter/components/FilterPageContent/components/Selector/components/Selected/index.d.ts +19 -0
- package/filter/components/FilterPageContent/components/Selector/components/Selected/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/components/Selector/components/Selected/index.js +25 -46
- package/filter/components/FilterPageContent/components/Selector/components/Toggle/index.d.ts +14 -0
- package/filter/components/FilterPageContent/components/Selector/components/Toggle/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/components/Selector/components/Toggle/index.js +13 -46
- package/filter/components/FilterPageContent/components/Selector/components/ValueCheckbox/index.d.ts +25 -0
- package/filter/components/FilterPageContent/components/Selector/components/ValueCheckbox/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/components/Selector/components/ValueCheckbox/index.js +77 -0
- package/filter/components/FilterPageContent/components/Selector/index.d.ts +43 -0
- package/filter/components/FilterPageContent/components/Selector/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/components/Selector/index.js +52 -40
- package/filter/components/FilterPageContent/index.d.ts +16 -0
- package/filter/components/FilterPageContent/index.d.ts.map +1 -0
- package/filter/components/FilterPageContent/index.js +51 -57
- package/filter/components/PriceSlider/components/Label/index.js +86 -94
- package/filter/components/PriceSlider/index.js +43 -30
- package/filter/helpers/buildFilterParamsForFetchFiltersRequest.d.ts +8 -0
- package/filter/helpers/buildFilterParamsForFetchFiltersRequest.d.ts.map +1 -0
- package/filter/helpers/buildInitialFilters.d.ts +7 -0
- package/filter/helpers/buildInitialFilters.d.ts.map +1 -0
- package/filter/helpers/buildUpdatedFilters.d.ts +7 -0
- package/filter/helpers/buildUpdatedFilters.d.ts.map +1 -0
- package/filter/helpers/index.d.ts +5 -0
- package/filter/helpers/index.d.ts.map +1 -0
- package/filter/helpers/translateFilterLabel.d.ts +8 -0
- package/filter/helpers/translateFilterLabel.d.ts.map +1 -0
- package/filter/providers/FilterPageProvider.context.d.ts +157 -0
- package/filter/providers/FilterPageProvider.context.d.ts.map +1 -0
- package/filter/providers/FilterPageProvider.d.ts +24 -0
- package/filter/providers/FilterPageProvider.d.ts.map +1 -0
- package/filter/providers/FilterPageProvider.js +77 -132
- package/locations/components/ChangeLocationButton/ChangeLocationButton.js +10 -14
- package/locations/components/FulfillmentSlotSwitcher/FulfillmentSlotDialog.js +4 -8
- package/locations/components/FulfillmentSlotSwitcher/FulfillmentSlotSwitcher.js +1 -1
- package/locations/components/FulfillmentSlotSwitcher/FulfillmentSlotSwitcherBar.js +8 -13
- package/locations/components/FulfillmentSlotSwitcher/FulfillmentSlotSwitcherDefault.js +10 -10
- package/locations/components/GlobalLocationSwitcher/GlobalLocationSwitcherBar.js +12 -16
- package/locations/components/GlobalLocationSwitcher/GlobalLocationSwitcherDefault.js +9 -10
- package/locations/components/ReserveForm/ReserveForm.js +6 -7
- package/locations/components/StoreDetails/components/GetDirectionsButton.js +2 -4
- package/locations/components/StoreDetails/components/StoreDetails.js +5 -10
- package/locations/components/StoreDetails/components/StoresNearbyListItem.js +13 -21
- package/locations/components/StoreFinder/StoreFinderSelectLocationButton.js +5 -11
- package/locations/components/StoreFinder/StoreFinderStoreInfoButton.js +5 -11
- package/locations/components/StoreList/StoreListProduct.js +2 -3
- package/locations/components/StoreList/StoreListSearch.js +1 -0
- package/locations/components/StoreList/StoreSelectLocationButton.js +5 -11
- package/login/components/ForgotPassword/ForgotPassword.js +11 -23
- package/mocks/date.js +31 -0
- package/mocks/index.js +3 -0
- package/mocks/pipelineRequest.js +1 -0
- package/mocks/subscriptions.js +1 -0
- package/orders/components/OrderDetails/OrderDetailsAuthenticate.js +5 -7
- package/orders/components/OrderHistory/OrderHistoryList.d.ts.map +1 -1
- package/orders/components/OrderHistory/OrderHistoryList.js +8 -9
- package/orders/components/OrderHistory/OrderHistoryTable.d.ts.map +1 -1
- package/orders/components/OrderHistory/OrderHistoryTable.js +4 -0
- package/package.json +9 -9
- package/page/components/NotFound.d.ts +7 -0
- package/page/components/NotFound.d.ts.map +1 -0
- package/page/components/NotFound.js +8 -8
- package/page/components/ResponsiveWidgetImage/ResponsiveWidgetImage.d.ts +52 -0
- package/page/components/ResponsiveWidgetImage/ResponsiveWidgetImage.d.ts.map +1 -0
- package/page/components/ResponsiveWidgetImage/ResponsiveWidgetImage.js +4 -4
- package/page/components/ResponsiveWidgetImage/index.d.ts +2 -0
- package/page/components/ResponsiveWidgetImage/index.d.ts.map +1 -0
- package/page/components/WidgetRichText/WidgetRichText.d.ts +25 -0
- package/page/components/WidgetRichText/WidgetRichText.d.ts.map +1 -0
- package/page/components/WidgetRichText/index.d.ts +2 -0
- package/page/components/WidgetRichText/index.d.ts.map +1 -0
- package/page/components/WidgetVideo/WidgetVideo.d.ts +43 -0
- package/page/components/WidgetVideo/WidgetVideo.d.ts.map +1 -0
- package/page/components/WidgetVideo/WidgetVideo.js +33 -39
- package/page/components/WidgetVideo/index.d.ts +2 -0
- package/page/components/WidgetVideo/index.d.ts.map +1 -0
- package/page/components/Widgets/Overlay.d.ts +17 -0
- package/page/components/Widgets/Overlay.d.ts.map +1 -0
- package/page/components/Widgets/Overlay.js +24 -38
- package/page/components/Widgets/Tooltip.d.ts +20 -0
- package/page/components/Widgets/Tooltip.d.ts.map +1 -0
- package/page/components/Widgets/Tooltip.js +6 -10
- package/page/components/Widgets/Widget.d.ts +32 -0
- package/page/components/Widgets/Widget.d.ts.map +1 -0
- package/page/components/Widgets/Widget.js +14 -28
- package/page/components/Widgets/WidgetContext.d.ts +32 -38
- package/page/components/Widgets/WidgetContext.d.ts.map +1 -0
- package/page/components/Widgets/WidgetContext.js +2 -8
- package/page/components/Widgets/WidgetProvider.d.ts +29 -0
- package/page/components/Widgets/WidgetProvider.d.ts.map +1 -0
- package/page/components/Widgets/WidgetProvider.js +8 -15
- package/page/components/Widgets/Widgets.d.ts +16 -0
- package/page/components/Widgets/Widgets.d.ts.map +1 -0
- package/page/components/Widgets/Widgets.js +5 -12
- package/page/components/Widgets/WidgetsPreviewContext.d.ts +21 -0
- package/page/components/Widgets/WidgetsPreviewContext.d.ts.map +1 -0
- package/page/components/Widgets/WidgetsPreviewContext.js +5 -7
- package/page/components/Widgets/WidgetsPreviewProvider.d.ts +18 -0
- package/page/components/Widgets/WidgetsPreviewProvider.d.ts.map +1 -0
- package/page/components/Widgets/WidgetsPreviewProvider.js +5 -6
- package/page/components/Widgets/constants.d.ts +18 -0
- package/page/components/Widgets/constants.d.ts.map +1 -0
- package/page/components/Widgets/constants.js +24 -2
- package/page/components/Widgets/events.d.ts +38 -0
- package/page/components/Widgets/events.d.ts.map +1 -0
- package/page/components/Widgets/events.js +8 -12
- package/page/components/Widgets/helpers.d.ts +69 -0
- package/page/components/Widgets/helpers.d.ts.map +1 -0
- package/page/components/Widgets/helpers.js +58 -13
- package/page/components/Widgets/hooks.d.ts +13 -0
- package/page/components/Widgets/hooks.d.ts.map +1 -0
- package/page/components/Widgets/hooks.js +18 -12
- package/page/components/Widgets/index.d.ts +3 -0
- package/page/components/Widgets/index.d.ts.map +1 -0
- package/page/components/Widgets/types.d.ts +138 -114
- package/page/components/Widgets/types.d.ts.map +1 -0
- package/page/components/Widgets/types.js +1 -0
- package/page/components/index.d.ts +5 -0
- package/page/components/index.d.ts.map +1 -0
- package/page/constants/actionTypes.d.ts +4 -0
- package/page/constants/actionTypes.d.ts.map +1 -0
- package/page/constants/index.d.ts +25 -0
- package/page/constants/index.d.ts.map +1 -0
- package/page/constants/index.js +5 -3
- package/page/helpers/index.d.ts +70 -62
- package/page/helpers/index.d.ts.map +1 -0
- package/page/helpers/index.js +31 -29
- package/page/hooks/index.d.ts +54 -53
- package/page/hooks/index.d.ts.map +1 -0
- package/page/hooks/index.js +20 -15
- package/page/selectors/index.d.ts +32 -0
- package/page/selectors/index.d.ts.map +1 -0
- package/page/widget.config.schema.json +54 -0
- package/page/widgets/Button/Button.js +2 -3
- package/page/widgets/CategoryList/CategoryList.js +2 -1
- package/page/widgets/HeroBanner/config.json +6 -0
- package/page/widgets/Image/config.json +6 -0
- package/page/widgets/ImageRow/config.json +6 -0
- package/page/widgets/ImageSlider/config.json +6 -0
- package/page/widgets/ImageSlider/hooks.js +4 -2
- package/page/widgets/NestedCategoryFilter/NestedCategoryFilter.js +8 -8
- package/page/widgets/ProductList/ProductList.js +18 -14
- package/page/widgets/ProductSlider/ProductSlider.js +1 -15
- package/page/widgets/README.md +92 -0
- package/page/widgets/Video/Video.d.ts +6 -0
- package/page/widgets/Video/Video.d.ts.map +1 -0
- package/page/widgets/Video/Video.js +0 -2
- package/page/widgets/Video/config.json +6 -0
- package/page/widgets/Video/hooks.d.ts +53 -0
- package/page/widgets/Video/hooks.d.ts.map +1 -0
- package/page/widgets/Video/hooks.js +4 -12
- package/page/widgets/Video/index.d.ts +2 -0
- package/page/widgets/Video/index.d.ts.map +1 -0
- package/product/components/Description/index.js +0 -2
- package/product/components/FilterBar/components/Content/components/FilterButton/index.js +38 -46
- package/product/components/FilterBar/components/Content/components/FilterChips/components/FilterChip/index.d.ts +38 -0
- package/product/components/FilterBar/components/Content/components/FilterChips/components/FilterChip/index.d.ts.map +1 -0
- package/product/components/FilterBar/components/Content/components/FilterChips/components/FilterChip/index.js +88 -0
- package/product/components/FilterBar/components/Content/components/FilterChips/index.js +54 -35
- package/product/components/FilterBar/components/Content/components/Sort/index.js +1 -1
- package/product/components/FilterBar/components/Content/index.js +7 -3
- package/product/components/FilterBar/index.js +11 -22
- package/product/components/Media/FeaturedMedia.js +7 -1
- package/product/components/Media/MediaImage.js +24 -23
- package/product/components/Media/MediaPlaceholder.js +4 -7
- package/product/components/MediaSlider/components/MediaImage/index.js +6 -2
- package/product/components/MediaSlider/constants.js +1 -12
- package/product/components/OrderQuantityHint/index.js +16 -1
- package/product/components/ProductCard/index.js +36 -23
- package/product/components/ProductFilters/index.js +2 -6
- package/product/components/ProductGrid/components/Item/components/ItemDetails/index.js +12 -4
- package/product/components/ProductGrid/components/Item/components/ItemFavoritesButton/index.js +0 -1
- package/product/components/ProductGrid/components/Item/components/ItemImage/index.js +3 -6
- package/product/components/ProductGrid/components/Item/components/ItemName/index.js +6 -1
- package/product/components/ProductGrid/components/Item/index.js +10 -2
- package/product/components/ProductGrid/components/Layout/index.js +19 -4
- package/product/components/ProductGrid/constants.d.ts +2 -0
- package/product/components/ProductGrid/constants.d.ts.map +1 -0
- package/product/components/ProductGrid/constants.js +1 -0
- package/product/components/ProductGrid/hooks.d.ts +11 -0
- package/product/components/ProductGrid/hooks.d.ts.map +1 -0
- package/product/components/ProductGrid/hooks.js +48 -0
- package/product/components/ProductGrid/index.js +3 -6
- package/product/components/ProductGridPrice/index.js +0 -6
- package/product/components/ProductImage/ProductImage.d.ts +42 -0
- package/product/components/ProductImage/ProductImage.d.ts.map +1 -0
- package/product/components/ProductImage/ProductImage.js +158 -0
- package/product/components/ProductImage/ProductImagePlaceholder.d.ts +23 -0
- package/product/components/ProductImage/ProductImagePlaceholder.d.ts.map +1 -0
- package/product/components/ProductImage/ProductImagePlaceholder.js +12 -17
- package/product/components/ProductImage/constants.d.ts +7 -0
- package/product/components/ProductImage/constants.d.ts.map +1 -0
- package/product/components/ProductImage/constants.js +6 -0
- package/product/components/ProductImage/hooks.d.ts +8 -0
- package/product/components/ProductImage/hooks.d.ts.map +1 -0
- package/product/components/ProductImage/hooks.js +32 -0
- package/product/components/ProductImage/index.d.ts +3 -0
- package/product/components/ProductImage/index.d.ts.map +1 -0
- package/product/components/ProductImage/index.js +1 -201
- package/product/components/ProductList/components/Item/index.js +5 -3
- package/product/components/ProductList/components/Layout/index.js +8 -20
- package/product/components/ProductRatingStars/ProductRatingStars.d.ts.map +1 -1
- package/product/components/ProductRatingStars/ProductRatingStars.js +4 -17
- package/product/components/ProductSlider/constants.d.ts +3 -0
- package/product/components/ProductSlider/constants.d.ts.map +1 -0
- package/product/components/ProductSlider/constants.js +2 -0
- package/product/components/ProductSlider/hooks.d.ts +7 -0
- package/product/components/ProductSlider/hooks.d.ts.map +1 -0
- package/product/components/ProductSlider/hooks.js +40 -0
- package/product/components/ProductSlider/index.js +8 -8
- package/product/components/Rating/index.js +12 -21
- package/product/components/RelationsSlider/RelationsSliderContent.js +3 -2
- package/product/components/RelationsSlider/constants.d.ts +3 -0
- package/product/components/RelationsSlider/constants.d.ts.map +1 -0
- package/product/components/RelationsSlider/constants.js +2 -1
- package/product/components/RelationsSlider/hooks.d.ts +6 -0
- package/product/components/RelationsSlider/hooks.d.ts.map +1 -0
- package/product/components/RelationsSlider/hooks.js +34 -0
- package/product/components/UnitQuantityPicker/UnitQuantityPicker.d.ts.map +1 -1
- package/product/components/UnitQuantityPicker/UnitQuantityPicker.js +15 -33
- package/product/helpers/index.js +29 -11
- package/product/hooks/index.js +3 -1
- package/product/hooks/useLoadProductImage.js +4 -2
- package/product/hooks/useShowEmptyRatingStars.d.ts +7 -0
- package/product/hooks/useShowEmptyRatingStars.d.ts.map +1 -0
- package/product/hooks/useShowEmptyRatingStars.js +21 -0
- package/product/index.js +0 -1
- package/product/selectors/mocks/productProperties.mock.js +49 -0
- package/push-opt-in/components/PushOptInModal/index.js +4 -4
- package/registration/components/Registration/RegistrationFormActions.js +4 -4
- package/reviews/components/Reviews/components/AllReviewsLink/index.js +6 -6
- package/reviews/components/Reviews/components/Header/components/WriteReviewLink/index.js +4 -3
- package/settings/action-creators/appSettings.d.ts +3 -3
- package/settings/action-creators/appSettings.d.ts.map +1 -1
- package/settings/constants/appSettings.d.ts +3 -0
- package/settings/constants/appSettings.d.ts.map +1 -1
- package/settings/constants/appSettings.js +6 -1
- package/settings/constants/imageSettings.d.ts +52 -0
- package/settings/constants/imageSettings.d.ts.map +1 -0
- package/settings/constants/imageSettings.js +69 -0
- package/settings/helpers/index.d.ts +3 -0
- package/settings/helpers/index.d.ts.map +1 -0
- package/settings/helpers/index.js +1 -0
- package/settings/helpers/resolveImageSettings.d.ts +70 -0
- package/settings/helpers/resolveImageSettings.d.ts.map +1 -0
- package/settings/helpers/resolveImageSettings.js +171 -0
- package/settings/helpers/toImageQuality.d.ts +7 -0
- package/settings/helpers/toImageQuality.d.ts.map +1 -0
- package/settings/helpers/toImageQuality.js +44 -0
- package/settings/helpers/toThumborColor.d.ts +15 -0
- package/settings/helpers/toThumborColor.d.ts.map +1 -0
- package/settings/helpers/toThumborColor.js +51 -0
- package/settings/hooks/index.d.ts +2 -0
- package/settings/hooks/index.d.ts.map +1 -0
- package/settings/hooks/index.js +1 -0
- package/settings/hooks/useImageSettings.d.ts +28 -0
- package/settings/hooks/useImageSettings.d.ts.map +1 -0
- package/settings/hooks/useImageSettings.js +39 -0
- package/settings/reducers/appSettings.d.ts.map +1 -1
- package/settings/reducers/appSettings.js +123 -8
- package/settings/reducers/index.d.ts +3 -3
- package/settings/selectors/appSettings.d.ts +122 -1
- package/settings/selectors/appSettings.d.ts.map +1 -1
- package/settings/selectors/appSettings.js +80 -1
- package/settings/types/appSettings.d.ts +279 -0
- package/settings/types/appSettings.d.ts.map +1 -1
- package/settings/types/appSettings.js +133 -1
- package/styles/helpers/index.d.ts +2 -0
- package/styles/helpers/index.js +2 -0
- package/styles/helpers/loadFontCss.d.ts +22 -0
- package/styles/helpers/loadFontCss.d.ts.map +1 -0
- package/styles/helpers/loadFontCss.js +138 -0
- package/styles/helpers/loadThemeCss.d.ts +14 -0
- package/styles/helpers/loadThemeCss.d.ts.map +1 -0
- package/styles/helpers/loadThemeCss.js +123 -0
- package/styles/index.d.ts +1 -1
- package/styles/index.d.ts.map +1 -1
- package/styles/reset/root.js +23 -4
- package/styles/reset/typographyCustomProps.d.ts +12 -0
- package/styles/reset/typographyCustomProps.d.ts.map +1 -0
- package/styles/reset/typographyCustomProps.js +11 -0
- package/styles/theme/createDefaultThemeOptions/index.d.ts +11 -1
- package/styles/theme/createDefaultThemeOptions/index.d.ts.map +1 -1
- package/styles/theme/createDefaultThemeOptions/index.js +129 -10
- package/styles/theme/createTheme/createComponents.types.d.ts +118 -4
- package/styles/theme/createTheme/createComponents.types.d.ts.map +1 -1
- package/styles/theme/createTheme/createComponents.types.js +122 -8
- package/styles/theme/createTheme/createCssVarsForColorSchemeThemes.d.ts.map +1 -1
- package/styles/theme/createTheme/createCssVarsForColorSchemeThemes.js +13 -3
- package/styles/theme/createTheme/createPalette.types.d.ts +5 -0
- package/styles/theme/createTheme/createPalette.types.d.ts.map +1 -1
- package/styles/theme/createTheme/createPalette.types.js +7 -2
- package/styles/theme/createTheme/createShape.d.ts +3 -0
- package/styles/theme/createTheme/createShape.d.ts.map +1 -1
- package/styles/theme/createTheme/createThemeFromColorScheme.d.ts +3 -1
- package/styles/theme/createTheme/createThemeFromColorScheme.d.ts.map +1 -1
- package/styles/theme/createTheme/createThemeFromColorScheme.js +6 -3
- package/styles/theme/createTheme/createTypography.d.ts +4 -2
- package/styles/theme/createTheme/createTypography.js +60 -18
- package/styles/theme/createTheme/helpers/cssVarsParser.d.ts.map +1 -1
- package/styles/theme/createTheme/helpers/cssVarsParser.js +10 -3
- package/styles/theme/createTheme/index.d.ts +2 -1
- package/styles/theme/createTheme/index.d.ts.map +1 -1
- package/styles/theme/createTheme/index.js +3 -1
- package/styles/theme/createTheme/shadows.d.ts +11 -1
- package/styles/theme/createTheme/shadows.d.ts.map +1 -1
- package/styles/theme/createTheme/shadows.js +41 -7
- package/styles/theme/createTheme/types.d.ts +16 -5
- package/styles/theme/createTheme/types.d.ts.map +1 -1
- package/styles/theme/createTheme/types.js +8 -3
- package/styles/theme/hooks/useColorScheme.d.ts +4 -3
- package/styles/theme/hooks/useColorScheme.d.ts.map +1 -1
- package/styles/theme/hooks/useColorScheme.js +4 -3
- package/styles/theme/hooks/useMediaQuery.d.ts +7 -0
- package/styles/theme/hooks/useMediaQuery.d.ts.map +1 -1
- package/styles/theme/hooks/useMediaQuery.js +5 -5
- package/styles/theme/hooks/useTheme.js +1 -1
- package/styles/theme/index.d.ts +4 -1
- package/styles/theme/index.d.ts.map +1 -1
- package/styles/theme/providers/ColorSchemeContext.d.ts +40 -0
- package/styles/theme/providers/ColorSchemeContext.d.ts.map +1 -0
- package/styles/theme/providers/ColorSchemeContext.js +14 -0
- package/styles/theme/providers/ThemeContext.d.ts +3 -0
- package/styles/theme/providers/ThemeContext.d.ts.map +1 -0
- package/styles/theme/providers/ThemeContext.js +2 -0
- package/styles/theme/providers/ThemeProvider.d.ts +3 -13
- package/styles/theme/providers/ThemeProvider.d.ts.map +1 -1
- package/styles/theme/providers/ThemeProvider.js +86 -13
- package/styles/theme/utils/color.d.ts +12 -12
- package/styles/theme/utils/color.d.ts.map +1 -1
- package/tracking/components/CookieConsentModal/index.js +3 -4
- package/tracking/components/PrivacySettings/index.js +3 -3
- package/admin-preview/detection.d.ts.map +0 -1
- package/admin-preview/detection.js +0 -166
- package/cart/components/PaymentBar/PaymentBarReserveButton.connector.js +0 -6
- package/cart/components/PaymentBar/PaymentBarReserveButton.js +0 -71
- package/components/ChipLayout/spec.js +0 -41
- package/components/Logo/spec.js +0 -12
- package/components/NavigationHandler/spec.js +0 -84
- package/components/Picker/spec.js +0 -94
- package/components/PickerUtilize/spec.js +0 -35
- package/components/RangeSlider/spec.js +0 -190
- package/components/SheetList/components/Item/spec.js +0 -101
- package/components/SheetList/spec.js +0 -43
- package/components/TimeBoundary/spec.js +0 -83
- package/filter/components/FilterItem/spec.js +0 -14
- package/filter/components/FilterPageContent/components/ApplyButton/spec.js +0 -46
- package/filter/components/FilterPageContent/components/ResetButton/spec.js +0 -29
- package/filter/components/FilterPageContent/components/Selector/components/Selected/spec.js +0 -26
- package/filter/components/FilterPageContent/components/Selector/components/Toggle/spec.js +0 -34
- package/filter/components/FilterPageContent/components/Selector/components/ValueButton/index.js +0 -69
- package/filter/components/FilterPageContent/components/Selector/components/ValueButton/spec.js +0 -32
- package/filter/components/FilterPageContent/components/Selector/spec.js +0 -33
- package/filter/components/PriceSlider/components/Label/spec.js +0 -26
- package/filter/components/PriceSlider/spec.js +0 -30
- package/locations/components/StoreFinder/StoreFinderGetDirectionsButton.connector.js +0 -16
- package/locations/components/StoreFinder/StoreFinderGetDirectionsButton.js +0 -52
- package/product/collections/index.js +0 -1
- package/product/components/EffectivityDates/constants.d.ts +0 -3
- package/product/components/EffectivityDates/constants.d.ts.map +0 -1
- package/product/components/EffectivityDates/helpers.d.ts +0 -6
- package/product/components/EffectivityDates/helpers.d.ts.map +0 -1
- package/product/components/FilterBar/components/Content/components/FilterChips/connector.js +0 -22
- package/product/components/FilterBar/components/Content/spec.js +0 -136
- package/product/components/Header/Shipping/spec.js +0 -36
- package/product/components/Header/Tiers/components/Tier/spec.js +0 -48
- package/product/components/Header/Tiers/spec.js +0 -64
- package/product/components/Media/helpers.d.ts +0 -2
- package/product/components/Media/helpers.d.ts.map +0 -1
- package/product/components/Options/components/Content/spec.js +0 -73
- package/product/components/Options/components/TextOption/components/OptionInfo/spec.js +0 -72
- package/product/components/ProductDiscountBadge/spec.js +0 -58
- package/product/components/ProductGrid/components/Item/components/ItemDetails/spec.js +0 -73
- package/product/components/ProductGrid/components/Item/components/ItemFavoritesButton/spec.js +0 -33
- package/product/components/ProductGrid/components/Item/components/ItemImage/spec.js +0 -16
- package/product/components/ProductGrid/components/Item/components/ItemName/spec.js +0 -21
- package/product/components/ProductGrid/components/Item/components/ItemPrice/spec.js +0 -37
- package/product/components/ProductGrid/spec.js +0 -52
- package/product/components/ProductImage/connector.js +0 -12
- package/product/components/ProductImage/spec.js +0 -87
- package/product/components/ProductSlider/spec.js +0 -37
- package/product/components/Rating/connector.js +0 -26
- package/product/components/Rating/spec.js +0 -58
- package/product/helpers/index.d.ts +0 -13
- package/product/helpers/index.d.ts.map +0 -1
- package/product/helpers/redirects.d.ts +0 -2
- package/product/helpers/redirects.d.ts.map +0 -1
- package/product/selectors/helpers/filterProperties.d.ts +0 -8
- package/product/selectors/helpers/filterProperties.d.ts.map +0 -1
- package/product/selectors/helpers/index.d.ts +0 -3
- package/product/selectors/helpers/index.d.ts.map +0 -1
- package/product/selectors/helpers/wrapMemoizedSelector.d.ts +0 -2
- package/product/selectors/helpers/wrapMemoizedSelector.d.ts.map +0 -1
- package/product/selectors/product.d.ts +0 -112
- package/product/selectors/product.d.ts.map +0 -1
- package/reviews/components/Reviews/components/Header/components/WriteReviewLink/spec.js +0 -52
- package/reviews/components/Reviews/components/Header/spec.js +0 -78
- package/reviews/components/Reviews/components/List/spec.js +0 -108
- package/reviews/components/Reviews/components/RatingCount/spec.js +0 -38
- package/reviews/components/Reviews/spec.js +0 -101
- package/tsconfig.build.json +0 -26
- package/tsconfig.json +0 -19
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import "core-js/modules/es.array.includes.js";
|
|
2
|
+
/**
|
|
3
|
+
* Internal to the admin-preview package - do not import this module from anywhere else. Consume
|
|
4
|
+
* the isAdminPreviewActive / isPageAdminPreviewActive / isFrontendSettingsAdminPreviewActive
|
|
5
|
+
* helpers from @shopgate/engage/admin-preview/helpers instead.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { PAGE_PREVIEW_PATTERN } from "../../constants";
|
|
9
|
+
export const FRONTEND_SETTINGS_PREVIEW_PARAM = 'frontendSettingsPreview=true';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The url as it was when this module was first evaluated. Captured here because detection can run
|
|
13
|
+
* again later, when the url may already have been rewritten.
|
|
14
|
+
*/
|
|
15
|
+
const INITIAL_HREF = window.location.href;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Preview mode is latched in memory rather than persisted. Session storage is scoped per origin
|
|
19
|
+
* per tab, not per iframe - the admin shows the preview in same-origin iframes on several screens
|
|
20
|
+
* within one tab, so a persisted flag from one screen would leak into the next. Module state is
|
|
21
|
+
* per document, so each iframe gets its own.
|
|
22
|
+
*
|
|
23
|
+
* The latches only ever go false -> true. Detection must not fall back to re-reading the url,
|
|
24
|
+
* because the frontend settings preview navigates the app normally: once the admin opens another
|
|
25
|
+
* page, the query param is gone from the url even though preview mode is still on.
|
|
26
|
+
*/
|
|
27
|
+
let pageAdminPreviewLatched = false;
|
|
28
|
+
let frontendSettingsAdminPreviewLatched = false;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Detects whether the app is in page admin preview mode. Once detected, the result is latched for
|
|
32
|
+
* the lifetime of the document, because the url is not guaranteed to keep the preview marker.
|
|
33
|
+
* @returns True if the app is in page admin preview mode, false otherwise.
|
|
34
|
+
*/
|
|
35
|
+
export const detectPageAdminPreview = () => {
|
|
36
|
+
if (pageAdminPreviewLatched) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
pageAdminPreviewLatched = window.location.pathname.startsWith(PAGE_PREVIEW_PATTERN);
|
|
40
|
+
return pageAdminPreviewLatched;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Detects whether the app is in frontend settings admin preview mode. Once detected, the result is
|
|
45
|
+
* latched for the lifetime of the document, because the app keeps navigating while the preview is
|
|
46
|
+
* open and the query param only exists on the url it started on.
|
|
47
|
+
* @returns True if the app is in frontend settings admin preview mode, false otherwise.
|
|
48
|
+
*/
|
|
49
|
+
export const detectFrontendSettingsAdminPreview = () => {
|
|
50
|
+
if (frontendSettingsAdminPreviewLatched) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
frontendSettingsAdminPreviewLatched = window.location.search.includes(FRONTEND_SETTINGS_PREVIEW_PARAM);
|
|
54
|
+
return frontendSettingsAdminPreviewLatched;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Detects whether the app is in admin preview mode (pages or frontend settings).
|
|
59
|
+
* @returns True if the app is in admin preview mode, false otherwise.
|
|
60
|
+
*/
|
|
61
|
+
export const detectAdminPreview = () => detectPageAdminPreview() || detectFrontendSettingsAdminPreview();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns the current detection state. Exposed on window as SGAdminPreviewDebug so the values can
|
|
65
|
+
* be inspected on a deployed build, from the console of the preview iframe:
|
|
66
|
+
*
|
|
67
|
+
* window.SGAdminPreviewDebug()
|
|
68
|
+
*
|
|
69
|
+
* Compare initialHref with currentHref to see whether the url changed since the app booted, and
|
|
70
|
+
* check latched to see whether a result came from the latch rather than the current url.
|
|
71
|
+
* @returns A snapshot of everything detection depends on.
|
|
72
|
+
*/
|
|
73
|
+
export const getAdminPreviewDebugInfo = () => ({
|
|
74
|
+
initialHref: INITIAL_HREF,
|
|
75
|
+
currentHref: window.location.href,
|
|
76
|
+
pathname: window.location.pathname,
|
|
77
|
+
search: window.location.search,
|
|
78
|
+
urlChangedSinceBoot: INITIAL_HREF !== window.location.href,
|
|
79
|
+
isInIframe: window.parent !== window,
|
|
80
|
+
referrer: document.referrer,
|
|
81
|
+
latched: {
|
|
82
|
+
page: pageAdminPreviewLatched,
|
|
83
|
+
frontendSettings: frontendSettingsAdminPreviewLatched
|
|
84
|
+
},
|
|
85
|
+
detected: {
|
|
86
|
+
page: detectPageAdminPreview(),
|
|
87
|
+
frontendSettings: detectFrontendSettingsAdminPreview(),
|
|
88
|
+
any: detectAdminPreview()
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// @ts-expect-error - debug-only global, intentionally not on the Window type.
|
|
93
|
+
window.SGAdminPreviewDebug = getAdminPreviewDebugInfo;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal to the admin-preview package - do not import this module from anywhere else. Consume
|
|
3
|
+
* the isAllowedOrigin / getReferrerOrigin helpers from @shopgate/engage/admin-preview/helpers
|
|
4
|
+
* instead.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Checks if an origin is covered by a list of allowed origin patterns.
|
|
8
|
+
* @param origin The origin to check e.g. "https://app.shopgate.com".
|
|
9
|
+
* @param patterns The allowed origin patterns.
|
|
10
|
+
* @returns Whether the origin is allowed.
|
|
11
|
+
*/
|
|
12
|
+
export declare const matchesAllowedOrigin: (origin: string | null | undefined, patterns?: string[]) => origin is string;
|
|
13
|
+
/**
|
|
14
|
+
* Determines the origin of the document that embeds the current page. Since allowed origins can be
|
|
15
|
+
* patterns, and patterns are no valid postMessage targets, this is the only way to address a parent
|
|
16
|
+
* that has not sent a message yet.
|
|
17
|
+
* @returns The referrer origin, or null when it can't be determined.
|
|
18
|
+
*/
|
|
19
|
+
export declare const readReferrerOrigin: () => string | null;
|
|
20
|
+
//# sourceMappingURL=origins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origins.d.ts","sourceRoot":"","sources":["../../../../admin-preview/helpers/_internal/origins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,WAAU,MAAM,EAAO,KACtB,MAAM,IAAI,MAwBZ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAAM,GAAG,IAM9C,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import "core-js/modules/es.array.includes.js";
|
|
2
|
+
import "core-js/modules/es.string.replace.js";
|
|
3
|
+
import "core-js/modules/web.url.js";
|
|
4
|
+
import "core-js/modules/web.url.to-json.js";
|
|
5
|
+
import "core-js/modules/web.url-search-params.js";
|
|
6
|
+
/**
|
|
7
|
+
* Internal to the admin-preview package - do not import this module from anywhere else. Consume
|
|
8
|
+
* the isAllowedOrigin / getReferrerOrigin helpers from @shopgate/engage/admin-preview/helpers
|
|
9
|
+
* instead.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Regular expression source that a "*" within an allowed origin pattern is replaced with. It
|
|
14
|
+
* matches one or more domain labels, but never a dot at the very end, so that the suffix of the
|
|
15
|
+
* pattern stays anchored to the end of the origin.
|
|
16
|
+
*/
|
|
17
|
+
const ORIGIN_WILDCARD_SOURCE = '(?:[a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+';
|
|
18
|
+
|
|
19
|
+
// Cache for regular expressions that were already created from an origin pattern.
|
|
20
|
+
const originPatternCache = new Map();
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Converts an allowed origin pattern into an anchored regular expression. Every character except
|
|
24
|
+
* the "*" wildcard is matched literally.
|
|
25
|
+
* @param pattern The origin pattern e.g. "https://*.shopgate.com".
|
|
26
|
+
* @returns The regular expression for the pattern.
|
|
27
|
+
*/
|
|
28
|
+
const createOriginRegExp = pattern => {
|
|
29
|
+
const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
30
|
+
return new RegExp(`^${escaped.split('\\*').join(ORIGIN_WILDCARD_SOURCE)}$`);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Checks if an origin is covered by a list of allowed origin patterns.
|
|
35
|
+
* @param origin The origin to check e.g. "https://app.shopgate.com".
|
|
36
|
+
* @param patterns The allowed origin patterns.
|
|
37
|
+
* @returns Whether the origin is allowed.
|
|
38
|
+
*/
|
|
39
|
+
export const matchesAllowedOrigin = (origin, patterns = []) => {
|
|
40
|
+
// Opaque origins are serialized as "null" and must never be trusted.
|
|
41
|
+
if (typeof origin !== 'string' || origin === '' || origin === 'null') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return patterns.some(pattern => {
|
|
45
|
+
if (typeof pattern !== 'string' || pattern === '') {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (!pattern.includes('*')) {
|
|
49
|
+
return pattern === origin;
|
|
50
|
+
}
|
|
51
|
+
let regExp = originPatternCache.get(pattern);
|
|
52
|
+
if (!regExp) {
|
|
53
|
+
regExp = createOriginRegExp(pattern);
|
|
54
|
+
originPatternCache.set(pattern, regExp);
|
|
55
|
+
}
|
|
56
|
+
return regExp.test(origin);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Determines the origin of the document that embeds the current page. Since allowed origins can be
|
|
62
|
+
* patterns, and patterns are no valid postMessage targets, this is the only way to address a parent
|
|
63
|
+
* that has not sent a message yet.
|
|
64
|
+
* @returns The referrer origin, or null when it can't be determined.
|
|
65
|
+
*/
|
|
66
|
+
export const readReferrerOrigin = () => {
|
|
67
|
+
try {
|
|
68
|
+
return new URL(document.referrer).origin;
|
|
69
|
+
} catch (e) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
@@ -13,4 +13,24 @@ export declare const isPageAdminPreviewActive: () => boolean;
|
|
|
13
13
|
* @returns True if the app is in frontend settings admin preview mode, false otherwise.
|
|
14
14
|
*/
|
|
15
15
|
export declare const isFrontendSettingsAdminPreviewActive: () => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Checks if navigation is blocked. Page admin preview renders a single page in an iframe, so
|
|
18
|
+
* leaving that page would only ever show the admin something it did not ask to preview.
|
|
19
|
+
* Frontend settings preview is not affected - it previews styling on the regular app.
|
|
20
|
+
* @returns True if the app must not navigate, false otherwise.
|
|
21
|
+
*/
|
|
22
|
+
export declare const isNavigationBlocked: () => boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Checks if an origin is covered by a list of allowed origin patterns. See
|
|
25
|
+
* ALLOWED_ADMIN_PREVIEW_ORIGINS for details about the supported wildcard syntax.
|
|
26
|
+
* @param origin The origin to check e.g. "https://app.shopgate.com".
|
|
27
|
+
* @param patterns The allowed origin patterns.
|
|
28
|
+
* @returns Whether the origin is allowed.
|
|
29
|
+
*/
|
|
30
|
+
export declare const isAllowedOrigin: (origin: string | null | undefined, patterns?: string[]) => origin is string;
|
|
31
|
+
/**
|
|
32
|
+
* Determines the origin of the document that embeds the current page.
|
|
33
|
+
* @returns The referrer origin, or null when it can't be determined.
|
|
34
|
+
*/
|
|
35
|
+
export declare const getReferrerOrigin: () => string | null;
|
|
16
36
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../admin-preview/helpers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../admin-preview/helpers/index.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAO,OAClB,CAAC;AAEvB;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAO,OAClB,CAAC;AAE3B;;;GAGG;AACH,eAAO,MAAM,oCAAoC,QAAO,OAClB,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAO,OACX,CAAC;AAE7B;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,WAAU,MAAM,EAAO,KACtB,MAAM,IAAI,MAAgD,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAO,MAAM,GAAG,IAA4B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { detectAdminPreview, detectFrontendSettingsAdminPreview, detectPageAdminPreview } from "
|
|
1
|
+
import { detectAdminPreview, detectFrontendSettingsAdminPreview, detectPageAdminPreview } from "./_internal/detection";
|
|
2
|
+
import { matchesAllowedOrigin, readReferrerOrigin } from "./_internal/origins";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Checks if the app is currently in admin preview mode (pages or frontend settings).
|
|
@@ -16,4 +17,27 @@ export const isPageAdminPreviewActive = () => detectPageAdminPreview();
|
|
|
16
17
|
* Checks if the app is currently in frontend settings admin preview mode.
|
|
17
18
|
* @returns True if the app is in frontend settings admin preview mode, false otherwise.
|
|
18
19
|
*/
|
|
19
|
-
export const isFrontendSettingsAdminPreviewActive = () => detectFrontendSettingsAdminPreview();
|
|
20
|
+
export const isFrontendSettingsAdminPreviewActive = () => detectFrontendSettingsAdminPreview();
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Checks if navigation is blocked. Page admin preview renders a single page in an iframe, so
|
|
24
|
+
* leaving that page would only ever show the admin something it did not ask to preview.
|
|
25
|
+
* Frontend settings preview is not affected - it previews styling on the regular app.
|
|
26
|
+
* @returns True if the app must not navigate, false otherwise.
|
|
27
|
+
*/
|
|
28
|
+
export const isNavigationBlocked = () => isPageAdminPreviewActive();
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Checks if an origin is covered by a list of allowed origin patterns. See
|
|
32
|
+
* ALLOWED_ADMIN_PREVIEW_ORIGINS for details about the supported wildcard syntax.
|
|
33
|
+
* @param origin The origin to check e.g. "https://app.shopgate.com".
|
|
34
|
+
* @param patterns The allowed origin patterns.
|
|
35
|
+
* @returns Whether the origin is allowed.
|
|
36
|
+
*/
|
|
37
|
+
export const isAllowedOrigin = (origin, patterns = []) => matchesAllowedOrigin(origin, patterns);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Determines the origin of the document that embeds the current page.
|
|
41
|
+
* @returns The referrer origin, or null when it can't be determined.
|
|
42
|
+
*/
|
|
43
|
+
export const getReferrerOrigin = () => readReferrerOrigin();
|
|
@@ -13,24 +13,26 @@ export interface IframeMessengerResult<TMessage extends MessageData = MessageDat
|
|
|
13
13
|
/**
|
|
14
14
|
* Send data up to window.parent.
|
|
15
15
|
* If targetOrigin is omitted, uses the most recently seen origin
|
|
16
|
-
* (from an incoming message)
|
|
17
|
-
*
|
|
16
|
+
* (from an incoming message), otherwise the origin derived from document.referrer.
|
|
17
|
+
* Nothing is sent when neither of them is covered by parentOrigins.
|
|
18
18
|
*/
|
|
19
19
|
sendToParent: (data: TMessage, targetOrigin?: string) => void;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
22
|
* Hook for postMessage communication when your component is inside an iframe.
|
|
23
23
|
*
|
|
24
|
-
* Listens on window for "message" events
|
|
25
|
-
*
|
|
24
|
+
* Listens on window for "message" events, and only calls onMessage(data, rawEvent) if the origin
|
|
25
|
+
* of the event is covered by parentOrigins and the message came from window.parent.
|
|
26
26
|
*
|
|
27
27
|
* @param onMessage Callback invoked when a trusted message arrives.
|
|
28
28
|
* Receives data and the raw event so consumers can inspect origin, source,
|
|
29
29
|
* and other metadata when needed.
|
|
30
|
-
* @param parentOrigins Array of allowed parent origin
|
|
31
|
-
* ['https://a.example.com', 'https
|
|
30
|
+
* @param parentOrigins Array of allowed parent origin patterns, e.g.
|
|
31
|
+
* ['https://a.example.com', 'https://*.example.com']. See ALLOWED_ADMIN_PREVIEW_ORIGINS for
|
|
32
|
+
* details about the supported wildcard syntax.
|
|
33
|
+
* @param enabled Whether the message listener is supposed to be attached.
|
|
32
34
|
* @returns An object with a single method:
|
|
33
35
|
* sendToParent(data, [targetOrigin]) to post data to the parent window.
|
|
34
36
|
*/
|
|
35
|
-
export declare function useIframeMessenger<TMessage extends MessageData = MessageData>(onMessage: OnIframeMessage<TMessage>, parentOrigins: string[]): IframeMessengerResult<TMessage>;
|
|
37
|
+
export declare function useIframeMessenger<TMessage extends MessageData = MessageData>(onMessage: OnIframeMessage<TMessage>, parentOrigins: string[], enabled?: boolean): IframeMessengerResult<TMessage>;
|
|
36
38
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../admin-preview/hooks/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../admin-preview/hooks/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,CAAC,QAAQ,SAAS,WAAW,GAAG,WAAW,IAAI,CACxE,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,KAC7B,IAAI,CAAC;AAEV,MAAM,WAAW,qBAAqB,CAAC,QAAQ,SAAS,WAAW,GAAG,WAAW;IAC/E;;;;;OAKG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAC3E,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,EACpC,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,UAAO,GACb,qBAAqB,CAAC,QAAQ,CAAC,CAkEjC"}
|
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import "core-js/modules/es.array.includes.js";
|
|
2
|
-
import "core-js/modules/web.url.js";
|
|
3
|
-
import "core-js/modules/web.url.to-json.js";
|
|
4
|
-
import "core-js/modules/web.url-search-params.js";
|
|
5
1
|
import { useCallback, useEffect, useRef } from 'react';
|
|
6
2
|
import { logger } from '@shopgate/engage/core/helpers';
|
|
3
|
+
import { getReferrerOrigin, isAllowedOrigin } from "../helpers";
|
|
7
4
|
/**
|
|
8
5
|
* Hook for postMessage communication when your component is inside an iframe.
|
|
9
6
|
*
|
|
10
|
-
* Listens on window for "message" events
|
|
11
|
-
*
|
|
7
|
+
* Listens on window for "message" events, and only calls onMessage(data, rawEvent) if the origin
|
|
8
|
+
* of the event is covered by parentOrigins and the message came from window.parent.
|
|
12
9
|
*
|
|
13
10
|
* @param onMessage Callback invoked when a trusted message arrives.
|
|
14
11
|
* Receives data and the raw event so consumers can inspect origin, source,
|
|
15
12
|
* and other metadata when needed.
|
|
16
|
-
* @param parentOrigins Array of allowed parent origin
|
|
17
|
-
* ['https://a.example.com', 'https
|
|
13
|
+
* @param parentOrigins Array of allowed parent origin patterns, e.g.
|
|
14
|
+
* ['https://a.example.com', 'https://*.example.com']. See ALLOWED_ADMIN_PREVIEW_ORIGINS for
|
|
15
|
+
* details about the supported wildcard syntax.
|
|
16
|
+
* @param enabled Whether the message listener is supposed to be attached.
|
|
18
17
|
* @returns An object with a single method:
|
|
19
18
|
* sendToParent(data, [targetOrigin]) to post data to the parent window.
|
|
20
19
|
*/
|
|
21
|
-
export function useIframeMessenger(onMessage, parentOrigins) {
|
|
20
|
+
export function useIframeMessenger(onMessage, parentOrigins, enabled = true) {
|
|
22
21
|
// Keep a ref to the latest onMessage callback so the listener always has it.
|
|
23
22
|
const onMessageRef = useRef(onMessage);
|
|
24
23
|
useEffect(() => {
|
|
@@ -31,15 +30,15 @@ export function useIframeMessenger(onMessage, parentOrigins) {
|
|
|
31
30
|
/**
|
|
32
31
|
* Send a message up to the parent window.
|
|
33
32
|
* @param data - The data object to post.
|
|
34
|
-
* @param targetOrigin Optional override for the origin to post to.
|
|
35
|
-
* If omitted, uses the last seen origin, then referrer origin
|
|
36
|
-
* then parentOrigins[0], then "*".
|
|
33
|
+
* @param targetOrigin Optional override for the origin to post to. Must be covered by
|
|
34
|
+
* parentOrigins. If omitted, uses the last seen origin, then the referrer origin.
|
|
37
35
|
*/
|
|
38
36
|
const sendToParent = useCallback((data, targetOrigin) => {
|
|
39
|
-
// Determine which origin to use: explicit, then last seen, then
|
|
40
|
-
|
|
37
|
+
// Determine which origin to use: explicit, then last seen, then the embedding document.
|
|
38
|
+
// Patterns are no valid postMessage targets, so an unresolved origin aborts the send.
|
|
39
|
+
const originToUse = [targetOrigin, lastOriginRef.current, getReferrerOrigin()].find(origin => isAllowedOrigin(origin, parentOrigins));
|
|
41
40
|
if (!originToUse) {
|
|
42
|
-
logger.warn('useIframeMessenger: no targetOrigin available. ' + 'Provide parentOrigins or pass targetOrigin.');
|
|
41
|
+
logger.warn('useIframeMessenger: no allowed targetOrigin available. ' + 'Provide parentOrigins or pass an allowed targetOrigin.');
|
|
43
42
|
return;
|
|
44
43
|
}
|
|
45
44
|
window.parent.postMessage(data, originToUse);
|
|
@@ -47,13 +46,17 @@ export function useIframeMessenger(onMessage, parentOrigins) {
|
|
|
47
46
|
|
|
48
47
|
// Attach / detach the "message" listener.
|
|
49
48
|
useEffect(() => {
|
|
49
|
+
if (!enabled) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
50
53
|
/**
|
|
51
54
|
* Handler for incoming postMessage events.
|
|
52
55
|
* @param rawEvent The original MessageEvent object.
|
|
53
56
|
*/
|
|
54
57
|
function handler(rawEvent) {
|
|
55
|
-
// Only proceed if the origin is
|
|
56
|
-
if (!
|
|
58
|
+
// Only proceed if the origin is covered by our whitelist.
|
|
59
|
+
if (!isAllowedOrigin(rawEvent.origin, parentOrigins)) return;
|
|
57
60
|
// Ensure the message actually came from window.parent.
|
|
58
61
|
if (rawEvent.source !== window.parent) return;
|
|
59
62
|
|
|
@@ -67,7 +70,7 @@ export function useIframeMessenger(onMessage, parentOrigins) {
|
|
|
67
70
|
return () => {
|
|
68
71
|
window.removeEventListener('message', handler);
|
|
69
72
|
};
|
|
70
|
-
}, [
|
|
73
|
+
}, [enabled, parentOrigins]);
|
|
71
74
|
return {
|
|
72
75
|
sendToParent
|
|
73
76
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal to the admin-preview package - do not import this module from anywhere else.
|
|
3
|
+
*
|
|
4
|
+
* Hands the payload that `awaitInitialFrontendSettings` received over to the
|
|
5
|
+
* FrontendSettingsPreviewBridge, which mounts long after app start finished. Module state rather
|
|
6
|
+
* than a store slice, because the styling map never belongs in redux - it is applied to a style
|
|
7
|
+
* tag, and the bridge only needs it to avoid removing what app start already applied.
|
|
8
|
+
*/
|
|
9
|
+
import type { FrontendSettingsStyling } from '../../components/FrontendSettingsPreviewBridge/types';
|
|
10
|
+
/**
|
|
11
|
+
* Records the payload that app start received.
|
|
12
|
+
* @param initialStyling The styling map the payload carried, if any.
|
|
13
|
+
*/
|
|
14
|
+
export declare const setInitialFrontendSettings: (initialStyling: FrontendSettingsStyling | null) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Whether app start received a payload. A payload without a styling map still counts - it
|
|
17
|
+
* carried app settings, which is enough to consider the preview applied.
|
|
18
|
+
* @returns True when a payload arrived during app start.
|
|
19
|
+
*/
|
|
20
|
+
export declare const hasInitialFrontendSettings: () => boolean;
|
|
21
|
+
/**
|
|
22
|
+
* The styling map that app start applied, so the bridge can seed its state with it instead of
|
|
23
|
+
* starting at null - which would make its first effect remove the style tag again.
|
|
24
|
+
* @returns The styling map, or null when none arrived.
|
|
25
|
+
*/
|
|
26
|
+
export declare const getInitialFrontendSettingsStyling: () => FrontendSettingsStyling | null;
|
|
27
|
+
/**
|
|
28
|
+
* Test only. Module state outlives a test file's individual cases, so specs need a way back to the
|
|
29
|
+
* initial state.
|
|
30
|
+
*/
|
|
31
|
+
export declare const resetInitialFrontendSettings: () => void;
|
|
32
|
+
//# sourceMappingURL=initialFrontendSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initialFrontendSettings.d.ts","sourceRoot":"","sources":["../../../../admin-preview/initialization/_internal/initialFrontendSettings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sDAAsD,CAAC;AAMpG;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,gBAAgB,uBAAuB,GAAG,IAAI,SAGxF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAO,OAAmB,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,QAAO,uBAAuB,GAAG,IAAe,CAAC;AAE/F;;;GAGG;AACH,eAAO,MAAM,4BAA4B,YAGxC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal to the admin-preview package - do not import this module from anywhere else.
|
|
3
|
+
*
|
|
4
|
+
* Hands the payload that `awaitInitialFrontendSettings` received over to the
|
|
5
|
+
* FrontendSettingsPreviewBridge, which mounts long after app start finished. Module state rather
|
|
6
|
+
* than a store slice, because the styling map never belongs in redux - it is applied to a style
|
|
7
|
+
* tag, and the bridge only needs it to avoid removing what app start already applied.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
let received = false;
|
|
11
|
+
let styling = null;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Records the payload that app start received.
|
|
15
|
+
* @param initialStyling The styling map the payload carried, if any.
|
|
16
|
+
*/
|
|
17
|
+
export const setInitialFrontendSettings = initialStyling => {
|
|
18
|
+
received = true;
|
|
19
|
+
styling = initialStyling;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Whether app start received a payload. A payload without a styling map still counts - it
|
|
24
|
+
* carried app settings, which is enough to consider the preview applied.
|
|
25
|
+
* @returns True when a payload arrived during app start.
|
|
26
|
+
*/
|
|
27
|
+
export const hasInitialFrontendSettings = () => received;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The styling map that app start applied, so the bridge can seed its state with it instead of
|
|
31
|
+
* starting at null - which would make its first effect remove the style tag again.
|
|
32
|
+
* @returns The styling map, or null when none arrived.
|
|
33
|
+
*/
|
|
34
|
+
export const getInitialFrontendSettingsStyling = () => styling;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Test only. Module state outlives a test file's individual cases, so specs need a way back to the
|
|
38
|
+
* initial state.
|
|
39
|
+
*/
|
|
40
|
+
export const resetInitialFrontendSettings = () => {
|
|
41
|
+
received = false;
|
|
42
|
+
styling = null;
|
|
43
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface PreviewStore {
|
|
2
|
+
dispatch: (action: unknown) => void;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Waits for the first settings message from the admin and applies it before the app renders.
|
|
6
|
+
*
|
|
7
|
+
* Without this the app paints with the theme defaults first: the bridge that owns the message
|
|
8
|
+
* listener only mounts once React committed, so everything the admin sent before that is dropped
|
|
9
|
+
* and the styling arrives as a visible restyle.
|
|
10
|
+
*
|
|
11
|
+
* The handshake goes to the origin of the embedding document. Nothing has been received at this
|
|
12
|
+
* point, so that referrer is the only concrete parent origin available - the allow list holds
|
|
13
|
+
* patterns, and a pattern is no valid postMessage target. An admin that strips its referrer
|
|
14
|
+
* therefore gets no ready message, and the app falls back to the timeout below.
|
|
15
|
+
*
|
|
16
|
+
* Resolves when the payload arrived or when REQUEST_TIMEOUT elapsed, and never rejects - an admin
|
|
17
|
+
* that stays silent has to fall back to the unstyled app, never to an iframe that never renders.
|
|
18
|
+
* @param store Reference to the store.
|
|
19
|
+
* @returns A promise that resolves once the first payload settled.
|
|
20
|
+
*/
|
|
21
|
+
export declare const awaitInitialFrontendSettings: (store: PreviewStore) => Promise<void>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=awaitInitialFrontendSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awaitInitialFrontendSettings.d.ts","sourceRoot":"","sources":["../../../admin-preview/initialization/awaitInitialFrontendSettings.ts"],"names":[],"mappings":"AAuBA,UAAU,YAAY;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,4BAA4B,GAAI,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAyE3E,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { withScope, captureMessage, Severity as SentrySeverity } from '@sentry/browser';
|
|
2
|
+
import { receiveAppSettings } from '@shopgate/engage/settings/action-creators/appSettings';
|
|
3
|
+
import { getReferrerOrigin, isAllowedOrigin, isFrontendSettingsAdminPreviewActive } from "../helpers";
|
|
4
|
+
import { ALLOWED_ADMIN_PREVIEW_ORIGINS } from "../constants";
|
|
5
|
+
import { getOrCreateStyleTag, serializeStyling } from "../components/FrontendSettingsPreviewBridge/helpers";
|
|
6
|
+
import { setInitialFrontendSettings } from "./_internal/initialFrontendSettings";
|
|
7
|
+
const REQUEST_TIMEOUT = 3000;
|
|
8
|
+
/**
|
|
9
|
+
* Waits for the first settings message from the admin and applies it before the app renders.
|
|
10
|
+
*
|
|
11
|
+
* Without this the app paints with the theme defaults first: the bridge that owns the message
|
|
12
|
+
* listener only mounts once React committed, so everything the admin sent before that is dropped
|
|
13
|
+
* and the styling arrives as a visible restyle.
|
|
14
|
+
*
|
|
15
|
+
* The handshake goes to the origin of the embedding document. Nothing has been received at this
|
|
16
|
+
* point, so that referrer is the only concrete parent origin available - the allow list holds
|
|
17
|
+
* patterns, and a pattern is no valid postMessage target. An admin that strips its referrer
|
|
18
|
+
* therefore gets no ready message, and the app falls back to the timeout below.
|
|
19
|
+
*
|
|
20
|
+
* Resolves when the payload arrived or when REQUEST_TIMEOUT elapsed, and never rejects - an admin
|
|
21
|
+
* that stays silent has to fall back to the unstyled app, never to an iframe that never renders.
|
|
22
|
+
* @param store Reference to the store.
|
|
23
|
+
* @returns A promise that resolves once the first payload settled.
|
|
24
|
+
*/
|
|
25
|
+
export const awaitInitialFrontendSettings = store => new Promise(resolve => {
|
|
26
|
+
if (!isFrontendSettingsAdminPreviewActive()) {
|
|
27
|
+
resolve();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let settled = false;
|
|
31
|
+
let timeout;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Resolves the promise once, whichever of payload / timeout comes first, and stops listening.
|
|
35
|
+
* The bridge attaches its own listener when it mounts and re-sends the handshake, so the admin
|
|
36
|
+
* resyncs from there.
|
|
37
|
+
*/
|
|
38
|
+
const settle = () => {
|
|
39
|
+
if (settled) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
settled = true;
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
window.removeEventListener('message', handleMessage);
|
|
45
|
+
resolve();
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Handles the first trusted message. A function declaration, so `settle` can detach it again
|
|
50
|
+
* without a forward reference.
|
|
51
|
+
* @param event The message event.
|
|
52
|
+
*/
|
|
53
|
+
function handleMessage(event) {
|
|
54
|
+
if (!isAllowedOrigin(event.origin, ALLOWED_ADMIN_PREVIEW_ORIGINS)) return;
|
|
55
|
+
if (event.source !== window.parent) return;
|
|
56
|
+
const {
|
|
57
|
+
data
|
|
58
|
+
} = event;
|
|
59
|
+
if (data?.type !== 'receiveFrontendSettings') return;
|
|
60
|
+
const styling = data.payload?.styling ?? null;
|
|
61
|
+
if (styling) {
|
|
62
|
+
getOrCreateStyleTag().textContent = serializeStyling(styling);
|
|
63
|
+
}
|
|
64
|
+
if (data.payload?.appSettings) {
|
|
65
|
+
store.dispatch(receiveAppSettings(data.payload.appSettings));
|
|
66
|
+
}
|
|
67
|
+
setInitialFrontendSettings(styling);
|
|
68
|
+
settle();
|
|
69
|
+
}
|
|
70
|
+
window.addEventListener('message', handleMessage);
|
|
71
|
+
timeout = setTimeout(() => {
|
|
72
|
+
withScope(scope => {
|
|
73
|
+
scope.setLevel(SentrySeverity.Warning);
|
|
74
|
+
scope.setExtra('timeout', REQUEST_TIMEOUT);
|
|
75
|
+
captureMessage('Waiting for the initial frontend settings took too long');
|
|
76
|
+
});
|
|
77
|
+
settle();
|
|
78
|
+
}, REQUEST_TIMEOUT);
|
|
79
|
+
|
|
80
|
+
// Allowed origins can be patterns, which are no valid postMessage targets, so the ready
|
|
81
|
+
// message goes to the document that embedded us - as long as it is an allowed origin.
|
|
82
|
+
const parentOrigin = getReferrerOrigin();
|
|
83
|
+
if (isAllowedOrigin(parentOrigin, ALLOWED_ADMIN_PREVIEW_ORIGINS)) {
|
|
84
|
+
window.parent.postMessage({
|
|
85
|
+
type: 'frontendSettingsPreviewReady'
|
|
86
|
+
}, parentOrigin);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import React, { useCallback } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { makeStyles } from '@shopgate/engage/styles';
|
|
4
|
-
import { Link, CheckedIcon,
|
|
4
|
+
import { Link, CheckedIcon, NotificationIcon, Typography } from '@shopgate/engage/components';
|
|
5
|
+
import { Button } from '@shopgate/engage/components/v2';
|
|
5
6
|
import { BACK_IN_STOCK_PATTERN } from '@shopgate/engage/back-in-stock/constants';
|
|
6
7
|
import { i18n } from '@shopgate/engage/core/helpers';
|
|
7
8
|
import connect from "./connector";
|
|
8
9
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
10
|
const useStyles = makeStyles()(theme => ({
|
|
10
11
|
button: {
|
|
11
|
-
color: theme.palette.warning.main
|
|
12
|
-
width: '100%'
|
|
12
|
+
color: theme.palette.warning.main
|
|
13
13
|
},
|
|
14
14
|
backInStockMessageContainer: {
|
|
15
15
|
display: 'flex',
|
|
@@ -114,10 +114,10 @@ const BackInStockButton = ({
|
|
|
114
114
|
}
|
|
115
115
|
if (showAsButton) {
|
|
116
116
|
return /*#__PURE__*/_jsx(Button, {
|
|
117
|
-
|
|
117
|
+
color: "secondary",
|
|
118
|
+
fullWidth: true,
|
|
118
119
|
tabIndex: 0,
|
|
119
120
|
onClick: handleClick,
|
|
120
|
-
className: classes.button,
|
|
121
121
|
children: /*#__PURE__*/_jsx("span", {
|
|
122
122
|
className: classes.buttonText,
|
|
123
123
|
children: i18n.text('back_in_stock.get_notified')
|
|
@@ -4,7 +4,7 @@ import { makeStyles } from '@shopgate/engage/styles';
|
|
|
4
4
|
import { getProductRoute, ProductImage } from '@shopgate/engage/product';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import { BackInStockButton } from '@shopgate/engage/back-in-stock/components';
|
|
7
|
-
import {
|
|
7
|
+
import { i18n } from '@shopgate/engage/core';
|
|
8
8
|
import { useBackInStockSubscriptions } from '@shopgate/engage/back-in-stock/hooks';
|
|
9
9
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
10
|
const useStyles = makeStyles()(theme => ({
|
|
@@ -77,9 +77,6 @@ const Subscription = ({
|
|
|
77
77
|
const {
|
|
78
78
|
removeBackInStockSubscription
|
|
79
79
|
} = useBackInStockSubscriptions();
|
|
80
|
-
const {
|
|
81
|
-
ListImage: gridResolutions
|
|
82
|
-
} = getThemeSettings('AppImages') || {};
|
|
83
80
|
const currency = product.price?.currency || 'EUR';
|
|
84
81
|
const defaultPrice = product.price?.unitPrice || 0;
|
|
85
82
|
const specialPrice = product.price?.unitPriceStriked;
|
|
@@ -94,7 +91,7 @@ const Subscription = ({
|
|
|
94
91
|
"aria-hidden": true,
|
|
95
92
|
children: /*#__PURE__*/_jsx(ProductImage, {
|
|
96
93
|
src: product.featuredImageBaseUrl,
|
|
97
|
-
|
|
94
|
+
context: "list"
|
|
98
95
|
})
|
|
99
96
|
}), /*#__PURE__*/_jsxs("div", {
|
|
100
97
|
className: classes.infoContainer,
|