import { Injectable } from '@angular/core'; import { Observable, Subject } from 'rxjs'; import { filter } from 'rxjs/operators'; import { Alert, AlertType, AlertOptions } from '@app/_models'; @Injectable({ providedIn: 'root' }) export class AlertService { private subject = new Subject(); private defaultId = 'default-alert'; // enable subscribing to alerts observable onAlert(id = this.defaultId): Observable { return this.subject.asObservable().pipe(filter(x => x && x.id === id)); } // convenience methods success(message: string, options?: AlertOptions) { this.alert(new Alert({ ...options, type: AlertType.Success, message })); } error(message: string, options?: AlertOptions) { this.alert(new Alert({ ...options, type: AlertType.Error, message })); } info(message: string, options?: AlertOptions) { this.alert(new Alert({ ...options, type: AlertType.Info, message })); } warn(message: string, options?: AlertOptions) { this.alert(new Alert({ ...options, type: AlertType.Warning, message })); } // main alert method alert(alert: Alert) { alert.id = alert.id || this.defaultId; this.subject.next(alert); } // clear alerts clear(id = this.defaultId) { this.subject.next(new Alert({ id })); } }