{"version":3,"file":"coopse.script.5521.9e36e8f6.chunk.js","mappings":"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","sources":["webpack:///./src/microApps/common/components/AddToCartButton/AddToCartA11yAnnouncer.tsx","webpack:///./src/microApps/common/components/AddToCartButton/AddToCartButton.tsx","webpack:///./src/microApps/common/components/B2BCrossContextNotifications/B2BCrossContextNotifications.tsx","webpack:///./src/microApps/common/components/molecules/BuyableProductTeaser/BuyableProductTeaser.tsx","webpack:///./src/microApps/common/components/molecules/BuyableProductTeaser/BuyableProductTeaserSkeleton.tsx","webpack:///./src/microApps/common/hooks/tracking/useBuyableItemGATracking.ts","webpack:///./src/microApps/common/hooks/useBuyableProductEventsTracking.ts","webpack:///./src/microApps/common/hooks/useBuyableProductState.ts"],"sourcesContent":["import * as React from 'react';\n\nimport TemporaryA11yAnnouncer from '../A11yAnnouncer/TemporaryA11yAnnouncer';\n\nconst AddToCartA11yAnnouncer = (props: { quantity: number | undefined }) => {\n let quantityLabel;\n if (props.quantity === 0) {\n quantityLabel = 'Denna vara är borttagen från varukorgen.';\n }\n\n if (props.quantity === 1) {\n quantityLabel = 'Denna vara finns nu i varukorgen.';\n }\n\n if (props.quantity !== undefined && props.quantity > 1) {\n quantityLabel = `${props.quantity} av denna vara finns i varukorgen.`;\n }\n\n return <TemporaryA11yAnnouncer announcerName=\"AddToCart\" text={quantityLabel} />;\n};\n\nexport default React.memo(AddToCartA11yAnnouncer);\n","import type React from 'react';\nimport { useMemo, useState } from 'react';\nimport _ from 'underscore';\n\nimport { appConfig } from '../../../../appConfig';\nimport B2BCrossContextNotifications from '../B2BCrossContextNotifications';\nimport { QuantityStepper } from '../QuantityStepper';\nimport AddToCartA11yAnnouncer from './AddToCartA11yAnnouncer';\n\n/**\n * Handles blocking of adding to cart when the user is in incorrect B2B context - private user on company site or company user on private site and shows a notification if it's the case.\n */\nconst AddToCartButton = (props: {\n quantity: number;\n fullWidth?: boolean;\n isBlocked?: (newQuantity: number) => boolean;\n onBlock?: (newQuantity: number, prevQuantity: number) => void;\n withButton?: boolean;\n productName: string | undefined;\n setQuantity: (newQuantity: number) => void;\n onAddToCartClick?: (e: React.MouseEvent<HTMLElement>) => void;\n onRemoveFromCartClick?: (e: React.MouseEvent<HTMLElement>) => void;\n}) => {\n const [attemptedToAddToCart, setAttemptedToAddToCart] = useState(false);\n\n const [a11yQuantity, setA11yQuantity] = useState<number | undefined>(undefined);\n const setA11yQuantityDebounced = useMemo(\n () => _.debounce(setA11yQuantity, 300),\n [setA11yQuantity],\n );\n\n const setQuantity = (newQuantity: number) => {\n setA11yQuantityDebounced(newQuantity); // announce to screen reader immediately after user interaction, dont wait for API sync to make sure AddToCartAccessibilityLogger is read before CartSummaryAccessibilityLogger\n props.setQuantity(newQuantity);\n };\n\n const onBlock = (newQuantity: number, prevQuantity: number) => {\n setAttemptedToAddToCart(true);\n props.onBlock?.(newQuantity, prevQuantity);\n };\n\n return (\n <div className=\"u-posRelative\">\n <AddToCartA11yAnnouncer quantity={a11yQuantity} />\n\n {/* TODO remove renderTrigger and use plain refs to pass down to Modal */}\n <B2BCrossContextNotifications\n show={attemptedToAddToCart}\n close={() => setAttemptedToAddToCart(false)}\n renderTrigger={(addToCartRef, isCrossContextBlock) => (\n <QuantityStepper\n withBuyButton={props.withButton}\n buyButtonRef={addToCartRef}\n isBlocked={(newQuanity) =>\n isCrossContextBlock || !!props.isBlocked?.(newQuanity)\n }\n onBlock={onBlock}\n fullWidth={props.fullWidth}\n quantity={props.quantity}\n setQuantity={setQuantity}\n onAddClick={props.onAddToCartClick}\n onRemoveClick={props.onRemoveFromCartClick}\n buyButtonLabel={`Lägg till ${props.productName} i varukorgen`}\n inputLabel={`Antal av ${props.productName} i varukorgen`}\n addButtonLabel={`Öka antal av ${props.productName} i varukorgen`}\n removeButtonLabel={`Minska antal av ${props.productName} i varukorgen`}\n />\n )}\n continueAsPrivateUrl={appConfig.coopSettings.b2c.ecommerce.page.url}\n continueAsCompanyUrl={appConfig.coopSettings.b2b.ecommerce.page?.url}\n />\n </div>\n );\n};\n\nexport default AddToCartButton;\n","import { Confirm } from '@coop/components';\nimport { type ReactNode } from 'react';\n\nimport { useIsUserAuthenticated, useIsUserCompany } from '../../hooks/useUserProfile';\nimport { ga4B2BTracking } from '../../tracking/ga4/b2b';\nimport { ga4UserTracking } from '../../tracking/ga4/user';\nimport { isInB2BCrossContext, useIsB2BRoute } from '../../utils/b2bUtils';\nimport { getLoginUrlWithReturnUrl } from '../../utils/urlUtils';\n\n/**\n * The notifications that are shown when the user is logged in as a private user on the company site or as a company user on the private site.\n * The add to cart action is blocked when these notifications are shown.\n */\nexport const B2BCrossContextNotifications = (props: {\n show: boolean;\n close: () => void;\n renderTrigger?: (\n ref: React.RefObject<HTMLButtonElement> | undefined,\n isBlocked: boolean,\n ) => ReactNode;\n continueAsPrivateUrl: string;\n continueAsCompanyUrl?: string;\n}) => {\n const isB2BRoute = useIsB2BRoute();\n\n const { privateUserOnCompanySite, companyUserOnPrivateSite } = isInB2BCrossContext({\n isB2BRoute,\n isUserCompany: useIsUserCompany(),\n isAuthenticated: useIsUserAuthenticated(),\n });\n\n if (props.renderTrigger && !companyUserOnPrivateSite && !privateUserOnCompanySite) {\n return <>{props.renderTrigger(undefined, false)}</>;\n }\n\n const clickInteractionTracking: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n ga4B2BTracking.b2bCrossContextPopupInteraction(e.currentTarget.innerText);\n };\n\n const clickLoginTracking = () => {\n ga4UserTracking.login(null, 'start');\n };\n\n return (\n <>\n {privateUserOnCompanySite && (\n <Confirm\n show={props.show}\n close={props.close}\n renderTrigger={(ref) => props.renderTrigger?.(ref, true)}\n onConfirm={() => {}}\n heading=\"Vill du handla till dig själv eller till jobbet?\"\n message=\"Du är inloggad som privatperson men handlar just nu från företagssidorna.\"\n confirmButtonProps={{\n asChild: true,\n children: (\n <a\n href={getLoginUrlWithReturnUrl('company', 'login')}\n onClick={(e) => {\n clickInteractionTracking(e);\n clickLoginTracking();\n }}\n >\n Logga in som Företagskund\n </a>\n ),\n }}\n cancelButtonProps={{\n asChild: true,\n children: (\n <a href={props.continueAsPrivateUrl} onClick={clickInteractionTracking}>\n Fortsätt som Privat\n </a>\n ),\n }}\n disableOutsideClick\n />\n )}\n {companyUserOnPrivateSite && (\n <Confirm\n show={props.show}\n close={props.close}\n renderTrigger={(ref) => props.renderTrigger?.(ref, true)}\n onConfirm={() => {}}\n heading=\"Vill du handla till dig själv eller till jobbet?\"\n message=\"Du är inloggad med ditt företagskonto men handlar just nu från privatsidorna.\"\n confirmButtonProps={{\n asChild: true,\n children: (\n <a\n href={getLoginUrlWithReturnUrl('private', 'login')}\n onClick={(e) => {\n clickInteractionTracking(e);\n clickLoginTracking();\n }}\n >\n Logga in som Privatkund\n </a>\n ),\n }}\n cancelButtonProps={{\n asChild: true,\n children: (\n <a href={props.continueAsCompanyUrl} onClick={clickInteractionTracking}>\n Fortsätt som Företag\n </a>\n ),\n }}\n disableOutsideClick\n />\n )}\n </>\n );\n};\n\nexport default B2BCrossContextNotifications;\n","/* eslint-disable react/jsx-props-no-spreading */\n\nimport { useState } from 'react';\n\nimport useReactRouting from '../../../../ecommerce/hooks/useReactRouting';\nimport { useBuyableItemGATracking } from '../../../hooks/tracking/useBuyableItemGATracking';\nimport { useBuyableState } from '../../../hooks/useBuyableProductState';\nimport { useCurrentPriceType } from '../../../hooks/useCurrentPriceType';\nimport { mapProductToProps } from '../../../utils/productUtils';\nimport { AddToCartButton } from '../../AddToCartButton';\nimport EcomProductTeaser, { AddedToCartTeaserNotification } from '../EcomProductTeaser';\nimport type { BuyableProductTeaserProps } from './BuyableProductTeaser.types';\n\ntype BuyableProductTeaserNotifications = 'addedToCart';\n\nconst BuyableProductTeaser = (props: BuyableProductTeaserProps) => {\n const [notification, setNotification] = useState<BuyableProductTeaserNotifications | null>(\n null,\n );\n const onAddToCart = () => {\n setNotification('addedToCart');\n };\n\n const { currentVariant, quantity, handleVariantChange, onQuantityUpdate } = useBuyableState(\n props.product,\n {\n isSilent: !props.refreshCart,\n analyticsOptions: props.analyticsOptions,\n },\n onAddToCart,\n );\n\n const { ref, handleGaProductClick } = useBuyableItemGATracking(\n props.product,\n currentVariant?.id,\n props.analyticsOptions,\n );\n\n const { push } = useReactRouting();\n\n const handleProductTeaserClick = () => {\n handleGaProductClick();\n props.onTeaserClick?.();\n };\n\n const handleLinkClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (!props.isAsyncLink) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n props.onTeaserClick?.();\n push(props.product.url);\n };\n\n const { currentPriceType } = useCurrentPriceType();\n const productProps = mapProductToProps(props.product);\n\n return (\n <EcomProductTeaser\n ref={ref}\n {...props}\n product={productProps}\n currentVariant={currentVariant || undefined}\n handleVariantChange={handleVariantChange}\n handleTeaserClick={handleProductTeaserClick}\n handleLinkClick={handleLinkClick}\n priceType={currentPriceType}\n quantity={quantity}\n notificationSlot={\n <AddedToCartTeaserNotification\n show={notification === 'addedToCart'}\n onClose={() => setNotification(null)}\n />\n }\n actionsSlot={\n <AddToCartButton\n fullWidth\n withButton\n quantity={quantity}\n setQuantity={onQuantityUpdate}\n productName={props.product.name}\n onAddToCartClick={props.onAddToCartClick}\n onRemoveFromCartClick={props.onRemoveFromCartClick}\n />\n }\n />\n );\n};\n\nexport default BuyableProductTeaser;\n","import { EcomProductTeaserSkeleton } from '../EcomProductTeaser';\n\nconst BuyableProductTeaserSkeleton = () => {\n return <EcomProductTeaserSkeleton withActions />;\n};\n\nexport default BuyableProductTeaserSkeleton;\n","import { useInView } from 'react-intersection-observer';\n\nimport type { AnalyticsListOptions } from '../../../../analytics/analyticsHandler';\nimport { storeSelectors } from '../../selectors/storeSelectors';\nimport { ga4ItemsTracking } from '../../tracking/ga4/items';\nimport { useAppSelector } from '../useThunkDispatch';\n\nexport const useBuyableItemGATracking = (\n product: ApiProduct,\n variantId: string | undefined,\n analyticsOptions: AnalyticsListOptions | null,\n) => {\n const currentProductionUnit = useAppSelector(storeSelectors.currentProductionUnit);\n\n const [ref] = useInView({\n threshold: 0.5,\n triggerOnce: true,\n onChange: (inView) => {\n if (inView && analyticsOptions) {\n ga4ItemsTracking.viewItemList(product, analyticsOptions);\n }\n },\n });\n\n const handleGaProductClick = () => {\n if (analyticsOptions) {\n ga4ItemsTracking.selectItem(\n product.identifier,\n variantId,\n currentProductionUnit,\n analyticsOptions?.position,\n analyticsOptions,\n );\n }\n };\n\n return { ref, handleGaProductClick };\n};\n","import { Helpers } from '../../../utility/helpers';\nimport type { PriceData } from '../models/priceData/priceData';\nimport { PriceType } from '../models/priceData/priceData';\nimport { personalizationTracking } from '../tracking/contextAware/personalizationEvents';\n\ninterface QuantityChangeData extends Omit<ProductTrackingData, 'promotionPrice' | 'price'> {\n promotionPriceData?: PriceData;\n priceData?: PriceData;\n}\n\nconst { trackCartItemQuantityUpdate, trackSlotClick, trackRemoveFromCart, trackAddToCart } =\n personalizationTracking;\n\nconst buyableProductEventsTrackingPriceType = PriceType.IncludeTax; // leave b2c prices for tracking\n\nconst onAddToCartTrack = (quantityChangeData: QuantityChangeData) => {\n trackAddToCart([\n mapToProductTrackingData(quantityChangeData, buyableProductEventsTrackingPriceType),\n ]);\n};\n\nconst onQuantityUpdateTrack = (quantityChangeData: QuantityChangeData) => {\n if (quantityChangeData.quantity > quantityChangeData.previousQuantity) {\n trackCartItemQuantityUpdate(\n mapToProductTrackingData(quantityChangeData, buyableProductEventsTrackingPriceType),\n );\n }\n};\n\nconst onSlotClickTrack = (identifier: string, slotId: string) => {\n trackSlotClick(identifier, slotId);\n};\n\nconst onRemoveFromCartTrack = (quantityChangeData: QuantityChangeData) => {\n trackRemoveFromCart(\n mapToProductTrackingData(quantityChangeData, buyableProductEventsTrackingPriceType),\n );\n};\n\nexport const buyableProductEventsTracking = {\n onAddToCartTrack,\n onQuantityUpdateTrack,\n onRemoveFromCartTrack,\n onSlotClickTrack,\n};\n\nconst mapToProductTrackingData = (\n quantityChangeData: QuantityChangeData,\n priceType: PriceType,\n): ProductTrackingData => {\n return {\n identifier: quantityChangeData.identifier,\n price:\n quantityChangeData?.priceData &&\n Helpers.getPrice(quantityChangeData.priceData, priceType),\n quantity: quantityChangeData.quantity,\n previousQuantity: quantityChangeData.previousQuantity,\n promotionPrice:\n quantityChangeData?.promotionPriceData &&\n Helpers.getPrice(quantityChangeData.promotionPriceData, priceType),\n };\n};\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport _ from 'underscore';\n\nimport type { AnalyticsListOptions } from '../../../analytics/analyticsHandler';\nimport cartItemsSelectors from '../../cart/selectors/cartItemsSelectors';\nimport { storeSelectors } from '../selectors/storeSelectors';\nimport { unsyncedCartItemsSelectors } from '../selectors/unsyncedCartItemsSelectors';\nimport { unsyncedCartItemsActions } from '../store/slices/unsyncedCartItemsSlice';\nimport { CncStep } from '../store/structureDefinitions/uiState';\nimport { cartThunks } from '../thunks/cartThunks';\nimport { sendGaModifyCartEvent } from '../tracking/gaEventCreators';\nimport { useAsyncDispatcher } from './useAsyncDispatcher';\nimport { buyableProductEventsTracking } from './useBuyableProductEventsTracking';\nimport { dispatchSetTo } from './useCncFlyInState';\nimport { useAppDispatch, useAppSelector } from './useThunkDispatch';\n\nconst initialVariant = (productVariants: ProductDataVariant[]) => {\n if (productVariants && productVariants.length > 0) {\n return productVariants[0];\n }\n\n return null;\n};\n\nconst useExistingCartItemState = (productId: string, variants: ProductDataVariant[]) => {\n const [currentVariant, setCurrentVariant] = useState(initialVariant(variants));\n\n const unsyncedCartItem = useAppSelector((state) =>\n unsyncedCartItemsSelectors.selectUnsyncedCartItemByUniqueId(state, {\n productId,\n variantId: currentVariant?.id,\n }),\n );\n\n const cartItem = useAppSelector((state) =>\n cartItemsSelectors.selectById(state, {\n productId,\n variantId: currentVariant?.id,\n }),\n );\n\n const handleVariantChange = (variantId: string) => {\n const variant = variants?.find((x) => x.id === variantId) || null;\n setCurrentVariant(variant);\n };\n\n useEffect(() => {\n setCurrentVariant(initialVariant(variants));\n }, [setCurrentVariant, variants, productId]);\n\n return {\n cartItem,\n unsyncedCartItem,\n currentVariant,\n handleVariantChange,\n };\n};\n\nexport const useCartDispatchers = (options: UseBuyableProductStateOptions) => {\n const dispatch = useAppDispatch();\n const hasActiveStoreSelection = useAppSelector(storeSelectors.hasActiveStoreSelection);\n const currentProductionUnit = useAppSelector(storeSelectors.currentProductionUnit);\n\n const addToCartDispatcher = useAsyncDispatcher(\n async (\n _productId: string,\n _variantId: string | undefined,\n _quantity: number,\n _onAddToCart?: Function,\n ) => {\n if (!hasActiveStoreSelection) {\n dispatch(\n unsyncedCartItemsActions.addUnsyncedCartItem({\n productId: _productId,\n variantId: _variantId,\n quantity: _quantity,\n analyticsOptions: options?.analyticsOptions,\n }),\n );\n dispatch(dispatchSetTo({ step: CncStep.MiniCart }));\n } else {\n await dispatch(\n cartThunks.updateQuantity(_productId, _variantId, _quantity, options?.isSilent),\n );\n\n sendGaModifyCartEvent(\n _productId,\n _variantId,\n _quantity,\n 0,\n currentProductionUnit,\n options?.analyticsOptions,\n );\n\n if (_onAddToCart) _onAddToCart();\n }\n },\n );\n\n const updateQuantityDispatcher = useAsyncDispatcher(\n async (\n _productId: string,\n _variantId: string | undefined,\n _newQuantity: number,\n _previousQuantity: number,\n _onCartItemQuantityUpdate?: Function,\n ) => {\n await dispatch(\n cartThunks.updateQuantity(_productId, _variantId, _newQuantity, options?.isSilent),\n );\n\n sendGaModifyCartEvent(\n _productId,\n _variantId,\n _newQuantity,\n _previousQuantity,\n currentProductionUnit,\n options?.analyticsOptions,\n );\n\n if (_onCartItemQuantityUpdate) _onCartItemQuantityUpdate();\n },\n );\n\n const removeFromCartDispatcher = useAsyncDispatcher(\n async (\n _productId: string,\n _variantId: string | undefined,\n _previousQuantity: number,\n _onRemoveFromCart?: Function,\n ) => {\n await dispatch(cartThunks.updateQuantity(_productId, _variantId, 0, options?.isSilent));\n\n sendGaModifyCartEvent(\n _productId,\n _variantId,\n 0,\n _previousQuantity,\n currentProductionUnit,\n options?.analyticsOptions,\n );\n\n if (_onRemoveFromCart) _onRemoveFromCart();\n },\n );\n\n return {\n addToCartDispatcher,\n removeFromCartDispatcher,\n updateQuantityDispatcher,\n };\n};\n\nexport const useBuyableState = (\n product: ApiProduct,\n options: UseBuyableProductStateOptions,\n onAddToCartDone?: (previousQuantity: number, newQuantity: number) => void,\n onQuantityUpdateDone?: (previousQuantity: number, newQuantity: number) => void,\n onRemoveFromCartDone?: (previousQuantity: number, newQuantity: number) => void,\n) => {\n const { currentVariant, quantity, handleVariantChange, handleQuantityUpdate } =\n useBuyableProductState(product, {\n isSilent: options.isSilent,\n analyticsOptions: options.analyticsOptions,\n });\n\n const onQuantityUpdate = useCallback(\n (newQuantity: number) => {\n const addToCartDone = () => {\n buyableProductEventsTracking.onAddToCartTrack({\n identifier: product.identifier,\n priceData: product.priceData,\n quantity: newQuantity,\n previousQuantity: quantity,\n promotionPriceData: product.promotionPriceData,\n });\n onAddToCartDone?.(0, newQuantity);\n };\n\n const removeFromCartDone = () => {\n buyableProductEventsTracking.onRemoveFromCartTrack({\n identifier: product.identifier,\n priceData: product.priceData,\n quantity: newQuantity,\n previousQuantity: quantity,\n promotionPriceData: product.promotionPriceData,\n });\n onRemoveFromCartDone?.(quantity, newQuantity);\n };\n\n const quantityUpdateDone = () => {\n buyableProductEventsTracking.onQuantityUpdateTrack({\n identifier: product.identifier,\n priceData: product.priceData,\n quantity: newQuantity,\n previousQuantity: quantity,\n promotionPriceData: product.promotionPriceData,\n });\n onQuantityUpdateDone?.(quantity, newQuantity);\n };\n\n handleQuantityUpdate(\n newQuantity,\n addToCartDone,\n quantityUpdateDone,\n removeFromCartDone,\n );\n },\n [\n onAddToCartDone,\n onQuantityUpdateDone,\n onRemoveFromCartDone,\n handleQuantityUpdate,\n product.identifier,\n product.priceData,\n product.promotionPriceData,\n quantity,\n ],\n );\n\n return {\n currentVariant,\n quantity,\n handleVariantChange,\n onQuantityUpdate,\n };\n};\n\nexport const useBuyableProductState = (\n productData: ProductData,\n options: UseBuyableProductStateOptions,\n) => {\n const { cartItem, unsyncedCartItem, currentVariant, handleVariantChange } =\n useExistingCartItemState(productData.identifier, productData.variants);\n\n const { addToCartDispatcher, removeFromCartDispatcher, updateQuantityDispatcher } =\n useCartDispatchers(options);\n\n const { execute: addToCartDispatcherExecute } = addToCartDispatcher;\n const { execute: removeFromCartDispatcherExecute } = removeFromCartDispatcher;\n const { execute: updateQuantityDispatcherExecute } = updateQuantityDispatcher;\n\n const handleQuantityUpdate = useMemo(\n () =>\n _.debounce(\n (\n _newQuantity: number,\n addToCartCallback?: () => void,\n onQuantityUpdateCallback?: () => void,\n onRemoveFromCartCallback?: () => void,\n ) => {\n if (!cartItem) {\n addToCartDispatcherExecute(\n productData.identifier,\n currentVariant?.id,\n _newQuantity,\n addToCartCallback,\n );\n return;\n }\n\n if (_newQuantity === 0) {\n removeFromCartDispatcherExecute(\n cartItem.productId,\n cartItem.variantId,\n cartItem.quantity,\n onRemoveFromCartCallback,\n );\n } else {\n updateQuantityDispatcherExecute(\n cartItem.productId,\n cartItem.variantId,\n _newQuantity,\n cartItem.quantity,\n onQuantityUpdateCallback,\n );\n }\n },\n 500,\n ),\n [\n addToCartDispatcherExecute,\n cartItem,\n currentVariant?.id,\n productData.identifier,\n removeFromCartDispatcherExecute,\n updateQuantityDispatcherExecute,\n ],\n );\n\n return {\n addToCartDispatcher,\n updateQuantityDispatcher,\n removeFromCartDispatcher,\n currentVariant,\n quantity: cartItem?.quantity || unsyncedCartItem?.quantity || 0,\n handleVariantChange,\n handleQuantityUpdate,\n };\n};\n\ninterface UseBuyableProductStateOptions {\n isSilent: boolean;\n analyticsOptions: AnalyticsListOptions | null;\n}\n\ninterface ProductDataVariant {\n id: string;\n name: string;\n priceData?: ApiPriceData;\n promotionPriceData?: ApiPriceData;\n}\n\ninterface ProductData {\n identifier: string;\n variants: ProductDataVariant[];\n}\n"],"names":["props","quantityLabel","quantity","undefined","TemporaryA11yAnnouncer","announcerName","text","attemptedToAddToCart","setAttemptedToAddToCart","useState","a11yQuantity","setA11yQuantity","setA11yQuantityDebounced","useMemo","setQuantity","newQuantity","onBlock","prevQuantity","className","B2BCrossContextNotifications","show","close","renderTrigger","addToCartRef","isCrossContextBlock","QuantityStepper","withBuyButton","withButton","buyButtonRef","isBlocked","newQuanity","fullWidth","onAddClick","onAddToCartClick","onRemoveClick","onRemoveFromCartClick","buyButtonLabel","productName","inputLabel","addButtonLabel","removeButtonLabel","continueAsPrivateUrl","appConfig","coopSettings","b2c","ecommerce","page","url","continueAsCompanyUrl","b2b","isB2BRoute","privateUserOnCompanySite","companyUserOnPrivateSite","isUserCompany","isAuthenticated","clickInteractionTracking","e","g","b2bCrossContextPopupInteraction","currentTarget","innerText","clickLoginTracking","login","Confirm","ref","onConfirm","heading","message","confirmButtonProps","asChild","children","href","onClick","cancelButtonProps","disableOutsideClick","notification","setNotification","currentVariant","handleVariantChange","onQuantityUpdate","product","isSilent","refreshCart","analyticsOptions","handleGaProductClick","useBuyableItemGATracking","id","push","useReactRouting","currentPriceType","useCurrentPriceType","productProps","EcomProductTeaser","handleTeaserClick","onTeaserClick","handleLinkClick","isAsyncLink","stopPropagation","preventDefault","priceType","notificationSlot","onClose","actionsSlot","AddToCartButton","name","withActions","variantId","currentProductionUnit","threshold","triggerOnce","onChange","inView","viewItemList","selectItem","identifier","position","trackCartItemQuantityUpdate","trackSlotClick","trackRemoveFromCart","trackAddToCart","buyableProductEventsTrackingPriceType","IncludeTax","buyableProductEventsTracking","onAddToCartTrack","quantityChangeData","mapToProductTrackingData","onQuantityUpdateTrack","previousQuantity","onRemoveFromCartTrack","onSlotClickTrack","slotId","price","priceData","getPrice","promotionPrice","promotionPriceData","initialVariant","productVariants","length","useCartDispatchers","options","dispatch","hasActiveStoreSelection","addToCartDispatcher","_productId","_variantId","_quantity","_onAddToCart","updateQuantity","addUnsyncedCartItem","productId","step","MiniCart","updateQuantityDispatcher","_newQuantity","_previousQuantity","_onCartItemQuantityUpdate","removeFromCartDispatcher","_onRemoveFromCart","useBuyableState","onAddToCartDone","onQuantityUpdateDone","onRemoveFromCartDone","handleQuantityUpdate","useBuyableProductState","useCallback","productData","cartItem","unsyncedCartItem","variants","setCurrentVariant","state","selectUnsyncedCartItemByUniqueId","selectById","useEffect","variant","find","x","useExistingCartItemState","execute","addToCartDispatcherExecute","removeFromCartDispatcherExecute","updateQuantityDispatcherExecute","addToCartCallback","onQuantityUpdateCallback","onRemoveFromCartCallback"],"sourceRoot":""}