From 2471e9f3e1fd93bb1f48233ae73cf7dba269f6bf Mon Sep 17 00:00:00 2001 From: Jordan Date: Tue, 21 Apr 2026 08:09:21 +0100 Subject: [PATCH] Create cmsApiInit.js --- template/layout_templates/cmsApiInit.js | 126 ++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 template/layout_templates/cmsApiInit.js diff --git a/template/layout_templates/cmsApiInit.js b/template/layout_templates/cmsApiInit.js new file mode 100644 index 0000000..1ac1846 --- /dev/null +++ b/template/layout_templates/cmsApiInit.js @@ -0,0 +1,126 @@ +class CmsApiClass { + constructor() { + this._traducciones = {}; + this.loadingTraducciones = false; + } + hook(hook, data, callback,options = {}) { + try { + if (!hook) throw new Error("No se ha definido el endpoint del hook"); + if (typeof data !== 'object' && typeof data !== 'null') throw new Error("Data no es un objeto, es un " + typeof data); + if(window.FORCE_BASE_DOMAIN && !hook.startsWith("http")) { + hook = window.FORCE_BASE_DOMAIN + hook; + } + return fetch(hook, { + method: 'post', + headers: new Headers({'X-Hooks-Token': hooksToken,'Content-Type': 'application/json', 'X-Acai-Accept-Language': language ? language : 'www'}), + body: JSON.stringify(data ? data : {}), + signal:options.signal + }).then(function (res) { + return res.json() + }).then(function (resJson) { + return typeof callback == 'function' ? callback(resJson) : resJson + }) + } catch (error) { + console.error(error); + Promise.resolve(false) + } + } + getSignal(signalName) { + if(!this.signals[signalName] || (this.signals[signalName].signal.aborted)) { + const controller = new AbortController(); + this.signals[signalName] = controller; + } + return this.signals[signalName]; + } + t_var(text) { + let slug = CmsApi.slugify(text); + if(this._traducciones[slug]) { + return this._traducciones[slug]; + } + + // Lo creamos con el texto pasado para evitar múltiples llamadas. + this._traducciones[slug] = text; + if (this.loadingTraducciones) return this._traducciones[slug]; + + this.loadingTraducciones = true; + // Enviamos a crear la traducción + var signal = this.getSignal('traducciones'); + let callback = (response) => { + this.loadingTraducciones = false; + if(response['success'] == true) { + this._traducciones = response['data']; + console.log("Traducciones cargadas"); + } else { + console.error('Problema al crear textos generales: ', response); + } + } + try { + + var datatoSendToHook = { clave: slug, valor: text}; + if (window.REMOTE_URL) datatoSendToHook.remote = window.REMOTE_URL; + + this.hook('/hooks/traducciones/', datatoSendToHook, + callback, + { + // signal:signal + }); + } catch { + console.error('Problema al crear textos generales: ', text); + } + + return this._traducciones[slug]; + } + translate(text) { + let slug = CmsApi.slugify(text); + + return new Promise((resolve, reject) => { + if(this._traducciones[slug]) { + return resolve(this._traducciones[slug]); + } + + // Lo creamos con el texto pasado para evitar múltiples llamadas. + this._traducciones[slug] = text; + if (this.loadingTraducciones) return this._traducciones[slug]; + + this.loadingTraducciones = true; + // Enviamos a crear la traducción + var signal = this.getSignal('traducciones'); + try { + + var datatoSendToHook = { clave: slug, valor: text}; + if (window.REMOTE_URL) datatoSendToHook.remote = window.REMOTE_URL; + + return this.hook('/hooks/traducciones/', datatoSendToHook, + null, + { + // signal:signal + }).then((response) => { + return resolve(this._traducciones[slug]); + }); + } catch { + console.error('Problema al crear textos generales: ', text); + } + return resolve(this._traducciones[slug]); + }); + } + slugify(string) { + // str.normalize("NFD").replace(/[\u0300-\u036f]/g, "") + // https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript + const a = 'àáäâãåăæąçćčđďèéěėëêęğǵḧìíïîįłḿǹńňñòóöôœøṕŕřßşśšșťțùúüûǘůűūųẃẍÿýźžż·/_,:;' + const b = 'aaaaaaaaacccddeeeeeeegghiiiiilmnnnnooooooprrsssssttuuuuuuuuuwxyyzzz______' + const p = new RegExp(a.split('').join('|'), 'g') + + return string.toString().toLowerCase() + .replace(/\s+/g, '_') // Replace spaces with - + .replace(p, c => b.charAt(a.indexOf(c))) // Replace special characters + .replace(/&/g, '_and_') // Replace & with 'and' + .replace(/[^\w\-]+/g, '') // Remove all non-word characters + .replace(/\_\_+/g, '_') // Replace multiple - with single - + .replace(/^_+/, '') // Trim - from start of text + .replace(/_+$/, '') // Trim - from end of text + .toUpperCase() + } +} +var CmsApi = new CmsApiClass(); +CmsApi.signals = {}; +//if(language !== 'www') window.addEventListener("load", () => { CmsApi.t_var('');});