From b6a31a743acce5ac154eeefbe9689e8143af9ee5 Mon Sep 17 00:00:00 2001 From: ievavold <ievavold@wisc.edu> Date: Wed, 5 Jun 2019 09:59:44 -0500 Subject: [PATCH] add error handling to metadata API call --- .../dars/dars-view/dars-view.component.html | 20 ++++++++++--------- src/app/dars/store/actions.ts | 12 +++++++++++ src/app/dars/store/effects.ts | 15 +++++++++++--- src/app/dars/store/reducer.ts | 10 ++++++++++ src/app/dars/store/state.ts | 2 ++ 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/app/dars/dars-view/dars-view.component.html b/src/app/dars/dars-view/dars-view.component.html index 8de331c..8f67efe 100644 --- a/src/app/dars/dars-view/dars-view.component.html +++ b/src/app/dars/dars-view/dars-view.component.html @@ -32,14 +32,16 @@ </div> </div> - <div *ngIf="(metadataStatus$ | async) == 'Loaded'; then loadedMetadata else loadingMetadata"></div> - - <ng-template #loadedMetadata> - <cse-dars-metadata-table></cse-dars-metadata-table> - </ng-template> - - <ng-template #loadingMetadata> - <h2>loading metadata</h2> - </ng-template> + <ng-container [ngSwitch]="metadataStatus$ | async"> + <ng-container *ngSwitchCase="'Error'"> + <h2 style="color:red">error loading metadata</h2> + </ng-container> + <ng-container *ngSwitchCase="'Loading'"> + <h2>loading metadata</h2> + </ng-container> + <ng-container *ngSwitchCase="'Loaded'"> + <cse-dars-metadata-table></cse-dars-metadata-table> + </ng-container> + </ng-container> </div> </mat-sidenav-container> diff --git a/src/app/dars/store/actions.ts b/src/app/dars/store/actions.ts index 2be78bf..6124756 100644 --- a/src/app/dars/store/actions.ts +++ b/src/app/dars/store/actions.ts @@ -3,17 +3,29 @@ import { AuditMetadata } from '../models/audit-metadata'; import { Audit } from '../models/audit'; export enum DarsActionTypes { + ErrorLoadingMetadata = '[DARS] Error Loading Metadata', StartLoadingMetadata = '[DARS] Start Loading Metadata', + ErrorLoadingAudit = '[DARS] Error Loading Audit', AddAuditMetadata = '[DARS] Add Audit Metadata', StartLoadingAudit = '[DARS] Start Loading Audit', DoneLoadingAudit = '[DARS] Done Loading Audit', CloseAudit = '[DARS] Close Audit', } +export class ErrorLoadingMetadata implements Action { + public readonly type = DarsActionTypes.ErrorLoadingMetadata; + constructor(public payload: { message: string }) {} +} + export class StartLoadingMetadata implements Action { public readonly type = DarsActionTypes.StartLoadingMetadata; } +export class ErrorLoadingAudit implements Action { + public readonly type = DarsActionTypes.ErrorLoadingAudit; + constructor(public payload: { message: string }) {} +} + export class AddAuditMetadata implements Action { public readonly type = DarsActionTypes.AddAuditMetadata; constructor(public payload: { metadata: AuditMetadata[] }) {} diff --git a/src/app/dars/store/effects.ts b/src/app/dars/store/effects.ts index 4c0a3aa..150fe2a 100644 --- a/src/app/dars/store/effects.ts +++ b/src/app/dars/store/effects.ts @@ -1,8 +1,10 @@ import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; -import { DarsActionTypes, AddAuditMetadata } from '@app/dars/store/actions'; -import { flatMap, map } from 'rxjs/operators'; +import { DarsActionTypes } from '@app/dars/store/actions'; +import * as darsActions from '@app/dars/store/actions'; +import { flatMap, map, catchError } from 'rxjs/operators'; import { DarsApiService } from '../services/api.service'; +import { of } from 'rxjs'; @Injectable() export class DARSEffects { @@ -12,6 +14,13 @@ export class DARSEffects { load$ = this.actions$.pipe( ofType(DarsActionTypes.StartLoadingMetadata), flatMap(() => this.api.getAudits()), - map(metadata => new AddAuditMetadata({ metadata })), + map(metadata => new darsActions.AddAuditMetadata({ metadata })), + catchError(() => { + return of( + new darsActions.ErrorLoadingMetadata({ + message: 'Unable to load audit metadata. Please try again', + }), + ); + }), ); } diff --git a/src/app/dars/store/reducer.ts b/src/app/dars/store/reducer.ts index 702d31a..bbb811d 100644 --- a/src/app/dars/store/reducer.ts +++ b/src/app/dars/store/reducer.ts @@ -3,6 +3,7 @@ import { DarsActionTypes } from './actions'; import * as darsActions from './actions'; type SupportedActions = + | darsActions.ErrorLoadingMetadata | darsActions.AddAuditMetadata | darsActions.StartLoadingAudit | darsActions.DoneLoadingAudit @@ -13,6 +14,15 @@ export function darsReducer( action: SupportedActions, ): DARSState { switch (action.type) { + case DarsActionTypes.ErrorLoadingMetadata: { + return { + ...state, + metadata: { + status: 'Error', + message: action.payload.message, + }, + }; + } case DarsActionTypes.AddAuditMetadata: { if (state.metadata.status === 'Loaded') { return { diff --git a/src/app/dars/store/state.ts b/src/app/dars/store/state.ts index 7a1632e..8986599 100644 --- a/src/app/dars/store/state.ts +++ b/src/app/dars/store/state.ts @@ -3,9 +3,11 @@ import { Audit } from '../models/audit'; export interface DARSState { metadata: + | { status: 'Error'; message: string } | { status: 'Loading' } | { status: 'Loaded'; metadata: AuditMetadata[] }; visibleAudit: + | { status: 'Error'; message: string } | { status: 'NotLoaded' } | { status: 'Loading'; metadata: AuditMetadata } | { status: 'Loaded'; metadata: AuditMetadata; audit: Audit }; -- GitLab