diff --git a/spec/unit/notifications.spec.ts b/spec/unit/notifications.spec.ts index 02388f9f0dd..c8e1267df2e 100644 --- a/spec/unit/notifications.spec.ts +++ b/spec/unit/notifications.spec.ts @@ -96,7 +96,7 @@ describe("fixNotificationCountOnDecryption", () => { event.getPushActions = jest.fn().mockReturnValue(mkPushAction(false, false)); threadEvent.getPushActions = jest.fn().mockReturnValue(mkPushAction(false, false)); - }); + }); it("changes the room count to highlight on decryption", () => { expect(room.getUnreadNotificationCount(NotificationCountType.Total)).toBe(2); @@ -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); @@ -151,4 +174,5 @@ describe("fixNotificationCountOnDecryption", () => { room.setThreadUnreadNotificationCount("$123", NotificationCountType.Highlight, 5); expect(cb).toHaveBeenLastCalledWith({ highlight: 5 }, "$123"); }); + }); diff --git a/src/client.ts b/src/client.ts index ce44d32fd66..564191de4b3 100644 --- a/src/client.ts +++ b/src/client.ts @@ -9363,9 +9363,26 @@ 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 + if (!thread) { + hasReadEvent = true; + } else { + + } + } else { + hasReadEvent = room.hasUserReadEvent(cli.getUserId()!, event.getId()!); + } if (!hasReadEvent) { let newCount = currentCount;