fix(llc, ui, sample): more v10 QA fixes#2640
Conversation
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>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Codecov Report❌ Patch coverage is 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. 🚀 New features to boost your workflow:
|
…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>
…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>
- 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>
Summary
Follow-up QA pass on top of the v10 design refresh, plus the supporting SDK changes.
stream_chatdebugCurrentPlatformOverrideonStreamPlatformDetectorso tests can simulate iOS / Android / web behavior without per-class overrides.stream_chat_flutterStreamQuotedMessageandStreamQuotedMessageThemeDatafor 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).stream_core_flutterprimitives:core.StreamMessageComposer*widgets.StreamingMessageViewswitched tocore.StreamMessageText; the localStreamMarkdownMessagewidget and its export were removed (breaking — consumers should use the re-exportedStreamMessageText).StreamQuotedMessage,StreamChannelListItemandStreamQuotedMessageThemeDatarebuilt on top of the shared core building blocks.StreamMessageActionConfirmationModalfrom the ghostStreamButtonvariant to solid, so it stands out from the ghost-secondary cancel.StreamMessageActionConfirmationModalnow honors itsisDestructiveActionflag (the confirm action was previously rendered as destructive regardless).lib/src/dialogs(ConfirmationDialog,DeleteMessageDialog,MessageDialog,ChannelInfoDialog) and their barrel. None were exported from the public library.StreamChatConfigurationData.reactionOverlapandStreamMessageReactions.overlapto 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).StreamCommandAutocompleteOptionsandStreamMentionAutocompleteOptionsat fixed max heights (208 / 176) so the lists scroll internally instead of expanding to half the screen and overlapping the header.StreamChannelListTilesubtitle appearing centered when the channel had no messages yet — switched the inner column tocrossAxisAlignment: start.stream_core_fluttergit ref.sample_apptrailingfor navigation rows only.GroupInfoScreenfor admins, mirroring the channel-list long-press sheet.repodevtools_options.yaml(auto-generated Flutter DevTools stubs).Test plan
StreamMessageText.GroupInfoScreen/ChatInfoScreen: navigation rows show a chevron, action rows (Leave / Delete / Block) do not.GroupInfoScreenas an admin: Delete Group appears below Leave Group; tapping shows a confirm dialog and pops to the channel list on success.