diff --git a/docs/core-checklist-status.md b/docs/core-checklist-status.md index 117710a..3a9b412 100644 --- a/docs/core-checklist-status.md +++ b/docs/core-checklist-status.md @@ -16,7 +16,7 @@ Legend: 7. Chat Creation - `DONE` (private/group/channel) 8. Messages (base) - `DONE` (send/read/edit/delete/delete for all; 7-day edit window enforced and covered by integration tests; group UI shows sender names over bubbles + sender avatars on incoming message clusters) 9. Message Types - `PARTIAL` (text/photo/video/docs/audio/voice/circle; GIF/stickers via dedicated system missing) -10. Reply/Quote/Threads - `PARTIAL` (reply + quote-like UI + thread panel with nested replies, no dedicated full thread navigation yet) +10. Reply/Quote/Threads - `PARTIAL` (reply + quote-like UI + thread panel with nested replies; web thread panel now supports direct `Jump in chat` navigation to any thread message; dedicated full standalone thread route is still pending) 11. Forwarding - `DONE` (single + bulk + without author) 12. Pinning - `DONE` (message/chat pin-unpin) 13. Reactions - `DONE` diff --git a/web/src/components/MessageList.tsx b/web/src/components/MessageList.tsx index f608b83..074f505 100644 --- a/web/src/components/MessageList.tsx +++ b/web/src/components/MessageList.tsx @@ -310,6 +310,11 @@ export function MessageList() { container.scrollTo({ top: container.scrollHeight, behavior: "smooth" }); } + function jumpToMessageInChat(messageId: number) { + setFocusedMessage(chatId, messageId); + setThreadRootId(null); + } + async function ensureReactionsLoaded(messageId: number) { if (reactionsByMessage[messageId]) { return; @@ -956,13 +961,26 @@ export function MessageList() { const indent = Math.min(6, depth) * 14; return (
- {isRoot ? "Original message" : `Reply • level ${depth}`} • {formatTime(threadMessage.created_at)} -
++ {isRoot ? "Original message" : `Reply • level ${depth}`} • {formatTime(threadMessage.created_at)} +
+ +