{"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":""}