import { Inject } from "@angular/core"; import { AuthService } from '../auth/auth.service'; import { HttpHeaders, HttpParams, HttpClient } from '@angular/common/http'; import * as signalR from "@aspnet/signalr"; import { Observable, BehaviorSubject } from "rxjs"; import { Store, select, UPDATE } from '../../../@ngrx/store'; import { UPDATEE } from "../baseclass/UnifiedNotificationReducer"; import { UnifiedNotificationObject } from "../interface/UnifiedNotificationObject"; import { RequireInteractiveControl } from "../interface/Interactive Component/RequireInteractiveControl"; import { WebNotificationService } from '../auth/webNotification.service'; interface AppStateUnot { unot: NotificationMod; } export class NotificationMod { totalcount: number; instance: NotificationFigure[]; } export class NotificationFigure { statusName: string; instanceCount: number; } export class UnifiedNotificationService { connection: signalR.HubConnection; unot$: Observable; public notificationModSub: BehaviorSubject; totalcount: number; totalcount$: Observable; notificationMod: NotificationMod; statustypecount: number; currentstatustypecount: number; constructor(private authService: AuthService, public http: HttpClient, @Inject('syncserviceurl') public syncserviceUrl: string, private store: Store) { this.unot$ = store.pipe(select('unot')); this.connection = new signalR.HubConnectionBuilder() .withUrl(syncserviceUrl + "NotificationHub", { accessTokenFactory: () => this.authService.getAccessToken() }) .build(); this.connection.start().then(() => { console.log('Hub connection started'); }).catch(err => { }); this.connection.on("IstatusNotification", data => { let status: string = data; // alert(status); this.UpdateCount(status); }); this.notificationModSub = new BehaviorSubject({}); } public InitiateCount(statuslist: string[]) { this.currentstatustypecount = 0; this.statustypecount = statuslist.length; this.totalcount = 0; if (statuslist.length == 0) { let unotres = {}; unotres.totalcount = 0; this.notificationModSub.next(unotres); this.store.dispatch({ type: UPDATEE, value: unotres }); } else { for (let x in statuslist) { this.UpdateCount(statuslist[x]); } } } public UpdateCount(status: string) { this.StatusCount(status).subscribe(s => { this.unot$.subscribe(unotres => { if (unotres == null) { unotres = {}; } if (unotres.instance != null) { } else { unotres.instance = []; } var item = unotres.instance.find(x => x.statusName == status); if (item == null) { var newitem: NotificationFigure = { instanceCount: s, statusName: status }; this.totalcount += s; unotres.totalcount = this.totalcount; if (unotres.totalcount > 99) { unotres.totalcount = 99; } unotres.instance.push(newitem); } else { var newitem: NotificationFigure = { instanceCount: s, statusName: status }; unotres.instance.splice(unotres.instance.findIndex(s => s.statusName == status), 1); unotres.instance.push(newitem); var countnew: number = 0; for (let x in unotres.instance) { countnew += unotres.instance[x].instanceCount; } this.totalcount = countnew; unotres.totalcount = this.totalcount; if (unotres.totalcount > 99) { unotres.totalcount = 99; } // unotres.instance.push(newitem); } this.currentstatustypecount += 1; unotres.instance = unotres.instance.sort( (n1, n2) => { return n2.instanceCount - n1.instanceCount; }); this.notificationModSub.next(unotres); this.store.dispatch({ type: UPDATEE, value: unotres }); } ); } ); } public StatusCount(status: string): Observable { var optionss = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Authorization': this.authService.getAuthorizationHeaderValue() }), params: new HttpParams() }; return this.http.get(this.syncserviceUrl + "api/Notification/GetUnifiedNotificationCount?status=" + status, optionss); } public GetNotificationList(status: string): Observable { var optionss = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Authorization': this.authService.getAuthorizationHeaderValue() }), params: new HttpParams() }; return this.http.get(this.syncserviceUrl + "api/Notification/GetUnifiedNotificationObjects?status=" + status, optionss); } public GetAllUnifiedNotificationList(): Observable { var optionss = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Authorization': this.authService.getAuthorizationHeaderValue() }), params: new HttpParams() }; return this.http.get(this.syncserviceUrl + "api/Notification/GetAllUnifiedNotificationList", optionss); } public GetStatusList() { var optionss = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Authorization': this.authService.getAuthorizationHeaderValue() }), params: new HttpParams() }; return this.http.get(this.syncserviceUrl + "api/Notification/GetUnifiedNotificationStatus", optionss); } public GetUnifiedNotificationCountByModule(modulename: string): Observable { var optionss = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Authorization': this.authService.getAuthorizationHeaderValue() }), params: new HttpParams() }; return this.http.get(this.syncserviceUrl + "api/Notification/GetUnifiedNotificationCountByModule?modulename=" + modulename, optionss); } } export class UnifiedNotificationObjectClass implements UnifiedNotificationObject, RequireInteractiveControl { id: string; isLocked: boolean; applicationName: string; objectName: string; docName: string; objectType: string; objectId: string; description: string; requiredClaim: string; urlLink: string; status: string; } export class UnifiedOcNotificationObjectClass extends UnifiedNotificationObjectClass { oclist: string[] }