diff --git a/src/Unread.ts b/src/Unread.ts index 3a177fedae..ee74813d20 100644 --- a/src/Unread.ts +++ b/src/Unread.ts @@ -74,6 +74,9 @@ export function doesRoomHaveUnreadMessages(room: Room, includeThreads: boolean): } function doesTimelineHaveUnreadMessages(room: Room, timeline: Array): boolean { + // The room is a space, let's ignore it + if (room.isSpaceRoom()) return false; + const myUserId = room.client.getSafeUserId(); const latestImportantEventId = findLatestImportantEvent(room.client, timeline)?.getId(); if (latestImportantEventId) { diff --git a/src/components/views/settings/Notifications.tsx b/src/components/views/settings/Notifications.tsx index a800e1db86..ec47cff714 100644 --- a/src/components/views/settings/Notifications.tsx +++ b/src/components/views/settings/Notifications.tsx @@ -57,6 +57,7 @@ import { import { Caption } from "../typography/Caption"; import { SettingsSubsectionHeading } from "./shared/SettingsSubsectionHeading"; import SettingsSubsection from "./shared/SettingsSubsection"; +import { doesRoomHaveUnreadMessages } from "../../../Unread"; // TODO: this "view" component still has far too much application logic in it, // which should be factored out to other files. @@ -739,7 +740,7 @@ export default class Notifications extends React.PureComponent { category === RuleClass.VectorOther && MatrixClientPeg.safeGet() .getRooms() - .some((r) => r.getUnreadNotificationCount() > 0) + .some((r) => doesRoomHaveUnreadMessages(r, true)) ) { clearNotifsButton = ( { this.dispatcherRef = this.dispatcher.register(this.onAction); - const matrixClient = MatrixClientPeg.get(); + // MatrixClientPeg can be undefined in tests because of circular dependencies with other stores + const matrixClient = MatrixClientPeg?.get(); if (matrixClient) { this.matrixClient = matrixClient; await this.onReady(); diff --git a/src/utils/notifications.ts b/src/utils/notifications.ts index 7f0e98f142..dbea233f35 100644 --- a/src/utils/notifications.ts +++ b/src/utils/notifications.ts @@ -26,6 +26,7 @@ import { IndicatorIcon } from "@vector-im/compound-web"; import SettingsStore from "../settings/SettingsStore"; import { NotificationLevel } from "../stores/notifications/NotificationLevel"; +import { doesRoomHaveUnreadMessages } from "../Unread"; export const deviceNotificationSettingsKeys = [ "notificationsEnabled", @@ -105,7 +106,7 @@ export async function clearRoomNotification(room: Room, client: MatrixClient): P */ export function clearAllNotifications(client: MatrixClient): Promise> { const receiptPromises = client.getRooms().reduce((promises: Array>, room: Room) => { - if (room.getUnreadNotificationCount() > 0) { + if (doesRoomHaveUnreadMessages(room, true)) { const promise = clearRoomNotification(room, client); promises.push(promise); } diff --git a/test/Unread-test.ts b/test/Unread-test.ts index 843490b425..bd65a783e8 100644 --- a/test/Unread-test.ts +++ b/test/Unread-test.ts @@ -421,6 +421,11 @@ describe("Unread", () => { }, ); }); + + it("returns false for space", () => { + jest.spyOn(room, "isSpaceRoom").mockReturnValue(true); + expect(doesRoomHaveUnreadMessages(room, false)).toBe(false); + }); }); describe("doesRoomOrThreadHaveUnreadMessages()", () => { diff --git a/test/components/views/settings/Notifications-test.tsx b/test/components/views/settings/Notifications-test.tsx index e8fbb74d57..b12cf9239e 100644 --- a/test/components/views/settings/Notifications-test.tsx +++ b/test/components/views/settings/Notifications-test.tsx @@ -21,7 +21,6 @@ import { LOCAL_NOTIFICATION_SETTINGS_PREFIX, MatrixEvent, Room, - NotificationCountType, PushRuleActionName, TweakName, ConditionKind, @@ -31,7 +30,7 @@ import { ThreepidMedium, } from "matrix-js-sdk/src/matrix"; import { randomString } from "matrix-js-sdk/src/randomstring"; -import { act, fireEvent, getByTestId, render, screen, waitFor, within } from "@testing-library/react"; +import { act, fireEvent, getByTestId, render, screen, within } from "@testing-library/react"; import { mocked } from "jest-mock"; import userEvent from "@testing-library/user-event"; @@ -900,8 +899,7 @@ describe("", () => { user: "@alice:example.org", ts: 1, }); - room.addLiveEvents([message]); - room.setUnreadNotificationCount(NotificationCountType.Total, 1); + await room.addLiveEvents([message]); const { container } = await getComponentAndWait(); const clearNotificationEl = getByTestId(container, "clear-notifications"); @@ -910,10 +908,6 @@ describe("", () => { expect(clearNotificationEl.className).toContain("mx_AccessibleButton_disabled"); expect(mockClient.sendReadReceipt).toHaveBeenCalled(); - - await waitFor(() => { - expect(clearNotificationEl).not.toBeInTheDocument(); - }); }); }); });