Add mark as read option in room setting (#9798)
This commit is contained in:
parent
ce75d3381f
commit
e9224f6fce
9 changed files with 378 additions and 37 deletions
|
@ -18,7 +18,7 @@ import { MatrixClient } from "matrix-js-sdk/src/client";
|
|||
import { LOCAL_NOTIFICATION_SETTINGS_PREFIX } from "matrix-js-sdk/src/@types/event";
|
||||
import { LocalNotificationSettings } from "matrix-js-sdk/src/@types/local_notifications";
|
||||
import { ReceiptType } from "matrix-js-sdk/src/@types/read_receipts";
|
||||
import { Room } from "matrix-js-sdk/src/models/room";
|
||||
import { NotificationCountType, Room } from "matrix-js-sdk/src/models/room";
|
||||
|
||||
import SettingsStore from "../settings/SettingsStore";
|
||||
|
||||
|
@ -59,27 +59,57 @@ export function localNotificationsAreSilenced(cli: MatrixClient): boolean {
|
|||
return event?.getContent<LocalNotificationSettings>()?.is_silenced ?? false;
|
||||
}
|
||||
|
||||
export function clearAllNotifications(client: MatrixClient): Promise<Array<{}>> {
|
||||
const receiptPromises = client.getRooms().reduce((promises, room: Room) => {
|
||||
/**
|
||||
* Mark a room as read
|
||||
* @param room
|
||||
* @param client
|
||||
* @returns a promise that resolves when the room has been marked as read
|
||||
*/
|
||||
export async function clearRoomNotification(room: Room, client: MatrixClient): Promise<{} | undefined> {
|
||||
const roomEvents = room.getLiveTimeline().getEvents();
|
||||
const lastThreadEvents = room.lastThread?.events;
|
||||
|
||||
const lastRoomEvent = roomEvents?.[roomEvents?.length - 1];
|
||||
const lastThreadLastEvent = lastThreadEvents?.[lastThreadEvents?.length - 1];
|
||||
|
||||
const lastEvent =
|
||||
(lastRoomEvent?.getTs() ?? 0) > (lastThreadLastEvent?.getTs() ?? 0) ? lastRoomEvent : lastThreadLastEvent;
|
||||
|
||||
try {
|
||||
if (lastEvent) {
|
||||
const receiptType = SettingsStore.getValue("sendReadReceipts", room.roomId)
|
||||
? ReceiptType.Read
|
||||
: ReceiptType.ReadPrivate;
|
||||
return await client.sendReadReceipt(lastEvent, receiptType, true);
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
} finally {
|
||||
// We've had a lot of stuck unread notifications that in e2ee rooms
|
||||
// They occur on event decryption when clients try to replicate the logic
|
||||
//
|
||||
// This resets the notification on a room, even though no read receipt
|
||||
// has been sent, particularly useful when the clients has incorrectly
|
||||
// notified a user.
|
||||
room.setUnreadNotificationCount(NotificationCountType.Highlight, 0);
|
||||
room.setUnreadNotificationCount(NotificationCountType.Total, 0);
|
||||
for (const thread of room.getThreads()) {
|
||||
room.setThreadUnreadNotificationCount(thread.id, NotificationCountType.Highlight, 0);
|
||||
room.setThreadUnreadNotificationCount(thread.id, NotificationCountType.Total, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks all rooms with an unread counter as read
|
||||
* @param client The matrix client
|
||||
* @returns a promise that resolves when all rooms have been marked as read
|
||||
*/
|
||||
export function clearAllNotifications(client: MatrixClient): Promise<Array<{} | undefined>> {
|
||||
const receiptPromises = client.getRooms().reduce((promises: Array<Promise<{} | undefined>>, room: Room) => {
|
||||
if (room.getUnreadNotificationCount() > 0) {
|
||||
const roomEvents = room.getLiveTimeline().getEvents();
|
||||
const lastThreadEvents = room.lastThread?.events;
|
||||
|
||||
const lastRoomEvent = roomEvents?.[roomEvents?.length - 1];
|
||||
const lastThreadLastEvent = lastThreadEvents?.[lastThreadEvents?.length - 1];
|
||||
|
||||
const lastEvent =
|
||||
(lastRoomEvent?.getTs() ?? 0) > (lastThreadLastEvent?.getTs() ?? 0)
|
||||
? lastRoomEvent
|
||||
: lastThreadLastEvent;
|
||||
|
||||
if (lastEvent) {
|
||||
const receiptType = SettingsStore.getValue("sendReadReceipts", room.roomId)
|
||||
? ReceiptType.Read
|
||||
: ReceiptType.ReadPrivate;
|
||||
const promise = client.sendReadReceipt(lastEvent, receiptType, true);
|
||||
promises.push(promise);
|
||||
}
|
||||
const promise = clearRoomNotification(room, client);
|
||||
promises.push(promise);
|
||||
}
|
||||
|
||||
return promises;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue