From 4dd0e6637dfcada89ff200aa529adbb8df837ef0 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Sat, 12 Sep 2026 14:48:34 -0400 Subject: [PATCH] fix(threads): "Hide Typing & Read Receipts" now governs thread receipts ThreadPanel only honoured the separate Private Read Receipts switch, so the privacy switch still emitted public m.read for every opened thread. Match markAsRead: hideActivity || privateReadReceipts. Fixes #34 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA --- src/app/features/room/thread/ThreadPanel.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/features/room/thread/ThreadPanel.tsx b/src/app/features/room/thread/ThreadPanel.tsx index 948a2725e..85177a93d 100644 --- a/src/app/features/room/thread/ThreadPanel.tsx +++ b/src/app/features/room/thread/ThreadPanel.tsx @@ -116,6 +116,8 @@ export function ThreadPanel({ room, threadId, requestClose }: ThreadPanelProps) const editor = useEditor(); const thread = useThreadInstance(room, threadId); const [privateReadReceipts] = useSetting(settingsAtom, 'privateReadReceipts'); + // "Hide Typing & Read Receipts" must also make thread receipts private (matches markAsRead). + const [hideActivity] = useSetting(settingsAtom, 'hideActivity'); const fileDropContainerRef = useRef(null) as React.RefObject; useKeyDown( @@ -157,7 +159,7 @@ export function ThreadPanel({ room, threadId, requestClose }: ThreadPanelProps) } if (!latestId || latestId === lastReadEventIdRef.current) return; lastReadEventIdRef.current = latestId; - markThreadAsRead(mx, thread, privateReadReceipts).catch(() => { + markThreadAsRead(mx, thread, hideActivity || privateReadReceipts).catch(() => { // Allow a retry on the next event if the receipt POST failed. if (lastReadEventIdRef.current === latestId) { lastReadEventIdRef.current = undefined; @@ -171,7 +173,7 @@ export function ThreadPanel({ room, threadId, requestClose }: ThreadPanelProps) thread.off(ThreadEvent.NewReply, markRead); thread.off(RoomEvent.Timeline, markRead); }; - }, [mx, thread, privateReadReceipts]); + }, [mx, thread, privateReadReceipts, hideActivity]); return (