mirror of
https://github.com/meshtastic/web.git
synced 2026-07-31 06:56:28 -04:00
ChatClient gains a `chat.unread` namespace mirroring `chat.drafts`: - byKey: ReadonlySignal<Map<conversation-key-string, number>> - total: ReadonlySignal<number> - count(key): ReadonlySignal<number> - markRead(key): void Increments happen in the existing onMessagePacket subscriber when packet.from !== client.myNodeNum (so the outbound echo of our own send doesn't bump anything). Uses the same ConversationKey shape the rest of the chat slice already keys by, so direct messages keyed by peer and broadcasts by channel can never collide. Counts are in-memory only — persistence will come later if needed (would require tracking a lastReadAt timestamp per conversation in the message repository and computing unread on hydrate). sdk-react: new useTotalUnread / useUnreadCount(key) / useUnreadByKey hooks. All fall back to safe empty values when no client is active. Web migration: - Sidebar reads useTotalUnread instead of summing deviceStore.unreadCounts. - MessagesPage: per-channel SidebarButton counts read from useUnreadByKey()'s `channel:N` keys; per-direct-message counts from `direct:N` keys. Click handlers call meshClient.chat.unread.markRead with the typed ConversationKey instead of resetUnread. - subscriptions.ts: drops onMessagePacket -> incrementUnread mirror (SDK now owns it). myNodeNum local goes away too — nothing else consumed it. - deviceStore: removes unreadCounts field + incrementUnread / resetUnread / getUnreadCount / getAllUnreadCount methods. The mock + test block in deviceStore.test.ts also drop their unread coverage. - deviceStore.mock.ts: also strips the dead changeRegistry / setChange / hasConfigChange / etc. methods that survived from the earlier changeRegistry deletion. Tests: SDK 61 -> 65 (+4 ChatClient.unread.test), sdk-react 8, web 236. Build clean.