ngx-slice-kit
Version:
[](https://badge.fury.io/js/ngx-slice-kit)
120 lines • 13.7 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { DARK_THEME } from './symbols';
import { Theme } from './theme.model';
import { themeLight } from './lib/theme-light';
import { themeDark } from './lib/theme-dark';
import * as i0 from "@angular/core";
export class ThemeService {
constructor() {
this.$themes = new BehaviorSubject([new Theme(themeLight), new Theme(themeDark)]);
this.$currentTheme = new BehaviorSubject(this.getDefaultTheme());
}
get themes() {
return this.$themes.getValue();
}
get themesObservable() {
return this.$themes.asObservable();
}
get currentTheme() {
return this.$currentTheme.getValue();
}
set currentTheme(t) {
this.$currentTheme.next(new Theme(t));
}
get themeName() {
return this.$currentTheme.getValue().name;
}
get currentThemeObservable() {
return this.$currentTheme.asObservable();
}
get darkness() {
return this.themeName === DARK_THEME;
}
/**
* check if there is saved theme, then looks it up at theme repository
*/
getDefaultTheme() {
return this.findTheme(themeLight.name);
}
/**
* Find theme by specified theme
* Always returns 'light' theme if no results
*/
findTheme(name) {
return this.themes.find(t => t.name === name) || themeLight;
}
/**
* returns current theme index
*/
getCurrentThemeIndex() {
return this.themes.findIndex(t => t.name === this.currentTheme.name);
}
/**
* Switch to next theme, find current index
* and if (current + 1) is out of index expression just go to themes[0]
*/
nextTheme() {
const currentIndex = this.getCurrentThemeIndex();
const isLast = currentIndex === (this.themes.length - 1);
this.currentTheme = isLast ? this.themes[0] : this.themes[currentIndex + 1];
}
/**
* Sets specified specified theme by name
*
* @param name is required
*/
setTheme(name) {
const t = this.findTheme(name);
if (t.name !== name) {
console.warn('Specified theme name not found: ', name);
}
this.currentTheme = t;
}
/**
* Gets value of specified theme property
*
* @param propName is required
*/
getProperty(propName) {
const theme = this.currentTheme;
if (theme.hasOwnProperty(propName)) {
return this.currentTheme[propName];
}
else {
return '';
}
}
/**
* Registers new theme in service memory
* @param theme contains new Theme references
* cannot be named as `light`, `dark` or any default themes
*/
registerTheme(theme) {
if (!!this.themes.find(t => t.name === theme.name)) {
theme.name = `custom_${theme.name}_${this.themes.length + 1}`;
}
this.$themes.next([...this.themes, new Theme(theme)]);
}
updateTheme(t) {
const theme = this.findTheme(t.name);
const themes = this.themes;
const index = themes.indexOf(theme);
if (index >= 0) {
themes[index] = t;
}
this.$themes.next(themes);
if (theme.name === t.name) {
this.currentTheme = new Theme(t);
}
}
}
ThemeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
ThemeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: ThemeService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: ThemeService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2NvcmUvdGhlbWUvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBSzdDLE1BQU0sT0FBTyxZQUFZO0lBSXJCO1FBSFEsWUFBTyxHQUE2QixJQUFJLGVBQWUsQ0FBVSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoSCxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFRLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBTTNFLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBVyxZQUFZLENBQUMsQ0FBUTtRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJ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SyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDWixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7O3lHQXpIUSxZQUFZOzZHQUFaLFlBQVksY0FGVCxNQUFNOzJGQUVULFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEQVJLX1RIRU1FIH0gZnJvbSAnLi9zeW1ib2xzJztcblxuaW1wb3J0IHsgVGhlbWUgfSBmcm9tICcuL3RoZW1lLm1vZGVsJztcbmltcG9ydCB7IHRoZW1lTGlnaHQgfSBmcm9tICcuL2xpYi90aGVtZS1saWdodCc7XG5pbXBvcnQgeyB0aGVtZURhcmsgfSBmcm9tICcuL2xpYi90aGVtZS1kYXJrJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgJHRoZW1lczogQmVoYXZpb3JTdWJqZWN0PFRoZW1lW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaGVtZVtdPihbbmV3IFRoZW1lKHRoZW1lTGlnaHQpLCBuZXcgVGhlbWUodGhlbWVEYXJrKV0pO1xuICAgIHByaXZhdGUgJGN1cnJlbnRUaGVtZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGhlbWU+KHRoaXMuZ2V0RGVmYXVsdFRoZW1lKCkpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIC8vIEBPcHRpb25hbCgpIHB1YmxpYyBpbmplY3RlZFRoZW1lczogVGhlbWVbXSwgLy8gVE9ETyB0aGVtZSBpbmplY3Rpb24gZmVhdHVyZSB2MisrXG4gICAgICAgIC8vIEBPcHRpb25hbCgpIHB1YmxpYyBhY3RpdmU6IHN0cmluZyAvLyBUT0RPIGJldHRlciBjb250cm9sXG4gICAgKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aGVtZXMoKTogVGhlbWVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLiR0aGVtZXMuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRoZW1lc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxUaGVtZVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLiR0aGVtZXMuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VGhlbWUoKTogVGhlbWUge1xuICAgICAgICByZXR1cm4gdGhpcy4kY3VycmVudFRoZW1lLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjdXJyZW50VGhlbWUodDogVGhlbWUpIHtcbiAgICAgICAgdGhpcy4kY3VycmVudFRoZW1lLm5leHQobmV3IFRoZW1lKHQpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRoZW1lTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy4kY3VycmVudFRoZW1lLmdldFZhbHVlKCkubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUaGVtZU9ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxUaGVtZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy4kY3VycmVudFRoZW1lLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGFya25lc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW1lTmFtZSA9PT0gREFSS19USEVNRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiB0aGVyZSBpcyBzYXZlZCB0aGVtZSwgdGhlbiBsb29rcyBpdCB1cCBhdCB0aGVtZSByZXBvc2l0b3J5XG4gICAgICovXG4gICAgcHVibGljIGdldERlZmF1bHRUaGVtZSgpOiBUaGVtZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRUaGVtZSh0aGVtZUxpZ2h0Lm5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlbWUgYnkgc3BlY2lmaWVkIHRoZW1lXG4gICAgICogQWx3YXlzIHJldHVybnMgJ2xpZ2h0JyB0aGVtZSBpZiBubyByZXN1bHRzXG4gICAgICovXG4gICAgcHVibGljIGZpbmRUaGVtZShuYW1lOiBzdHJpbmcpOiBUaGVtZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW1lcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKSB8fCB0aGVtZUxpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgY3VycmVudCB0aGVtZSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXJyZW50VGhlbWVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVtZXMuZmluZEluZGV4KHQgPT4gdC5uYW1lID09PSB0aGlzLmN1cnJlbnRUaGVtZS5uYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2ggdG8gbmV4dCB0aGVtZSwgZmluZCBjdXJyZW50IGluZGV4XG4gICAgICogYW5kIGlmIChjdXJyZW50ICsgMSkgaXMgb3V0IG9mIGluZGV4IGV4cHJlc3Npb24ganVzdCBnbyB0byB0aGVtZXNbMF1cbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFRoZW1lKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmdldEN1cnJlbnRUaGVtZUluZGV4KCk7XG4gICAgICAgIGNvbnN0IGlzTGFzdCA9IGN1cnJlbnRJbmRleCA9PT0gKHRoaXMudGhlbWVzLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaGVtZSA9IGlzTGFzdCA/IHRoaXMudGhlbWVzWzBdIDogdGhpcy50aGVtZXNbY3VycmVudEluZGV4ICsgMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBzcGVjaWZpZWQgc3BlY2lmaWVkIHRoZW1lIGJ5IG5hbWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIGlzIHJlcXVpcmVkXG4gICAgICovXG4gICAgcHVibGljIHNldFRoZW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5maW5kVGhlbWUobmFtZSk7XG4gICAgICAgIGlmICh0Lm5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignU3BlY2lmaWVkIHRoZW1lIG5hbWUgbm90IGZvdW5kOiAnLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRUaGVtZSA9IHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB2YWx1ZSBvZiBzcGVjaWZpZWQgdGhlbWUgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wTmFtZSBpcyByZXF1aXJlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQcm9wZXJ0eShwcm9wTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdGhlbWUgPSB0aGlzLmN1cnJlbnRUaGVtZTtcbiAgICAgICAgaWYgKHRoZW1lLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRoZW1lW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBuZXcgdGhlbWUgaW4gc2VydmljZSBtZW1vcnlcbiAgICAgKiBAcGFyYW0gdGhlbWUgY29udGFpbnMgbmV3IFRoZW1lIHJlZmVyZW5jZXNcbiAgICAgKiBjYW5ub3QgYmUgbmFtZWQgYXMgYGxpZ2h0YCwgYGRhcmtgIG9yIGFueSBkZWZhdWx0IHRoZW1lc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlclRoZW1lKHRoZW1lOiBUaGVtZSk6IHZvaWQge1xuICAgICAgICBpZiAoISF0aGlzLnRoZW1lcy5maW5kKHQgPT4gdC5uYW1lID09PSB0aGVtZS5uYW1lKSkge1xuICAgICAgICAgICAgdGhlbWUubmFtZSA9IGBjdXN0b21fJHt0aGVtZS5uYW1lfV8ke3RoaXMudGhlbWVzLmxlbmd0aCArIDF9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiR0aGVtZXMubmV4dChbLi4udGhpcy50aGVtZXMsIG5ldyBUaGVtZSh0aGVtZSldKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyB1cGRhdGVUaGVtZSh0OiBUaGVtZSk6IHZvaWQge1xuICAgICAgICBjb25zdCB0aGVtZSA9IHRoaXMuZmluZFRoZW1lKHQubmFtZSk7XG4gICAgICAgIGNvbnN0IHRoZW1lcyA9IHRoaXMudGhlbWVzO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoZW1lcy5pbmRleE9mKHRoZW1lKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoZW1lc1tpbmRleF0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuJHRoZW1lcy5uZXh0KHRoZW1lcyk7XG4gICAgICAgIGlmICh0aGVtZS5uYW1lID09PSB0Lm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRoZW1lID0gbmV3IFRoZW1lKHQpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=