Skip to content

feat(ui-message-list): add the message toolbar - #43726

Draft
gabriellsh wants to merge 10 commits into
message-list/04-attachmentsfrom
message-list/05-toolbar
Draft

gabriellsh wants to merge 10 commits into
message-list/04-attachmentsfrom
message-list/05-toolbar

Conversation

@gabriellsh

@gabriellsh gabriellsh commented Nov 13, 2026 •

Copy link
Copy Markdown
Member

Proposed changes (including videos or screenshots)

Adds the message toolbar to @rocket.chat/ui-message-list: the inline actions (reaction with quick reactions, quote, reply in thread, forward, jump), the action menu, the AI menu, the item sets for the eleven contexts, and the visibility rule that keeps the toolbar shown while its menu or the emoji picker is open. MessagesProvider gains the toolbar value, which runs the app's menu action hooks and appends the apps' actions. The app's components/message/toolbar/** is deleted.

@rocket.chat/ui-emoji-picker gains addFrequentEmoji, so a quick reaction can count toward the frequent emoji without being added to the recent list (the package is private, no changeset). A refactor below the feature makes the read receipts action take its settings as a parameter.

Where no chat is open, the provider says the place offers no reactions (useQuickReactions returns undefined), so the toolbar shows no reaction item there, as develop's toolbar showed none. The specs develop added in #43386 for the reaction action are merged into the package's and the provider's specs.

This is part 05 of the stack (00 to 09). Review it against its base branch message-list/04-attachments, not against develop.

Stack

Visible changes

  • .changeset/message-toolbar-menu-with-only-app-actions.md, '@rocket.chat/meteor': minor: the "More" menu shows when it holds only actions added by apps; before, it was hidden when no built-in action applied.
  • .changeset/message-toolbar-quick-reactions-not-recent.md, '@rocket.chat/meteor': minor: a reaction picked from the quick reactions is no longer added to the recently used emoji; it still counts toward the frequently used emoji that choose the quick reactions, and the emoji picker still does both.

Known differences from develop

Besides the two above:

  • hovering a quick reaction no longer previews it in an open emoji picker (not in a changeset);
  • the toolbar hold is taken before the picker opens, where develop takes it after (a keyboard-only edge case).

Issue(s)

Steps to test or reproduce

Hover a message in each of: a room, a thread, a DM, the pinned, starred and mentions tabs, search results, and a federated room if available. Compare the inline items and the menu with develop.

  • react from the quick reactions and from the picker; a picker pick appears in Recent, a quick reaction does not, and both re-rank the frequent emoji;
  • quote, reply in thread, forward;
  • copy the link, pin, star, mark unread, edit, delete, report;
  • open read receipts with read receipts enabled;
  • run an app action with an app installed, and check a menu that holds only app actions;
  • open the picker from the keyboard and confirm the toolbar stays shown, and is released when the picker closes;
  • audit, contact history and the dialogs show no toolbar.

Further comments

Decisions to check

  • Unresolved: useCountQuickReaction reads the emoji picker context inside each reaction action, so every on-screen toolbar's reaction action re-renders on each picker preview and frequency change. develop did the same, and the spec's "nothing below renders again" is not accurate for it.
  • The reaction item where no chat is open. It is hidden there, as on develop. develop's quote action and toolbar holder also show nothing without a chat; the package's quote action and holder do not check for a chat, and this PR leaves them so.
  • Changesets for @rocket.chat/ui-message-list. This PR adds none for the private package (nor for the private @rocket.chat/ui-emoji-picker); parts 08 and 09 of the stack add some for @rocket.chat/ui-message-list. The repo versions private packages (other private packages carry changesets), so 08 and 09 follow the repo, and 03 to 07 may need changesets too. Undecided.

Not run

  • The e2e suites, and the app in a browser.
  • Checks ran on the branch tip only, not commit by commit.
  • The menus of message-mobile and search and the read-only and muted gates on menu entries are not exercised by specs of their own.

🤖 Generated with Claude Code

@dionisio-bot

dionisio-bot Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Looks like this PR is not ready to merge, because of the following issues:

  • This PR is still a draft
  • This PR is missing the 'stat: QA assured' label
  • This PR is missing the required milestone or project

Please fix the issues and try again

If you have any trouble, please check the PR guidelines

@coderabbitai

coderabbitai Bot commented Nov 13, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@changeset-bot

changeset-bot Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b743403

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
@rocket.chat/meteor Minor
@rocket.chat/core-typings Minor
@rocket.chat/rest-typings Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@codecov

codecov Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.11823% with 32 lines in your changes missing coverage. Please review.
✅ Project coverage is 71.61%. Comparing base (dc00db2) to head (b743403).

Additional details and impacted files

Impacted file tree graph

@@                       Coverage Diff                       @@
##           message-list/04-attachments   #43726      +/-   ##
===============================================================
+ Coverage                        71.41%   71.61%   +0.20%     
===============================================================
  Files                             5726     5623     -103     
  Lines                           252065   251728     -337     
  Branches                         47359    47464     +105     
===============================================================
+ Hits                            180016   180285     +269     
+ Misses                           67647    67090     -557     
+ Partials                          4402     4353      -49     
Flag Coverage Δ
e2e 63.12% <77.41%> (+0.10%) ⬆️
e2e-api 49.74% <ø> (-0.02%) ⬇️
unit 70.56% <92.11%> (+0.16%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

gabriellsh and others added 10 commits November 13, 2026 18:57
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
…parameter

The action no longer reads the old list context, so a toolbar outside the
old list can offer it.

Co-Authored-By: Claude <noreply@anthropic.com>
…t as recent

A use of an emoji that is not a pick from the picker can now raise its
frequency, which ranks the quick reactions, and leave the recent list as it is.
Nothing calls it yet. The picker's own picks keep doing both.

Co-Authored-By: Claude <noreply@anthropic.com>
The toolbar, its inline items for each place, the menus and the holder that
shows it only where messages allow interaction, taken from the toolbar context
and the contexts the package already has.

Reply in thread gets a navigation capability of its own, so that the app can
keep dropping the URL's search parameters as its toolbar did; the app side of it
comes with it so that the app still builds. The toolbar context gets
useCountQuickReaction, which the app answers by counting a quick reaction
toward the frequent emoji, and its useQuickReactions can say that a place
offers no reactions at all, so the app can keep hiding them where no chat is
open, as its toolbar did. Plan departures: the package's specs and stories
build rooms and subscriptions inline, since the mock-providers fixtures are
shared infrastructure this branch does not add; useIsVisible is ui-client's.
message-toolbar R1 to R13, R15 to R18, R27, R28 and R23's navigation.

Co-Authored-By: Claude <noreply@anthropic.com>
MessagesProvider gives the toolbar the built-in menu entries, gated as before,
then the actions of apps, the AI actions and the first three quick reactions
of the emoji picker that the app can render. Using a quick reaction raises the
emoji's frequency in the picker and leaves the recent list alone. Where no
chat is open it offers no reactions at all, as the app's toolbar did.

openReactionPicker now tells that it closed also when it could not open, so a
toolbar is never held open for a picker that is not there. This is the proof
message-capabilities R28 deferred for pin, star, mark unread and translate,
and the spec now promises it. message-toolbar R19 to R24.

Co-Authored-By: Claude <noreply@anthropic.com>
The room's and the thread's message render the package's toolbar holder, which
shows nothing where messages do not allow interaction.

Two changes a user can see, both stated by message-toolbar and each with its
changeset: the "More" menu shows when only apps offer an action (R14), and a
quick reaction no longer adds to the recently used emoji, while it still counts
toward the frequent ones (R21). message-toolbar R25 and R26.

Co-Authored-By: Claude <noreply@anthropic.com>
The spec of the deleted reaction item goes with it: the package's toolbar
spec and MessagesProvider's specs prove its cases, hiding the reactions where
no chat is open among them (message-toolbar R6 and R21). The one case they do
not keep is that a quick reaction was added to the recent emoji list, which it
no longer is (message-toolbar R21).

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
@gabriellsh
gabriellsh force-pushed the message-list/05-toolbar branch from 55322f8 to b743403 Compare November 14, 2026 14:29

This branch has not been deployed

No deployments
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.

1 participant