2025-02-26 21:44:53 +11:00
|
|
|
import { MatrixClient, ReceiptType } from 'matrix-js-sdk';
|
2022-03-18 09:09:14 +05:30
|
|
|
|
2026-02-14 17:32:10 +11:00
|
|
|
export async function markAsRead(mx: MatrixClient, roomId: string, privateReceipt?: boolean) {
|
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;
|
|
|
|
|
|
2026-02-14 17:32:10 +11:00
|
|
|
const latestEventId = latestEvent.getId();
|
|
|
|
|
if (!latestEventId) return;
|
|
|
|
|
|
|
|
|
|
// Set both the read receipt AND the fully_read marker
|
|
|
|
|
// The fully_read marker is what persists your read position across sessions
|
|
|
|
|
await mx.setRoomReadMarkers(
|
|
|
|
|
roomId,
|
|
|
|
|
latestEventId, // m.fully_read marker
|
|
|
|
|
latestEvent, // m.read receipt event
|
|
|
|
|
privateReceipt ? { receiptType: ReceiptType.ReadPrivate } : undefined
|
2025-02-26 21:44:53 +11:00
|
|
|
);
|
2022-03-18 09:09:14 +05:30
|
|
|
}
|