diff --git a/src/Notifier.ts b/src/Notifier.ts index fed04dd68d..db9a7f1b1c 100644 --- a/src/Notifier.ts +++ b/src/Notifier.ts @@ -412,9 +412,11 @@ class NotifierClass { removed: boolean, data: IRoomTimelineData, ): void => { - if (!data.liveEvent) return; // only notify for new things, not old. + if (removed) return; // only notify for new events, not removed ones + if (!data.liveEvent || !!toStartOfTimeline) return; // only notify for new things, not old. if (!this.isSyncing) return; // don't alert for any messages initially if (ev.getSender() === MatrixClientPeg.safeGet().getUserId()) return; + if (data.timeline.getTimelineSet().threadListType !== null) return; // Ignore events on the thread list generated timelines MatrixClientPeg.safeGet().decryptEventIfNeeded(ev); diff --git a/test/Notifier-test.ts b/test/Notifier-test.ts index 033360d04c..16a10db9ec 100644 --- a/test/Notifier-test.ts +++ b/test/Notifier-test.ts @@ -538,4 +538,28 @@ describe("Notifier", () => { expect(localStorage.getItem("notifications_hidden")).toBeTruthy(); }); }); + + describe("onEvent", () => { + it("should not evaluate events from the thread list fake timeline sets", async () => { + mockClient.supportsThreads.mockReturnValue(true); + + const fn = jest.spyOn(Notifier, "evaluateEvent"); + + await testRoom.createThreadsTimelineSets(); + testRoom.threadsTimelineSets[0]!.addEventToTimeline( + mkEvent({ + event: true, + type: "m.room.message", + user: "@user1:server", + room: roomId, + content: { body: "this is a thread root" }, + }), + testRoom.threadsTimelineSets[0]!.getLiveTimeline(), + false, + false, + ); + + expect(fn).not.toHaveBeenCalled(); + }); + }); });