From 597a532b5579f6fe08ac81ac507f0c9f5da61683 Mon Sep 17 00:00:00 2001
From: Benhammou Mohammed Rachid <mrbenhammou@takima.fr>
Date: Tue, 28 May 2024 15:12:33 +0200
Subject: [PATCH] add overriding environment

---
 package-lock.json                     |  7 +++---
 package.json                          |  3 ++-
 src/app/app.config.ts                 |  3 ++-
 src/app/core/environment-init.ts      | 32 +++++++++++++++++++++++++++
 src/assets/environment.json           |  4 ++++
 src/environments/environment.model.ts |  4 ++++
 src/environments/environment.prod.ts  |  4 +++-
 src/environments/environment.ts       |  3 ++-
 8 files changed, 52 insertions(+), 8 deletions(-)
 create mode 100644 src/app/core/environment-init.ts
 create mode 100644 src/assets/environment.json
 create mode 100644 src/environments/environment.model.ts

diff --git a/package-lock.json b/package-lock.json
index 719e17d..70a284e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,7 @@
         "bootstrap-icons": "^1.11.3",
         "chart.js": "^4.4.1",
         "file-saver": "^2.0.5",
+        "lodash": "~4.17.21",
         "ng-bootstrap": "^1.6.3",
         "rxjs": "~7.8.0",
         "tslib": "^2.3.0",
@@ -8155,8 +8156,7 @@
     "node_modules/lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
@@ -18786,8 +18786,7 @@
     "lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "lodash.debounce": {
       "version": "4.0.8",
diff --git a/package.json b/package.json
index 4c0c6a3..cab38b3 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,8 @@
     "ng-bootstrap": "^1.6.3",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
-    "zone.js": "~0.14.2"
+    "zone.js": "~0.14.2",
+    "lodash": "~4.17.21"
   },
   "devDependencies": {
     "@angular-devkit/build-angular": "^17.0.10",
diff --git a/src/app/app.config.ts b/src/app/app.config.ts
index 26ddcbb..3ac576b 100644
--- a/src/app/app.config.ts
+++ b/src/app/app.config.ts
@@ -3,8 +3,9 @@ import { provideRouter } from '@angular/router';
 
 import { routes } from './app.routes';
 import {provideHttpClient} from "@angular/common/http";
+import { ENVIRONMENT_INITIALIZER } from './core/environment-init';
 
 export const appConfig: ApplicationConfig = {
-  providers: [provideRouter(routes), provideHttpClient()]
+  providers: [provideRouter(routes), provideHttpClient(), ...ENVIRONMENT_INITIALIZER]
 };
 
diff --git a/src/app/core/environment-init.ts b/src/app/core/environment-init.ts
new file mode 100644
index 0000000..430a1e5
--- /dev/null
+++ b/src/app/core/environment-init.ts
@@ -0,0 +1,32 @@
+import { APP_INITIALIZER, InjectionToken, Provider } from "@angular/core";
+import { lastValueFrom, map, ReplaySubject } from "rxjs";
+import { merge } from "lodash";
+import {HttpClient} from '@angular/common/http';
+import { environment } from "src/environments/environment";
+import { Environment } from "src/environments/environment.model";
+
+export const ENVIRONMENT = new InjectionToken('env');
+const environmentSubject = new ReplaySubject<Environment>(1);
+const environment$ = environmentSubject.asObservable();
+
+export const ENVIRONMENT_INITIALIZER: Provider[] = [
+    {
+        provide: APP_INITIALIZER,
+        useFactory: environmentInitializer,
+        multi: true,
+        deps: [HttpClient],
+    },
+    { provide: ENVIRONMENT, useValue: environment$ },
+];
+
+export function environmentInitializer(
+    http: HttpClient
+): () => Promise<Environment> {
+    return () => {
+        let res = http
+            .get<Environment>('/assets/environment.json')
+            .pipe(map(e => merge(environment, e)));
+        res.subscribe(environmentSubject);
+        return lastValueFrom(res);
+    };
+}
\ No newline at end of file
diff --git a/src/assets/environment.json b/src/assets/environment.json
new file mode 100644
index 0000000..77c139c
--- /dev/null
+++ b/src/assets/environment.json
@@ -0,0 +1,4 @@
+{
+    "production": false,
+    "url": "http://api.allocine.takima.dev"
+}
diff --git a/src/environments/environment.model.ts b/src/environments/environment.model.ts
new file mode 100644
index 0000000..13f6de5
--- /dev/null
+++ b/src/environments/environment.model.ts
@@ -0,0 +1,4 @@
+export interface Environment {
+    production: boolean;
+    url: string;
+}
\ No newline at end of file
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
index c42434a..4474dde 100644
--- a/src/environments/environment.prod.ts
+++ b/src/environments/environment.prod.ts
@@ -1,4 +1,6 @@
-export const environment = {
+import { Environment } from "./environment.model";
+
+export const environment: Environment = {
   production: true,
   url: 'localhost:8080'
 };
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
index e7a4407..f4e884c 100644
--- a/src/environments/environment.ts
+++ b/src/environments/environment.ts
@@ -1,5 +1,6 @@
+import { Environment } from "./environment.model";
 
-export const environment = {
+export const environment: Environment = {
   production: false,
   url: 'http://localhost:8080'
 };
-- 
GitLab