Files
cinny/src/app/utils/notifications.ts
T

34 lines
1.2 KiB
TypeScript
Raw Normal View History

2025-02-26 21:44:53 +11:00
import { MatrixClient, ReceiptType } from 'matrix-js-sdk';
import { getSettings } from '../state/settings';
2022-03-18 09:09:14 +05:30
export async function markAsRead(mx: MatrixClient, roomId: string, privateReceipt: boolean) {
const { privateReadReceipts } = getSettings();
2022-03-18 09:09:14 +05:30
const room = mx.getRoom(roomId);
if (!room) return;
const timeline = room.getLiveTimeline().getEvents();
2024-07-22 16:17:19 +05:30
const readEventId = room.getEventReadUpTo(mx.getUserId()!);
2022-03-18 09:09:14 +05:30
const getLatestValidEvent = () => {
for (let i = timeline.length - 1; i >= 0; i -= 1) {
const latestEvent = timeline[i];
if (latestEvent.getId() === readEventId) return null;
if (!latestEvent.isSending()) return latestEvent;
}
return null;
};
if (timeline.length === 0) return;
const latestEvent = getLatestValidEvent();
if (latestEvent === null) return;
// Unthreaded receipt: with client threadSupport enabled the SDK would
// otherwise scope this to the main timeline (thread_id: "main"), leaving
// per-thread notification counts permanently unread. Unthreaded preserves
// the pre-threads wire behavior — one receipt clears everything.
await mx.sendReadReceipt(
latestEvent,
privateReceipt || privateReadReceipts ? ReceiptType.ReadPrivate : ReceiptType.Read,
true,
2025-02-26 21:44:53 +11:00
);
2022-03-18 09:09:14 +05:30
}