PageSourceSearch

https://www.032c.com/cdn/shop/t/23/assets/hover-quick-add.js?v=170960459606114838851766158354

js 032c.com collected 2026-10-02 02:58:07 UTC 6,397 bytes, 2 lines download raw bytes

1class HoverQuickAdd extends HTMLElement{constructor(){super(),this.init()}init(){this.selectedVariants={},this.productData=null,this.setupEventListeners(),this.loadProductData()}setupEventListeners(){this.addEventListener("click",e=>{e.target.classList.contains("hover-variant-btn")&&!e.target.disabled&&this.handleVariantSelection(e.target)}),this.addEventListener("click",e=>{e.target.classList.contains("hover-add-to-cart-btn")&&e.target.dataset.productId&&this.handleVariantAddToCart(e.target)})}async loadProductData(){const productHandle=this.dataset.productHandle;if(productHandle)try{const response=await fetch(`/products/${productHandle}.js`);this.productData=await response.json()}catch(error){console.error("Failed to load product data:",error)}}handleVariantSelection(button){const option=button.dataset.variantOption,value=button.dataset.variantValue,productId=button.dataset.productId;button.closest(".hover-variant-option").querySelectorAll(".hover-variant-btn").forEach(btn=>{btn.classList.remove("selected")}),button.classList.add("selected"),this.selectedVariants[productId]||(this.selectedVariants[productId]={}),this.selectedVariants[productId][option]=value,this.updateAddToCartButton(productId)}updateAddToCartButton(productId){const addToCartBtn=this.querySelector(`[data-
1product-id="${productId}"].hover-add-to-cart-btn`);if(!addToCartBtn||!this.productData)return;const selectedOptions=this.selectedVariants[productId]||{},variant=this.findMatchingVariant(selectedOptions);variant&&variant.available?(addToCartBtn.disabled=!1,addToCartBtn.textContent=addToCartBtn.dataset.addToCartText||"Add to cart",addToCartBtn.dataset.variantId=variant.id):(addToCartBtn.disabled=!0,addToCartBtn.textContent=variant?"SOLD OUT":"Select options")}findMatchingVariant(selectedOptions){return!this.productData||!this.productData.variants?null:this.productData.variants.find(variant=>{const options=[variant.option1,variant.option2,variant.option3].filter(Boolean);return Object.values(selectedOptions).every(value=>options.includes(value))})}async tryUpdateCartQuantity(variantId){try{const config=fetchConfig("javascript");config.headers["X-Requested-With"]="XMLHttpRequest";const formData=new FormData;formData.append("id",variantId),formData.append("quantity","2");const cart=document.querySelector("cart-notification")||document.querySelector("cart-drawer");cart&&typeof cart.getSectionsToRender=="function"&&(formData.append("sections",cart.getSectionsToRender().map(section=>section.id)),formData.append("sections_url",window.location.pathname)),config.body=formData;const responseText=await(await fetch(routes.cart_change_url||"/cart/change.js",config)).text(),result=responseText?JSON.parse(responseText):{};return result.status?null:result}catch(error){return console.log("Cart update failed:",error),null}}async handleVariantAddToCart(button){const variantId=button.dataset.variantId;if(!variantId)return;const originalText=button.textContent;button.disabled=!0,button.classList.add("loading"),button.textContent="Adding...";const spinner=button.querySelector(".loading__spinner");spinner&&spinner.classList.remove("hidden");try{const config=fetchConfig("javascript");config.headers["X-Requested-With"]="XMLHttpRequest",delete config.headers["Content-Type"];const formData=new FormData;formData.append("id",variantId),formData.append("quantity","1");const cart=document.querySelector("cart-notification")||document.querySelector("cart-drawer");cart&&typeof cart.getSectionsToRender=="function"&&(formData.append("sections",cart.getSectionsToRender().map(section=>section.id)),formData.append("sections_url",window.location.pathname),cart.setActiveElement(document.activeElement)),config.body=formData;const responseText=await(await fetch(routes.cart_add_url,config)).text();let result;try{result=responseText?JSON.parse(responseText):{}}catch(jsonError){throw console.error("JSON parsing error:",jsonError,"Response text:",responseText),new Error("Invalid server response")}if(result.status){let errorMessage=result.description||result.message||"Failed to add to cart";if(errorMessage.toLowerCase().includes("limit")||errorMessage.toLowerCase().includes("maximum")||errorMessage.toLowerCase().includes("already in your cart")||errorMessage.toLowerCase().includes("inventory")||result.status===422){let displayMessage="Cart limit reached";if(errorMessage.toLowerCase().includes("inventory"))displayMessage="Not enough in stock";else if(errorMessage.toLowerCase().includes("maximum"))displayMessage="Maximum quantity reached";else if(errorMessage.toLowerCase().includes("already in your cart")){button.textContent="Updating quantity...";const updateResult=await this.tryUpdateCartQuantity(variantId);if(updateResult){button.textContent="Quantity updated!",cart&&typeof cart.renderContents=="function"&&cart.renderContents(updateResult),setTimeout(()=>{button.textContent=originalText,button.disabled=!1},2e3);return}else displayMessage="Maximum quantity reached"}button.textContent=displayMessage,setTimeout(()=>{button.textContent=originalText,button.disabled=!1},3e3);return}throw new Error(errorMessage)}button.textContent="Added!",typeof publish=="function"&&typeof PUB_SUB_EVENTS<"u"&&publish(PUB_SUB_EVENTS.cartUpdate,{source:"hover-quick-add",productVariantId:variantId,cartData:result}),cart&&typeof cart.renderContents=="function"&&cart.renderContents(result),setTimeout(()=>{button.textContent=originalText,button.disabled=!1},1500)}catch(error){console.error("Add to cart error:",error),button.textContent="Error",setTimeout(()=>{button.textContent=originalText,button.disabled=!1},2e3)}finally{button.classList.remove("loading"),spinner&&spinner.classList.add("hidden")}}}document.addEventListener("DOMContentLoaded",()=>
1{document.querySelectorAll(".quick-add-hover-overlay").forEach(overlay=>{overlay.classList.contains("hover-quick-add-initialized")||(overlay.classList.add("hover-quick-add-initialized"),Object.setPrototypeOf(overlay,HoverQuickAdd.prototype),overlay.init())})}),document.addEventListener("shopify:section:load",()=>{document.querySelectorAll(".quick-add-hover-overlay:not(.hover-quick-add-initialized)").forEach(overlay=>{overlay.classList.add("hover-quick-add-initialized"),Object.setPrototypeOf(overlay,HoverQuickAdd.prototype),overlay.init()})});
2//# sourceMappingURL=/cdn/shop/t/23/assets/hover-quick-add.js.map?v=170960459606114838851766158354

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.