1import{Component}from"@theme/component";import{morph}from"@theme/morph";import"@theme/events";import{DialogComponent,DialogCloseEvent}from"@theme/dialog";import{mediaQueryLarge,isMobileBreakpoint,getIOSVersion}from"@theme/utilities";import"@theme/variant-picker";import{StandardEvents}from"@shopify/events";export class QuickAddComponent extends Component{#abortController=null;#cachedContent=new Map;#cartUpdateAbortController=new AbortController;get productPageUrl(){const productCard=this.closest("product-card"),hotspotProduct=this.closest("product-hotspot-component"),productLink=productCard?.getProductCardLink()||hotspotProduct?.getHotspotProductLink();if(!productLink?.href)return"";const url=new URL(productLink.href);if(url.searchParams.has("variant"))return url.toString();const selectedVariantId=this.#getSelectedVariantId();return selectedVariantId&&url.searchParams.set("variant",selectedVariantId),url.toString()}#getSelectedVariantId(){return this.closest("product-card")?.getSelectedVariantId()||null}connectedCallback(){super.connectedCallback(),mediaQueryLarge.addEventListener("change",this.#closeQuickAddModal),document.addEventListener(StandardEvents.cartLinesUpdate,this.#handleCartUpdate,{signal:this.#cartUpdateAbortController.signal}),document.addEventListener(StandardEvents.productSelect,this.#handleProductSelectUpdate)}disconnectedCallback(){super.disconnectedCallback(),mediaQueryLarge.removeEventListener("change",this.#closeQuickAddModal),this.#abortController?.abort(),this.#cartUpdateAbortController.abort(),document.removeEventListener(StandardEvents.productSelect,this.#handleProductSelectUpdate)}#handleProductSelectUpdate=event=>{if(!(event.target instanceof HTMLElement)||event.target.closest("product-card")!==this.closest("product-card"))return;const quickAddButton=this.dataset.productOptionsCount==="1"?"add":"choose";this.setAttribute("data-quick-add-button",quickAddButton)};#handleCartUpdate=()=>{this.#cachedContent.clear()};#updateVariantPicker(newHtml){const modalContent=document.getElementById("quick-add-modal-content");if(!modalContent)return;const variantPicker=modalContent.querySelector("variant-picker");variantPicker&&variantPicker.updateVariantPicker(newHtml)}handleClick=async event=>{event.preventDefault();const currentUrl=this.productPageUrl;let productGrid=this.#cachedContent.get(currentUrl);if(!productGrid){const html=await this.fetchProductPage(currentUrl);if(html){const gridElement=html.querySelector("[data-product-grid-content]");gridElement&&(productGrid=gridElement.cloneNode(!0),this.#cachedContent.set(currentUrl,productGrid))}}if(productGrid){const freshContent=productGrid.cloneNode(!0);
1await this.updateQuickAddModal(freshContent),this.#updateVariantPicker(productGrid)}this.#openQuickAddModal()};#resetScroll(){const dialogComponent=document.getElementById("quick-add-dialog");if(!(dialogComponent instanceof QuickAddDialog))return;const productDetails=dialogComponent.querySelector(".product-details"),productMedia=dialogComponent.querySelector(".product-information__media");productDetails?.scrollTo({top:0,behavior:"instant"}),productMedia?.scrollTo({top:0,behavior:"instant"})}#stayVisibleUntilDialogCloses(dialogComponent){this.toggleAttribute("stay-visible",!0),dialogComponent.addEventListener(DialogCloseEvent.eventName,()=>this.toggleAttribute("stay-visible",!1),{once:!0})}#openQuickAddModal=()=>{const dialogComponent=document.getElementById("quick-add-dialog");if(!(dialogComponent instanceof QuickAddDialog))return;this.#stayVisibleUntilDialogCloses(dialogComponent),dialogComponent.showDialog();const dialog=dialogComponent.refs?.dialog;dialog&&dialog.addEventListener("animationstart",this.#resetScroll.bind(this),{once:!0})};#closeQuickAddModal=()=>{const dialogComponent=document.getElementById("quick-add-dialog");dialogComponent instanceof QuickAddDialog&&dialogComponent.closeDialog()};async fetchProductPage(productPageUrl){if(!productPageUrl)return null;this.#abortController?.abort(),this.#abortController=new AbortController;try{const response=await fetch(productPageUrl,{signal:this.#abortController.signal});if(!response.ok)throw new Error(`Failed to fetch product page: HTTP error ${response.status}`);const responseText=await response.text();return new DOMParser().parseFromString(responseText,"text/html")}catch(error){if(error.name==="AbortError")return null;throw error}finally{this.#abortController=null}}async updateQuickAddModal(productGrid){const modalContent=document.getElementById("quick-add-modal-content");if(!productGrid||!modalContent)return;if(isMobileBreakpoint()){const productDetails=productGrid.querySelector(".product-details"),productFormComponent=productGrid.querySelector("product-form-component"),variantPicker=productGrid.querySelector("variant-picker"),productPrice=productGrid.querySelector("product-price"),productTitle=document.createElement("a");productTitle.textContent=this.dataset.productTitle||"",productTitle.href=this.productPageUrl;const productHeader=document.createElement("div");productHeader.classList.add("product-header"),productHeader.appendChild(productTitle),productPrice&&productHeader.appendChild(productPrice),productGrid.appendChild(productHeader),variantPicker&&productGrid.appendChild(variantPicker),productFormComponent&&productGrid.appendChild(productFormComponent),productDetails?.remove()}const payload=productGrid.getAttribute("view-event-payload")||"";modalContent.setAttribute("view-event-payload",payload),morph(modalContent,productGrid),this.#syncVariantSelection(modalContent)}#syncVariantSelection(modalContent){const selectedVariantId=this.#getSelectedVariantId();if(!selectedVariantId)return;const modalInputs=modalContent.querySelectorAll('input[type="radio"][data-variant-id]');for(const input of modalInputs)if(input instanceof HTMLInputElement&&input.dataset.variantId===selectedVariantId&&!input.checked){input.checked=!0,input.dispatchEvent(new Event("change",{bubbles:!0}));break}}}customElements.get("quick-add-component")||customElements.define("quick-add-component",QuickAddComponent);class QuickAddDialog extends DialogComponent{#abortController=new AbortController;connectedCallback(){super.connectedCallback(),this.addEventListener(StandardEvents.cartLinesUpdate,this.handleCartUpdate,{signal:this.#abortController.signal}),this.addEventListener(StandardEvents.productSelect,this.#handleProductSelect),this.addEventListener(DialogCloseEvent.eventName,this.#handleDialogClose)}disconnectedCallback(){super.disconnectedCallback(),this.#abortController.abort(),this.removeEventListener(DialogCloseEvent.eventName,this.#handleDialogClose)}handleCartUpdate=event=>{event.promise?.then(({detail})=>{detail?.didError||this.closeDialog()}).catch(error=>{error?.name!=="AbortError"&&console.warn("[quick-add] Event promise rejected:",error)})};#handleProductSelect=event=>{event.promise.then(({detail})=>
1{if(!detail?.html)return;const{html}=detail,anchorElement=html.querySelector(".view-product-title a"),viewMoreDetailsLink=this.querySelector(".view-product-title a"),mobileProductTitle=this.querySelector(".product-header a");anchorElement&&(viewMoreDetailsLink&&(viewMoreDetailsLink.href=anchorElement.href),mobileProductTitle&&(mobileProductTitle.href=anchorElement.href))}).catch(error=>{error?.name!=="AbortError"&&console.warn("[quick-add] Event promise rejected:",error)})};#handleDialogClose=()=>{const iosVersion=getIOSVersion();!iosVersion||iosVersion.major>=17||iosVersion.major===16&&iosVersion.minor>=4||requestAnimationFrame(()=>{const grid=document.querySelector("#ResultsList [product-grid-view]");if(grid){const currentWidth=grid.getBoundingClientRect().width;grid.style.width=`${currentWidth-1}px`,requestAnimationFrame(()=>{grid.style.width=""})}})}}customElements.get("quick-add-dialog")||customElements.define("quick-add-dialog",QuickAddDialog); 2//# sourceMappingURL=/cdn/shop/t/3/assets/quick-add.js.map?v=43065342542833269571782122108
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.