UNPKG

@salla.sa/twilight-components

Version:
332 lines (325 loc) 18.4 kB
/*! * Crafted with ❤ by Salla */ import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client'; import { S as SpecialDiscountIcon } from './special-discount.js'; import { d as defineCustomElement$f } from './salla-add-product-button2.js'; import { d as defineCustomElement$e } from './salla-button2.js'; import { d as defineCustomElement$d } from './salla-count-down2.js'; import { d as defineCustomElement$c } from './salla-loading2.js'; import { d as defineCustomElement$b } from './salla-modal2.js'; import { d as defineCustomElement$a } from './salla-placeholder2.js'; import { d as defineCustomElement$9 } from './salla-product-availability2.js'; import { d as defineCustomElement$8 } from './salla-product-card2.js'; import { d as defineCustomElement$7 } from './salla-products-slider2.js'; import { d as defineCustomElement$6 } from './salla-progress-bar2.js'; import { d as defineCustomElement$5 } from './salla-quick-buy2.js'; import { d as defineCustomElement$4 } from './salla-skeleton2.js'; import { d as defineCustomElement$3 } from './salla-slider2.js'; import { d as defineCustomElement$2 } from './salla-tel-input2.js'; var Tag = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> <title>tag</title> <path d="M28 0h-9.344c-1.059 0-2.056 0.411-2.809 1.153l-14.673 14.456c-1.56 1.56-1.561 4.097-0.001 5.657l9.56 9.56c0.755 0.755 1.76 1.172 2.828 1.173h0.003c1.068 0 2.072-0.416 2.833-1.179l14.451-14.668c0.743-0.753 1.153-1.751 1.153-2.809v-9.344c0-2.205-1.795-4-4-4zM29.333 13.344c0 0.353-0.137 0.685-0.385 0.937l-14.444 14.661c-0.252 0.252-0.587 0.391-0.941 0.391-0.001 0-0.001 0-0.001 0-0.356-0.001-0.691-0.139-0.943-0.392l-9.561-9.56c-0.52-0.52-0.52-1.365-0.005-1.88l14.667-14.449c0.253-0.248 0.585-0.385 0.937-0.385h9.344c0.736 0 1.333 0.597 1.333 1.333zM24 6.673c-0.737 0-1.333 0.604-1.333 1.341s0.596 1.333 1.333 1.333 1.333-0.596 1.333-1.333v-0.015c0-0.737-0.596-1.327-1.333-1.327z"></path> </svg> `; var Cart2 = `<!-- Generated by IcoMoon.io --> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> <title>cart2</title> <path d="M6.845 5.333l-1.905-5.333h-3.607c-0.736 0-1.333 0.597-1.333 1.333s0.597 1.333 1.333 1.333v0h1.727l5.72 16.012c0.569 1.56 2.039 2.654 3.765 2.655h12.133c0.001 0 0.002 0 0.003 0 1.825 0 3.364-1.222 3.845-2.892l0.007-0.028 3.161-13.080zM25.96 17.716c-0.167 0.554-0.672 0.951-1.27 0.951-0.002 0-0.005 0-0.007-0h-12.133c-0.575-0-1.065-0.364-1.252-0.875l-0.003-0.009-3.497-9.783h20.508zM13.333 24c-2.209 0-4 1.791-4 4s1.791 4 4 4c2.209 0 4-1.791 4-4v0c0-2.209-1.791-4-4-4v0zM13.333 29.333c-0.736 0-1.333-0.597-1.333-1.333s0.597-1.333 1.333-1.333c0.736 0 1.333 0.597 1.333 1.333v0c0 0.736-0.597 1.333-1.333 1.333v0zM24 24c-2.209 0-4 1.791-4 4s1.791 4 4 4c2.209 0 4-1.791 4-4v0c0-2.209-1.791-4-4-4v0zM24 29.333c-0.736 0-1.333-0.597-1.333-1.333s0.597-1.333 1.333-1.333c0.736 0 1.333 0.597 1.333 1.333v0c0 0.736-0.597 1.333-1.333 1.333v0z"></path> </svg> `; const sallaOfferModalCss = ".s-offer-modal-type-products .s-modal-body{min-height:690px;position:relative}"; const SallaOfferModal$1 = /*@__PURE__*/ proxyCustomElement(class SallaOfferModal extends HTMLElement { constructor() { super(); this.__registerHost(); this.offer = null; this.hasError = false; this.translationLoaded = false; this.addToCartLabel = salla.lang.get("pages.cart.add_to_cart"); salla.event.on('offer-modal::open', product_id => this.open(product_id)); salla.lang.onLoaded(() => { this.addToCartLabel = salla.lang.get("pages.cart.add_to_cart"); this.translationLoaded = true; }); this.categorySlot = this.host.querySelector('[slot="category"]')?.innerHTML || `<span class="s-offer-modal-badge-icon">{tagIcon}</span><span class="s-offer-modal-badge-text">{name}</span>`; // this.productSlot = this.host.querySelector('[slot="product"]')?.innerHTML || this.defaultProductSlot(); salla.event.on('offer-modal::open', product_id => this.open(product_id)); salla.product.event.onOfferExisted(offer => { if (salla.storage.get('remember-offer-' + offer.id)) { salla.log('User selected to don\'t show this offer again.'); return; } this.open(offer.product_id); }); } /** * Emits a promotion viewed event for analytics tracking * @param offer - The offer being viewed in the modal */ emitPromotionViewed(offer) { if (!offer) return; salla.event.emit('promotion::viewed', [{ id: offer.id?.toString(), creative: offer.message, name: offer.name, position: `${this.offer_type}_offer_modal` }]); } /** * Emits a promotion clicked event for analytics tracking * @param offer - The offer being clicked in the modal */ emitPromotionClicked(offer) { if (!offer) return; salla.event.emit('promotion::clicked', [{ id: offer.id?.toString(), creative: offer.message, name: offer.name, position: `${this.offer_type}_offer_modal` }]); } /** * Show the available offers for the product * @param product_id */ async open(product_id) { this.productID = product_id; //TODO:: make sure there is only one offer this.hasError = false; this.modal.loading(); // Reset loading state for subsequent opens return await salla.api.withoutNotifier(() => salla.product.offers(product_id)) .then(response => { // Check if there are offers before opening the modal if (!response.data || !response.data.length) { return; // Don't open modal if no offers } this.modal.open(); this.showOffer(response.data[0]); }) .catch(e => { this.hasError = true; this.errorMessage = e.response?.data?.error?.message || e.response?.data; this.modal.open(); // Open modal to show error }) .finally(() => { // Only stop loading if modal was opened (either for offers or errors) if (this.modal.visible) { setTimeout(() => this.modal.stopLoading(), 1000); } }); } /** * Show offer details * @param {Offer} offer */ async showOffer(offer) { this.offer = offer; this.offer_name = offer.name; this.offer_message = offer.message; if (this.offer.get.discounts_table) { this.offer_type = 'discounts-table'; } else if (this.offer.get.products?.length) { this.offer_type = 'products'; } else if (this.offer.get.categories?.length) { this.offer_type = 'categories'; } this.modal.setTitle(this.offer_name); this.emitPromotionViewed(this.offer); } rememberMe(event) { salla.storage.set('remember-offer-' + this.offer.id, event.target.checked); } addToCart(qty) { //todo:: add enhancement, to cover the previous quantity, because if the discount to add two, user already added one before. this.emitPromotionClicked(this.offer); salla.api.withoutNotifier(() => salla.cart.quickAdd(this.productID, qty, this.offer_type)).then(() => this.modal.close()); } getOfferContent() { if (this.offer.get.discounts_table) { return h("div", { class: "s-offer-modal-discount-table" }, h("table", null, h("tbody", null, this.offer.get.discounts_table?.map(discount => h("tr", null, h("td", null, discount.text), h("td", { class: "s-offer-modal-discount-table-cell" }, h("salla-button", { fill: "outline", shape: "btn", color: "primary", size: "medium", width: "normal", onClick: () => this.addToCart(discount.quantity) }, this.addToCartLabel))))))); } else if (this.offer.get.products?.length) { const productsCount = this.offer.get.products?.length || 0; const sliderConfig = { slidesPerView: 'auto', spaceBetween: 16, breakpoints: { 768: { slidesPerView: Math.min(2, productsCount), spaceBetween: 16 }, 1024: { slidesPerView: Math.min(3, productsCount), spaceBetween: 16 } } }; return (h("salla-products-slider", { key: (this.offer.get.products?.map(product => product.id) || []).join(","), source: "selected", "source-value": `[${(this.offer.get.products?.map(product => product.id) || []).join(",")}]`, "slider-config": JSON.stringify(sliderConfig) })); // return <salla-slider // type="carousel" // class={{"s-offer-modal-slider-centered": this.offer.get.products?.length <= 2, "s-offer-modal-slider": true}} // id="offer-modal-slider" // controls-outer // show-controls={this.offer.get.products?.length <= 2 ? 'false' : 'true'}> // <div slot='items'> // { // this.offer.get.products?.map(product => // <div class={{ // "s-offer-modal-product": true, // "s-offer-modal-slider-item": true, // "s-offer-modal-not-available": !product.is_available // }} id={'product_' + product.id} innerHTML={this.productSlot // .replace(/\{name\}/g, product.name) // .replace(/\{url\}/g, product.url) // .replace(/\{image\}/g, product.thumbnail) // .replace(/\{price\}/g, product.has_special_price // ? '<span class="s-offer-modal-product-sale-price">' + salla.money(product.price) + '</span><span class="s-offer-modal-product-old-price">' + salla.money(product.regular_price) + '</span>' // : salla.money(product.price))}> // <div class="s-offer-modal-btn-wrap"> // <salla-button width="wide" fill='outline' data-id={product.id} disabled={!product.is_available} // loader-position="center" onClick={this.addItem}> // {product.is_available ? salla.lang.get('pages.cart.add_to_cart') : salla.lang.get('pages.products.out_of_stock')} // </salla-button> // </div> // </div>) // } // </div> // </salla-slider> } else if (this.offer.get.categories?.length) { return h("salla-slider", { type: "carousel", class: { "s-offer-modal-slider-centered": this.offer.get.categories?.length <= 2, "s-offer-modal-slider": true }, id: "offer-modal-slider", "controls-outer": true, "show-controls": this.offer.get.categories?.length <= 2 ? 'false' : 'true' }, h("div", { slot: 'items' }, this.offer.get.categories.map(category => h("a", { href: category.urls.customer, class: "s-offer-modal-badge s-offer-modal-slider-item s-offer-modal-cat-item", innerHTML: this.categorySlot .replace(/\{tagIcon\}/g, Tag) .replace(/\{name\}/g, category.name) .replace(/\{url\}/g, category.urls.customer) })))); } } //todo:: pass event then use sallaButton from it // private addItem() { // // this here, is sallaButton // this['load'](); // return salla.cart.api // .quickAdd(this['dataset'].id) // .finally(() => this['stop']()); // } // private defaultProductSlot() { // return '<a href={url} class="s-offer-modal-product-image-wrap"><img class="s-offer-modal-product-image" src="{image}" /></a>' + // '<div class="s-offer-modal-product-info">' + // ' <a href={url} class="s-offer-modal-product-name">{name}</a>' + // ' <div class="s-offer-modal-product-price">{price}</div>' + // '</div>'; // } render() { return h("salla-modal", { key: '924514432b8859956f0e6fde7e1e26f7ed96676f', "has-skeleton": true, "sub-title": this.offer_message, ref: modal => this.modal = modal, isLoading: true, class: `s-offer-modal-type-${this.offer_type ? this.offer_type : ''}` }, h("div", { key: 'ab4e04c367a075aadfef40fcccd1a0201d9a98a7', slot: 'loading' }, h("div", { key: '4b0d592e58008c3f573c2932428a1a56918e5e4f', class: "s-offer-modal-skeleton" }, h("div", { key: 'f175f70005ab1e6423d675e544fa78f3623ecc0c', class: "s-offer-modal-skeleton-header" }, h("salla-skeleton", { key: '9b7cad57d24dee5d2fad32fee2aa05affb259131', type: 'circle', height: '80px', width: '80px' }), h("salla-skeleton", { key: 'b274fd36ca00ce76ce8776da7124faec6c9604d3', height: '15px', width: '50%' }), h("salla-skeleton", { key: '96e823a1fabb0739e0beb5c8b160efeddb117cfa', height: '10px', width: '30%' })), h("div", { key: 'bec427fc42059d661ad63395f2e6e32155633756', class: "s-offer-modal-skeleton-items" }, [...Array(3)].map(() => h("div", { class: "s-offer-modal-skeleton-item" }, h("salla-skeleton", { height: '9rem' }), h("div", { class: "s-offer-modal-skeleton-item-title" }, h("salla-skeleton", { height: '15px', width: '100%' })), h("div", { class: "s-offer-modal-skeleton-item-subtitle" }, h("salla-skeleton", { height: '9px', width: '50%' }), h("div", { innerHTML: Cart2 }))))), h("div", { key: '2c28070fd620d831aa5ab86a708daf492d8da2ad', class: "s-offer-modal-skeleton-footer" }, h("salla-skeleton", { key: 'd2db6cdb15cd5438dbd5b2be17a59ea28397200d', height: '15px', width: '50%' }), h("salla-skeleton", { key: '64404936f0b4fe07d58975974cf4abba664312c1', height: '15px', width: '30%' })))), !this.hasError && this.offer !== null ? [h("span", { slot: 'icon', class: "s-offer-modal-header-icon", innerHTML: SpecialDiscountIcon }), this.getOfferContent(), h("div", { class: "s-offer-modal-footer", slot: "footer" }, this.offer.formatted_date ? h("p", { class: "s-offer-modal-expiry" }, salla.lang.get('pages.products.offer_expires_in'), " ", this.offer.formatted_date) : '', h("label", { class: "s-offer-modal-remember-label" }, h("input", { type: "checkbox", onChange: e => this.rememberMe(e), class: "s-offer-modal-remember-input" }), "\u00A0 ", salla.lang.get('common.elements.remember_my_choice'))), ] : h("salla-placeholder", { class: "s-loyalty-placeholder", alignment: "center" }, !!this.errorMessage ? h("span", { slot: "description" }, this.errorMessage) : '')); } get host() { return this; } static get style() { return sallaOfferModalCss; } }, [0, "salla-offer-modal", { "offer": [32], "offer_name": [32], "offer_message": [32], "hasError": [32], "errorMessage": [32], "productID": [32], "offer_type": [32], "translationLoaded": [32], "addToCartLabel": [32], "open": [64], "showOffer": [64] }]); function defineCustomElement$1() { if (typeof customElements === "undefined") { return; } const components = ["salla-offer-modal", "salla-add-product-button", "salla-button", "salla-count-down", "salla-loading", "salla-modal", "salla-placeholder", "salla-product-availability", "salla-product-card", "salla-products-slider", "salla-progress-bar", "salla-quick-buy", "salla-skeleton", "salla-slider", "salla-tel-input"]; components.forEach(tagName => { switch (tagName) { case "salla-offer-modal": if (!customElements.get(tagName)) { customElements.define(tagName, SallaOfferModal$1); } break; case "salla-add-product-button": if (!customElements.get(tagName)) { defineCustomElement$f(); } break; case "salla-button": if (!customElements.get(tagName)) { defineCustomElement$e(); } break; case "salla-count-down": if (!customElements.get(tagName)) { defineCustomElement$d(); } break; case "salla-loading": if (!customElements.get(tagName)) { defineCustomElement$c(); } break; case "salla-modal": if (!customElements.get(tagName)) { defineCustomElement$b(); } break; case "salla-placeholder": if (!customElements.get(tagName)) { defineCustomElement$a(); } break; case "salla-product-availability": if (!customElements.get(tagName)) { defineCustomElement$9(); } break; case "salla-product-card": if (!customElements.get(tagName)) { defineCustomElement$8(); } break; case "salla-products-slider": if (!customElements.get(tagName)) { defineCustomElement$7(); } break; case "salla-progress-bar": if (!customElements.get(tagName)) { defineCustomElement$6(); } break; case "salla-quick-buy": if (!customElements.get(tagName)) { defineCustomElement$5(); } break; case "salla-skeleton": if (!customElements.get(tagName)) { defineCustomElement$4(); } break; case "salla-slider": if (!customElements.get(tagName)) { defineCustomElement$3(); } break; case "salla-tel-input": if (!customElements.get(tagName)) { defineCustomElement$2(); } break; } }); } defineCustomElement$1(); const SallaOfferModal = SallaOfferModal$1; const defineCustomElement = defineCustomElement$1; export { SallaOfferModal, defineCustomElement };