dynamic-theme-lib
Version:
A flexible and powerful theme management library for Angular applications that allows dynamic color management and theme switching.
126 lines • 16.6 kB
JavaScript
import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { BehaviorSubject } from 'rxjs';
import { tap, catchError } from 'rxjs/operators';
import { of } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export class ColourService {
constructor(http, platformId) {
this.http = http;
this.platformId = platformId;
this.colorMap = {}; // Store color configurations
this.storageKey = 'colorConfig'; // Key for storing colors in sessionStorage
this.configUrl = 'assets/colors/color-config.json';
this.colorsSubject = new BehaviorSubject({});
this.colors$ = this.colorsSubject.asObservable(); // Expose as observable for real-time updates
this.isBrowser = isPlatformBrowser(this.platformId); // Check if the platform is a browser
this.loadColorConfig();
console.log("Color service getting called");
}
/**
* Method to fetch the color configuration and load colors from sessionStorage or JSON.
*/
loadColorConfig() {
console.log("Load config getting called");
if (this.isBrowser) {
// Check if color config is stored in sessionStorage
const storedColors = sessionStorage.getItem(this.storageKey);
if (storedColors) {
console.log("From session...");
try {
this.colorMap = JSON.parse(storedColors);
this.colorsSubject.next(this.colorMap); // Emit new values
console.log('Colors loaded from session storage:', this.colorMap);
return;
}
catch (error) {
console.warn('Error parsing stored colors, falling back to config file:', error);
sessionStorage.removeItem(this.storageKey);
}
}
}
// If not found in storage or non-browser environment, fetch from JSON file
this.http.get(this.configUrl).pipe(tap((data) => {
console.log('Colors loaded from config file:', data);
}), catchError((error) => {
console.error('Error loading color config:', error);
// Return default colors if config file fails to load
return of({
'primary-color': '#007bff',
'secondary-color': '#6c757d',
'background-color': '#ffffff',
'text-color': '#212529'
});
})).subscribe((data) => {
this.colorMap = data;
this.colorsSubject.next(this.colorMap); // Emit new values to subscribers
if (this.isBrowser) {
try {
sessionStorage.setItem(this.storageKey, JSON.stringify(data));
}
catch (error) {
console.warn('Error storing colors in session storage:', error);
}
}
});
}
/**
* Method to update color for a specific variable and store it.
* @param variableName The key for the color variable (e.g., 'primary-color')
* @param colorValue The new color value (e.g., '#ff5733')
*/
setColor(variableName, colorValue) {
if (!variableName || !colorValue) {
console.warn('Invalid color update request:', { variableName, colorValue });
return;
}
this.colorMap[variableName] = colorValue;
// Store updated colorMap in sessionStorage for persistence during the session
if (this.isBrowser) {
try {
sessionStorage.setItem(this.storageKey, JSON.stringify(this.colorMap));
}
catch (error) {
console.warn('Error storing updated colors:', error);
}
}
this.colorsSubject.next(Object.assign({}, this.colorMap));
console.log(`Color updated: ${variableName} = ${colorValue}`);
}
/**
* Method to get the color for a specific variable.
* @param variableName The key for the color variable (e.g., 'primary-color')
* @returns The color value for the given variable or an empty string if not found
*/
getColor(variableName) {
const color = this.colorMap[variableName];
if (!color) {
console.warn(`Color not found for: ${variableName}`);
return '';
}
return color;
}
/**
* Method to get all colors (useful for UI configuration or preview page).
* @returns All color configurations
*/
getAllColors() {
return Object.assign({}, this.colorMap);
}
reloadColors() {
this.loadColorConfig();
}
}
ColourService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ColourService, deps: [{ token: i1.HttpClient }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
ColourService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ColourService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ColourService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLXRoZW1lLWxpYi9zcmMvbGliL3NlcnZpY2VzL2NvbG91ci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBSzFCLE1BQU0sT0FBTyxhQUFhO0lBU3hCLFlBQW9CLElBQWdCLEVBQStCLFVBQWtCO1FBQWpFLFNBQUksR0FBSixJQUFJLENBQVk7UUFBK0IsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQVI3RSxhQUFRLEdBQThCLEVBQUUsQ0FBQyxDQUFDLDZCQUE2QjtRQUV2RSxlQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsMkNBQTJDO1FBQ3ZFLGNBQVMsR0FBRyxpQ0FBaUMsQ0FBQztRQUU5QyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUE0QixFQUFFLENBQUMsQ0FBQztRQUMzRSxZQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLDZDQUE2QztRQUd4RixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztRQUMxRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FF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QUFDLENBQUM7YUFDeEU7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3REO1NBQ0Y7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksbUJBQU0sSUFBSSxDQUFDLFFBQVEsRUFBRyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLFlBQVksTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLFlBQW9CO1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDckQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDVix5QkFBWSxJQUFJLENBQUMsUUFBUSxFQUFHO0lBQzlCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7OzJHQW5IVSxhQUFhLDRDQVNzQixXQUFXOytHQVQ5QyxhQUFhLGNBRlosTUFBTTs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBVXdDLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDb2xvdXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb2xvck1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9OyAvLyBTdG9yZSBjb2xvciBjb25maWd1cmF0aW9uc1xuICBwcml2YXRlIGlzQnJvd3NlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5ID0gJ2NvbG9yQ29uZmlnJzsgLy8gS2V5IGZvciBzdG9yaW5nIGNvbG9ycyBpbiBzZXNzaW9uU3RvcmFnZVxuICBwcml2YXRlIGNvbmZpZ1VybCA9ICdhc3NldHMvY29sb3JzL2NvbG9yLWNvbmZpZy5qc29uJztcblxuICBwcml2YXRlIGNvbG9yc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0+KHt9KTtcbiAgY29sb3JzJCA9IHRoaXMuY29sb3JzU3ViamVjdC5hc09ic2VydmFibGUoKTsgLy8gRXhwb3NlIGFzIG9ic2VydmFibGUgZm9yIHJlYWwtdGltZSB1cGRhdGVzXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTsgLy8gQ2hlY2sgaWYgdGhlIHBsYXRmb3JtIGlzIGEgYnJvd3NlclxuICAgIHRoaXMubG9hZENvbG9yQ29uZmlnKCk7XG4gICAgY29uc29sZS5sb2coXCJDb2xvciBzZXJ2aWNlIGdldHRpbmcgY2FsbGVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBmZXRjaCB0aGUgY29sb3IgY29uZmlndXJhdGlvbiBhbmQgbG9hZCBjb2xvcnMgZnJvbSBzZXNzaW9uU3RvcmFnZSBvciBKU09OLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ29sb3JDb25maWcoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJMb2FkIGNvbmZpZyBnZXR0aW5nIGNhbGxlZFwiKTtcbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIC8vIENoZWNrIGlmIGNvbG9yIGNvbmZpZyBpcyBzdG9yZWQgaW4gc2Vzc2lvblN0b3JhZ2VcbiAgICAgIGNvbnN0IHN0b3JlZENvbG9ycyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgIGlmIChzdG9yZWRDb2xvcnMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJGcm9tIHNlc3Npb24uLi5cIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jb2xvck1hcCA9IEpTT04ucGFyc2Uoc3RvcmVkQ29sb3JzKTtcbiAgICAgICAgICB0aGlzLmNvbG9yc1N1YmplY3QubmV4dCh0aGlzLmNvbG9yTWFwKTsgLy8gRW1pdCBuZXcgdmFsdWVzXG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvbG9ycyBsb2FkZWQgZnJvbSBzZXNzaW9uIHN0b3JhZ2U6JywgdGhpcy5jb2xvck1hcCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgcGFyc2luZyBzdG9yZWQgY29sb3JzLCBmYWxsaW5nIGJhY2sgdG8gY29uZmlnIGZpbGU6JywgZXJyb3IpO1xuICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5vdCBmb3VuZCBpbiBzdG9yYWdlIG9yIG5vbi1icm93c2VyIGVudmlyb25tZW50LCBmZXRjaCBmcm9tIEpTT04gZmlsZVxuICAgIHRoaXMuaHR0cC5nZXQ8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4odGhpcy5jb25maWdVcmwpLnBpcGUoXG4gICAgICB0YXAoKGRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NvbG9ycyBsb2FkZWQgZnJvbSBjb25maWcgZmlsZTonLCBkYXRhKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbG9yIGNvbmZpZzonLCBlcnJvcik7XG4gICAgICAgIC8vIFJldHVybiBkZWZhdWx0IGNvbG9ycyBpZiBjb25maWcgZmlsZSBmYWlscyB0byBsb2FkXG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgJ3ByaW1hcnktY29sb3InOiAnIzAwN2JmZicsXG4gICAgICAgICAgJ3NlY29uZGFyeS1jb2xvcic6ICcjNmM3NTdkJyxcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZmZmZmZmJyxcbiAgICAgICAgICAndGV4dC1jb2xvcic6ICcjMjEyNTI5J1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKGRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pID0+IHtcbiAgICAgIHRoaXMuY29sb3JNYXAgPSBkYXRhO1xuICAgICAgdGhpcy5jb2xvcnNTdWJqZWN0Lm5leHQodGhpcy5jb2xvck1hcCk7IC8vIEVtaXQgbmV3IHZhbHVlcyB0byBzdWJzY3JpYmVyc1xuICAgICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHN0b3JpbmcgY29sb3JzIGluIHNlc3Npb24gc3RvcmFnZTonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdXBkYXRlIGNvbG9yIGZvciBhIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBzdG9yZSBpdC5cbiAgICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUga2V5IGZvciB0aGUgY29sb3IgdmFyaWFibGUgKGUuZy4sICdwcmltYXJ5LWNvbG9yJylcbiAgICogQHBhcmFtIGNvbG9yVmFsdWUgVGhlIG5ldyBjb2xvciB2YWx1ZSAoZS5nLiwgJyNmZjU3MzMnKVxuICAgKi9cbiAgc2V0Q29sb3IodmFyaWFibGVOYW1lOiBzdHJpbmcsIGNvbG9yVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdmFyaWFibGVOYW1lIHx8ICFjb2xvclZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgY29sb3IgdXBkYXRlIHJlcXVlc3Q6JywgeyB2YXJpYWJsZU5hbWUsIGNvbG9yVmFsdWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb2xvck1hcFt2YXJpYWJsZU5hbWVdID0gY29sb3JWYWx1ZTtcblxuICAgIC8vIFN0b3JlIHVwZGF0ZWQgY29sb3JNYXAgaW4gc2Vzc2lvblN0b3JhZ2UgZm9yIHBlcnNpc3RlbmNlIGR1cmluZyB0aGUgc2Vzc2lvblxuICAgIGlmICh0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KHRoaXMuY29sb3JNYXApKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRXJyb3Igc3RvcmluZyB1cGRhdGVkIGNvbG9yczonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb2xvcnNTdWJqZWN0Lm5leHQoeyAuLi50aGlzLmNvbG9yTWFwIH0pO1xuICAgIGNvbnNvbGUubG9nKGBDb2xvciB1cGRhdGVkOiAke3ZhcmlhYmxlTmFtZX0gPSAke2NvbG9yVmFsdWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGdldCB0aGUgY29sb3IgZm9yIGEgc3BlY2lmaWMgdmFyaWFibGUuXG4gICAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIGtleSBmb3IgdGhlIGNvbG9yIHZhcmlhYmxlIChlLmcuLCAncHJpbWFyeS1jb2xvcicpXG4gICAqIEByZXR1cm5zIFRoZSBjb2xvciB2YWx1ZSBmb3IgdGhlIGdpdmVuIHZhcmlhYmxlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldENvbG9yKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3JNYXBbdmFyaWFibGVOYW1lXTtcbiAgICBpZiAoIWNvbG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbG9yIG5vdCBmb3VuZCBmb3I6ICR7dmFyaWFibGVOYW1lfWApO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGdldCBhbGwgY29sb3JzICh1c2VmdWwgZm9yIFVJIGNvbmZpZ3VyYXRpb24gb3IgcHJldmlldyBwYWdlKS5cbiAgICogQHJldHVybnMgQWxsIGNvbG9yIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICBnZXRBbGxDb2xvcnMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5jb2xvck1hcCB9O1xuICB9XG5cbiAgcmVsb2FkQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZENvbG9yQ29uZmlnKCk7XG4gIH1cbn1cbiJdfQ==