Thread panel never shows read receipts (context provider is out of scope) #38

Closed
opened 2026-09-12 01:51:07 -04:00 by jared · 0 comments
Owner

Severity: medium · Type: bug · Confidence: high

Location: src/app/features/room/RoomTimeline.tsx:2131 (ReadPositionsContext.Provider), src/app/features/room/message/Message.tsx:875-879, src/app/features/room/Room.tsx:196-207

Problem

Message reads read-receipt avatars from useReadPositions(), but the only provider is inside RoomTimeline. ThreadPanel/ThreadTimeline are rendered as siblings of RoomView in Room.tsx, so every message in a thread falls back to the context default (new Map()). Consequences: read receipts never render in a thread, and because the DeliveryStatus branch is gated on readReceiptUsers.length === 0, your own thread messages permanently display the "Sent" tick instead of graduating to read avatars. ThreadTimeline even threads hideReadReceipts={hideActivity} down to Message, showing the feature was intended to work there.

How to trigger

Send a message in a thread; have another user read it. No read avatar ever appears in the thread panel.

Suggested fix

Wrap ThreadTimeline (or ThreadPanel) in a ReadPositionsContext.Provider fed by useRoomReadPositions(room), or hoist the provider to Room.


Filed from the September 2026 client audit (branch lotus @ 4bea4895).

**Severity:** medium · **Type:** bug · **Confidence:** high **Location:** `src/app/features/room/RoomTimeline.tsx:2131` (`ReadPositionsContext.Provider`), `src/app/features/room/message/Message.tsx:875-879`, `src/app/features/room/Room.tsx:196-207` ### Problem `Message` reads read-receipt avatars from `useReadPositions()`, but the only provider is inside `RoomTimeline`. `ThreadPanel`/`ThreadTimeline` are rendered as **siblings** of `RoomView` in `Room.tsx`, so every message in a thread falls back to the context default (`new Map()`). Consequences: read receipts never render in a thread, and because the `DeliveryStatus` branch is gated on `readReceiptUsers.length === 0`, your own thread messages permanently display the "Sent" tick instead of graduating to read avatars. `ThreadTimeline` even threads `hideReadReceipts={hideActivity}` down to `Message`, showing the feature was intended to work there. ### How to trigger Send a message in a thread; have another user read it. No read avatar ever appears in the thread panel. ### Suggested fix Wrap `ThreadTimeline` (or `ThreadPanel`) in a `ReadPositionsContext.Provider` fed by `useRoomReadPositions(room)`, or hoist the provider to `Room`. --- _Filed from the September 2026 client audit (branch `lotus` @ 4bea4895)._
jared added this to the Audit 2026-09 · Medium & Low milestone 2026-09-12 01:51:07 -04:00
jared added the bugpriority: mediumarea: threads labels 2026-09-12 01:51:07 -04:00
jared self-assigned this 2026-09-12 01:51:07 -04:00
jared closed this issue 2026-09-15 21:32:09 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
2026-11-14
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#38