@rb-mwindh/ngx-theme-manager
Version:
Angular component to switch between different theming stylesheets
135 lines • 14 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { share, Subject, takeUntil } from 'rxjs';
import * as i0 from "@angular/core";
/**
* RbStorageService is a service that provides an observable stream of storage change events.
*
* @internal
* @group Services
*/
export class StorageService {
#destroy$;
/**
* The browser's local storage object.
*
* @readonly
* @private
*/
#storage;
/**
* The browser's window object.
*
* @readonly
* @private
*/
#window;
/**
* The Subject receiving the storage change events.
*
* @readonly
* @private
*/
#changes$;
/**
* Creates an instance of RbStorageService.
*
* @param {Document} document - the document object provided by Angular's DI.
*/
constructor(document) {
this.#destroy$ = new Subject();
/**
* The Subject receiving the storage change events.
*
* @readonly
* @private
*/
this.#changes$ = new Subject();
/**
* The observable stream of storage change events, shared among subscribers.
*
* @readonly
*/
this.changes$ = this.#changes$.pipe(share(), takeUntil(this.#destroy$));
this.#window = document.parentWindow || document.defaultView;
this.#storage = this.#window.localStorage;
this.#window.addEventListener('storage', this.#storageEventListener.bind(this));
}
/**
* An Angular lifecycle hook that removes the storage event listener.
*
* @internal
*/
ngOnDestroy() {
this.#window.removeEventListener('storage', this.#storageEventListener.bind(this));
this.#destroy$.next();
this.#destroy$.complete();
}
/**
* Sets a key-value pair in the local storage and emits a change event.
*
* @param {string} key - The key to set
* @param {string} newValue - The value to set
*/
setItem(key, newValue) {
const oldValue = this.#storage.getItem(key);
this.#storage.setItem(key, newValue);
this.#changes$.next({ key, oldValue, newValue });
}
/**
* Gets the value of a key in the local storage.
*
* @param {string} key - The key to get the value of
* @returns {(string | null)} The value of the key or null if it does not exist
*/
getItem(key) {
return this.#storage.getItem(key);
}
/**
* Removes the value of a key from the local storage and emits a change event.
*
* @param {string} key - The key to remove
*/
removeItem(key) {
const oldValue = this.#storage.getItem(key);
this.#storage.removeItem(key);
this.#changes$.next({ key, oldValue, newValue: null });
}
/**
* Clears all keys from the local storage and emits a change event for each removed key.
*/
clear() {
const changes = [];
for (let i = 0; i < this.#storage.length; i++) {
const key = this.#storage.key(i); // I'm sure it's never null!
const oldValue = this.#storage.getItem(key);
changes.push({ key, oldValue, newValue: null });
}
this.#storage.clear();
changes.forEach((change) => this.#changes$.next(change));
}
/**
* The storage event handler that takes a native StorageEvent and emits a {@link StorageChangeEvent}.
*
* @param {StorageEvent} event - The native event to handle
* @private
*/
#storageEventListener(event) {
if (event.storageArea != this.#storage) {
return;
}
const key = event.key;
const { oldValue, newValue } = event;
this.#changes$.next({ key, oldValue, newValue });
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: StorageService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: StorageService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: StorageService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRoZW1lLW1hbmFnZXIvc3JjL2xpYi9pbnRlcm5hbC9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUF5QmpEOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFDaEIsU0FBUyxDQUF1QjtJQUV6Qzs7Ozs7T0FLRztJQUNNLFFBQVEsQ0FBVTtJQUUzQjs7Ozs7T0FLRztJQUNNLE9BQU8sQ0FBUztJQUV6Qjs7Ozs7T0FLRztJQUNNLFNBQVMsQ0FBcUM7SUFZdkQ7Ozs7T0FJRztJQUNILFlBQXFDLFFBQWtCO1FBekM5QyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQWtCekM7Ozs7O1dBS0c7UUFDTSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQXNCLENBQUM7UUFFdkQ7Ozs7V0FJRztRQUNhLGFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDNUMsS0FBSyxFQUFFLEVBQ1AsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUIsQ0FBQztRQVFBLElBQUksQ0FBQyxPQUFPLEdBQUksUUFBZ0IsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN0RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQzNCLFNBQVMsRUFDVCxJQUFJLENBQUMscUJBQXFCLENBQUMs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TUFBTSxFQUFFOzswQkEyQ1osTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHNoYXJlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBTdG9yYWdlQ2hhbmdlRXZlbnQgcmVwcmVzZW50cyB0aGUgY2hhbmdlIGV2ZW50IG9mIHRoZSBzdG9yYWdlLlxuICpcbiAqIEBpbnRlcmZhY2VcbiAqIEBncm91cCBQdWJsaWMgQVBJXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUNoYW5nZUV2ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hhbmdlZC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGl0ZW0gYmVmb3JlIHRoZSBjaGFuZ2UuXG4gICAqL1xuICBvbGRWYWx1ZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBpdGVtIGFmdGVyIHRoZSBjaGFuZ2UuXG4gICAqL1xuICBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSYlN0b3JhZ2VTZXJ2aWNlIGlzIGEgc2VydmljZSB0aGF0IHByb3ZpZGVzIGFuIG9ic2VydmFibGUgc3RyZWFtIG9mIHN0b3JhZ2UgY2hhbmdlIGV2ZW50cy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBncm91cCBTZXJ2aWNlc1xuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgI2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKipcbiAgICogVGhlIGJyb3dzZXIncyBsb2NhbCBzdG9yYWdlIG9iamVjdC5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZWFkb25seSAjc3RvcmFnZTogU3RvcmFnZTtcblxuICAvKipcbiAgICogVGhlIGJyb3dzZXIncyB3aW5kb3cgb2JqZWN0LlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlYWRvbmx5ICN3aW5kb3c6IFdpbmRvdztcblxuICAvKipcbiAgICogVGhlIFN1YmplY3QgcmVjZWl2aW5nIHRoZSBzdG9yYWdlIGNoYW5nZSBldmVudHMuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgI2NoYW5nZXMkID0gbmV3IFN1YmplY3Q8U3RvcmFnZUNoYW5nZUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YWJsZSBzdHJlYW0gb2Ygc3RvcmFnZSBjaGFuZ2UgZXZlbnRzLCBzaGFyZWQgYW1vbmcgc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5nZXMkID0gdGhpcy4jY2hhbmdlcyQucGlwZShcbiAgICBzaGFyZSgpLFxuICAgIHRha2VVbnRpbCh0aGlzLiNkZXN0cm95JCksXG4gICk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmJTdG9yYWdlU2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jdW1lbnQgLSB0aGUgZG9jdW1lbnQgb2JqZWN0IHByb3ZpZGVkIGJ5IEFuZ3VsYXIncyBESS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudDogRG9jdW1lbnQpIHtcbiAgICB0aGlzLiN3aW5kb3cgPSAoZG9jdW1lbnQgYXMgYW55KS5wYXJlbnRXaW5kb3cgfHwgZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgdGhpcy4jc3RvcmFnZSA9IHRoaXMuI3dpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgdGhpcy4jd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnc3RvcmFnZScsXG4gICAgICB0aGlzLiNzdG9yYWdlRXZlbnRMaXN0ZW5lci5iaW5kKHRoaXMpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQW4gQW5ndWxhciBsaWZlY3ljbGUgaG9vayB0aGF0IHJlbW92ZXMgdGhlIHN0b3JhZ2UgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy4jd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAnc3RvcmFnZScsXG4gICAgICB0aGlzLiNzdG9yYWdlRXZlbnRMaXN0ZW5lci5iaW5kKHRoaXMpLFxuICAgICk7XG4gICAgdGhpcy4jZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuI2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBsb2NhbCBzdG9yYWdlIGFuZCBlbWl0cyBhIGNoYW5nZSBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gc2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRJdGVtKGtleTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLiNzdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICB0aGlzLiNzdG9yYWdlLnNldEl0ZW0oa2V5LCBuZXdWYWx1ZSk7XG4gICAgdGhpcy4jY2hhbmdlcyQubmV4dCh7IGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIGEga2V5IGluIHRoZSBsb2NhbCBzdG9yYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBnZXQgdGhlIHZhbHVlIG9mXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9IFRoZSB2YWx1ZSBvZiB0aGUga2V5IG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIHB1YmxpYyBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHZhbHVlIG9mIGEga2V5IGZyb20gdGhlIGxvY2FsIHN0b3JhZ2UgYW5kIGVtaXRzIGEgY2hhbmdlIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLiNzdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICB0aGlzLiNzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB0aGlzLiNjaGFuZ2VzJC5uZXh0KHsga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBrZXlzIGZyb20gdGhlIGxvY2FsIHN0b3JhZ2UgYW5kIGVtaXRzIGEgY2hhbmdlIGV2ZW50IGZvciBlYWNoIHJlbW92ZWQga2V5LlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZXM6IFN0b3JhZ2VDaGFuZ2VFdmVudFtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLiNzdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLiNzdG9yYWdlLmtleShpKSE7IC8vIEknbSBzdXJlIGl0J3MgbmV2ZXIgbnVsbCFcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy4jc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBjaGFuZ2VzLnB1c2goeyBrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZTogbnVsbCB9KTtcbiAgICB9XG4gICAgdGhpcy4jc3RvcmFnZS5jbGVhcigpO1xuICAgIGNoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB0aGlzLiNjaGFuZ2VzJC5uZXh0KGNoYW5nZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdG9yYWdlIGV2ZW50IGhhbmRsZXIgdGhhdCB0YWtlcyBhIG5hdGl2ZSBTdG9yYWdlRXZlbnQgYW5kIGVtaXRzIGEge0BsaW5rIFN0b3JhZ2VDaGFuZ2VFdmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RvcmFnZUV2ZW50fSBldmVudCAtIFRoZSBuYXRpdmUgZXZlbnQgdG8gaGFuZGxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICAjc3RvcmFnZUV2ZW50TGlzdGVuZXIoZXZlbnQ6IFN0b3JhZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5zdG9yYWdlQXJlYSAhPSB0aGlzLiNzdG9yYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5ITtcbiAgICBjb25zdCB7IG9sZFZhbHVlLCBuZXdWYWx1ZSB9ID0gZXZlbnQ7XG4gICAgdGhpcy4jY2hhbmdlcyQubmV4dCh7IGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlIH0pO1xuICB9XG59XG4iXX0=