Skip to content

Mobile: add anchored reaction popover - #5025

Merged
klopez4212 merged 4 commits into
mainfrom
kennylopez-mobile-reaction-popover
Aug 7, 2026
Merged

Mobile: add anchored reaction popover#5025
klopez4212 merged 4 commits into
mainfrom
kennylopez-mobile-reaction-popover

Conversation

@klopez4212

Copy link
Copy Markdown
Contributor

Summary

  • replace reaction-only mobile sheets with an anchored long-press popover
  • add haptics, a dimmed frosted spotlight, and a spring-staggered reaction tray
  • preserve the full action sheet whenever other message actions are available
  • keep existing reaction pills outside the spotlight and make long press reliable across nested content

Testing

  • flutter analyze
  • flutter test (1,248 tests)
  • signed iPhone release build installed and launched

Signed-off-by: kenny lopez <klopez4212@gmail.com>
klopez4212 added a commit that referenced this pull request Aug 6, 2026
@klopez4212

Copy link
Copy Markdown
Contributor Author

🤖

Emoji-only action

A reaction-only system event opens the anchored frosted popover.

01-emoji-only-popover

Full action sheet fallback

A regular message keeps the existing sheet when more actions are available.

02-action-sheet-fallback

Signed-off-by: kenny lopez <klopez4212@gmail.com>
@klopez4212
klopez4212 marked this pull request as ready for review August 6, 2026 11:54
@klopez4212
klopez4212 requested a review from a team as a code owner August 6, 2026 11:54

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fca0644798

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread mobile/lib/features/channels/message_long_press_region.dart
Comment thread mobile/lib/features/channels/message_long_press_region.dart Outdated
MessageLongPressRegion had no callers outside this file, so making it
private satisfies the one-public-widget-per-file convention without
changing any behavior.

Co-authored-by: kenny lopez <klopez4212@gmail.com>
Signed-off-by: kenny lopez <klopez4212@gmail.com>
@wesbillman

Copy link
Copy Markdown
Collaborator

Commenting on Wes's behalf after the Royal Court review. The gesture recognizer, cancellation behavior, fallback gating, animation lifecycle, and existing regression coverage all look solid. We found one medium layout edge worth fixing before merge:

P2 — Keep the reaction tray vertically on-screen when neither side of the anchor fully fits.

In mobile/lib/features/channels/message_actions/reaction_popover.dart:63-67, placement checks whether the 68px tray fits above anchorRect; when it does not, it unconditionally chooses anchorRect.bottom + Grid.xxs. A tall/wrapped system message near the top of a short viewport—especially landscape or split-screen—can also lack enough room below, placing the tray partly or wholly beyond the bottom edge and making every reaction inaccessible.

Please compute the available safe space on both sides and clamp the final top between top and bottom bounds, accounting for MediaQuery.padding/viewInsets. A short-viewport widget test should assert the tray rect remains fully on-screen when neither naïve placement fits.

Reviewed at exact head 69824baf079a06e0a0081adc2978ecc1740b0979. Princess Donut reproduced the geometry concern; Mongo and I found no other blocker.

Signed-off-by: kenny lopez <klopez4212@gmail.com>

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman Addressed in f1231c51e.

  • The tray now compares safe space above and below the anchor, uses the roomier side when neither fully fits, and clamps its final position inside the combined safe-area and keyboard bounds.
  • Added a 320×240 regression with a top safe inset and bottom keyboard inset. It proves neither naïve placement fits and asserts the full tray remains visible.

Checks: flutter analyze; full mobile suite (1,249 tests); focused message-action and reaction-popover tests. Could you take another look?

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

Re-reviewed on Wes's behalf at f1231c51e59b91e0175136f1380b146492292a2a.

The follow-up resolves my prior layout finding. It now measures usable space above and below the anchor, chooses the viable/roomier side, and clamps the final tray position within the safe-area and keyboard bounds. The new 320×240 widget test constructs the neither-side-fits case and asserts the rendered tray stays between the top safe inset and visible bottom.

Focused verification on this exact head:

  • flutter test test/features/channels/message_actions_test.dart — 17/17 passed
  • flutter analyze lib/features/channels/message_actions/reaction_popover.dart test/features/channels/message_actions_test.dart — no issues
  • dart format --output=none --set-exit-if-changed ... — clean
  • git diff --check 69824baf..f1231c51e — clean

No remaining findings from me. I recommend approval and merge.

@wesbillman
wesbillman enabled auto-merge (squash) August 7, 2026 14:39
@wesbillman

Copy link
Copy Markdown
Collaborator

Temporarily closing and immediately reopening to re-trigger the pull_request CI workflow; the prior run never materialized after the GitHub Actions outage. No code or review disposition changed.

@wesbillman wesbillman closed this Aug 7, 2026
auto-merge was automatically disabled August 7, 2026 15:15

Pull request was closed

@wesbillman wesbillman reopened this Aug 7, 2026
@klopez4212
klopez4212 merged commit 8476ea0 into main Aug 7, 2026
49 of 51 checks passed
@klopez4212
klopez4212 deleted the kennylopez-mobile-reaction-popover branch August 7, 2026 16:17
atishpatel added a commit that referenced this pull request Aug 7, 2026
…-log-harness

* origin/main:
  feat(desktop): adding rich link previews to messages (#3818)
  fix(buzz-agent): Responses reasoning summary, Anthropic display:summarized, ACP v2 messageId (#5195)
  fix(desktop): retain distinct agent instances in autocomplete (#5202)
  fix(desktop): defer channel visibility change to Save (#5203)
  feat(desktop): Projects follow-ups — access restrictions, fast loading, activity feed polish (#5073)
  refactor(cli): replace probe/decider/detail split with single typed extractor (#5191)
  fix(desktop): drop unhandled rejection from throwing window.Notification (#5143)
  fix(desktop): fence localStorage SecurityError from killing the React tree (#5142)
  fix(desktop): make terminal output selectable (#4980)
  fix(desktop): use WEBKIT_DMABUF_RENDERER_FORCE_SHM for NVIDIA/AppImage (#3654) (#4505)
  Make public starter channels best effort (#5192)
  Mobile: add anchored reaction popover (#5025)
  feat(mobile): add bee pull-to-refresh (#5059)

Signed-off-by: Atish Patel <atish@squareup.com>
wpfleger96 pushed a commit that referenced this pull request Aug 7, 2026
* origin/main: (32 commits)
  Recover from max-token response truncation (#5223)
  chore(release): release Buzz Desktop version 0.5.6 (#5214)
  fix(mobile): keep latest messages above composer (#4981)
  fix(sdk): preserve self-mention p tags in message and forum event builders (#4975)
  bump @tauri-apps/cli to ~2.11.4 to fix linux app icon issue (#4858)
  feat(desktop): adding rich link previews to messages (#3818)
  fix(buzz-agent): Responses reasoning summary, Anthropic display:summarized, ACP v2 messageId (#5195)
  fix(desktop): retain distinct agent instances in autocomplete (#5202)
  fix(desktop): defer channel visibility change to Save (#5203)
  feat(desktop): Projects follow-ups — access restrictions, fast loading, activity feed polish (#5073)
  refactor(cli): replace probe/decider/detail split with single typed extractor (#5191)
  fix(desktop): drop unhandled rejection from throwing window.Notification (#5143)
  fix(desktop): fence localStorage SecurityError from killing the React tree (#5142)
  fix(desktop): make terminal output selectable (#4980)
  fix(desktop): use WEBKIT_DMABUF_RENDERER_FORCE_SHM for NVIDIA/AppImage (#3654) (#4505)
  Make public starter channels best effort (#5192)
  Mobile: add anchored reaction popover (#5025)
  feat(mobile): add bee pull-to-refresh (#5059)
  Remove agent creation success modal (#5063)
  fix(buzz-agent): escalate LLM timeouts per retry and log per-call latency (#5130)
  ...

Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>

# Conflicts:
#	desktop/src/shared/api/tauri.ts
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