From a5a098a3868f587e5baea4c9aeec071745999b1e Mon Sep 17 00:00:00 2001
From: Cathy Hu <cathy.hu@fau.de>
Date: Tue, 1 Sep 2020 21:56:24 +0200
Subject: [PATCH] [frontend] Add overlay on network error

---
 .../src/app/core/auth/error.interceptor.ts    | 14 ++++++++++-
 .../app/shared/overlay/overlay.component.html |  4 ++++
 .../app/shared/overlay/overlay.component.scss | 11 +++++++++
 .../shared/overlay/overlay.component.spec.ts  | 24 +++++++++++++++++++
 .../app/shared/overlay/overlay.component.ts   | 12 ++++++++++
 .../src/app/shared/shared.module.ts           |  8 ++++++-
 6 files changed, 71 insertions(+), 2 deletions(-)
 create mode 100644 kibicara-frontend/src/app/shared/overlay/overlay.component.html
 create mode 100644 kibicara-frontend/src/app/shared/overlay/overlay.component.scss
 create mode 100644 kibicara-frontend/src/app/shared/overlay/overlay.component.spec.ts
 create mode 100644 kibicara-frontend/src/app/shared/overlay/overlay.component.ts

diff --git a/kibicara-frontend/src/app/core/auth/error.interceptor.ts b/kibicara-frontend/src/app/core/auth/error.interceptor.ts
index b8adc78..555e834 100644
--- a/kibicara-frontend/src/app/core/auth/error.interceptor.ts
+++ b/kibicara-frontend/src/app/core/auth/error.interceptor.ts
@@ -10,10 +10,16 @@ import { Observable, throwError } from 'rxjs';
 import { LoginService } from './login.service';
 import { catchError } from 'rxjs/operators';
 import { Router } from '@angular/router';
+import { MatSnackBar } from '@angular/material/snack-bar';
+import { OverlayComponent } from 'src/app/shared/overlay/overlay.component';
 
 @Injectable()
 export class ErrorInterceptor implements HttpInterceptor {
-  constructor(private loginService: LoginService, private router: Router) {}
+  constructor(
+    private loginService: LoginService,
+    private router: Router,
+    private _snackBar: MatSnackBar
+  ) {}
 
   intercept(
     request: HttpRequest<unknown>,
@@ -24,6 +30,12 @@ export class ErrorInterceptor implements HttpInterceptor {
         if (err.error instanceof ProgressEvent) {
           // TODO Add spinner/overlay in app to prevent user input
           console.log('Networkerror');
+          this._snackBar.openFromComponent(OverlayComponent, {
+            verticalPosition: 'top',
+          });
+          setTimeout(function () {
+            window.location.reload();
+          }, 20000);
         } else if (err.status === 401) {
           this.loginService.logout();
           location.reload(true);
diff --git a/kibicara-frontend/src/app/shared/overlay/overlay.component.html b/kibicara-frontend/src/app/shared/overlay/overlay.component.html
new file mode 100644
index 0000000..6ffaaf0
--- /dev/null
+++ b/kibicara-frontend/src/app/shared/overlay/overlay.component.html
@@ -0,0 +1,4 @@
+<div class="container">
+  <p>Network connection lost. Reconnecting...</p>
+  <mat-spinner class="spinner"></mat-spinner>
+</div>
diff --git a/kibicara-frontend/src/app/shared/overlay/overlay.component.scss b/kibicara-frontend/src/app/shared/overlay/overlay.component.scss
new file mode 100644
index 0000000..d05e06f
--- /dev/null
+++ b/kibicara-frontend/src/app/shared/overlay/overlay.component.scss
@@ -0,0 +1,11 @@
+.container {
+  margin: 10%;
+  text-align: center;
+}
+
+.spinner {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+  width: 40%;
+}
diff --git a/kibicara-frontend/src/app/shared/overlay/overlay.component.spec.ts b/kibicara-frontend/src/app/shared/overlay/overlay.component.spec.ts
new file mode 100644
index 0000000..02a3020
--- /dev/null
+++ b/kibicara-frontend/src/app/shared/overlay/overlay.component.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { OverlayComponent } from './overlay.component';
+
+describe('OverlayComponent', () => {
+  let component: OverlayComponent;
+  let fixture: ComponentFixture<OverlayComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [OverlayComponent],
+    }).compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(OverlayComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/kibicara-frontend/src/app/shared/overlay/overlay.component.ts b/kibicara-frontend/src/app/shared/overlay/overlay.component.ts
new file mode 100644
index 0000000..bc6890d
--- /dev/null
+++ b/kibicara-frontend/src/app/shared/overlay/overlay.component.ts
@@ -0,0 +1,12 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-overlay',
+  templateUrl: './overlay.component.html',
+  styleUrls: ['./overlay.component.scss'],
+})
+export class OverlayComponent implements OnInit {
+  constructor() {}
+
+  ngOnInit(): void {}
+}
diff --git a/kibicara-frontend/src/app/shared/shared.module.ts b/kibicara-frontend/src/app/shared/shared.module.ts
index 5ea0155..6645dd2 100644
--- a/kibicara-frontend/src/app/shared/shared.module.ts
+++ b/kibicara-frontend/src/app/shared/shared.module.ts
@@ -7,9 +7,15 @@ import { RouterModule } from '@angular/router';
 import { CommonModule } from '@angular/common';
 import { Ng2SearchPipeModule } from 'ng2-search-filter';
 import { YesNoDialogComponent } from './yes-no-dialog/yes-no-dialog.component';
+import { OverlayComponent } from './overlay/overlay.component';
 
 @NgModule({
-  declarations: [ToolbarComponent, NotFoundComponent, YesNoDialogComponent],
+  declarations: [
+    ToolbarComponent,
+    NotFoundComponent,
+    YesNoDialogComponent,
+    OverlayComponent,
+  ],
   imports: [
     MaterialModule,
     ReactiveFormsModule,