1(()=>{if(window.__dualAtcLoaded)return;window.__dualAtcLoaded=!0;const DEBUG=!0,PRODUCT_ROOT_SELECTOR=".product-info__block-list",FORM_SELECTOR='form.shopify-product-form[action*="/cart/add"]',NATIVE_ATC_SELECTOR='buy-buttons button[type="submit"]',BUNDLE_ATC_SELECTOR="[data-kaching-bundle-atc]",KACHING_SESSION_SELECTOR='[name="properties[__kaching_session_id]"]',initializedRoots=new WeakSet,initialUrlVariantId=new URL(window.location.href).searchParams.get("variant"),nativeAtcClickHandlers=new Set;window.addEventListener("click",event=>{nativeAtcClickHandlers.forEach(handler=>handler(event))},!0);function log(label,data=null){DEBUG&&(data!==null?console.log(`[Dual ATC] ${label}`,data):console.log(`[Dual ATC] ${label}`))}function initDualAtc(productRoot){if(initializedRoots.has(productRoot))return;function getForm(){return productRoot.querySelector(FORM_SELECTOR)}function getNativeAtc(){return getForm()?.querySelector(NATIVE_ATC_SELECTOR)||null}function getBundleAtc(){return getForm()?.querySelector(BUNDLE_ATC_SELECTOR)||null}function getVariantPicker(){const form2=getForm();return form2?productRoot.querySelector(`variant-picker[form-id="${CSS.escape(form2.id)}"]`)||productRoot.querySelector("variant-picker"):null}function getKachingElements(){const form2=getForm();if(!form2)return{};const root=form2.querySelector("kaching-bundle");if(!root)return{};const block=root.querySelector("kaching-bundles-block"),bar=root.querySelector(".kaching-bundles__bar[data-deal-bar-id]");return{root,block,bar,dealId:bar?.dataset.dealBarId||null,radio:bar?.querySelector('input[type="radio"]')||null,barMain:bar?.querySelector(".kaching-bundles__bar-main")||null}}const form=getForm(),bundleAtc=getBundleAtc(),initial=getKachingElements();if(!form||!getNativeAtc()||!bundleAtc||!getVariantPicker()||!initial.root||!initial.block||!initial.bar||!initial.dealId||!initial.radio||!initial.barMain)return;initializedRoots.add(productRoot);const dealId=initial.dealId;let currentDealId=initial.radio.checked||initial.bar.classList.contains("kaching-bundles__bar--selected")?dealId:null,regularVariantId=null,regularOptions=[],latestVariantState=null,regularSelectionPending=!1,pendingRegularOptions=null,bypassRegularGuard=!1,regularModePromise=null,bundleSubmitInFlight=!1;initial.block.addEventListener("deal-bar-selected",event=>{currentDealId=event.detail?.dealBarId??null,log("deal-bar-selected",{dealBarId:currentDealId,preselected:event.detail?.preselected})}),initial.block.addEventListener("variants-changed",event=>{latestVariantState=event.detail,log("variants-changed",{variantIdQuantities:event.detail?.variantIdQuantities,bundleProducts:event.detail?.bundleProducts,validation:event.detail?.validation})});function getNativeOptionInputs(){const form2=getForm();return form2?.id?Array.from(document.querySelectorAll(`input[data-option-position][form="${CSS.escape(form2.id)}"]`)):[]}function getCheckedNativeOptions(){return getNativeOptionInputs().filter(input=>input.checked).map(input=>({position:input.dataset.optionPosition,value:input.value}))}function getPendingOptionsForInput(input){const selections=new Map;return getCheckedNativeOptions().forEach(option=>{selections.set(option.position,option.value)}),selections.set(input.dataset.optionPosition,input.value),Array.from(selections,([position,value])=>({position,value}))}document.addEventListener("change",event=>{if(!event.isTrusted||!(event.target instanceof HTMLInputElement))return;const input=event.target;input.matches("input[data-option-position]")&&input.form===getForm()&&(regularSelectionPending=!0,pendingRegularOptions=getCheckedNativeOptions(),log("Real Prestige option change",{position:input.dataset.optionPosition,value:input.value,pendingRegularOptions}))},!0),productRoot.addEventListener("variant:change",event=>{const variantId=event.detail?.variant?.id??null;if(!regularSelectionPending){log("Ignoring Kaching-driven Prestige variant change",{variantId});return}regularSelectionPending=!1,regularVariantId=variantId?String(variantId):null,regularOptions=pendingRegularOptions||getCheckedNativeOptions(),pendingRegularOptions=null,log("Saved REGULAR Prestige variant",{regularVariantId,regularOptions})});function getPreselectedVariantId(){if(!initialUrlVariantId)return null;const picker=getVariantPicker();if(!picker||picker.hasAttribute("data-unselected"))return null;const product=window.ShopifyAnalytics?.meta?.product,productId=getForm()?.querySelector('input[name="product-id"]')?.value;
1return!product||String(product.id)!==String(productId)?null:(product.variants||[]).some(variant=>String(variant.id)===initialUrlVariantId)?initialUrlVariantId:null}function restoreRegularVariant(){const form2=getForm();if(!form2)return;const idInput=form2.querySelector('input[name="id"]');if(!idInput)return;const inputs=getNativeOptionInputs();if(!regularVariantId){inputs.forEach(input=>{input.checked=!1}),log("Restored regular state: unselected.");return}inputs.forEach(input=>{input.checked=regularOptions.some(option=>option.position===input.dataset.optionPosition&&option.value===input.value)}),idInput.value=regularVariantId,log("Restored REGULAR variant",{regularVariantId,formVariantId:idInput.value})}function getKachingSessionInput(){return getForm()?.querySelector(KACHING_SESSION_SELECTOR)||null}function enableKachingSession(){const input=getKachingSessionInput();if(!input){log("No Kaching session input found.");return}input.disabled=!1,log("Kaching session ENABLED",{value:input.value})}function disableKachingSession(){const input=getKachingSessionInput();if(!input){log("No Kaching session input found.");return}input.disabled=!0,log("Kaching session DISABLED",{value:input.value})}function nextFrame(){return new Promise(resolve=>requestAnimationFrame(resolve))}function waitForKachingTransition(expectedDealId,timeout=2500){const{block}=getKachingElements();return block?new Promise((resolve,reject)=>{let dealChanged=!1,variantsChanged=!1;const timer=setTimeout(()=>{cleanup(),reject(new Error(`Timed out waiting for Kaching transition to ${expectedDealId}`))},timeout);function cleanup(){clearTimeout(timer),block.removeEventListener("deal-bar-selected",handleDealChange),block.removeEventListener("variants-changed",handleVariantsChange)}function maybeResolve(){!dealChanged||!variantsChanged||(cleanup(),resolve())}function handleDealChange(event){const selectedDealId=event.detail?.dealBarId??null;selectedDealId===expectedDealId&&(dealChanged=!0,log("Expected deal state reached",selectedDealId),maybeResolve())}function handleVariantsChange(event){latestVariantState=event.detail,variantsChanged=!0,log("Variant state updated during transition",event.detail),maybeResolve()}block.addEventListener("deal-bar-selected",handleDealChange),block.addEventListener("variants-changed",handleVariantsChange)}):Promise.reject(new Error("Kaching bundles block not found."))}async function ensureBundleInactive(){const{barMain}=getKachingElements();if(!barMain)throw new Error("Kaching bundle control not found.");if(currentDealId===null){log("Bundle already OFF.");return}log("Turning bundle OFF.");const transition=waitForKachingTransition(null);barMain.click(),await transition,await nextFrame(),log("Bundle OFF confirmed.")}async function ensureBundleActive(){const{barMain}=getKachingElements();if(!barMain)throw new Error("Kaching bundle control not found.");if(currentDealId===dealId){log("Bundle already ON.");return}log("Turning bundle ON.",{dealId}),enableKachingSession();const transition=waitForKachingTransition(dealId);barMain.click(),await transition,await nextFrame(),log("Bundle ON confirmed.")}function restoreBundleDisplay(){if(currentDealId!==null)return;const{bar,barMain}=getKachingElements();!bar||!barMain||(bar.classList.add("kaching-bundles__bar--selected"),barMain.click(),log("Bundle box re-opened."))}function restoreBundleDisplayAfterCartAdd(){let done=!1,timer=null;function finish(){done||(done=!0,clearTimeout(timer),document.removeEventListener("variant:add",finish,!0),document.removeEventListener("cart:error",finish,!0),setTimeout(restoreBundleDisplay,300))}timer=setTimeout(finish,5e3),document.addEventListener("variant:add",finish,!0),document.addEventListener("cart:error",finish,!0)}function isCurrentNativeAtcEvent(event){if(!(event.target instanceof Element))return!1;const currentNativeAtc=getNativeAtc();return currentNativeAtc?event.target.closest(NATIVE_ATC_SELECTOR)===currentNativeAtc:!1}nativeAtcClickHandlers.add(async event=>{if(!isCurrentNativeAtcEvent(event))return;if(bypassRegularGuard){log("Native ATC bypass.");return}if(!event.isTrusted){log("Ignoring programmatic native ATC click.");return}const picker=getVariantPicker();if(picker?.hasAttribute("data-unselected")){event.preventDefault(),event.stopImmediatePropagation(),picker.classList.add("size-error");const selection=picker.querySelector("variant-selection");typeof selection?.reportMissingSelection=="function"&&selection.reportMissingSelection(),log("Regular ATC blocked: no size selected. Showing size prompt.");return}log("REGULAR ATC clicked",{regularVariantId,currentDealId,switchingToRegular:!!regularModePromise}),event.preventDefault(),event.stopImmediatePropagation();try{if(currentDealId!==null&&(regularModePromise||(regularModePromise=ensureBundleInactive()),await regularModePromise),currentDealId!==null&&(log("Bundle still ON after pending regular transition. Forcing OFF again.",{currentDealId}),regularModePromise=ensureBundleInactive(),await regularModePromise),currentDealId!==null)throw new Error(`Refusing regular ATC because Kaching is still active: ${currentDealId}`);
1disableKachingSession(),restoreRegularVariant(),await nextFrame();const currentForm=getForm(),currentNativeAtc=getNativeAtc();if(!currentForm||!currentNativeAtc)throw new Error("Current Prestige form/ATC not found.");if(delete currentForm.dataset.kachingBundleSubmit,!regularVariantId){const firstOption=getVariantPicker()?.querySelector(".variant-picker__option"),error=getVariantPicker()?.querySelector(".variant-picker__error");firstOption?.classList.add("ProductForm__Option--error"),error&&(error.hidden=!1),firstOption?.scrollIntoView({behavior:"smooth",block:"center"}),log("Regular ATC blocked: no real Prestige variant selected."),restoreBundleDisplay();return}currentForm.dataset.regularVariantId=regularVariantId,log("SUBMITTING REGULAR PRODUCT",{regularVariantId,formVariantId:currentForm.querySelector('input[name="id"]')?.value,kachingSessionDisabled:!!getKachingSessionInput()?.disabled,currentDealId}),bypassRegularGuard=!0;try{currentNativeAtc.click()}finally{bypassRegularGuard=!1}restoreBundleDisplayAfterCartAdd()}catch(error){console.error("[Dual ATC] Could not submit regular product:",error),restoreBundleDisplay()}finally{regularModePromise=null}}),productRoot.addEventListener("click",async event=>{if(!(event.target instanceof Element))return;const clickedBundleAtc=event.target.closest(BUNDLE_ATC_SELECTOR);if(!(!clickedBundleAtc||!getForm()?.contains(clickedBundleAtc))){if(event.preventDefault(),event.stopImmediatePropagation(),bundleSubmitInFlight){log("Bundle submit blocked: already in flight.");return}bundleSubmitInFlight=!0,console.group("[Dual ATC] BUNDLE ATC");try{enableKachingSession(),log("Bundle ATC clicked",{dealId,currentDealId}),await ensureBundleActive(),await nextFrame();const currentForm=getForm(),currentNativeAtc=getNativeAtc();if(!currentForm||!currentNativeAtc)throw new Error("Current Prestige form/ATC not found.");currentForm.dataset.kachingBundleSubmit="true",log("SUBMITTING KACHING BUNDLE",{currentDealId,formVariantId:currentForm.querySelector('input[name="id"]')?.value,session:getKachingSessionInput()?.value,sessionDisabled:!!getKachingSessionInput()?.disabled,variantIdQuantities:latestVariantState?.variantIdQuantities,bundleProducts:latestVariantState?.bundleProducts,validation:latestVariantState?.validation}),bypassRegularGuard=!0;try{currentNativeAtc.click()}finally{bypassRegularGuard=!1,setTimeout(()=>{delete currentForm.dataset.kachingBundleSubmit,bundleSubmitInFlight=!1},0)}}catch(error){bundleSubmitInFlight=!1;const currentForm=getForm();currentForm&&delete currentForm.dataset.kachingBundleSubmit,console.error("[Dual ATC] Could not submit Kaching bundle:",error)}finally{console.groupEnd()}}},!0);async function initializeRegularMode(){try{currentDealId!==null&&(log("Bundle preselected. Turning it OFF."),await ensureBundleInactive()),disableKachingSession(),regularVariantId=getPreselectedVariantId(),regularOptions=[],regularVariantId||getNativeOptionInputs().forEach(input=>{input.checked=!1}),log("INITIALIZED IN REGULAR MODE",{dealId,currentDealId,preselectedFromUrl:regularVariantId,kachingSessionDisabled:!!getKachingSessionInput()?.disabled})}catch(error){console.error("[Dual ATC] Could not initialize:",error)}finally{const button=getBundleAtc();button&&(button.hidden=!1);const{bar}=getKachingElements();bar&&(bar.classList.add("kaching-bundles__bar--selected"),document.querySelector(".kaching-bundles__bar .kaching-bundles__bar-main")?.click())}}initializeRegularMode()}function init(){document.querySelectorAll(PRODUCT_ROOT_SELECTOR).forEach(initDualAtc)}init(),new MutationObserver(init).observe(document.documentElement,{childList:!0,subtree:!0}),document.addEventListener("shopify:section:load",init)})(); 2//# sourceMappingURL=/cdn/shop/t/270/assets/kaching-bundles-atc.js.map?v=109448484237435129751791289083
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.