1import{EVENTS}from"@archetype-themes/utils/events";class BlockBuyButtons extends HTMLElement{constructor(){super(),this.handleVariantChange=this.handleVariantChange.bind(this)}connectedCallback(){this.abortController=new AbortController,this.addEventListener("submit",this.handleSubmit.bind(this),{signal:this.abortController.signal}),document.addEventListener(`${EVENTS.variantChange}:${this.dataset.sectionId}:${this.dataset.productId}`,this.handleVariantChange,{signal:this.abortController.signal}),this.cartType=this.dataset.cartType}disconnectedCallback(){this.abortController.abort()}handleVariantChange({detail}){const{html,variant}=detail;if(!variant){this.toggleAddButton(!0,this.getLocales().unavailable);return}this.updateVariantInput(variant),this.renderProductInfo(html,variant)}renderProductInfo(html,variant){const addButtonUpdated=html.getElementById(`ProductSubmitButton-${this.dataset.sectionId}`);addButtonUpdated&&this.toggleAddButton(addButtonUpdated.hasAttribute("disabled"),this.getLocales().soldOut,variant),this.renderQuickAddQuantity(html)}renderQuickAddQuantity(html){if(this.dataset.template!=="form")return;const currentWrapper=this.querySelector("[data-quick-add-quantity]"),updatedWrapper=html.querySelector("[data-quick-add-quantity]");if(!currentWrapper||!updatedWrapper)return;const currentInput=currentWrapper.querySelector('input[name="quantity"]'),updatedInput=updatedWrapper.querySelector('input[name="quantity"]');if(currentInput&&updatedInput){const currentQuantity=Number.parseInt(currentInput.value,10),min=Number.parseInt(updatedInput.min,10)||1,max=updatedInput.max?Number.parseInt(updatedInput.max,10):null,step=Number.parseInt(updatedInput.step,10)||1;let nextQuantity=Number.isFinite(currentQuantity)?currentQuantity:min;nextQuantity=Math.max(nextQuantity,min),Number.isFinite(max)&&(nextQuantity=Math.min(nextQuantity,max)),nextQuantity=min+Math.round((nextQuantity-min)/step)*step,Number.isFinite(max)&&(nextQuantity=Math.min(nextQuantity,max)),updatedInput.value=nextQuantity,updatedInput.dataset.initialValue=nextQuantity}currentWrapper.replaceWith(updatedWrapper)}getLocales(){return this.locales=this.locales||JSON.parse(this.querySelector('[type="application/json"]').textContent),this.locales}toggleAddButton(disable=!0,text,variant){const productForm=this.querySelector(`#product-form-${this.dataset.sectionId}`);let preorder=!1;
1if(!productForm)return;const addButton=productForm.querySelector('[name="add"]'),addButtonText=productForm.querySelector('[name="add"] > span');if(addButton){if(disable)addButton.setAttribute("disabled","disabled"),text&&(addButtonText.textContent=text);else{addButton.removeAttribute("disabled");const productInventory=document.querySelector("product-inventory");if(productInventory&&typeof productInventory.getInventories=="function"){const variantInventoryObject=productInventory.getInventories()[variant.id],{quantity,policy,incoming,next_incoming_date}=variantInventoryObject||{};quantity<=0&&policy==="continue"&&(preorder=!0)}addButtonText.textContent=this.dataset.template==="preorder"||preorder?this.getLocales().preOrder:this.getLocales().addToCart}this.togglePreOrderText(preorder||this.dataset.template==="preorder")}}togglePreOrderText(isPreorder){const preOrderText=this.querySelector("#preorderText");preOrderText&&(isPreorder?preOrderText.classList.remove("hide"):preOrderText.classList.add("hide"))}updateVariantInput(variant){this.querySelectorAll(`#product-form-${this.dataset.sectionId}, #product-form-installment-${this.dataset.sectionId}`).forEach(productForm=>{const input=productForm.querySelector('input[name="id"]');input.value=variant.id,input.dispatchEvent(new Event("change",{bubbles:!0}))})}async handleSubmit(event){if(this.cartType!="page"){event.preventDefault(),this.disableAddToCartButton();try{const responseJson=await this.addVariantToCart();this.closeQuickAdd(),this.dispatchEvent(new CustomEvent(EVENTS.ajaxProductAdded,{bubbles:!0,detail:{product:responseJson,addToCartBtn:this.querySelector(`#ProductSubmitButton-${this.dataset.sectionId}`)}}))}catch(error){this.handleError(error)}finally{this.enableAddToCartButton()}}}closeQuickAdd(){if(this.dataset.template!=="form")return;this.closest('tool-tip[data-tool-tip="QuickAdd"]')?.querySelector("[data-tool-tip-close]")?.click()}handleError(error){if(!error.description){console.warn(error);return}let form=this.querySelector("form"),errors=this.querySelector("form .errors");errors&&errors.remove();let errorDiv=document.createElement("div");errorDiv.classList.add("errors","text-center"),typeof error.description=="object"?errorDiv.textContent=error.message:errorDiv.textContent=error.description,form.append(errorDiv),this.dispatchEvent(new CustomEvent(EVENTS.ajaxProductError,{bubbles:!0,detail:{errorMessage:error.description}}))}async addVariantToCart(){const formData=this.getFormDataWithSections(),response=await fetch(`${window.Shopify.routes.root}cart/add.js`,{method:"POST",headers:{"X-Requested-With":"XMLHttpRequest"},body:formData});if(!response.ok)throw await response.json();return response.json()}async fetchCart(){return(await fetch(`${window.Shopify.routes.root}cart.js`)).json()}getFormDataWithSections(){const productForm=this.querySelector(`#product-form-${this.dataset.sectionId}`),formData=new FormData(productForm);return formData.set("sections_url",`${window.Shopify.routes.root}variants/${productForm.id.value}`),formData.set("sections","cart-ajax"),formData}enableAddToCartButton(){const productForm=this.querySelector(`#product-form-${this.dataset.sectionId}`);if(!productForm)return;const addButton=productForm.querySelector('[name="add"]');addButton.removeAttribute("aria-busy"),addButton.classList.remove("btn--loading")}disableAddToCartButton(){const productForm=this.querySelector(`#product-form-${this.dataset.sectionId}`),errors=this.querySelector("form .errors");if(errors&&errors.remove(),!productForm)return;const addButton=productForm.querySelector('[name="add"]');addButton.setAttribute("aria-busy","true"),addButton.classList.add("btn--loading")}}customElements.define("block-buy-buttons",BlockBuyButtons); 2//# sourceMappingURL=/cdn/shop/t/318/assets/block-buy-buttons.js.map?v=157393611950025351571790041526
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.