member_webapp/@overflow/noauth-probe/component/noauth-probe-list.component.ts
2018-06-14 14:35:59 +09:00

98 lines
2.8 KiB
TypeScript

import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';
import { Store, select } from '@ngrx/store';
import { Observable, of, Subscription } from 'rxjs';
import { catchError, exhaustMap, map, tap, take } from 'rxjs/operators';
import { NoAuthProbe } from '@overflow/commons-typescript/model/noauth';
import { AuthSelector } from '@overflow/shared/auth/store';
import { DomainMember } from '@overflow/commons-typescript/model/domain';
import { NoAuthProbeService } from '../service/noauth-probe.service';
import { NoAuthProbeSubscriber, NoAuthProbeNotify } from '../subscriber/noauth-probe.subscriber';
@Component({
selector: 'of-noauth-probe-list',
templateUrl: './noauth-probe-list.component.html',
})
export class NoAuthProbeListComponent implements OnInit, OnDestroy {
pending$: Observable<boolean>;
error$: Observable<any>;
noauthProbes: NoAuthProbe[];
noauthProbeSubscription: Subscription;
@Output() select = new EventEmitter<NoAuthProbe>();
constructor(
private store: Store<any>,
private noAuthProbeService: NoAuthProbeService,
private noAuthProbeSubscriber: NoAuthProbeSubscriber,
) {
this.noauthProbes = [];
this.noauthProbeSubscription = null;
}
ngOnInit() {
this.store.pipe(
tap(() => {
this.pending$ = of(true);
}),
select(AuthSelector.selectDomainMember),
exhaustMap((domainMember: DomainMember) =>
this.noAuthProbeService.readAllByDomainID(domainMember.domain.id)
.pipe(
map((noauthProbes: NoAuthProbe[]) => {
this.setNoauthProbes(noauthProbes);
}),
catchError(error => {
this.setError$(error);
return of();
})
)
),
tap(() => {
this.pending$ = of(false);
}),
take(1),
).subscribe();
this.noauthProbeSubscription = this.noAuthProbeSubscriber.observable().pipe(
tap((noAuthProbeNotify: NoAuthProbeNotify) => {
const noauthProbes = [];
this.noauthProbes.forEach(noauthProbe => {
const n = noAuthProbeNotify.params;
if (noauthProbe.id === n.id) {
noauthProbes.push(n);
} else {
noauthProbes.push(noauthProbe);
}
});
this.setNoauthProbes(noauthProbes);
}
),
).subscribe();
}
ngOnDestroy(): void {
if (null !== this.noauthProbeSubscription) {
this.noauthProbeSubscription.unsubscribe();
}
}
private setNoauthProbes(noauthProbes: NoAuthProbe[]): void {
if (null === noauthProbes) {
return;
}
noauthProbes.forEach(noauthProbe => {
noauthProbe.infraHost = JSON.parse(noauthProbe.infraHostMeta);
});
this.noauthProbes = noauthProbes;
}
private setError$(error: any): void {
this.error$ = of(error);
}
}