@salla.sa/twilight-components 2.12.35 → 2.12.36

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.
Files changed (72) hide show
  1. package/dist/cjs/{Helper-47ef09c2.js → Helper-eb233453.js} +15 -1
  2. package/dist/cjs/Helper-eb233453.js.map +1 -0
  3. package/dist/cjs/salla-add-product-button_41.cjs.entry.js +1 -1
  4. package/dist/cjs/salla-filters-widget.cjs.entry.js +1 -1
  5. package/dist/cjs/salla-products-list.cjs.entry.js +50 -67
  6. package/dist/cjs/salla-products-list.cjs.entry.js.map +1 -1
  7. package/dist/cjs/salla-products-slider.cjs.entry.js +19 -30
  8. package/dist/cjs/salla-products-slider.cjs.entry.js.map +1 -1
  9. package/dist/collection/Helpers/Helper.js +14 -0
  10. package/dist/collection/Helpers/Helper.js.map +1 -1
  11. package/dist/collection/components/salla-products-list/salla-products-list.js +49 -66
  12. package/dist/collection/components/salla-products-list/salla-products-list.js.map +1 -1
  13. package/dist/collection/components/salla-products-slider/salla-products-slider.js +18 -29
  14. package/dist/collection/components/salla-products-slider/salla-products-slider.js.map +1 -1
  15. package/dist/components/Helper.js +14 -0
  16. package/dist/components/Helper.js.map +1 -1
  17. package/dist/components/salla-products-list.js +49 -66
  18. package/dist/components/salla-products-list.js.map +1 -1
  19. package/dist/components/salla-products-slider.js +18 -29
  20. package/dist/components/salla-products-slider.js.map +1 -1
  21. package/dist/esm/{Helper-c2739d13.js → Helper-66d083b5.js} +15 -1
  22. package/dist/esm/Helper-66d083b5.js.map +1 -0
  23. package/dist/esm/salla-add-product-button_41.entry.js +1 -1
  24. package/dist/esm/salla-filters-widget.entry.js +1 -1
  25. package/dist/esm/salla-products-list.entry.js +50 -67
  26. package/dist/esm/salla-products-list.entry.js.map +1 -1
  27. package/dist/esm/salla-products-slider.entry.js +19 -30
  28. package/dist/esm/salla-products-slider.entry.js.map +1 -1
  29. package/dist/esm-es5/{Helper-c2739d13.js → Helper-66d083b5.js} +3 -3
  30. package/dist/esm-es5/{Helper-c2739d13.js.map → Helper-66d083b5.js.map} +1 -1
  31. package/dist/esm-es5/salla-add-product-button_41.entry.js +1 -1
  32. package/dist/esm-es5/salla-filters-widget.entry.js +1 -1
  33. package/dist/esm-es5/salla-products-list.entry.js +1 -1
  34. package/dist/esm-es5/salla-products-list.entry.js.map +1 -1
  35. package/dist/esm-es5/salla-products-slider.entry.js +1 -1
  36. package/dist/esm-es5/salla-products-slider.entry.js.map +1 -1
  37. package/dist/twilight/{p-e552c228.system.entry.js → p-09f2c48c.system.entry.js} +2 -2
  38. package/dist/twilight/p-17869512.system.entry.js +5 -0
  39. package/dist/twilight/p-17869512.system.entry.js.map +1 -0
  40. package/dist/twilight/{p-765672d0.entry.js → p-24103953.entry.js} +2 -2
  41. package/dist/twilight/p-34bf40ac.system.js +1 -1
  42. package/dist/twilight/p-5f51f7e6.entry.js +5 -0
  43. package/dist/twilight/p-5f51f7e6.entry.js.map +1 -0
  44. package/dist/twilight/{p-68d3a0d2.system.js → p-641358eb.system.js} +3 -3
  45. package/dist/twilight/{p-68d3a0d2.system.js.map → p-641358eb.system.js.map} +1 -1
  46. package/dist/twilight/{p-1f0a4705.entry.js → p-695467d5.entry.js} +2 -2
  47. package/dist/twilight/p-9f249e3c.system.entry.js +5 -0
  48. package/dist/twilight/p-9f249e3c.system.entry.js.map +1 -0
  49. package/dist/twilight/{p-20659764.system.entry.js → p-d2dc658a.system.entry.js} +2 -2
  50. package/dist/twilight/p-d7b6c544.entry.js +5 -0
  51. package/dist/twilight/p-d7b6c544.entry.js.map +1 -0
  52. package/dist/twilight/{p-69321383.js → p-ed793fc8.js} +2 -2
  53. package/dist/twilight/{p-69321383.js.map → p-ed793fc8.js.map} +1 -1
  54. package/dist/twilight/twilight.esm.js +1 -1
  55. package/dist/types/Helpers/Helper.d.ts +11 -0
  56. package/dist/types/components/salla-products-list/salla-products-list.d.ts +1 -1
  57. package/dist/types/components/salla-products-slider/salla-products-slider.d.ts +1 -3
  58. package/package.json +2 -2
  59. package/dist/cjs/Helper-47ef09c2.js.map +0 -1
  60. package/dist/esm/Helper-c2739d13.js.map +0 -1
  61. package/dist/twilight/p-5022a0dc.entry.js +0 -5
  62. package/dist/twilight/p-5022a0dc.entry.js.map +0 -1
  63. package/dist/twilight/p-672fb5e4.system.entry.js +0 -5
  64. package/dist/twilight/p-672fb5e4.system.entry.js.map +0 -1
  65. package/dist/twilight/p-98c3cddb.entry.js +0 -5
  66. package/dist/twilight/p-98c3cddb.entry.js.map +0 -1
  67. package/dist/twilight/p-e19acc25.system.entry.js +0 -5
  68. package/dist/twilight/p-e19acc25.system.entry.js.map +0 -1
  69. /package/dist/twilight/{p-e552c228.system.entry.js.map → p-09f2c48c.system.entry.js.map} +0 -0
  70. /package/dist/twilight/{p-765672d0.entry.js.map → p-24103953.entry.js.map} +0 -0
  71. /package/dist/twilight/{p-1f0a4705.entry.js.map → p-695467d5.entry.js.map} +0 -0
  72. /package/dist/twilight/{p-20659764.system.entry.js.map → p-d2dc658a.system.entry.js.map} +0 -0
@@ -24,27 +24,6 @@ export class SallaProductsList {
24
24
  this.parsedFilters = undefined;
25
25
  }
26
26
  connectedCallback() {
27
- salla.onReady(() => {
28
- this.hasCustomComponent = !!customElements.get('custom-salla-product-card');
29
- this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());
30
- this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource());
31
- try {
32
- let searchParams = new URLSearchParams(window.location.search);
33
- this.sortBy = this.sortBy || searchParams.get('sort') || searchParams.get('by');
34
- let filters = searchParams.get('filters');
35
- this.parsedFilters = filters ? JSON.parse(decodeURIComponent(filters)) : {};
36
- }
37
- catch (e) {
38
- salla.logger.warn('failed to get filters from url', e.message);
39
- }
40
- this.buildNextPageUrl();
41
- this.createStatusDom();
42
- this.isReady = true;
43
- });
44
- if (!this.sourceValueIsValid) {
45
- salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);
46
- return;
47
- }
48
27
  salla.event.on('salla-filters::changed', filters => this.setFilters(filters));
49
28
  }
50
29
  /**
@@ -183,25 +162,6 @@ export class SallaProductsList {
183
162
  getSourceValue() {
184
163
  return Helper.getProductsSourceValue(this.source, this.sourceValue);
185
164
  }
186
- fetchProducts() {
187
- salla.product.api.fetch({
188
- source: this.getSource(),
189
- source_value: this.getSourceValue(),
190
- limit: this.limit
191
- })
192
- .then(res => {
193
- if (!res.data.length) {
194
- this.showPlaceholder = true;
195
- this.loading(false);
196
- return;
197
- }
198
- this.handleResponse(res).forEach(card => this.wrapper.append(card));
199
- }).catch(() => {
200
- // TODO: Find the real issue and fix it
201
- salla.log('Request headers', salla.api.getHeaders());
202
- setTimeout(() => this.fetchProducts(), 1000);
203
- });
204
- }
205
165
  initiateInfiniteScroll() {
206
166
  var _a, _b, _c;
207
167
  if (!this.hasInfiniteScroll) {
@@ -237,15 +197,61 @@ export class SallaProductsList {
237
197
  });
238
198
  salla.onReady(() => salla.infiniteScroll.loadNextPage(this.infiniteScroll));
239
199
  }
200
+ componentWillLoad() {
201
+ return Helper.onSallaReadyPromise(() => {
202
+ this.hasCustomComponent = !!customElements.get('custom-salla-product-card');
203
+ this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());
204
+ this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource()) && !this.limit;
205
+ try {
206
+ let searchParams = new URLSearchParams(window.location.search);
207
+ this.sortBy = this.sortBy || searchParams.get('sort') || searchParams.get('by');
208
+ let filters = searchParams.get('filters');
209
+ this.parsedFilters = filters ? JSON.parse(decodeURIComponent(filters)) : {};
210
+ }
211
+ catch (e) {
212
+ salla.logger.warn('failed to get filters from url', e.message);
213
+ }
214
+ this.buildNextPageUrl();
215
+ this.createStatusDom();
216
+ this.isReady = true;
217
+ if (!this.sourceValueIsValid) {
218
+ salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);
219
+ return;
220
+ }
221
+ if (this.hasInfiniteScroll) {
222
+ return;
223
+ }
224
+ // Handle json source
225
+ if (this.getSource() === 'json') {
226
+ if (!this.getSourceValue().length) {
227
+ this.showPlaceholder = true;
228
+ return;
229
+ }
230
+ this.getSourceValue().map(product => this.wrapper.append(this.getItemHTML(product)));
231
+ return;
232
+ }
233
+ // Handle selected source
234
+ if (this.getSource() === 'selected' && !this.getSourceValue().length) {
235
+ this.showPlaceholder = true;
236
+ return;
237
+ }
238
+ return Helper.fetchProducts(this.getSource(), this.getSourceValue(), this.limit).then(res => {
239
+ if (!res.data.length) {
240
+ this.showPlaceholder = true;
241
+ this.loading(false);
242
+ return;
243
+ }
244
+ this.handleResponse(res).forEach(card => this.wrapper.append(card));
245
+ });
246
+ });
247
+ }
240
248
  canRender() {
241
249
  return this.sourceValueIsValid && this.isReady;
242
250
  }
243
251
  render() {
244
- salla.log('render: before can render');
245
252
  if (!this.canRender()) {
246
253
  return '';
247
254
  }
248
- salla.log('render: after can render');
249
255
  if (this.showPlaceholder) {
250
256
  return h("div", { class: "s-products-list-placeholder" }, h("span", { innerHTML: ShoppingBag }), h("p", null, this.placeholderText));
251
257
  }
@@ -257,30 +263,7 @@ export class SallaProductsList {
257
263
  }, ref: wrapper => this.wrapper = wrapper })));
258
264
  }
259
265
  componentDidLoad() {
260
- salla.log('component did load before can render');
261
- if (!this.canRender()) {
262
- return;
263
- }
264
- salla.log('component did load after can render');
265
- // Handle json source
266
- if (this.getSource() === 'json') {
267
- if (!this.getSourceValue().length) {
268
- this.showPlaceholder = true;
269
- return;
270
- }
271
- this.getSourceValue().map(product => this.wrapper.append(this.getItemHTML(product)));
272
- return;
273
- }
274
- // Handle selected source
275
- if (this.getSource() === 'selected' || this.getSource() === 'landing-page') {
276
- if (this.getSource() === 'selected' && !this.getSourceValue().length) {
277
- this.showPlaceholder = true;
278
- return;
279
- }
280
- this.fetchProducts();
281
- return;
282
- }
283
- this.init();
266
+ this.hasInfiniteScroll && this.init();
284
267
  }
285
268
  init() {
286
269
  this.initiateInfiniteScroll();
@@ -1 +1 @@
1
- {"version":3,"file":"salla-products-list.js","sourceRoot":"","sources":["../../../src/components/salla-products-list/salla-products-list.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, Prop, State, Element, Method, Event, EventEmitter } from '@stencil/core';\nimport anime from 'animejs';\nimport ShoppingBag from '../../assets/svg/shopping-bag.svg';\nimport Helper from '../../Helpers/Helper';\n@Component({\n tag: 'salla-products-list',\n styleUrl: 'salla-products-list.scss'\n})\nexport class SallaProductsList {\n connectedCallback() {\n salla.onReady(() => {\n this.hasCustomComponent = !!customElements.get('custom-salla-product-card');\n this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());\n this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource());\n try {\n let searchParams = new URLSearchParams(window.location.search);\n this.sortBy = this.sortBy || searchParams.get('sort') || searchParams.get('by');\n let filters = searchParams.get('filters')\n this.parsedFilters = filters ? JSON.parse(decodeURIComponent(filters)) : {};\n } catch (e) {\n salla.logger.warn('failed to get filters from url', e.message);\n }\n this.buildNextPageUrl();\n this.createStatusDom();\n\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 salla.event.on('salla-filters::changed', filters => this.setFilters(filters))\n\n\n }\n\n /**\n * Set parsed filters data from URI\n * @param filters\n */\n @Method()\n async setFilters(filters) {\n if (!!filters && JSON.stringify(this.parsedFilters) === JSON.stringify(filters)) {\n return;\n }\n window.scrollTo({ top: 0, behavior: 'smooth' });\n this.parsedFilters = filters;\n return this.reload();\n }\n\n /**\n * Reload the list of products (entire content of the component).\n */\n @Method()\n async reload() {\n salla.infiniteScroll.destroy(this.infiniteScroll);\n this.buildNextPageUrl();\n // TODO: this is problematic in testing, for the time being it's been resolved like this\n this.wrapper.innerHTML = '';\n this.init();\n }\n\n\n private 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 * Sorting the list of products\n */\n @Prop({ mutable: true }) sortBy?: string | 'ourSuggest' | 'bestSell' | 'topRated' | 'priceFromTopToLow' | 'priceFromLowToTop';\n\n /**\n * should listen to filters events `salla-filters::changed` and re-render\n */\n @Prop({ reflect: true, mutable: true }) filtersResults: boolean;\n\n /**\n * Horizontal cards\n */\n @Prop({ reflect: true }) horizontalCards: boolean\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() parsedFilters: any;\n\n /**\n * Custom event fired when the the products fetched.\n */\n @Event() productsFetched: EventEmitter;\n\n private isFilterable() {\n return salla.config.get('store.settings.product.filters') && this.filtersResults;\n }\n\n private isSourceWithoutValue() {\n return ['offers', 'latest', 'sales'].includes(this.getSource());\n }\n\n private animateItems() {\n anime({\n targets: 'salla-products-list salla-product-card',\n opacity: [0, 1],\n duration: 1200,\n translateY: [20, 0],\n delay: function (_el, i) {\n return i * 100;\n },\n })\n }\n\n private createStatusDom() {\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 initBaseNextPageUrl(source: string) {\n\n this.nextPage = salla.url.api(`products?source=${source}`);\n\n if (this.limit) {\n this.nextPage += `&per_page=${this.limit > 32 ? 32 : this.limit}`;\n }\n if (this.sortBy) {\n this.nextPage += `&sort=${this.sortBy}`;\n }\n // if (!this.isFilterable()) {\n // return this.nextPage;\n // }\n this.nextPage += '&filterable=1';\n for (const [key, value] of Object.entries(this.parsedFilters || {})) {\n if ([\"string\", \"number\"].includes(typeof value)) {\n // @ts-ignore\n this.nextPage += `&filters[${encodeURIComponent(key)}]=${encodeURIComponent(value)}`;\n } else if (Array.isArray(value)) {\n value.forEach(item => this.nextPage += `&filters[${encodeURIComponent(key)}][]=${encodeURIComponent(item)}`);\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n this.nextPage += `&filters[${encodeURIComponent(key)}][${encodeURIComponent(k)}]=${encodeURIComponent(v)}`;\n }\n }\n }\n }\n\n private buildNextPageUrl() {\n let source = this.getSource();\n if (source === 'json') {\n return;\n }\n this.initBaseNextPageUrl(source);\n if (this.isSourceWithoutValue()) {\n return;\n }\n\n if (['search', 'related', 'landing-page'].includes(source)) {\n this.nextPage += `&source_value=${this.getSourceValue()}`;\n return;\n }\n\n try {\n this.nextPage += `&source_value[]=${this.getSourceValue().join('&source_value[]=')}`;\n } catch (e) {\n salla.logger.warn(`source-value prop should be array of ids ex source-value=\"[1,2,3]\" for the source [${source}]`);\n this.sourceValueIsValid = false;\n }\n }\n\n\n private loading(isLoading = true) {\n this.btnLoader.style.display = isLoading ? 'inherit' : 'none';\n }\n\n private getItemHTML(product) {\n const customComponentTag = this.hasCustomComponent ? 'custom-salla-product-card' : 'salla-product-card';\n const productCard = document.createElement(customComponentTag) as HTMLSallaProductCardElement;\n productCard.product = product;\n\n this.applyLandingPageStyles(productCard);\n this.applyHorizontalCardStyles(productCard);\n\n return productCard;\n }\n\n private applyLandingPageStyles(productCard) {\n if (this.getSource() === 'landing-page' && !this.hasCustomComponent) {\n productCard.toggleAttribute('hide-add-btn', true);\n productCard.classList.add('s-product-card-fit-height');\n }\n }\n\n private applyHorizontalCardStyles(productCard) {\n if (!this.horizontalCards) {\n return;\n }\n productCard.setAttribute('horizontal', true);\n if (!this.hasCustomComponent) {\n productCard.setAttribute('shadow-on-hover', true);\n }\n\n }\n\n private getSource() {\n return Helper.getProductsSource(this.source);\n }\n\n private getSourceValue() {\n return Helper.getProductsSourceValue(this.source, this.sourceValue);\n }\n\n private fetchProducts() {\n\n salla.product.api.fetch({\n source: this.getSource(),\n source_value: this.getSourceValue(),\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 }).catch(() => {\n // TODO: Find the real issue and fix it\n salla.log('Request headers', salla.api.getHeaders());\n setTimeout(() => this.fetchProducts(), 1000);\n })\n }\n\n private initiateInfiniteScroll() {\n if (!this.hasInfiniteScroll) {\n return;\n }\n\n this.host.insertAdjacentElement('beforeend', 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 => {\n if (!response.data?.length && this.infiniteScroll.pageIndex == 2) {\n this.showPlaceholder = true;\n salla.infiniteScroll.destroy(this.infiniteScroll);\n this.loading(false);\n return;\n } else {\n this.showPlaceholder = false;\n\n }\n this.infiniteScroll.appendItems(this.handleResponse(response))\n if (this.infiniteScroll.pageIndex == 2) {\n this.animateItems();\n }\n })\n this.infiniteScroll?.on('error', () => {\n this.status.querySelector('.s-infinite-scroll-error').classList.remove('s-hidden')\n this.loading(false);\n });\n salla.onReady(() => salla.infiniteScroll.loadNextPage(this.infiniteScroll))\n }\n\n private canRender() {\n return this.sourceValueIsValid && this.isReady;\n }\n\n render() {\n salla.log('render: before can render')\n if (!this.canRender()) {\n return '';\n }\n salla.log('render: after can render')\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 && !this.filtersResults,\n 's-products-list-vertical-cards': !this.horizontalCards && !this.filtersResults,\n 's-products-list-filters-results': this.filtersResults,\n }}\n ref={wrapper => this.wrapper = wrapper} />\n </Host>\n );\n }\n\n componentDidLoad() {\n salla.log('component did load before can render')\n if (!this.canRender()) {\n return;\n }\n salla.log('component did load after can render')\n\n // Handle json source\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 // Handle selected source\n if (this.getSource() === 'selected' || this.getSource() === 'landing-page') {\n if (this.getSource() === 'selected' && !this.getSourceValue().length) {\n this.showPlaceholder = true;\n return;\n }\n this.fetchProducts()\n return;\n }\n this.init();\n }\n\n private init() {\n this.initiateInfiniteScroll();\n this.loading();\n }\n\n private handleResponse(response): Array<HTMLElement> {\n let source=this.getSource();\n let title = '';\n //help the developer to know the current page title\n if (response.cursor?.current === 1) {\n title = Helper.getPageTitleForSource(source);\n try {\n if (this.getSource() === 'search') {\n title = salla.lang.get('common.elements.search_about', {'word': this.getSourceValue()});\n } else if (!title) {\n let catId = this.parsedFilters.category_id || this.getSourceValue()[0];\n // get the first filter that its key is category_id, then get the value when filter.value.*.key==catId\n title = response.filters.find(filter => filter.key == 'category_id') ?. values ?. find(cat => cat.key == catId) ?. value || '';\n }\n title += (title ? ' - ' : '') + salla.lang.choice('blocks.header.products_count', response.data ?. length);\n if (response.data.length === 20) {\n title = title.replace(response.data.length, salla.lang.get('common.elements.more_than') + ' ' + response.data.length)\n }\n response.title = title;\n } catch (e) {}\n }\n\n salla.event.emit('salla-products-list::products.fetched', response);\n this.productsFetched.emit(response);\n //💡 when source is related, cursor will not be existed\n if (response.filters && this.isFilterable()) {\n this.filtersResults = true;\n salla.event.emit('filters::fetched', { filters: response.filters });\n } else if (this.isFilterable()) {\n salla.event.emit('filters::hidden');\n }\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"]}
1
+ {"version":3,"file":"salla-products-list.js","sourceRoot":"","sources":["../../../src/components/salla-products-list/salla-products-list.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, Prop, State, Element, Method, Event, EventEmitter } from '@stencil/core';\nimport anime from 'animejs';\nimport ShoppingBag from '../../assets/svg/shopping-bag.svg';\nimport Helper from '../../Helpers/Helper';\n@Component({\n tag: 'salla-products-list',\n styleUrl: 'salla-products-list.scss'\n})\nexport class SallaProductsList {\n connectedCallback() {\n salla.event.on('salla-filters::changed', filters => this.setFilters(filters))\n }\n\n /**\n * Set parsed filters data from URI\n * @param filters\n */\n @Method()\n async setFilters(filters) {\n if (!!filters && JSON.stringify(this.parsedFilters) === JSON.stringify(filters)) {\n return;\n }\n window.scrollTo({ top: 0, behavior: 'smooth' });\n this.parsedFilters = filters;\n return this.reload();\n }\n\n /**\n * Reload the list of products (entire content of the component).\n */\n @Method()\n async reload() {\n salla.infiniteScroll.destroy(this.infiniteScroll);\n this.buildNextPageUrl();\n // TODO: this is problematic in testing, for the time being it's been resolved like this\n this.wrapper.innerHTML = '';\n this.init();\n }\n\n\n private 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 * Sorting the list of products\n */\n @Prop({ mutable: true }) sortBy?: string | 'ourSuggest' | 'bestSell' | 'topRated' | 'priceFromTopToLow' | 'priceFromLowToTop';\n\n /**\n * should listen to filters events `salla-filters::changed` and re-render\n */\n @Prop({ reflect: true, mutable: true }) filtersResults: boolean;\n\n /**\n * Horizontal cards\n */\n @Prop({ reflect: true }) horizontalCards: boolean\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() parsedFilters: any;\n\n /**\n * Custom event fired when the the products fetched.\n */\n @Event() productsFetched: EventEmitter;\n\n private isFilterable() {\n return salla.config.get('store.settings.product.filters') && this.filtersResults;\n }\n\n private isSourceWithoutValue() {\n return ['offers', 'latest', 'sales'].includes(this.getSource());\n }\n\n private animateItems() {\n anime({\n targets: 'salla-products-list salla-product-card',\n opacity: [0, 1],\n duration: 1200,\n translateY: [20, 0],\n delay: function (_el, i) {\n return i * 100;\n },\n })\n }\n\n private createStatusDom() {\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 initBaseNextPageUrl(source: string) {\n\n this.nextPage = salla.url.api(`products?source=${source}`);\n\n if (this.limit) {\n this.nextPage += `&per_page=${this.limit > 32 ? 32 : this.limit}`;\n }\n if (this.sortBy) {\n this.nextPage += `&sort=${this.sortBy}`;\n }\n // if (!this.isFilterable()) {\n // return this.nextPage;\n // }\n this.nextPage += '&filterable=1';\n for (const [key, value] of Object.entries(this.parsedFilters || {})) {\n if ([\"string\", \"number\"].includes(typeof value)) {\n // @ts-ignore\n this.nextPage += `&filters[${encodeURIComponent(key)}]=${encodeURIComponent(value)}`;\n } else if (Array.isArray(value)) {\n value.forEach(item => this.nextPage += `&filters[${encodeURIComponent(key)}][]=${encodeURIComponent(item)}`);\n } else if (typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n this.nextPage += `&filters[${encodeURIComponent(key)}][${encodeURIComponent(k)}]=${encodeURIComponent(v)}`;\n }\n }\n }\n }\n\n private buildNextPageUrl() {\n let source = this.getSource();\n if (source === 'json') {\n return;\n }\n this.initBaseNextPageUrl(source);\n if (this.isSourceWithoutValue()) {\n return;\n }\n\n if (['search', 'related', 'landing-page'].includes(source)) {\n this.nextPage += `&source_value=${this.getSourceValue()}`;\n return;\n }\n\n try {\n this.nextPage += `&source_value[]=${this.getSourceValue().join('&source_value[]=')}`;\n } catch (e) {\n salla.logger.warn(`source-value prop should be array of ids ex source-value=\"[1,2,3]\" for the source [${source}]`);\n this.sourceValueIsValid = false;\n }\n }\n\n\n private loading(isLoading = true) {\n this.btnLoader.style.display = isLoading ? 'inherit' : 'none';\n }\n\n private getItemHTML(product) {\n const customComponentTag = this.hasCustomComponent ? 'custom-salla-product-card' : 'salla-product-card';\n const productCard = document.createElement(customComponentTag) as HTMLSallaProductCardElement;\n productCard.product = product;\n\n this.applyLandingPageStyles(productCard);\n this.applyHorizontalCardStyles(productCard);\n\n return productCard;\n }\n\n private applyLandingPageStyles(productCard) {\n if (this.getSource() === 'landing-page' && !this.hasCustomComponent) {\n productCard.toggleAttribute('hide-add-btn', true);\n productCard.classList.add('s-product-card-fit-height');\n }\n }\n\n private applyHorizontalCardStyles(productCard) {\n if (!this.horizontalCards) {\n return;\n }\n productCard.setAttribute('horizontal', true);\n if (!this.hasCustomComponent) {\n productCard.setAttribute('shadow-on-hover', true);\n }\n\n }\n\n private getSource() {\n return Helper.getProductsSource(this.source);\n }\n\n private getSourceValue() {\n return Helper.getProductsSourceValue(this.source, this.sourceValue);\n }\n\n private initiateInfiniteScroll() {\n if (!this.hasInfiniteScroll) {\n return;\n }\n\n this.host.insertAdjacentElement('beforeend', 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 => {\n if (!response.data?.length && this.infiniteScroll.pageIndex == 2) {\n this.showPlaceholder = true;\n salla.infiniteScroll.destroy(this.infiniteScroll);\n this.loading(false);\n return;\n } else {\n this.showPlaceholder = false;\n\n }\n this.infiniteScroll.appendItems(this.handleResponse(response))\n if (this.infiniteScroll.pageIndex == 2) {\n this.animateItems();\n }\n })\n this.infiniteScroll?.on('error', () => {\n this.status.querySelector('.s-infinite-scroll-error').classList.remove('s-hidden')\n this.loading(false);\n });\n salla.onReady(() => salla.infiniteScroll.loadNextPage(this.infiniteScroll))\n }\n\n componentWillLoad() {\n return Helper.onSallaReadyPromise( () => {\n this.hasCustomComponent = !!customElements.get('custom-salla-product-card');\n this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());\n this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource()) && !this.limit;\n try {\n let searchParams = new URLSearchParams(window.location.search);\n this.sortBy = this.sortBy || searchParams.get('sort') || searchParams.get('by');\n let filters = searchParams.get('filters')\n this.parsedFilters = filters ? JSON.parse(decodeURIComponent(filters)) : {};\n } catch (e) {\n salla.logger.warn('failed to get filters from url', e.message);\n }\n this.buildNextPageUrl();\n this.createStatusDom();\n \n this.isReady = true;\n \n if (!this.sourceValueIsValid) {\n salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);\n return;\n }\n if (this.hasInfiniteScroll) {\n return;\n }\n\n // Handle json source\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\n // Handle selected source\n if (this.getSource() === 'selected' && !this.getSourceValue().length) {\n this.showPlaceholder = true;\n return;\n }\n\n return Helper.fetchProducts(this.getSource(), this.getSourceValue(), this.limit).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\n\n\n private canRender() {\n return this.sourceValueIsValid && this.isReady;\n }\n\n render() {\n if (!this.canRender()) {\n return '';\n }\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 && !this.filtersResults,\n 's-products-list-vertical-cards': !this.horizontalCards && !this.filtersResults,\n 's-products-list-filters-results': this.filtersResults,\n }}\n ref={wrapper => this.wrapper = wrapper} />\n </Host>\n );\n }\n\n componentDidLoad() {\n this.hasInfiniteScroll && this.init();\n }\n\n private init() {\n this.initiateInfiniteScroll();\n this.loading();\n }\n\n private handleResponse(response): Array<HTMLElement> {\n let source=this.getSource();\n let title = '';\n //help the developer to know the current page title\n if (response.cursor?.current === 1) {\n title = Helper.getPageTitleForSource(source);\n try {\n if (this.getSource() === 'search') {\n title = salla.lang.get('common.elements.search_about', {'word': this.getSourceValue()});\n } else if (!title) {\n let catId = this.parsedFilters.category_id || this.getSourceValue()[0];\n // get the first filter that its key is category_id, then get the value when filter.value.*.key==catId\n title = response.filters.find(filter => filter.key == 'category_id') ?. values ?. find(cat => cat.key == catId) ?. value || '';\n }\n title += (title ? ' - ' : '') + salla.lang.choice('blocks.header.products_count', response.data ?. length);\n if (response.data.length === 20) {\n title = title.replace(response.data.length, salla.lang.get('common.elements.more_than') + ' ' + response.data.length)\n }\n response.title = title;\n } catch (e) {}\n }\n\n salla.event.emit('salla-products-list::products.fetched', response);\n this.productsFetched.emit(response);\n //💡 when source is related, cursor will not be existed\n if (response.filters && this.isFilterable()) {\n this.filtersResults = true;\n salla.event.emit('filters::fetched', { filters: response.filters });\n } else if (this.isFilterable()) {\n salla.event.emit('filters::hidden');\n }\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"]}
@@ -20,14 +20,6 @@ export class SallaProductsSlider {
20
20
  this.hasCustomComponent = undefined;
21
21
  this.apiUrl = '';
22
22
  this.parsedSourceValue = undefined;
23
- salla.onReady(() => {
24
- this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());
25
- if (!this.sourceValueIsValid) {
26
- salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);
27
- return;
28
- }
29
- this.hasCustomComponent = !!customElements.get('custom-salla-product-card');
30
- });
31
23
  }
32
24
  isSourceWithoutValue() {
33
25
  return ['offers', 'latest', 'sales'].includes(this.getSource());
@@ -42,27 +34,24 @@ export class SallaProductsSlider {
42
34
  return this.sourceValueIsValid && this.isReady;
43
35
  }
44
36
  componentWillLoad() {
45
- if (this.source === 'json') {
46
- this.productsData = this.getSourceValue();
47
- this.isReady = true;
48
- return;
49
- }
50
- return this.fetchProducts();
51
- }
52
- fetchProducts() {
53
- return salla.api.withoutNotifier(() => salla.product.api.fetch({
54
- source: this.getSource(),
55
- source_value: this.getSourceValue(),
56
- limit: this.limit,
57
- }).then(res => {
58
- this.productsData = res.data;
59
- this.isReady = true;
60
- salla.event.emit('salla-products-slider::products.fetched', res.data);
61
- }).catch(() => {
62
- // TODO: Find the real issue and fix it
63
- salla.log('Request headers', salla.api.getHeaders());
64
- setTimeout(() => this.fetchProducts(), 1000);
65
- }));
37
+ return Helper.onSallaReadyPromise(() => {
38
+ this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());
39
+ if (!this.sourceValueIsValid) {
40
+ salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);
41
+ return;
42
+ }
43
+ this.hasCustomComponent = !!customElements.get('custom-salla-product-card');
44
+ if (this.source === 'json') {
45
+ this.productsData = this.getSourceValue();
46
+ this.isReady = true;
47
+ return;
48
+ }
49
+ return Helper.fetchProducts(this.getSource(), this.getSourceValue(), this.limit).then(res => {
50
+ this.productsData = res.data;
51
+ this.isReady = true;
52
+ salla.event.emit('salla-products-slider::products.fetched', res.data);
53
+ });
54
+ });
66
55
  }
67
56
  getSource() {
68
57
  return Helper.getProductsSource(this.source);
@@ -1 +1 @@
1
- {"version":3,"file":"salla-products-slider.js","sourceRoot":"","sources":["../../../src/components/salla-products-slider/salla-products-slider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, Prop, Element, State } from '@stencil/core';\nimport Helper from '../../Helpers/Helper';\n@Component({\n tag: 'salla-products-slider',\n styleUrl: 'salla-products-slider.scss'\n})\n\n//todo:: extends this component from salla-products-list or the opposite\nexport class SallaProductsSlider {\n constructor() {\n salla.onReady(() => {\n this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());\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 }\n private isSourceWithoutValue() {\n return ['offers', 'latest', 'sales'].includes(this.getSource());\n }\n\n @Element() host: HTMLElement;\n //todo:: support limit, default =10, make sure that maximum is 32,\n\n /**\n * Title of the block - works only if slider is true\n * @type {string}\n * @default ''\n * */\n @Prop() blockTitle: string;\n\n /**\n * Sub title of the block - works only if slider is true\n * @type {string}\n * @default ''\n * */\n @Prop() subTitle: string;\n\n /**\n * Slider Id, if not provided will be generated automatically\n * @type {string}\n * @default ''\n * */\n @Prop() sliderId: string;\n\n /**\n * Display 'ALL' URL\n * @type {string}\n * @default ''\n * */\n @Prop() displayAllUrl: string;\n\n /**\n * autoplay option for products slider\n */\n @Prop({ mutable: true }) autoplay: boolean\n\n /**\n * Source of the products, if api will get the products from the API, if json will get the products from the products prop\n * @type {string}\n * @default ''\n * */\n @Prop({\n reflect: true,\n mutable: true\n }) source: 'categories' | 'latest' | 'related' | 'brands' | 'json' | 'tags' | 'selected' | 'offers' | 'landing-page';\n\n /**\n * The source value, cloud be different values as following:\n * - array of ids when `source` in ['categories', 'brands', 'tags', 'selected']\n * - products payload when `source` = 'json'\n * - product_id when `source` = 'related'\n *\n * @type {string}\n * */\n @Prop() sourceValue: string;\n\n /**\n * Limit for number of products in the list.\n */\n @Prop({ mutable: true }) limit: number;\n\n\n @State() productsData: any;\n @State() isReady: boolean;\n @State() sourceValueIsValid: boolean;\n @State() hasCustomComponent: boolean;\n @State() apiUrl: string = '';\n @State() parsedSourceValue: any;\n\n private getItemHTML(product) {\n if (this.hasCustomComponent) {\n return <div class=\"s-products-slider-card\">\n <custom-salla-product-card product={product} source={this.getSource()} source-value={this.getSourceValue()} />\n </div>;\n }\n\n return <div class=\"s-products-slider-card\">\n <salla-product-card\n show-quantity={this.getSource() == 'landing-page'}\n hide-add-btn={this.getSource() == 'landing-page'}\n shadow-on-hover={true}\n product={product} />\n </div>;\n }\n\n\n\n private canRender() {\n return this.sourceValueIsValid && this.isReady;\n }\n\n componentWillLoad() {\n if (this.source === 'json') {\n this.productsData = this.getSourceValue();\n this.isReady = true\n return;\n }\n return this.fetchProducts();\n\n }\n\n private fetchProducts() {\n return salla.api.withoutNotifier(() => \n salla.product.api.fetch({\n source: this.getSource(),\n source_value: this.getSourceValue(),\n limit: this.limit,\n }).then(res => {\n this.productsData = res.data\n this.isReady = true\n salla.event.emit('salla-products-slider::products.fetched', res.data);\n }).catch(() => {\n // TODO: Find the real issue and fix it\n salla.log('Request headers', salla.api.getHeaders());\n setTimeout(() => this.fetchProducts(), 1000);\n })\n )\n }\n private getSource() {\n return Helper.getProductsSource(this.source);\n }\n\n private getSourceValue() {\n return Helper.getProductsSourceValue(this.source, this.sourceValue);\n }\n\n render() {\n if ((this.getSource() == 'related' && !salla.config.get('store.settings.product.related_products_enabled')) || !this.canRender()) {\n return;\n }\n return (\n <Host class=\"s-products-slider-wrapper\">\n <salla-slider\n class=\"s-products-slider-slider\"\n id={this.sliderId || `s-products-slider-${Math.random().toString(36).substr(2, 9)}`}\n auto-play={this.autoplay}\n type=\"carousel\"\n block-title={this.blockTitle}\n block-subTitle={this.subTitle}\n display-all-url={this.displayAllUrl}\n >\n <div slot=\"items\">\n {this.productsData?.map(product => this.getItemHTML(product))}\n </div>\n </salla-slider>\n </Host>\n );\n }\n\n}\n"]}
1
+ {"version":3,"file":"salla-products-slider.js","sourceRoot":"","sources":["../../../src/components/salla-products-slider/salla-products-slider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, Prop, Element, State } from '@stencil/core';\nimport Helper from '../../Helpers/Helper';\n@Component({\n tag: 'salla-products-slider',\n styleUrl: 'salla-products-slider.scss'\n})\n\n//todo:: extends this component from salla-products-list or the opposite\nexport class SallaProductsSlider {\n private isSourceWithoutValue() {\n return ['offers', 'latest', 'sales'].includes(this.getSource());\n }\n\n @Element() host: HTMLElement;\n //todo:: support limit, default =10, make sure that maximum is 32,\n\n /**\n * Title of the block - works only if slider is true\n * @type {string}\n * @default ''\n * */\n @Prop() blockTitle: string;\n\n /**\n * Sub title of the block - works only if slider is true\n * @type {string}\n * @default ''\n * */\n @Prop() subTitle: string;\n\n /**\n * Slider Id, if not provided will be generated automatically\n * @type {string}\n * @default ''\n * */\n @Prop() sliderId: string;\n\n /**\n * Display 'ALL' URL\n * @type {string}\n * @default ''\n * */\n @Prop() displayAllUrl: string;\n\n /**\n * autoplay option for products slider\n */\n @Prop({ mutable: true }) autoplay: boolean\n\n /**\n * Source of the products, if api will get the products from the API, if json will get the products from the products prop\n * @type {string}\n * @default ''\n * */\n @Prop({\n reflect: true,\n mutable: true\n }) source: 'categories' | 'latest' | 'related' | 'brands' | 'json' | 'tags' | 'selected' | 'offers' | 'landing-page';\n\n /**\n * The source value, cloud be different values as following:\n * - array of ids when `source` in ['categories', 'brands', 'tags', 'selected']\n * - products payload when `source` = 'json'\n * - product_id when `source` = 'related'\n *\n * @type {string}\n * */\n @Prop() sourceValue: string;\n\n /**\n * Limit for number of products in the list.\n */\n @Prop({ mutable: true }) limit: number;\n\n\n @State() productsData: any;\n @State() isReady: boolean;\n @State() sourceValueIsValid: boolean;\n @State() hasCustomComponent: boolean;\n @State() apiUrl: string = '';\n @State() parsedSourceValue: any;\n\n private getItemHTML(product) {\n if (this.hasCustomComponent) {\n return <div class=\"s-products-slider-card\">\n <custom-salla-product-card product={product} source={this.getSource()} source-value={this.getSourceValue()} />\n </div>;\n }\n\n return <div class=\"s-products-slider-card\">\n <salla-product-card\n show-quantity={this.getSource() == 'landing-page'}\n hide-add-btn={this.getSource() == 'landing-page'}\n shadow-on-hover={true}\n product={product} />\n </div>;\n }\n\n\n\n private canRender() {\n return this.sourceValueIsValid && this.isReady;\n }\n componentWillLoad() {\n return Helper.onSallaReadyPromise(() => {\n this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());\n if (!this.sourceValueIsValid) {\n salla.logger.warn(`source-value prop is required for source [${\n this.getSource()\n }]`);\n return;\n }\n this.hasCustomComponent = !!customElements.get('custom-salla-product-card');\n\n if (this.source === 'json') {\n this.productsData = this.getSourceValue();\n this.isReady = true\n return;\n }\n return Helper.fetchProducts(this.getSource(), this.getSourceValue(), this.limit).then(res => {\n this.productsData = res.data\n this.isReady = true\n salla.event.emit('salla-products-slider::products.fetched', res.data);\n });\n });\n }\n\n private getSource() {\n return Helper.getProductsSource(this.source);\n }\n\n private getSourceValue() {\n return Helper.getProductsSourceValue(this.source, this.sourceValue);\n }\n\n render() {\n if ((this.getSource() == 'related' && !salla.config.get('store.settings.product.related_products_enabled')) || !this.canRender()) {\n return;\n }\n return (\n <Host class=\"s-products-slider-wrapper\">\n <salla-slider\n class=\"s-products-slider-slider\"\n id={this.sliderId || `s-products-slider-${Math.random().toString(36).substr(2, 9)}`}\n auto-play={this.autoplay}\n type=\"carousel\"\n block-title={this.blockTitle}\n block-subTitle={this.subTitle}\n display-all-url={this.displayAllUrl}\n >\n <div slot=\"items\">\n {this.productsData?.map(product => this.getItemHTML(product))}\n </div>\n </salla-slider>\n </Host>\n );\n }\n\n}\n"]}
@@ -94,6 +94,20 @@ class Helper {
94
94
  // Return page id as default value
95
95
  return salla.config.get('page.id');
96
96
  }
97
+ /**
98
+ * We needed this function to help us avoid requesting the products list before salla is ready,
99
+ * was causing a strange issues in live for the bad connections ex: not loading the dom, requesting api without storeIdentefire
100
+ */
101
+ onSallaReadyPromise(callback) {
102
+ return new Promise((resolve) => salla.onReady(() => resolve(callback())));
103
+ }
104
+ /**
105
+ *
106
+ * let's make sure to send the request only when salla is ready
107
+ */
108
+ fetchProducts(source, source_value, limit) {
109
+ return this.onSallaReadyPromise(() => salla.product.api.fetch({ source: source, source_value: source_value, limit: limit }));
110
+ }
97
111
  }
98
112
  const Helper$1 = new Helper;
99
113
 
@@ -1 +1 @@
1
- {"file":"Helper.js","mappings":"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","names":[],"sources":["./src/Helpers/Helper.ts"],"sourcesContent":["//TODO::reduce it to 10\nsalla.event.setMaxListeners(100);\n\nclass Helper {\n private debounce_: any;\n\n toggleElementClassIf(element, classes1, classes2, callback) {\n classes1 = Array.isArray(classes1) ? classes1 : classes1.split(' ');\n classes2 = Array.isArray(classes2) ? classes2 : classes2.split(' ');\n let isClasses1 = callback(element);\n element?.classList.remove(...(isClasses1 ? classes2 : classes1));\n element?.classList.add(...(isClasses1 ? classes1 : classes2));\n return this;\n }\n\n toggleClassIf(selector, classes1, classes2, callback) {\n document.querySelectorAll(selector).forEach(element => this.toggleElementClassIf(element, classes1, classes2, callback));\n return this;\n }\n\n isValidEmail(email) {\n const re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(String(email).toLowerCase());\n }\n\n filterEmojies(text) {\n var characterFilter = /(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\u0023-\\u0039]\\ufe0f?\\u20e3|\\u3299|\\u3297|\\u303d|\\u3030|\\u24c2|\\ud83c[\\udd70-\\udd71]|\\ud83c[\\udd7e-\\udd7f]|\\ud83c\\udd8e|\\ud83c[\\udd91-\\udd9a]|\\ud83c[\\udde6-\\uddff]|\\ud83c[\\ude01-\\ude02]|\\ud83c\\ude1a|\\ud83c\\ude2f|\\ud83c[\\ude32-\\ude3a]|\\ud83c[\\ude50-\\ude51]|\\u203c|\\u2049|[\\u25aa-\\u25ab]|\\u25b6|\\u25c0|[\\u25fb-\\u25fe]|\\u00a9|\\u00ae|\\u2122|\\u2139|\\ud83c\\udc04|[\\u2600-\\u26FF]|\\u2b05|\\u2b06|\\u2b07|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u231a|\\u231b|\\u2328|\\u23cf|[\\u23e9-\\u23f3]|[\\u23f8-\\u23fa]|\\ud83c\\udccf|\\u2934|\\u2935|[\\u2190-\\u21ff])/g;\n return text.replace(characterFilter, \"\");\n }\n\n debounce(fn, ...data) {\n if (!this.debounce_) {\n this.debounce_ = salla.helpers.debounce((callback, ...innerData) => callback(...innerData), 500);\n }\n //@ts-ignore\n return this.debounce_(fn, ...data);\n }\n\n getProductsSource(source) {\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 'components.most_sales_products': 'sales',//temporary, delete it after two days from now\n }[source || salla.config.get('page.slug')] || source || 'latest';\n }\n\n getPageTitleForSource(source){\n \n source= {\n 'brands':'common.titles.brands',\n // 'categories':'',\n 'latest':'blocks.home.latest_products',\n 'offers':'common.titles.discounts',\n // 'search':'',\n // 'landing-page':'',\n // 'tags':'',\n 'sales':'common.titles.most_sales',\n }[source];\n\n return source ? salla.lang.get(source):'';\n }\n\n getProductsSourceValue(source, sourceValue) {\n const parsedSource = this.getProductsSource(source);\n\n // Validate if the source value is a valid JSON string\n let parsedSourceValue: any = null;\n if (sourceValue) {\n try {\n parsedSourceValue = JSON.parse(sourceValue);\n } catch (error) {\n console.error('Invalid JSON string in sourceValue:', error);\n }\n }\n\n // Handle different source types\n if (!['search', 'json', 'offers', 'latest', 'sales', 'related'].includes(parsedSource)) {\n\n if (Array.isArray(parsedSourceValue) && parsedSourceValue.length) {\n return parsedSourceValue;\n }\n \n if (Array.isArray(parsedSourceValue) && !parsedSourceValue.length){\n return '';\n }\n\n if (typeof parsedSourceValue === 'number') {\n return [parsedSourceValue];\n }\n\n if (!sourceValue && ['categories', 'tags', 'brands'].includes(source)) {\n return [salla.config.get('page.id')];\n }\n }\n\n // Return sourceValue if it exists and is a valid JSON object/array\n if (parsedSourceValue || sourceValue) {\n return parsedSourceValue || sourceValue;\n }\n\n if (parsedSource === 'search') {\n return new URLSearchParams(window.location.search).get('q') || '';\n }\n\n // Return page id as default value\n return salla.config.get('page.id');\n }\n}\n\nexport default new Helper;\n"],"version":3}
1
+ {"file":"Helper.js","mappings":"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","names":[],"sources":["./src/Helpers/Helper.ts"],"sourcesContent":["import { ProductResponse } from \"@salla.sa/twilight/types/api/product\";\n\n//TODO::reduce it to 10\nsalla.event.setMaxListeners(100);\n\nclass Helper {\n private debounce_: any;\n\n toggleElementClassIf(element, classes1, classes2, callback) {\n classes1 = Array.isArray(classes1) ? classes1 : classes1.split(' ');\n classes2 = Array.isArray(classes2) ? classes2 : classes2.split(' ');\n let isClasses1 = callback(element);\n element?.classList.remove(...(isClasses1 ? classes2 : classes1));\n element?.classList.add(...(isClasses1 ? classes1 : classes2));\n return this;\n }\n\n toggleClassIf(selector, classes1, classes2, callback) {\n document.querySelectorAll(selector).forEach(element => this.toggleElementClassIf(element, classes1, classes2, callback));\n return this;\n }\n\n isValidEmail(email) {\n const re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(String(email).toLowerCase());\n }\n\n filterEmojies(text) {\n var characterFilter = /(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\u0023-\\u0039]\\ufe0f?\\u20e3|\\u3299|\\u3297|\\u303d|\\u3030|\\u24c2|\\ud83c[\\udd70-\\udd71]|\\ud83c[\\udd7e-\\udd7f]|\\ud83c\\udd8e|\\ud83c[\\udd91-\\udd9a]|\\ud83c[\\udde6-\\uddff]|\\ud83c[\\ude01-\\ude02]|\\ud83c\\ude1a|\\ud83c\\ude2f|\\ud83c[\\ude32-\\ude3a]|\\ud83c[\\ude50-\\ude51]|\\u203c|\\u2049|[\\u25aa-\\u25ab]|\\u25b6|\\u25c0|[\\u25fb-\\u25fe]|\\u00a9|\\u00ae|\\u2122|\\u2139|\\ud83c\\udc04|[\\u2600-\\u26FF]|\\u2b05|\\u2b06|\\u2b07|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u231a|\\u231b|\\u2328|\\u23cf|[\\u23e9-\\u23f3]|[\\u23f8-\\u23fa]|\\ud83c\\udccf|\\u2934|\\u2935|[\\u2190-\\u21ff])/g;\n return text.replace(characterFilter, \"\");\n }\n\n debounce(fn, ...data) {\n if (!this.debounce_) {\n this.debounce_ = salla.helpers.debounce((callback, ...innerData) => callback(...innerData), 500);\n }\n //@ts-ignore\n return this.debounce_(fn, ...data);\n }\n\n getProductsSource(source) {\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 'components.most_sales_products': 'sales',//temporary, delete it after two days from now\n }[source || salla.config.get('page.slug')] || source || 'latest';\n }\n\n getPageTitleForSource(source){\n \n source= {\n 'brands':'common.titles.brands',\n // 'categories':'',\n 'latest':'blocks.home.latest_products',\n 'offers':'common.titles.discounts',\n // 'search':'',\n // 'landing-page':'',\n // 'tags':'',\n 'sales':'common.titles.most_sales',\n }[source];\n\n return source ? salla.lang.get(source):'';\n }\n\n getProductsSourceValue(source, sourceValue) {\n const parsedSource = this.getProductsSource(source);\n\n // Validate if the source value is a valid JSON string\n let parsedSourceValue: any = null;\n if (sourceValue) {\n try {\n parsedSourceValue = JSON.parse(sourceValue);\n } catch (error) {\n console.error('Invalid JSON string in sourceValue:', error);\n }\n }\n\n // Handle different source types\n if (!['search', 'json', 'offers', 'latest', 'sales', 'related'].includes(parsedSource)) {\n\n if (Array.isArray(parsedSourceValue) && parsedSourceValue.length) {\n return parsedSourceValue;\n }\n \n if (Array.isArray(parsedSourceValue) && !parsedSourceValue.length){\n return '';\n }\n\n if (typeof parsedSourceValue === 'number') {\n return [parsedSourceValue];\n }\n\n if (!sourceValue && ['categories', 'tags', 'brands'].includes(source)) {\n return [salla.config.get('page.id')];\n }\n }\n\n // Return sourceValue if it exists and is a valid JSON object/array\n if (parsedSourceValue || sourceValue) {\n return parsedSourceValue || sourceValue;\n }\n\n if (parsedSource === 'search') {\n return new URLSearchParams(window.location.search).get('q') || '';\n }\n\n // Return page id as default value\n return salla.config.get('page.id');\n }\n\n /**\n * We needed this function to help us avoid requesting the products list before salla is ready,\n * was causing a strange issues in live for the bad connections ex: not loading the dom, requesting api without storeIdentefire\n */\n onSallaReadyPromise(callback): Promise<any>{\n return new Promise((resolve)=>salla.onReady(() => resolve(callback())));\n }\n\n /**\n * \n * let's make sure to send the request only when salla is ready\n */\n fetchProducts(source, source_value, limit): Promise<ProductResponse.lists>\n {\n return this.onSallaReadyPromise(()=>salla.product.api.fetch({source:source, source_value:source_value, limit:limit}));\n }\n}\n\nexport default new Helper;\n"],"version":3}
@@ -36,27 +36,6 @@ const SallaProductsList$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLE
36
36
  this.parsedFilters = undefined;
37
37
  }
38
38
  connectedCallback() {
39
- salla.onReady(() => {
40
- this.hasCustomComponent = !!customElements.get('custom-salla-product-card');
41
- this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());
42
- this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource());
43
- try {
44
- let searchParams = new URLSearchParams(window.location.search);
45
- this.sortBy = this.sortBy || searchParams.get('sort') || searchParams.get('by');
46
- let filters = searchParams.get('filters');
47
- this.parsedFilters = filters ? JSON.parse(decodeURIComponent(filters)) : {};
48
- }
49
- catch (e) {
50
- salla.logger.warn('failed to get filters from url', e.message);
51
- }
52
- this.buildNextPageUrl();
53
- this.createStatusDom();
54
- this.isReady = true;
55
- });
56
- if (!this.sourceValueIsValid) {
57
- salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);
58
- return;
59
- }
60
39
  salla.event.on('salla-filters::changed', filters => this.setFilters(filters));
61
40
  }
62
41
  /**
@@ -195,25 +174,6 @@ const SallaProductsList$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLE
195
174
  getSourceValue() {
196
175
  return Helper.getProductsSourceValue(this.source, this.sourceValue);
197
176
  }
198
- fetchProducts() {
199
- salla.product.api.fetch({
200
- source: this.getSource(),
201
- source_value: this.getSourceValue(),
202
- limit: this.limit
203
- })
204
- .then(res => {
205
- if (!res.data.length) {
206
- this.showPlaceholder = true;
207
- this.loading(false);
208
- return;
209
- }
210
- this.handleResponse(res).forEach(card => this.wrapper.append(card));
211
- }).catch(() => {
212
- // TODO: Find the real issue and fix it
213
- salla.log('Request headers', salla.api.getHeaders());
214
- setTimeout(() => this.fetchProducts(), 1000);
215
- });
216
- }
217
177
  initiateInfiniteScroll() {
218
178
  var _a, _b, _c;
219
179
  if (!this.hasInfiniteScroll) {
@@ -249,15 +209,61 @@ const SallaProductsList$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLE
249
209
  });
250
210
  salla.onReady(() => salla.infiniteScroll.loadNextPage(this.infiniteScroll));
251
211
  }
212
+ componentWillLoad() {
213
+ return Helper.onSallaReadyPromise(() => {
214
+ this.hasCustomComponent = !!customElements.get('custom-salla-product-card');
215
+ this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());
216
+ this.hasInfiniteScroll = !['json', 'selected', 'related', 'landing-page'].includes(this.getSource()) && !this.limit;
217
+ try {
218
+ let searchParams = new URLSearchParams(window.location.search);
219
+ this.sortBy = this.sortBy || searchParams.get('sort') || searchParams.get('by');
220
+ let filters = searchParams.get('filters');
221
+ this.parsedFilters = filters ? JSON.parse(decodeURIComponent(filters)) : {};
222
+ }
223
+ catch (e) {
224
+ salla.logger.warn('failed to get filters from url', e.message);
225
+ }
226
+ this.buildNextPageUrl();
227
+ this.createStatusDom();
228
+ this.isReady = true;
229
+ if (!this.sourceValueIsValid) {
230
+ salla.logger.warn(`source-value prop is required for source [${this.getSource()}]`);
231
+ return;
232
+ }
233
+ if (this.hasInfiniteScroll) {
234
+ return;
235
+ }
236
+ // Handle json source
237
+ if (this.getSource() === 'json') {
238
+ if (!this.getSourceValue().length) {
239
+ this.showPlaceholder = true;
240
+ return;
241
+ }
242
+ this.getSourceValue().map(product => this.wrapper.append(this.getItemHTML(product)));
243
+ return;
244
+ }
245
+ // Handle selected source
246
+ if (this.getSource() === 'selected' && !this.getSourceValue().length) {
247
+ this.showPlaceholder = true;
248
+ return;
249
+ }
250
+ return Helper.fetchProducts(this.getSource(), this.getSourceValue(), this.limit).then(res => {
251
+ if (!res.data.length) {
252
+ this.showPlaceholder = true;
253
+ this.loading(false);
254
+ return;
255
+ }
256
+ this.handleResponse(res).forEach(card => this.wrapper.append(card));
257
+ });
258
+ });
259
+ }
252
260
  canRender() {
253
261
  return this.sourceValueIsValid && this.isReady;
254
262
  }
255
263
  render() {
256
- salla.log('render: before can render');
257
264
  if (!this.canRender()) {
258
265
  return '';
259
266
  }
260
- salla.log('render: after can render');
261
267
  if (this.showPlaceholder) {
262
268
  return h("div", { class: "s-products-list-placeholder" }, h("span", { innerHTML: ShoppingBag }), h("p", null, this.placeholderText));
263
269
  }
@@ -269,30 +275,7 @@ const SallaProductsList$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLE
269
275
  }, ref: wrapper => this.wrapper = wrapper })));
270
276
  }
271
277
  componentDidLoad() {
272
- salla.log('component did load before can render');
273
- if (!this.canRender()) {
274
- return;
275
- }
276
- salla.log('component did load after can render');
277
- // Handle json source
278
- if (this.getSource() === 'json') {
279
- if (!this.getSourceValue().length) {
280
- this.showPlaceholder = true;
281
- return;
282
- }
283
- this.getSourceValue().map(product => this.wrapper.append(this.getItemHTML(product)));
284
- return;
285
- }
286
- // Handle selected source
287
- if (this.getSource() === 'selected' || this.getSource() === 'landing-page') {
288
- if (this.getSource() === 'selected' && !this.getSourceValue().length) {
289
- this.showPlaceholder = true;
290
- return;
291
- }
292
- this.fetchProducts();
293
- return;
294
- }
295
- this.init();
278
+ this.hasInfiniteScroll && this.init();
296
279
  }
297
280
  init() {
298
281
  this.initiateInfiniteScroll();