Skip to content

Add reply and copying to the shared message menu - #182

Merged
wesbillman merged 5 commits into
mainfrom
morganm/message-actions
Sep 23, 2026
Merged

wesbillman merged 5 commits into
mainfrom
morganm/message-actions

Conversation

@morgmart

@morgmart morgmart commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

What this does

Adds a message action menu in channels, DMs, and threads. Hover or keyboard focus reveals reply, copy link, and an overflow menu with copy message. Touch and narrow layouts keep the controls visible without hover.

This is the shared menu slice. Reactions and message management remain separate follow-up PRs; there are no inactive placeholders for them.

Why it matters

People can reply to messages with no existing thread and share a specific message without selecting its text. Copying retains Markdown, attachment destinations, and resolved mention identities rather than relying on display names alone.

How it works

The shared row composes the design-system menu and buttons. Existing navigation opens threads; replying inside a thread focuses its existing composer. Copy failures are visible and retryable. Pending or failed messages cannot produce a link or start a reply, and read-only/archived conversations disable reply.

Reaction controls and management menu items have small composition slots, not a new registry. The shared menu keeps its owning message identity across its portal so timeline focus tracking can retain the row.

Screenshots

Captured from 94bd604809e65510083f6484194ddb259621d301 in Chromium using synthetic conversations. Both images show the shared message action bar and its open overflow menu; no live conversation data is included.

Light mode

Message action bar and open copy menu in light mode

Dark mode

Message action bar and open copy menu in dark mode

Verification

Checked head: 43f1a28ede68e18677fc8d3dc5aa06c1da3e7dcd (includes current main a9f68a42).

  • Reply focuses the composer on first and repeated use, preserves drafts, and returns focus on close; View thread retains reading behavior.
  • Fixed the copied-identity review finding: validated exact profile links reuse existing profile controls after resending. Disabled Profiles retains the visible identity without a live control. No inferred notifications or arbitrary protocol support.
  • Two regression cases failed before the fix and pass afterward: copy → signed resend → fold → row → click, for human and agent messages. Two namesakes open different exact profiles, with no new recipient tags. Additional cases cover invalid/unsafe targets, disabled Profiles, noninteractive rendering, and literal code.
  • Full Vitest suite passed at the checked head: 2,468 tests across 235 files.
  • Pre-commit formatting/lint and secret scan passed; pre-push TypeScript, 389 related tests, design types and design-system guards passed.
  • Chromium/WebKit message-action run passed: six action cases plus ten configured measurement dependencies (16 total). No browser cases added or removed in this fix; identity rendering is covered through the real React renderer in Vitest, not a new browser matrix.
  • Independent bounded source review of the identity fix found no blockers; the reviewer did not independently run live copy/paste.
  • Native OS clipboard, live cross-identity navigation, packaged desktop acceptance, and human visual review remain unverified. Hosted CI for this updated head is pending. No merge requested.

Originating conversation: buzz://message?channel=7945fb18-bd9b-4726-bf7c-4d82339eacf6&id=0fa98bea2273d19ee29c6b2a66c9301d59db35fe3c352f199aa0f251bd6db445

Carl added 2 commits September 23, 2026 15:29
Co-authored-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>
Signed-off-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>
Co-authored-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>
Signed-off-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>
@morgmart
morgmart marked this pull request as ready for review September 23, 2026 22:33
@morgmart
morgmart requested review from a team, comp615 and wesbillman as code owners September 23, 2026 22:33
Signed-off-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>

@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.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

Changes requested at 5f4bda07f3d5b7e5ce56fcc185e2790c427f0cf6 against base a47ddaf452e605a59056476d2091146e1f3902e8: one P2, detailed inline.

Merge criterion: copied exact identities must remain usable/visible when the generated text is sent and rendered in Buzz, with a copy-to-render regression. Preserve the no-inferred-notification rule; no general protocol expansion is required.

Validation: hosted CI passed, including 2,422 Vitest tests and all six new Chromium/WebKit message-action cases. Three focused local diagnostics reproduced the identity loss and verified menu Escape isolation/focus return for thread-like and real modal-boundary owners. Native clipboard and packaged desktop remain unverified. Sequential Tab and scrolled-out portal ownership are coverage gaps, not demonstrated defects.

Comment thread src/features/messages/message-copy.ts
Carl added 2 commits September 23, 2026 16:14
Signed-off-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>
* origin/main:
  Add optional channel templates, teams and personal group defaults (#181)

Signed-off-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>

@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.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

Previous P2 resolved; no remaining blockers in the bounded re-review at 43f1a28ede68e18677fc8d3dc5aa06c1da3e7dcd against a9f68a42880b4d0352b66743546dffe47a28c639. The copied profile destination now survives rendering and opens the exact identity; unavailable Profiles leaves the identity visible. The change reuses strict existing target validation and does not infer notification recipients.

Independently ran all three affected copy/row/Markdown test files: 118/118 passed, including signed kind-9/kind-40002 round trips and two namesakes opening distinct targets. Reviewed overlapping merge changes; no new material regression found. This is a follow-up comment, not formal approval.

Hosted CI for this head was still running when inspected; the author reports a full local suite and browser passes. Native clipboard, live cross-identity navigation and packaged desktop acceptance remain unverified.

@wesbillman
wesbillman dismissed their stale review September 23, 2026 23:22

Carl, an automated reviewer, commenting via Wes’s GitHub account. Previous copied-identity P2 is resolved at 43f1a28; 118 focused tests passed. Dismissing this obsolete change request, not granting formal approval. Hosted CI remains a separate gate.

@wesbillman
wesbillman merged commit 2226057 into main Sep 23, 2026
10 of 12 checks passed
@wesbillman
wesbillman deleted the morganm/message-actions branch September 23, 2026 23:33
zrmarley added a commit that referenced this pull request Sep 24, 2026
…o-player-polish

* origin/main: (38 commits)
  Fix diff content fallback, keyboard scrolling and edit selection (#205)
  Standardize form controls and field feedback across Buzz (#174)
  Keep image review downloads and external opens distinct (#144)
  Verify media review comments (#166)
  Follow system appearance (#210)
  Add rich composer formatting and spoiler rendering (#203)
  feat: show roster-backed channels and managed instances in profiles (#188)
  Add new direct message flow (#156)
  Remove Home, start in Messages, and keep Channels enabled (#194)
  fix: restore avatar presence controls and active-input sensing (#198)
  Add legacy diff messages with inline and expanded viewing (#202)
  Edit the latest own message with Up in the existing composer (#192)
  Add complete reaction toggles to the message menu (#185)
  feat: add persistent community navigation rail (#191)
  test: add margin to warm-switch performance gate (#195)
  Add composer attachments and compatible media preparation (#183)
  Add reply and copying to the shared message menu (#182)
  fix: avoid idle workspace re-renders from activity and label churn (#186)
  feat: add devtools trace capture to web profiling (#180)
  Add optional channel templates, teams and personal group defaults (#181)
  ...

Signed-off-by: Zach Marley <zmarley@squareup.com>
zrmarley added a commit that referenced this pull request Sep 24, 2026
…-content-compat

* origin/main: (38 commits)
  Fix diff content fallback, keyboard scrolling and edit selection (#205)
  Standardize form controls and field feedback across Buzz (#174)
  Keep image review downloads and external opens distinct (#144)
  Verify media review comments (#166)
  Follow system appearance (#210)
  Add rich composer formatting and spoiler rendering (#203)
  feat: show roster-backed channels and managed instances in profiles (#188)
  Add new direct message flow (#156)
  Remove Home, start in Messages, and keep Channels enabled (#194)
  fix: restore avatar presence controls and active-input sensing (#198)
  Add legacy diff messages with inline and expanded viewing (#202)
  Edit the latest own message with Up in the existing composer (#192)
  Add complete reaction toggles to the message menu (#185)
  feat: add persistent community navigation rail (#191)
  test: add margin to warm-switch performance gate (#195)
  Add composer attachments and compatible media preparation (#183)
  Add reply and copying to the shared message menu (#182)
  fix: avoid idle workspace re-renders from activity and label churn (#186)
  feat: add devtools trace capture to web profiling (#180)
  Add optional channel templates, teams and personal group defaults (#181)
  ...

Signed-off-by: Zach Marley <zmarley@squareup.com>

# Conflicts:
#	docs/channels.md
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.

2 participants