Skip to content

fix(llc, ui, sample): more v10 QA fixes#2640

Merged
xsahil03x merged 20 commits intov10.0.0from
fix/more-latest-qa
May 8, 2026
Merged

fix(llc, ui, sample): more v10 QA fixes#2640
xsahil03x merged 20 commits intov10.0.0from
fix/more-latest-qa

Conversation

@xsahil03x
Copy link
Copy Markdown
Member

@xsahil03x xsahil03x commented May 4, 2026

Summary

Follow-up QA pass on top of the v10 design refresh, plus the supporting SDK changes.

stream_chat

  • Added debugCurrentPlatformOverride on StreamPlatformDetector so tests can simulate iOS / Android / web behavior without per-class overrides.

stream_chat_flutter

  • Added StreamQuotedMessage and StreamQuotedMessageThemeData for the quoted-message preview, exposed through the component factory. Theme data carries the chrome (background, shape, side, margin, padding) and the trailing thumbnail (thumbnailShape, thumbnailSide, thumbnailSize).
  • Adopted stream_core_flutter primitives:
    • Composer header attachments (link preview, reply / edit, voice recording) now use the new core.StreamMessageComposer* widgets.
    • StreamingMessageView switched to core.StreamMessageText; the local StreamMarkdownMessage widget and its export were removed (breaking — consumers should use the re-exported StreamMessageText).
    • StreamQuotedMessage, StreamChannelListItem and StreamQuotedMessageThemeData rebuilt on top of the shared core building blocks.
  • Confirmation dialog polish:
    • Switched the affirmative action in the poll dialogs (suggest option, add comment, end vote, delete option) and StreamMessageActionConfirmationModal from the ghost StreamButton variant to solid, so it stands out from the ghost-secondary cancel.
    • StreamMessageActionConfirmationModal now honors its isDestructiveAction flag (the confirm action was previously rendered as destructive regardless).
  • Removed the unused dialog widgets in lib/src/dialogs (ConfirmationDialog, DeleteMessageDialog, MessageDialog, ChannelInfoDialog) and their barrel. None were exported from the public library.
  • Added StreamChatConfigurationData.reactionOverlap and StreamMessageReactions.overlap to control whether reactions overlap the message bubble edge. When unset, falls back to the platform-based default (overlap on mobile, no overlap on desktop and web).
  • Capped StreamCommandAutocompleteOptions and StreamMentionAutocompleteOptions at fixed max heights (208 / 176) so the lists scroll internally instead of expanding to half the screen and overlapping the header.
  • Hid the "Add an option" button in the poll creator when adding isn't allowed (an existing option is empty, or the max has been reached) — previously rendered as a disabled lookalike of an empty option row.
  • Fixed StreamChannelListTile subtitle appearing centered when the channel had no messages yet — switched the inner column to crossAxisAlignment: start.
  • Bumped the stream_core_flutter git ref.

sample_app

  • Mirrored the new dialog button pattern in the sample-app confirmation dialogs (channel list, chat info, group info).
  • Added a "Reaction Overlap" segmented row in the config screen alongside Type / Position.
  • Removed the misleading auto-chevron on action rows in the channel detail / chat info screens — the chevron is now opt-in via explicit trailing for navigation rows only.
  • Added the destructive Delete Group action to GroupInfoScreen for admins, mirroring the channel-list long-press sheet.
  • Fixed the Edit Group sheet shrink-wrapping to the keyboard top edge; now fills the available height so there's breathing room above the keyboard.

repo

  • gitignored devtools_options.yaml (auto-generated Flutter DevTools stubs).

Test plan

  • Quote a message → quoted-message preview renders with the new chrome (rounded card, optional trailing thumbnail).
  • Reply to / edit / record voice into a message → composer header attachments render the same as before.
  • Trigger an AI streaming response → markdown still renders correctly via StreamMessageText.
  • Open a poll → suggest option / add comment / end vote / delete option dialogs each show a solid affirmative button alongside a ghost cancel.
  • Long-press a message → flag / delete confirmation modals: solid destructive confirm + ghost cancel.
  • Sample-app confirmation dialogs (leave channel, delete channel from chat info / group info) match the new pattern.
  • In the sample-app config screen, toggle Reaction Overlap between Default / Overlap / No Overlap and verify reactions render accordingly.
  • GroupInfoScreen / ChatInfoScreen: navigation rows show a chevron, action rows (Leave / Delete / Block) do not.
  • GroupInfoScreen as an admin: Delete Group appears below Leave Group; tapping shows a confirm dialog and pops to the channel list on success.
  • Open the Edit Group sheet with the keyboard up → the text input has space above the keyboard.
  • Type `/` in the composer with many commands → the list caps at 208px and scrolls internally without overlapping the header.
  • Type `@` in the composer with many channel members → the list caps at 176px and scrolls internally.
  • Open the Create Poll sheet → the "Add an option" button is hidden until you type in the existing option.
  • Open the channel list with an empty channel → "No messages yet" is left-aligned under the title (not centered).
  • CI goldens pass without further regen.

xsahil03x and others added 4 commits May 4, 2026 11:09
Drop StreamMessageAttachment wrapper; chrome (background, shape, margin)
now flows through StreamQuotedMessageThemeData. Rename `contentPadding`
to `padding`, add `margin` for outer space, move
stream_quoted_message.dart out of message_widget/components/, and
overlay StreamVideoPlayIndicator on video thumbnails in the trailing
slot.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 4, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5f6a9808-73aa-4871-a117-d10ba106d31d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/more-latest-qa

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

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 4, 2026

Codecov Report

❌ Patch coverage is 26.63551% with 157 lines in your changes missing coverage. Please review.
✅ Project coverage is 66.88%. Comparing base (9ddf688) to head (4f3c702).

Files with missing lines Patch % Lines
.../lib/src/message_widget/stream_quoted_message.dart 0.00% 92 Missing ⚠️
...r/lib/src/message_list_view/message_list_view.dart 17.39% 19 Missing ⚠️
...essage_composer/message_composer_input_header.dart 22.22% 14 Missing ⚠️
...at_flutter/lib/src/theme/quoted_message_theme.dart 9.09% 10 Missing ⚠️
.../channel_scroll_view/stream_channel_list_item.dart 0.00% 9 Missing ⚠️
...sage_input/stream_message_composer_attachment.dart 75.75% 8 Missing ⚠️
...sage_widget/components/stream_message_content.dart 25.00% 3 Missing ⚠️
...src/components/stream_chat_component_builders.dart 0.00% 1 Missing ⚠️
...ssage_modal/message_action_confirmation_modal.dart 0.00% 1 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           v10.0.0    #2640      +/-   ##
===========================================
- Coverage    67.16%   66.88%   -0.28%     
===========================================
  Files          413      410       -3     
  Lines        24904    24887      -17     
===========================================
- Hits         16726    16646      -80     
- Misses        8178     8241      +63     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

xsahil03x and others added 4 commits May 7, 2026 12:49
…mitives

- Port composer header attachments (link preview, reply, edit, voice recording) to the new `core.StreamMessageComposer*` widgets.
- Replace the local `StreamMarkdownMessage` with `core.StreamMessageText` in `StreamingMessageView` and remove the now-unused widget and its export.
- Rework `StreamQuotedMessage`, `StreamChannelListItem`, and `StreamQuotedMessageThemeData` on top of the shared core building blocks.
# Conflicts:
#	docs/docs_screenshots/pubspec.yaml
#	melos.yaml
#	packages/stream_chat_flutter/pubspec.yaml
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…d drop unused legacy dialogs

- Switch the affirmative action in the poll dialogs (suggest option, add comment, end vote, delete option) and StreamMessageActionConfirmationModal from the ghost StreamButton variant to solid, so it stands out from the ghost secondary cancel.
- StreamMessageActionConfirmationModal now honors its isDestructiveAction flag (the confirm action was previously rendered as destructive regardless).
- Mirror the same pattern for the sample app confirmation dialogs in channel_list, chat_info_screen and group_info_screen.
- Remove the unused dialog widgets in lib/src/dialogs (ConfirmationDialog, DeleteMessageDialog, MessageDialog, ChannelInfoDialog and the dialogs.dart barrel) along with their tests and goldens. None were exported from the public library.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@xsahil03x xsahil03x changed the title fix(ui): more latest QA fix(llc, ui): more latest QA May 7, 2026
@xsahil03x xsahil03x changed the title fix(llc, ui): more latest QA refactor(ui): adopt stream_core_flutter primitives for quoted message and composer May 7, 2026
@xsahil03x xsahil03x changed the title refactor(ui): adopt stream_core_flutter primitives for quoted message and composer refactor(llc, ui): adopt stream_core_flutter primitives for quoted message and composer May 7, 2026
xsahil03x and others added 10 commits May 7, 2026 16:44
…lacement

- Re-export StreamBadgeNotification, StreamBadgeCount and their theme
  classes from stream_core_flutter so consumers of stream_chat_flutter
  can override badge styling without depending on stream_core_flutter
  directly.
- Drop hardcoded size in StreamUnreadIndicator and the message list
  scroll-to-bottom badge so they pick up StreamBadgeNotificationTheme.
- Sample app: wrap the bottom nav in StreamBadgeNotificationTheme(.xs)
  so unread badges fit the 20px tab icons.
- StreamBackButton: wrap the whole button (offset: .zero) instead of
  the inner icon, so the badge sits on the button's corner rather than
  floating inside the button frame.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a `reactionOverlap` field to `StreamChatConfigurationData` and an
`overlap` parameter to `StreamMessageReactions`. When unset, the widget
falls back to the existing platform-based default (overlap on mobile,
no overlap on desktop and web).

The sample app exposes the new flag as a third segmented row in the
Reactions section, alongside Type and Position. A `SampleReactionOverlap`
enum carries the boolean value and persists by index, mirroring the
nullable enum pattern used for `reactionType` / `reactionPosition`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The "Leave Group" row in `GroupInfoScreen` (and "Block User" /
"Delete Conversation" in `ChatInfoScreen`) rendered a right-chevron
that implied navigation, but tapping triggered an in-place
confirmation or toggle. Drop the auto-chevron heuristic in `_Tile`
so chevrons are opt-in via `trailing`, and add explicit chevrons
only to the actual navigation rows in `_MediaSection`.

`GroupInfoScreen` was also missing the destructive Delete Group
action that the channel-list long-press sheet exposes for admins.
Add it alongside Leave Group, gated on `channel.canDeleteChannel`,
with a confirmation dialog mirroring `_confirmLeave`.

Refactor the tile widgets used across the channel / chat detail
surfaces (`_Tile`, `_ChannelDetailAction`, `_PickerTile`,
`_ActionTile`) to take `Widget icon` and `Widget label` instead of
`IconData` and `String`, matching the existing `Widget? trailing`
and giving callers room to customise.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The sheet was shrink-wrapped with `MainAxisSize.min`, so when the
keyboard came up it sized to exactly header + avatar + input + the
keyboard inset and rested flush against the keyboard top edge with
no breathing room.

Drop the explicit `MainAxisSize.min` (Column defaults to max) and
wrap the body padding in `Expanded` so the sheet fills the
available height. The avatar and input still anchor to the top of
the body via the inner `MainAxisSize.min` column, with empty space
between the input and the keyboard inset.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Both lists relied on `StreamAutocompleteOptions`'s default
`maxHeight` of half the screen height, so a long list would
dominate the screen and overlap the message-list header.

Pass an explicit fixed max height (208px for commands, 176px for
mentions) to the parent — `StreamAutocompleteOptions` already
wraps its body in `LimitedBox` + `ListView.builder(shrinkWrap:
true)`, so the cards now scroll internally instead of growing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The button in `PollOptionReorderableListView` was styled to mirror
an option row (input border, padding, hint text), so when it was
rendered disabled — because an existing option was empty or the
max had been reached — users read it as a second tappable empty
row that silently rejected input.

Wrap the button in `if (_canAddMoreOptions)` so it disappears
entirely when adding isn't allowed and reappears once the user
fills the previous option (or removes one to drop below the max).

Update three "Empty Options Prevention" tests (disable/enable →
hide/show/reveal) and two "Options Range" tests to expect
`findsNothing` for the at-max case.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The inner column used `crossAxisAlignment: center`, which centered
the subtitle row whenever it shrunk to fit short text like "No
messages yet". The title row always filled width via its inner
`Expanded`, masking the bug there.

Switch the column to `crossAxisAlignment: start` so the subtitle
stays left-aligned regardless of length.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop the now-unused `stream_core_flutter` import from
`unread_indicator.dart` exposed by the bump.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
These are auto-generated Flutter DevTools extension stubs (one per
package). They've been consistently untracked and just clutter
`git status`. Reversible if the team later wants to share
DevTools-extension preferences.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@xsahil03x xsahil03x changed the title refactor(llc, ui): adopt stream_core_flutter primitives for quoted message and composer fix(llc, ui, sample): more v10 QA fixes May 7, 2026
xsahil03x and others added 2 commits May 7, 2026 19:40
- Tapping a quoted parent message inside a thread now scrolls to and
  highlights the parent slot directly. Previously _moveToAndHighlight
  fell through to loadChannelAtMessage when the messageId wasn't in
  the thread's `messages` list, kicking the user back to the channel.
- Highlight tween now waits for the scroll to settle before pulsing
  (1s hold + 1s ease-out fade), so the fade is fully visible even on
  long-distance jumps where the target had not been mounted at scroll
  start. Replaces the previous 3s straight fade.
- Extract `_maybeWrapWithHighlight` to dedupe the highlight wrap
  between buildMessage and buildParentMessage.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…pported types

The render test was creating attachments with type 'media', which isn't a
recognized AttachmentType. StreamMessageComposerAttachment's switch only
routes image/video/giphy to StreamMediaAttachmentBuilder, so the bogus
type fell through to the unsupported branch and findsNWidgets(2) saw
zero matches. Switched to image + video so the assertion holds.

Also added a test that pumps unrecognized types and asserts they render
StreamMessageComposerUnsupportedAttachment, which previously had no
coverage.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@xsahil03x xsahil03x merged commit 85c6b10 into v10.0.0 May 8, 2026
7 of 9 checks passed
@xsahil03x xsahil03x deleted the fix/more-latest-qa branch May 8, 2026 00:49
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