Skip to content

feat(messages): list Mark unread above Copy message - #638

Merged
kalvinnchau merged 4 commits into
mainfrom
mark-unread-above-copy-message
Oct 7, 2026
Merged

kalvinnchau merged 4 commits into
mainfrom
mark-unread-above-copy-message

Conversation

@matt2e

@matt2e matt2e commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

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 of MessageManagementItems into a new MessageReadStateItem. A shared useManagedMessage hook keeps both on the same gate as before: a managed, delivered row in a writable channel.
  • MessageActionBar.tsx: adds a leadingItems slot that renders above the built-in Copy message item.
  • MessageRow.tsx: renders MessageReadStateItem in 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.

Before (5362dafa, main) After (481f8279, this PR)
Before: the message actions menu lists Copy message, Send to channel, Edit message, Delete message, Mark unread, Report After: the message actions menu lists Mark unread, Copy message, Send to channel, Edit message, Delete message, Report

Tests

  • New MessageRow test: the menu for a managed peer message lists Mark unread, Copy message, Report, in that order.
  • MessageManagement tests now mount MessageReadStateItem next to MessageManagementItems.

Deferred checks

  • Agent review and agent/human checks in the running app are still to do. The PR stays in draft until they're done.

🤖 Generated with Claude Code

@matt2e
matt2e marked this pull request as ready for review October 6, 2026 06:54
@matt2e
matt2e requested review from a team, comp615 and wesbillman as code owners October 6, 2026 06:54

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

matt2e and others added 3 commits October 7, 2026 08:54
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>
@matt2e
matt2e force-pushed the mark-unread-above-copy-message branch from d7cc489 to 19dcaf2 Compare October 6, 2026 22:48

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread src/features/messages/MessageRow.test.tsx
Signed-off-by: am <6e30cd56c30e030cd31bb0939b94a7c257c9a09d5ba2d92cf2735da45629f248@buzz.block.builderlab.xyz>
@kalvinnchau
kalvinnchau merged commit a6f0b97 into main Oct 7, 2026
21 checks passed
@kalvinnchau
kalvinnchau deleted the mark-unread-above-copy-message branch October 7, 2026 17:03
johnmatthewtennant pushed a commit that referenced this pull request Oct 7, 2026
…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
johnmatthewtennant pushed a commit that referenced this pull request Oct 7, 2026
…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
johnmatthewtennant pushed a commit that referenced this pull request Oct 7, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants