admin.js
1 week ago
admin.min.js
1 week ago
beacon-clicked.js
1 week ago
beacon-clicked.min.js
1 week ago
contextual-info.js
1 week ago
contextual-info.min.js
1 week ago
dashboard.js
1 week ago
duplicate-methods.js
1 week ago
duplicate-methods.min.js
1 week ago
new-rules-table-popup.js
1 week ago
onboarding.js
1 week ago
rules-settings.js
1 week ago
shipping-method-block-checkout.js
1 week ago
shipping-method-block-checkout.min.js
1 week ago
shipping-method-block-checkout.min.js
30 lines
| 1 | (function(){const config=window.__fsShippingMethodLogoBlocks||{};const ensureArray=(value)=>(Array.isArray(value)?value:[]);const getMetaValue=(metaData,key)=>{if(!Array.isArray(metaData)){return null} |
| 2 | const item=metaData.find((entry)=>entry&&entry.key===key);return item?item.value:null};const decodeBase64=(value)=>{if(!value||'string'!==typeof value){return''} |
| 3 | try{return window.atob(value)}catch(error){return''}};const getRateDescription=(rate)=>{if(!rate){return''} |
| 4 | const encodedDescription=getMetaValue(rate.meta_data,config.description_encoded_key||'description_base64encoded');if(encodedDescription){const decodedDescription=decodeBase64(encodedDescription);if(decodedDescription){return decodedDescription}} |
| 5 | return getMetaValue(rate.meta_data,config.description_key||'description')||''};const getNormalizedText=(value)=>(value||'').replace(/\s+/g,' ').trim();const getNormalizedHtmlText=(value)=>{const wrapper=document.createElement('div');wrapper.innerHTML=value||'';return getNormalizedText(wrapper.textContent||'')};const isVisible=(element)=>{let current=element;while(current&¤t!==document.body){const style=window.getComputedStyle(current);if('none'===style.display||'hidden'===style.visibility){return!1} |
| 6 | current=current.parentElement} |
| 7 | return Boolean(element)};const descriptionMatchesElement=(description,element)=>{if(!description||!isVisible(element)){return!1} |
| 8 | const descriptionText=getNormalizedHtmlText(description);return''!==descriptionText&&getNormalizedText(element.textContent||'').includes(descriptionText)};const getRateId=(rate)=>rate?.rate_id||rate?.id||'';const isFlexibleShippingRate=(rate)=>{if(!rate){return!1} |
| 9 | return ensureArray(config.method_ids).includes(rate.method_id)};const escapeCssValue=(value)=>{if(window.CSS&&'function'===typeof window.CSS.escape){return window.CSS.escape(value)} |
| 10 | return value.replace(/["\\]/g,'\\$&')};const getOptionForRate=(rateId)=>{if(!rateId){return null} |
| 11 | const selector=`.wc-block-components-radio-control__option input[value="${ escapeCssValue( rateId ) }"]`;const input=document.querySelector(selector);return input?input.closest('.wc-block-components-radio-control__option'):null};const findDescriptionElement=(option,input)=>{const selector='[id$="__secondary-description"], [id$="__description"]';if(input){const describedBy=input.getAttribute('aria-describedby');if(describedBy){const descriptionIds=describedBy.split(/\s+/).filter(Boolean);for(const id of descriptionIds){const element=document.getElementById(id);if(element&&element.matches(selector)){return element}}}} |
| 12 | return option?option.querySelector(selector):null};const getInsertionAnchor=(option,input)=>{if(!option){return null} |
| 13 | const labelGroup=option.querySelector('.wc-block-components-radio-control__label-group');if(labelGroup){return labelGroup} |
| 14 | return findDescriptionElement(option,input)||option.querySelector('label')||option};const createLogoNode=(logoUrl,logoAlt)=>{const wrapper=document.createElement('span');wrapper.classList.add(config.wrapper_class||'flexible-shipping-method-logo-block');wrapper.style.display='block';wrapper.style.marginTop='6px';const image=document.createElement('img');image.src=logoUrl;image.alt=logoAlt||'';image.style.maxHeight='40px';image.style.width='auto';image.loading='lazy';wrapper.appendChild(image);return wrapper};const createDescriptionNode=(description)=>{const wrapper=document.createElement('div');wrapper.className=config.description_class||'shipping-method-description flexible-shipping-method-description-block wc-block-components-radio-control__secondary-description';wrapper.innerHTML=description;return wrapper};const getRatesFromCart=(cartData)=>{if(!cartData||!Array.isArray(cartData.shippingRates)){return[]} |
| 15 | const rates=[];cartData.shippingRates.forEach((shippingPackage)=>{const packageRates=shippingPackage?.shipping_rates??[];packageRates.forEach((rate)=>rates.push(rate))});return rates};const renderLogos=()=>{if(!window.wp||!window.wp.data||'function'!==typeof window.wp.data.select){return} |
| 16 | const cartStore=window.wp.data.select('wc/store/cart');if(!cartStore||'function'!==typeof cartStore.getCartData){return} |
| 17 | const rates=getRatesFromCart(cartStore.getCartData());if(!rates.length){return} |
| 18 | rates.forEach((rate)=>{if(!isFlexibleShippingRate(rate)){return} |
| 19 | const description=getRateDescription(rate);const logoUrl=getMetaValue(rate.meta_data,config.logo_url_key||'method_logo_url');const option=getOptionForRate(getRateId(rate));if(!option){return} |
| 20 | const wrapperClass=config.wrapper_class||'flexible-shipping-method-logo-block';const descriptionClass=(config.description_class||'shipping-method-description flexible-shipping-method-description-block wc-block-components-radio-control__secondary-description').split(' ').filter(Boolean).map((className)=>`.${ className }`).join('');const existingDescription=descriptionClass?option.querySelector(descriptionClass):null;const existingLogo=option.querySelector(`.${ wrapperClass }`);const input=option.querySelector('input');const nativeDescription=findDescriptionElement(option,input);const insertionAnchor=getInsertionAnchor(option,input);const logoAlt=getMetaValue(rate.meta_data,config.logo_alt_key||'method_logo_alt')||'';const hasNativeDescription=descriptionMatchesElement(description,nativeDescription);if(description){if(hasNativeDescription){if(existingDescription){existingDescription.remove()}}else if(existingDescription){if(existingDescription.innerHTML!==description){existingDescription.innerHTML=description}}else if(insertionAnchor){insertionAnchor.insertAdjacentElement('afterend',createDescriptionNode(description))}}else if(existingDescription){existingDescription.remove()} |
| 21 | const descriptionAnchor=option.querySelector(descriptionClass)||nativeDescription||insertionAnchor;if(!logoUrl){if(existingLogo){existingLogo.remove()} |
| 22 | return} |
| 23 | if(existingLogo){const existingImage=existingLogo.querySelector('img');if(existingImage){if(existingImage.src!==logoUrl){existingImage.src=logoUrl} |
| 24 | if(existingImage.alt!==logoAlt){existingImage.alt=logoAlt}} |
| 25 | if(descriptionAnchor&&existingLogo.previousElementSibling!==descriptionAnchor){descriptionAnchor.insertAdjacentElement('afterend',existingLogo)} |
| 26 | return} |
| 27 | const logoNode=createLogoNode(logoUrl,logoAlt);if(descriptionAnchor){descriptionAnchor.insertAdjacentElement('afterend',logoNode);return} |
| 28 | const label=option.querySelector('label')||option;label.appendChild(logoNode)})};const boot=()=>{let scheduled=!1;const scheduleRender=()=>{if(scheduled){return} |
| 29 | scheduled=!0;window.requestAnimationFrame(()=>{scheduled=!1;renderLogos()})};if(window.wp&&window.wp.data&&'function'===typeof window.wp.data.subscribe){window.wp.data.subscribe(scheduleRender)} |
| 30 | new MutationObserver(scheduleRender).observe(document.body,{childList:!0,subtree:!0,});scheduleRender()};if('loading'===document.readyState){document.addEventListener('DOMContentLoaded',boot)}else{boot()}}()) |