@salla.sa/twilight-components 2.14.24 → 2.14.25
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.
- package/dist/cjs/{Helper-8b706e72.js → Helper-56efb09e.js} +4 -2
- package/dist/cjs/Helper-56efb09e.js.map +1 -0
- package/dist/cjs/app-globals-9596263d.js.map +1 -1
- package/dist/cjs/salla-add-product-button_48.cjs.entry.js +1 -1
- package/dist/cjs/salla-add-product-button_48.cjs.entry.js.map +1 -1
- package/dist/cjs/salla-filters-widget.cjs.entry.js +1 -1
- package/dist/cjs/salla-filters.cjs.entry.js +1 -1
- package/dist/cjs/salla-notifications.cjs.entry.js +1 -1
- package/dist/cjs/salla-orders.cjs.entry.js +1 -1
- package/dist/cjs/salla-products-slider.cjs.entry.js +1 -1
- package/dist/cjs/salla-reviews.cjs.entry.js +1 -1
- package/dist/collection/Helpers/Helper.js +3 -1
- package/dist/collection/Helpers/Helper.js.map +1 -1
- package/dist/components/Helper.js +3 -1
- package/dist/components/Helper.js.map +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/salla-quick-buy2.js.map +1 -1
- package/dist/esm/{Helper-c5b72361.js → Helper-3025592f.js} +4 -2
- package/dist/esm/Helper-3025592f.js.map +1 -0
- package/dist/esm/app-globals-15e3c645.js.map +1 -1
- package/dist/esm/salla-add-product-button_48.entry.js +1 -1
- package/dist/esm/salla-add-product-button_48.entry.js.map +1 -1
- package/dist/esm/salla-filters-widget.entry.js +1 -1
- package/dist/esm/salla-filters.entry.js +1 -1
- package/dist/esm/salla-notifications.entry.js +1 -1
- package/dist/esm/salla-orders.entry.js +1 -1
- package/dist/esm/salla-products-slider.entry.js +1 -1
- package/dist/esm/salla-reviews.entry.js +1 -1
- package/dist/esm-es5/Helper-3025592f.js +5 -0
- package/dist/esm-es5/Helper-3025592f.js.map +1 -0
- package/dist/esm-es5/app-globals-15e3c645.js.map +1 -1
- package/dist/esm-es5/salla-add-product-button_48.entry.js +1 -1
- package/dist/esm-es5/salla-add-product-button_48.entry.js.map +1 -1
- package/dist/esm-es5/salla-filters-widget.entry.js +1 -1
- package/dist/esm-es5/salla-filters.entry.js +1 -1
- package/dist/esm-es5/salla-notifications.entry.js +1 -1
- package/dist/esm-es5/salla-orders.entry.js +1 -1
- package/dist/esm-es5/salla-products-slider.entry.js +1 -1
- package/dist/esm-es5/salla-reviews.entry.js +1 -1
- package/dist/twilight/{p-572be994.system.entry.js → p-00fea9e4.system.entry.js} +2 -2
- package/dist/twilight/p-05c5b251.js.map +1 -1
- package/dist/twilight/p-12acd128.js +5 -0
- package/dist/twilight/p-12acd128.js.map +1 -0
- package/dist/twilight/{p-900b41fb.entry.js → p-22c5fed4.entry.js} +2 -2
- package/dist/twilight/{p-900b41fb.entry.js.map → p-22c5fed4.entry.js.map} +1 -1
- package/dist/twilight/{p-6e0a235a.entry.js → p-29bb96eb.entry.js} +2 -2
- package/dist/twilight/{p-c8f14d8f.system.entry.js → p-2a65790e.system.entry.js} +2 -2
- package/dist/twilight/{p-012877f7.system.entry.js → p-31f62211.system.entry.js} +2 -2
- package/dist/twilight/p-3e698672.system.js.map +1 -1
- package/dist/twilight/{p-346b1d3f.system.entry.js → p-672e2d86.system.entry.js} +2 -2
- package/dist/twilight/p-7c8ac4aa.system.js +5 -0
- package/dist/twilight/p-7c8ac4aa.system.js.map +1 -0
- package/dist/twilight/{p-5f689d13.entry.js → p-8a1d8623.entry.js} +2 -2
- package/dist/twilight/{p-f07ec02a.entry.js → p-a0138c35.entry.js} +2 -2
- package/dist/twilight/{p-4bc35b2b.system.entry.js → p-a24650b3.system.entry.js} +2 -2
- package/dist/twilight/{p-f0bfbb14.system.entry.js → p-acdf56d4.system.entry.js} +2 -2
- package/dist/twilight/{p-f0bfbb14.system.entry.js.map → p-acdf56d4.system.entry.js.map} +1 -1
- package/dist/twilight/{p-1dcd7c3b.entry.js → p-b5c29a36.entry.js} +2 -2
- package/dist/twilight/{p-dc21b7de.entry.js → p-c3d862f6.entry.js} +2 -2
- package/dist/twilight/p-d2b0dbcd.system.js +1 -1
- package/dist/twilight/{p-24062fa1.system.entry.js → p-de44d734.system.entry.js} +2 -2
- package/dist/twilight/{p-e0b02e94.entry.js → p-f803b45f.entry.js} +2 -2
- package/dist/twilight/twilight.esm.js +1 -1
- package/package.json +5 -5
- package/dist/cjs/Helper-8b706e72.js.map +0 -1
- package/dist/esm/Helper-c5b72361.js.map +0 -1
- package/dist/esm-es5/Helper-c5b72361.js +0 -5
- package/dist/esm-es5/Helper-c5b72361.js.map +0 -1
- package/dist/twilight/p-9776f50d.system.js +0 -5
- package/dist/twilight/p-9776f50d.system.js.map +0 -1
- package/dist/twilight/p-b9c0ec80.js +0 -5
- package/dist/twilight/p-b9c0ec80.js.map +0 -1
- /package/dist/twilight/{p-572be994.system.entry.js.map → p-00fea9e4.system.entry.js.map} +0 -0
- /package/dist/twilight/{p-6e0a235a.entry.js.map → p-29bb96eb.entry.js.map} +0 -0
- /package/dist/twilight/{p-c8f14d8f.system.entry.js.map → p-2a65790e.system.entry.js.map} +0 -0
- /package/dist/twilight/{p-012877f7.system.entry.js.map → p-31f62211.system.entry.js.map} +0 -0
- /package/dist/twilight/{p-346b1d3f.system.entry.js.map → p-672e2d86.system.entry.js.map} +0 -0
- /package/dist/twilight/{p-5f689d13.entry.js.map → p-8a1d8623.entry.js.map} +0 -0
- /package/dist/twilight/{p-f07ec02a.entry.js.map → p-a0138c35.entry.js.map} +0 -0
- /package/dist/twilight/{p-4bc35b2b.system.entry.js.map → p-a24650b3.system.entry.js.map} +0 -0
- /package/dist/twilight/{p-1dcd7c3b.entry.js.map → p-b5c29a36.entry.js.map} +0 -0
- /package/dist/twilight/{p-dc21b7de.entry.js.map → p-c3d862f6.entry.js.map} +0 -0
- /package/dist/twilight/{p-24062fa1.system.entry.js.map → p-de44d734.system.entry.js.map} +0 -0
- /package/dist/twilight/{p-e0b02e94.entry.js.map → p-f803b45f.entry.js.map} +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Crafted with ❤ by Salla
|
|
3
|
+
*/
|
|
4
|
+
import{a as e}from"./p-5a803ecc.js";salla.event.setMaxListeners(100);class t{setIncludes(e){this.includes=e;return this}toggleElementClassIf(e,t,a,r){t=Array.isArray(t)?t:t.split(" ");a=Array.isArray(a)?a:a.split(" ");let n=r(e);e===null||e===void 0?void 0:e.classList.remove(...n?a:t);e===null||e===void 0?void 0:e.classList.add(...n?t:a);return this}toggleClassIf(e,t,a,r){document.querySelectorAll(e).forEach((e=>this.toggleElementClassIf(e,t,a,r)));return this}isValidEmail(e){const t=/^(([^<>()[\]\\.,;:\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,}))$/;return t.test(String(e).toLowerCase())}filterEmojies(e){var t=/(?:[\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;return e.replace(t,"")}debounce(e,...t){if(!this.debounce_){this.debounce_=salla.helpers.debounce(((e,...t)=>e(...t)),500)}return this.debounce_(e,...t)}getProductsSource(e){return{"brands.single":"brands","product.index":"categories","product.index.latest":"latest","product.index.offers":"offers","product.index.search":"search","customer.wishlist":"wishlist","landing-page":"landing-page","product.index.tag":"tags","product.index.sales":"sales","components.most_sales_products":"sales"}[e||salla.config.get("page.slug")]||e||"latest"}getPageTitleForSource(e){e={brands:"common.titles.brands",latest:"blocks.home.latest_products",offers:"common.titles.discounts",sales:"common.titles.most_sales"}[e];return e?salla.lang.get(e):""}getProductsSourceValue(e,t){const a=this.getProductsSource(e);let r=null;if(t){try{r=JSON.parse(t)}catch(e){console.error("Invalid JSON string in sourceValue:",e)}}if(!["search","json","offers","latest","sales","related"].includes(a)){if(Array.isArray(r)&&r.length){return r}if(Array.isArray(r)&&!r.length){return""}if(typeof r==="number"){return[r]}if(!t&&["categories","tags","brands"].includes(e)){return[salla.config.get("page.id")]}}if(r||t){return r||t}if(a==="search"){return new URLSearchParams(window.location.search).get("q")||""}return salla.config.get("page.id")}extractFiltersFromUrl(e){let t={};e.forEach(((e,a)=>{const r=a.match(/^filters\[(.*?)\](\[(.*?)\])?$/u);if(r){const a=r[1];const n=r[3];if(n){t[a]=t[a]||{};t[a][n]=e}else{t[a]=e}}else{const r=a.match(/^(.*?)$/u);if(r){t[r[1]]=e}}}));return t}injectExtraFieldsToResponse(e){if(!e||!this.includes)return e;const t=e.data.map((e=>e.id));return this.fetchImagesAndOptions(t).then((({data:t})=>this.injectOptionsAndImages(e.data,t))).then((()=>{if(!this.includes.includes("metadata")){return e}return salla.api.metadata.fetchValues("product",t).then((({data:t})=>e.data.map((e=>{e["metadata"]=t.find((t=>parseInt(t.entity_id)===parseInt(e.id)))})))).then((()=>e))}))}fetchImagesAndOptions(e){return this.productsIncludes().length?salla.api.product.fetchOptions(e,{with:this.productsIncludes()}):Promise.resolve({data:[]})}injectOptionsAndImages(e,t){return t.length?e.map((e=>{this.includes.filter((e=>e!=="metadata")).forEach((a=>{const r=t.find((t=>parseInt(t.id)===parseInt(e.id)));e[a]=r?r[a]:null}));return e})):null}productsIncludes(){var e;return(e=this.includes)===null||e===void 0?void 0:e.filter((e=>e!="metadata"))}parseJson(e){if(typeof e!=="string"){return e}try{return JSON.parse(e)}catch(e){salla.logger.error("Failed to parse includes as JSON:",e)}return null}getProductSchemaMarkupScript(e){var t,a;const r=document.createElement("script");r.type="application/ld+json";const n={"@context":"http://schema.org","@type":"Product",name:e===null||e===void 0?void 0:e.name,image:((t=e===null||e===void 0?void 0:e.image)===null||t===void 0?void 0:t.url)||(e===null||e===void 0?void 0:e.thumbnail),description:e===null||e===void 0?void 0:e.description,brand:{"@type":"Brand",logo:(a=e===null||e===void 0?void 0:e.brand)===null||a===void 0?void 0:a.logo},offers:{"@type":"Offer",price:e===null||e===void 0?void 0:e.price}};r.text=JSON.stringify(n);return r}createProductSchema(e,t){var a;let r={productID:`${e.id}`,"@type":"Product",name:e.name,url:e.url,image:e.image.url||e.image,description:e.description||e.subtitle||e.name,offers:{"@type":"Offer",url:e.url,priceCurrency:e.currency,price:e.price,itemCondition:"NewCondition",availability:e.is_available?"InStock":"OutOfStock",priceValidUntil:e.discount_ends||new Date((new Date).setDate((new Date).getDate()+7)).toISOString().split("T")[0],priceSpecification:{"@type":"PriceSpecification",price:e.regular_price,priceCurrency:e.currency,valueAddedTaxIncluded:e.is_taxable},seller:{"@type":"Organization",name:salla.config.get("store.name")}}};if((a=e.rating)===null||a===void 0?void 0:a.stars){r.aggregateRating={"@type":"AggregateRating",ratingValue:e.rating.stars,reviewCount:e.rating.count}}return{"@type":"ListItem",position:t,item:r}}generateProductSchema(e){const t="salla-product-schema-script";if(document.getElementById(t)){salla.logger.warn(`already added schema-script with id (${t})!`);return}const a=document.createElement("script");a.type="application/ld+json";a.id=t;const r={"@context":"https://schema.org","@type":"ItemList",name:salla.config.get("page.title"),itemListElement:e.map(((e,t)=>this.createProductSchema(e,t+1)))};a.textContent=JSON.stringify(r);document.head.appendChild(a)}formatDateFromString(e,t,a="en"){const r=new Date(e);const n={en:"Invalid Date",ar:"تاريخ غير صالح"};if(isNaN(r.getTime())){return n[a]}const u={en:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ar:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"]};const i={en:["January","February","March","April","May","June","July","August","September","October","November","December"],ar:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"]};const s=u[a][r.getDay()];const o=t(r.getDate(),a==="en");const d=i[a][r.getMonth()];const c=t(r.getFullYear(),a==="en");return`${s} ${o} ${d} ${c}`}copyToClipboard(e){var t=e.target.innerText;navigator.clipboard.writeText(t).then((()=>{console.log("Text copied to clipboard: "+t)})).catch((e=>{console.error("Unable to copy text to clipboard",e)}))}animateItems(t){if(!t)return;e({targets:t,opacity:[0,1],duration:1200,translateY:[20,0],delay:function(e,t){return t*100},easing:"easeOutExpo",complete:function(e){t.forEach((e=>{e.classList.add("animated")}))}})}createReviewObject(e){return{"@type":"Review",author:e.name,datePublished:e.date*1e3,description:e.content,reviewRating:{"@type":"Rating",bestRating:"5",ratingValue:"5",worstRating:"1"}}}generateReviewSchema(e){const t=document.createElement("script");t.type="application/ld+json";const a={"@context":"http://schema.org/","@type":"CollectionPage",name:"Category Name",description:"Description of the category",review:e.map((e=>this.createReviewObject(e)))};t.textContent=JSON.stringify(a);document.head.appendChild(t)}}const a=new t;export{a as H};
|
|
5
|
+
//# sourceMappingURL=p-12acd128.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["salla","event","setMaxListeners","Helper","setIncludes","includes","this","toggleElementClassIf","element","classes1","classes2","callback","Array","isArray","split","isClasses1","classList","remove","add","toggleClassIf","selector","document","querySelectorAll","forEach","isValidEmail","email","re","test","String","toLowerCase","filterEmojies","text","characterFilter","replace","debounce","fn","data","debounce_","helpers","innerData","getProductsSource","source","config","get","getPageTitleForSource","brands","latest","offers","sales","lang","getProductsSourceValue","sourceValue","parsedSource","parsedSourceValue","JSON","parse","error","console","length","URLSearchParams","window","location","search","extractFiltersFromUrl","searchParams","filters","value","key","matchesNested","match","filterName","nestedKey","matchesSimple","injectExtraFieldsToResponse","response","productIds","map","product","id","fetchImagesAndOptions","then","injectOptionsAndImages","api","metadata","fetchValues","find","meta","parseInt","entity_id","productsIncludes","fetchOptions","with","Promise","resolve","productList","newData","filter","field","foundProduct","prod","_a","parseJson","e","logger","getProductSchemaMarkupScript","scriptElement","createElement","type","jsonData","name","image","url","thumbnail","description","brand","logo","_b","price","stringify","createProductSchema","position","ProductSchema","productID","subtitle","priceCurrency","currency","itemCondition","availability","is_available","priceValidUntil","discount_ends","Date","setDate","getDate","toISOString","priceSpecification","regular_price","valueAddedTaxIncluded","is_taxable","seller","rating","stars","aggregateRating","ratingValue","reviewCount","count","item","generateProductSchema","schemaId","getElementById","warn","script","schema","itemListElement","indxe","textContent","head","appendChild","formatDateFromString","dateString","numberCb","dateObject","errors","en","ar","isNaN","getTime","daysOfWeek","months","dayOfWeek","getDay","dayOfMonth","month","getMonth","year","getFullYear","copyToClipboard","textToCopy","target","innerText","navigator","clipboard","writeText","log","catch","err","animateItems","items","anime","targets","opacity","duration","translateY","delay","_el","i","easing","complete","_anim","createReviewObject","reviewData","author","datePublished","date","content","reviewRating","bestRating","worstRating","generateReviewSchema","reviews","review","Helper$1"],"sources":["src/Helpers/Helper.ts"],"sourcesContent":["import { ProductDetail } from \"@salla.sa/twilight/types/api/product\";\nimport { Review } from \"../../src/components/salla-reviews/interfaces\";\nimport { Product as SallaProduct } from \"@salla.sa/twilight/types/common\";\nimport { ListItem, ItemList, Product as SchemaProduct, WithContext } from 'schema-dts';\nimport { Product } from '@salla.sa/twilight/types/common';\nimport anime from 'animejs';\n\n//TODO::reduce it to 10\nsalla.event.setMaxListeners(100);\n\nclass Helper {\n private debounce_: any;\n private includes;\n\n setIncludes(includes:string[]){\n this.includes = includes;\n return this;\n }\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 'customer.wishlist': 'wishlist',\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\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 extractFiltersFromUrl(searchParams) {\n let filters = {};\n searchParams.forEach((value, key) => {\n // Handle filters[xxx] format\n const matchesNested = key.match(/^filters\\[(.*?)\\](\\[(.*?)\\])?$/u);\n\n if (matchesNested) {\n const filterName = matchesNested[1];\n const nestedKey = matchesNested[3];\n\n if (nestedKey) {\n // Handle nested object\n filters[filterName] = filters[filterName] || {};\n filters[filterName][nestedKey] = value;\n } else {\n // Handle regular key\n filters[filterName] = value;\n }\n } else {\n // Handle simple key-value pairs\n const matchesSimple = key.match(/^(.*?)$/u);\n\n if (matchesSimple) {\n filters[matchesSimple[1]] = value;\n }\n }\n });\n return filters;\n }\n\n injectExtraFieldsToResponse( response: {data:Product[]}) {\n if (!response || !this.includes) return response;\n\n const productIds = response.data.map(product => product.id);\n\n return this.fetchImagesAndOptions(productIds)\n .then(({ data: product }) => this.injectOptionsAndImages(response.data, product))\n .then(() => {\n if(!this.includes.includes('metadata')){\n return response;\n }\n\n return salla.api.metadata.fetchValues('product', productIds)\n .then(({data}) => response.data.map(product => {\n //@ts-ignore\n product['metadata'] = data.find(meta => parseInt(meta.entity_id) === parseInt(product.id));\n }))\n .then(() => response);\n });\n }\n\n /**\n * This to make sure we will not request the options endpoint unless we have to.\n */\n fetchImagesAndOptions(productIds){\n return this.productsIncludes().length\n ? salla.api.product.fetchOptions(productIds, { with: this.productsIncludes() })\n : Promise.resolve({data:[]}); //fake the endpoint, to reduce unwanted query if developer wants metadata only\n }\n\n\n injectOptionsAndImages( productList: Product[], newData: Product[] ): Product[] {\n return newData.length\n ? productList.map(product => {\n this.includes\n .filter(field => field !== 'metadata')\n .forEach(field => {\n //@ts-ignore\n const foundProduct = newData.find((prod: Product) => parseInt(prod.id) === parseInt(product.id));\n product[field] = foundProduct ? foundProduct[field] : null; // Assign null or a default value if not found\n });\n return product;\n })\n :null;\n }\n\n productsIncludes(){\n return this.includes?.filter(field => field != 'metadata');\n }\n\n parseJson(includes: string | string[]): null | string[] {\n if (typeof includes !== 'string') {\n return includes;\n }\n try {\n return JSON.parse(includes);\n } catch (e) {\n salla.logger.error('Failed to parse includes as JSON:', e);\n }\n\n return null;\n }\n\n getProductSchemaMarkupScript(product: any): HTMLScriptElement {\n const scriptElement = document.createElement('script');\n scriptElement.type = 'application/ld+json';\n // TODO: This json object MIGHT need mode data or properties.\n const jsonData = {\n \"@context\": \"http://schema.org\",\n \"@type\": \"Product\",\n \"name\": product?.name,\n \"image\": product?.image?.url || product?.thumbnail,\n \"description\": product?.description,\n \"brand\": {\n \"@type\": \"Brand\",\n \"logo\": product?.brand?.logo\n },\n \"offers\": {\n \"@type\": \"Offer\",\n \"price\": product?.price\n }\n };\n scriptElement.text = JSON.stringify(jsonData);\n return scriptElement\n }\n\n createProductSchema(product: SallaProduct | ProductDetail, position: number): ListItem {\n let ProductSchema: SchemaProduct = {\n \"productID\": `${product.id}`,\n \"@type\": 'Product',\n \"name\": product.name,\n \"url\": product.url,\n \"image\": product.image.url || (product.image as string),\n \"description\": product.description || product.subtitle || product.name,\n \"offers\": {\n \"@type\": \"Offer\",\n \"url\": product.url,\n \"priceCurrency\": product.currency,\n \"price\": product.price,\n \"itemCondition\": \"NewCondition\",\n \"availability\": product.is_available ? \"InStock\" : \"OutOfStock\",\n //if there is no product.discount_ends, will set it to be valid until the end of this week\n \"priceValidUntil\": product.discount_ends || (new Date(new Date().setDate(new Date().getDate() + 7)).toISOString().split('T')[0]),\n \"priceSpecification\": {\n \"@type\": \"PriceSpecification\",\n \"price\": product.regular_price,\n \"priceCurrency\": product.currency,\n \"valueAddedTaxIncluded\": product.is_taxable,\n },\n \"seller\": {\n \"@type\": \"Organization\",\n \"name\": salla.config.get('store.name'),\n },\n }\n };\n //@ts-ignore\n if (product.rating?.stars) {\n ProductSchema.aggregateRating = {\n \"@type\": \"AggregateRating\",\n //@ts-ignore\n \"ratingValue\": product.rating.stars,\n \"reviewCount\": product.rating.count,\n };\n }\n\n\n return {\n \"@type\": \"ListItem\",\n \"position\": position,\n \"item\": ProductSchema,\n\n };\n }\n \n generateProductSchema(productList: Array<SallaProduct | ProductDetail>) {\n const schemaId = 'salla-product-schema-script';\n if (document.getElementById(schemaId)) {\n salla.logger.warn(`already added schema-script with id (${schemaId})!`)\n return;\n }\n\n const script = document.createElement('script');\n script.type = 'application/ld+json';\n script.id = schemaId;\n\n\n const schema: WithContext<ItemList> = {\n \"@context\": \"https://schema.org\",\n \"@type\": \"ItemList\",\n \"name\": salla.config.get('page.title'),\n \"itemListElement\": productList.map((product, indxe) => this.createProductSchema(product, indxe + 1)),\n };\n\n script.textContent = JSON.stringify(schema);\n document.head.appendChild(script);\n }\n\n /**\n * Format date in the form of `Monday 13 November 2023`\n */\n formatDateFromString(dateString: string, numberCb: Function, lang: string = 'en'): string {\n const dateObject = new Date(dateString);\n\n const errors = {\n en: \"Invalid Date\",\n ar: \"تاريخ غير صالح\"\n }\n\n if (isNaN(dateObject.getTime())) {\n return errors[lang];\n }\n\n const daysOfWeek = {\n en: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n ar: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت']\n };\n const months = {\n en: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n ar: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر']\n };\n\n const dayOfWeek = daysOfWeek[lang][dateObject.getDay()];\n const dayOfMonth = numberCb(dateObject.getDate(), lang === 'en');\n const month = months[lang][dateObject.getMonth()];\n const year = numberCb(dateObject.getFullYear(), lang === 'en');\n\n return `${dayOfWeek} ${dayOfMonth} ${month} ${year}`;\n }\n\n /**\n * Copy text into clipboard.\n * @param event \n */\n copyToClipboard(event) {\n // Get the text content from the clicked div\n var textToCopy = event.target.innerText;\n\n // Use the Clipboard API to copy text to the clipboard\n navigator.clipboard.writeText(textToCopy)\n .then(() => {\n console.log('Text copied to clipboard: ' + textToCopy);\n })\n .catch(err => {\n console.error('Unable to copy text to clipboard', err);\n });\n\n }\n\n animateItems(items: NodeListOf<Element>) {\n if (!items) return;\n anime({\n targets: items,\n opacity: [0, 1],\n duration: 1200,\n translateY: [20, 0],\n delay: function (_el, i) {\n return i * 100;\n },\n easing: 'easeOutExpo',\n complete: function (_anim) {\n items.forEach((item: Element) => {\n item.classList.add('animated');\n })\n }\n\n })\n }\n\n createReviewObject(reviewData: Review) {\n return {\n \"@type\": \"Review\",\n \"author\": reviewData.name,\n \"datePublished\": reviewData.date * 1000,\n \"description\": reviewData.content,\n \"reviewRating\": {\n \"@type\": \"Rating\",\n \"bestRating\": \"5\",\n \"ratingValue\": \"5\",\n \"worstRating\": \"1\"\n }\n };\n }\n\n generateReviewSchema(reviews: Array<Review>){\n const script = document.createElement('script');\n script.type = 'application/ld+json';\n\n\n const schema = {\n \"@context\": \"http://schema.org/\",\n \"@type\": \"CollectionPage\",\n \"name\": \"Category Name\", // TODO: check for the correct value here\n \"description\": \"Description of the category\", // TODO: here too\n \"review\": reviews.map((review) => this.createReviewObject(review))\n }\n\n script.textContent = JSON.stringify(schema);\n document.head.appendChild(script);\n }\n}\n\nexport default new Helper;\n"],"mappings":"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"}
|