Files
2026-04-21 08:09:21 +01:00

127 lines
5.1 KiB
JavaScript

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('');});