@nent/core
Version:
100 lines (95 loc) • 3.31 kB
JavaScript
/*!
* NENT 2022
*/
import { proxyCustomElement, HTMLElement } from '@stencil/core/internal/client';
import { a as actionBus, e as eventBus } from './index2.js';
import { a as addDataProvider, r as removeDataProvider } from './factory.js';
import { D as DATA_COMMANDS } from './interfaces5.js';
import { D as DATA_EVENTS } from './interfaces3.js';
/* It's a wrapper around the localStorage API that emits an event when the data changes */
class StorageService {
/**
* `constructor` is a function that is called when a new instance of the class is created
* @param {Window} win - Window - the window object
* @param {IEventEmitter} eventBus - This is the event bus that we created in the previous step.
* @param {string} name - The name of the provider. This is used to identify the provider when
* emitting events.
* @param {string} [prefix] - This is the prefix that will be used for all keys in the local storage.
*/
constructor(win, eventBus, name, prefix = '') {
this.eventBus = eventBus;
this.name = name;
this.prefix = prefix;
this.localStorage = win.localStorage;
window === null || window === void 0 ? void 0 : window.addEventListener('storage', () => {
this.eventBus.emit(DATA_EVENTS.DataChanged, {
provider: this.name,
});
}, { passive: true });
}
async get(key) {
var _a;
return ((_a = this.localStorage) === null || _a === void 0 ? void 0 : _a.getItem(this.prefix + key)) || null;
}
async set(key, value) {
var _a;
const existing = await this.get(key);
if (existing == value)
return;
(_a = this.localStorage) === null || _a === void 0 ? void 0 : _a.setItem(this.prefix + key, value);
this.eventBus.emit(DATA_EVENTS.DataChanged, {
provider: this.name,
});
}
}
const DataStorage = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
constructor() {
super();
this.__registerHost();
/**
* Provider name to use in nent expressions.
*/
this.name = 'storage';
}
registerProvider() {
addDataProvider(this.name, this.provider);
this.actionSubscription = actionBus.on(this.name, async (action) => {
if (action.command == DATA_COMMANDS.SetData) {
const { data } = action;
await Promise.all(Object.keys(action.data).map(key => this.provider.set(key, data[key])));
}
});
}
componentWillLoad() {
this.provider = new StorageService(window, eventBus, this.name, this.keyPrefix);
this.registerProvider();
}
disconnectedCallback() {
var _a;
removeDataProvider(this.name);
(_a = this.actionSubscription) === null || _a === void 0 ? void 0 : _a.call(this);
}
render() {
return null;
}
get el() { return this; }
}, [0, "n-data-storage", {
"keyPrefix": [1, "key-prefix"],
"name": [1]
}]);
function defineCustomElement$1() {
if (typeof customElements === "undefined") {
return;
}
const components = ["n-data-storage"];
components.forEach(tagName => { switch (tagName) {
case "n-data-storage":
if (!customElements.get(tagName)) {
customElements.define(tagName, DataStorage);
}
break;
} });
}
const NDataStorage = DataStorage;
const defineCustomElement = defineCustomElement$1;
export { NDataStorage, defineCustomElement };