Private
Public Access
Add unread message indicators for rooms (#38)
Shows a dot on rooms with unread messages in the sidebar, updated live over WebSocket. Reuses the same offline-member audience computation already used for push notifications: a member gets the real-time signal whenever they aren't currently connected to that room's channel, which correctly covers both "room not open" and "room open but tab backgrounded" (the client leaves a room's channel while hidden). Persisted server-side via a new room_memberships.last_read_at column so state survives reload and stays consistent across devices, advanced by an explicit mark-read call the frontend makes on room-open and on each live message received while the room is genuinely visible -- gated on a live visibility check, not a cached ref, so a backgrounded-but-open room keeps accumulating unread instead of auto-marking-read the instant a message arrives somewhere it can't be seen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
974d92ab4d
commit
68e487e5ec
14 files changed
+336
-11
No files matched your search
@@ -59,6 +59,10 @@ export function listRoomAttachments(roomId: string): Promise<RoomAttachment[]> {
|
||||
return apiFetch<RoomAttachment[]>(`/api/rooms/${roomId}/attachments`)
|
||||
}
|
||||
|
||||
export function markRoomRead(roomId: string): Promise<void> {
|
||||
return apiFetch<void>(`/api/rooms/${roomId}/read`, { method: 'POST' })
|
||||
}
|
||||
|
||||
export function addRoomMember(roomId: string, userId: string): Promise<RoomMember> {
|
||||
return apiFetch<RoomMember>(`/api/rooms/${roomId}/members`, {
|
||||
method: 'POST',
|
||||
|
||||
Reference in new issue
Block a user