Add http error messages

This commit is contained in:
Patrick Gebhardt 2020-06-24 12:56:47 +02:00
parent 6cd226bf56
commit 8c296e9397
5 changed files with 34 additions and 4 deletions

View File

@ -4,7 +4,11 @@
<span *ngIf="bookmarks.length === 0">You have no bookmarks :(</span>
</div>
<div *ngIf="isLoading" class="spinner">
<div *ngIf="isLoading && !message" class="spinner">
<mat-spinner></mat-spinner>
</div>
<div *ngIf="message" class="spinner">
<span>{{message}}</span>
</div>

View File

@ -2,9 +2,10 @@ import {Component, OnDestroy, OnInit} from '@angular/core';
import {Region} from '../../interfaces/region.interface';
import {BookmarkService} from '../../services/bookmark.service';
import {DataService} from '../../services/data.service';
import {switchMap, takeUntil, tap} from 'rxjs/operators';
import {catchError, switchMap, takeUntil, tap} from 'rxjs/operators';
import {Router} from '@angular/router';
import {Subject} from 'rxjs';
import {HttpErrorResponse} from '@angular/common/http';
@Component({
selector: 'app-bookmark-list',
@ -15,6 +16,7 @@ export class BookmarkListComponent implements OnInit, OnDestroy {
bookmarks: Region[];
isLoading = true;
message: string;
private destroyed$ = new Subject<void>();
constructor(private bs: BookmarkService, private ds: DataService, private router: Router) {
@ -27,9 +29,14 @@ export class BookmarkListComponent implements OnInit, OnDestroy {
switchMap(ids => {
const regions: Promise<Region>[] = ids.map(id => this.ds.getRegion(id));
return Promise.all(regions);
}),
catchError((err, caught) => {
this.message = `${(err as HttpErrorResponse).status}: ${(err as HttpErrorResponse).statusText} :/`;
return caught;
})
).subscribe(regions => {
this.bookmarks = regions;
this.message = undefined;
this.isLoading = false;
});
}

View File

@ -1,6 +1,9 @@
<app-search-input></app-search-input>
<h2>Explore the world</h2>
<div class="region-container">
<div *ngIf="!loading && !message" class="region-container">
<span>No regions to explore :/</span>
<app-region (click)="onRegionClick(region)" *ngFor="let region of regions" [region]="region"></app-region>
</div>
<mat-spinner *ngIf="loading" class="central"></mat-spinner>
<span *ngIf="message" class="central">{{message}}</span>

View File

@ -12,8 +12,14 @@ app-search-input {
.region-container {
display: flex;
flex-direction: column;
align-items: center;
> app-region {
margin-bottom: 2rem;
}
}
.central {
align-self: center;
margin: 4rem 0;
}

View File

@ -2,6 +2,7 @@ import {Component, OnInit} from '@angular/core';
import {Region} from '../../interfaces/region.interface';
import {DataService} from '../../services/data.service';
import {Router} from '@angular/router';
import {HttpErrorResponse} from '@angular/common/http';
@Component({
selector: 'app-home',
@ -13,12 +14,21 @@ export class HomeComponent implements OnInit {
private readonly MAX_REGIONS = 10;
regions: Region[];
message: string;
loading = true;
constructor(private ds: DataService, private router: Router) {
}
async ngOnInit() {
this.regions = await this.ds.getAllRegions(this.MAX_REGIONS);
try {
this.regions = await this.ds.getAllRegions(this.MAX_REGIONS);
} catch (e) {
this.message = `${(e as HttpErrorResponse).status}: ${(e as HttpErrorResponse).statusText} :/`;
} finally {
this.loading = false;
}
}
onRegionClick(region: Region) {