UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

120 lines 13.7 kB
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=