common-ui/src/lib/services/iqser-user-preference.service.ts

92 lines
2.8 KiB
TypeScript

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<string, List>;
export const KEYS = {
language: 'Language',
theme: 'Theme',
helpModeDialog: 'HelpModeDialog',
} as const;
@Injectable()
export abstract class IqserUserPreferenceService extends GenericService<UserAttributes> {
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<void> {
await this.save(KEYS.theme, theme);
window.location.reload();
}
getLanguage(): string {
return this._getAttribute(KEYS.language);
}
async saveLanguage(language: string): Promise<void> {
await this.save(KEYS.language, language);
}
getHelpModeDialog(): boolean {
return this._getAttribute(KEYS.helpModeDialog, 'false') === 'true';
}
async toggleHelpModeDialog(): Promise<void> {
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<void> {
const attributes = await firstValueFrom(this.getAll<UserAttributes>());
this.#userAttributes = attributes ?? {};
}
savePreferences(body: List, key: string) {
return this._put(body, `${this._defaultModelPath}/${key}`);
}
async save(key: string, value: string): Promise<void> {
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;
}