{"version":3,"file":"./modules/ShopInitializer.xxxxxxxx.js","mappings":"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","sources":["webpack:///./eShop/modules/_ShopModule.ts","webpack:///./eShop/modules/AddToCart/AddToCart.ts","webpack:///./eShop/modules/AddToCart/AddToCartWithT.ts","webpack:///./eShop/modules/AddToCart/index.ts","webpack:///./eShop/helpers/cartControlls.ts","webpack:///./eShop/helpers/CartItemError.ts","webpack:///./eShop/helpers/cartItem.ts","webpack:///./eShop/helpers/cartGiftWrapping.ts","webpack:///./eShop/helpers/cartPromotions.ts","webpack:///./eShop/helpers/cartPromotionForm.ts","webpack:///./eShop/helpers/cartSummary.ts","webpack:///./eShop/helpers/cartWrapper.ts","webpack:///./eShop/helpers/teaserPriceSection.ts","webpack:///./eShop/helpers/teaserAvailabilitySection.ts","webpack:///./eShop/helpers/teaserShopInfoSection.ts","webpack:///./eShop/helpers/teaserAddToCartSection.ts","webpack:///./eShop/helpers/productBadge.ts","webpack:///./eShop/helpers/index.ts","webpack:///./eShop/modules/AddToCartPDP/AddToCartPDP.ts","webpack:///./eShop/modules/AddToCartPDP/AddToCartPDPWithT.ts","webpack:///./eShop/modules/AddToCartPDP/index.ts","webpack:///./eShop/modules/Cart/CartAmountIcon.ts","webpack:///./eShop/modules/Cart/CartContentOverviewBasic.ts","webpack:///./eShop/modules/Cart/CartContent/index.ts","webpack:///./eShop/modules/Cart/CartContent/CartContent.ts","webpack:///./eShop/modules/Cart/index.ts","webpack:///./eShop/modules/Cart/Cart.ts","webpack:///./eShop/modules/CartGiftWrappingModule/index.ts","webpack:///./eShop/modules/CartGiftWrappingModule/CartGiftWrappingModule.ts","webpack:///./eShop/modules/CartPromotion/PromotionList.ts","webpack:///./eShop/modules/CartPromotion/PromotionForm.ts","webpack:///./eShop/modules/CartPromotion/index.ts","webpack:///./eShop/modules/CartPromotion/CartPromotion.ts","webpack:///./eShop/modules/Overview/Overview.ts","webpack:///./eShop/modules/Overview/OverviewWithT.ts","webpack:///./eShop/modules/Overview/index.ts","webpack:///./eShop/ModuleLoader.ts","webpack:///./eShop/modules/CartNotifier.ts","webpack:///./eShop/modules/GoToCartLink.ts","webpack:///./eShop/modules/PaymentSummaryModule.ts","webpack:///./eShop/modules/PriceLoader/index.ts","webpack:///./eShop/modules/PriceLoader/PriceLoader.ts","webpack:///./eShop/index.ts","webpack:///./ShopInitializer.ts","webpack:///./store/modules/ShopCart/actions.ts","webpack:///./store/modules/Filter/types.ts","webpack:///./ClassWithTracking/helpers.ts","webpack:///./ClassWithTracking/index.ts","webpack:///./store/modules/SmartPush/types.ts","webpack:///./store/modules/CircleNavigation/types.ts","webpack:///./store/modules/ShopCart/types.ts","webpack:///./store/modules/CircleNavigation/reducer.ts","webpack:///./store/modules/SmartPush/reducer.ts","webpack:///./store/modules/Tab/reducer.ts","webpack:///./store/modules/Filter/reducer.ts","webpack:///./store/modules/root.ts","webpack:///./store/modules/helpers.ts","webpack:///./store/index.ts","webpack:///./store/modules/Tab/types.ts","webpack:///./store/modules/ShopCart/reducer.ts"],"sourcesContent":["/// \r\n\r\nexport interface _ShopModuleConstructor {\r\n new (element: HTMLElement, config: ShopModuleConfig>): _ShopModule;\r\n}\r\n\r\nexport default abstract class _ShopModule {\r\n protected element: HTMLElement\r\n protected config: ShopModuleConfig;\r\n\r\n constructor(element: HTMLElement, config: ShopModuleConfig>) {\r\n this.element = element;\r\n this.config = this.mergeConfig(this.getDefaultConfig(), config);\r\n }\r\n\r\n protected mergeConfig(defConfig: Partial>, config: ShopModuleConfig>): ShopModuleConfig {\r\n return {\r\n ...defConfig,\r\n ...config,\r\n options: {\r\n ...defConfig.options,\r\n ...config.options,\r\n },\r\n }\r\n }\r\n\r\n protected abstract getDefaultConfig(): Partial>;\r\n}","import _ShopModule from './../_ShopModule';\r\n\r\nexport default class AddToCart extends _ShopModule {\r\n protected element: HTMLElement;\r\n protected button: HTMLElement;\r\n protected mustUseAddToCartSaveAction: boolean;\r\n protected productId: string;\r\n protected quantity: number = 1;\r\n protected notification: CartNotification;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n const { buttonSelector, productIdAttr } = this.config.options;\r\n this.button = this.element.querySelector(buttonSelector);\r\n this.mustUseAddToCartSaveAction = \"mustUseAddToCartSaveAction\" in this.element.dataset;\r\n this.productId = this.element.getAttribute(productIdAttr);\r\n\r\n this.init();\r\n }\r\n\r\n protected init(): void {\r\n this.button.addEventListener('click', () => this.addToCart());\r\n this.listenToCartChange();\r\n }\r\n\r\n protected async addToCart(currentProductID: string = \"\"): Promise {\r\n if (this.mustUseAddToCartSaveAction) {\r\n return;\r\n }\r\n const { updateCartStore, showNotification, startSpinner, stopSpinner } = this.config.actions;\r\n const { getAddToCartURL } = this.config.urls;\r\n const { productId, quantity } = this;\r\n \r\n startSpinner(this.element, '');\r\n document.dispatchEvent(new CustomEvent('cart:startspinner'));\r\n\r\n try {\r\n const url = getAddToCartURL({ productId, quantity, currentProductID });\r\n const result = await fetch(url, { credentials: 'include' });\r\n const shopRes: ShopResponse = await result.json();\r\n\r\n if (shopRes.IsSuccess) {\r\n const cart = shopRes.Data;\r\n updateCartStore(cart);\r\n const { TDefinitions } = this.notification;\r\n showNotification({ ...this.notification, LinkHref: this.notification.Link, TDefinitions });\r\n document.dispatchEvent(new CustomEvent('addtocart:showAddToCardFlag'));\r\n \r\n } else {\r\n alert(shopRes.Error);\r\n }\r\n } catch (e) {\r\n console.error(`Error AddToCart: ${e}`);\r\n } finally {\r\n stopSpinner(this.element, '');\r\n document.dispatchEvent(new CustomEvent('cart:stopspinner'));\r\n }\r\n }\r\n\r\n protected listenToCartChange(): void {\r\n const { subscribeToCart } = this.config.actions;\r\n\r\n subscribeToCart((cart: CartState) => {\r\n this.getNotificationInfo(cart)\r\n .onCartChange(cart);\r\n });\r\n }\r\n\r\n protected getNotificationInfo({ Notification }: CartState): this {\r\n if (Notification) this.notification = Notification;\r\n return this;\r\n }\r\n\r\n protected onCartChange(cart: CartState): void {\r\n // method to extend in sub-classes\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n productIdAttr: 'data-product-id',\r\n buttonSelector: 'button',\r\n },\r\n };\r\n }\r\n}\r\n","import AddToCart from \"./AddToCart\";\r\nimport ClassWithTracking from \"../../../ClassWithTracking\";\r\nimport { getPriceValue } from \"../../../ClassWithTracking/helpers\";\r\n\r\n\r\nexport default class AddToCartWithT extends ClassWithTracking(AddToCart) {\r\n private cart: CartState;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n this.config.actions.subscribeToCart(cart => {\r\n this.cart = cart;\r\n });\r\n }\r\n\r\n protected async addToCart(currentProductID: string = \"\"): Promise {\r\n await super.addToCart(currentProductID);\r\n let buttonType = \"AddToCartButton\";\r\n \r\n const { productId, quantity, button } = this,\r\n trackingData: TrackingData[] = this.cart.TrackingData;\r\n\r\n if (button.classList.contains('nx-add-to-cart-flag')) {\r\n buttonType = \"AddToCartFlag\";\r\n } else if (button.classList.contains('nx-add-to-cart-teaser')) {\r\n buttonType = \"AddToCartTeaser\";\r\n } else if (button.classList.contains('nx-add-to-cart-mobile-trigger')) {\r\n buttonType = \"AddToCartMobile\";\r\n } else if (button.classList.contains('nx-product-bottom-bar__add-to-cart-button')) {\r\n buttonType = \"AddToCartProductBottomBar\";\r\n }\r\n \r\n\r\n if (trackingData?.length) {\r\n trackingData.forEach((rule, i) => {\r\n const { add } = rule.Tevent.ecommerce;\r\n\r\n if (add) {\r\n rule.Tevent.ecommerce.add.buttonType = buttonType;\r\n }\r\n\r\n dataLayer.push(rule.Tevent);\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n const cartItemTrackItem = this.cart.Items.find((item) => {\r\n return productId === item.ProductId;\r\n });\r\n\r\n if (cartItemTrackItem == null) return;\r\n const { CurrencyCode } = this.cart.Summary;\r\n const productTeaserItem = button.closest('.nx-product-teaser');\r\n const brand: string = productTeaserItem ? productTeaserItem.getAttribute('data-brand') : '';\r\n\r\n let cartItemTrackObj = {\r\n 'name': cartItemTrackItem.ProductName,\r\n 'id': `${cartItemTrackItem.ProductId}`,\r\n 'price': getPriceValue(cartItemTrackItem.ProductPrice),\r\n 'brand': brand,\r\n 'category': cartItemTrackItem.Category,\r\n 'variant': cartItemTrackItem.ProductSize,\r\n 'quantity': quantity\r\n }\r\n\r\n this.pushTrackingData(cartItemTrackObj, CurrencyCode, buttonType);\r\n }\r\n\r\n catch (e) {\r\n console.error(`Error AddToCart: ${e}`);\r\n }\r\n\r\n }\r\n\r\n pushTrackingData(products: Object, currencyCode: string, buttonType: string) {\r\n dataLayer.push({\r\n event: 'addToCart',\r\n ecommerce: {\r\n currencyCode: currencyCode,\r\n add: {\r\n buttonType: buttonType,\r\n products: [products]\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import AddToCart from './AddToCartWithT';\r\nexport default AddToCart;","const createCartItemControlls = (item: CartItem, classes: CartContentOptions, labels: OverviewLabels): string => `\r\n
\r\n
\r\n
\r\n
\r\n
${labels.Remove}
\r\n
\r\n
\r\n ${item.Stock.IsSoldOut || item.IsGiftWrappingProduct ? createRangeDropdownReadonly(item) : createRangeDropdown(item)}\r\n ${item.IsGiftWrappingProduct ? `` : createAvailability(item)}\r\n
`;\r\n\r\nconst createRangeDropdown = (item: CartItem): string => {\r\n const rangeDropdown = item.IsVoucher ? '' : `\r\n
\r\n
\r\n ${item.Quantity}\r\n \r\n
\r\n
\r\n
    \r\n ${item.QuantitySelector.map(q => `
  • ${q}
  • `).join('')}\r\n
\r\n
\r\n
`;\r\n return rangeDropdown;\r\n};\r\n\r\nconst createRangeDropdownReadonly = (item: CartItem): string => {\r\n const rangeDropdown = `\r\n
\r\n
\r\n ${item.Quantity}\r\n
\r\n
`;\r\n return rangeDropdown;\r\n};\r\n\r\nconst createAvailability = ({ Stock: { StateCssClass, Label, IsSoldOut }, IsVoucher }: CartItem): string => {\r\n const itemAvailability = IsVoucher ? '' : `

${Label}

`;\r\n return itemAvailability;\r\n};\r\n\r\nexport default createCartItemControlls;","const getCartItemError = (item: CartItem, classes: CartContentOptions) => `\r\n
\r\n ${item.Stock.IsSoldOut ? item.OutOfStockText : item.SelectedQuantityNotAvailableText}\r\n
\r\n`;\r\n\r\nexport default getCartItemError;\r\n","import createCartItemControlls from './cartControlls';\r\nimport getCartItemError from './CartItemError';\r\n\r\nconst createCartItem = (item: CartItem, classes: CartContentOptions, labels: OverviewLabels, readonly: boolean) => {\r\n let controlls = (readonly || item.IsReadOnly) ? `\r\n
\r\n
\r\n
\r\n
\r\n ${item.Quantity}\r\n
\r\n
\r\n
` : createCartItemControlls(item, classes, labels);\r\n\r\n const createItemUrl = (item.ProductUrl) ? `href=\"${item.ProductUrl}\"` : ``;\r\n\r\n if (readonly) controlls = `\r\n
\r\n
\r\n ${item.Quantity}\r\n
\r\n
`;\r\n\r\n const unitInfo = item.IsVoucher ? `\r\n
\r\n
${labels.VoucherWillBeSentTo}: ${item.VoucherRecipient}
\r\n
` : getUnitInfo(item, classes, labels);\r\n\r\n return `\r\n
  • \r\n
    \r\n
    \r\n \r\n \r\n \r\n\r\n
    \r\n \r\n

    ${item.ProductName}

    \r\n
    \r\n\r\n ${unitInfo}\r\n
    \r\n
    \r\n\r\n
    \r\n ${controlls}\r\n
    \r\n ${item.Stock.IsSoldOut\r\n ? `
    ${item.Price}
    `\r\n : `
    ${item.TotalOriginalPrice}
    \r\n ${item.PriceIsReduced ? `
    ${item.Price}
    ` : ''}`\r\n }\r\n
    \r\n
    \r\n
    \r\n ${!item.IsValid\r\n ? getCartItemError(item, classes)\r\n : \"\"\r\n }\r\n
  • \r\n `;\r\n};\r\n\r\nconst createPromotions = (promotions: Array) => {\r\n let promotionElements = '';\r\n promotions.forEach((val) => { promotionElements = promotionElements + `
    ${val}
    ` });\r\n return `\r\n
    \r\n ${promotionElements}\r\n
    \r\n `;\r\n};\r\n\r\nconst getUnitInfoPrice = (item: CartItem, classes: CartContentOptions, labels: OverviewLabels) => {\r\n return (item.IsFree) ? '' : `\r\n
    \r\n
    ${labels.UnitPrice}:
    \r\n
    \r\n ${item.OriginalPrice}\r\n
    \r\n ${item.PriceIsReduced ? `
    ${item.ProductPrice}
    ` : ''}\r\n ${item.PricePerUnit ? `
    (${item.PricePerUnit})
    ` : ''}\r\n
    \r\n `;\r\n}\r\n\r\nconst getUnitInfo = (item: CartItem, classes: CartContentOptions, labels: OverviewLabels) => `\r\n
    \r\n\r\n ${getUnitInfoPrice(item, classes, labels)}\r\n \r\n ${item.Promotions ? createPromotions(item.Promotions) : ''}\r\n ${item.Size ? `\r\n
    \r\n
    ${labels.Size}:
    \r\n
    ${item.ProductSize}
    \r\n
    `\r\n : ''\r\n }\r\n ${item.Category ? `\r\n
    \r\n
    ${labels.Category}:
    \r\n
    ${item.Category}
    \r\n
    `\r\n : ''\r\n }\r\n ${item.BundleProducts ? `\r\n
    \r\n ${labels.BundleProducts}: ${item.BundleProducts}\r\n
    `\r\n : ''\r\n }\r\n ${item.ProductNotGiftWrappableText ? `\r\n
    \r\n ${item.ProductNotGiftWrappableText}\r\n
    `\r\n : ''\r\n }\r\n
    \r\n`;\r\n\r\nexport const getCartItems = (items: CartItem[], options: CartContentOptions, labels: OverviewLabels, readonly: boolean = false): string =>\r\n items.filter(i => {\r\n if (i.ProductId == null) {\r\n console.warn('Added to the Cart product was not found. Check if the product exist.');\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }).map(i => createCartItem(i, options, labels, readonly)).join('');\r\n\r\nexport default createCartItem;","import { isObjectEmpty } from \"../../helpers/helperFunctions\";\r\n\r\nconst getGiftWrapping = (\r\n GiftWrapping: CartGiftWrapping,\r\n { cartClass }: CartContentOptions,\r\n readonly: boolean,\r\n) => {\r\n const createGiftWrapping = isObjectEmpty(GiftWrapping) ? '' : `\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n `;\r\n \r\n return createGiftWrapping;\r\n};\r\n\r\nexport default getGiftWrapping;","const createPromotions = (\r\n item: CartPromotions, \r\n { RemovePromotionURL }: CartContentOptions,\r\n readonly: boolean,\r\n) => {\r\n const controlls = readonly ? '' : `
    `\r\n return `\r\n
  • \r\n ${item.Text}\r\n ${controlls}\r\n
  • \r\n `;\r\n};\r\n\r\nexport const getPromotions = (items: CartPromotions[], removeUrl: CartContentOptions, readonly: boolean = false): string =>\r\n items.map(i => createPromotions(i, removeUrl, readonly)).join('');\r\n\r\nexport default createPromotions;","const getPromotionForm = (\r\n promotionForm: CartPromotionForm,\r\n { cartClass, AddPromotionURL }: CartContentOptions,\r\n) => promotionForm.InputPlaceholder == undefined || promotionForm.InputPlaceholder == ''\r\n ? ''\r\n : `\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    ${promotionForm.AddPromotionIcon}
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n`;\r\n\r\nexport default getPromotionForm;","const getSummary = (\r\n summary: CartSummary,\r\n { cartClass }: CartContentOptions,\r\n labels: OverviewLabels\r\n) => {\r\n let discounts = '';\r\n let voucher = '';\r\n let deliveryCost = '';\r\n if (summary.CartDiscounts !== null) {\r\n summary.CartDiscounts.forEach(discount => {\r\n discounts = discounts + `\r\n
    \r\n \r\n ${discount.Label}\r\n \r\n \r\n - ${discount.Amount}\r\n \r\n
    `;\r\n });\r\n }\r\n\r\n let deliveryDiscounts = '';\r\n if (summary.DeliveryDiscounts !== null) {\r\n summary.DeliveryDiscounts.forEach(deliveryDiscount => {\r\n discounts = discounts + `\r\n
    \r\n \r\n ${deliveryDiscount.Description}\r\n \r\n \r\n - ${deliveryDiscount.EffectiveDiscount}\r\n \r\n
    `;\r\n });\r\n }\r\n\r\n if (summary.VoucherAmount !== '') {\r\n voucher = `\r\n
    \r\n \r\n ${labels.Voucher}\r\n \r\n \r\n - ${summary.VoucherAmount}\r\n \r\n
    `;\r\n }\r\n\r\n if (summary.OriginalDeliveryCost !== '' && summary.OriginalDeliveryCost !== summary.DeliveryCost) {\r\n deliveryCost = `\r\n
    \r\n \r\n ${labels.DeliveryFee}\r\n \r\n \r\n + ${summary.OriginalDeliveryCost}\r\n \r\n
    \r\n ${deliveryDiscounts}`;\r\n } else {\r\n deliveryCost = `\r\n
    \r\n \r\n ${labels.DeliveryFee}\r\n \r\n \r\n + ${summary.DeliveryCost}\r\n \r\n
    `;\r\n }\r\n\r\n return `\r\n
    \r\n
    \r\n
    \r\n \r\n ${labels.Subtotal}\r\n \r\n \r\n ${summary.SubTotal}\r\n \r\n
    \r\n
    \r\n
    \r\n ${deliveryCost}\r\n ${discounts}\r\n
    \r\n
    \r\n
    \r\n \r\n ${labels.TotalPrice}\r\n \r\n \r\n ${summary.TotalPriceWithTax}\r\n \r\n
    \r\n
    \r\n \r\n ${labels.Tax}\r\n \r\n \r\n ${summary.TotalTax}\r\n \r\n
    \r\n ${voucher}\r\n
    \r\n
    \r\n
    \r\n \r\n ${labels.AmountToPay}\r\n \r\n \r\n ${summary.AmountToPay}\r\n \r\n
    \r\n
    \r\n
    \r\n`};\r\n\r\nexport default getSummary;","import { createElementFromString } from '../../helpers/DOMHelpers';\r\n\r\nimport { getCartItems } from './cartItem';\r\nimport getGiftWrapping from './cartGiftWrapping';\r\nimport { getPromotions } from './cartPromotions';\r\nimport getPromotionForm from './cartPromotionForm';\r\nimport getSummary from './cartSummary';\r\n\r\nconst createCartWrapper = ({ cartOptions, cartState, readonly }: CreateCartOptions): HTMLElement => {\r\n const { cartClass, cartItemListClass } = cartOptions;\r\n const { Items, Summary, CartOverviewLabels, GiftWrapping, PromotionForm, Promotions } = cartState;\r\n\r\n const cartItems = getCartItems(Items, cartOptions, CartOverviewLabels, readonly);\r\n const cartGiftWrapping = Object.entries(GiftWrapping).length > 0 ? getGiftWrapping(GiftWrapping, cartOptions, readonly) : '';\r\n const cartPromotions = getPromotions(Promotions, cartOptions, readonly);\r\n const cartPromotionForm = getPromotionForm(PromotionForm, cartOptions);\r\n const cartSummery = getSummary(Summary, cartOptions, CartOverviewLabels);\r\n\r\n const promotionForm = readonly ? '' : `
    ${cartPromotionForm}
    `;\r\n const giftWrapping = readonly || cartGiftWrapping.length === 0 ? '' : `
    ${cartGiftWrapping}
    `;\r\n\r\n return createElementFromString(`\r\n
    \r\n
    \r\n
      \r\n ${cartItems}\r\n
    \r\n\r\n
    \r\n ${giftWrapping}\r\n
    \r\n\r\n
    \r\n
      \r\n ${cartPromotions}\r\n
    \r\n ${promotionForm}\r\n
    \r\n
    \r\n ${cartSummery}\r\n
    \r\n
    \r\n
    \r\n `)\r\n};\r\n\r\nexport default createCartWrapper;","const getTeaserPriceSection = ({ OriginalPrice, Price, PricePerUnit, PricePerUnitString, ProductSize, PriceTooltipHeadline, PriceTooltipText, InfoIIcon, InfoXIcon, IsTooltipEnabled }: ProductTeaserInfo, isCompactTeaser: boolean = false) => {\r\n let pricePerUnit = PricePerUnit > 0\r\n ? PricePerUnitString\r\n : \"\"\r\n let pricePerUnitString = isCompactTeaser\r\n ? `${ProductSize}${pricePerUnit.length > 0 && ProductSize.length > 0 ? ` | ` : ``}${pricePerUnit}`\r\n : `${pricePerUnit}`;\r\n return `\r\n
    \r\n ${isCompactTeaser ? `` : `
    ${ProductSize}
    `}\r\n ${OriginalPrice && OriginalPrice !== Price\r\n ? `
    ${OriginalPrice}
    `\r\n : \"\"}\r\n
    ${Price}
    \r\n ${IsTooltipEnabled \r\n ? `
    \r\n
    \r\n
    \r\n
    ${PriceTooltipHeadline}
    \r\n
    \r\n ${PriceTooltipText}\r\n
    \r\n
    \r\n
    \r\n \r\n ${InfoIIcon}\r\n \r\n \r\n ${InfoXIcon}\r\n \r\n
    \r\n
    \r\n
    ` \r\n : ``}\r\n
    \r\n${pricePerUnitString.length > 0 ? `
    ${pricePerUnitString}
    ` : \"\"}\r\n`};\r\n\r\nexport default getTeaserPriceSection;\r\n","const getTeaserAvailabilitySection = ({ StockStateCssClass, StockLabel, IsPurchasable }: ProductTeaserInfo) => IsPurchasable ? `\r\n

    \r\n ${StockLabel}\r\n

    \r\n` : \"\";\r\n\r\nexport default getTeaserAvailabilitySection;","import getTeaserPriceSection from './teaserPriceSection';\r\nimport getTeaserAvailabilitySection from './teaserAvailabilitySection';\r\n\r\nconst getTeaserShopInfoSection = (teaserInfo: ProductTeaserInfo, isCompactTeaser: boolean = false) => {\r\n const priceSection = getTeaserPriceSection(teaserInfo, isCompactTeaser);\r\n const availabilitySection = getTeaserAvailabilitySection(teaserInfo);\r\n\r\n return priceSection + availabilitySection;\r\n};\r\n\r\nexport default getTeaserShopInfoSection;","const getTeaserAddToCartSection = ({ ProductId, IsAddToCartDisabled, AddToCartLabel, AddToCartIcon }: ProductTeaserInfo) => IsAddToCartDisabled ? '' : `\r\n
    \r\n \r\n
    \r\n`;\r\n\r\nexport default getTeaserAddToCartSection;","const getProductBadgeItem = ({ Value = \"\", ThemedCssClass = \"\" }: ProductBadgeInfo, modifier: string) => `
    ${Value}
    `;\r\nconst getProductBadges = (badges: ProductBadgeInfo[], modifier: string) => badges.map(b => getProductBadgeItem(b, modifier)).join(\"\");\r\n\r\ninterface SetProductBadgesParameters {\r\n badges: ProductBadgeInfo[];\r\n parrentSelector: string;\r\n context?: HTMLElement;\r\n maxBadges?: number;\r\n modifier?: string;\r\n}\r\n\r\nconst setProductBadges = ({ badges, parrentSelector, modifier, maxBadges, context = document.documentElement }: SetProductBadgesParameters): void => {\r\n const parrent = context.querySelector(parrentSelector);\r\n\r\n if (!parrent) return;\r\n parrent.innerHTML = getProductBadges(badges.slice(0, maxBadges), modifier);\r\n\r\n}\r\n\r\nexport {\r\n getProductBadgeItem,\r\n getProductBadges,\r\n setProductBadges,\r\n};","/// \r\n\r\nimport createCartWrapper from './cartWrapper';\r\nimport getSummary from './cartSummary';\r\nimport getPromotionForm from './cartPromotionForm';\r\nimport { getCartItems } from './cartItem';\r\nimport { getPromotions } from './cartPromotions';\r\nimport getGiftWrapping from './cartGiftWrapping';\r\nimport createButtons from './cartButtons';\r\nimport getTeaserShopInfoSection from './teaserShopInfoSection';\r\nimport getTeaserAddToCartSection from './teaserAddToCartSection';\r\nimport { setProductBadges } from './productBadge';\r\nimport {\r\n createElementFromString,\r\n} from '../../helpers/DOMHelpers';\r\n\r\nfunction createCart(options: CreateCartOptions): [HTMLElement, HTMLElement, HTMLElement, HTMLElement, HTMLElement, HTMLElement] {\r\n const { cartOptions, cartState, readonly } = options;\r\n const { cartClass, cartItemListClass, cartSummaryClass, cartPromotionFormClass, cartPromotionsClass, cartGiftWrappingClass } = cartOptions;\r\n\r\n const cartWrapper = createCartWrapper({ cartOptions, cartState, readonly });\r\n const cart = cartWrapper.querySelector(`.${cartClass}`) as HTMLElement;\r\n const cartItemList = cart.querySelector(`.${cartItemListClass}`) as HTMLElement;\r\n const cartPromotionItemList = cart.querySelector(`.${cartPromotionsClass}`) as HTMLElement;\r\n const cartGiftWrapping = cart.querySelector(`.${cartGiftWrappingClass}`) as HTMLElement;\r\n const cartPromotionForm = cart.querySelector(`.${cartPromotionFormClass}`) as HTMLElement;\r\n const cartSummary = cart.querySelector(`.${cartSummaryClass}`) as HTMLElement;\r\n\r\n return [\r\n cartWrapper,\r\n cartItemList,\r\n cartGiftWrapping,\r\n cartPromotionItemList,\r\n cartPromotionForm,\r\n cartSummary,\r\n ];\r\n};\r\n\r\nconst checkShopResponse = (shopRes: ShopResponse) => {\r\n if (shopRes.IsSuccess) {\r\n return shopRes.Data;\r\n } else {\r\n throw new Error(shopRes.Error);\r\n }\r\n};\r\n\r\nconst checkShopResponseWithView = (shopRes: string) => {\r\n const errorField = createElementFromString(`
    ${shopRes}
    `).querySelector('.nx-shop-error');\r\n if (!errorField) {\r\n return shopRes\r\n } else {\r\n throw new Error(errorField.innerHTML);\r\n }\r\n};\r\n\r\nexport {\r\n getSummary,\r\n getPromotionForm,\r\n getPromotions,\r\n getGiftWrapping,\r\n getCartItems,\r\n createButtons,\r\n createCart,\r\n checkShopResponse,\r\n checkShopResponseWithView,\r\n getTeaserShopInfoSection,\r\n getTeaserAddToCartSection,\r\n setProductBadges,\r\n}","/// \r\n\r\nimport AddToCart from '../AddToCart';\r\nimport { setProductBadges } from '../../helpers';\r\nimport { addClass, getContent } from '../../../helpers/DOMHelpers';\r\n\r\nexport default class AddToCartPDP extends AddToCart {\r\n private controls: HTMLElement;\r\n bottomBar: HTMLElement;\r\n\r\n private getQuantity(): number {\r\n const input = this.element.querySelector(this.config.options.inputSelector) as HTMLElementWithNumberValue;\r\n return input && input.value || this.quantity;\r\n }\r\n\r\n protected async init(): Promise {\r\n this.listenToBottomBarInit();\r\n await this.loadPriceInfo();\r\n\r\n this.controls = this.element.querySelector('.nx-add-to-cart-wrapper');\r\n document.addEventListener('addtocart:showAddToCardFlag', () => this.showAddToCardFlagPDP());\r\n\r\n this.listenToQuantityChange();\r\n this.addToCartListener();\r\n this.listenToCartChange();\r\n }\r\n\r\n private listenToBottomBarInit() {\r\n document.addEventListener('productdetailpage:bottombarinit', (e: CustomEvent) => {\r\n this.bottomBar = e.detail as HTMLElement;\r\n const bottomBarButton = this.bottomBar.querySelector('button');\r\n if (!bottomBarButton) return;\r\n\r\n this.addToCartListenerBottomBar(bottomBarButton);\r\n this.listenToQuantityChangeBottomBar();\r\n });\r\n }\r\n\r\n protected async loadPriceInfo(): Promise {\r\n const { getPDPInfoURL } = this.config.urls;\r\n const url = getPDPInfoURL({ productId: this.productId });\r\n\r\n const res = await fetch(url, { credentials: 'include' });\r\n const pdpInfo = await res.json() as PDPShopInfo;\r\n const content = getContent(pdpInfo.ProductPriceInformationMarkUp);\r\n\r\n this.element.innerHTML = content;\r\n setProductBadges({\r\n badges: pdpInfo.Badges,\r\n parrentSelector: '[data-module=\"ProductDetailPage\"] .nx-product-stage__badge',\r\n modifier: 'nx-badge__item--big',\r\n });\r\n document.dispatchEvent(new CustomEvent('addtocart:loadpriceinfo'));\r\n\r\n return pdpInfo;\r\n }\r\n\r\n protected addToCartListener(): void {\r\n const { buttonSelector } = this.config.options;\r\n\r\n this.element.addEventListener('click', ({ target }) => {\r\n const button = (target as HTMLElement).closest(buttonSelector) || (target as HTMLElement).closest('.nx-add-to-cart-mobile-trigger');\r\n\r\n if (!button) return;\r\n\r\n this.button = button as HTMLElement;\r\n this.quantity = this.getQuantity();\r\n this.addToCart(this.productId);\r\n });\r\n }\r\n\r\n private addToCartListenerBottomBar(bottomBarButton: HTMLButtonElement) {\r\n bottomBarButton.addEventListener('click', ({ target }) => {\r\n this.button = target as HTMLElement;\r\n this.quantity = this.getQuantity();\r\n this.addToCart(this.productId);\r\n });\r\n }\r\n\r\n protected listenToQuantityChange(): void {\r\n this.element.addEventListener('change', ({ target }) => { \r\n const input = target;\r\n this.quantity = parseInt(input.value);\r\n const bottomBarInput = this.bottomBar?.querySelector('.nx-range-dropdown');\r\n if(bottomBarInput && bottomBarInput.value != input.value) {\r\n bottomBarInput.dispatchEvent(new CustomEvent('dd:setvalue', {detail: target}));\r\n }\r\n });\r\n }\r\n\r\n private listenToQuantityChangeBottomBar() {\r\n this.bottomBar?.addEventListener('change', ({ target }) => { \r\n const input = this.element.querySelector(this.config.options.inputSelector) as HTMLElementWithNumberValue;\r\n input.value = parseInt((target).value);\r\n input.dispatchEvent(new CustomEvent('dd:setvalue', {detail: input}));\r\n this.quantity = this.getQuantity();\r\n });\r\n }\r\n\r\n protected onCartChange(cart: CartState): this {\r\n const { CurrentPdpInfo } = cart;\r\n if (CurrentPdpInfo && CurrentPdpInfo.ProductDetailPageAddToCartMarkUp && this.productId == CurrentPdpInfo.ProductIdCurrentPDP) {\r\n this.controls.innerHTML = CurrentPdpInfo.ProductDetailPageAddToCartMarkUp;\r\n }\r\n document.dispatchEvent(new CustomEvent('addtocart:cartchange'));\r\n\r\n return this;\r\n }\r\n\r\n protected showAddToCardFlagPDP(): void {\r\n const addToCardPDP = this.element.querySelector(`.${this.getDefaultConfig().options.addToCartFlagBtn}`);\r\n\r\n if (!this.isNBAactivated() && addToCardPDP) {\r\n addClass(addToCardPDP, `${this.getDefaultConfig().options.addToCartFlagBtnVisible}`);\r\n }\r\n }\r\n\r\n protected isNBAactivated() {\r\n const nbaPlaceholder = document.querySelector('.nx-mob-nav__nba-list'),\r\n hasElements = nbaPlaceholder ? nbaPlaceholder.children.length > 0 : false;\r\n\r\n return hasElements;\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n ...super.getDefaultConfig().options,\r\n productIdAttr: 'data-product-id',\r\n buttonSelector: 'button',\r\n inputSelector: '.nx-range-dropdown',\r\n addToCartFlagBtn: 'nx-add-to-cart-flag',\r\n addToCartFlagBtnVisible: 'nx-add-to-cart-flag--visible'\r\n },\r\n };\r\n }\r\n}\r\n","import AddToCartPDP from \"./AddToCartPDP\";\r\nimport ClassWithTracking from \"../../../ClassWithTracking\";\r\nimport { getPriceValue } from \"../../../ClassWithTracking/helpers\";\r\n\r\nexport default class AddToCarPDPtWithT extends ClassWithTracking(AddToCartPDP) {\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n }\r\n\r\n protected async loadPriceInfo(): Promise {\r\n const PDPInfo = await super.loadPriceInfo();\r\n const ProductPriceInformationMarkUpHTML = new DOMParser().parseFromString(PDPInfo.ProductPriceInformationMarkUp, 'text/html');\r\n const priceFromMarkUp = ProductPriceInformationMarkUpHTML.querySelector('.nx-price') ? getPriceValue(ProductPriceInformationMarkUpHTML.querySelector('.nx-price').innerHTML) : null;\r\n this.initTracking(priceFromMarkUp);\r\n this.element.classList.add('nx-add-to-cart--prices-loaded');\r\n return PDPInfo;\r\n }\r\n\r\n //@ToDo Add switch to disable if UA tracking is disabled\r\n protected initTracking(productPrice: number) {\r\n const currencyCode =this.dataLayer[0].hasOwnProperty('currencyCode') ? this.dataLayer[0].currencyCode : '';\r\n const productNameNode: HTMLElement = document.querySelector('h1.nx-product-stage__headline');\r\n const productName: string = productNameNode !== null ? productNameNode.innerHTML : '';\r\n const productCategory: string = this.dataLayer[0].hasOwnProperty('category') ? this.dataLayer[0].category : '';\r\n const productVariantNode: HTMLElement = document.querySelector('.nx-product-stage .nx-pas__product-attribute:last-child');\r\n const productVariant: string = productVariantNode !== null ? productVariantNode.innerHTML : '';\r\n const brand: string = this.dataLayer[0].hasOwnProperty('brand') ? this.dataLayer[0].brand : '';\r\n \r\n\r\n this.dataLayer.push({\r\n event: 'productDetails',\r\n ecommerce: {\r\n currencyCode: currencyCode,\r\n detail: {\r\n products: [{\r\n id: `${this.productId}`,\r\n name: productName,\r\n brand: brand,\r\n category: productCategory,\r\n variant: productVariant,\r\n price: productPrice ? productPrice.toFixed(2) : \"\",\r\n }]\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n}","import AddToCartPDP from './AddToCartPDPWithT';\r\nexport default AddToCartPDP;","import { createSpan, addToElement } from '../../../helpers/DOMHelpers';\r\n\r\nexport default class CartAmountIcon {\r\n private icon: HTMLElement;\r\n private firstLoad: boolean = false;\r\n\r\n constructor(private parent: HTMLElement , private options: CartOptions) {\r\n this.icon = createSpan(this.options.cartIconAmountClass);\r\n addToElement(this.parent, this.icon);\r\n }\r\n\r\n private animateCartAmount(element, amountAnimationClass: string): void {\r\n element.classList.remove(amountAnimationClass);\r\n requestAnimationFrame(() => element.classList.add(amountAnimationClass));\r\n }\r\n\r\n private getQuantity(cart: CartState): string {\r\n return cart.Items.length > 0\r\n ? cart.Items.reduce((acc, itm) => acc + itm.Quantity, 0).toString() // to not count FREE Producst use: cart.Items.reduce((acc, itm) => acc + (this.isProductFree(itm) ? 0 : itm.Quantity), 0).toString()\r\n : '';\r\n }\r\n\r\n protected isProductFree(product: CartItem): boolean {\r\n return product.IsFree;\r\n }\r\n\r\n updateCartAmountIcon(cart: CartState): void {\r\n const { cartIconAmountClass } = this.options;\r\n\r\n this.icon.innerHTML = this.getQuantity(cart);\r\n\r\n if (this.firstLoad) {\r\n this.animateCartAmount(this.icon, `${cartIconAmountClass}--animate`);\r\n }\r\n\r\n this.firstLoad = true;\r\n }\r\n}\r\n","import _ShopModule from '../_ShopModule';\r\n\r\nexport default class CartContentOverviewBasic extends _ShopModule {\r\n constructor(element, config) {\r\n super(element, config);\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n cartClass: 'nx-shop-cart',\r\n cartItemListClass: 'nx-shop-cart-list',\r\n cartItemClass: 'nx-shop-cart-item',\r\n cartGiftWrappingClass: 'nx-shop-cart__gift-wrapping',\r\n cartPromotionsClass: 'nx-shop-cart__promotion-list',\r\n cartPromotionFormClass: 'nx-shop-cart__promotion-form',\r\n cartSummaryClass: 'nx-shop-cart__summary',\r\n cartIconAmountClass: 'nx-shop-cart__icon-amount',\r\n cartCheckOutBtnClass: '',\r\n cartContinueBtnClass: '',\r\n checkOutURL: '',\r\n AddPromotionURL: '',\r\n RemovePromotionURL: '',\r\n currentProductID: '',\r\n cartQuantityFieldClass: 'nx-range-dropdown__label-value',\r\n },\r\n };\r\n }\r\n}","import CartContent from './CartContent';\r\nexport default CartContent;","import CartContentOverviewBasic from '../CartContentOverviewBasic';\r\n\r\nimport {\r\n addClass,\r\n // addToElement\r\n // createElementFromString,\r\n} from '../../../../helpers/DOMHelpers';\r\nimport {\r\n requestAnimationFrameTimer,\r\n // isNotUndefined\r\n} from '../../../../helpers/helperFunctions';\r\nimport {\r\n // createCart,\r\n // createButtons,\r\n // getCartItems,\r\n // getSummary,\r\n // getPromotionForm,\r\n // getPromotions,\r\n // checkShopResponse,\r\n checkShopResponseWithView\r\n // getGiftWrapping\r\n} from '../../../helpers';\r\n\r\nexport default class CartContent extends CartContentOverviewBasic {\r\n protected content: HTMLElement;\r\n protected list: HTMLElement;\r\n protected giftWrapping: HTMLElement;\r\n // private summary: HTMLElement;\r\n // private promotionList: HTMLElement;\r\n // private promotionForm: HTMLElement;\r\n protected options: CartContentOptions;\r\n // private buttons: HTMLElement;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n this.options = this.config.options;\r\n // console.log(\"test 1\", element, this.config.urls);\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.content = this.element.querySelector('.nx-shop-cart-outer');\r\n\r\n // this.listenToCartChange();\r\n if (this.isEmptyCart(this.content)) {\r\n this.showEmptyCart();\r\n return this\r\n }\r\n\r\n this.addButtons();\r\n this.listenToQuantityChange();\r\n this.listenToRemove();\r\n\r\n // this.updateCartButtonState(Items);\r\n\r\n return this;\r\n }\r\n\r\n // private listenToCartChange(): this {\r\n // const { actions: { subscribeToCart } } = this.config;\r\n\r\n // subscribeToCart((cartState: CartState) => {\r\n // this.createCartContent(cartState)\r\n // .update(cartState);\r\n // }, this.element);\r\n\r\n // return this;\r\n // }\r\n\r\n // protected createCartContent(cartState: CartState): this {\r\n // if (!isNotUndefined(this.content, this.list, this.giftWrapping, this.promotionList, this.promotionForm, this.summary)) {\r\n // [this.content, this.list, this.giftWrapping, this.promotionList, this.promotionForm, this.summary] = createCart({ cartOptions: this.options, cartState: cartState });\r\n\r\n // this.addButtons(cartState)\r\n // .listenToRemove()\r\n // .listenToQuantityChange();\r\n\r\n // addToElement(this.element, this.content);\r\n // }\r\n\r\n // return this;\r\n // }\r\n\r\n protected addButtons(cartState?: CartState): this {\r\n const { cartClass } = this.options;\r\n const { actions } = this.config;\r\n // const { CartOverviewLabels } = cartState;\r\n // const cart = this.content.querySelector(`.${cartClass}`) as HTMLElement;\r\n // this.buttons = createButtons(this.options, this.config, CartOverviewLabels)\r\n\r\n // console.log(\"test 333\", this.buttons, this.options, this.config);\r\n\r\n // addToElement(cart, this.buttons);\r\n\r\n //\r\n\r\n const continueBtn = this.element.querySelector(`.${cartClass}__continue-btn`);\r\n continueBtn.addEventListener('click', actions.hideEShopPart);\r\n continueBtn.addEventListener('keyup', (e: KeyboardEvent) => e.key === \"Enter\" ? window.NiveaX.layer.close(): \"\");\r\n\r\n return this;\r\n }\r\n\r\n protected updateCartButtonState(items) {\r\n const { cartClass } = this.options,\r\n hasInvalidItems = items.filter(item => item.IsValid == false).length > 0,\r\n checkOutButton = this.content.querySelector(`.${cartClass}__checkout-btn`);\r\n\r\n (hasInvalidItems) ? checkOutButton.setAttribute('disabled', '') : checkOutButton.removeAttribute('disabled')\r\n }\r\n\r\n protected listenToRemove(): this {\r\n // this.list.addEventListener('click', (e) => this.removeProduct(e));\r\n this.element.addEventListener('click', (e) => this.removeProduct(e));\r\n\r\n return this;\r\n }\r\n\r\n protected removeProduct(event: Event): void {\r\n const {\r\n // getRemoveItemFromCartURL,\r\n getRemoveItemFromCartWithViewURL\r\n } = this.config.urls;\r\n const { cartItemClass, currentProductID } = this.options;\r\n\r\n const target = event.target as HTMLElement;\r\n const closeBtn = target.closest(`.${cartItemClass}__remove`);\r\n const item = target.closest(`.${cartItemClass}`) as HTMLElement;\r\n\r\n if (closeBtn == null || item == null) return;\r\n\r\n const productId = item.getAttribute('data-item-id');\r\n // const url = getRemoveItemFromCartURL({ productId, currentProductID });\r\n const urlWithView = getRemoveItemFromCartWithViewURL({ productId, currentProductID });\r\n\r\n addClass(item, `${cartItemClass}--close`);\r\n\r\n\r\n // this.fetchAndUpdateStore(url);\r\n\r\n this.fetchAndUpdateContentWithView(urlWithView);\r\n }\r\n\r\n private listenToQuantityChange(): this {\r\n\r\n // this.list.addEventListener('change', e => this.changeQuantity(e));\r\n this.element.addEventListener('change', e => this.changeQuantity(e));\r\n\r\n return this;\r\n }\r\n\r\n protected changeQuantity(e: Event): void {\r\n\r\n const {\r\n // getUpdateItemQuantityURL,\r\n getUpdateItemQuantityWithViewURL\r\n } = this.config.urls;\r\n const { cartItemClass, currentProductID } = this.options;\r\n\r\n const quantityInput = event.target as HTMLElementWithNumberValue;\r\n const item = quantityInput.closest(`.${cartItemClass}`);\r\n\r\n if (item == null) return;\r\n\r\n const productId = item.getAttribute('data-item-id');\r\n const quantity = quantityInput.value;\r\n // const url = getUpdateItemQuantityURL({ productId, quantity, currentProductID });\r\n const urlWithView = getUpdateItemQuantityWithViewURL({ productId, quantity, currentProductID });\r\n\r\n // this.fetchAndUpdateStore(url);\r\n this.fetchAndUpdateContentWithView(urlWithView);\r\n }\r\n\r\n private showEmptyCart(): this {\r\n const { urls: { getEmptyCartURL }, actions: { showEShopPart } } = this.config;\r\n showEShopPart(getEmptyCartURL(null));\r\n return this;\r\n }\r\n\r\n private fetchAndUpdateContentWithView(url: string): void {\r\n const {\r\n startSpinner,\r\n stopSpinner,\r\n refreshCartState,\r\n updateContent\r\n } = this.config.actions;\r\n\r\n const { getCartItemsURL } = this.config.urls;\r\n\r\n startSpinner();\r\n requestAnimationFrameTimer(() =>\r\n fetch(url, { method: 'POST', credentials: 'include' })\r\n .then(res => res.text())\r\n .then(checkShopResponseWithView)\r\n .then(data => updateContent(this.element, data, this.showEmptyCart.bind(this)))\r\n .then(() => refreshCartState(getCartItemsURL(null)))\r\n .then(() => this.showAddToCardFlag())\r\n .then(() => this.initTracking())\r\n .finally(() => stopSpinner()),\r\n 300);\r\n }\r\n\r\n private isEmptyCart(node) {\r\n const shopNodeList = node.querySelector('.nx-shop-cart-list');\r\n return (shopNodeList) ? false : true;\r\n }\r\n\r\n private initTracking() {\r\n document.dispatchEvent(new CustomEvent('NiveaBasicTracking:reInitHandlers'));\r\n }\r\n\r\n // private fetchAndUpdateStore(url: string): void {\r\n // const { updateCartStore, startSpinner, stopSpinner } = this.config.actions;\r\n\r\n // startSpinner();\r\n // requestAnimationFrameTimer(() =>\r\n // fetch(url, { credentials: 'include' })\r\n // .then(res => res.json())\r\n // .then(checkShopResponse)\r\n // .then(updateCartStore)\r\n // .then(() => this.showAddToCardFlag())\r\n // .catch(err => alert(err))\r\n // .finally(() => stopSpinner()),\r\n // 300);\r\n // }\r\n\r\n getContent(): HTMLElement {\r\n return this.content;\r\n }\r\n\r\n // update(cartState: CartState): void {\r\n // const { Items, Summary, CartOverviewLabels, PromotionForm, Promotions, GiftWrapping } = cartState;\r\n\r\n // if (Items.length === 0) {\r\n // this.showEmptyCart();\r\n // return;\r\n // }\r\n\r\n // const cartItems = getCartItems(Items, this.options, CartOverviewLabels);\r\n // const cartGiftWrapper = getGiftWrapping(GiftWrapping, this.options, true);\r\n // const cartPromotions = getPromotions(Promotions, this.options);\r\n // const cartPromotionForm = getPromotionForm(PromotionForm, this.options);\r\n // const cartSummary = getSummary(Summary, this.options, CartOverviewLabels);\r\n\r\n // this.list.innerHTML = cartItems;\r\n // if (this.giftWrapping) this.giftWrapping.innerHTML = Object.entries(GiftWrapping).length > 0 ? cartGiftWrapper : '';\r\n // this.promotionList.innerHTML = cartPromotions;\r\n // this.promotionForm.innerHTML = cartPromotionForm;\r\n // this.summary.innerHTML = cartSummary;\r\n // this.updateCartButtonState(Items);\r\n // }\r\n\r\n protected showAddToCardFlag(): void {\r\n document.dispatchEvent(new CustomEvent('addtocart:showAddToCardFlag'));\r\n }\r\n}\r\n","import Cart from './Cart';\r\nimport CartContent from './CartContent/';\r\nimport CartContentOverviewBasic from './CartContentOverviewBasic';\r\n\r\nexport {\r\n CartContent,\r\n CartContentOverviewBasic,\r\n};\r\n\r\nexport default Cart;","import _ShopModule from '../_ShopModule';\r\nimport CartAmountIcon from './CartAmountIcon';\r\n\r\nexport default class Cart extends _ShopModule {\r\n private options: CartOptions;\r\n private amountIcon: CartAmountIcon;\r\n private isCartEmpty: boolean = true;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n this.options = this.config.options;\r\n this.amountIcon = new CartAmountIcon(this.element, this.options);\r\n\r\n this.init();\r\n }\r\n\r\n private init(): void {\r\n this.listenToClick()\r\n .listenToCartChange()\r\n .listenToOpenCart();\r\n }\r\n\r\n private listenToCartChange(): this {\r\n const { subscribeToCart } = this.config.actions;\r\n\r\n subscribeToCart((cart: CartState) => {\r\n this.isCartEmpty = cart.Items.length === 0;\r\n this.amountIcon.updateCartAmountIcon(cart);\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private listenToClick(): this {\r\n this.element.addEventListener('click', e => {\r\n e.preventDefault();\r\n this.openCart();\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private async openCart(): Promise {\r\n const { urls: { getCartOverviewURL, getEmptyCartURL, getCartItemsURL }, actions: { showEShopPart, refreshCartState } } = this.config;\r\n\r\n await refreshCartState(getCartItemsURL(null));\r\n\r\n showEShopPart(this.isCartEmpty ? getEmptyCartURL(null) : getCartOverviewURL(null));\r\n\r\n document.dispatchEvent(new CustomEvent('addtocart:showAddToCardFlag'));\r\n\r\n return this;\r\n }\r\n\r\n private listenToOpenCart(): this {\r\n document.addEventListener('eshop:opencart', () => this.openCart());\r\n return this;\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n cartIconAmountClass: 'nx-shop-cart__icon-amount',\r\n },\r\n };\r\n }\r\n};\r\n","import CartGiftWrappingModule from './CartGiftWrappingModule';\r\n\r\nexport default CartGiftWrappingModule;","import _ShopModule from '../_ShopModule';\r\nimport { requestAnimationFrameTimer } from '../../../helpers/helperFunctions';\r\nimport {\r\n // checkShopResponse,\r\n checkShopResponseWithView\r\n} from '../../helpers';\r\n\r\nexport default class CartGiftWrappingModule extends _ShopModule {\r\n private giftWrappingProductId: string;\r\n private giftWrappingInput: HTMLInputElement;\r\n private giftWrappingItem: HTMLElement;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n this.init();\r\n // this.listenToCartChange();\r\n }\r\n\r\n // private listenToCartChange(): this {\r\n // const { actions: { subscribeToCart } } = this.config;\r\n\r\n // subscribeToCart(() => {\r\n // this.init();\r\n // });\r\n\r\n // return this;\r\n // }\r\n\r\n private init(): this {\r\n const wrappableProductId = this.element.querySelector('[data-product-id]');\r\n if (!wrappableProductId) return;\r\n\r\n this.giftWrappingProductId = wrappableProductId.getAttribute('data-product-id');\r\n this.giftWrappingInput = this.element.querySelector('input');\r\n this.giftWrappingItem = document.querySelector(`[data-gift-wrap=\"True\"]`);\r\n\r\n // if (this.giftWrappingItem) {\r\n // this.setInputChecked();\r\n // }\r\n\r\n this.giftWrappingInput.addEventListener('change', () => this.toggleGiftWrapping());\r\n\r\n return this;\r\n }\r\n\r\n // private setInputChecked() {\r\n // this.giftWrappingInput.checked = true;\r\n // }\r\n\r\n private toggleGiftWrapping() {\r\n if (this.giftWrappingInput.checked) {\r\n this.addGiftWrappingItem(this.giftWrappingProductId);\r\n } else {\r\n this.removeGiftWrappingItem();\r\n }\r\n }\r\n\r\n protected addGiftWrappingItem(productId: string): void {\r\n const {\r\n // getAddToCartURL,\r\n getAddToCartWithViewURL } = this.config.urls;\r\n const quantity = 1;\r\n const currentProductID = '';\r\n\r\n // const url = getAddToCartURL({ productId, quantity, currentProductID });\r\n const url = getAddToCartWithViewURL({ productId, quantity, currentProductID });\r\n\r\n // this.fetchAndUpdateStore(url);\r\n this.fetchAndUpdateContentWithView(url)\r\n }\r\n\r\n protected removeGiftWrappingItem(): void {\r\n (this.giftWrappingItem.querySelector('.nx-shop-cart-item__remove') as HTMLElement).click();\r\n }\r\n\r\n // private fetchAndUpdateStore(url: string): void {\r\n // const { updateCartStore, startSpinner, stopSpinner } = this.config.actions;\r\n\r\n // startSpinner();\r\n // requestAnimationFrameTimer(() =>\r\n // fetch(url, { credentials: 'include' })\r\n // .then(res => res.json())\r\n // .then(checkShopResponse)\r\n // .then(updateCartStore)\r\n // .then(() => this.showAddToCardFlag())\r\n // .catch(err => alert(err))\r\n // .finally(() => stopSpinner()),\r\n // 300);\r\n // }\r\n\r\n private fetchAndUpdateContentWithView(url: string): void {\r\n const {\r\n startSpinner,\r\n stopSpinner,\r\n refreshCartState,\r\n updateContent\r\n } = this.config.actions;\r\n\r\n const { getCartItemsURL } = this.config.urls;\r\n const shopWrapper = this.element.closest('.nx-nx-shop-cart--view')\r\n\r\n startSpinner();\r\n requestAnimationFrameTimer(() =>\r\n fetch(url, { method: 'POST', credentials: 'include' })\r\n .then(res => res.text())\r\n .then(checkShopResponseWithView)\r\n .then(data => updateContent(shopWrapper, data))\r\n .then(() => refreshCartState(getCartItemsURL(null)))\r\n .then(() => this.showAddToCardFlag())\r\n .finally(() => stopSpinner()),\r\n 300);\r\n }\r\n\r\n protected showAddToCardFlag(): void {\r\n document.dispatchEvent(new CustomEvent('addtocart:showAddToCardFlag'));\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n cartClass: 'nx-shop-cart',\r\n cartItemListClass: 'nx-shop-cart-list',\r\n cartItemClass: 'nx-shop-cart-item',\r\n cartGiftWrappingClass: 'nx-shop-cart__gift-wrapping',\r\n cartPromotionsClass: 'nx-shop-cart__promotion-list',\r\n cartPromotionFormClass: 'nx-shop-cart__promotion-form',\r\n cartSummaryClass: 'nx-shop-cart__summary',\r\n cartIconAmountClass: 'nx-shop-cart__icon-amount',\r\n cartCheckOutBtnClass: '',\r\n cartContinueBtnClass: '',\r\n checkOutURL: '',\r\n AddPromotionURL: '',\r\n RemovePromotionURL: '',\r\n currentProductID: '',\r\n },\r\n };\r\n }\r\n}","import { requestAnimationFrameTimer } from '../../../helpers/helperFunctions';\r\nimport {\r\n checkShopResponse,\r\n checkShopResponseWithView\r\n} from '../../helpers';\r\n\r\n\r\nexport default class PromotionList {\r\n private options: CartPromotionClasses;\r\n private promotionList: HTMLElement;\r\n\r\n constructor(private element: HTMLElement, private config: ShopModuleConfig, private cartClass: string) {\r\n this.options = this.config.options;\r\n this.init();\r\n }\r\n\r\n private init(): this {\r\n this.promotionList = this.element.querySelector(`.${this.cartClass + this.options.PromotionList}`);\r\n if (!this.promotionList) return;\r\n this.listenToRemovePromotion();\r\n\r\n return this;\r\n }\r\n\r\n private listenToRemovePromotion(): this {\r\n const { startSpinner } = this.config.actions;\r\n\r\n this.promotionList.addEventListener('click', event => {\r\n if (!(event.target as HTMLElement).classList.contains('nx-close-icon')) return;\r\n const removePromotion: Element = (event.target as Element).closest('.nx-shop-cart-item__remove-icon'),\r\n promotion: Element = removePromotion.closest('.nx-cost-row');\r\n let removeCouponUrl = removePromotion.getAttribute('data-ajax-url') + '&code=' + promotion.getAttribute('data-item-id');\r\n startSpinner();\r\n requestAnimationFrameTimer(() => {\r\n this.removeNiveaPromotion(removeCouponUrl);\r\n }, 300);\r\n })\r\n return this;\r\n }\r\n\r\n\r\n private removeNiveaPromotion(removeCouponUrl: string) {\r\n const {\r\n updateCartStore,\r\n stopSpinner, updateContent, refreshCartState } = this.config.actions;\r\n const { getCartItemsURL } = this.config.urls;\r\n const shopWrapper = this.element.closest('.nx-nx-shop-cart--view')\r\n\r\n if (this.element.hasAttribute('data-fe-markup')) {\r\n fetch(removeCouponUrl, { credentials: 'include' })\r\n .then(res => res.json())\r\n .then(checkShopResponse)\r\n .then(res => updateCartStore(res))\r\n .then(() => this.showAddToCardFlag())\r\n .catch(err => alert(err))\r\n .finally(() => stopSpinner());\r\n } else {\r\n fetch(removeCouponUrl, { method: 'POST', credentials: 'include' })\r\n .then(res => res.text())\r\n .then(checkShopResponseWithView)\r\n .then(res => updateContent(shopWrapper, res))\r\n .then(() => refreshCartState(getCartItemsURL(null)))\r\n .then(() => this.showAddToCardFlag())\r\n .catch(err => alert(err))\r\n .finally(() => stopSpinner());\r\n }\r\n }\r\n\r\n protected showAddToCardFlag(): void {\r\n document.dispatchEvent(new CustomEvent('addtocart:showAddToCardFlag'));\r\n }\r\n}\r\n","import { requestAnimationFrameTimer } from '../../../helpers/helperFunctions';\r\nimport {\r\n createElementFromString,\r\n} from '../../../helpers/DOMHelpers';\r\n\r\nexport default class PromotionForm {\r\n private options: CartPromotionClasses;\r\n private redeemPromotionButton: HTMLButtonElement;\r\n private promotionForm: HTMLElement;\r\n private promotionInput: HTMLInputElement;\r\n private promotionError: HTMLElement;\r\n\r\n constructor(private element: HTMLElement, private config: ShopModuleConfig, private cartClass: string) {\r\n this.options = config.options;\r\n this.listenToCartChange();\r\n }\r\n\r\n private listenToCartChange(): this {\r\n const { subscribeToCart } = this.config.actions;\r\n\r\n if (window.NiveaX.isOwnSkinCareBrand || !this.element.hasAttribute('data-fe-markup')) {\r\n this.init();\r\n }\r\n else {\r\n subscribeToCart((cart: CartState) => {\r\n this.init();\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n private init(): this {\r\n this.redeemPromotionButton = this.element.querySelector(`.${this.cartClass + this.options.RedeemPromotion}`);\r\n this.promotionForm = this.element.querySelector(`.${this.cartClass + this.options.PromotionForm}`);\r\n this.promotionInput = this.element.querySelector(`.${this.cartClass + this.options.PromotionInput}`);\r\n this.promotionError = this.element.querySelector(`.${this.cartClass + this.options.PromotionError}`);\r\n\r\n if (!this.promotionInput) return;\r\n\r\n if (this.promotionInput.value == '') {\r\n this.hideButton();\r\n }\r\n\r\n this.promotionFormInputOnTyping()\r\n .promotionFormInputLabelAnimationFocus()\r\n .promotionFormInputLabelAnimationBlur()\r\n .redeemPromotion()\r\n .removeOWNCouponErrorMessage()\r\n .promotionFormInputOnKeyup();\r\n\r\n return this;\r\n }\r\n\r\n private redeemPromotion() {\r\n const { startSpinner } = this.config.actions;\r\n\r\n this.redeemPromotionButton.addEventListener('click', event => {\r\n event.preventDefault();\r\n\r\n if (!this.promotionInput.value) {\r\n this.promotionEmptyInput();\r\n return this;\r\n }\r\n\r\n startSpinner();\r\n this.redeemPromotionButton.disabled = true;\r\n\r\n requestAnimationFrameTimer(() => {\r\n const formAjaxUrl = this.redeemPromotionButton.dataset.formAjaxUrl;\r\n const value = this.promotionInput.value;\r\n const url = `${formAjaxUrl}&code=${value}`;\r\n \r\n this.redeemPromotionNivea(url);\r\n })\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private redeemPromotionNivea(url) {\r\n const {\r\n updateCartStore,\r\n updateContent,\r\n stopSpinner,\r\n refreshCartState\r\n } = this.config.actions;\r\n const { getCartItemsURL } = this.config.urls;\r\n const shopWrapper = this.element.closest('.nx-nx-shop-cart--view')\r\n\r\n if (this.element.hasAttribute('data-fe-markup')) {\r\n fetch(url, { credentials: 'include' })\r\n .then(res => res.json())\r\n .then((res: ShopResponse) => res.IsSuccess ? updateCartStore(res.Data) : this.redeemPromotionError(res.Error, true))\r\n .then(() => this.showAddToCardFlag())\r\n .catch(err => console.error(err))\r\n .finally(() => { this.redeemPromotionButton.disabled = false; stopSpinner() })\r\n } else {\r\n fetch(url, { method: 'POST', credentials: 'include' })\r\n .then(res => res.text())\r\n .then((res) => this.isShopRequestSuccess(res) ? updateContent(shopWrapper, res) : this.redeemPromotionError(res))\r\n .then(() => refreshCartState(getCartItemsURL(null)))\r\n .then(() => this.showAddToCardFlag())\r\n .catch(err => console.error(err))\r\n .finally(() => { this.redeemPromotionButton.disabled = false; stopSpinner() })\r\n }\r\n }\r\n\r\n private isShopRequestSuccess(shopRes) {\r\n const errorField = createElementFromString(`
    ${shopRes}
    `).querySelector('.nx-shop-error');\r\n return (!errorField);\r\n }\r\n\r\n private redeemPromotionError(data: string, isJson = false) {\r\n if (isJson) {\r\n this.promotionError.innerHTML = data;\r\n this.promotionForm.querySelector(\".nx-shop-cart__promotion-form-field\")?.classList?.add(\"nx-shop-cart__promotion-form-field--error\");\r\n } else {\r\n const resErrorField = createElementFromString(`
    ${data}
    `).querySelector('.nx-shop-error') as HTMLElement;\r\n if (resErrorField) {\r\n const errorField = this.element.querySelector('.nx-shop-cart__promotion-form-error') as HTMLElement;\r\n errorField.innerText = resErrorField.innerText;\r\n this.promotionForm.querySelector(\".nx-shop-cart__promotion-form-field\")?.classList?.add(\"nx-shop-cart__promotion-form-field--error\");\r\n }\r\n }\r\n }\r\n\r\n private promotionEmptyInput() {\r\n this.promotionError.innerHTML = this.promotionError.dataset.validationError;\r\n }\r\n\r\n private promotionFormInputOnTyping(): this {\r\n this.promotionInput.addEventListener('input', event => {\r\n const input: HTMLInputElement = event.target as HTMLInputElement;\r\n (input.value) ? this.element.classList.add(this.cartClass + this.options.PromotionForm + '--show-btn') : this.element.classList.remove(this.cartClass + this.options.PromotionForm + '--show-btn');\r\n });\r\n\r\n return this;\r\n }\r\n private promotionFormInputOnKeyup(): this {\r\n this.promotionInput.addEventListener('keyup', event => {\r\n const input: HTMLInputElement = event.target as HTMLInputElement;\r\n if (input.value && event.keyCode === 13) {\r\n event.preventDefault();\r\n this.redeemPromotionButton.click();\r\n }\r\n\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private promotionFormInputLabelAnimationFocus(): this {\r\n this.promotionInput.addEventListener('focus', event => {\r\n const input: HTMLInputElement = event.target as HTMLInputElement;\r\n input.parentElement.classList.add(this.cartClass + this.options.PromotionInput + '--focus');\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private promotionFormInputLabelAnimationBlur(): this {\r\n this.promotionInput.addEventListener('blur', event => {\r\n const input: HTMLInputElement = event.target as HTMLInputElement;\r\n if (!input.value) input.parentElement.classList.remove(this.cartClass + this.options.PromotionInput + '--focus');\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private removeOWNCouponErrorMessage() {\r\n const removeBtn = this.element.querySelector('.nx-shop-cart__promotion-error .nx-shop-cart-item__remove-icon');\r\n if (removeBtn && window.NiveaX.isOwnSkinCareBrand) {\r\n removeBtn.addEventListener('click', () => removeBtn.parentElement.remove());\r\n }\r\n\r\n return this\r\n }\r\n\r\n protected showAddToCardFlag(): void {\r\n document.dispatchEvent(new CustomEvent('addtocart:showAddToCardFlag'));\r\n }\r\n\r\n protected hideButton(): void {\r\n this.element.classList.remove(`${this.cartClass + this.options.PromotionForm}--show-btn`);\r\n }\r\n}\r\n","import CartPromotion from './CartPromotion';\r\n\r\nexport default CartPromotion;","import _ShopModule from '../_ShopModule';\r\nimport PromotionList from './PromotionList';\r\nimport PromotionForm from './PromotionForm';\r\n\r\nexport default class CartPromotion extends _ShopModule {\r\n private cartClass: string;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n this.init();\r\n }\r\n\r\n private init(): this {\r\n this.cartClass = 'nx-shop-cart'; \r\n new PromotionList(this.element, this.config, this.cartClass);\r\n new PromotionForm(this.element, this.config, this.cartClass);\r\n\r\n return this;\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n AddPromotion: '__add-promotion',\r\n ClosePromotion: '__close-promotion',\r\n PromotionFormWrapper: '__promotion-form-wrapper',\r\n RedeemPromotion: '__redeem-promotion',\r\n PromotionInput: '__promotion-form-input',\r\n PromotionError: '__promotion-form-error',\r\n PromotionList: '__promotion-list',\r\n PromotionForm: '__promotion-form',\r\n },\r\n };\r\n }\r\n}","import { CartContentOverviewBasic } from './../Cart';\r\n\r\n// import { createCart } from '../../helpers';\r\n\r\nexport default class Overview extends CartContentOverviewBasic {\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n this.init();\r\n }\r\n\r\n protected async init(): Promise {\r\n const { actions: {\r\n // subscribeToCart,\r\n refreshCartState } } = this.config;\r\n\r\n await refreshCartState(this.config.urls.getCartItemsURL(null));\r\n\r\n // subscribeToCart(cart => {\r\n // const [ overviewNode ] = createCart({\r\n // cartOptions: this.config.options,\r\n // cartState: cart,\r\n // readonly: true,\r\n // });\r\n\r\n // this.element.appendChild(overviewNode);\r\n // });\r\n\r\n return this;\r\n }\r\n}","import Overview from './Overview';\r\nimport ClassWithTracking from \"../../../ClassWithTracking\";\r\n\r\nexport default class OverviewWithT extends ClassWithTracking(Overview) {\r\n private cart: CartState;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n this.config.actions.subscribeToCart(cart => {\r\n this.cart = cart;\r\n });\r\n if (!this.getParamFromURL()) this.initTracking();\r\n }\r\n\r\n private getParamFromURL() {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n return urlParams.get('fast-forward');\r\n }\r\n\r\n protected initTracking() {\r\n if (this.cart.Items.length === 0) return;\r\n this.saveOverviewData();\r\n }\r\n\r\n protected saveOverviewData() {\r\n localStorage.setItem('cartState', JSON.stringify(this.cart));\r\n }\r\n}","import OverviewWithT from './OverviewWithT';\r\nexport default OverviewWithT;","import { _ShopModuleConstructor } from './modules/_ShopModule';\r\nimport AddToCartPDP from './modules/AddToCartPDP';\r\nimport AddToCart from './modules/AddToCart';\r\n// import AddToCartMultiple from './modules/AddToCartMultiple'; //will be implemented when api is ready\r\nimport Cart, { CartContent } from './modules/Cart';\r\nimport CartGiftWrappingModule from './modules/CartGiftWrappingModule';\r\nimport CartPromotion from './modules/CartPromotion';\r\nimport CartNotifier from './modules/CartNotifier';\r\nimport GoToCartLink from './modules/GoToCartLink';\r\nimport Overview from './modules/Overview/';\r\nimport PaymentSummaryModule from './modules/PaymentSummaryModule';\r\n\r\nconst modules = {\r\n AddToCartPDP,\r\n AddToCart,\r\n Cart,\r\n CartGiftWrappingModule,\r\n CartPromotion,\r\n CartNotifier,\r\n GoToCartLink,\r\n Overview,\r\n CartContent,\r\n PaymentSummaryModule,\r\n};\r\n\r\n\r\n\r\ntype ModuleLoaderSetupOptions = {\r\n Module: any;\r\n moduleName: string;\r\n attribute: string;\r\n config: ShopModuleConfig;\r\n}\r\n\r\nexport default class ModuleLoader {\r\n constructor(private options: AppOptions) {\r\n this.initModules();\r\n }\r\n\r\n private getConfig(moduleName: string, options: AppOptions): ShopModuleConfig {\r\n return {\r\n options: options.moduleOptions[moduleName],\r\n actions: options.actions,\r\n urls: options.urls,\r\n };\r\n }\r\n\r\n private setup({ Module, moduleName, attribute, config }: ModuleLoaderSetupOptions): void {\r\n Array.from(document.querySelectorAll(`[${attribute}=${moduleName}]`))\r\n .filter((node: HTMLElement) => !node.dataset.eShopModuleInitialized)\r\n .forEach((element: HTMLElement) => {\r\n new Module(element, config);\r\n element.setAttribute('data-e-shop-module-initialized', 'true');\r\n });\r\n }\r\n\r\n initModules(): this {\r\n const { attribute } = this.options;\r\n Object.entries(modules).forEach(([moduleName, Module]) =>\r\n this.setup({\r\n config: this.getConfig(moduleName, this.options),\r\n Module,\r\n moduleName,\r\n attribute,\r\n })\r\n );\r\n\r\n return this;\r\n }\r\n}","/// \r\n\r\nimport _ShopModule from './_ShopModule';\r\n\r\nexport default class CartNotifier extends _ShopModule<{}> {\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n this.listenToCartChange();\r\n }\r\n\r\n private listenToCartChange(): this {\r\n const { actions: { subscribeToCart } } = this.config;\r\n\r\n subscribeToCart(cart => {\r\n const amount = cart.Items.reduce((acc, itm) => acc + itm.Quantity, 0);\r\n \r\n if (amount > 0) {\r\n requestAnimationFrame(() => {\r\n this.element.classList.remove(\"e-shop-cart-change\");\r\n requestAnimationFrame(() => this.element.classList.add(\"e-shop-cart-change\"));\r\n });\r\n } else {\r\n requestAnimationFrame(() => {\r\n this.element.classList.remove(\"e-shop-cart-change\");\r\n });\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {};\r\n }\r\n}","/// \r\n\r\nimport _ShopModule from './_ShopModule';\r\nimport { toggleClass } from '../../helpers/DOMHelpers'; \r\n\r\nexport default class GoToCartLink extends _ShopModule {\r\n private isCartEmpty: boolean = true;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n this.config = this.mergeConfig(this.getDefaultConfig(), config);\r\n\r\n this.listenToCartChange()\r\n .listenToLinkClick();\r\n }\r\n\r\n private listenToCartChange(): this {\r\n const { actions: { subscribeToCart }, options } = this.config;\r\n\r\n subscribeToCart((cart: CartState) => {\r\n this.isCartEmpty = cart.Items.length === 0;\r\n requestAnimationFrame(() => toggleClass(this.element, options.goToCartLinkModifier, !this.isCartEmpty));\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private listenToLinkClick(): this {\r\n this.element.addEventListener('click', e => {\r\n e.preventDefault();\r\n this.openCart();\r\n })\r\n return this;\r\n }\r\n\r\n private openCart(): void {\r\n document.dispatchEvent(new CustomEvent('eshop:opencart'));\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n goToCartLinkClass: '.nx-go-to-cart',\r\n goToCartLinkModifier: 'nx-go-to-cart--visible'\r\n },\r\n };\r\n }\r\n}","import { createCart, getSummary, getPromotionForm, getPromotions } from '../helpers';\r\nimport CartContentOverviewBasic from './Cart/CartContentOverviewBasic';\r\nimport { addToElement } from '../../helpers/DOMHelpers';\r\nimport { isNotUndefined } from '../../helpers/helperFunctions';\r\n\r\nexport default class PaymentSummaryModule extends CartContentOverviewBasic {\r\n private content: HTMLElement;\r\n protected options: CartContentOptions;\r\n private summary: HTMLElement;\r\n private promotionList: HTMLElement;\r\n private promotionForm: HTMLElement;\r\n private cartState: CartState;\r\n private list: HTMLElement;\r\n protected giftWrapping: HTMLElement;\r\n private paymentWidgetInitialized = false;\r\n\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n this.listenToPaymentWidgetHeightChange();\r\n\r\n this.options = this.config.options;\r\n\r\n const { actions: { subscribeToCart } } = this.config;\r\n subscribeToCart(cartState => {\r\n this.cartState = cartState;\r\n this.createPaymentVoucher(cartState)\r\n .update(cartState);\r\n });\r\n\r\n }\r\n\r\n private createPaymentVoucher(cartState: CartState): this {\r\n if (!isNotUndefined(this.content, this.list, this.promotionList, this.promotionForm, this.summary)) {\r\n [this.content, this.list, this.giftWrapping, this.promotionList, this.promotionForm, this.summary] = createCart({ cartOptions: this.options, cartState: cartState });\r\n\r\n addToElement(this.element, this.content);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n update(cartState: CartState): void {\r\n const { CartOverviewLabels, Summary, PromotionForm, Promotions } = cartState;\r\n\r\n const cartPromotions = getPromotions(Promotions, this.options, false);\r\n const cartPromotionForm = getPromotionForm(PromotionForm, this.options);\r\n const cartSummary = getSummary(Summary, this.options, CartOverviewLabels);\r\n\r\n if (this.paymentWidgetInitialized) { this.togglePaymentWidget() };\r\n\r\n this.list.innerHTML = '';\r\n this.giftWrapping ? this.giftWrapping.innerHTML = '' : \"\";\r\n this.promotionList.innerHTML = cartPromotions;\r\n this.promotionForm.innerHTML = cartPromotionForm;\r\n this.summary.innerHTML = cartSummary;\r\n }\r\n\r\n private listenToPaymentWidgetHeightChange() {\r\n const paymentWidgetWrapper: HTMLInputElement = document.querySelector('.payment-widget > div');\r\n if (!paymentWidgetWrapper) return;\r\n let counter = 0;\r\n const waitForHeight = (callback) => {\r\n if (paymentWidgetWrapper.offsetHeight > 180 || counter > 50) {\r\n callback();\r\n this.paymentWidgetInitialized = true;\r\n } else {\r\n setTimeout(function () {\r\n waitForHeight(callback);\r\n counter++;\r\n }, 100);\r\n }\r\n };\r\n waitForHeight(() => this.togglePaymentWidget());\r\n }\r\n \r\n private togglePaymentWidget() {\r\n const { actions: { subscribeToCart } } = this.config;\r\n subscribeToCart((cartState: CartState) => { this.cartState = cartState; });\r\n\r\n const hiddenFormElement: HTMLInputElement = document.querySelector('.alpaca-form input[name*=\"payment_required\"]');\r\n\r\n if (hiddenFormElement) {\r\n hiddenFormElement.value = this.cartState.Summary.PaymentRequired ? \"1\" : \"0\";\r\n const event = new Event('change');\r\n hiddenFormElement.dispatchEvent(event);\r\n }\r\n }\r\n}","import PriceLoader from './PriceLoader';\r\nexport default PriceLoader;","import _ShopModule from './../_ShopModule';\r\nimport { getTeaserShopInfoSection, getTeaserAddToCartSection, setProductBadges } from '../../helpers';\r\nimport { createElementFromString } from '../../../helpers/DOMHelpers';\r\nimport store from '../../../store';\r\n\r\nexport interface ProductTeasers {\r\n [productId: string]: [HTMLElement];\r\n}\r\n\r\nexport default class PriceLoader extends _ShopModule {\r\n constructor(element, config) {\r\n super(element, config);\r\n }\r\n\r\n async loadPrices(): Promise {\r\n const teasers = this.getTeasers();\r\n const productIds = this.getProductIds(teasers);\r\n\r\n if (!productIds.length) return;\r\n\r\n const shopInfos = await this.getShopInfo(productIds);\r\n\r\n this.setPrices(teasers, shopInfos);\r\n this.setBadges(teasers, shopInfos);\r\n }\r\n\r\n private getTeasers(): ProductTeasers {\r\n const { teaserClass, productIdAttr, loadedAttr } = this.config.options;\r\n const teasers = Array.from(this.element.querySelectorAll(`.${teaserClass}:not([${loadedAttr}])`)) as HTMLElement[];\r\n\r\n return teasers.reduce((acc, t) => {\r\n const productId = t.getAttribute(productIdAttr);\r\n\r\n if (productId) {\r\n const key = productId.split(' ')[0];\r\n acc[key] = (acc[key] || []).concat(t);\r\n }\r\n\r\n return acc;\r\n }, {});\r\n }\r\n\r\n private getProductIds(teasers: ProductTeasers): string[] {\r\n return Object.keys(teasers);\r\n }\r\n\r\n private async getShopInfo(productIds: string[]): Promise {\r\n const { getProductPricesURL } = this.config.urls;\r\n const url = getProductPricesURL({ productId: productIds.join('&productIds=') });\r\n\r\n const res = await fetch(url, { credentials: 'include' });\r\n const prices = await res.json();\r\n\r\n return prices;\r\n }\r\n\r\n protected setPrices(teasers: ProductTeasers, teaserInfos: ProductTeaserInfo[]): this {\r\n teaserInfos.forEach(i => {\r\n const { ProductId } = i;\r\n const { [ProductId]: teaserNode } = teasers;\r\n\r\n teaserNode.forEach(tn => this.showTeaserPrice(tn, i));\r\n });\r\n\r\n document.dispatchEvent(new CustomEvent('eshop:pricesLoaded'));\r\n \r\n return this;\r\n }\r\n\r\n private setBadges(teasers: ProductTeasers, teaserInfos: ProductTeaserInfo[]): this {\r\n const filterSortOrder = store.getState().filter.filter.sort;\r\n const filterState = store.getState().filter.filter[Object.keys(store.getState().filter.filter)[0]];\r\n\r\n teaserInfos.forEach(({ ProductId, Badges }) => {\r\n const { [ProductId]: teaserNodes } = teasers;\r\n\r\n if (filterSortOrder) {\r\n Array.from(Badges).forEach(badge => {\r\n if (filterSortOrder[0] === badge.Name) {\r\n badge.SortOrder = 100;\r\n }\r\n });\r\n this.sortBadges(Badges);\r\n }\r\n\r\n if (filterState && Badges) {\r\n Array.from(Badges).forEach(badge => {\r\n const compareBadges = badge.Members.some(r => filterState.includes(r));\r\n if (compareBadges) {\r\n badge.SortOrder = 200;\r\n }\r\n });\r\n this.sortBadges(Badges);\r\n }\r\n\r\n teaserNodes.forEach(tn => setProductBadges({\r\n badges: Badges,\r\n parrentSelector: '.nx-product-teaser__badge',\r\n context: tn,\r\n maxBadges: parseInt(teaserInfos[0].MaxBadges),\r\n }));\r\n });\r\n\r\n return this;\r\n }\r\n\r\n private sortBadges(badges: ProductBadgeInfo[]) {\r\n badges.sort((a, b) => {\r\n return a.SortOrder - b.SortOrder;\r\n });\r\n }\r\n\r\n private showTeaserPrice(teaserNode: HTMLElement, info: ProductTeaserInfo): void {\r\n const { teaserShopContainerClass, loadingClass, loadedAttr } = this.config.options;\r\n const container = teaserNode.querySelector(teaserShopContainerClass) as HTMLElement;\r\n const compactTeaser: boolean = (container.closest('article') as HTMLElement).classList.contains(`nx-product-teaser--compact`);\r\n\r\n if (this.isLoaded(teaserNode) || container == null) return;\r\n\r\n if (!info.IsAddToCartDisabled)\r\n teaserNode.appendChild(createElementFromString(getTeaserAddToCartSection(info)));\r\n\r\n container.classList.remove(loadingClass);\r\n container.innerHTML = getTeaserShopInfoSection(info, compactTeaser);\r\n this.setTeaserAttributes(container, info);\r\n\r\n teaserNode.setAttribute(loadedAttr, 'true');\r\n }\r\n\r\n private setTeaserAttributes(teaser, teaserInfo: ProductTeaserInfo): void {\r\n const teaserNode: HTMLElement = teaser.closest(`.${this.config.options.teaserClass}`);\r\n teaserNode.setAttribute('data-product-price', teaserInfo.Price);\r\n teaserNode.setAttribute('data-product-variant', teaserInfo.ProductSize);\r\n }\r\n\r\n private isLoaded(teaserNode: HTMLElement): boolean {\r\n const { loadedAttr } = this.config.options;\r\n return teaserNode.hasAttribute(loadedAttr);\r\n }\r\n\r\n protected getDefaultConfig() {\r\n return {\r\n options: {\r\n teaserClass: 'nx-product-teaser--eshop',\r\n teaserShopContainerClass: '.nx-product-teaser__eshop-info',\r\n productIdAttr: 'data-product-id',\r\n loadedAttr: 'data-eshop-price-loaded',\r\n loadingClass: 'nx-u-spinner',\r\n }\r\n }\r\n }\r\n}","/// \r\n\r\nimport { Optional } from '../typings/mapped-types';\r\n\r\nimport ModuleLoader from './ModuleLoader';\r\nimport PriceLoader from './modules/PriceLoader/';\r\n\r\nexport default class Shop {\r\n private options: AppOptions;\r\n private moduleLoader: ModuleLoader;\r\n private priceLoader: PriceLoader;\r\n\r\n constructor(options: Optional = {}) {\r\n this.setOptions(options);\r\n\r\n this.moduleLoader = new ModuleLoader(this.options);\r\n this.priceLoader = new PriceLoader(document.documentElement, this.options);\r\n\r\n this.init();\r\n }\r\n\r\n private init(): void {\r\n this.loadPrices()\r\n .initModules();\r\n }\r\n\r\n private getDefaultOptions(): AppOptions {\r\n return {\r\n attribute: '[data-eshop]',\r\n actions: {\r\n refreshCartState: () => { },\r\n updateCartStore: () => { },\r\n subscribeToCart: () => { },\r\n showEShopPart: () => { },\r\n hideEShopPart: () => { },\r\n showNotification: () => { },\r\n startSpinner: () => { },\r\n stopSpinner: () => { },\r\n updateContent: () =>{ },\r\n },\r\n urls: {\r\n getCartItemsURL: () => '',\r\n getAddToCartURL: () => '',\r\n getAddToCartWithViewURL: () => '',\r\n getRemoveItemFromCartURL: () => '',\r\n getUpdateItemQuantityURL: () => '',\r\n getOrderOverviewURL: () => '',\r\n getCartOverviewURL: () => '',\r\n getEmptyCartURL: () => '',\r\n getAddPromotionURL: () => '',\r\n getRemovePromotionURL: () => '',\r\n getPDPInfoURL: () => '',\r\n getUpdateItemQuantityWithViewURL: ()=> '',\r\n getAddPromotionWithViewURL: ()=> '',\r\n getRemoveCodeWithViewURL: ()=> '',\r\n getRemoveItemFromCartWithViewURL: ()=> '',\r\n },\r\n moduleOptions: {},\r\n };\r\n }\r\n\r\n setOptions(options: Optional): void {\r\n const currentOptions = this.options || this.getDefaultOptions();\r\n\r\n this.options = {\r\n ...currentOptions,\r\n ...options,\r\n actions: {\r\n ...currentOptions.actions,\r\n ...options.actions,\r\n },\r\n urls: {\r\n ...currentOptions.urls,\r\n ...options.urls,\r\n },\r\n moduleOptions: {\r\n ...currentOptions.moduleOptions,\r\n ...options.moduleOptions,\r\n },\r\n };\r\n }\r\n\r\n initModules(): this {\r\n const handler = () => this.moduleLoader.initModules();\r\n document.addEventListener('eshop:init', handler);\r\n handler();\r\n\r\n return this;\r\n }\r\n\r\n loadPrices(): this {\r\n const handler = async () => {\r\n await this.priceLoader.loadPrices();\r\n this.moduleLoader.initModules();\r\n };\r\n\r\n document.addEventListener('eshop:loadprices', handler);\r\n handler();\r\n\r\n return this;\r\n }\r\n};\r\n","// import { fromEvent } from 'rxjs';\r\nimport { distinctUntilChanged, map } from 'rxjs/operators';\r\n// import { trackPurchase, trackSkiniquePurchase, trackData } from './ClassWithTracking/helpers';\r\nimport { trackPurchase, trackData } from './ClassWithTracking/helpers';\r\nimport Shop from './eShop';\r\nimport { IShopOptions } from './eShop/typings';\r\nimport { addClasses, removeClasses, createElementFromString } from './helpers/DOMHelpers';\r\nimport { dispatch, state$ } from './store';\r\nimport { restoreCart } from './store/actions';\r\nimport { initialState } from \"./store/modules/ShopCart/reducer\";\r\nimport { parseJSONSafe } from \"./helpers/helperFunctions\";\r\n\r\n\r\n\r\ninterface ModuleOptions {\r\n Cart: CartContentOptions;\r\n CartContent: CartContentOptions;\r\n Overview: CartContentOptions;\r\n PaymentSummaryModule: CartContentOptions;\r\n AddToCart: AddToCartOptions;\r\n}\r\n\r\nconst getModuleOptions = (checkoutForm: string, AddCode: string, RemoveCode: string, currentProductID: string): PartialProps => {\r\n const cartOverviewOptions = {\r\n cartCheckOutBtnClass: 'nx-btn nx-btn--tertiary',\r\n cartContinueBtnClass: 'nx-action-link',\r\n checkOutURL: checkoutForm,\r\n AddPromotionURL: AddCode,\r\n RemovePromotionURL: RemoveCode,\r\n currentProductID,\r\n };\r\n\r\n return {\r\n Cart: cartOverviewOptions,\r\n CartContent: cartOverviewOptions,\r\n Overview: cartOverviewOptions,\r\n PaymentSummaryModule: cartOverviewOptions,\r\n };\r\n}\r\n\r\nconst getCurrentProductID = (): string => {\r\n const addToCartNode = document.querySelector('.nx-product-stage [data-product-id]');\r\n return addToCartNode ? addToCartNode.getAttribute('data-product-id') : '';\r\n}\r\n\r\nconst initShop: ShopInitializer = (Context: string, shopUrls: ShopPartialURLs) => {\r\n const {\r\n CheckoutForm,\r\n OrderOverviewPage,\r\n CartOverviewPage,\r\n GetEShopTeaserInformationAjaxUrl,\r\n GetEShopPdpInformationAjaxUrl,\r\n EmptyCartPage,\r\n AddCode,\r\n AddCodeWithView,\r\n RemoveCode,\r\n RemoveCodeWithView,\r\n Carts,\r\n AddToCart,\r\n AddToCartWithView,\r\n RemoveItemFromCart,\r\n UpdateItemQuantity,\r\n UpdateItemQuantityWithView,\r\n RemoveItemFromCartWithView\r\n } = shopUrls;\r\n\r\n // URLs getters\r\n const getCartItemsURL = () => `${Carts}?context=${Context}`;\r\n const getAddToCartURL = ({ productId, quantity, currentProductID }) => `${AddToCart}?context=${Context}&productId=${productId}&quantity=${quantity}¤tProductId=${currentProductID}`;\r\n const getAddToCartWithViewURL = ({ productId, quantity, currentProductID }) => `${AddToCartWithView}?context=${Context}&productId=${productId}&quantity=${quantity}¤tProductId=${currentProductID}`;\r\n const getRemoveItemFromCartURL = ({ productId, currentProductID }) => `${RemoveItemFromCart}?context=${Context}&itemId=${productId}&productId=${currentProductID}`; // &productId= is used for products on current PDP\r\n const getRemoveItemFromCartWithViewURL = ({ productId, currentProductID }) => `${RemoveItemFromCartWithView}?context=${Context}&itemId=${productId}&productId=${currentProductID}`; // &productId= is used for products on current PDP\r\n const getUpdateItemQuantityURL = ({ productId, quantity, currentProductID }) => `${UpdateItemQuantity}?context=${Context}&itemId=${productId}&quantity=${quantity}&productId=${currentProductID}`;\r\n const getUpdateItemQuantityWithViewURL = ({ productId, quantity, currentProductID }) => `${UpdateItemQuantityWithView}?context=${Context}&itemId=${productId}&quantity=${quantity}&productId=${currentProductID}`;\r\n const getOrderOverviewURL = () => OrderOverviewPage;\r\n const getCartOverviewURL = () => CartOverviewPage;\r\n const getEmptyCartURL = () => EmptyCartPage;\r\n const getAddPromotionURL = () => `${AddCode}?context=${Context}`;\r\n const getAddPromotionWithViewURL = () => `${AddCodeWithView}?context=${Context}`;\r\n const getRemovePromotionURL = () => `${RemoveCode}?context=${Context}`;\r\n const getRemoveCodeWithViewURL = () => `${RemoveCodeWithView}?context=${Context}`;\r\n const getProductPricesURL = ({ productId }) => `${GetEShopTeaserInformationAjaxUrl}?context=${Context}&productIds=${productId}`;\r\n const getPDPInfoURL = ({ productId }) => `${GetEShopPdpInformationAjaxUrl}?context=${Context}&productId=${productId}`;\r\n\r\n const URLs = {\r\n getAddToCartURL,\r\n getAddToCartWithViewURL,\r\n getCartItemsURL,\r\n getRemoveItemFromCartURL,\r\n getUpdateItemQuantityURL,\r\n getUpdateItemQuantityWithViewURL,\r\n getOrderOverviewURL,\r\n getCartOverviewURL,\r\n getEmptyCartURL,\r\n getAddPromotionURL,\r\n getAddPromotionWithViewURL,\r\n getRemovePromotionURL,\r\n getProductPricesURL,\r\n getPDPInfoURL,\r\n getRemoveCodeWithViewURL,\r\n getRemoveItemFromCartWithViewURL,\r\n };\r\n\r\n const moduleOptions = getModuleOptions(CheckoutForm, getAddPromotionURL(), getRemovePromotionURL(), getCurrentProductID());\r\n\r\n window.NiveaX.AlpacaListener.subscribe('init', event => (event).detail.form.registerCustomDataHandler('orderWasSuccessful', async (args) => {\r\n await trackPurchase(localStorage.getItem('cartState'), args.customData);\r\n }));\r\n\r\n window.NiveaX.AlpacaListener.subscribe('init', event => (event).detail.form.registerCustomDataHandler('refreshCart', async (args) => {\r\n await refreshCartState(getCartItemsURL());\r\n }));\r\n\r\n new Shop(getShopOptions(URLs, moduleOptions));\r\n const cartState: CartState = JSON.parse(localStorage.getItem('cartState'));\r\n const userLoggedIn = document.querySelector(`.nx-account-state--loggedin`) as HTMLElement;\r\n\r\n if (cartState) {\r\n updateCartStore(cartState);\r\n }\r\n if (!cartState && userLoggedIn) {\r\n refreshCartState(getCartItemsURL());\r\n }\r\n\r\n document.addEventListener('NiveaXLoadMoreLoaded', () => NiveaX.loadShopPrices());\r\n}\r\n\r\n// Redux store listener and dispatcher\r\nconst updateCartStore = (cart: CartState) => {\r\n dispatch(restoreCart(cart));\r\n localStorage.setItem('cartState', JSON.stringify(cart));\r\n};\r\n\r\nconst subscribeToCart = (resolver, element?: HTMLElement) => {\r\n const subscription = state$.pipe(map(state => state.shopCart), distinctUntilChanged()).subscribe(async cart => {\r\n if (element && !document.body.contains(element)) {\r\n subscription.unsubscribe();\r\n } else {\r\n await resolver(cart);\r\n window.NiveaX.initModules();\r\n }\r\n });\r\n\r\n return subscription;\r\n}\r\n\r\n// Shop options\r\nconst showEShopPart = (href: string) => document.location.href = href;\r\nconst hideEShopPart = () => window.NiveaX.layer.close();\r\nconst startSpinner = (item: HTMLElement = document.body.querySelector('main'), extraClass: string = 'nx-u-spinner--fixed') => addClasses(item, 'nx-u-spinner', 'nx-u-spinner--medium', extraClass);\r\nconst stopSpinner = (item: HTMLElement = document.body.querySelector('main'), extraClass: string = 'nx-u-spinner--fixed') => removeClasses(item, 'nx-u-spinner', 'nx-u-spinner--medium', extraClass);\r\n\r\nconst showNotification = (item: INotificationItem) => {\r\n window.NiveaX.notification.push(item);\r\n};\r\n\r\nasync function refreshCartState(getCartItemsURL: string) {\r\n const items = await getCartState(getCartItemsURL);\r\n updateCartStore(items || initialState); \r\n}\r\n\r\nfunction getShopOptions(urls, moduleOptions): IShopOptions {\r\n return {\r\n attribute: 'data-eshop',\r\n actions: {\r\n refreshCartState,\r\n updateCartStore,\r\n subscribeToCart,\r\n showEShopPart,\r\n hideEShopPart,\r\n showNotification,\r\n startSpinner,\r\n stopSpinner,\r\n updateContent\r\n },\r\n urls,\r\n moduleOptions,\r\n };\r\n};\r\n\r\n\r\nconst updateContent = (element, data, emptyCartFn?)=> {\r\n const node = createElementFromString(`
    ${data}
    `);\r\n const shopNode = node.querySelector('.nx-shop-cart');\r\n\r\n if (isEmptyCart(node) && emptyCartFn) {\r\n const dataTracking = node.querySelector('[data-tdata]');\r\n if(dataTracking){\r\n const jsonData = parseJSONSafe(dataTracking.getAttribute('data-tdata'));\r\n trackData(jsonData)\r\n }\r\n\r\n emptyCartFn();\r\n return false;\r\n }\r\n\r\n if (shopNode) {\r\n element.replaceWith(shopNode)\r\n window.NiveaX.initModules();\r\n }\r\n}\r\n\r\nconst isEmptyCart = (node)=> {\r\n const shopNodeList = node.querySelector('.nx-shop-cart-list');\r\n return (shopNodeList) ? false : true;\r\n}\r\n\r\n// Helpers\r\nconst getCartState = async (url: string) => {\r\n let cart: CartState = null;\r\n try {\r\n const res = await fetch(url, { credentials: 'include' });\r\n const shopRes: ShopResponse = await res.json();\r\n\r\n if (shopRes.IsSuccess) {\r\n cart = shopRes.Data;\r\n } else {\r\n alert(shopRes.Error);\r\n }\r\n } finally {\r\n return cart;\r\n }\r\n}\r\n\r\nexport default initShop;","import {\r\n RESTORE_CART,\r\n CartActionTypes,\r\n} from './types';\r\n\r\nexport const restoreCart = (cart: CartState): CartActionTypes => ({ type: RESTORE_CART, cart });\r\n","export const FILTER_STATE = 'FILTER_STATE';\r\n\r\nexport interface FilterState {\r\n type: typeof FILTER_STATE;\r\n filter: FilterParams;\r\n};\r\n\r\nexport type FilterStateTypes = FilterState;","/// \r\n\r\nexport async function trackPurchase(cartState: any, orderId: string) {\r\n cartState = JSON.parse(cartState);\r\n const countryCode = dataLayer[0].pageCountry;\r\n const { AmountToPayDecimal, DeliveryCostDecimal, TotalTaxDecimal, CurrencyCode } = cartState.Summary;\r\n const coupon: string = cartState.Promotions.length > 0 ? cartState.Promotions.map(a => `${Object.values(a).join(', ')}`).join(', ') : '';\r\n const brand: string = dataLayer[0].hasOwnProperty('brand') ? dataLayer[0].brand : 'Nivea';\r\n\r\n const products = cartState.Items.map((item) => {\r\n const coupon: string = item.Promotions.length > 0 ? item.Promotions.join(', ') : '';\r\n const category: string = !!item.Category ? item.Category : '';\r\n\r\n let cartItemTrackObj = {\r\n 'name': item.ProductName,\r\n 'id': item.ProductId,\r\n 'price': getPriceValue(item.ProductPrice),\r\n 'brand': brand,\r\n 'category': category,\r\n 'variant': item.ProductSize,\r\n 'quantity': item.Quantity,\r\n 'coupon': coupon,\r\n }\r\n\r\n return cartItemTrackObj;\r\n });\r\n\r\n dataLayer.push({\r\n event: 'purchase',\r\n currencyCode: CurrencyCode,\r\n ecommerce: {\r\n purchase: {\r\n actionField: {\r\n id: orderId,\r\n affiliation: 'eShop ' + countryCode,\r\n revenue: AmountToPayDecimal,\r\n tax: TotalTaxDecimal,\r\n shipping: DeliveryCostDecimal,\r\n coupon: coupon,\r\n },\r\n products,\r\n }\r\n }\r\n });\r\n}\r\n\r\nexport function trackPhototinUpload() {\r\n dataLayer.push({\r\n event: 'ga_event',\r\n eventCategory: 'Make It Yours',\r\n eventAction: 'Photo Upload'\r\n });\r\n}\r\n\r\nexport function trackPhototinAddMessage(message) {\r\n dataLayer.push({\r\n event: 'ga_event',\r\n eventCategory: 'Make It Yours',\r\n eventAction: 'Message Selection',\r\n eventLabel: message\r\n });\r\n}\r\n\r\nexport function trackPhototinAddToCart() {\r\n const currencyCode = dataLayer[0].hasOwnProperty('currencyCode') ? dataLayer[0].currencyCode : '',\r\n productNameNode: HTMLElement = document.querySelector('h1.nx-product-stage__headline'),\r\n productName: string = productNameNode !== null ? productNameNode.innerText : '',\r\n addToCartNode: HTMLElement = document.querySelector('.nx-add-to-cart') as HTMLElement,\r\n id: string = addToCartNode.dataset.productId,\r\n productCategory: string = dataLayer[0].hasOwnProperty('category') ? dataLayer[0].category : '',\r\n productVariantNode: HTMLElement = document.querySelector('.nx-product-stage .nx-pas__product-attribute:last-child'),\r\n productVariant: string = productVariantNode !== null ? productVariantNode.innerHTML : '',\r\n price: string = addToCartNode.querySelector('.nx-price').innerHTML,\r\n quantity: string = document.querySelector('.nx-range-dropdown__label-value').textContent;\r\n\r\n dataLayer.push({\r\n event: 'addToCart',\r\n ecommerce: {\r\n currencyCode: currencyCode,\r\n add: {\r\n buttonType: 'AddToCartButton',\r\n products: [{\r\n 'name': productName,\r\n 'id': id,\r\n 'price': getPriceValue(price),\r\n 'brand': 'Nivea',\r\n 'category': productCategory,\r\n 'variant': productVariant,\r\n 'quantity': quantity,\r\n }]\r\n }\r\n }\r\n });\r\n}\r\n\r\nexport function trackAlpacaFormsError(form: any) {\r\n let serverSideErrorArray = Array.from(form.querySelectorAll('.server-side-error'));\r\n if (serverSideErrorArray && serverSideErrorArray.length < 1) return;\r\n\r\n let formName: string = form.dataset.name;\r\n let id: string = form.id;\r\n let serverSideErrorMessages = [];\r\n serverSideErrorArray.forEach((element: HTMLElement) => serverSideErrorMessages.push(element.innerHTML));\r\n\r\n dataLayer.push({\r\n event: 'ga_event',\r\n eventCategory: 'Form Error',\r\n eventAction: `${formName} - ${id}`,\r\n eventLabel: serverSideErrorMessages.join()\r\n });\r\n\r\n}\r\n\r\nexport function trackEvent(eventCategory: string, eventAction: string, eventLabel: string, event?: Event): any {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: eventCategory,\r\n eventAction: eventAction,\r\n eventLabel: eventLabel,\r\n eventNonInteraction: false\r\n });\r\n}\r\n\r\nexport function addLayer(options: DataLayerG4Options): any {\r\n if (typeof window.dataLayer == 'undefined' || !window.dataLayer) {\r\n console.warn(\"dataLayer is not defined or not loaded\");\r\n return;\r\n }\r\n\r\n if (window.dataLayer) window.dataLayer.push(options);\r\n}\r\n\r\nexport function getClickedElementIndex(itemList: NodeListOf, item: HTMLElement): number {\r\n let index: number = Array.from(itemList).indexOf(item);\r\n return index + 1;\r\n}\r\n\r\nexport function getLinkElementHref(event: MouseEvent, selector: string, property: string = 'href') {\r\n let target: HTMLElement = event.target,\r\n element: HTMLAnchorElement = target.closest(selector),\r\n isBlank = (element['target'] == \"_blank\") ? true : false;\r\n\r\n return {\r\n \"isBlank\": isBlank,\r\n \"href\": element[property]\r\n }\r\n}\r\n\r\nexport function trackSliderMovement(eventAction: string, eventLabel: string = '') {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: 'Teaser',\r\n eventAction: eventAction,\r\n eventLabel: eventLabel.length > 0 ? eventLabel : undefined,\r\n eventNonInteraction: false\r\n });\r\n}\r\n\r\nexport function trackTeaserClick(eventCategory: string, eventAction: string, destinationUrl: any) {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: eventCategory,\r\n eventAction: eventAction,\r\n eventLabel: destinationUrl.href,\r\n });\r\n\r\n if (!destinationUrl.isBlank) { document.location = destinationUrl.href; }\r\n}\r\n\r\nexport function getActionFieldTracking(item: HTMLElement, checkSliders: boolean = false) {\r\n const isSlider = item.closest('.nx-slider') ? true : false;\r\n let actionFieldValue: string;\r\n if (isSlider && checkSliders) {\r\n actionFieldValue = item.closest('section').querySelector('h2') as HTMLElement ? (item.closest('section').querySelector('h2') as HTMLElement).innerText : ``;\r\n } else {\r\n actionFieldValue = document.querySelector('.nx-breadcrumb__list').lastElementChild as HTMLElement ? (document.querySelector('.nx-breadcrumb__list').lastElementChild as HTMLElement).innerText : ``;\r\n }\r\n return actionFieldValue;\r\n}\r\n\r\nexport function getCurrencyCode(): string {\r\n if (window.dataLayer) return dataLayer[0].hasOwnProperty('currencyCode') ? dataLayer[0].currencyCode : '';\r\n}\r\n\r\nexport function productTeaserTrackingObject(teasers: NodeListOf, attachClickTracking: boolean = false, excludeShownTeasers?: NodeListOf) {\r\n if (!excludeShownTeasers) {\r\n excludeShownTeasers = teasers;\r\n }\r\n\r\n const teasersArray = Object.entries(teasers).map((teaserNode) => {\r\n const name: string = teaserNode[1].getAttribute('data-name') ? teaserNode[1].getAttribute('data-name') : '',\r\n prodId: string = teaserNode[1].getAttribute('data-product-id') ? teaserNode[1].getAttribute('data-product-id') : '',\r\n price: number = teaserNode[1].getAttribute('data-product-price') ? getPriceValue(teaserNode[1].getAttribute('data-product-price')) : undefined,\r\n brand: string = teaserNode[1].getAttribute('data-brand') ? teaserNode[1].getAttribute('data-brand') : '',\r\n category: string = teaserNode[1].getAttribute('data-category') ? teaserNode[1].getAttribute('data-category') : '',\r\n variant: string = teaserNode[1].getAttribute('data-product-variant') ? teaserNode[1].getAttribute('data-product-variant') : '',\r\n position: number = Array.from(excludeShownTeasers).indexOf(teaserNode[1]) + 1,\r\n list: string = getActionFieldTracking(teaserNode[1], true);\r\n\r\n const teaserItemTrackObj = {\r\n 'id': prodId,\r\n 'name': name,\r\n 'brand': brand,\r\n 'category': category,\r\n 'variant': variant,\r\n 'position': position,\r\n 'price': price ? price.toFixed(2) : ''\r\n }\r\n\r\n teaserNode[1].classList.add('nx-product-shown');\r\n\r\n if (attachClickTracking) {\r\n const teaserNodeLink: HTMLElement = teaserNode[1].querySelector('a');\r\n productClickHandler(teaserNodeLink, teaserItemTrackObj, list);\r\n }\r\n\r\n return { ...teaserItemTrackObj, 'list': list };\r\n });\r\n \r\n return teasersArray;\r\n}\r\n\r\nexport function productClickHandler(teaserNodeLink: HTMLElement, product: Object, list: string) {\r\n teaserNodeLink.addEventListener('click', event => {\r\n event.preventDefault();\r\n const url: string = teaserNodeLink.getAttribute('href');\r\n productClickPush(product, list, url);\r\n });\r\n}\r\n\r\nexport function productClickPush(product: Object, list: string, url: any) {\r\n addLayer({\r\n event: 'productClick',\r\n ecommerce: {\r\n click: {\r\n actionField: { 'list': list },\r\n currencyCode: getCurrencyCode(),\r\n products: [product]\r\n }\r\n }\r\n });\r\n\r\n url ? document.location = url : \"\";\r\n}\r\n\r\nexport function floatNumberFromString(element: any) {\r\n const regExpForFloatNumbers = /\\d+(?:.\\d+)?/;\r\n return element.match(regExpForFloatNumbers).join('');\r\n}\r\n\r\nexport function getPriceValue(item: any) {\r\n let price = floatNumberFromString(item);\r\n price = price.replace(/,/g, \".\");\r\n\r\n return parseFloat(price);\r\n}\r\n\r\nexport function hasDataTracking(data) {\r\n if (data.tracking) {\r\n trackData(data.tracking)\r\n }\r\n}\r\n\r\nexport function trackData(trakingList) {\r\n if (!trakingList) return;\r\n\r\n trakingList.forEach(item => {\r\n const triggerOption = item.Ttrigger;\r\n switch (triggerOption) {\r\n case \"FormSubmitted\":\r\n addLayer(item.Tevent);\r\n break;\r\n default:\r\n console.log(\"No tracking set up for this event \" + triggerOption + \".\");\r\n }\r\n })\r\n\r\n}\r\n\r\n\r\n\r\n","/// \r\n\r\nclass EmptyClass {}\r\n\r\ninterface Constructor {\r\n new (...args): T;\r\n}\r\n\r\ninterface Base {}\r\n\r\ninterface Trackable {\r\n dataLayer: DataLayerOptions[];\r\n}\r\n\r\ninterface Constructable {\r\n new (...args): T;\r\n prototype: T\r\n}\r\n\r\nexport default function ClassWithTracking(\r\n SuperClass: Constructable = EmptyClass as Constructor\r\n) {\r\n class C extends (>SuperClass) {\r\n protected dataLayer: DataLayerOptions[];\r\n\r\n constructor(...args) {\r\n super(...args);\r\n\r\n this.dataLayer = (window.dataLayer || []) as DataLayerOptions[];\r\n }\r\n }\r\n\r\n return (>(C));\r\n};","/// \r\n\r\nexport const OPEN_SPUSH = 'OPEN_SPUSH';\r\nexport const CLOSE_SPUSH = 'CLOSE_SPUSH';\r\n\r\nexport const OPEN_TIMER_SPUSH = 'OPEN_TIMER_SPUSH';\r\nexport const CLOSE_TIMER_SPUSH = 'CLOSE_TIMER_SPUSH';\r\n\r\nexport const OPEN_CONTENT_ZONE_SPUSH = 'OPEN_CONTENT_ZONE_SPUSH';\r\nexport const HIDE_CONTENT_ZONE_SPUSH = 'HIDE_CONTENT_ZONE_SPUSH';\r\nexport const CLOSE_CONTENT_ZONE_SPUSH = 'CLOSE_CONTENT_ZONE_SPUSH';\r\n\r\nexport const INIT_RECURING_STORE = 'INIT_RECURING_STORE';\r\nexport const WRITE_RecurING_ITEM = 'WRITE_RecurING_ITEM';\r\n\r\nexport const PAUSE_SMART_PUSH = \"PAUSE_SMART_PUSH\";\r\nexport const START_SMART_PUSH = \"START_SMART_PUSH\";\r\n\r\ninterface IOpenedContentZones {\r\n [index: string]: true;\r\n}\r\n\r\nexport interface SPushState {\r\n isOpen: boolean;\r\n isTimerTypeOpen: boolean;\r\n openedContentZones: IOpenedContentZones;\r\n closedByUserContentZones: IOpenedContentZones;\r\n recuringSPushes: IRecuringStore;\r\n count: number;\r\n pauseSmartPush: boolean;\r\n}\r\n\r\ninterface OpenSPush {\r\n type: typeof OPEN_SPUSH;\r\n};\r\n\r\ninterface CloseSPush {\r\n type: typeof CLOSE_SPUSH;\r\n};\r\n\r\ninterface OpenTimerSPush {\r\n type: typeof OPEN_TIMER_SPUSH;\r\n spId: string;\r\n};\r\n\r\ninterface CloseTimerSPush {\r\n type: typeof CLOSE_TIMER_SPUSH;\r\n}\r\n\r\ninterface OpenContentZoneSPush {\r\n type: typeof OPEN_CONTENT_ZONE_SPUSH;\r\n spId: string;\r\n}\r\n\r\ninterface HideContentZoneSPush {\r\n type: typeof HIDE_CONTENT_ZONE_SPUSH;\r\n spId: string;\r\n}\r\n\r\ninterface CloseContentZoneSPush {\r\n type: typeof CLOSE_CONTENT_ZONE_SPUSH;\r\n spId: string;\r\n}\r\n\r\ninterface InitRecuringStore {\r\n type: typeof INIT_RECURING_STORE;\r\n store: IRecuringStore;\r\n}\r\n\r\ninterface PauseSmartPush {\r\n type: typeof PAUSE_SMART_PUSH;\r\n};\r\n\r\ninterface StartSmartPush {\r\n type: typeof START_SMART_PUSH;\r\n};\r\n\r\n\r\nexport type SPushStateTypes = OpenSPush | CloseSPush\r\n | OpenTimerSPush | CloseTimerSPush \r\n | OpenContentZoneSPush | HideContentZoneSPush | CloseContentZoneSPush\r\n | InitRecuringStore | PauseSmartPush | StartSmartPush;","export const MOVE_RIGHT = 'MOVE_RIGHT';\r\nexport const MOVE_LEFT = 'MOVE_LEFT';\r\n\r\nexport interface NavState {\r\n position: 'left' | 'right';\r\n isOpen: boolean;\r\n navStructure: INavStructure;\r\n}\r\n\r\ninterface MoveNavRight {\r\n type: typeof MOVE_RIGHT;\r\n};\r\n\r\ninterface MoveNavLeft {\r\n type: typeof MOVE_LEFT;\r\n};\r\n\r\nexport type NavPositionActionTypes = MoveNavRight | MoveNavLeft;\r\n\r\nexport const OPEN_NAV = 'OPEN_NAV';\r\nexport const CLOSE_NAV = 'CLOSE_NAV';\r\n\r\ninterface OpenNav {\r\n type: typeof OPEN_NAV;\r\n};\r\n\r\ninterface CloseNav {\r\n type: typeof CLOSE_NAV;\r\n};\r\n\r\nexport const SET_NAV_STRUCTURE = 'SET_NAV_STRUCTURE';\r\n\r\nexport interface SetNavStructure {\r\n type: typeof SET_NAV_STRUCTURE;\r\n structure: INavStructure;\r\n};\r\n\r\nexport type NavStateActionTypes = OpenNav | CloseNav;\r\n\r\nexport type NavActionTypes = NavPositionActionTypes | NavStateActionTypes | SetNavStructure;","export const RESTORE_CART = 'RESTORE_CART';\r\n\r\ninterface RestoreCart {\r\n type: typeof RESTORE_CART;\r\n cart: CartState;\r\n}\r\n\r\nexport type CartActionTypes = RestoreCart;","import {\r\n NavState,\r\n MOVE_LEFT,\r\n MOVE_RIGHT,\r\n OPEN_NAV,\r\n CLOSE_NAV,\r\n SET_NAV_STRUCTURE,\r\n NavActionTypes,\r\n} from './types';\r\n\r\nconst initialState: NavState = {\r\n isOpen: false,\r\n position: 'right',\r\n navStructure: null,\r\n};\r\n\r\nexport default function navReducer(\r\n state = initialState,\r\n action: NavActionTypes,\r\n): NavState {\r\n switch (action.type) {\r\n case MOVE_LEFT:\r\n return {\r\n ...state,\r\n position: 'left',\r\n };\r\n case MOVE_RIGHT:\r\n return {\r\n ...state,\r\n position: 'right',\r\n };\r\n case OPEN_NAV:\r\n return {\r\n ...state,\r\n isOpen: true,\r\n };\r\n case CLOSE_NAV:\r\n return {\r\n ...state,\r\n isOpen: false,\r\n };\r\n case SET_NAV_STRUCTURE:\r\n return {\r\n ...state,\r\n navStructure: action.structure,\r\n };\r\n default:\r\n return state;\r\n }\r\n}","import {\r\n SPushState,\r\n SPushStateTypes,\r\n OPEN_SPUSH,\r\n CLOSE_SPUSH,\r\n OPEN_TIMER_SPUSH,\r\n CLOSE_TIMER_SPUSH,\r\n OPEN_CONTENT_ZONE_SPUSH,\r\n HIDE_CONTENT_ZONE_SPUSH,\r\n CLOSE_CONTENT_ZONE_SPUSH,\r\n INIT_RECURING_STORE,\r\n PAUSE_SMART_PUSH,\r\n START_SMART_PUSH,\r\n} from './types';\r\n\r\nconst initialState: SPushState = {\r\n isOpen: false,\r\n isTimerTypeOpen: false,\r\n openedContentZones: {},\r\n closedByUserContentZones: {},\r\n recuringSPushes: {},\r\n count: 0,\r\n pauseSmartPush: false\r\n};\r\n\r\nexport default function smartPushReducer(\r\n state = initialState,\r\n action: SPushStateTypes,\r\n): SPushState {\r\n switch (action.type) {\r\n case OPEN_SPUSH:\r\n return {\r\n ...state,\r\n count: state.count + 1,\r\n isOpen: true,\r\n };\r\n case CLOSE_SPUSH:\r\n return {\r\n ...state,\r\n count: state.count - 1,\r\n isOpen: state.count - 1 > 0,\r\n };\r\n case OPEN_TIMER_SPUSH:\r\n return {\r\n ...state,\r\n isTimerTypeOpen: true,\r\n recuringSPushes: {\r\n ...state.recuringSPushes,\r\n [action.spId]: {\r\n lastShown: Date.now(),\r\n }\r\n },\r\n };\r\n case CLOSE_TIMER_SPUSH:\r\n return {\r\n ...state,\r\n isTimerTypeOpen: false,\r\n };\r\n case OPEN_CONTENT_ZONE_SPUSH:\r\n return {\r\n ...state,\r\n openedContentZones: {\r\n ...state.openedContentZones,\r\n [action.spId]: true,\r\n },\r\n };\r\n case HIDE_CONTENT_ZONE_SPUSH:\r\n const { [action.spId]: _, ...rest } = state.openedContentZones;\r\n\r\n return {\r\n ...state,\r\n openedContentZones: rest,\r\n };\r\n case CLOSE_CONTENT_ZONE_SPUSH:\r\n return {\r\n ...state,\r\n closedByUserContentZones: {\r\n ...state.closedByUserContentZones,\r\n [action.spId]: true,\r\n },\r\n recuringSPushes: {\r\n ...state.recuringSPushes,\r\n [action.spId]: {\r\n lastShown: Date.now(),\r\n },\r\n },\r\n };\r\n case INIT_RECURING_STORE:\r\n const { recuringSPushes } = state;\r\n return {\r\n ...state,\r\n recuringSPushes: { ...recuringSPushes, ...action.store },\r\n };\r\n case PAUSE_SMART_PUSH:\r\n return {\r\n ...state,\r\n pauseSmartPush: true,\r\n };\r\n case START_SMART_PUSH:\r\n return {\r\n ...state,\r\n pauseSmartPush: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n TabState,\r\n TabStateTypes,\r\n BLUR_TAB,\r\n FOCUS_TAB,\r\n} from './types';\r\n\r\nconst initialState: TabState = {\r\n isActive: false,\r\n};\r\n\r\nexport default function tabReducer(\r\n state = initialState,\r\n action: TabStateTypes,\r\n): TabState {\r\n switch (action.type) {\r\n case FOCUS_TAB:\r\n return {\r\n ...state,\r\n isActive: true,\r\n };\r\n case BLUR_TAB:\r\n return {\r\n ...state,\r\n isActive: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n FilterState,\r\n FilterStateTypes,\r\n FILTER_STATE,\r\n} from './types';\r\n\r\nconst initialState: FilterState = {\r\n type: FILTER_STATE,\r\n filter: {}\r\n};\r\n\r\nexport default function filterReducer(\r\n state = initialState,\r\n action: FilterStateTypes,\r\n): FilterState {\r\n switch (action.type) {\r\n case FILTER_STATE:\r\n return {\r\n ...state,\r\n filter: action.filter,\r\n };\r\n default:\r\n return state;\r\n }\r\n}","import { combineEpics } from 'redux-observable';\r\nimport { combineReducers } from 'redux';\r\n\r\nimport navReducer from './CircleNavigation/reducer';\r\nimport smartPushReducer from './SmartPush/reducer';\r\nimport tabReducer from './Tab/reducer';\r\nimport cartReducer from './ShopCart/reducer';\r\nimport filterReducer from './Filter/reducer';\r\n\r\nexport const rootEpic = combineEpics(\r\n \r\n);\r\n\r\nexport const rootReducer = combineReducers({\r\n circleNav: navReducer,\r\n smartPush: smartPushReducer,\r\n tab: tabReducer,\r\n shopCart: cartReducer,\r\n filter: filterReducer,\r\n});\r\n\r\nexport type RootReducer = ReturnType;","import { Observable } from 'rxjs';\r\nimport { Store } from 'redux';\r\n\r\nimport { RootReducer } from './root';\r\n\r\nexport function getState$(store: Store) {\r\n return new Observable(function (observer) {\r\n observer.next(store.getState());\r\n\r\n const unsubscribe = store.subscribe(function () {\r\n observer.next(store.getState());\r\n });\r\n \r\n return unsubscribe;\r\n }) as Observable;\r\n}\r\n\r\nclass EmptyClass {}\r\n\r\ninterface Base {}\r\n\r\ninterface Storable {\r\n state$: Observable;\r\n dispatch: (action: any) => any;\r\n}\r\n\r\nexport const bindStoreToClass = (store: Store) => \r\n function ClassWithState(\r\n SuperClass: Constructable = EmptyClass as Constructor\r\n ) {\r\n class C extends (>SuperClass) {\r\n protected dispatch: (action: any) => any;\r\n protected state$: Observable;\r\n\r\n constructor(...args) {\r\n super(...args);\r\n\r\n this.dispatch = store.dispatch;\r\n this.state$ = getState$(store);\r\n }\r\n }\r\n\r\n return (>(C));\r\n };","import { createStore, applyMiddleware } from 'redux';\r\nimport { createEpicMiddleware } from 'redux-observable';\r\nimport { composeWithDevTools } from 'redux-devtools-extension';\r\n\r\nimport { rootEpic, rootReducer, RootReducer } from './modules/root';\r\nimport { bindStoreToClass, getState$ } from './modules/helpers';\r\n\r\nconst epicMiddleware = createEpicMiddleware();\r\n\r\nconst store = createStore(\r\n rootReducer,\r\n composeWithDevTools(\r\n applyMiddleware(epicMiddleware),\r\n ),\r\n);\r\n\r\nepicMiddleware.run(rootEpic);\r\n\r\nconst ClassWithState = bindStoreToClass(store);\r\nconst state$ = getState$(store);\r\nconst dispatch = store.dispatch;\r\n\r\nexport {\r\n ClassWithState,\r\n RootReducer,\r\n state$,\r\n dispatch,\r\n};\r\n\r\nexport default store;\r\n","export const FOCUS_TAB = 'FOCUS_TAB';\r\nexport const BLUR_TAB = 'BLUR_TAB';\r\n\r\nexport interface TabState {\r\n isActive: boolean;\r\n}\r\n\r\ninterface FocusTab {\r\n type: typeof FOCUS_TAB;\r\n};\r\n\r\ninterface BlurTab {\r\n type: typeof BLUR_TAB;\r\n};\r\n\r\nexport type TabStateTypes = FocusTab | BlurTab;","import {\r\n RESTORE_CART,\r\n CartActionTypes,\r\n} from './types';\r\n\r\nconst initialState: CartState = {\r\n Items: [],\r\n GiftWrappable: null,\r\n GiftWrapping: {\r\n ProductId: '',\r\n Icon: '',\r\n Text: '',\r\n },\r\n Promotions: [],\r\n PromotionForm: {\r\n Toggle: '',\r\n Button: '',\r\n Description: '',\r\n InputPlaceholder: '',\r\n ErrorEmptyCode: '',\r\n Close: '',\r\n Title: '',\r\n AjaxUrl: '',\r\n AddPromotionIcon: '',\r\n },\r\n Summary: {\r\n SubTotal: '',\r\n TotalTax: '',\r\n DeliveryCost: '',\r\n OriginalDeliveryCost: '',\r\n CartDiscounts: null,\r\n DeliveryDiscounts: [],\r\n VoucherAmount: '',\r\n AmountToPay: '',\r\n TotalPriceWithTax: '',\r\n TotalPriceWithoutTax: '',\r\n PaymentRequired: '',\r\n AmountToPayDecimal: null,\r\n DeliveryCostDecimal: null,\r\n TotalTaxDecimal: null,\r\n CurrencyCode: null,\r\n },\r\n DeliveryAddress: null,\r\n BillingAddress: null,\r\n SummaryLabel: null,\r\n CartOverviewLabels: {\r\n Category: '',\r\n CheckoutButton: '',\r\n ContinueButton: '',\r\n DeliveryFee: '',\r\n Promotion: '',\r\n Voucher: '',\r\n VoucherWillBeSentTo: '',\r\n FreeDelivery: '',\r\n Headline: '',\r\n Remove: '',\r\n Size: '',\r\n Subtotal: '',\r\n Summary: '',\r\n Tax: '',\r\n TotalItems: '',\r\n TotalPrice: '',\r\n AmountToPay: '',\r\n UnitPrice: '',\r\n BundleProducts: '',\r\n },\r\n Notification: {\r\n Duration: 0,\r\n Icon: '',\r\n Link: '',\r\n Style: '',\r\n Text: '',\r\n TDefinitions: [],\r\n },\r\n CurrentPdpInfo: null,\r\n};\r\n\r\nexport {\r\n initialState\r\n};\r\n\r\nexport default function cartReducer(\r\n state: CartState = initialState,\r\n action: CartActionTypes,\r\n): CartState {\r\n switch (action.type) {\r\n case RESTORE_CART:\r\n return {\r\n ...state,\r\n ...action.cart,\r\n Items: [...(action.cart.Items || [])],\r\n GiftWrapping: {\r\n ...(action.cart.GiftWrapping)\r\n },\r\n Promotions: [...(action.cart.Promotions || [])],\r\n PromotionForm: {\r\n ...state.PromotionForm,\r\n ...action.cart.PromotionForm,\r\n },\r\n Summary: {\r\n ...action.cart.Summary,\r\n },\r\n CurrentPdpInfo: {\r\n ...state.CurrentPdpInfo,\r\n ...action.cart.CurrentPdpInfo || {},\r\n }\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n"],"names":["_ShopModule","constructor","element","config","this","mergeConfig","getDefaultConfig","defConfig","options","AddToCart","super","quantity","buttonSelector","productIdAttr","button","querySelector","mustUseAddToCartSaveAction","dataset","productId","getAttribute","init","addEventListener","addToCart","listenToCartChange","currentProductID","updateCartStore","showNotification","startSpinner","stopSpinner","actions","getAddToCartURL","urls","document","dispatchEvent","CustomEvent","url","result","fetch","credentials","shopRes","json","IsSuccess","Data","TDefinitions","notification","LinkHref","Link","alert","Error","e","console","error","subscribeToCart","cart","getNotificationInfo","onCartChange","Notification","AddToCartWithT","ClassWithTracking","buttonType","trackingData","TrackingData","classList","contains","length","forEach","rule","i","add","Tevent","ecommerce","dataLayer","push","cartItemTrackItem","Items","find","item","ProductId","CurrencyCode","Summary","productTeaserItem","closest","brand","cartItemTrackObj","ProductName","ProductPrice","Category","ProductSize","pushTrackingData","products","currencyCode","event","createRangeDropdown","IsVoucher","Quantity","QuantitySelector","map","q","join","createRangeDropdownReadonly","createAvailability","Stock","StateCssClass","Label","IsSoldOut","classes","labels","cartItemClass","Remove","IsGiftWrappingProduct","OutOfStockText","SelectedQuantityNotAvailableText","createCartItem","readonly","controlls","IsReadOnly","createItemUrl","ProductUrl","unitInfo","VoucherWillBeSentTo","VoucherRecipient","getUnitInfo","ItemId","ProductImage","Price","PriceIsReduced","TotalOriginalPrice","IsValid","UnitPrice","OriginalPrice","PricePerUnit","getUnitInfoPrice","Promotions","promotions","promotionElements","val","createPromotions","Size","BundleProducts","ProductNotGiftWrappableText","GiftWrapping","cartClass","Text","Icon","RemovePromotionURL","Id","getPromotions","items","removeUrl","promotionForm","AddPromotionURL","undefined","InputPlaceholder","AddPromotionIcon","ErrorEmptyCode","Button","summary","discounts","voucher","deliveryCost","CartDiscounts","discount","Amount","DeliveryDiscounts","deliveryDiscount","Description","EffectiveDiscount","VoucherAmount","Voucher","OriginalDeliveryCost","DeliveryCost","DeliveryFee","Subtotal","SubTotal","TotalPrice","TotalPriceWithTax","Tax","TotalTax","AmountToPay","cartOptions","cartState","cartItemListClass","CartOverviewLabels","PromotionForm","cartItems","filter","warn","getCartItems","cartGiftWrapping","Object","entries","cartPromotions","cartPromotionForm","cartSummery","giftWrapping","PricePerUnitString","PriceTooltipHeadline","PriceTooltipText","InfoIIcon","InfoXIcon","IsTooltipEnabled","isCompactTeaser","pricePerUnit","pricePerUnitString","StockStateCssClass","StockLabel","IsPurchasable","teaserInfo","IsAddToCartDisabled","AddToCartLabel","AddToCartIcon","setProductBadges","badges","parrentSelector","modifier","maxBadges","context","documentElement","parrent","innerHTML","b","Value","ThemedCssClass","getProductBadgeItem","getProductBadges","slice","checkShopResponse","checkShopResponseWithView","errorField","AddToCartPDP","getQuantity","input","inputSelector","value","listenToBottomBarInit","loadPriceInfo","controls","showAddToCardFlagPDP","listenToQuantityChange","addToCartListener","bottomBar","detail","bottomBarButton","addToCartListenerBottomBar","listenToQuantityChangeBottomBar","getPDPInfoURL","res","pdpInfo","content","ProductPriceInformationMarkUp","Badges","target","parseInt","bottomBarInput","CurrentPdpInfo","ProductDetailPageAddToCartMarkUp","ProductIdCurrentPDP","addToCardPDP","addToCartFlagBtn","isNBAactivated","addToCartFlagBtnVisible","nbaPlaceholder","children","AddToCarPDPtWithT","PDPInfo","ProductPriceInformationMarkUpHTML","DOMParser","parseFromString","priceFromMarkUp","initTracking","productPrice","hasOwnProperty","productNameNode","productName","productCategory","category","productVariantNode","productVariant","id","name","variant","price","toFixed","CartAmountIcon","parent","firstLoad","icon","cartIconAmountClass","animateCartAmount","amountAnimationClass","remove","requestAnimationFrame","reduce","acc","itm","toString","isProductFree","product","IsFree","updateCartAmountIcon","CartContentOverviewBasic","cartGiftWrappingClass","cartPromotionsClass","cartPromotionFormClass","cartSummaryClass","cartCheckOutBtnClass","cartContinueBtnClass","checkOutURL","cartQuantityFieldClass","isEmptyCart","showEmptyCart","addButtons","listenToRemove","continueBtn","hideEShopPart","key","window","NiveaX","layer","close","updateCartButtonState","hasInvalidItems","checkOutButton","setAttribute","removeAttribute","removeProduct","getRemoveItemFromCartWithViewURL","closeBtn","urlWithView","fetchAndUpdateContentWithView","changeQuantity","getUpdateItemQuantityWithViewURL","quantityInput","getEmptyCartURL","showEShopPart","refreshCartState","updateContent","getCartItemsURL","method","then","text","data","bind","showAddToCardFlag","finally","node","getContent","isCartEmpty","amountIcon","listenToClick","listenToOpenCart","preventDefault","openCart","getCartOverviewURL","wrappableProductId","giftWrappingProductId","giftWrappingInput","giftWrappingItem","toggleGiftWrapping","checked","addGiftWrappingItem","removeGiftWrappingItem","getAddToCartWithViewURL","click","shopWrapper","PromotionList","promotionList","listenToRemovePromotion","removePromotion","promotion","removeCouponUrl","removeNiveaPromotion","hasAttribute","catch","err","isOwnSkinCareBrand","redeemPromotionButton","RedeemPromotion","promotionInput","PromotionInput","promotionError","PromotionError","hideButton","promotionFormInputOnTyping","promotionFormInputLabelAnimationFocus","promotionFormInputLabelAnimationBlur","redeemPromotion","removeOWNCouponErrorMessage","promotionFormInputOnKeyup","promotionEmptyInput","disabled","formAjaxUrl","redeemPromotionNivea","redeemPromotionError","isShopRequestSuccess","isJson","resErrorField","innerText","validationError","keyCode","parentElement","removeBtn","AddPromotion","ClosePromotion","PromotionFormWrapper","Overview","OverviewWithT","getParamFromURL","URLSearchParams","location","search","get","saveOverviewData","localStorage","setItem","JSON","stringify","modules","Cart","CartGiftWrappingModule","CartPromotion","CartNotifier","GoToCartLink","listenToLinkClick","goToCartLinkModifier","goToCartLinkClass","CartContent","PaymentSummaryModule","paymentWidgetInitialized","listenToPaymentWidgetHeightChange","createPaymentVoucher","update","list","cartWrapper","cartItemList","cartPromotionItemList","createCart","cartSummary","togglePaymentWidget","paymentWidgetWrapper","counter","waitForHeight","callback","offsetHeight","setTimeout","hiddenFormElement","PaymentRequired","Event","ModuleLoader","initModules","getConfig","moduleName","moduleOptions","setup","Module","attribute","Array","from","querySelectorAll","eShopModuleInitialized","loadPrices","teasers","getTeasers","productIds","getProductIds","shopInfos","getShopInfo","setPrices","setBadges","teaserClass","loadedAttr","t","split","concat","keys","getProductPricesURL","teaserInfos","teaserNode","tn","showTeaserPrice","filterSortOrder","store","getState","sort","filterState","teaserNodes","badge","Name","SortOrder","sortBadges","Members","some","r","includes","MaxBadges","a","info","teaserShopContainerClass","loadingClass","container","compactTeaser","isLoaded","appendChild","setTeaserAttributes","teaser","Shop","setOptions","moduleLoader","priceLoader","getDefaultOptions","getRemoveItemFromCartURL","getUpdateItemQuantityURL","getOrderOverviewURL","getAddPromotionURL","getRemovePromotionURL","getAddPromotionWithViewURL","getRemoveCodeWithViewURL","currentOptions","handler","async","type","restoreCart","resolver","subscription","pipe","state","shopCart","distinctUntilChanged","subscribe","body","unsubscribe","href","extraClass","getCartState","emptyCartFn","shopNode","dataTracking","jsonData","replaceWith","Context","shopUrls","CheckoutForm","OrderOverviewPage","CartOverviewPage","GetEShopTeaserInformationAjaxUrl","GetEShopPdpInformationAjaxUrl","EmptyCartPage","AddCode","AddCodeWithView","RemoveCode","RemoveCodeWithView","Carts","AddToCartWithView","RemoveItemFromCart","UpdateItemQuantity","UpdateItemQuantityWithView","RemoveItemFromCartWithView","URLs","checkoutForm","cartOverviewOptions","getModuleOptions","addToCartNode","getCurrentProductID","AlpacaListener","form","registerCustomDataHandler","args","getItem","customData","getShopOptions","parse","userLoggedIn","loadShopPrices","FILTER_STATE","trackPurchase","orderId","countryCode","pageCountry","AmountToPayDecimal","DeliveryCostDecimal","TotalTaxDecimal","coupon","values","getPriceValue","purchase","actionField","affiliation","revenue","tax","shipping","trackPhototinUpload","eventCategory","eventAction","trackPhototinAddMessage","message","eventLabel","trackPhototinAddToCart","textContent","trackAlpacaFormsError","serverSideErrorArray","formName","serverSideErrorMessages","trackEvent","addLayer","eventNonInteraction","getClickedElementIndex","itemList","indexOf","getLinkElementHref","selector","property","trackSliderMovement","trackTeaserClick","destinationUrl","isBlank","match","replace","parseFloat","hasDataTracking","tracking","trackData","trakingList","triggerOption","Ttrigger","log","EmptyClass","SuperClass","OPEN_SPUSH","CLOSE_SPUSH","OPEN_TIMER_SPUSH","CLOSE_TIMER_SPUSH","OPEN_CONTENT_ZONE_SPUSH","HIDE_CONTENT_ZONE_SPUSH","CLOSE_CONTENT_ZONE_SPUSH","INIT_RECURING_STORE","PAUSE_SMART_PUSH","START_SMART_PUSH","MOVE_RIGHT","MOVE_LEFT","OPEN_NAV","CLOSE_NAV","SET_NAV_STRUCTURE","RESTORE_CART","initialState","isOpen","position","navStructure","isTimerTypeOpen","openedContentZones","closedByUserContentZones","recuringSPushes","count","pauseSmartPush","isActive","rootEpic","combineEpics","rootReducer","circleNav","action","structure","smartPush","spId","lastShown","Date","now","rest","tab","getState$","Observable","observer","next","epicMiddleware","createEpicMiddleware","run","ClassWithState","dispatch","state$","bindStoreToClass","FOCUS_TAB","BLUR_TAB","GiftWrappable","Toggle","Close","Title","AjaxUrl","TotalPriceWithoutTax","DeliveryAddress","BillingAddress","SummaryLabel","CheckoutButton","ContinueButton","Promotion","FreeDelivery","Headline","TotalItems","Duration","Style","cartReducer"],"sourceRoot":""}