UNPKG

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
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==