summaryrefslogtreecommitdiffstats
path: root/src/app/services/user-settings.service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/services/user-settings.service.ts')
-rw-r--r--src/app/services/user-settings.service.ts111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/app/services/user-settings.service.ts b/src/app/services/user-settings.service.ts
new file mode 100644
index 0000000..cbaa992
--- /dev/null
+++ b/src/app/services/user-settings.service.ts
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2022. Deutsche Telekom AG
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+
+import { distinctUntilChanged, map, pluck, switchMap, take } from 'rxjs/operators';
+import { PreferencesResponse, PreferencesService } from '../../../openapi/output';
+import {
+ DashboardAppsModel,
+ DashboardModel,
+ DashboardTileSettings,
+ defaultUserSettings,
+ LastUserActionSettings, STATE_KEYS,
+ UpdateUserPreferenceModel,
+ UserPreferencesModel,
+} from '../model/user-preferences.model';
+import { BehaviorSubject, Observable, pipe, UnaryFunction } from 'rxjs';
+import { mergeWith as _mergeWith, isObject as _isObject } from 'lodash';
+import { isString } from '../helpers/helpers';
+import { Injectable } from '@angular/core';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class UserSettingsService {
+ private userSettings: UserPreferencesModel = defaultUserSettings;
+ private preferencesTracker$ = new BehaviorSubject<UserPreferencesModel>(this.userSettings);
+
+ constructor(private preferencesService: PreferencesService) {
+ this.getPreferences();
+ }
+
+ getPreferences$(): Observable<UserPreferencesModel> {
+ return this.preferencesTracker$.asObservable();
+ }
+
+ selectDashboard = () =>
+ this.getPreferences$().pipe(selectDistinctState<UserPreferencesModel, DashboardModel>(STATE_KEYS.DASHBOARD));
+ selectDashboardApps = () =>
+ this.selectDashboard().pipe(selectDistinctState<DashboardModel, DashboardAppsModel>(STATE_KEYS.APPS));
+ selectDashboardAvailableTiles = () =>
+ this.selectDashboardApps().pipe(selectDistinctState<DashboardAppsModel, DashboardTileSettings[]>(STATE_KEYS.TILES));
+ selectLastUserAction = () =>
+ this.selectDashboardApps().pipe(
+ selectDistinctState<DashboardAppsModel, LastUserActionSettings>(STATE_KEYS.USER_ACTIONS),
+ );
+
+ getPreferences(): void {
+ this.preferencesService
+ .getPreferences()
+ .pipe(
+ map(preferences => {
+ return _mergeWith({}, defaultUserSettings, preferences.properties, (objValue, srcValue) => {
+ if (
+ (Array.isArray(srcValue) && !srcValue.some(_isObject)) ||
+ isString(srcValue) ||
+ typeof srcValue === 'boolean' ||
+ Number.isInteger(srcValue)
+ ) {
+ return srcValue;
+ }
+ }) as UserPreferencesModel;
+ }),
+ )
+ .subscribe(userPreferences => {
+ this.preferencesTracker$.next(userPreferences);
+ });
+ }
+
+ updatePreferences(preferences: UpdateUserPreferenceModel): Observable<PreferencesResponse> {
+ return this.getPreferences$().pipe(
+ take(1),
+ switchMap(data => {
+ const properties = _mergeWith({}, data, preferences, (objValue, srcValue) => {
+ if (
+ Array.isArray(srcValue) ||
+ isString(srcValue) ||
+ typeof srcValue === 'boolean' ||
+ Number.isInteger(srcValue)
+ ) {
+ return srcValue;
+ }
+ }) as UserPreferencesModel;
+ this.preferencesTracker$.next(properties);
+ return this.preferencesService.savePreferences({ properties });
+ }),
+ );
+ }
+
+ removePreferences(): Observable<PreferencesResponse> {
+ return this.preferencesService.updatePreferences({ properties: {} });
+ }
+}
+
+export function selectDistinctState<T, I>(key: string): UnaryFunction<Observable<T>, Observable<I>> {
+ return pipe(pluck<T, I>(key), distinctUntilChanged<I>());
+}