Repository navigation
feat(messages): list Mark unread above Copy message - #638
Conversation
wesbillman
left a comment
There was a problem hiding this comment.
No changes requested. The read-state item moves above Copy message while preserving the existing eligibility gate, toggle/error handling, and edit/delete focus handoffs; the updated tests cover peer/own menu order and keyboard-first-item behavior.
Star Lord automated source review via Wes’s account; head d7cc489c8e34c0c1395379b7790671797171a4e7, base b287b92860ad24d35c72989de146ce7f05a2dbb9. Source and both attached screenshots reviewed; no tests or app run here—hosted CI required/DCO passed, Windows validation was skipped, and runtime/human acceptance remains unverified.
The read-state item was owned by MessageManagementItems, which reaches the message menu through the overflow slot after Copy message. Split it into MessageReadStateItem behind the same managed-message gate, add a leading slot to MessageActionBar, and have MessageRow render the item there so the menu reads Mark unread → Copy message → Send to channel → Edit → Delete → Report. Gating and the toggle's behaviour are unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: Matt Toohey <contact@matttoohey.com>
Mark unread now leads the message menu on a managed row, so keyboard opening focuses it rather than Copy message. Update the message-actions journey to assert the new first item. Verified fail-then-pass against the current menu order; the full file passes in Chromium and WebKit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: Matt Toohey <contact@matttoohey.com>
The menu-order case only covered a peer row, so it could not see the leading/overflow split from the other side: Edit and Delete still come from MessageManagementItems through the overflow slot, and nothing asserted they stay below Copy message. Make the case an it.each over peer and own, varying only authorship, so the own thread reply asserts Mark unread → Copy message → Send to channel → Edit message → Delete message → Report. Fail-then-pass: moving MessageManagementItems into leadingItems fails only the own case; the peer case is blind to it. Full file 87/87, Biome clean. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: Matt Toohey <contact@matttoohey.com>
d7cc489 to
19dcaf2
Compare
wesbillman
left a comment
There was a problem hiding this comment.
One change needed: update the new menu-order test for the thread-follow contract introduced by the current base (inline). This is a test integration defect; the production read-state reorder still preserves the existing gate and handlers.
Star Lord automated source review via Wes’s account; head 19dcaf25e501c0ab759b43b7cf29450464f029ee, base 1ef9dcef3f7cfea3c550f73cd18494d5042f59d3. Source-only follow-up, including both attached screenshots; no tests or app run. JS/browser CI was still running at the single snapshot; runtime and human acceptance remain unverified.
Signed-off-by: am <6e30cd56c30e030cd31bb0939b94a7c257c9a09d5ba2d92cf2735da45629f248@buzz.block.builderlab.xyz>
…ge-delete * origin/main: (23 commits) feat(agents): default conversation context to each thread (#646) Name browser host and separate development tooling (#699) test(archive): stamp expiry fixtures with one fixed time (#697) feat(messages): list Mark unread above Copy message (#638) fix(messages): link credential-free http:// URLs like https:// (#691) refactor(hooks): replace custom wiring with standard Lefthook hooks (#641) fix: deduplicate working agent indicators in composers (#687) feat(messages): click images to zoom in the gallery viewer (#688) fix(media): serve ranged buzz-media reads from shared signed blocks (#690) fix(messages): exclude row chrome from cross-message copies (#645) docs: Add kind 30177 publishing guidance for plugin authors (#558) feat(agents): allow creating agents with Claude Code feat: Enroll Builderlab remote agents (30177) to community (#647) Enroll Builderlab agents with the selected community during attestation (#642) fix(messages): restore main typecheck for pasted mentions (#684) Install the bundled Buzz CLI skill on desktop startup (#667) refactor: share status, DM and sidebar intent policy across hosts (#683) fix(sessions): show enabled page in navigation (#648) fix(composer): replace exact emoji shortcodes on closing colon (#584) refactor(mentions): let the Mentions plugin own what the chooser offers (#669) ... Signed-off-by: Opus <f425b86c3b780d43f8d9cf1802429d04dd985bf92eac44fca9468b5ad3887c5e@buzz.block.builderlab.xyz> # Conflicts: # src/features/messages/MessageManagement.tsx
…iles * origin/main: feat(agents): default conversation context to each thread (#646) Name browser host and separate development tooling (#699) test(archive): stamp expiry fixtures with one fixed time (#697) feat(messages): list Mark unread above Copy message (#638) fix(messages): link credential-free http:// URLs like https:// (#691) refactor(hooks): replace custom wiring with standard Lefthook hooks (#641) fix: deduplicate working agent indicators in composers (#687) feat(messages): click images to zoom in the gallery viewer (#688) fix(media): serve ranged buzz-media reads from shared signed blocks (#690) fix(messages): exclude row chrome from cross-message copies (#645) docs: Add kind 30177 publishing guidance for plugin authors (#558) feat(agents): allow creating agents with Claude Code
…iles * origin/main: feat(agents): default conversation context to each thread (#646) Name browser host and separate development tooling (#699) test(archive): stamp expiry fixtures with one fixed time (#697) feat(messages): list Mark unread above Copy message (#638) fix(messages): link credential-free http:// URLs like https:// (#691) refactor(hooks): replace custom wiring with standard Lefthook hooks (#641) fix: deduplicate working agent indicators in composers (#687) feat(messages): click images to zoom in the gallery viewer (#688) fix(media): serve ranged buzz-media reads from shared signed blocks (#690) fix(messages): exclude row chrome from cross-message copies (#645) docs: Add kind 30177 publishing guidance for plugin authors (#558) feat(agents): allow creating agents with Claude Code Signed-off-by: Opus <f425b86c3b780d43f8d9cf1802429d04dd985bf92eac44fca9468b5ad3887c5e@buzz.block.builderlab.xyz>
Why: I use mark unread the most and I think it is generally pretty common. Or atleast more so than copy message.
Summary
Moves the read-state toggle to the top of the message actions menu, so the menu reads Mark unread → Copy message → Send to channel → Edit → Delete → Report. Before this change, Mark unread/Mark read sat at the bottom of the management items, below Copy message.
MessageManagement.tsx: splits the read-state toggle out ofMessageManagementItemsinto a newMessageReadStateItem. A shareduseManagedMessagehook keeps both on the same gate as before: a managed, delivered row in a writable channel.MessageActionBar.tsx: adds aleadingItemsslot that renders above the built-in Copy message item.MessageRow.tsx: rendersMessageReadStateItemin that slot.Gating and toggle behaviour are unchanged. Only the item's position moves.
Screenshots
Message actions menu for an own thread reply in a writable channel, captured from the browser fixture (
#alpha, light appearance, WebKit, 1440×950 viewport at 2x). The only difference is where Mark unread sits.5362dafa, main)481f8279, this PR)Tests
MessageRowtest: the menu for a managed peer message listsMark unread,Copy message,Report, in that order.MessageManagementtests now mountMessageReadStateItemnext toMessageManagementItems.Deferred checks
🤖 Generated with Claude Code