@javiertinc/essentials
Version:
Una librería con variedad de funciones útiles que considero esenciales en la mayoría de los desarrollos web.
156 lines (155 loc) • 7.59 kB
JavaScript
import _cnsl from './cnsl.js';
import _obsv from './obsv.js';
import _data from './data.js';
export default class strg {
constructor(config) {
this.config = config;
this.cnsl = new _cnsl(this.config);
this.obsv = new _obsv(this.config);
}
/**
* Obtiene el nombre del recurso de almacenamiento basado en el nombre del store.
* @param store - El nombre del store.
* @returns El nombre del recurso de almacenamiento.
*/
getResourceName(store) {
let resourceName = 'strg-' + store;
this.config.data.encrypt && (resourceName = _data.usid(resourceName));
return resourceName;
}
/**
* Crea un nuevo store en el almacenamiento local.
* Si el store ya existe, se actualizará con los nuevos datos.
* @param store - El nombre del store a crear o actualizar.
* @param data - Los datos a almacenar en el store.
**/
create(store, data) {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.create() • Creando strg', store, data);
let resourceName = this.getResourceName(store);
let storeData = this.get(store);
if (storeData) {
this.config.debug.strg && this.cnsl.warn('jtEssentials.strg.create() • El strg ya existe, se actualizará la información', store);
this.update(store, data);
}
else {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.create() • El strg no existe, se creará', store);
localStorage.setItem(resourceName, _data.stringify(data, this.config.data.encrypt, this.config.data.key));
this.trigger(store);
}
}
/**
* Obtiene los datos almacenados en un store específico.
* @param store - El nombre del store del cual se desean obtener los datos.
* @returns Los datos almacenados en el store, o null si no existe.
**/
get(store) {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.get() • Obteniendo strg', store);
let data = localStorage.getItem(this.getResourceName(store));
if (data) {
return _data.parse(data, this.config.data.encrypt, this.config.data.key);
}
else {
this.config.debug.strg && this.cnsl.warn('jtEssentials.strg.get() • No se encontró el strg', store);
return null;
}
}
/**
* Actualiza los datos de un store específico.
* Si el store no existe, se creará uno nuevo con los datos proporcionados.
* @param store - El nombre del store a actualizar.
* @param data - Los nuevos datos a almacenar en el store.
**/
update(store, data) {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.update() • Actualizando strg', store, data);
// Obtiene el contenido actual del store
let currentData = this.get(store);
if (currentData) {
// Actualiza el contenido del store con los nuevos datos
let updatedData = { ...currentData, ...data };
localStorage.setItem(this.getResourceName(store), _data.stringify(updatedData, this.config.data.encrypt, this.config.data.key));
// Dispara el evento de actualización
this.trigger(store);
}
else {
this.config.debug.strg && this.cnsl.warn('jtEssentials.strg.update() • No se encontró el strg', store);
}
}
/**
* Elimina un store específico del almacenamiento local.
* @param store - El nombre del store a eliminar.
**/
delete(store) {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.delete() • Eliminando strg', store);
localStorage.removeItem(this.getResourceName(store));
}
/**
* Crea un observador para un store específico.
* El observador se activará cuando se detecte una actualización en el store.
* @param store - El nombre del store a observar.
* @param from - Desde dónde se está creando el observador (puede ser un nombre de componente, función, etc.).
* @returns Un objeto Watcher que permite suscribirse a actualizaciones reactivas del store.
**/
watch(store, from) {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.watch() • Creando un observador para "' + store + '" desde "' + from + '"');
let resourceName = this.getResourceName(store);
from = this.config.data.encrypt ? _data.usid(from) : from;
return {
subscribe: (callback) => {
this.obsv.add(resourceName, from);
let eObsrvr = 'eo-' + resourceName + '@' + from;
const eventHandler = (event) => {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.watch() • Se ha detectado una actualización del strg "' + store + '"', event);
let data = this.get(store);
if (!data) {
this.config.debug.strg && this.cnsl.warn('jtEssentials.strg.watch() • No se encontró el strg', store);
}
else {
callback(data);
}
};
window.jtEssentialsEvents.addEventListener(eObsrvr, eventHandler);
// Return unsubscribe function
return () => {
window.jtEssentialsEvents.removeEventListener(eObsrvr, eventHandler);
this.obsv.remove(resourceName, from);
};
}
};
}
/**
* Elimina un observador de un store específico.
* @param store - El nombre del store del cual se desea eliminar el observador.
* @param from - Desde dónde se está eliminando el observador (puede ser un nombre de componente, función, etc.).
**/
unwatch(store, from) {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.unwatch() • Eliminando el observador para "' + store + '" desde "' + from + '"');
let resourceName = this.getResourceName(store);
from = this.config.data.encrypt ? _data.usid(from) : from;
let eObsrvr = 'eo-' + resourceName + '@' + from;
window.jtEssentialsEvents.removeEventListener(eObsrvr, (event) => {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.unwatch() • Se ha eliminado el observador para "' + store + '" desde "' + from + '"', event);
});
this.obsv.remove(resourceName, from);
}
/**
* Gatilla el evento de actualización del store.
* Este método se utiliza para notificar a los observadores que el store ha sido actualizado.
* @param store - El nombre del store que ha sido actualizado.
**/
trigger(store) {
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.trigger() • Gatillando el evento de actualización del strg', store);
let resourceName = this.getResourceName(store);
let data = this.get(store);
if (data) {
let obsrvs = this.obsv.get(resourceName);
obsrvs.forEach((from) => {
let eObsrvr = 'eo-' + resourceName + '@' + from;
window.jtEssentialsEvents.dispatchEvent(new CustomEvent(eObsrvr, { detail: data }));
this.config.debug.strg && this.cnsl.log('jtEssentials.strg.trigger() • Evento de actualización del strg gatillado', store, data);
});
}
else {
this.config.debug.strg && this.cnsl.warn('jtEssentials.strg.trigger() • No se encontró el strg', store);
}
}
}