PageSourceSearch

https://www.bluettipower.ca/cdn/shop/t/47/assets/bluetti.bluetti-cart-summary.C_GfsRfv.min.js

js bluettipower.ca collected 2026-09-26 02:22:30 UTC 17,212 bytes, 1 lines download raw bytes

1import"./bluetti.utils.BeiRElZ6.min.js";import{f as t,c as e}from"./bluetti.theme.DMb47qTq.min.js";import{C as n}from"./bluetti.Component.DCUZfk5_.min.js";import"./bluetti.preload-helper.DTdAas1V.min.js";import"./bluetti.modulepreload-polyfill.YP0FEG5d.min.js";import"./bluetti.Customer.Ckm4_sV5.min.js";import"./bluetti.constants.Cyvr9pHy.min.js";import"./bluetti.modal.BkmKJNm2.min.js";import"./bluetti.vendor.OdbWYEnF.min.js";import"./bluetti.mallApi.DsZj8Mwg.min.js";import"./bluetti.member-price-sdk.DEQAWf2_.min.js";window.customElements.define("bluetti-cart-summary",class extends n{onMount(){this.discountCodeDraft="",this.removeDiscountConfirmResolver=null,this.setState({isDiscountInputOpen:!1,discountError:""})}render(){const{cart:e}=this.props,{loadding:n,isDiscountInputOpen:o,discountError:i}=this.state||{},s=this.discountCodeDraft||"",r=this.normalizeDiscountCode(s);if(!e)return;if(this.classList.toggle("pointer-events-none",n),e&&0===e.item_count)return void(this.innerHTML="");const l=e.original_total_price!==e.total_price?e.original_total_price-e.total_price:0,a=(null==e?void 0:e.cart_level_discount_applications)||[],c=Array.isArray(null==e?void 0:e.discount_codes)?e.discount_codes:[],u=this.getAppliedManualDiscountCodes(c),d=this.getActiveDiscountTags({discountCodes:c,discountApplications:a}),p=window.bluettiCartDrawerI18n||{},m=window.bluettiCartDiscountConfig||{},h=d.length>0,v=u.length>0,g=l>0?l:this.getDiscountAmountFromApplications(a),b=i?`\n        <p class="text-xs text-rose-500 lg:text-sm" data-discount-error>\n          ${this.escapeHtml(i)}\n        </p>\n      `:"",f=h?`\n        <div class="flex flex-wrap items-center gap-1.5">\n          ${d.map(t=>`\n                <div class="inline-flex h-[30px] lg:h-8 items-center gap-0.5 rounded bg-neutral-200 px-1.5 py-1 text-sm lg:text-base text-neutral-400">\n                  <span>${this.escapeHtml(t.label)}</span>\n                  ${v&&t.removable?`\n                        <button\n                          type="button"\n                          class="flex h-[18px] w-[18px] items-center justify-center rounded-full bg-white"\n                          aria-label="${this.escapeHtml(p.remove||"Remove")}"\n                          data-remove-discount-code="${this.escapeHtml(t.label)}"\n                          on:click="/confirmRemoveDiscountCode"\n                        >\n                          <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">\n                            <path d="M5 5L13 13M13 5L5 13" stroke="#A5A5A8" stroke-width="1.5" stroke-linecap="round"/>\n                          </svg>\n                        </button>\n                      `:""}\n                </div>\n              `).join("")}\n        </div>\n      `:"";this.innerHTML=`\n      <div class="space-y-3 lg:space-y-3">\n        <div class="space-y-2">\n          <div class="flex items-center justify-between gap-2">\n            <p class="text-base text-neutral-900">\n              ${this.escapeHtml(m.discount_code_title||"Have a Discount Code?")}\n            </p>\n            <button\n              type="button"\n              class="inline-flex shrink-0 items-center gap-1 text-sm lg:text-base text-primary-400 hover:text-primary-500"\n              on:click="/toggleDiscountInput"\n            >\n              <span>${this.escapeHtml(m.discount_code_apply||"Apply Code")}</span>\n              <svg\n                width="20"\n                height="20"\n                viewB
1ox="0 0 20 20"\n                fill="none"\n                data-discount-toggle-icon\n                class="${o?"rotate-180":""} transition-transform duration-200"\n              >\n                <path\n                  d="M10 13.75L4.375 8.125L5.43333 7.06667L10 11.6333L14.5667 7.06667L15.625 8.125L10 13.75Z"\n                  fill="currentColor"\n                />\n              </svg>\n            </button>\n          </div>\n\n          <div\n            class="space-y-2 ${o?"":"hidden"}"\n            data-discount-input-section\n          >\n            <div class="flex items-center gap-2 rounded-full border pl-4 pr-2 py-2 ${i?"border-rose-500":"border-neutral-300"}" data-discount-input-wrapper>\n              <input\n                type="text"\n                class="h-6 flex-1 border-none p-0 text-sm text-black outline-none ring-0 placeholder:text-neutral-500 focus:outline-none focus:ring-0 bg-transparent"\n                placeholder="${this.escapeHtml(m.discount_code_placeholder||"Enter code")}"\n                autocomplete="off"\n                value="${this.escapeHtml(s||"")}"\n                data-discount-code-input\n                on:input="/handleDiscountCodeInput"\n              >\n              <button\n                type="button"\n                class=" btn btn-xs lg:btn-s btn-primary rounded-full"\n                data-discount-submit-button\n                on:click="/applyDiscountCode"\n                ${n||!r?"disabled":""}\n              >\n                ${this.escapeHtml(m.discount_code_submit||"Apply")}\n              </button>\n            </div>\n            ${b}\n          </div>\n\n          ${f}\n        </div>\n\n        ${g>0?`\n              <div class="flex items-center justify-between gap-2">\n                <p class="text-base text-neutral-600">\n                  ${this.escapeHtml(m.discount_applied||"Discount Applied")}\n                </p>\n                <p class="text-base text-[#F97316] notranslate" translate="no">\n                  -${t(g)}\n                </p>\n              </div>\n            `:""}\n\n        <div class="flex items-center justify-between gap-2">\n          <p class="font-medium text-neutral-600 lg:text-xl">\n            ${this.escapeHtml(p.total||"Total")}\n          </p>\n          <div class="flex items-center gap-1">\n            <span class="text-xl font-bold text-neutral-900 md:text-1.5xl notranslate" translate="no">\n              ${t(e.total_price,window.theme.moneyWithCurrencyFormat)}\n            </span>\n          </div>\n        </div>\n\n        <div class="${n?"blur-sm":""}" data-checkout-wrapper>\n          <button\n            type="submit"\n            form="bluettiCartDrawerForm"\n            class="flex w-full items-center justify-center rounded-full bg-primary-400 p-4 py-2.5 text-center text-base font-medium text-white transition-all duration-200 ease-in-out hover:bg-primary-500 hover:text-white hover:no-underline active:bg-primary-600"\n            name="checkout"\n            data-checkout-button\n            ${n?"disabled":""}\n            ${e&&0===e.item_count?"disabled":""}\n            on:click="#bluettiCart/onCheckout"\n          >\n            ${window.bluettiCartDrawerI18n.checkout||"Checkout"}\n          </button>\n        </div>\n      </div>\n    `}setLoadingState(t=!0){var e,n;this.state={...this.state||{},loadding:t},this.classList.toggle("pointer-events-none",t);const o=this.querySelector("[data-checkout-wrapper]");o&&o.classList.toggle("blur-sm",t);const i=this.querySelector("[data-checkout-button]");if(i instanceof HTMLButtonElement){const o=0===((null==(n=null==(e=this.props)?void 0:e.cart)?void 0:n.item_count)||0);i.disabled=t||o}}toggleDiscountInput(t){var e;null==t||t.preventDefault();const n=!(!0===(null==(e=this.state)?void 0:e.isDiscountInputOpen));this.discountCodeDraft="",this.state={...this.state||{},isDiscountInputOpen:n,discountError:""};const o=this.querySelector("[data-discount-input-section]"),i=this.querySelector("[data-discount-toggle-icon]"),s=this.querySelector("[data-discount-code-input]"),r=this.querySelector("[data-discount-submit-button]"),l=this.querySelector("[data-discount-input-wrapper]"),a=this.querySelector("[data-discount-error]");null==o||o.classList.toggle("hidden",!n),null==i||i.classList.toggle("rotate-180",n),s&&(s.value=""),r&&(r.disabled=!0,r.classList.add("bg-neutral-300"),r.classList.remove("bg-primary-400"),r.classList.remove("hover:bg-primary-500")),l&&(l.classList.remove("border-rose-500"),l.classList.add("border-neutral-300")),a&&a.classList.add("hidden")}handleDiscountCodeInput(t){var e,n;const o=(null==(e=null==t?void 0:t.target)?void 0:e.value)||"";this.discountCodeDraft=o;const i=this.normalizeDiscountCode(o),s=this.querySelector("[data-discount-submit-button]"),r=this.querySelector("[data-discount-input-wrapper]"),l=this.querySelector("[data-discount-error]");if(!s)return;const a=""!==i;s.disabled=!a,s.classList.toggle("bg-neutral-300",!a),s.classList.toggle("bg-primary-400",a),s.classList.toggle("hover:bg-primary-500",a),(null==(n=this.state)?void 0:n.discountError)&&(r&&(r.classList.remove("border-rose-500"),r.classList.add("border-neutral-300")),l&&l.classList.add("hidden"),this.state={...this.state||{},discountError:""})}async applyDiscountCode(t){var n,o,i,s,r,l;null==t||t.preventDefault();const a=this.querySelector("[data-discount-code-input]");this.discountCodeDraft=(null==a?void 0:a.value)||"";const c=this.normalizeDiscountCode(null==a?void 0:a.value),u=window.bluettiCartDiscountConfig||{},d=document.querySelector("#bluettiCart"),p=null==(n=this.props)?void 0:n.cart,m=this.getAppliedManualDiscountCodes((null==p?void 0:p.discount_codes)||[]),h=this.getNextManualDiscountCodes({existingCodes:m,newCode:c});if(!c)return this.discountCodeDraft="",void this.setState({discountError:u.discount_code_invalid||"Sorry, that code didn't work. Please try another one."});if(d&&"function"==typeof d.updateCartData)try{null==(o=d.setCartStatus)||o.call(
1d,"loading"),(null==(i=this.state)?void 0:i.discountError)&&this.setState({discountError:""});const t=await e.updateDiscount(h.join(","));if(!this.hasDiscountCodesApplied(t,h))return await d.updateCartData(t),this.discountCodeDraft="",void this.setState({discountError:this.getDiscountErrorMessage(t),isDiscountInputOpen:!0});await d.updateCartData(t),this.discountCodeDraft="",((null==(s=this.state)?void 0:s.discountError)||!0!==(null==(r=this.state)?void 0:r.isDiscountInputOpen))&&this.setState({discountError:"",isDiscountInputOpen:!0})}catch(v){this.discountCodeDraft="",this.setState({discountError:(null==v?void 0:v.description)||(null==v?void 0:v.message)||u.discount_code_invalid||"Sorry, that code didn't work. Please try another one."})}finally{null==(l=d.setCartStatus)||l.call(d,"loaded")}}async confirmRemoveDiscountCode(t){var e,n;null==t||t.preventDefault();const o=null==(e=null==t?void 0:t.target)?void 0:e.closest("[data-remove-discount-code]"),i=this.normalizeDiscountCode(null==o?void 0:o.getAttribute("data-remove-discount-code")),s=null==(n=this.props)?void 0:n.cart,r=Array.isArray(null==s?void 0:s.discount_codes)?s.discount_codes:[],l=this.getAppliedManualDiscountCodes(r),a=l.includes(i)?i:l[0]||"";if(!a)return;const c=window.bluettiCartDiscountConfig||{},u=c.remove||"Remove",d=c.cancel||"Cancel",p=c.confirm||"Confirm",m=(c.discount_remove_confirm||"Are you sure you want to remove this discount code (%discount_code%)?").replace("%discount_code%",a);await this.showRemoveDiscountConfirmDialog({title:u,content:m,cancelText:d,confirmText:p})&&await this.removeDiscountCode(a)}async removeDiscountCode(t=""){var n,o,i,s,r;const l=document.querySelector("#bluettiCart");if(l&&"function"==typeof l.updateCartData){try{null==(n=l.setCartStatus)||n.call(l,"loading");const s=this.getAppliedManualDiscountCodes((null==(i=null==(o=this.props)?void 0:o.cart)?void 0:i.discount_codes)||[]),r=this.normalizeDiscountCode(t),a=r?s.filter(t=>t!==r):[],c=await e.updateDiscount(a.join(","));await l.updateCartData(c)}finally{null==(s=l.setCartStatus)||s.call(l,"loaded")}this.discountCodeDraft="",this.setState({discountError:"",isDiscountInputOpen:!0===(null==(r=this.state)?void 0:r.isDiscountInputOpen)})}}showRemoveDiscountConfirmDialog({title:t,content:e,cancelText:n,confirmText:o}){return new Promise(i=>{this.removeDiscountConfirmResolver=i;const s="bluetti-cart-discount-remove-confirm-modal",r=document.getElementById(s);r&&r.remove();const l=this.escapeHtml(t||"Remove"),a=this.escapeHtml(e||""),c=this.escapeHtml(n||"Cancel"),u=this.escapeHtml(o||"Confirm"),d=document.body.style.overflow,p=document.createElement("div");p.id=s,p.className="fixed inset-0 z-[999] flex items-center justify-center bg-black/60 p-4 lg:p-8 backdrop-blur-[8px]",p.innerHTML=`\n        <div class="w-full max-w-[680px] rounded-3xl bg-white px-4 pt-3 pb-4 shadow-2xl lg:px-6 lg:pt-6 lg:pb-8">\n          <div class="mb-8 flex items-center justify-between">\n            <p class="text-base font-semibold text-neutral-600 lg:text-1.5xl">${l}</p>\n            <button\n              type="button"\n              data-action="cancel"\n              class="flex h-6 w-6 items-center justify-center rounded-full text-neutral-700 transition-colors lg:h-9 lg:w-9"\n              aria-label="close"\n            >\n              <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n                <path d="M6 18L18 6M6 6L18 18" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>\n              </svg>\n            </button>\n          </div>\n\n          <p class="text-lg font-medium text-neutral-900 lg:text-2xl lg:px-4 max-h-[50vh] overflow-y-auto">\n            ${a}\n          </p>\n\n          <div class="mt-6 grid grid-cols-1 gap-2 lg:grid-cols-2 lg:gap-4 px-2 lg:px-4">\n            <button\n              type="button"\n              data-action="cancel"\n              class="btn btn-m lg:btn-l btn-primary-ghost rounded-full"\n            >\n              ${c}\n            </button>\n            <button\n              type="button"\n              data-action="confirm"\n              class="btn btn-m lg:btn-l btn-primary rounded-full"\n            >\n              ${u}\n            </button>\n          </div>\n        </div>\n      `;const m=t=>{p.parentNode&&p.parentNode.removeChild(p),document.body.style.overflow=d,document.removeEventListener("keydown",h);const e=this.removeDiscountConfirmResolver;this.removeDiscountConfirmResolver=null,e&&e(t)}
1,h=t=>{"Escape"===t.key&&m(!1)};p.addEventListener("click",t=>{const e=t.target instanceof Element?t.target:null;if(!e)return;const n=e.closest("[data-action]"),o=null==n?void 0:n.dataset.action;"confirm"!==o?"cancel"!==o&&e!==p||m(!1):m(!0)}),document.body.style.overflow="hidden",document.addEventListener("keydown",h),document.body.appendChild(p)})}normalizeDiscountCode(t){return String(t||"").trim().replace(/\s+/g,"").toUpperCase()}hasDiscountCodeApplied(t,e){if(!t||!e)return!1;const n=this.normalizeDiscountCode(e);return!!(Array.isArray(t.discount_codes)?t.discount_codes:[]).some(t=>{if(!("string"==typeof t||!1!==(null==t?void 0:t.applicable)))return!1;const e="string"==typeof t?t:(null==t?void 0:t.code)||(null==t?void 0:t.discount_code)||(null==t?void 0:t.title)||"";return this.normalizeDiscountCode(e)===n})}hasDiscountCodesApplied(t,e=[]){return!(!t||!Array.isArray(e)||0===e.length)&&e.every(e=>this.hasDiscountCodeApplied(t,e))}getAppliedManualDiscountCode(t){return this.getAppliedManualDiscountCodes(t)[0]||""}getAppliedManualDiscountCodes(t){if(Array.isArray(t)&&t.length>0){const e=t.filter(t=>!1!==(null==t?void 0:t.applicable)).map(t=>{const e="string"==typeof t?t:(null==t?void 0:t.code)||(null==t?void 0:t.discount_code)||(null==t?void 0:t.title)||"";return this.normalizeDiscountCode(e)}).filter(Boolean);return[...new Set(e)]}return[]}getAutoDiscountLabel(t){var e;if(!Array.isArray(t)||0===t.length)return"";const n=t[0];return`${(null==n?void 0:n.title)||(null==(e=null==n?void 0:n.discount_application)?void 0:e.title)||""}`.trim()}getActiveDiscountTags({discountCodes:t=[],discountApplications:e=[]}){const n=this.getAppliedManualDiscountCodes(t),o=Array.isArray(e)?e.map(t=>{var e;return String((null==t?void 0:t.title)||(null==(e=null==t?void 0:t.discount_application)?void 0:e.title)||"").trim()}).filter(Boolean):[],i=new Set,s=[];for(const r of n)i.has(r)||(i.add(r),s.push({label:r,removable:!0}));for(const r of o)i.has(r)||(i.add(r),s.push({label:r,removable:!1}));return s}getNextManualDiscountCodes({existingCodes:t=[],newCode:e=""}){const n=Array.isArray(t)?t.map(t=>this.normalizeDiscountCode(t)).filter(Boolean):[],o=this.normalizeDiscountCode(e);if(!o)return[...new Set(n)];const i=n.filter(t=>t!==o);return[o,...new Set(i)]}getDiscountAmountFromApplications(t){return Array.isArray(t)&&0!==t.length?t.reduce((t,e)=>{const n=Number((null==e?void 0:e.total_allocated_amount)||(null==e?void 0:e.amount)||0);return t+(Number.isNaN(n)?0:n)},0):0}getDiscountErrorMessage(t={}){const e=(window.bluettiCartDiscountConfig||{}).discount_code_invalid||"Sorry, that code didn't work. Please try another one.",n=(null==t?void 0:t.description)||(null==t?void 0:t.message)||(null==t?void 0:t.error)||"";if(n)return String(n).trim();const o=(Array.isArray(null==t?void 0:t.discount_codes)?t.discount_codes:[]).find(t=>!1===(null==t?void 0:t.applicable)),i=(null==o?void 0:o.message)||(null==o?void 0:o.description)||(null==o?void 0:o.error)||"";return i?String(i).trim():e}escapeHtml(t){const e=document.createElement("div");return e.textContent=t,e.innerHTML}});

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.