UI: Added sequenceNumber in WS notification updated

This commit is contained in:
Vladyslav_Prykhodko 2023-12-11 12:43:41 +02:00
parent e52782ee0e
commit 2f2e5911fd
4 changed files with 33 additions and 8 deletions

View File

@ -25,7 +25,7 @@ import {
} from '@angular/core'; } from '@angular/core';
import { NotificationWebsocketService } from '@core/ws/notification-websocket.service'; import { NotificationWebsocketService } from '@core/ws/notification-websocket.service';
import { BehaviorSubject, ReplaySubject, Subscription } from 'rxjs'; import { BehaviorSubject, ReplaySubject, Subscription } from 'rxjs';
import { distinctUntilChanged, map, share, tap } from 'rxjs/operators'; import { distinctUntilChanged, map, share, skip, tap } from 'rxjs/operators';
import { MatButton } from '@angular/material/button'; import { MatButton } from '@angular/material/button';
import { TbPopoverService } from '@shared/components/popover.service'; import { TbPopoverService } from '@shared/components/popover.service';
import { ShowNotificationPopoverComponent } from '@home/components/notification/show-notification-popover.component'; import { ShowNotificationPopoverComponent } from '@home/components/notification/show-notification-popover.component';
@ -100,7 +100,9 @@ export class NotificationBellComponent implements OnDestroy {
private initSubscription() { private initSubscription() {
this.notificationSubscriber = NotificationSubscriber.createNotificationCountSubscription(this.notificationWsService, this.zone); this.notificationSubscriber = NotificationSubscriber.createNotificationCountSubscription(this.notificationWsService, this.zone);
this.notificationCountSubscriber = this.notificationSubscriber.notificationCount$.subscribe(value => this.countSubject.next(value)); this.notificationCountSubscriber = this.notificationSubscriber.notificationCount$.pipe(
skip(1),
).subscribe(value => this.countSubject.next(value));
this.notificationSubscriber.subscribe(); this.notificationSubscriber.subscribe();
} }

View File

@ -22,7 +22,7 @@ import { AppState } from '@core/core.state';
import { Notification, NotificationRequest } from '@shared/models/notification.models'; import { Notification, NotificationRequest } from '@shared/models/notification.models';
import { NotificationWebsocketService } from '@core/ws/notification-websocket.service'; import { NotificationWebsocketService } from '@core/ws/notification-websocket.service';
import { BehaviorSubject, Observable, ReplaySubject, Subscription } from 'rxjs'; import { BehaviorSubject, Observable, ReplaySubject, Subscription } from 'rxjs';
import { map, share, tap } from 'rxjs/operators'; import { map, share, skip, tap } from 'rxjs/operators';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { NotificationSubscriber } from '@shared/models/websocket/notification-ws.models'; import { NotificationSubscriber } from '@shared/models/websocket/notification-ws.models';
@ -71,7 +71,9 @@ export class ShowNotificationPopoverComponent extends PageComponent implements O
}), }),
tap(() => setTimeout(() => this.cd.markForCheck())) tap(() => setTimeout(() => this.cd.markForCheck()))
); );
this.notificationCountSubscriber = this.notificationSubscriber.notificationCount$.subscribe(value => this.counter.next(value)); this.notificationCountSubscriber = this.notificationSubscriber.notificationCount$.pipe(
skip(1),
).subscribe(value => this.counter.next(value));
this.notificationSubscriber.subscribe(); this.notificationSubscriber.subscribe();
} }

View File

@ -610,21 +610,25 @@ export class AlarmCountUpdate extends CmdUpdate {
export class NotificationCountUpdate extends CmdUpdate { export class NotificationCountUpdate extends CmdUpdate {
totalUnreadCount: number; totalUnreadCount: number;
sequenceNumber: number;
constructor(msg: NotificationCountUpdateMsg) { constructor(msg: NotificationCountUpdateMsg) {
super(msg); super(msg);
this.totalUnreadCount = msg.totalUnreadCount; this.totalUnreadCount = msg.totalUnreadCount;
this.sequenceNumber = msg.sequenceNumber;
} }
} }
export class NotificationsUpdate extends CmdUpdate { export class NotificationsUpdate extends CmdUpdate {
totalUnreadCount: number; totalUnreadCount: number;
sequenceNumber: number;
update?: Notification; update?: Notification;
notifications?: Notification[]; notifications?: Notification[];
constructor(msg: NotificationsUpdateMsg) { constructor(msg: NotificationsUpdateMsg) {
super(msg); super(msg);
this.totalUnreadCount = msg.totalUnreadCount; this.totalUnreadCount = msg.totalUnreadCount;
this.sequenceNumber = msg.sequenceNumber;
this.update = msg.update; this.update = msg.update;
this.notifications = msg.notifications; this.notifications = msg.notifications;
} }

View File

@ -27,19 +27,27 @@ import { NgZone } from '@angular/core';
import { isDefinedAndNotNull } from '@core/utils'; import { isDefinedAndNotNull } from '@core/utils';
import { Notification } from '@shared/models/notification.models'; import { Notification } from '@shared/models/notification.models';
import { WsService, WsSubscriber } from '@shared/models/websocket/websocket.models'; import { WsService, WsSubscriber } from '@shared/models/websocket/websocket.models';
import { BehaviorSubject, ReplaySubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { WebsocketService } from '@core/ws/websocket.service'; import { WebsocketService } from '@core/ws/websocket.service';
export class NotificationSubscriber extends WsSubscriber { export class NotificationSubscriber extends WsSubscriber {
private notificationCountSubject = new ReplaySubject<NotificationCountUpdate>(1); private notificationCountSubject = new BehaviorSubject<NotificationCountUpdate>({
cmdId: 0,
cmdUpdateType: undefined,
errorCode: 0,
errorMsg: '',
totalUnreadCount: 0,
sequenceNumber: 0
});
private notificationsSubject = new BehaviorSubject<NotificationsUpdate>({ private notificationsSubject = new BehaviorSubject<NotificationsUpdate>({
cmdId: 0, cmdId: 0,
cmdUpdateType: undefined, cmdUpdateType: undefined,
errorCode: 0, errorCode: 0,
errorMsg: '', errorMsg: '',
notifications: null, notifications: null,
totalUnreadCount: 0 totalUnreadCount: 0,
sequenceNumber: 0
}); });
public messageLimit = 10; public messageLimit = 10;
@ -84,6 +92,10 @@ export class NotificationSubscriber extends WsSubscriber {
} }
onNotificationCountUpdate(message: NotificationCountUpdate) { onNotificationCountUpdate(message: NotificationCountUpdate) {
const currentNotificationCount = this.notificationCountSubject.value;
if (message.sequenceNumber <= currentNotificationCount.sequenceNumber) {
return;
}
if (this.zone) { if (this.zone) {
this.zone.run( this.zone.run(
() => { () => {
@ -103,6 +115,9 @@ export class NotificationSubscriber extends WsSubscriber {
onNotificationsUpdate(message: NotificationsUpdate) { onNotificationsUpdate(message: NotificationsUpdate) {
const currentNotifications = this.notificationsSubject.value; const currentNotifications = this.notificationsSubject.value;
if (message.sequenceNumber <= currentNotifications.sequenceNumber) {
message.totalUnreadCount = currentNotifications.totalUnreadCount;
}
let processMessage = message; let processMessage = message;
if (isDefinedAndNotNull(currentNotifications) && message.update) { if (isDefinedAndNotNull(currentNotifications) && message.update) {
currentNotifications.notifications.unshift(message.update); currentNotifications.notifications.unshift(message.update);
@ -165,13 +180,15 @@ export class MarkAllAsReadCmd implements WebsocketCmd {
export interface NotificationCountUpdateMsg extends CmdUpdateMsg { export interface NotificationCountUpdateMsg extends CmdUpdateMsg {
cmdUpdateType: CmdUpdateType.NOTIFICATIONS_COUNT; cmdUpdateType: CmdUpdateType.NOTIFICATIONS_COUNT;
totalUnreadCount: number; totalUnreadCount: number;
sequenceNumber: number;
} }
export interface NotificationsUpdateMsg extends CmdUpdateMsg { export interface NotificationsUpdateMsg extends CmdUpdateMsg {
cmdUpdateType: CmdUpdateType.NOTIFICATIONS; cmdUpdateType: CmdUpdateType.NOTIFICATIONS;
totalUnreadCount: number;
update?: Notification; update?: Notification;
notifications?: Notification[]; notifications?: Notification[];
totalUnreadCount: number;
sequenceNumber: number;
} }
export const isNotificationCountUpdateMsg = (message: WebsocketDataMsg): message is NotificationCountUpdateMsg => { export const isNotificationCountUpdateMsg = (message: WebsocketDataMsg): message is NotificationCountUpdateMsg => {