From 7c165f30ce6c3be1df8b929f0afef7f4179178a9 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Tue, 18 Mar 2025 13:33:11 -0600
Subject: [PATCH] add nav service

---
 .../src/shared/services/navigation.service.ts | 216 ++++++++++++++++++
 1 file changed, 216 insertions(+)
 create mode 100644 projects/nshmp-apps/src/shared/services/navigation.service.ts

diff --git a/projects/nshmp-apps/src/shared/services/navigation.service.ts b/projects/nshmp-apps/src/shared/services/navigation.service.ts
new file mode 100644
index 00000000..70328b79
--- /dev/null
+++ b/projects/nshmp-apps/src/shared/services/navigation.service.ts
@@ -0,0 +1,216 @@
+import {Injectable, Signal, signal} from '@angular/core';
+import {Navigation, NavigationList} from '@ghsc/nshmp-template';
+import {catchError, map, of} from 'rxjs';
+
+import * as ApplicationsUtils from '../utils/applications.utils';
+import {AuthService} from './auth.service';
+
+const APPS = ApplicationsUtils.apps();
+const DEV_APPS = ApplicationsUtils.devApps();
+const INTERNAL_APPS = ApplicationsUtils.internalApps();
+
+@Injectable({
+  providedIn: 'root',
+})
+export class NavigationService {
+  private navListSignal = signal<NavigationList[]>([]);
+  private devNavListSignal = signal<NavigationList[]>(this.devNavigationList());
+  private internalNavListSignal = signal<NavigationList[]>(
+    this.internalNavigationList(),
+  );
+
+  constructor(private authService: AuthService) {
+    this.navigation();
+  }
+
+  /**
+   * Returns the list of design map application.
+   */
+  designMapApps(): Navigation[] {
+    return Object.values(APPS.designMaps) as Navigation[];
+  }
+
+  devGmmApps(): Navigation[] {
+    return Object.values(DEV_APPS.gmm) as Navigation[];
+  }
+
+  devHazardApps(): Navigation[] {
+    return Object.values(DEV_APPS.hazard) as Navigation[];
+  }
+
+  /**
+   * Returns the list development main applications.
+   */
+  devMainApps(): Navigation[] {
+    return [
+      DEV_APPS.math.exceedanceExplorer,
+      DEV_APPS.hazard.dynamicCompare,
+      DEV_APPS.gmm.hangingWallEffects,
+    ];
+  }
+
+  devMathApps(): Navigation[] {
+    return Object.values(DEV_APPS.math) as Navigation[];
+  }
+
+  /**
+   * Returns the drop down navigation menu for development applications.
+   */
+  get devNavigation(): Signal<NavigationList[]> {
+    return this.devNavListSignal.asReadonly();
+  }
+
+  /**
+   * Returns the list of ground motion model applications.
+   */
+  gmmApps(): Navigation[] {
+    return Object.values(APPS.gmm) as Navigation[];
+  }
+
+  /**
+   * Returns list of hazard applications.
+   */
+  hazardApps(): Navigation[] {
+    return Object.values(APPS.hazard) as Navigation[];
+  }
+
+  /**
+   * Returns the list of AWS applications.
+   */
+  internalAwsApps(): Navigation[] {
+    return Object.values(INTERNAL_APPS.aws) as Navigation[];
+  }
+
+  internalMainApps(): Navigation[] {
+    return this.internalAwsApps();
+  }
+
+  get internalNavigation(): Signal<NavigationList[]> {
+    return this.internalNavListSignal.asReadonly();
+  }
+
+  get navigationList(): Signal<NavigationList[]> {
+    return this.navListSignal;
+  }
+
+  /**
+   * Returns the list services apps.
+   */
+  serviceApps(): Navigation[] {
+    return [APPS.services];
+  }
+
+  /**
+   * Returns the list of NCM appliations.
+   */
+  ncmApps(): Navigation[] {
+    return Object.values(APPS.ncm) as Navigation[];
+  }
+
+  /**
+   * Returns the list of source model applicaitons.
+   */
+  sourceModelApps(): Navigation[] {
+    return Object.values(APPS.source) as Navigation[];
+  }
+
+  private devNavigationList(): NavigationList[] {
+    const devNavigation: NavigationList[] = [
+      {
+        navigation: [DEV_APPS.dashboard],
+      },
+      {
+        navigation: this.devHazardApps(),
+        subHeader: 'Hazard',
+      },
+      {
+        navigation: this.devGmmApps(),
+        subHeader: 'Ground Motion Models',
+      },
+      {
+        navigation: this.devMathApps(),
+        subHeader: 'Math',
+      },
+    ];
+
+    return devNavigation;
+  }
+
+  private internalNavigationList(): NavigationList[] {
+    const internalNavigation: NavigationList[] = [
+      {
+        navigation: [INTERNAL_APPS.dashboard],
+      },
+      {
+        navigation: this.internalAwsApps(),
+        subHeader: 'AWS',
+      },
+    ];
+
+    return [...internalNavigation];
+  }
+
+  /**
+   * Get navigation.
+   */
+  private navigation() {
+    const navigation: NavigationList[] = [
+      {
+        navigation: [APPS.dashboard],
+      },
+      {
+        navigation: this.hazardApps(),
+        subHeader: 'Hazard',
+      },
+      {
+        navigation: this.sourceModelApps(),
+        subHeader: 'Source Models',
+      },
+      {
+        navigation: this.gmmApps(),
+        subHeader: 'Ground Motion Models',
+      },
+      {
+        navigation: this.designMapApps(),
+        subHeader: 'Design Map',
+      },
+      {
+        navigation: this.ncmApps(),
+        subHeader: 'National Crustal Model',
+      },
+      {
+        navigation: [DEV_APPS.dashboard, ...this.devMainApps()],
+        subHeader: 'Development',
+      },
+    ];
+
+    this.authService
+      .isAuthorized(false)
+      .pipe(
+        map(isInternal => {
+          if (isInternal) {
+            navigation.push({
+              navigation: this.internalMainApps(),
+              subHeader: 'Internal',
+            });
+          }
+
+          navigation.push({
+            navigation: [APPS.services],
+          });
+
+          return navigation;
+        }),
+        catchError(() => {
+          navigation.push({
+            navigation: [APPS.services],
+          });
+          this.navListSignal.set(navigation);
+          return of();
+        }),
+      )
+      .subscribe(navList => {
+        this.navListSignal.set(navList);
+      });
+  }
+}
-- 
GitLab