@rb-mwindh/ngx-theme-manager
Version:
Angular component to switch between different theming stylesheets
105 lines • 9.48 kB
JavaScript
import { Injectable } from '@angular/core';
import { share, Subject } from 'rxjs';
import * as i0 from "@angular/core";
/**
* RbThemeRegistryService is an injectable service that allows for
* registering and unregistering themes, as well as providing access
* to the currently registered themes.
* It also provides an observable of themes that can be used
* to notify subscribers of changes to the registered themes.
*
* @internal
* @group Services
*/
export class ThemeRegistryService {
constructor() {
/**
* The internal dictionary that holds the registered themes.
*
* @private
*/
this.#dictionary = new Map();
/**
* The subject that emits an updated array of registered themes whenever a change occurs.
*
* @private
*/
this.#themes$ = new Subject();
/**
* The observable that emits the collection of registered themes when it changes.
*/
this.themes$ = this.#themes$.pipe(share());
}
/**
* The internal dictionary that holds the registered themes.
*
* @private
*/
#dictionary;
/**
* The subject that emits an updated array of registered themes whenever a change occurs.
*
* @private
*/
#themes$;
/**
* Registers a new theme and emits the changed collection of themes.
*
* If a theme with the same ID is already registered,
* the registered theme will be merged with the new one.
*
* Themes without ID will be ignored.
*
* @param {Theme | undefined | null} theme - The new theme to register
*/
register(theme) {
if (!theme?.id) {
return;
}
const oldValue = this.#dictionary.get(theme.id) || {};
this.#dictionary.set(theme.id, { ...oldValue, ...theme });
this.#themes$.next([...this.#dictionary.values()]);
}
/**
* Removes the provided theme from the registry and emits the changed collection of themes.
*
* @param {Theme} theme - The theme to remove.
*/
unregister(theme) {
if (this.#dictionary.delete(theme?.id)) {
this.#themes$.next([...this.#dictionary.values()]);
}
}
/**
* Returns the collection of registered themes.
*
* @returns {Theme[]} A new array with all currently registered themes
* @remarks A new array is created every time this getter is called.
*/
get themes() {
return [...this.#dictionary.values()];
}
/**
* Returns the theme with the given ID, or null if no such theme is registered.
*
* @param {string | null} id - The ID of the theme to retrieve
*/
get(id) {
return this.#dictionary.get(id) || null;
}
/**
* Returns whether a theme with the given ID is currently registered.
*
* @param {string | null} id - The ID of the theme to check.
*/
has(id) {
return this.#dictionary.has(id);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: ThemeRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: ThemeRegistryService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: ThemeRegistryService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUtcmVnaXN0cnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10aGVtZS1tYW5hZ2VyL3NyYy9saWIvaW50ZXJuYWwvdGhlbWUtcmVnaXN0cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUd0Qzs7Ozs7Ozs7O0dBU0c7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBRGpDO1FBRUU7Ozs7V0FJRztRQUNNLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7UUFFaEQ7Ozs7V0FJRztRQUNNLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRTNDOztXQUVHO1FBQ00sWUFBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0EyRGhEO0lBNUVDOzs7O09BSUc7SUFDTSxXQUFXLENBQTRCO0lBRWhEOzs7O09BSUc7SUFDTSxRQUFRLENBQTBCO0lBTzNDOzs7Ozs7Ozs7T0FTRztJQUNILFFBQVEsQ0FBQyxLQUErQjtRQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLEtBQVk7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxFQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxFQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7OEdBNUVVLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGNBRFAsTUFBTTs7MkZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzaGFyZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGhlbWUgfSBmcm9tICcuLi90aGVtZSc7XG5cbi8qKlxuICogUmJUaGVtZVJlZ2lzdHJ5U2VydmljZSBpcyBhbiBpbmplY3RhYmxlIHNlcnZpY2UgdGhhdCBhbGxvd3MgZm9yXG4gKiByZWdpc3RlcmluZyBhbmQgdW5yZWdpc3RlcmluZyB0aGVtZXMsIGFzIHdlbGwgYXMgcHJvdmlkaW5nIGFjY2Vzc1xuICogdG8gdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIHRoZW1lcy5cbiAqIEl0IGFsc28gcHJvdmlkZXMgYW4gb2JzZXJ2YWJsZSBvZiB0aGVtZXMgdGhhdCBjYW4gYmUgdXNlZFxuICogdG8gbm90aWZ5IHN1YnNjcmliZXJzIG9mIGNoYW5nZXMgdG8gdGhlIHJlZ2lzdGVyZWQgdGhlbWVzLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQGdyb3VwIFNlcnZpY2VzXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVGhlbWVSZWdpc3RyeVNlcnZpY2Uge1xuICAvKipcbiAgICogVGhlIGludGVybmFsIGRpY3Rpb25hcnkgdGhhdCBob2xkcyB0aGUgcmVnaXN0ZXJlZCB0aGVtZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZWFkb25seSAjZGljdGlvbmFyeSA9IG5ldyBNYXA8c3RyaW5nLCBUaGVtZT4oKTtcblxuICAvKipcbiAgICogVGhlIHN1YmplY3QgdGhhdCBlbWl0cyBhbiB1cGRhdGVkIGFycmF5IG9mIHJlZ2lzdGVyZWQgdGhlbWVzIHdoZW5ldmVyIGEgY2hhbmdlIG9jY3Vycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlYWRvbmx5ICN0aGVtZXMkID0gbmV3IFN1YmplY3Q8VGhlbWVbXT4oKTtcblxuICAvKipcbiAgICogVGhlIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgY29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIHRoZW1lcyB3aGVuIGl0IGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSB0aGVtZXMkID0gdGhpcy4jdGhlbWVzJC5waXBlKHNoYXJlKCkpO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgdGhlbWUgYW5kIGVtaXRzIHRoZSBjaGFuZ2VkIGNvbGxlY3Rpb24gb2YgdGhlbWVzLlxuICAgKlxuICAgKiBJZiBhIHRoZW1lIHdpdGggdGhlIHNhbWUgSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLFxuICAgKiB0aGUgcmVnaXN0ZXJlZCB0aGVtZSB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBuZXcgb25lLlxuICAgKlxuICAgKiBUaGVtZXMgd2l0aG91dCBJRCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VGhlbWUgfCB1bmRlZmluZWQgfCBudWxsfSB0aGVtZSAtIFRoZSBuZXcgdGhlbWUgdG8gcmVnaXN0ZXJcbiAgICovXG4gIHJlZ2lzdGVyKHRoZW1lOiBUaGVtZSB8IHVuZGVmaW5lZCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoZW1lPy5pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuI2RpY3Rpb25hcnkuZ2V0KHRoZW1lLmlkKSB8fCB7fTtcbiAgICB0aGlzLiNkaWN0aW9uYXJ5LnNldCh0aGVtZS5pZCwgeyAuLi5vbGRWYWx1ZSwgLi4udGhlbWUgfSk7XG4gICAgdGhpcy4jdGhlbWVzJC5uZXh0KFsuLi50aGlzLiNkaWN0aW9uYXJ5LnZhbHVlcygpXSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgcHJvdmlkZWQgdGhlbWUgZnJvbSB0aGUgcmVnaXN0cnkgYW5kIGVtaXRzIHRoZSBjaGFuZ2VkIGNvbGxlY3Rpb24gb2YgdGhlbWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1RoZW1lfSB0aGVtZSAtIFRoZSB0aGVtZSB0byByZW1vdmUuXG4gICAqL1xuICB1bnJlZ2lzdGVyKHRoZW1lOiBUaGVtZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNkaWN0aW9uYXJ5LmRlbGV0ZSh0aGVtZT8uaWQpKSB7XG4gICAgICB0aGlzLiN0aGVtZXMkLm5leHQoWy4uLnRoaXMuI2RpY3Rpb25hcnkudmFsdWVzKCldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIHRoZW1lcy5cbiAgICpcbiAgICogQHJldHVybnMge1RoZW1lW119IEEgbmV3IGFycmF5IHdpdGggYWxsIGN1cnJlbnRseSByZWdpc3RlcmVkIHRoZW1lc1xuICAgKiBAcmVtYXJrcyBBIG5ldyBhcnJheSBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhpcyBnZXR0ZXIgaXMgY2FsbGVkLlxuICAgKi9cbiAgZ2V0IHRoZW1lcygpOiBUaGVtZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI2RpY3Rpb25hcnkudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRoZW1lIHdpdGggdGhlIGdpdmVuIElELCBvciBudWxsIGlmIG5vIHN1Y2ggdGhlbWUgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBpZCAtIFRoZSBJRCBvZiB0aGUgdGhlbWUgdG8gcmV0cmlldmVcbiAgICovXG4gIGdldChpZDogc3RyaW5nIHwgbnVsbCk6IFRoZW1lIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI2RpY3Rpb25hcnkuZ2V0KGlkISkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB0aGVtZSB3aXRoIHRoZSBnaXZlbiBJRCBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBpZCAtIFRoZSBJRCBvZiB0aGUgdGhlbWUgdG8gY2hlY2suXG4gICAqL1xuICBoYXMoaWQ6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jZGljdGlvbmFyeS5oYXMoaWQhKTtcbiAgfVxufVxuIl19