Skip to content

Commit

Permalink
Do not calculate highlight notifs for threads unknown to the room
Browse files Browse the repository at this point in the history
  • Loading branch information
germain-gg committed Dec 9, 2022
1 parent ae849fd commit 44f24b0
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 4 deletions.
26 changes: 25 additions & 1 deletion spec/unit/notifications.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -151,4 +174,5 @@ describe("fixNotificationCountOnDecryption", () => {
room.setThreadUnreadNotificationCount("$123", NotificationCountType.Highlight, 5);
expect(cb).toHaveBeenLastCalledWith({ highlight: 5 }, "$123");
});

});
23 changes: 20 additions & 3 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 44f24b0

Please sign in to comment.