import { Injectable } from '@angular/core'; import { MatSnackBar } from '@angular/material/snack-bar'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { Action } from '@ngrx/store'; import { get, join, map as _map } from 'lodash'; import { ToastrService } from 'ngx-toastr'; import { Observable, of } from 'rxjs'; import { catchError, map, switchMap, tap } from 'rxjs/operators'; import { SeamsHttpResponse } from '../../shared/models/http-response'; import { CaseNotesActionTypes, LoadCaseNotesAction, LoadCaseNotesFailAction, LoadCaseNotesSuccessAction, SaveCaseNotesAction, SaveCaseNotesFailAction, SaveCaseNotesSuccessAction } from '../actions/case-notes.action'; import { CaseNotes } from '../models/case-notes/case-notes'; import { SaveCaseNotes } from '../models/case-notes/save-case-notes'; import { CaseNotesService } from '../services/case-notes.service'; import {handleLoadFail, handleSuccess} from "../functions/handle-response"; @Injectable() export class CaseNotesEffects { @Effect() loadCaseNotes$: Observable = this.actions$.pipe( ofType(CaseNotesActionTypes.LoadCaseNotes), map((action: LoadCaseNotesAction) => action.payload), switchMap((payload: number) => { return this.caseNotesService.getCaseNotes( payload ).pipe( map((caseNotes: CaseNotes[]) => new LoadCaseNotesSuccessAction( caseNotes )), catchError((err: unknown) => of(new LoadCaseNotesFailAction( new SeamsHttpResponse( get(err, 'error') ) ))), ); }), ); @Effect() saveCaseNotes$: Observable = this.actions$.pipe( ofType(CaseNotesActionTypes.SaveCaseNotes), map((action: SaveCaseNotesAction) => action.payload), switchMap((payload: SaveCaseNotes) => { return this.caseNotesService.saveCaseNotes( payload ).pipe( map((data: number) => new SaveCaseNotesSuccessAction( get(payload, 'caseId') )), catchError((err: unknown) => of(new SaveCaseNotesFailAction( new SeamsHttpResponse( get(err, 'error') ) ))), ); }), ); @Effect({ dispatch: false }) saveSuccessAction$: Observable = this.actions$.pipe( ofType(CaseNotesActionTypes.SaveCaseNotesSuccess), map((action: SaveCaseNotesSuccessAction) => get(action, 'payload')), tap((data: number) => { handleSuccess(this.toastr); this.caseNotesService.dispatchLoadCaseNotes( data ); }), ); @Effect({ dispatch: false }) saveFailAction$: Observable = this.actions$.pipe( ofType(CaseNotesActionTypes.SaveCaseNotesFail), map((action: SaveCaseNotesFailAction) => get(action, 'payload')), tap((response: SeamsHttpResponse) => { handleLoadFail(this.toastr, _map( get(response, 'seamsErrorCodes'), 'value' ) ); }), ); constructor(private actions$: Actions, private snackBar: MatSnackBar, private caseNotesService: CaseNotesService, private toastr: ToastrService) { } }