import { MatrixClient, ReceiptType } from 'matrix-js-sdk'; import { getSettings } from '../state/settings'; export async function markAsRead(mx: MatrixClient, roomId: string, privateReceipt: boolean) { const { privateReadReceipts } = getSettings(); const room = mx.getRoom(roomId); if (!room) return; const timeline = room.getLiveTimeline().getEvents(); const readEventId = room.getEventReadUpTo(mx.getUserId()!); 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, ); }