import { inject, Injectable } from '@angular/core'; import { firstValueFrom } from 'rxjs'; import { List } from '../utils'; import { GenericService } from './generic.service'; import { APP_BASE_HREF } from '@angular/common'; export type UserAttributes = Record; export const KEYS = { language: 'Language', theme: 'Theme', helpModeDialog: 'HelpModeDialog', } as const; @Injectable() export abstract class IqserUserPreferenceService extends GenericService { protected abstract readonly _devFeaturesEnabledKey: string; protected readonly _serviceName: string = 'tenant-user-management'; #userAttributes: UserAttributes = {}; get userAttributes(): UserAttributes { return this.#userAttributes; } get isIqserDevMode(): boolean { const value = sessionStorage.getItem(this._devFeaturesEnabledKey); return value === 'true'; } getTheme(): string { return this._getAttribute(KEYS.theme, 'light'); } async saveTheme(theme: 'light' | 'dark'): Promise { await this.save(KEYS.theme, theme); window.location.reload(); } getLanguage(): string { return this._getAttribute(KEYS.language); } async saveLanguage(language: string): Promise { await this.save(KEYS.language, language); } getHelpModeDialog(): boolean { return this._getAttribute(KEYS.helpModeDialog, 'false') === 'true'; } async toggleHelpModeDialog(): Promise { const nextValue = (!this.getHelpModeDialog()).toString(); await this.save(KEYS.helpModeDialog, nextValue); } toggleDevFeatures(): void { sessionStorage.setItem(this._devFeaturesEnabledKey, String(!this.isIqserDevMode)); window.location.reload(); } async reload(): Promise { const attributes = await firstValueFrom(this.getAll()); this.#userAttributes = attributes ?? {}; } savePreferences(body: List, key: string) { return this._put(body, `${this._defaultModelPath}/${key}`); } async save(key: string, value: string): Promise { this.userAttributes[key] = [value]; await firstValueFrom(this.savePreferences([value], key)); } protected _getAttribute(key: string, defaultValue = ''): string { if (this.userAttributes[key]?.length > 0) { return this.userAttributes[key][0]; } return defaultValue; } } @Injectable() export class DefaultUserPreferenceService extends IqserUserPreferenceService { protected readonly _defaultModelPath = 'attributes'; protected readonly _devFeaturesEnabledKey = inject(APP_BASE_HREF) + '.enable-dev-features'; } export function isIqserDevMode() { return inject(IqserUserPreferenceService).isIqserDevMode; }