Newer
Older
/**
* This file is part of Anis Client.
*
* @copyright Laboratoire d'Astrophysique de Marseille / CNRS
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { of } from 'rxjs';
import { map, tap, mergeMap, catchError } from 'rxjs/operators';
import { ToastrService } from 'ngx-toastr';
import * as coneSearchActions from '../actions/cone-search.actions';
import { ConeSearchService } from '../services/cone-search.service';
/**
* @class
* @classdesc Cone search effects.
*/
/**
* Calls actions to retrieve object coordinates.
*/
retrieveCoordinates$ = createEffect((): any =>
this.actions$.pipe(
ofType(coneSearchActions.retrieveCoordinates),
mergeMap((action) => this.coneSearchService.retrieveCoordinates(action.name)
.pipe(
map(response => {
const parser = new DOMParser();
const xml = parser.parseFromString(response,'text/xml');
if (xml.getElementsByTagName('Resolver').length === 0) {
return coneSearchActions.retrieveCoordinatesFail();
}
const name = xml.getElementsByTagName('name')[0].childNodes[0].nodeValue;
const ra = +xml.getElementsByTagName('jradeg')[0].childNodes[0].nodeValue;
const dec = +xml.getElementsByTagName('jdedeg')[0].childNodes[0].nodeValue;
const resolver = { name, ra, dec };
return coneSearchActions.retrieveCoordinatesSuccess({ resolver });
}),
catchError(() => of(coneSearchActions.retrieveCoordinatesFail()))
)
)
)
);
/**
* Displays retrieve object coordinates error notification.
*/
retrieveCoordinatesFail$ = createEffect(() =>
this.actions$.pipe(
ofType(coneSearchActions.retrieveCoordinatesFail),
tap(() => this.toastr.error('Failure to retrieve coordinates', 'The coordinates could not be retrieved'))
);
constructor(
private actions$: Actions,
private coneSearchService: ConeSearchService,
private toastr: ToastrService
) {}
}