1import{desiredB2BAttribute,giftAddPayload,getQualifyingVariantId,hasGiftLine,orphanGiftKeys,shouldShowGiftPicker}from"mia-promo-logic";const config=window.miaPromoConfig??{},strings=config.strings??{},GIFT_DIALOG_DISMISSED_KEY="mia:gift-dialog-dismissed",APP_DRAWER_SELECTOR=".hs-popup-cart-sp-load",APP_DRAWER_BODY_SELECTOR=".hs-layout-content",APP_DRAWER_LINE_SELECTOR=".hs-item-cart-content",PICKER_TEMPLATE_ID="mia-gift-picker-template",CART_MUTATION_PATTERN=/\/cart\/(add|change|update|clear)(\.js|\b)/,INTERNAL_REQUEST_HEADER="X-Mia-Promo",observedAppDrawers=new WeakSet;let b2bSyncStopped=!1;const CATALOG_RETRY_DELAYS=[400,1200];let catalogPromise,cartReloadRequested=!1,giftAddInFlight=!1,giftDialogDismissed=readGiftDialogDismissal(),giftDialogEligibilityActive=!1,giftDialogProgrammaticHide=!1,lastCart,mutationChain=Promise.resolve();const observedCartDrawers=new WeakSet,observedGiftDialogs=new WeakSet;let reconcileActive=!1,reconcilePending=!1,renderGeneration=0;const debugEnabled=(()=>{try{return new URLSearchParams(window.location.search).has("mia_debug")||window.localStorage.getItem("mia:debug")==="1"}catch{return!1}})();function reportError(error){console.error("[Mia promo]",error)}function debug(...args){debugEnabled&&console.info("[Mia promo]",...args)}function errorMessage(){return strings.error??"Unable to add the free gift. Please try again."}function announce(message){const target=document.getElementById("status-announcement");target&&message&&(target.textContent=message)}function readGiftDialogDismissal(){try{return window.sessionStorage.getItem(GIFT_DIALOG_DISMISSED_KEY)==="1"}catch{return!1}}function setGiftDialogDismissal(dismissed){giftDialogDismissed=dismissed;try{dismissed?window.sessionStorage.setItem(GIFT_DIALOG_DISMISSED_KEY,"1"):window.sessionStorage.removeItem(GIFT_DIALOG_DISMISSED_KEY)}catch{}}function enqueueMutation(operation){const result=mutationChain.then(operation,operation);return mutationChain=result.catch(()=>{}),result}async function fetchCart(){const response=await fetch(`${Shopify.routes.root}cart.js`,{headers:{Accept:"application/json"}});if(!response.ok)throw new Error("Unable to read cart");return response.json()}function bundledSections(){const sections=[];return document.documentElement.dispatchEvent(new CustomEvent("cart:prepare-bundled-sections",{bubbles:!0,detail:{sections}})),[...new Set(sections.filter(Boolean))]}function withBundledSections(payload){const sections=bundledSections();return sections.length===0?payload:{...payload,sections:sections.join(","),sections_url:`${window.location.pathname}${window.location.search}`}}function dispatchCartChange(cart,baseEvent){const cartDrawer=document.querySelector("cart-drawer"),drawerSectionId=cartDrawer?.closest(".shopify-section")?.id?.replace(/^shopify-section-/,"");if(!(!cartDrawer||cart?.sections&&typeof cart.sections=="object"&&(drawerSectionId?typeof cart.sections[drawerSectionId]=="string":Object.values(cart.sections).some(html=>typeof html=="string")))){document.dispatchEvent(new CustomEvent("cart:refresh",{detail:{baseEvent}}));return}document.documentElement.dispatchEvent(new CustomEvent("cart:change",{bubbles:!0,detail:{baseEvent,cart}}))}async function updateCart(payload){const response=await fetch(`${Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",[INTERNAL_REQUEST_HEADER]:"1"},body:JSON.stringify(withBundledSections(payload))});if(!response.ok)throw new Error("Unable to update cart");return response.json()}async function syncB2B(cart){const desired=desiredB2BAttribute(config.isB2BCustomer);if(desired===null||cart?.attributes?.B2B===desired||b2bSyncStopped)return debug("B2B attribute unchanged",{current:cart?.attributes?.B2B,desired,stopped:b2bSyncStopped}),cart;debug("writing B2B attribute",{current:cart?.attributes?.B2B,desired});let lastError;for(let attempt=0;attempt<2;attempt+=1)try{return await updateCart({attributes:{B2B:desired}})}catch(error){lastError=error}return b2bSyncStopped=!0,reportError(lastError),cart}async function removeOrphanGifts(cart){const keys=orphanGiftKeys(cart?.items);if(keys.length===0)return cart;const updates=Object.fromEntries(keys.map(key=>[key,0]));return updateCart({updates})}function synchronizeQualifyingVariant(event){const detailForm=event.detail?.formId,marker=(event.target instanceof HTMLFormElement?event.target:detailForm?.form instanceof HTMLFormElement?detailForm.form:detailForm instanceof HTMLFormElement?detailForm:typeof detailForm=="string"?document.getElementById(detailForm):null)?.querySelector("[data-mia-qualifying-variant]");marker&&event.detail?.variant?.id&&(marker.value=String(event.detail.variant.id))}function delay(ms){return new Promise(resolve=>{window.setTimeout(resolve,ms)})}async function requestGiftCatalog(){let lastError;for(let attempt=0;attempt<=CATALOG_RETRY_DELAYS.length;attempt+=1){attempt>
10&&await delay(CATALOG_RETRY_DELAYS[attempt-1]);try{const response=await fetch(`${config.giftCollectionUrl}?view=ajaxdata`);if(!response.ok)throw new Error(`Unable to load gifts (${response.status})`);const catalog=new DOMParser().parseFromString(await response.text(),"text/html").querySelector("[data-mia-gift-catalog]");if(!catalog)throw new Error("Gift catalog markup missing from ?view=ajaxdata");return debug("gift catalog loaded",{attempt}),catalog.innerHTML}catch(error){lastError=error}}throw lastError}function loadGiftCatalog(){return catalogPromise||(catalogPromise=requestGiftCatalog().catch(error=>{throw catalogPromise=void 0,error})),catalogPromise}function relevantPicker(source){const picker=source?.matches?.("[data-mia-gift-picker]")?source:source?.closest?.("[data-mia-gift-picker]");if(picker?.isConnected)return picker;const pickers=[...document.querySelectorAll("[data-mia-gift-picker]")];return pickers.find(candidate=>!candidate.hidden)??pickers[0]??null}function showPickerError(source,error){const picker=relevantPicker(source),status=picker?.querySelector("[data-mia-gift-status]");!picker||!status||(picker.hidden=!1,status.hidden=!1,status.classList.remove("text-subdued"),status.classList.add("banner","banner--error"),status.setAttribute("role","alert"),status.textContent=error?.message||errorMessage())}function clearPickerStatus(status){status&&(status.hidden=!0,status.classList.add("text-subdued"),status.classList.remove("banner","banner--error"),status.removeAttribute("role"),status.textContent=strings.loading??"")}function setPickerLoading(status){status&&(status.hidden=!1)}function hideGiftDialog(dialog){if(!(!dialog?.open||typeof dialog.hide!="function")){giftDialogProgrammaticHide=!0;try{dialog.hide()}finally{giftDialogProgrammaticHide=!1}}}function synchronizeGiftDialog(visible){const dialog=document.querySelector("[data-mia-gift-dialog]"),cartDrawer=document.querySelector("cart-drawer");if(cartDrawer&&!observedCartDrawers.has(cartDrawer)&&(cartDrawer.addEventListener("dialog:before-show",()=>{hideGiftDialog(document.querySelector("[data-mia-gift-dialog]"))}),cartDrawer.addEventListener("dialog:after-hide",()=>{giftDialogEligibilityActive&&(setGiftDialogDismissal(!0),hideGiftDialog(document.querySelector("[data-mia-gift-dialog]")))}),observedCartDrawers.add(cartDrawer)),!visible){giftDialogEligibilityActive=!1,setGiftDialogDismissal(!1),hideGiftDialog(dialog);return}if(giftDialogEligibilityActive=!0,!dialog)return;if(observedGiftDialogs.has(dialog)||(dialog.addEventListener("dialog:before-hide",()=>{giftDialogEligibilityActive&&!giftDialogProgrammaticHide&&setGiftDialogDismissal(!0)}),observedGiftDialogs.add(dialog)),cartDrawer?.open){hideGiftDialog(dialog);return}const picker=dialog.querySelector("[data-mia-gift-picker]");!giftDialogDismissed&&!dialog.open&&picker&&!picker.hidden&&typeof dialog.show=="function"&&window.themeVariables?.settings?.pageType==="product"&&dialog.show()}function isGiftPickerVisible(cart){return shouldShowGiftPicker({enabled:config.enabled,isB2B:config.isB2BCustomer,hasQualifyingCollection:config.hasQualifyingCollection,giftCollectionUrl:config.giftCollectionUrl,items:cart?.items})}function refreshAppDrawer(){try{typeof window.HS_SLIDE_CART_UPDATE=="function"&&(window.HS_SLIDE_CART_UPDATE(),debug("asked app drawer to refresh"))}catch(error){debug("app drawer refresh failed",error)}}function syncAppDrawerPicker(visible){const wrapper=document.querySelector(APP_DRAWER_SELECTOR);if(!wrapper)return;const existing=wrapper.querySelector("[data-mia-gift-picker]");if(!visible){existing?.remove();return}if(existing)return;const picker=document.getElementById(PICKER_TEMPLATE_ID)?.content?.cloneNode(!0)?.querySelector("[data-mia-gift-picker]");if(!picker)return;picker.dataset.miaAppDrawer="true";const lines=wrapper.querySelectorAll(APP_DRAWER_LINE_SELECTOR),anchor=lines[lines.length-1];anchor?anchor.insertAdjacentElement("afterend",picker):(wrapper.querySelector(APP_DRAWER_BODY_SELECTOR)??wrapper).append(picker),debug("injected picker into app drawer")}function handleAppDrawerRebuild(){const wrapper=document.querySelector(APP_DRAWER_SELECTOR);if(!wrapper||!lastCart||!isGiftPickerVisible(lastCart))return;const picker=wrapper.querySelector("[data-mia-gift-picker]"),loaded=picker?.querySelector("[data-mia-gift-products]")?.dataset.loaded==="true";picker&&loaded||renderPickers(lastCart).catch(reportError)}let appDrawerSyncTimer;const appDrawerObserver=new MutationObserver(()=>
1{clearTimeout(appDrawerSyncTimer),appDrawerSyncTimer=setTimeout(handleAppDrawerRebuild,200)});function observeAppDrawer(){const wrapper=document.querySelector(APP_DRAWER_SELECTOR);!wrapper||observedAppDrawers.has(wrapper)||(appDrawerObserver.observe(wrapper,{childList:!0,subtree:!0}),observedAppDrawers.add(wrapper),debug("watching app drawer for rebuilds"))}function waitForAppDrawer(){if(!config.enabled||document.querySelector(APP_DRAWER_SELECTOR))return;const observer=new MutationObserver(()=>{document.querySelector(APP_DRAWER_SELECTOR)&&(observer.disconnect(),clearTimeout(timeout),observeAppDrawer(),handleAppDrawerRebuild())}),timeout=setTimeout(()=>observer.disconnect(),3e4);observer.observe(document.documentElement,{childList:!0,subtree:!0})}function watchAppDrawerOpen(){if(!config.enabled)return;new MutationObserver(()=>{document.documentElement.classList.contains("hs-open-drawer")&&(observeAppDrawer(),handleAppDrawerRebuild())}).observe(document.documentElement,{attributes:!0,attributeFilter:["class"]})}let externalReconcileTimer;function scheduleExternalReconcile(source){clearTimeout(externalReconcileTimer),externalReconcileTimer=setTimeout(()=>{debug("external cart mutation detected",source),requestReconcile()},350)}function watchExternalCartMutations(){const nativeFetch=window.fetch;typeof nativeFetch=="function"&&(window.fetch=function(input,init){const url=typeof input=="string"?input:input instanceof Request?input.url:String(input??"");let internal=!1;try{const source=init?.headers??(input instanceof Request?input.headers:void 0);internal=source?new Headers(source).has(INTERNAL_REQUEST_HEADER):!1}catch{internal=!1}const result=nativeFetch.apply(this,arguments);return!internal&&CART_MUTATION_PATTERN.test(url)&&result.then(response=>{response?.ok&&scheduleExternalReconcile("fetch")}).catch(()=>{}),result});const nativeOpen=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(method,url,...rest){return this.miaPromoUrl=typeof url=="string"?url:"",nativeOpen.call(this,method,url,...rest)};const nativeSend=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(...args){return CART_MUTATION_PATTERN.test(this.miaPromoUrl??"")&&this.addEventListener("load",()=>{this.status>=200&&this.status<300&&scheduleExternalReconcile("xhr")}),nativeSend.apply(this,args)}}async function renderPickers(cart){renderGeneration+=1;const generation=renderGeneration,isStale=()=>generation!==renderGeneration,visible=isGiftPickerVisible(cart);debug("render pickers",{generation,visible,mounted:document.querySelectorAll("[data-mia-gift-picker]").length,appDrawer:!!document.querySelector(APP_DRAWER_SELECTOR)}),synchronizeGiftDialog(visible),syncAppDrawerPicker(visible),observeAppDrawer();for(const picker of document.querySelectorAll("[data-mia-gift-picker]")){if(isStale())return;if(picker.hidden=!visible,!visible)continue;const products=picker.querySelector("[data-mia-gift-products]"),status=picker.querySelector("[data-mia-gift-status]");if(clearPickerStatus(status),!(!products||products.dataset.loaded==="true")){setP
1ickerLoading(status);try{const catalogHtml=await loadGiftCatalog();if(isStale())return;if(!picker.isConnected||!products.isConnected||!picker.contains(products))continue;if(catalogHtml.trim()===""){picker.hidden=!0,debug("gift collection has no available variants");continue}products.innerHTML=catalogHtml,products.dataset.loaded="true",status&&(status.hidden=!0)}catch(error){if(isStale())return;reportError(error),picker.hidden=!0}}}synchronizeGiftDialog(visible)}async function reconcile(){let current=await fetchCart(),changed=!1,removedOrphan=!1;try{const afterB2B=await syncB2B(current);afterB2B!==current&&(current=afterB2B,changed=!0)}catch(error){reportError(error)}try{const afterCleanup=await removeOrphanGifts(current);afterCleanup!==current&&(current=afterCleanup,changed=!0,removedOrphan=!0)}catch(error){reportError(error)}return lastCart=current,changed&&dispatchCartChange(current,"mia:reconcile"),removedOrphan&&window.themeVariables?.settings?.pageType==="cart"&&!cartReloadRequested?(cartReloadRequested=!0,window.location.reload(),current):(removedOrphan&&refreshAppDrawer(),await renderPickers(current),current)}function requestReconcile(){if(reconcileActive){reconcilePending=!0;return}reconcileActive=!0,enqueueMutation(reconcile).catch(reportError).finally(()=>{reconcileActive=!1,reconcilePending&&(reconcilePending=!1,requestReconcile())})}function addGift(button){giftAddInFlight||(giftAddInFlight=!0,button.setAttribute("aria-busy","true"),enqueueMutation(async()=>{const current=await fetchCart();if(hasGiftLine(current?.items)){lastCart=current,await renderPickers(current);return}const qualifyingVariantId=getQualifyingVariantId(current?.items),giftVariantId=button.dataset.miaGiftVariant;if(!/^\d+$/.test(giftVariantId??"")||!/^\d+$/.test(qualifyingVariantId??""))throw new Error(errorMessage());const payload=withBundledSections(giftAddPayload(giftVariantId,qualifyingVariantId)),response=await fetch(`${Shopify.routes.root}cart/add.js`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","X-Requested-With":"XMLHttpRequest",[INTERNAL_REQUEST_HEADER]:"1"},body:JSON.stringify(payload)});if(!response.ok)throw new Error(errorMessage());const added=await response.json(),cart=await fetchCart();if(added?.sections&&(cart.sections=added.sections),lastCart=cart,announce(strings.added),window.themeVariables?.settings?.pageType==="cart"){cartReloadRequested=!0,window.location.reload();return}dispatchCartChange(cart,"mia:gift-add"),refreshAppDrawer(),await renderPickers(cart)}).catch(error=>{reportError(error),showPickerError(button,error),button.dispatchEvent(new CustomEvent("cart:error",{bubbles:!0,detail:{error:error.message}}))}).finally(()=>{giftAddInFlight=!1,button.isConnected&&button.removeAttribute("aria-busy")}))}document.addEventListener("variant:change",synchronizeQualifyingVariant),document.addEventListener("cart:change",event=>{const baseEvent=event.detail?.baseEvent;if(typeof baseEvent=="string"&&baseEvent.startsWith("mia:")){lastCart=event.detail.cart;return}requestReconcile()}),document.addEventListener("cart:refresh",event=>{const baseEvent=event.detail?.baseEvent;typeof baseEvent=="string"&&baseEvent.startsWith("mia:")||requestReconcile()}),document.addEventListener("cart-drawer:refreshed",()=>{lastCart&&renderPickers(lastCart).catch(reportError)}),document.addEventListener("click",event=>{const button=event.target instanceof Element?event.target.closest("[data-mia-gift-variant]"):null;button&&addGift(button)}),window.addEventListener("pageshow",event=>{event.persisted&&requestReconcile()}),watchExternalCartMutations(),waitForAppDrawer(),watchAppDrawerOpen(),requestReconcile(); 2//# sourceMappingURL=/cdn/shop/t/132/assets/mia-promo.js.map?v=46862292517173410401787351864
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.