15ac538a4b
threadSupport:true makes matrix-js-sdk partition m.thread relations into Thread objects (replies leave the main timeline; roots stay). markAsRead now sends UNTHREADED receipts so one receipt still clears room + thread notification counts — without this, badges would stick unread. The thread panel + summary chips land in the same push. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
1.2 KiB
TypeScript
34 lines
1.2 KiB
TypeScript
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,
|
|
);
|
|
}
|