{"version":3,"file":"product.js","sources":["../../src/js/GA4/addToCartProductPage.ts","../../src/js/GA4/viewItem.ts","../../src/js/GA4/selectRelatedProduct.ts","../../src/js/product.ts"],"sourcesContent":["import { addToCartEvent } from './utils/addToCart';\n\nexport function addToCartProductPageEvent() {\n const buttonList = document.querySelectorAll(\n '[data-button-add-to-cart]',\n );\n\n buttonList.forEach((button) => {\n const id = button.dataset.ga4ProductId!;\n const itemName = button.dataset.ga4ProductName!;\n const price = Number(button.dataset.ga4ProductPrice)!;\n button.addEventListener('click', () => {\n const quantitySelector = document.querySelector(\n '[data-quantity-value]',\n ) as HTMLInputElement;\n const quantity = Number(quantitySelector.value);\n\n const addedItem: Item = {\n item_id: id,\n item_name: itemName,\n price: price,\n quantity: quantity,\n };\n\n addToCartEvent(addedItem);\n });\n });\n}\n","import { viewItemEvent } from './utils/viewItem';\n\nexport function viewItemProductPageEvent() {\n const button = document.querySelector(\n '[data-button-add-to-cart]',\n );\n const quantitySelector = document.querySelector(\n '[data-quantity-value]',\n );\n\n if (!button) return;\n\n const id = button.dataset.ga4ProductId!;\n const itemName = button.dataset.ga4ProductName!;\n const price = Number(button.dataset.ga4ProductPrice);\n const quantity = quantitySelector ? Number(quantitySelector.value) : 1;\n\n const item: Item = {\n item_id: id,\n item_name: itemName,\n price: price,\n quantity: quantity,\n };\n\n viewItemEvent(item);\n}\n","import { selectItemEvent } from './utils/selectItem';\n\nexport function selectRelatedProduct() {\n const relatedProducts = document.querySelectorAll(\n '[data-related-product]',\n );\n\n relatedProducts.forEach((product) => {\n product.addEventListener('click', () => {\n const id = product.dataset.ga4ProductId!; // Required parameter\n const itemName = product.dataset.ga4ProductName!; // Required parameter\n const price = Number(product.dataset.ga4ProductPrice);\n const itemlist = product.dataset.ga4ProductList!;\n\n const item: Item = {\n item_id: id,\n item_name: itemName,\n price: price,\n item_list_name: itemlist,\n };\n\n selectItemEvent(item);\n });\n });\n}\n","import { initAccordion } from './components/accordion';\nimport { initCarousel } from './components/carousel';\nimport { initSelectDropdowns } from './components/selectdropdown';\nimport { initTabs } from './components/tab';\nimport { addToCartProductPageEvent } from './GA4/addToCartProductPage';\nimport { viewItemProductPageEvent } from './GA4/viewItem';\nimport {\n initPurchaseOptions,\n initQuantitySelector,\n initQuantityButtons,\n setPagePrices,\n initVariantOptions,\n} from './utils/productpurchase';\nimport { validateEmailInput } from './utils/formValidation';\nimport { addToastListener } from './components/toast';\nimport { selectRelatedProduct } from './GA4/selectRelatedProduct';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n initQuantitySelector();\n initCarousel();\n initTabs();\n initAccordion();\n initSelectDropdowns();\n applyStockNotificationValidation();\n addToastListener();\n makeButtonSticky();\n initProductPagePrices();\n\n // GA4 Events\n document.addEventListener('gaLoaded', () => {\n viewItemProductPageEvent();\n addToCartProductPageEvent();\n selectRelatedProduct();\n });\n});\n\nfunction applyStockNotificationValidation() {\n const input = document.getElementById(\n 'stock-notify-email',\n ) as HTMLInputElement | null;\n const error = document.getElementById(\n 'stock-notify-error',\n ) as HTMLElement | null;\n const submitButton = document.getElementById(\n 'stock-notify-submit',\n ) as HTMLButtonElement | null;\n\n if (!input || !error) return;\n let inputFocused = false;\n\n input.addEventListener('blur', () => {\n if (!inputFocused) {\n input.addEventListener('input', () => {\n validateEmailInput(input, error);\n });\n inputFocused = true;\n }\n });\n\n submitButton?.addEventListener('click', () => {\n validateEmailInput(input, error);\n });\n}\n\nfunction makeButtonSticky() {\n const button = document.getElementById(\n 'add-to-cart-button',\n ) as HTMLButtonElement | null;\n const stickyButton = document.getElementById(\n 'sticky-add-to-cart-button',\n ) as HTMLButtonElement | null;\n const buttonSection = document.getElementById(\n 'button-section',\n ) as Element | null;\n const cookieBannerElement = document.getElementById('cookieConsent');\n const relatedProductsSection = document.getElementById('related-products');\n const footer = document.querySelector('footer');\n const buttonHeight = button?.offsetHeight;\n let cookieBannerExists = cookieBannerElement !== null;\n let isDesktopView = window.innerWidth >= 768;\n let sectionInView = false;\n\n if (!button || !buttonSection || !stickyButton) {\n console.error('Cannot find the add to cart buttons');\n return;\n }\n const showStickyButton = () => {\n stickyButton.classList.remove('hidden');\n const cookieBannerHeight = cookieBannerElement\n ? cookieBannerElement.offsetHeight\n : 135; // 135 is the tallest the cookie banner across all viewports\n const bottom = cookieBannerExists ? cookieBannerHeight + 8 : 8;\n\n setTimeout(() => {\n stickyButton.style.bottom = `${bottom}px`;\n }, 50);\n };\n\n const hideStickyButton = () => {\n stickyButton.style.bottom = `-${buttonHeight}px`;\n setTimeout(() => {\n stickyButton.classList.add('hidden');\n }, 150);\n };\n\n if ('IntersectionObserver' in window) {\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n sectionInView = entry.isIntersecting;\n isDesktopView = window.innerWidth >= 768;\n if (!sectionInView && !isDesktopView) {\n showStickyButton();\n } else {\n sectionInView = true;\n hideStickyButton();\n }\n });\n },\n { threshold: 0.0 },\n );\n observer.observe(buttonSection);\n if (relatedProductsSection) {\n observer.observe(relatedProductsSection);\n } else if (footer) {\n observer.observe(footer);\n }\n }\n\n // Hide the sticky button on desktop view\n window.addEventListener('resize', () => {\n isDesktopView = window.innerWidth >= 768;\n if (isDesktopView || sectionInView) {\n hideStickyButton();\n } else {\n showStickyButton();\n }\n });\n\n // Move the sticky button when the cookie banner is removed\n document.addEventListener('cookieConsent', () => {\n cookieBannerExists = false;\n\n if (!sectionInView && !isDesktopView) {\n showStickyButton();\n } else {\n sectionInView = true;\n hideStickyButton();\n }\n });\n}\n\nfunction initProductPagePrices() {\n // ----------------------- Get the number of products in the cart -----------------------\n let quantityList: QuantityList; // List of products in the cart and their corresponding quantities\n\n const totalPriceElement =\n document.querySelector('[data-price-total]');\n const priceJsonString = totalPriceElement?.dataset.priceJson;\n const priceJson: VariantPrices = priceJsonString\n ? JSON.parse(priceJsonString)\n : {};\n\n document.addEventListener('getQuantities', function (event) {\n const customEvent = event as CustomEvent;\n\n const addToCartButtonElement = document.querySelector(\n '[data-button-add-to-cart]',\n );\n const variantId = addToCartButtonElement?.getAttribute('data-variant-id');\n quantityList = customEvent.detail.variantQuantities;\n\n if (!variantId) return;\n\n // TODO: Change to pass the entire priceJson list so the functions can handle variant changing within them\n const variantPriceList = priceJson[variantId];\n\n setPagePrices(variantPriceList, quantityList);\n initQuantityButtons(priceJson, quantityList);\n initPurchaseOptions(priceJson, quantityList);\n initVariantOptions(priceJson, quantityList);\n });\n\n // ----------------------- Update the number of quantities when item is added to cart -----------------------\n document.addEventListener('updateQuantity', function (event) {\n const customEvent = event as CustomEvent;\n const variantId = customEvent.detail.variantId;\n const subscriptionId = customEvent.detail.subscriptionId;\n\n quantityList[subscriptionId as keyof typeof quantityList] =\n customEvent.detail.cartQuantity;\n const variantPriceList = priceJson[variantId];\n\n setPagePrices(variantPriceList, quantityList);\n });\n}\n"],"names":["addToCartProductPageEvent","button","id","itemName","price","quantitySelector","quantity","addToCartEvent","viewItemProductPageEvent","viewItemEvent","selectRelatedProduct","product","itemlist","selectItemEvent","initQuantitySelector","initCarousel","initTabs","initAccordion","initSelectDropdowns","applyStockNotificationValidation","addToastListener","makeButtonSticky","initProductPagePrices","input","error","submitButton","inputFocused","validateEmailInput","stickyButton","buttonSection","cookieBannerElement","relatedProductsSection","footer","buttonHeight","cookieBannerExists","isDesktopView","sectionInView","showStickyButton","cookieBannerHeight","bottom","hideStickyButton","observer","entries","entry","quantityList","totalPriceElement","priceJsonString","priceJson","event","customEvent","addToCartButtonElement","variantId","variantPriceList","setPagePrices","initQuantityButtons","initPurchaseOptions","initVariantOptions","subscriptionId"],"mappings":"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"}