{"version":3,"file":"product-algolia-recommendations.js","sources":["../../dev/js/product-algolia-recommendations.js"],"sourcesContent":["import Hogan from \"hogan.js\";\nimport hoganHelpers from \"./algolia/helpers\";\nimport {\n parseColorsFromAlgoliaNamedTags,\n responsiveImage,\n waitForAlgoliaClient,\n} from \"./algolia/utils\";\n\nconst buildQuickshopHtml = (card, additionalProductData) => {\n const variants = additionalProductData?.variants;\n const productId = additionalProductData?.id;\n const isBundleProduct = additionalProductData?.isBundleProduct;\n const productHandle = additionalProductData?.handle || \"#\";\n\n if (!variants || variants.length <= 0) return;\n\n let allVariantsOutOfStock = true;\n\n const options = variants\n .map(({ id, available, inventoryQuantity, optionLabel }) => {\n // Change allVariantsOutOfStock to false if a variant is available\n if (allVariantsOutOfStock && available) {\n allVariantsOutOfStock = false;\n }\n\n // Prepare Algolia tracking add to cart data\n const optionTrackingData = {\n index: card.dataset.algoliaIndex,\n eventName: \"Quickshop add to cart\",\n queryID: card.dataset.algoliaQueryid,\n objectIDs: [String(id)],\n };\n\n if (window.algolia.customer) {\n optionTrackingData.authenticatedUserToken = `${window.algolia.customer}`;\n }\n\n return `\n
\n \n \n ${optionLabel}\n \n
\n `;\n })\n .join(\"\");\n\n return `\n \n
\n
\n ${\n allVariantsOutOfStock\n ? `\n
\n Out of stock\n
\n `\n : \"\"\n }\n ${\n !isBundleProduct\n ? `\n
\n ${options}\n
\n `\n : \"\"\n }\n
\n ${\n !isBundleProduct\n ? `\n \n `\n : `\n \n Select your bundle\n \n `\n }\n
\n \n \n \n \n\n \n \n \n
\n `;\n};\n\nconst productCardDomChange = (card, additionalProductData) => {\n const cardHandle = card.dataset.handle;\n const {\n id,\n handle,\n title,\n vendor,\n isBundleProduct,\n imgUrl,\n imgAlternateUrl,\n badges,\n price,\n compareAtPrice,\n variants,\n } = additionalProductData;\n\n const imgSecondaryElem = card.querySelector(\n \"[data-product-card-image-secondary]\"\n );\n\n imgSecondaryElem.innerHTML = responsiveImage(title, imgAlternateUrl);\n\n // Quickshop\n const quickshopElem = card.querySelector(\"[data-product-card-quickshop]\");\n quickshopElem.innerHTML = buildQuickshopHtml(card, additionalProductData);\n\n // No need to continue if we're hovering on the initial card\n if (cardHandle === handle) return;\n\n // Change card handle\n card.dataset.handle = handle;\n\n // Change primary image\n const imgPrimaryElem = card.querySelector(\n \"[data-product-card-image-primary]\"\n );\n imgPrimaryElem.innerHTML = responsiveImage(title, imgUrl);\n\n // Change badges\n const badgesElem = card.querySelector(\"[data-product-card-badges]\");\n badgesElem.innerHTML = unescapeHTML(badges);\n\n // Change vendor\n const vendorElem = card.querySelector(\"[data-product-card-vendor]\");\n vendorElem.innerHTML = vendor;\n\n // Change title\n const titleElem = card.querySelector(\"[data-product-card-title]\");\n titleElem.innerHTML = title;\n\n // Change price\n const priceElem = card.querySelector(\"[data-product-card-price]\");\n priceElem.innerHTML = formatPriceWithComparison(price, compareAtPrice);\n\n // Change product page urls\n card.querySelectorAll(\"[data-product-card-link]\").forEach((anchor) => {\n anchor.href = `/products/${handle}`;\n });\n\n // Cange Wishlist Trigger Attributes\n const wishlistElem = card.querySelector(\"[data-wishlist-action]\");\n\n if (!wishlistElem || !window._swat) return;\n\n wishlistElem.dataset.productId = id;\n wishlistElem.dataset.variantId = variants[0]?.id;\n wishlistElem.dataset.productDu = `${window.location.origin}/products/${handle}`;\n wishlistElem.dataset.productIu = imgUrl\n ? imgUrl.replace(/\\/(.*)\\.(\\w{2,4})/g, \"/$1_620x620.$2\")\n : \"\";\n wishlistElem.dataset.productPr = price;\n wishlistElem.dataset.productDt = title;\n};\n\nconst handleCardHover = async (event) => {\n const elem = event.currentTarget;\n const card = elem.closest(\"[data-product-card]\");\n const productHandle = card?.dataset?.handle;\n const loadingClass = \"product-card--is-loading\";\n\n if (!productHandle) return;\n\n try {\n card.classList.add(loadingClass);\n const additionalProductData = await fetchAdditionalProductData(\n productHandle\n );\n\n if (!additionalProductData) {\n throw new Error(\"No additionalProductData returned\");\n }\n\n productCardDomChange(card, additionalProductData, false);\n } catch (error) {\n console.error(\"Error getting additional product data:\", error);\n } finally {\n card.classList.remove(loadingClass);\n }\n};\n\nconst handleSwatchClick = async (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n const elem = event.currentTarget;\n const card = elem.closest(\"[data-product-card]\");\n const swatchProductHandle = elem.dataset?.productCardColorId;\n const loadingClass = \"product-card--is-loading\";\n\n if (!swatchProductHandle) return;\n\n try {\n card.classList.add(loadingClass);\n const additionalProductData = await fetchAdditionalProductData(\n swatchProductHandle\n );\n\n if (!additionalProductData) {\n throw new Error(\"No additionalProductData returned\");\n }\n\n const cardSwatches = elem\n .closest(\"[data-product-card]\")\n .querySelectorAll(\"[data-product-card-color-id]\");\n const activeSwatchClass = \"product-card-colors__link--is-active\";\n\n cardSwatches.forEach((cardSwatch) =>\n cardSwatch.classList.remove(activeSwatchClass)\n );\n elem.classList.add(activeSwatchClass);\n\n productCardDomChange(card, additionalProductData);\n } catch (error) {\n console.error(\"Error getting additional product data:\", error);\n } finally {\n card.classList.remove(loadingClass);\n }\n};\n\n(async () => {\n if (!customElements.get(\"product-recommendations\")) {\n const { default: Swiper } = await import(\"swiper\");\n const { default: recommend } = await import(\"@algolia/recommend\");\n\n // Checks if the algolia config has loaded before continuing\n try {\n await waitForAlgoliaClient();\n } catch (error) {\n console.error(\"Error while waiting for algolia:\", error);\n return;\n }\n\n class ProductAlgoliaRecommendations extends HTMLElement {\n constructor() {\n super();\n\n this.algoliaConfig = window.algoliaShopify.config;\n\n this.recommendClient = recommend(\n this.algoliaConfig.app_id,\n this.algoliaConfig.search_api_key\n );\n\n this.swiperElement = this.querySelector(\n \"[data-swiper-related-products]\"\n );\n\n this.swiperOptions = {\n loop: false,\n autoplay: false,\n direction: \"horizontal\",\n spaceBetween: 10,\n slidesOffsetBefore: 16,\n slidesOffsetAfter: 16,\n breakpoints: {\n 320: {\n slidesPerView: 2.2,\n spaceBetween: 10,\n slidesOffsetBefore: 16,\n slidesOffsetAfter: 16,\n },\n 768: {\n slidesPerView: 3.2,\n spaceBetween: 10,\n slidesOffsetBefore: 16,\n slidesOffsetAfter: 16,\n },\n 1024: {\n slidesPerView: 6,\n spaceBetween: 30,\n slidesOffsetBefore: 0,\n slidesOffsetAfter: 0,\n },\n },\n };\n\n // Check if we have extra options on the HTML\n if (this && this.dataset && this.dataset.options) {\n const jsonOptions = JSON.parse(this.dataset.options);\n\n if (jsonOptions) {\n this.swiperOptions = {\n ...this.swiperOptions,\n ...jsonOptions,\n };\n }\n }\n }\n\n connectedCallback() {\n // Initialize Intersection Observer\n const options = {\n root: null, // viewport as the bounding box\n rootMargin: \"100px\", // triggers 100px before the element comes into view\n threshold: 0.01, // trigger as soon as even 1% of the element is in view\n };\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n this.initRecommendations();\n observer.unobserve(entry.target); // Optionally unobserve after loading\n }\n });\n }, options);\n observer.observe(this);\n }\n\n async initRecommendations() {\n // re-init slider when Theme Editor is active\n if (Shopify.designMode && this.swiperElement) {\n // Update the swiper\n window.addEventListener(\"shopify:section:load\", () => {\n this.swiperInstance.update();\n });\n }\n\n const template = Hogan.compile(\n document.querySelector(\"#product_list_card\").innerHTML,\n { delimiters: \"[[ ]]\" }\n );\n\n const colorsMap = this.dataset.colours\n ? this.dataset.colours.split(\",\").reduce((colors, colorStr) => {\n const parts = colorStr.split(\"|\");\n if (parts[1]) {\n colors[parts[0]] = parts[1];\n }\n return colors;\n }, {})\n : {};\n\n const products = await this.recommendClient\n .getRecommendations([\n {\n indexName: `${this.algoliaConfig.index_prefix}products`,\n objectID: `${this.dataset.id}`,\n maxRecommendations: Number(this.dataset.maxProducts),\n model: this.dataset.type,\n queryParameters: {\n attributesToSnippet: [],\n attributesToHighlight: [],\n attributesToRetrieve: [\n \"inventory_quantity\",\n \"inventory_management\",\n \"inventory_policy\",\n \"handle\",\n \"title\",\n \"id\",\n \"price_ratio\",\n \"price\",\n \"compare_at_price\",\n \"vendor\",\n \"product_image\",\n \"image\",\n \"variants_min_price\",\n \"variants_max_price\",\n \"variant_title\",\n \"variants_inventory_count\",\n \"named_tags\",\n ],\n filters: \"inventory_quantity > 0\",\n },\n },\n ])\n .then(({ results }) =>\n results[0].hits.map((product) => {\n const colors = parseColorsFromAlgoliaNamedTags(\n product,\n colorsMap\n );\n\n return {\n ...product,\n _distinct: true,\n can_order:\n product.inventory_management !== \"shopify\" ||\n product.inventory_policy === \"continue\" ||\n product.inventory_quantity > 0,\n queryID: product.__queryID,\n productPosition: product.__position,\n index: `${this.algoliaConfig.index_prefix}products`,\n colors,\n };\n })\n );\n\n if (products.length > 0) {\n this.querySelector(\"[data-related-products]\").innerHTML = products\n .map(\n (product) => `\n
\n ${template.render({\n ...product,\n helpers: hoganHelpers,\n })}\n
\n `\n )\n .join(\"\");\n\n this.swiperInstance = new Swiper(\n this.swiperElement,\n this.swiperOptions\n );\n\n // Attach event listeners\n const allProductCards = this.querySelectorAll(\"[data-product-card]\");\n\n allProductCards.forEach(async (card) => {\n // Retrieve additional data for quick shop\n const productHandle = card?.dataset?.handle;\n\n if (productHandle) {\n const additionalProductData = await fetchAdditionalProductData(\n productHandle\n );\n\n if (!additionalProductData) {\n throw new Error(\"No additionalProductData returned\");\n }\n // Quickshop\n const quickshopElem = card.querySelector(\n \"[data-product-card-quickshop]\"\n );\n quickshopElem.innerHTML = buildQuickshopHtml(\n card,\n additionalProductData\n );\n }\n\n // Card hover events\n const hoverElem = card.querySelector(\"[data-product-card-inner]\");\n\n hoverElem.removeEventListener(\"mouseenter\", handleCardHover);\n hoverElem.addEventListener(\"mouseenter\", handleCardHover, {\n once: true,\n });\n\n // Swatches click events\n const cardSwatches = card.querySelectorAll(\n \"[data-product-card-color-id]\"\n );\n\n cardSwatches.forEach((swatch) => {\n swatch.removeEventListener(\"click\", handleSwatchClick);\n swatch.addEventListener(\"click\", handleSwatchClick);\n });\n\n if (card.querySelector(\"[data-show-remaining-colours]\")) {\n card\n .querySelector(\"[data-show-remaining-colours]\")\n .addEventListener(\"click\", (e) => {\n e.target.remove();\n\n card\n .querySelectorAll(\".product-card-colors__link--hidden\")\n .forEach((el) => {\n el.classList.remove(\"product-card-colors__link--hidden\");\n });\n });\n }\n });\n } else {\n this.remove();\n }\n }\n }\n\n window.ProductAlgoliaRecommendations = ProductAlgoliaRecommendations;\n\n customElements.define(\n \"product-algolia-recommendations\",\n ProductAlgoliaRecommendations\n );\n }\n})();\n"],"names":["buildQuickshopHtml","card","additionalProductData","variants","productId","id","isBundleProduct","productHandle","handle","length","allVariantsOutOfStock","options","map","available","inventoryQuantity","optionLabel","optionTrackingData","index","dataset","algoliaIndex","eventName","queryID","algoliaQueryid","objectIDs","String","window","algolia","customer","authenticatedUserToken","JSON","stringify","join","addToCartBehavior","productCardDomChange","cardHandle","title","vendor","imgUrl","imgAlternateUrl","badges","price","compareAtPrice","imgSecondaryElem","querySelector","innerHTML","responsiveImage","quickshopElem","imgPrimaryElem","badgesElem","unescapeHTML","vendorElem","titleElem","priceElem","formatPriceWithComparison","querySelectorAll","forEach","anchor","href","wishlistElem","_swat","variantId","productDu","location","origin","productIu","replace","productPr","productDt","handleCardHover","async","event","elem","currentTarget","closest","loadingClass","classList","add","fetchAdditionalProductData","Error","error","console","remove","handleSwatchClick","preventDefault","stopPropagation","swatchProductHandle","productCardColorId","cardSwatches","activeSwatchClass","cardSwatch","customElements","get","default","Swiper","import","recommend","then","n","r","waitForAlgoliaClient","ProductAlgoliaRecommendations","HTMLElement","constructor","super","this","algoliaConfig","algoliaShopify","config","recommendClient","app_id","search_api_key","swiperElement","swiperOptions","loop","autoplay","direction","spaceBetween","slidesOffsetBefore","slidesOffsetAfter","breakpoints","slidesPerView","jsonOptions","parse","connectedCallback","root","rootMargin","threshold","observer","IntersectionObserver","entries","entry","isIntersecting","initRecommendations","unobserve","target","observe","Shopify","designMode","addEventListener","swiperInstance","update","template","Hogan","compile","document","delimiters","colorsMap","colours","split","reduce","colors","colorStr","parts","products","getRecommendations","indexName","index_prefix","objectID","maxRecommendations","Number","maxProducts","model","type","queryParameters","attributesToSnippet","attributesToHighlight","attributesToRetrieve","filters","results","hits","product","parseColorsFromAlgoliaNamedTags","_distinct","can_order","inventory_management","inventory_policy","inventory_quantity","__queryID","productPosition","__position","render","helpers","hoganHelpers","allProductCards","hoverElem","removeEventListener","once","swatch","e","el","define"],"mappings":"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"}