Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Fix Mark all as read in settings #12205

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/Unread.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ export function doesRoomHaveUnreadMessages(room: Room, includeThreads: boolean):
}

function doesTimelineHaveUnreadMessages(room: Room, timeline: Array<MatrixEvent>): 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) {
Expand Down
3 changes: 2 additions & 1 deletion src/components/views/settings/Notifications.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -739,7 +740,7 @@ export default class Notifications extends React.PureComponent<IProps, IState> {
category === RuleClass.VectorOther &&
MatrixClientPeg.safeGet()
.getRooms()
.some((r) => r.getUnreadNotificationCount() > 0)
.some((r) => doesRoomHaveUnreadMessages(r, true))
) {
clearNotifsButton = (
<AccessibleButton
Expand Down
3 changes: 2 additions & 1 deletion src/stores/ReadyWatchingStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ export abstract class ReadyWatchingStore extends EventEmitter implements IDestro
public async start(): Promise<void> {
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();
Expand Down
3 changes: 2 additions & 1 deletion src/utils/notifications.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -105,7 +106,7 @@ export async function clearRoomNotification(room: Room, client: MatrixClient): P
*/
export function clearAllNotifications(client: MatrixClient): Promise<Array<{} | undefined>> {
const receiptPromises = client.getRooms().reduce((promises: Array<Promise<{} | undefined>>, room: Room) => {
if (room.getUnreadNotificationCount() > 0) {
if (doesRoomHaveUnreadMessages(room, true)) {
const promise = clearRoomNotification(room, client);
promises.push(promise);
}
Expand Down
5 changes: 5 additions & 0 deletions test/Unread-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()", () => {
Expand Down
10 changes: 2 additions & 8 deletions test/components/views/settings/Notifications-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import {
LOCAL_NOTIFICATION_SETTINGS_PREFIX,
MatrixEvent,
Room,
NotificationCountType,
PushRuleActionName,
TweakName,
ConditionKind,
Expand All @@ -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";

Expand Down Expand Up @@ -900,8 +899,7 @@ describe("<Notifications />", () => {
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");
Expand All @@ -910,10 +908,6 @@ describe("<Notifications />", () => {

expect(clearNotificationEl.className).toContain("mx_AccessibleButton_disabled");
expect(mockClient.sendReadReceipt).toHaveBeenCalled();

await waitFor(() => {
expect(clearNotificationEl).not.toBeInTheDocument();
});
});
});
});
Loading