@salla.sa/twilight 2.14.345 → 2.14.346
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/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/lib/init.js"],"sourcesContent":["import Salla from \"@salla.sa/base\";\n\nexport default class Init {\n /**\n * @param {TwilightConfig} config\n */\n constructor(config) {\n //this case happens when watch twilight-components😌\n if (Salla.status === 'ready') {\n salla.log(\"Trying to re-initiate Salla, while its status === 'ready'!\");\n return;\n }\n\n if (!config) {\n this.setSallaReady(config);\n return\n }\n\n // todo :: cleanup events before the merge\n Salla.config.merge(config);\n\n\n //this for edge case, probably because of cache, cusing returning the store domain on preview mode instead of the salla with username url\n if(['salla.sa', 'salla.group'].includes(location.hostname) && !Salla.config.get('store.url')?.includes(location.hostname) && Salla.config.get('store.username')){\n Salla.config.set('store.url', window.location.origin + \"/\" + Salla.config.get('store.username'));\n }\n\n config?.events && Salla.event.dispatchEvents(config?.events);\n\n if (config._token) {\n salla.api.setHeader(\"X-CSRF-TOKEN\", config._token);\n }\n\n if (window.self === window.top) {\n this.injectMaintenanceAlert();\n this.injectThemePreviewAlert();\n }\n this.injectTemplateStoreAlert();\n this.injectAppInstallAlert();\n this.applyContentCopyright();\n this.injectEditAlert();\n\n if (config?.user?.language_code) {\n salla.lang.setLocale(config?.user?.language_code);\n }\n\n //todo:: move it to its class, call it after listening the event\n salla.lang.loadStoreTranslations();\n\n this.setSallaReady(config);\n this.afterInit();\n }\n\n afterInit() {\n if (!Salla.url.is_page('product.single') || !Salla.config.isGuest()) {\n return;\n }\n //this a patch until I find time to debug about reported issue: https://sallaops.youtrack.cloud/issue/SP-10049\n window.addEventListener('mini-checkout::before-init', (event) => {\n event.preventDefault();\n Salla.event.emit('login::open');\n });\n }\n\n applyContentCopyright() {\n if (!Salla.config.get('store.settings.content_copyright')) {\n return;\n }\n\n // Helper to check if element is an input\n const isInputElement = (element) => {\n if (!element) return false;\n const tagName = element.tagName?.toLowerCase();\n return tagName === 'input' || tagName === 'textarea';\n };\n\n // Common event prevention (excluding inputs)\n const preventEvents = ['contextmenu', 'selectstart', 'copy'];\n preventEvents.forEach((event) => {\n document.addEventListener(event, (e) => {\n if (!isInputElement(e.target)) {\n e.preventDefault();\n }\n });\n });\n\n // Prevent common dev tools shortcuts\n document.addEventListener('keydown', (e) => {\n const key = e.key.toLowerCase();\n const blockedCombos = (\n key === 'f12' ||\n (e.ctrlKey && e.shiftKey && ['i', 'j', 'c'].includes(key)) ||\n (e.ctrlKey && key === 'u')\n );\n if (blockedCombos) {\n e.preventDefault();\n e.stopPropagation();\n }\n });\n\n // Inject protection styles (excluding inputs)\n const style = document.createElement('style');\n style.textContent = `\n body {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n input, textarea {\n -webkit-touch-callout: auto;\n -webkit-user-select: auto;\n -moz-user-select: auto;\n -ms-user-select: auto;\n user-select: auto;\n }\n img {\n pointer-events: none;\n -webkit-user-drag: none;\n }\n `;\n document.head.appendChild(style);\n }\n\n injectMaintenanceAlert() {\n if (!salla.config.get('maintenance')) {\n return;\n }\n\n document.body.classList.add('has-maintenance-bar');\n if (document.querySelector('salla-maintenance-alert')) {\n salla.logger.warn('salla-maintenance-alert element Existed before!');\n return;\n }\n\n salla.lang.onLoaded(() => document.body.prepend(document.createElement('salla-maintenance-alert')));\n }\n\n injectTemplateStoreAlert() {\n if (!salla.config.get('store.template')) {\n return;\n }\n\n document.body.classList.add('has-bottom-alert');\n if (document.querySelector('salla-bottom-alert')) {\n salla.logger.warn('salla-bottom-alert element Existed before!');\n return;\n }\n\n salla.lang.onLoaded(() => document.body.append(document.createElement('salla-bottom-alert')));\n }\n\n injectAppInstallAlert() {\n if (!salla.config.get('store.app_install_prompt') || !salla.config.get('store.apps') || salla.storage.get('app_install_prompt_disabled') || salla.config.isMobileApp()) {\n return;\n }\n\n document.body.classList.add('has-app-install-alert');\n if (document.querySelector('salla-app-install-alert')) {\n salla.logger.warn('salla-app-install-alert element Existed before!');\n return;\n }\n\n salla.lang.onLoaded(() => document.body.append(document.createElement('salla-app-install-alert')));\n }\n injectThemePreviewAlert() {\n if (salla.config.get('theme.mode') !== 'preview') {\n return;\n }\n document.body.classList.add('has-preview-bar');\n if (document.querySelector('#s-theme_preview_bar')) {\n salla.logger.warn('#s-theme_preview_bar element Existed before!');\n return;\n }\n salla.lang.onLoaded(() => {\n let alertElement = document.createElement('div');\n alertElement.id = 's-theme_preview_bar';\n alertElement.setAttribute('style', 'display: flex; justify-content: space-between; text-align: center; background-color: #232323; color: #fff; padding: 10px; font-size: 0.875rem; line-height: 1.25rem; position: relative;');\n alertElement.innerHTML = `\n <div style=\"display:flex; align-items:center;\">\n <img width=\"32\" src=\"https://cdn.salla.network/images/logo/logo-light.svg\">\n <span style=\"margin:0 10px;\">${salla.lang.get('blocks.header.preview_mode')}: <span style=\"background:rgba(255,255,255,0.25);border-radius:15px; padding:2px 15px 4px\">${salla.config.get('theme.name')}</span></span>\n </div>\n <a href=\"${salla.url.get('preview_theme/cancel/preview')}\" style=\"line-height:32px; width:32px;\"><i class=\"sicon-cancel\"></i></a>\n `;\n document.body.prepend(alertElement);\n });\n }\n\n /**\n * @deprecated\n */\n injectEditAlert() {\n let edit = salla.config.get('edit');\n if (!edit) {\n return;\n }\n if (document.querySelector('#s-edit-alert')) {\n salla.logger.warn('#s-edit-alert element Existed before!');\n return;\n }\n salla.lang.onLoaded(() => {\n let alertElement = document.createElement('div');\n alertElement.id = 's-edit-alert';\n alertElement.innerHTML = `\n <a href=\"${edit}\" style=\"display:block; background-color:${salla.config.get('theme.color.primary', '#5cd5c4')}; color:${salla.config.get('theme.color.reverse', '#fff')}; padding: 10px; text-align:center; font-size: 0.875rem; line-height: 1.25rem;\">\n <i class=\"sicon-edit\"></i> \n ${salla.lang.get('pages.products.quick_edit')}\n </a>\n `;\n document.body.prepend(alertElement);\n });\n }\n\n /**\n * Link Action Of forms & links that have '.ajax' class.\n *\n * @param {Event} event\n * @param {Element} element\n */\n handleElementAjaxRequest(event, element) {\n if (!(element instanceof HTMLFormElement || element instanceof HTMLAnchorElement)) {\n salla.logger.warn('trying to call ajax from non Element!!');\n return false;\n }\n event.preventDefault();\n\n // todo :: support async to allow for complex logic before the submit which take a time\n let data = element.getAjaxFormData(event);\n let method = data.method ? data.method.toLowerCase() : undefined;\n salla.api.request(data.url, data.formData, method)\n .then(response => {\n //instead of passing all axios object, we will pass response data only\n if (response.data && response.request) {\n response = response.data;\n }\n salla.api.handleAfterResponseActions(response);\n this.callAjaxEvent(data.events.success, response, data.formData);\n return response;\n })\n .catch(error => {\n salla.api.handleErrorResponse(error);\n this.callAjaxEvent(data.events.fail, error, data.formData);\n throw error;\n });\n }\n\n callAjaxEvent(event, response, formData) {\n if (!event) {\n return;\n }\n\n if (formData instanceof FormData) {\n const parameters = {};\n Array.from(formData.entries()).forEach(function (data) {\n parameters[data[0]] = data[1];\n });\n formData = parameters;\n }\n\n if (window[event]) {\n window[event](response, formData);\n return;\n }\n\n salla.event.dispatch(event, response, formData);\n }\n\n setSallaReady(config) {\n this.storeUTMs();\n //to avoid firing onReady before inject api requests headers\n Salla.event.emitAsync('twilight::before.ready', config)\n Salla.status = 'ready';\n Salla.event.dispatch('twilight::initiated', config);\n window.dispatchEvent(new CustomEvent('twilight::initiated', { detail: config }));\n }\n\n storeUTMs() {\n // Mapping of CLICKID parameters to their respective sources\n const otherUTMSources = {fbclid: 'facebook', gad_source: 'google', ttclid: 'tiktok', twclid: 'twitter', scid: 'snapchat', sccid: 'snapchat'};\n const otherUTMs = Object.keys(otherUTMSources);\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', ...otherUTMs];\n const utmParams = {};\n const headerUTMs = {};\n\n // Extract all parameters and decode values\n window.location.search\n .replace('?', '')\n .split('&')\n .map(param => param.split('='))\n .filter(([key]) => utmKeys.includes(key.toLowerCase()))\n .forEach(([key, value]) => {\n let decodedValue = value || '';\n let decoded = false;\n \n try {\n decodedValue = decodeURIComponent(value);\n decoded = true;\n } catch (e) {\n Salla.log(\"Failed to decode UTM param:\", e);\n }\n \n utmParams[key.toLowerCase()] = decoded\n ? decodedValue.replace(/[^\\p{L}\\p{N}\\- ]/gu, ' ').replace(/ +/g, ' ').trim() //don't sanitize F- or d-F- because it's a flag for partners\n : decodedValue;\n });\n\n // Check if any CLICKID parameter is present\n const otherUTM = otherUTMs.find(utm => utmParams[utm]);\n\n // Auto-set utm_source when CLICKID exists\n if (!utmParams.utm_source && otherUTM) {\n utmParams.utm_source = otherUTMSources[otherUTM];\n\n utmParams.utm_campaign = utmParams.utm_campaign\n || `Using the CLICKID ${otherUTM} provided by ${utmParams.utm_source}`;\n\n utmParams.utm_term = utmParams.utm_term\n || `${otherUTM}: ${utmParams[otherUTM]}`;\n }\n\n // If utm_source still missing, stop\n if (!utmParams.utm_source) {\n return;\n }\n\n // Prepare final UTM headers (excluding CLICKID params)\n Object.entries(utmParams)\n .filter(([key]) => !otherUTMs.includes(key))\n .forEach(([key, value]) => {\n headerUTMs[`s-${key.replace('_', '-')}`] = value;\n });\n\n headerUTMs['s-utm-referrer'] = document.referrer;\n\n salla.storage.setWithTTL('s-utms', headerUTMs, 90 * 24 * 60);\n\n this.logUTMVisitData(headerUTMs);\n }\n\n async logUTMVisitData(utmParams) {\n const source = utmParams['s-utm-source'];\n const medium = utmParams['s-utm-medium'];\n const campaign = utmParams['s-utm-campaign'];\n const storeId = Salla.config.get('store.id');\n if (!utmParams || source !== 'affiliate' || !medium || !campaign) {\n return;\n }\n\n fetch(salla.config.get('affiliate.utm_url'), {\n method: 'POST',\n mode: 'cors',\n headers: {\n 'Content-Type': 'application/json',\n 's-utm-source': source,\n 's-utm-medium': medium,\n 's-utm-campaign': campaign,\n 's-store-id': storeId,\n },\n }).then(response => {\n if (response.ok) {\n const url = new URL(window.location.href);\n const perviousState = window.history.state;\n url.searchParams.delete('utm_source');\n url.searchParams.delete('utm_medium');\n url.searchParams.delete('utm_campaign');\n window.history.replaceState(perviousState, '', url);\n }\n });\n }\n}\n"],"names":["Init","constructor","config","_Salla$config$get","_config$user","Salla$1","status","_config$user2","merge","includes","location","hostname","get","set","window","origin","events","event","dispatchEvents","_token","salla","api","setHeader","self","top","this","injectMaintenanceAlert","injectThemePreviewAlert","injectTemplateStoreAlert","injectAppInstallAlert","applyContentCopyright","injectEditAlert","user","language_code","lang","setLocale","loadStoreTranslations","setSallaReady","afterInit","log","url","is_page","isGuest","addEventListener","preventDefault","emit","forEach","document","e","element","_element$tagName","tagName","toLowerCase","isInputElement","target","key","ctrlKey","shiftKey","stopPropagation","style","createElement","textContent","head","appendChild","body","classList","add","querySelector","logger","warn","onLoaded","prepend","append","storage","isMobileApp","alertElement","id","setAttribute","innerHTML","edit"],"mappings":"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"}
|