UNPKG

@rb-mwindh/ngx-theme-manager

Version:

Angular component to switch between different theming stylesheets

135 lines 14 kB
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=