92 lines
2.8 KiB
TypeScript
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;
|
|
}
|