From d4c5de45d1ef257d003d8ce1662b2bfe683288a2 Mon Sep 17 00:00:00 2001 From: Germain Date: Fri, 9 Dec 2022 10:05:25 +0100 Subject: [PATCH] Do not calculate highlight notifs for threads unknown to the room --- spec/unit/notifications.spec.ts | 23 +++++++++++++++++++++++ src/client.ts | 18 +++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/spec/unit/notifications.spec.ts b/spec/unit/notifications.spec.ts index 02388f9f0dd..4c0f080c5cf 100644 --- a/spec/unit/notifications.spec.ts +++ b/spec/unit/notifications.spec.ts @@ -138,6 +138,29 @@ describe("fixNotificationCountOnDecryption", () => { expect(room.getThreadUnreadNotificationCount(THREAD_ID, NotificationCountType.Highlight)).toBe(0); }); + it("does not calculate for threads unknown to the room", () => { + room.setThreadUnreadNotificationCount(THREAD_ID, NotificationCountType.Total, 0); + room.setThreadUnreadNotificationCount(THREAD_ID, NotificationCountType.Highlight, 0); + + const unknownThreadEvent = mkEvent({ + type: EventType.RoomMessage, + content: { + "m.relates_to": { + rel_type: RelationType.Thread, + event_id: "$unknownthread", + }, + "msgtype": MsgType.Text, + "body": "Thread reply", + }, + event: true, + }); + + fixNotificationCountOnDecryption(mockClient, unknownThreadEvent); + + expect(room.getThreadUnreadNotificationCount(THREAD_ID, NotificationCountType.Total)).toBe(0); + expect(room.getThreadUnreadNotificationCount(THREAD_ID, NotificationCountType.Highlight)).toBe(0); + }); + it("emits events", () => { const cb = jest.fn(); room.on(RoomEvent.UnreadNotifications, cb); diff --git a/src/client.ts b/src/client.ts index ce44d32fd66..9d63f34e644 100644 --- a/src/client.ts +++ b/src/client.ts @@ -9363,9 +9363,21 @@ export function fixNotificationCountOnDecryption(cli: MatrixClient, event: Matri if (oldHighlight !== newHighlight || currentCount > 0) { // TODO: Handle mentions received while the client is offline // See also https://github.com/vector-im/element-web/issues/9069 - const hasReadEvent = isThreadEvent - ? room.getThread(event.threadRootId)?.hasUserReadEvent(cli.getUserId()!, event.getId()!) - : room.hasUserReadEvent(cli.getUserId()!, event.getId()!); + let hasReadEvent; + if (isThreadEvent) { + const thread = room.getThread(event.threadRootId); + hasReadEvent = thread + ? thread.hasUserReadEvent(cli.getUserId()!, event.getId()!) + // If the thread object does not exist in the room yet, we don't + // want to calculate notification for this event yet. We have not + // restored the read receipts yet and can't accurately calculate + // highlight notifications at this stage. + // + // This issue can likely go away when MSC3874 is implemented + : true; + } else { + hasReadEvent = room.hasUserReadEvent(cli.getUserId()!, event.getId()!); + } if (!hasReadEvent) { let newCount = currentCount;