@salla.sa/twilight-components 2.11.100 → 2.11.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"names":["sallaProductsListCss","SallaProductsList","exports","class_1","hostRef","_this","this","salla","onReady","sourceValueIsValid","getSourceValue","isSourceWithoutValue","buildNextPageUrl","isReady","logger","warn","concat","getSource","hasCustomComponent","customElements","get","hasInfiniteScroll","includes","status","document","createElement","className","innerHTML","lang","btnLoader","querySelector","onLoaded","placeholderText","prototype","validateLimitMaximumValue","_newValue","_","limit","urlPrefix","parseFilters","newValue","parsedFilters","JSON","parse","key","value","this_1","Array","isArray","forEach","item","_i","_b","Object","entries","length","_c","wrapper","init","nextPage","url","api","join","e","source","config","sourceValue","URLSearchParams","window","location","search","loading","isLoading","style","display","getItemHTML","product","customComponent","setAttribute","stringify","toggleAttribute","classList","add","horizontalCards","initiateInfiniteScroll","host","insertAdjacentElement","infiniteScroll","initiate","path","history","scrollThreshold","on","response","appendItems","handleResponse","remove","canRender","render","showPlaceholder","h","class","ShoppingBag","Host","ref","componentDidLoad","map","append","filters","replace","split","reduce","acc","fetch","source_value","then","res","data","card","cursor","next","option","loadOnScroll","_a"],"sources":["src/components/salla-products-list/salla-products-list.scss?tag=salla-products-list","src/components/salla-products-list/salla-products-list.tsx"],"sourcesContent":["\n","import {Component, Host, h, Prop, State, Element, Watch} from '@stencil/core';\nimport ShoppingBag from '../../assets/svg/shopping-bag.svg';\n\n@Component({\n tag: 'salla-products-list',\n styleUrl: 'salla-products-list.scss'\n})\nexport class SallaProductsList {\n constructor() {\n salla.onReady(() => {\n this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());\n this.buildNextPageUrl();\n this.isReady = true;\n });\n\n if (!this.sourceValueIsValid) {\n salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);\n return;\n }\n this.hasCustomComponent = !!customElements.get('custom-salla-product-card');\n\n this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource());\n // Language\n //enhance\n this.status = document.createElement('div');\n this.status.className = 's-infinite-scroll-wrapper';\n this.status.innerHTML = `<div class=\"s-infinite-scroll-status\">\n <p class=\"s-infinite-scroll-last infinite-scroll-last s-hidden\" >${salla.lang.get('common.elements.end_of_content')}</p>\n <p class=\"s-infinite-scroll-error infinite-scroll-error s-hidden\">${salla.lang.get('common.elements.failed_to_load_more')}</p>\n </div>\n <a href=\"#\" class=\"s-infinite-scroll-btn s-button-btn\">\n <span class=\"s-button-loader s-button-loader-center s-infinite-scroll-btn-loader\" style=\"display: none\"></span>\n </a>`;\n this.btnLoader = this.status.querySelector('.s-button-loader');\n salla.lang.onLoaded(() => {\n this.status.querySelector('.s-infinite-scroll-last').innerHTML = salla.lang.get('common.elements.end_of_content');\n this.status.querySelector('.s-infinite-scroll-error').innerHTML = salla.lang.get('common.elements.failed_to_load_more');\n this.placeholderText = salla.lang.get('pages.categories.no_products');\n });\n }\n\n private readonly status: HTMLDivElement;\n private btnLoader: HTMLAnchorElement;\n @Element() host: HTMLElement;\n private wrapper: any;\n private infiniteScroll: any;\n /**\n * The source of the products list\n * @type {string}\n * */\n @Prop({\n reflect: true,\n mutable: true\n }) source: 'categories' | 'latest' | 'related' | 'brands' | 'json' | 'search' | 'tags' | 'selected' | 'offers' | 'landing-page' | 'sales';\n\n /**\n * The source value, cloud be different values as following:\n * - array of ids when `source` in ['categories', 'brands', 'tags', 'selected']\n * - keyword when `source` = 'search'\n * - products payload when `source` = 'json'\n * - product_id when `source` = 'related'\n *\n * @type {string}\n * */\n @Prop({mutable: true}) sourceValue: any;\n\n /**\n * Limit for number of products in the list.\n */\n @Prop({mutable: true}) limit: number;\n\n /**\n * Filter parameters. JSON STRING or object\n */\n @Prop({mutable: true}) filters: string | object;\n\n /**\n * Horizontal cards\n */\n @Prop({reflect: true}) horizontalCards: boolean\n\n @Watch('limit')\n validateLimitMaximumValue(_newValue: number, _) {\n if (this.limit) {\n this.urlPrefix += `&per_page=${this.limit > 32 ? 32 : this.limit}}`;\n }\n }\n\n @Watch('filters')\n parseFilters(newValue: string | object, _) {\n this.parsedFilters = typeof newValue == 'string' ? JSON.parse(newValue) : newValue\n this.urlPrefix = '';\n\n for (const [key, value] of Object.entries(this.parsedFilters)) {\n if (typeof value == \"string\") {\n this.urlPrefix += `&filters[${key}]=${value}`;\n } else if (Array.isArray(value)) {\n (value as any).forEach(item => {\n this.urlPrefix += `&filters[${key}][]=${item}}`\n })\n }\n }\n // reset page products\n if (this.getSource() == 'categories') {\n this.wrapper.innerHTML = '';\n this.init()\n }\n }\n\n // State\n @State() page: number = 1;\n @State() nextPage: string;\n @State() hasInfiniteScroll: boolean;\n @State() hasCustomComponent: boolean;\n @State() sourceValueIsValid: boolean;\n @State() placeholderText: string;\n @State() isReady: boolean;\n @State() showPlaceholder: boolean;\n @State() urlPrefix: string = '';\n @State() parsedFilters: any;\n\n private isSourceWithoutValue(){\n return ['offers', 'latest', 'sales'].includes(this.getSource());\n }\n private buildNextPageUrl() {\n if (this.getSource() === 'json') {\n return;\n }\n if (this.isSourceWithoutValue()) {\n this.nextPage = salla.url.api(`products?source=${this.getSource()}${this.urlPrefix}`);\n return;\n }\n\n if (['search', 'related', 'landing-page'].includes(this.getSource())) {\n this.nextPage = salla.url.api(`products?source=${this.getSource()}&source_value=${this.getSourceValue()}${this.urlPrefix}`);\n return;\n }\n\n try {\n this.nextPage = salla.url.api(`products?source=${this.getSource()}&source_value[]=${this.getSourceValue().join('&source_value[]=')}${this.urlPrefix}`);\n } catch (e) {\n salla.logger.warn(`source-value prop should be array of ids ex source-value=\"[1,2,3]\" for the source [${this.getSource()}]`);\n this.sourceValueIsValid = false;\n }\n }\n\n private getSource() {\n return {\n 'brands.single': 'brands',\n 'product.index': 'categories',\n 'product.index.latest': 'latest',\n 'product.index.offers': 'offers',\n 'product.index.search': 'search',\n 'landing-page': 'landing-page',\n 'product.index.tag': 'tags',\n 'product.index.sales': 'sales',\n }[this.source || salla.config.get('page.slug')] || this.source || 'latest';\n }\n\n private getSourceValue() {\n let source = this.getSource();\n\n if (!['search', 'json', 'offers', 'latest', 'sales'].includes(source)) {\n if (Array.isArray(JSON.parse(this.sourceValue)) && JSON.parse(this.sourceValue).length) {\n return JSON.parse(this.sourceValue);\n }\n\n if (typeof JSON.parse(this.sourceValue) == 'number') {\n return [JSON.parse(this.sourceValue)];\n }\n }\n\n if (this.sourceValue) {\n return this.sourceValue;\n }\n\n\n if (source === 'search') {\n return (new URLSearchParams(window.location.search)).get('q');\n }\n\n return salla.config.get('page.id');\n }\n\n\n private loading(isLoading = true) {\n this.btnLoader.style.display = isLoading ? 'inherit' : 'none';\n }\n\n private getItemHTML(product) {\n let customComponent: string | HTMLElement = this.hasCustomComponent ? 'custom-salla-product-card' : 'salla-product-card';\n customComponent = document.createElement(customComponent);\n customComponent.setAttribute('product', JSON.stringify(product));\n if (this.getSource() == 'landing-page' && !this.hasCustomComponent) {\n customComponent.toggleAttribute('hide-add-btn', true);\n customComponent.classList.add('s-product-card-fit-height');\n }\n if (this.horizontalCards && !this.hasCustomComponent) {\n customComponent.toggleAttribute('horizontal', true);\n }\n customComponent.toggleAttribute('shadow-on-hover', true);\n return customComponent;\n }\n\n private initiateInfiniteScroll() {\n if (!this.hasInfiniteScroll) {\n return;\n }\n\n this.host.insertAdjacentElement('afterend', this.status);\n this.infiniteScroll = salla.infiniteScroll.initiate(this.wrapper, this.wrapper, {\n path: () => this.nextPage,\n history: false,\n nextPage: this.nextPage,\n scrollThreshold: 100,\n }, /* infinite via api*/true);\n this.infiniteScroll.on('request', () => this.loading())\n this.infiniteScroll.on('load', response => this.infiniteScroll.appendItems(this.handleResponse(response)))\n this.infiniteScroll.on('error', () => {\n this.status.querySelector('.s-infinite-scroll-error').classList.remove('s-hidden')\n this.loading(false);\n });\n }\n\n private canRender() {\n return this.sourceValueIsValid && this.isReady;\n }\n\n render() {\n if (!this.canRender()) {\n return '';\n }\n if (this.showPlaceholder) {\n return <div class=\"s-products-list-placeholder\">\n <span innerHTML={ShoppingBag}/>\n <p>{this.placeholderText}</p>\n </div>;\n }\n return (\n <Host class=\"s-products-list\">\n <div class={{\n \"s-products-list-wrapper\": true,\n 's-products-list-horizontal-cards': this.horizontalCards,\n 's-products-list-vertical-cards': !this.horizontalCards,\n }}\n ref={wrapper => this.wrapper = wrapper}/>\n </Host>\n );\n }\n\n componentDidLoad() {\n if (!this.canRender()) {\n return;\n }\n if (this.getSource() === 'json') {\n if (!this.getSourceValue().length) {\n this.showPlaceholder = true;\n return;\n }\n this.getSourceValue().map(product => this.wrapper.append(this.getItemHTML(product)));\n return;\n }\n if (this.getSource() == 'categories') {\n // check if there is a filters in the url\n const filters = window.location.search\n .replace('?', '')\n .split('&')\n .map(item => item.split('='))\n .reduce((acc, [key, value]) => {\n if (key == 'sort') {\n acc[key] = value;\n }\n return acc;\n }, {});\n if (Object.entries(filters).length) {\n this.filters = filters;\n return;\n }\n }\n this.init();\n }\n\n private init() {\n this.initiateInfiniteScroll();\n this.loading();\n salla.product.fetch({\n source: this.getSource(),\n source_value: this.getSourceValue(),\n filters: this.filters,\n limit: this.limit\n })\n .then(res => {\n if (!res.data.length) {\n this.showPlaceholder = true;\n this.loading(false);\n return;\n }\n this.handleResponse(res).forEach(card => this.wrapper.append(card));\n })\n }\n\n private handleResponse(response): Array<HTMLElement> {\n //💡 when source is related, cursor will not be existed\n this.nextPage = response.cursor ? response.cursor.next : this.nextPage;\n this.loading(false);\n if (this.hasInfiniteScroll && !this.nextPage) {\n this.infiniteScroll.option({scrollThreshold: false, loadOnScroll: false});\n this.status.querySelector('.s-infinite-scroll-last').classList.remove('s-hidden');\n }\n return response.data?.map(product => this.getItemHTML(product)) || [];\n }\n}\n"],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /*!
2
- * Crafted with ❤ by Salla
3
- */
4
- import{r as s,h as t,H as i,g as e}from"./p-29c587ff.js";const r=`\x3c!-- Generated by IcoMoon.io --\x3e\n<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">\n<title>shopping-bag</title>\n<path d="M28 10.667h-4v-2.667c0-4.412-3.588-8-8-8s-8 3.588-8 8v2.667h-4c-0.736 0-1.333 0.596-1.333 1.333v13.333c0 3.676 2.991 6.667 6.667 6.667h13.333c3.676 0 6.667-2.991 6.667-6.667v-13.333c0-0.737-0.597-1.333-1.333-1.333zM10.667 8c0-2.941 2.392-5.333 5.333-5.333s5.333 2.392 5.333 5.333v2.667h-10.667zM26.667 25.333c0 2.205-1.795 4-4 4h-13.333c-2.205 0-4-1.795-4-4v-12h2.667v2.667c0 0.737 0.597 1.333 1.333 1.333s1.333-0.596 1.333-1.333v-2.667h10.667v2.667c0 0.737 0.597 1.333 1.333 1.333s1.333-0.596 1.333-1.333v-2.667h2.667z"></path>\n</svg>\n`;const n="";const h=class{constructor(t){s(this,t);this.source=undefined;this.sourceValue=undefined;this.limit=undefined;this.filters=undefined;this.horizontalCards=undefined;this.page=1;this.nextPage=undefined;this.hasInfiniteScroll=undefined;this.hasCustomComponent=undefined;this.sourceValueIsValid=undefined;this.placeholderText=undefined;this.isReady=undefined;this.showPlaceholder=undefined;this.urlPrefix="";this.parsedFilters=undefined;salla.onReady((()=>{this.sourceValueIsValid=!!(this.getSourceValue()||this.isSourceWithoutValue());this.buildNextPageUrl();this.isReady=true}));if(!this.sourceValueIsValid){salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);return}this.hasCustomComponent=!!customElements.get("custom-salla-product-card");this.hasInfiniteScroll=!["json","selected","related","landing-page"].includes(this.getSource());this.status=document.createElement("div");this.status.className="s-infinite-scroll-wrapper";this.status.innerHTML=`<div class="s-infinite-scroll-status">\n <p class="s-infinite-scroll-last infinite-scroll-last s-hidden" >${salla.lang.get("common.elements.end_of_content")}</p>\n <p class="s-infinite-scroll-error infinite-scroll-error s-hidden">${salla.lang.get("common.elements.failed_to_load_more")}</p>\n </div>\n <a href="#" class="s-infinite-scroll-btn s-button-btn">\n <span class="s-button-loader s-button-loader-center s-infinite-scroll-btn-loader" style="display: none"></span>\n </a>`;this.btnLoader=this.status.querySelector(".s-button-loader");salla.lang.onLoaded((()=>{this.status.querySelector(".s-infinite-scroll-last").innerHTML=salla.lang.get("common.elements.end_of_content");this.status.querySelector(".s-infinite-scroll-error").innerHTML=salla.lang.get("common.elements.failed_to_load_more");this.placeholderText=salla.lang.get("pages.categories.no_products")}))}validateLimitMaximumValue(s,t){if(this.limit){this.urlPrefix+=`&per_page=${this.limit>32?32:this.limit}}`}}parseFilters(s,t){this.parsedFilters=typeof s=="string"?JSON.parse(s):s;this.urlPrefix="";for(const[s,t]of Object.entries(this.parsedFilters)){if(typeof t=="string"){this.urlPrefix+=`&filters[${s}]=${t}`}else if(Array.isArray(t)){t.forEach((t=>{this.urlPrefix+=`&filters[${s}][]=${t}}`}))}}if(this.getSource()=="categories"){this.wrapper.innerHTML="";this.init()}}isSourceWithoutValue(){return["offers","latest","sales"].includes(this.getSource())}buildNextPageUrl(){if(this.getSource()==="json"){return}if(this.isSourceWithoutValue()){this.nextPage=salla.url.api(`products?source=${this.getSource()}${this.urlPrefix}`);return}if(["search","related","landing-page"].includes(this.getSource())){this.nextPage=salla.url.api(`products?source=${this.getSource()}&source_value=${this.getSourceValue()}${this.urlPrefix}`);return}try{this.nextPage=salla.url.api(`products?source=${this.getSource()}&source_value[]=${this.getSourceValue().join("&source_value[]=")}${this.urlPrefix}`)}catch(s){salla.logger.warn(`source-value prop should be array of ids ex source-value="[1,2,3]" for the source [${this.getSource()}]`);this.sourceValueIsValid=false}}getSource(){return{"brands.single":"brands","product.index":"categories","product.index.latest":"latest","product.index.offers":"offers","product.index.search":"search","landing-page":"landing-page","product.index.tag":"tags","product.index.sales":"sales"}[this.source||salla.config.get("page.slug")]||this.source||"latest"}getSourceValue(){let s=this.getSource();if(!["search","json","offers","latest","sales"].includes(s)){if(Array.isArray(JSON.parse(this.sourceValue))&&JSON.parse(this.sourceValue).length){return JSON.parse(this.sourceValue)}if(typeof JSON.parse(this.sourceValue)=="number"){return[JSON.parse(this.sourceValue)]}}if(this.sourceValue){return this.sourceValue}if(s==="search"){return new URLSearchParams(window.location.search).get("q")}return salla.config.get("page.id")}loading(s=true){this.btnLoader.style.display=s?"inherit":"none"}getItemHTML(s){let t=this.hasCustomComponent?"custom-salla-product-card":"salla-product-card";t=document.createElement(t);t.setAttribute("product",JSON.stringify(s));if(this.getSource()=="landing-page"&&!this.hasCustomComponent){t.toggleAttribute("hide-add-btn",true);t.classList.add("s-product-card-fit-height")}if(this.horizontalCards&&!this.hasCustomComponent){t.toggleAttribute("horizontal",true)}t.toggleAttribute("shadow-on-hover",true);return t}initiateInfiniteScroll(){if(!this.hasInfiniteScroll){return}this.host.insertAdjacentElement("afterend",this.status);this.infiniteScroll=salla.infiniteScroll.initiate(this.wrapper,this.wrapper,{path:()=>this.nextPage,history:false,nextPage:this.nextPage,scrollThreshold:100},true);this.infiniteScroll.on("request",(()=>this.loading()));this.infiniteScroll.on("load",(s=>this.infiniteScroll.appendItems(this.handleResponse(s))));this.infiniteScroll.on("error",(()=>{this.status.querySelector(".s-infinite-scroll-error").classList.remove("s-hidden");this.loading(false)}))}canRender(){return this.sourceValueIsValid&&this.isReady}render(){if(!this.canRender()){return""}if(this.showPlaceholder){return t("div",{class:"s-products-list-placeholder"},t("span",{innerHTML:r}),t("p",null,this.placeholderText))}return t(i,{class:"s-products-list"},t("div",{class:{"s-products-list-wrapper":true,"s-products-list-horizontal-cards":this.horizontalCards,"s-products-list-vertical-cards":!this.horizontalCards},ref:s=>this.wrapper=s}))}componentDidLoad(){if(!this.canRender()){return}if(this.getSource()==="json"){if(!this.getSourceValue().length){this.showPlaceholder=true;return}this.getSourceValue().map((s=>this.wrapper.append(this.getItemHTML(s))));return}if(this.getSource()=="categories"){const s=window.location.search.replace("?","").split("&").map((s=>s.split("="))).reduce(((s,[t,i])=>{if(t=="sort"){s[t]=i}return s}),{});if(Object.entries(s).length){this.filters=s;return}}this.init()}init(){this.initiateInfiniteScroll();this.loading();salla.product.fetch({source:this.getSource(),source_value:this.getSourceValue(),filters:this.filters,limit:this.limit}).then((s=>{if(!s.data.length){this.showPlaceholder=true;this.loading(false);return}this.handleResponse(s).forEach((s=>this.wrapper.append(s)))}))}handleResponse(s){var t;this.nextPage=s.cursor?s.cursor.next:this.nextPage;this.loading(false);if(this.hasInfiniteScroll&&!this.nextPage){this.infiniteScroll.option({scrollThreshold:false,loadOnScroll:false});this.status.querySelector(".s-infinite-scroll-last").classList.remove("s-hidden")}return((t=s.data)===null||t===void 0?void 0:t.map((s=>this.getItemHTML(s))))||[]}get host(){return e(this)}static get watchers(){return{limit:["validateLimitMaximumValue"],filters:["parseFilters"]}}};h.style=n;export{h as salla_products_list};
5
- //# sourceMappingURL=p-e52586b3.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["sallaProductsListCss","SallaProductsList","constructor","hostRef","salla","onReady","this","sourceValueIsValid","getSourceValue","isSourceWithoutValue","buildNextPageUrl","isReady","logger","warn","getSource","hasCustomComponent","customElements","get","hasInfiniteScroll","includes","status","document","createElement","className","innerHTML","lang","btnLoader","querySelector","onLoaded","placeholderText","validateLimitMaximumValue","_newValue","_","limit","urlPrefix","parseFilters","newValue","parsedFilters","JSON","parse","key","value","Object","entries","Array","isArray","forEach","item","wrapper","init","nextPage","url","api","join","e","source","config","sourceValue","length","URLSearchParams","window","location","search","loading","isLoading","style","display","getItemHTML","product","customComponent","setAttribute","stringify","toggleAttribute","classList","add","horizontalCards","initiateInfiniteScroll","host","insertAdjacentElement","infiniteScroll","initiate","path","history","scrollThreshold","on","response","appendItems","handleResponse","remove","canRender","render","showPlaceholder","h","class","ShoppingBag","Host","ref","componentDidLoad","map","append","filters","replace","split","reduce","acc","fetch","source_value","then","res","data","card","cursor","next","option","loadOnScroll","_a"],"sources":["./src/components/salla-products-list/salla-products-list.scss?tag=salla-products-list","./src/components/salla-products-list/salla-products-list.tsx"],"sourcesContent":["\n","import {Component, Host, h, Prop, State, Element, Watch} from '@stencil/core';\nimport ShoppingBag from '../../assets/svg/shopping-bag.svg';\n\n@Component({\n tag: 'salla-products-list',\n styleUrl: 'salla-products-list.scss'\n})\nexport class SallaProductsList {\n constructor() {\n salla.onReady(() => {\n this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());\n this.buildNextPageUrl();\n this.isReady = true;\n });\n\n if (!this.sourceValueIsValid) {\n salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);\n return;\n }\n this.hasCustomComponent = !!customElements.get('custom-salla-product-card');\n\n this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource());\n // Language\n //enhance\n this.status = document.createElement('div');\n this.status.className = 's-infinite-scroll-wrapper';\n this.status.innerHTML = `<div class=\"s-infinite-scroll-status\">\n <p class=\"s-infinite-scroll-last infinite-scroll-last s-hidden\" >${salla.lang.get('common.elements.end_of_content')}</p>\n <p class=\"s-infinite-scroll-error infinite-scroll-error s-hidden\">${salla.lang.get('common.elements.failed_to_load_more')}</p>\n </div>\n <a href=\"#\" class=\"s-infinite-scroll-btn s-button-btn\">\n <span class=\"s-button-loader s-button-loader-center s-infinite-scroll-btn-loader\" style=\"display: none\"></span>\n </a>`;\n this.btnLoader = this.status.querySelector('.s-button-loader');\n salla.lang.onLoaded(() => {\n this.status.querySelector('.s-infinite-scroll-last').innerHTML = salla.lang.get('common.elements.end_of_content');\n this.status.querySelector('.s-infinite-scroll-error').innerHTML = salla.lang.get('common.elements.failed_to_load_more');\n this.placeholderText = salla.lang.get('pages.categories.no_products');\n });\n }\n\n private readonly status: HTMLDivElement;\n private btnLoader: HTMLAnchorElement;\n @Element() host: HTMLElement;\n private wrapper: any;\n private infiniteScroll: any;\n /**\n * The source of the products list\n * @type {string}\n * */\n @Prop({\n reflect: true,\n mutable: true\n }) source: 'categories' | 'latest' | 'related' | 'brands' | 'json' | 'search' | 'tags' | 'selected' | 'offers' | 'landing-page' | 'sales';\n\n /**\n * The source value, cloud be different values as following:\n * - array of ids when `source` in ['categories', 'brands', 'tags', 'selected']\n * - keyword when `source` = 'search'\n * - products payload when `source` = 'json'\n * - product_id when `source` = 'related'\n *\n * @type {string}\n * */\n @Prop({mutable: true}) sourceValue: any;\n\n /**\n * Limit for number of products in the list.\n */\n @Prop({mutable: true}) limit: number;\n\n /**\n * Filter parameters. JSON STRING or object\n */\n @Prop({mutable: true}) filters: string | object;\n\n /**\n * Horizontal cards\n */\n @Prop({reflect: true}) horizontalCards: boolean\n\n @Watch('limit')\n validateLimitMaximumValue(_newValue: number, _) {\n if (this.limit) {\n this.urlPrefix += `&per_page=${this.limit > 32 ? 32 : this.limit}}`;\n }\n }\n\n @Watch('filters')\n parseFilters(newValue: string | object, _) {\n this.parsedFilters = typeof newValue == 'string' ? JSON.parse(newValue) : newValue\n this.urlPrefix = '';\n\n for (const [key, value] of Object.entries(this.parsedFilters)) {\n if (typeof value == \"string\") {\n this.urlPrefix += `&filters[${key}]=${value}`;\n } else if (Array.isArray(value)) {\n (value as any).forEach(item => {\n this.urlPrefix += `&filters[${key}][]=${item}}`\n })\n }\n }\n // reset page products\n if (this.getSource() == 'categories') {\n this.wrapper.innerHTML = '';\n this.init()\n }\n }\n\n // State\n @State() page: number = 1;\n @State() nextPage: string;\n @State() hasInfiniteScroll: boolean;\n @State() hasCustomComponent: boolean;\n @State() sourceValueIsValid: boolean;\n @State() placeholderText: string;\n @State() isReady: boolean;\n @State() showPlaceholder: boolean;\n @State() urlPrefix: string = '';\n @State() parsedFilters: any;\n\n private isSourceWithoutValue(){\n return ['offers', 'latest', 'sales'].includes(this.getSource());\n }\n private buildNextPageUrl() {\n if (this.getSource() === 'json') {\n return;\n }\n if (this.isSourceWithoutValue()) {\n this.nextPage = salla.url.api(`products?source=${this.getSource()}${this.urlPrefix}`);\n return;\n }\n\n if (['search', 'related', 'landing-page'].includes(this.getSource())) {\n this.nextPage = salla.url.api(`products?source=${this.getSource()}&source_value=${this.getSourceValue()}${this.urlPrefix}`);\n return;\n }\n\n try {\n this.nextPage = salla.url.api(`products?source=${this.getSource()}&source_value[]=${this.getSourceValue().join('&source_value[]=')}${this.urlPrefix}`);\n } catch (e) {\n salla.logger.warn(`source-value prop should be array of ids ex source-value=\"[1,2,3]\" for the source [${this.getSource()}]`);\n this.sourceValueIsValid = false;\n }\n }\n\n private getSource() {\n return {\n 'brands.single': 'brands',\n 'product.index': 'categories',\n 'product.index.latest': 'latest',\n 'product.index.offers': 'offers',\n 'product.index.search': 'search',\n 'landing-page': 'landing-page',\n 'product.index.tag': 'tags',\n 'product.index.sales': 'sales',\n }[this.source || salla.config.get('page.slug')] || this.source || 'latest';\n }\n\n private getSourceValue() {\n let source = this.getSource();\n\n if (!['search', 'json', 'offers', 'latest', 'sales'].includes(source)) {\n if (Array.isArray(JSON.parse(this.sourceValue)) && JSON.parse(this.sourceValue).length) {\n return JSON.parse(this.sourceValue);\n }\n\n if (typeof JSON.parse(this.sourceValue) == 'number') {\n return [JSON.parse(this.sourceValue)];\n }\n }\n\n if (this.sourceValue) {\n return this.sourceValue;\n }\n\n\n if (source === 'search') {\n return (new URLSearchParams(window.location.search)).get('q');\n }\n\n return salla.config.get('page.id');\n }\n\n\n private loading(isLoading = true) {\n this.btnLoader.style.display = isLoading ? 'inherit' : 'none';\n }\n\n private getItemHTML(product) {\n let customComponent: string | HTMLElement = this.hasCustomComponent ? 'custom-salla-product-card' : 'salla-product-card';\n customComponent = document.createElement(customComponent);\n customComponent.setAttribute('product', JSON.stringify(product));\n if (this.getSource() == 'landing-page' && !this.hasCustomComponent) {\n customComponent.toggleAttribute('hide-add-btn', true);\n customComponent.classList.add('s-product-card-fit-height');\n }\n if (this.horizontalCards && !this.hasCustomComponent) {\n customComponent.toggleAttribute('horizontal', true);\n }\n customComponent.toggleAttribute('shadow-on-hover', true);\n return customComponent;\n }\n\n private initiateInfiniteScroll() {\n if (!this.hasInfiniteScroll) {\n return;\n }\n\n this.host.insertAdjacentElement('afterend', this.status);\n this.infiniteScroll = salla.infiniteScroll.initiate(this.wrapper, this.wrapper, {\n path: () => this.nextPage,\n history: false,\n nextPage: this.nextPage,\n scrollThreshold: 100,\n }, /* infinite via api*/true);\n this.infiniteScroll.on('request', () => this.loading())\n this.infiniteScroll.on('load', response => this.infiniteScroll.appendItems(this.handleResponse(response)))\n this.infiniteScroll.on('error', () => {\n this.status.querySelector('.s-infinite-scroll-error').classList.remove('s-hidden')\n this.loading(false);\n });\n }\n\n private canRender() {\n return this.sourceValueIsValid && this.isReady;\n }\n\n render() {\n if (!this.canRender()) {\n return '';\n }\n if (this.showPlaceholder) {\n return <div class=\"s-products-list-placeholder\">\n <span innerHTML={ShoppingBag}/>\n <p>{this.placeholderText}</p>\n </div>;\n }\n return (\n <Host class=\"s-products-list\">\n <div class={{\n \"s-products-list-wrapper\": true,\n 's-products-list-horizontal-cards': this.horizontalCards,\n 's-products-list-vertical-cards': !this.horizontalCards,\n }}\n ref={wrapper => this.wrapper = wrapper}/>\n </Host>\n );\n }\n\n componentDidLoad() {\n if (!this.canRender()) {\n return;\n }\n if (this.getSource() === 'json') {\n if (!this.getSourceValue().length) {\n this.showPlaceholder = true;\n return;\n }\n this.getSourceValue().map(product => this.wrapper.append(this.getItemHTML(product)));\n return;\n }\n if (this.getSource() == 'categories') {\n // check if there is a filters in the url\n const filters = window.location.search\n .replace('?', '')\n .split('&')\n .map(item => item.split('='))\n .reduce((acc, [key, value]) => {\n if (key == 'sort') {\n acc[key] = value;\n }\n return acc;\n }, {});\n if (Object.entries(filters).length) {\n this.filters = filters;\n return;\n }\n }\n this.init();\n }\n\n private init() {\n this.initiateInfiniteScroll();\n this.loading();\n salla.product.fetch({\n source: this.getSource(),\n source_value: this.getSourceValue(),\n filters: this.filters,\n limit: this.limit\n })\n .then(res => {\n if (!res.data.length) {\n this.showPlaceholder = true;\n this.loading(false);\n return;\n }\n this.handleResponse(res).forEach(card => this.wrapper.append(card));\n })\n }\n\n private handleResponse(response): Array<HTMLElement> {\n //💡 when source is related, cursor will not be existed\n this.nextPage = response.cursor ? response.cursor.next : this.nextPage;\n this.loading(false);\n if (this.hasInfiniteScroll && !this.nextPage) {\n this.infiniteScroll.option({scrollThreshold: false, loadOnScroll: false});\n this.status.querySelector('.s-infinite-scroll-last').classList.remove('s-hidden');\n }\n return response.data?.map(product => this.getItemHTML(product)) || [];\n }\n}\n"],"mappings":"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"}