Skip to content

Fix v5 QA issues: navigation headers, member view renames, media viewer, and swipe-to-reply#1402

Merged
nuno-vieira merged 14 commits intodevelopfrom
fix/latest-v5-qa-issues
Apr 10, 2026
Merged

Fix v5 QA issues: navigation headers, member view renames, media viewer, and swipe-to-reply#1402
nuno-vieira merged 14 commits intodevelopfrom
fix/latest-v5-qa-issues

Conversation

@nuno-vieira
Copy link
Copy Markdown
Member

@nuno-vieira nuno-vieira commented Apr 9, 2026

🔗 Issue Links

  • IOS-1599: v5 QA: Swipe to Reply Icon Outgoing Layout
  • IOS-1600: v5 QA: Edit Button Glass Border Effect
  • IOS-1601: v5 QA: Members View Headers Glass Buttons
  • IOS-1602: v5 QA: Media Viewer Selection bug and SF Symbol grid icon
  • IOS-1603: v5 QA: Scroll to bottom button icon weight

🎯 Goal

Address multiple QA issues found during the v5 review cycle, including navigation header inconsistencies, glass border effects, swipe-to-reply layout bugs, and media viewer improvements.

📝 Summary

  • Fix the swipe-to-reply icon not shifted correctly for outgoing messages and RTL layouts
  • Remove unwanted glass border on the Edit button in the Channel Info view by introducing LiquidGlassBorderlessModifier
  • Migrate all Channel Info navigation headers (MemberListView, MemberAddView) to use consistent xmark close buttons and makeToolbarConfirmActionModifier styling
  • Rename AddUsersViewMemberAddView, AddUsersViewModelMemberAddViewModel, and extract MemberListView into its own file
  • Update MediaViewer design according to Figma and add support for customising the Media Viewer footer

🧪 Manual Testing Notes

  • Open a group channel info screen and verify the Edit button no longer has a visible border
  • Tap Edit and verify the xmark close button and checkmark confirm button render correctly
  • Open the member list sheet and verify the xmark close button and add-members button render correctly
  • Open the add members sheet and verify toolbar consistency
  • Test swipe-to-reply on outgoing messages in both LTR and RTL layouts
  • Open the media viewer and verify the updated design

☑️ Contributor Checklist

  • I have signed the Stream CLA (required)
  • This change should be manually QAed
  • Changelog is updated with client-facing changes
  • Changelog is updated with new localization keys
  • New code is covered by unit tests
  • Documentation has been updated in the docs-content repo

Summary by CodeRabbit

  • New Features

    • Interactive media item selection in the gallery grid
    • Full-screen member list and revamped Member Add flow (new Member Add UI and confirm flow)
  • Bug Fixes

    • Improved swipe-to-reply behavior for RTL layouts
    • Fixed arrow indicator positioning for right-aligned messages
    • Removed unwanted border from the Edit button in Channel Info
  • Style

    • Updated share button sizing and styling; new media viewer toolbar and footer
  • Localization

    • Added gallery page count string ("%d of %d")

@nuno-vieira nuno-vieira requested a review from a team as a code owner April 9, 2026 16:28
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 9, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9c5ee976-480f-498d-8487-42217835cef1

📥 Commits

Reviewing files that changed from the base of the PR and between 45a5d9a and ff30520.

📒 Files selected for processing (1)
  • CHANGELOG.md

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.


📝 Walkthrough

Walkthrough

Renamed AddUsers* → MemberAdd* types and files; extracted MemberListView to its own file; split MediaViewer header into a toolbar modifier and footer view; added media-grid selection callbacks; introduced LiquidGlassBorderlessModifier; fixed RTL swipe-to-reply behavior; updated ViewFactory APIs and tests.

Changes

Cohort / File(s) Summary
Member add rename & viewmodel
Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberAddView.swift, Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberAddViewModel.swift, Sources/StreamChatSwiftUI/ViewFactory/Options/ChannelViewFactoryOptions.swift, Sources/StreamChatSwiftUI/ViewFactory/ViewFactory.swift, Sources/StreamChatSwiftUI/ViewFactory/DefaultViewFactory.swift
Renamed AddUsersView/AddUsersViewModelMemberAddView/MemberAddViewModel; replaced AddUsersOptions/AddUsersViewOptionsMemberAddOptions/MemberAddViewOptions; updated factory API to makeMemberAddView and related option types.
Member list extraction
Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoHelperViews.swift, Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift
Removed inline MemberListView from helper file and added standalone MemberListView.swift implementing participant listing, selection sheet, and optional member-add sheet wiring.
Media viewer split & toolbar/footer
Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift, Sources/StreamChatSwiftUI/ViewFactory/Options/AttachmentViewFactoryOptions.swift, Sources/StreamChatSwiftUI/ViewFactory/ViewFactory.swift, Sources/StreamChatSwiftUI/ViewFactory/DefaultViewFactory.swift
Replaced single media-viewer header API with MediaViewerToolbarModifier and MediaViewerFooterView plus new options types; moved header/footer to factory-provided modifier/view and updated DefaultViewFactory.
Media grid selection
Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MediaAttachmentsView.swift, Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift
Added optional onItemSelected: ((Int) -> Void)? to grid views; when provided, cells become interactive buttons invoking the callback to select an item and enable dismiss/selection flows.
UI modifiers, RTL, share button
Sources/StreamChatSwiftUI/Utils/LiquidGlassModifiers.swift, Sources/StreamChatSwiftUI/ChatMessageList/MessageItemView.swift, Sources/StreamChatSwiftUI/ChatMessageList/Gallery/ShareButtonView.swift
Added LiquidGlassBorderlessModifier; updated swipe-to-reply to respect RTL and adjust arrow offset for right-aligned messages; changed ShareButtonView role/size and icon frame.
Channel info updates
Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoView.swift, Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoViewModel.swift
Switched add-members sheet factory call to makeMemberAddView/MemberAddViewOptions and renamed shouldShowAddUserButtonshouldShowAddMemberButton; updated Edit button styling to LiquidGlassBorderlessModifier on iOS 26+.
Tests & project file
StreamChatSwiftUITests/.../MemberAddView_Tests.swift, .../MemberAddViewModel_Tests.swift, .../MemberListView_Tests.swift, .../MessageItemView_Tests.swift, .../ViewFactory_Tests.swift, StreamChatSwiftUI.xcodeproj/project.pbxproj
Renamed test suites and methods to MemberAdd*; updated test usages for factory API changes and MemberListView init; added outgoing swipe snapshot test; updated ViewFactory tests; adjusted project test file list and package revision pin.
Localization
Sources/StreamChatSwiftUI/Resources/en.lproj/Localizable.strings
Added message.gallery.pageCount localization key ("%d of %d").

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant MediaViewer
  participant GridView
  participant ViewFactory
  participant SheetController

  User->>MediaViewer: tap grid toggle
  MediaViewer->>ViewFactory: makeMediaViewerFooterView(... gridShown binding)
  ViewFactory-->>MediaViewer: footer view (grid toggle)
  MediaViewer->>SheetController: present GridView (gridShown = true)
  GridView->>User: render media grid (cells with onItemSelected)
  User->>GridView: tap item(index)
  GridView->>MediaViewer: onItemSelected(index)
  MediaViewer->>MediaViewer: set selected = index
  MediaViewer->>SheetController: dismiss grid sheet
  MediaViewer->>MediaViewer: show selected item in viewer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • martinmitrevski

Poem

🐰 I hopped through code with nimble paws,

I renamed friends and opened doors,
Members listed, media shown,
Swipes obey the RTL tone,
The rabbit cheers — the UI explores.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: fixing v5 QA issues including navigation headers, member view renames, media viewer updates, and swipe-to-reply fixes.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/latest-v5-qa-issues

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.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 9, 2026

1 Warning
⚠️ Big PR

Generated by 🚫 Danger

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (2)
StreamChatSwiftUITests/Tests/ChatChannel/MessageItemView_Tests.swift (1)

917-942: Add an explicit RTL snapshot for swipe-to-reply indicator.

Great addition for outgoing coverage; please add a layoutDirection = .rightToLeft variant to lock in the new RTL path and prevent regressions.

Suggested test addition
+    func test_swipeToReplyIndicator_outgoing_rtl_snapshot() {
+        let message = ChatMessage.mock(
+            id: .unique,
+            cid: .unique,
+            text: "Swipe to reply message",
+            author: .mock(id: Self.currentUserId, name: "Martin"),
+            localState: nil,
+            isSentByCurrentUser: true
+        )
+        let channel = ChatChannel.mockDMChannel(config: .mock(repliesEnabled: true))
+        let offset: CGFloat = 50
+
+        let view = testMessageViewContainer(message: message, channel: channel)
+            .environment(\.layoutDirection, .rightToLeft)
+            .modifier(SwipeToReplyModifier(
+                message: message,
+                channel: channel,
+                isSwipeToQuoteReplyPossible: true,
+                quotedMessage: .constant(nil),
+                initialOffsetX: offset
+            ))
+            .offset(x: offset)
+
+        AssertSnapshot(view, size: CGSize(width: 375, height: 200))
+    }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@StreamChatSwiftUITests/Tests/ChatChannel/MessageItemView_Tests.swift` around
lines 917 - 942, Add a new RTL snapshot variant for the outgoing swipe-to-reply
test by duplicating test_swipeToReplyIndicator_outgoing_snapshot and applying a
layoutDirection = .rightToLeft environment to the view before calling
AssertSnapshot; locate the existing test that builds the view (using
testMessageViewContainer and SwipeToReplyModifier) and create a counterpart
(e.g., test_swipeToReplyIndicator_outgoing_snapshot_RTL) that sets the view
environment layoutDirection to .rightToLeft and verifies the snapshot with
AssertSnapshot to lock in RTL behavior.
Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift (1)

9-23: Remove unused chatClient injection.

The chatClient is injected on line 13 but never used in this view. This adds unnecessary overhead.

🧹 Proposed fix
 public struct MemberListView<Factory: ViewFactory>: View {
     `@Injected`(\.colors) private var colors
     `@Injected`(\.fonts) private var fonts
     `@Injected`(\.tokens) private var tokens
-    `@Injected`(\.chatClient) private var chatClient

     let factory: Factory
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift`
around lines 9 - 23, The MemberListView defines an unused dependency
`@Injected`(\.chatClient) private var chatClient which should be removed to
eliminate dead code and overhead; delete the `@Injected`(\.chatClient) property
from MemberListView (and any related unused references), verify there are no
remaining uses of chatClient inside MemberListView or its methods, and run a
quick build/import check to ensure nothing else relies on that injected symbol.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MediaAttachmentsView.swift`:
- Around line 162-174: The Button created when onItemSelected is non-nil in
MediaAttachmentsView lacks accessibility labeling; update the Button wrapping
LazyLoadingImage (inside the onItemSelected branch) to set an explicit
accessibilityLabel and accessibilityHint using the L10n accessors (e.g. a
localized format like L10n.mediaThumbnailLabel(index + 1) and
L10n.mediaThumbnailHint) so VoiceOver announces which thumbnail and what tapping
it will do, and ensure the accessibilityTraits include .isButton (or
accessibilityAddTraits(.isButton)) for clarity.

In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift`:
- Around line 212-225: Replace the hardcoded counter string in MediaViewer's
footer Text with the L10n accessor (e.g. use a localized format like
L10n.mediaViewerCounter(selected + 1, totalCount)) and ensure the Text continues
to use fonts/subheadlineBold and color; also add an accessibility label to the
grid toggle StreamIconButton (e.g. accessibilityLabel:
L10n.mediaViewerGridToggle) and appropriate traits (button) so VoiceOver
announces it; locate these changes around the Text("\(selected + 1) of
\(totalCount)") and the StreamIconButton in MediaViewer.swift and update callers
to use the new L10n keys.

In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/ShareButtonView.swift`:
- Around line 17-24: The StreamIconButton used to toggle isSharePresented is an
icon-only tappable control lacking an accessibility label; update the
StreamIconButton (the view that wraps images.share) to add an explicit
accessibilityLabel using the existing L10n accessor (e.g.
.accessibilityLabel(L10n.<shareLabel>())) and optionally
.accessibilityHint(L10n.<shareHint>()), and ensure appropriate traits (e.g.
.accessibilityAddTraits(.isButton)) so assistive tech announces it correctly.

In `@Sources/StreamChatSwiftUI/ChatMessageList/MessageItemView.swift`:
- Line 301: The hardcoded "+ 30" offset in MessageItemView (the expression using
offsetX and message.isRightAligned) must be replaced with a design token from
InjectedValuesExtensions rather than a raw constant; update the expression to
add (message.isRightAligned ?
InjectedValues.shared.ui.tokens.messageRightAlignedOffset : 0) (or an
appropriately named token such as ui.tokens.layout.rightAlignedBubbleOffset),
and if that token does not exist, add it to InjectedValuesExtensions.swift so it
surfaces as InjectedValues.shared.ui.tokens.<name> and use that token in the
offset calculation.

---

Nitpick comments:
In `@Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift`:
- Around line 9-23: The MemberListView defines an unused dependency
`@Injected`(\.chatClient) private var chatClient which should be removed to
eliminate dead code and overhead; delete the `@Injected`(\.chatClient) property
from MemberListView (and any related unused references), verify there are no
remaining uses of chatClient inside MemberListView or its methods, and run a
quick build/import check to ensure nothing else relies on that injected symbol.

In `@StreamChatSwiftUITests/Tests/ChatChannel/MessageItemView_Tests.swift`:
- Around line 917-942: Add a new RTL snapshot variant for the outgoing
swipe-to-reply test by duplicating test_swipeToReplyIndicator_outgoing_snapshot
and applying a layoutDirection = .rightToLeft environment to the view before
calling AssertSnapshot; locate the existing test that builds the view (using
testMessageViewContainer and SwipeToReplyModifier) and create a counterpart
(e.g., test_swipeToReplyIndicator_outgoing_snapshot_RTL) that sets the view
environment layoutDirection to .rightToLeft and verifies the snapshot with
AssertSnapshot to lock in RTL behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1e7884db-9af9-4050-8c42-fe4ac856b715

📥 Commits

Reviewing files that changed from the base of the PR and between 2a79a63 and 5bfcb9b.

⛔ Files ignored due to path filters (46)
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/AddUsersView_Tests/test_addUsersView_alreadyMemberSnapshot.1.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/AddUsersView_Tests/test_addUsersView_selectedUsersSnapshot.1.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/AddUsersView_Tests/test_addUsersView_snapshot.1.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MediaViewer_Tests/test_mediaViewerHeader_withMessageCreatedToday_snapshot.1.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MediaViewer_Tests/test_mediaViewerHeader_withMessageExactDate_snapshot.1.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MediaViewer_Tests/test_mediaViewer_snapshotLoading.1.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.small-dark.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.default-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.extraExtraExtraLarge-light.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.rightToLeftLayout-default.png is excluded by !**/*.png
  • StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.small-dark.png is excluded by !**/*.png
📒 Files selected for processing (20)
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoHelperViews.swift
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoView.swift
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MediaAttachmentsView.swift
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberAddView.swift
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberAddViewModel.swift
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift
  • Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift
  • Sources/StreamChatSwiftUI/ChatMessageList/Gallery/ShareButtonView.swift
  • Sources/StreamChatSwiftUI/ChatMessageList/MessageItemView.swift
  • Sources/StreamChatSwiftUI/Utils/LiquidGlassModifiers.swift
  • Sources/StreamChatSwiftUI/ViewFactory/DefaultViewFactory.swift
  • Sources/StreamChatSwiftUI/ViewFactory/Options/AttachmentViewFactoryOptions.swift
  • Sources/StreamChatSwiftUI/ViewFactory/Options/ChannelViewFactoryOptions.swift
  • Sources/StreamChatSwiftUI/ViewFactory/ViewFactory.swift
  • StreamChatSwiftUI.xcodeproj/project.pbxproj
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/MemberAddViewModel_Tests.swift
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/MemberAddView_Tests.swift
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/MemberListView_Tests.swift
  • StreamChatSwiftUITests/Tests/ChatChannel/MessageItemView_Tests.swift
  • StreamChatSwiftUITests/Tests/Utils/ViewFactory_Tests.swift
💤 Files with no reviewable changes (1)
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoHelperViews.swift

Comment thread Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift Outdated
Comment thread Sources/StreamChatSwiftUI/ChatMessageList/MessageItemView.swift
Copy link
Copy Markdown
Contributor

@martinmitrevski martinmitrevski left a comment

Choose a reason for hiding this comment

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

looks good, but left few comments, lmk what you think

.sheet(isPresented: $viewModel.addUsersShown) {
factory.makeAddUsersView(
options: AddUsersViewOptions(
factory.makeMemberAddView(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

docs reminder

Comment thread Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift Outdated
Comment thread Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift Outdated
Comment thread Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift Outdated
/// - Returns: ViewModifier applied to the media viewer's navigation content.
func makeMediaViewerToolbarModifier(options: MediaViewerToolbarModifierOptions) -> MediaViewerToolbarModifierType

associatedtype MediaViewerFooterViewType: View
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I don't think we should expose this tbh, it's too small and specific. People should replace the whole view in this case.

Copy link
Copy Markdown
Member Author

@nuno-vieira nuno-vieira Apr 9, 2026

Choose a reason for hiding this comment

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

Hmm, the gallery has quite a few nice logic out of the box that customers can reuse, like the swiping, navigating to each item from the Gallery icon, etc... Most customers will want to only change the header or the footer since all media viewers in most apps look the same; the only thing that changes is the header and the footer

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

idk, hard to tell without data - but I do feel that we expose things that customers will rarely change. Anyway, up to you for both.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

IMO it is useful. The MediaViewer is not that simple, it has grids, a video player etc. I think if customers need this view, rewriting from scratch does not sound fun

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ok, let's keep this then

Comment thread Sources/StreamChatSwiftUI/ViewFactory/ViewFactory.swift
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift (1)

218-225: ⚠️ Potential issue | 🟡 Minor

Label the grid toggle for VoiceOver.

This icon-only button still has no localized accessibility label, so assistive tech gets the symbol instead of the action.

As per coding guidelines: **/*.swift: Always use L10n accessors for user-facing strings rather than raw string literals; Sources/StreamChatSwiftUI/**/*.swift: Ensure components have accessibility labels, traits, and dynamic type support.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift` around
lines 218 - 225, The StreamIconButton toggle for showing the grid is missing a
localized accessibility label; update the StreamIconButton (the instance that
toggles gridShown and uses Image(uiImage: images.gallery)) to provide an
accessibilityLabel using the L10n accessor (e.g.
L10n.<appropriateGridToggleKey>) and ensure appropriate accessibility traits
(button) are set so VoiceOver announces the action instead of the symbol. Locate
the StreamIconButton that sets gridShown = true and add the L10n label and
traits to that view.
🧹 Nitpick comments (4)
StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/ChatChannelInfoViewModel_Tests.swift (1)

266-294: Use a semantically correct local variable name in these tests.

leaveButton now stores add-member visibility, which is misleading when scanning failures.

♻️ Suggested rename for clarity
-        let leaveButton = viewModel.shouldShowAddMemberButton
+        let addMemberButton = viewModel.shouldShowAddMemberButton
...
-        XCTAssert(leaveButton == true)
+        XCTAssert(addMemberButton == true)
-        let leaveButton = viewModel.shouldShowAddMemberButton
+        let addMemberButton = viewModel.shouldShowAddMemberButton
...
-        XCTAssert(leaveButton == false)
+        XCTAssert(addMemberButton == false)
-        let leaveButton = viewModel.shouldShowAddMemberButton
+        let addMemberButton = viewModel.shouldShowAddMemberButton
...
-        XCTAssert(leaveButton == false)
+        XCTAssert(addMemberButton == false)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/ChatChannelInfoViewModel_Tests.swift`
around lines 266 - 294, The tests use a misleading local variable name
`leaveButton` while reading `viewModel.shouldShowAddMemberButton`; rename the
local variable in tests (e.g., in
test_chatChannelInfoVM_addUserButtonVisibleInCommunity,
test_chatChannelInfoVM_addUserButtonHiddenInGroup,
test_chatChannelInfoVM_addUserButtonHiddenInDM) to a semantically correct name
such as `showAddMemberButton` or `isAddMemberButtonVisible` so it reflects the
value returned by `ChatChannelInfoViewModel.shouldShowAddMemberButton` and
improves test readability.
StreamChatSwiftUI.xcodeproj/project.pbxproj (1)

1544-1545: Confirm the stream-chat-swift SHA pin intentionality; consider aligning with develop branch policy.

The pinned revision f7295d3d6f83c2aad95b38055b27981efe3d8225 (icon updates from Apr 9) is legitimate, but fixes the dependency to a specific commit, preventing automatic intake of upstream fixes. Per development guidance, the develop branch should be the default integration branch for PRs. If this SHA pin was intentional to stabilize a specific version, prefer using an exactVersion constraint with a released tag (e.g., 4.99.1, 4.98.0) instead. If unintentional, revert to branch-based tracking.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@StreamChatSwiftUI.xcodeproj/project.pbxproj` around lines 1544 - 1545, The
project currently pins the stream-chat-swift dependency to a specific commit via
the entries kind = revision and revision =
f7295d3d6f83c2aad95b38055b27981efe3d8225; confirm whether this SHA pin was
intentional—if not, change the dependency to track the develop branch
(branch-based tracking) so upstream fixes are pulled automatically; if the pin
was intentional to lock behavior, replace the commit pin with an exactVersion
constraint referencing the released tag (e.g., 4.99.1 or 4.98.0) instead of a
raw SHA to make the intent clear and maintainable.
Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift (2)

188-199: Mark the new UI types @MainActor.

These are UI-bound SwiftUI types introduced under strict-concurrency rules, so actor isolation should be explicit.

🧵 Proposed fix
+@MainActor
 public struct MediaViewerFooterView: View {
     `@Injected`(\.colors) private var colors
     `@Injected`(\.fonts) private var fonts
     `@Injected`(\.images) private var images
     `@Injected`(\.tokens) private var tokens
@@
+@MainActor
 public struct MediaViewerToolbarModifier: ViewModifier {
     `@Injected`(\.colors) private var colors
     `@Injected`(\.fonts) private var fonts

As per coding guidelines: **/*.swift: Use Swift 6.0 with strict concurrency enabled; Sources/StreamChatSwiftUI/**/*.swift: Mark SwiftUI view models and UI-bound types as @MainActor.

Also applies to: 237-245

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift` around
lines 188 - 199, Mark the UI-bound SwiftUI type MediaViewerFooterView as
`@MainActor` to satisfy Swift strict-concurrency rules: add the `@MainActor`
attribute to the MediaViewerFooterView declaration so its stored properties
(shareContent, selected, totalCount, `@Binding` gridShown) and init run on the
main actor; also apply the same `@MainActor` annotation to the other UI-bound
types mentioned around lines 237-245 (the other MediaViewer* view types) to
ensure all SwiftUI views/view models in this file are main-actor isolated.

100-104: Use the binding for drag-to-dismiss too.

The toolbar now closes the viewer via isShown, but the swipe gesture still goes through presentationMode. Reusing the binding here keeps every dismissal path on the same source of truth.

♻️ Proposed fix
                     .gesture(
                         DragGesture().onEnded { value in
                             if value.location.y - value.startLocation.y > 100 {
-                                presentationMode.wrappedValue.dismiss()
+                                isShown = false
                             }
                         }
                     )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift` around
lines 100 - 104, The drag-to-dismiss gesture in MediaViewer currently calls
presentationMode.wrappedValue.dismiss(); replace that dismissal with the same
binding used by the toolbar (set the isShown binding to false) so all dismissal
paths share the same source of truth; update the DragGesture().onEnded closure
(the block referencing presentationMode) to assign isShown = false instead of
calling presentationMode.wrappedValue.dismiss().
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift`:
- Around line 259-267: The image-only toolbar Button in MediaViewer.swift (the
ToolbarItem with the chevron.backward Image that toggles isShown and uses
dismissButtonColor) needs an accessibility label using your L10n accessors;
update the Button’s label/view to call
.accessibilityLabel(L10n.<appropriateKey>) (create a L10n key like
mediaViewerDismiss or use an existing dismiss/close key) and add accessibility
traits (e.g., .accessibilityAddTraits(.isButton)) so VoiceOver reads a localized
description instead of just announcing an image.

---

Duplicate comments:
In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift`:
- Around line 218-225: The StreamIconButton toggle for showing the grid is
missing a localized accessibility label; update the StreamIconButton (the
instance that toggles gridShown and uses Image(uiImage: images.gallery)) to
provide an accessibilityLabel using the L10n accessor (e.g.
L10n.<appropriateGridToggleKey>) and ensure appropriate accessibility traits
(button) are set so VoiceOver announces the action instead of the symbol. Locate
the StreamIconButton that sets gridShown = true and add the L10n label and
traits to that view.

---

Nitpick comments:
In `@Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift`:
- Around line 188-199: Mark the UI-bound SwiftUI type MediaViewerFooterView as
`@MainActor` to satisfy Swift strict-concurrency rules: add the `@MainActor`
attribute to the MediaViewerFooterView declaration so its stored properties
(shareContent, selected, totalCount, `@Binding` gridShown) and init run on the
main actor; also apply the same `@MainActor` annotation to the other UI-bound
types mentioned around lines 237-245 (the other MediaViewer* view types) to
ensure all SwiftUI views/view models in this file are main-actor isolated.
- Around line 100-104: The drag-to-dismiss gesture in MediaViewer currently
calls presentationMode.wrappedValue.dismiss(); replace that dismissal with the
same binding used by the toolbar (set the isShown binding to false) so all
dismissal paths share the same source of truth; update the DragGesture().onEnded
closure (the block referencing presentationMode) to assign isShown = false
instead of calling presentationMode.wrappedValue.dismiss().

In `@StreamChatSwiftUI.xcodeproj/project.pbxproj`:
- Around line 1544-1545: The project currently pins the stream-chat-swift
dependency to a specific commit via the entries kind = revision and revision =
f7295d3d6f83c2aad95b38055b27981efe3d8225; confirm whether this SHA pin was
intentional—if not, change the dependency to track the develop branch
(branch-based tracking) so upstream fixes are pulled automatically; if the pin
was intentional to lock behavior, replace the commit pin with an exactVersion
constraint referencing the released tag (e.g., 4.99.1 or 4.98.0) instead of a
raw SHA to make the intent clear and maintainable.

In
`@StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/ChatChannelInfoViewModel_Tests.swift`:
- Around line 266-294: The tests use a misleading local variable name
`leaveButton` while reading `viewModel.shouldShowAddMemberButton`; rename the
local variable in tests (e.g., in
test_chatChannelInfoVM_addUserButtonVisibleInCommunity,
test_chatChannelInfoVM_addUserButtonHiddenInGroup,
test_chatChannelInfoVM_addUserButtonHiddenInDM) to a semantically correct name
such as `showAddMemberButton` or `isAddMemberButtonVisible` so it reflects the
value returned by `ChatChannelInfoViewModel.shouldShowAddMemberButton` and
improves test readability.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: db268fba-fbd9-499d-affd-64bc82c20e1a

📥 Commits

Reviewing files that changed from the base of the PR and between f530bcf and 45a5d9a.

⛔ Files ignored due to path filters (1)
  • Sources/StreamChatSwiftUI/Generated/L10n.swift is excluded by !**/generated/**
📒 Files selected for processing (7)
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoView.swift
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoViewModel.swift
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift
  • Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift
  • Sources/StreamChatSwiftUI/Resources/en.lproj/Localizable.strings
  • StreamChatSwiftUI.xcodeproj/project.pbxproj
  • StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/ChatChannelInfoViewModel_Tests.swift
✅ Files skipped from review due to trivial changes (1)
  • Sources/StreamChatSwiftUI/Resources/en.lproj/Localizable.strings
🚧 Files skipped from review as they are similar to previous changes (1)
  • Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swift

Comment thread Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 9, 2026

Public Interface

+ public struct MediaViewerFooterView: View  
+ 
+   public var body: some View
+   
+ 
+   public init(shareContent: [UIImage],selected: Int,totalCount: Int,gridShown: Binding<Bool>)

+ public struct LiquidGlassBorderlessModifier: ViewModifier  
+ 
+   public init(shape: BackgroundShape,isInteractive: Bool = false)
+   
+ 
+   public func body(content: Content)-> some View

+ public final class MemberAddOptions: Sendable  
+ 
+   public let loadedUserIds: [String]
+   
+ 
+   public init(loadedUserIds: [String])

+ public final class MemberAddViewOptions: Sendable  
+ 
+   public let options: MemberAddOptions
+   public let onConfirm: @MainActor ([ChatUser]) -> Void
+   
+ 
+   public init(options: MemberAddOptions,onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

+ public final class MediaViewerFooterViewOptions: Sendable  
+ 
+   public let shareContent: [UIImage]
+   public let selected: Int
+   public let totalCount: Int
+   public let gridShown: Binding<Bool>
+   
+ 
+   public init(shareContent: [UIImage],selected: Int,totalCount: Int,gridShown: Binding<Bool>)

+ public final class MediaViewerToolbarModifierOptions: Sendable  
+ 
+   public let title: String
+   public let subtitle: String
+   public let isShown: Binding<Bool>
+   
+ 
+   public init(title: String,subtitle: String,isShown: Binding<Bool>)

+ public struct MemberAddView: View  
+ 
+   public var body: some View
+   
+ 
+   public init(factory: Factory = DefaultViewFactory.shared,loadedUserIds: [String],onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

+ public struct MediaViewerToolbarModifier: ViewModifier  
+ 
+   public init(title: String,subtitle: String,isShown: Binding<Bool>)
+   
+ 
+   public func body(content: Content)-> some View

- public final class AddUsersViewOptions: Sendable  
- 
-   public let options: AddUsersOptions
-   public let onConfirm: @MainActor ([ChatUser]) -> Void
-   
- 
-   public init(options: AddUsersOptions,onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

- public final class MediaViewerHeaderOptions: Sendable  
- 
-   public let title: String
-   public let subtitle: String
-   public let shown: Binding<Bool>
-   
- 
-   public init(title: String,subtitle: String,shown: Binding<Bool>)

- public struct AddUsersView: View  
- 
-   public var body: some View
-   
- 
-   public init(factory: Factory = DefaultViewFactory.shared,loadedUserIds: [String],onConfirm: @escaping @MainActor ([ChatUser]) -> Void)

- public final class AddUsersOptions: Sendable  
- 
-   public let loadedUserIds: [String]
-   
- 
-   public init(loadedUserIds: [String])

 @MainActor public class ChatChannelInfoViewModel: ObservableObject, ChatChannelControllerDelegate  
-   open var shouldShowAddUserButton: Bool
+   open var shouldShowAddMemberButton: Bool

 extension ViewFactory  
-   public func makeMediaViewerHeader(options: MediaViewerHeaderOptions)-> some View
+   public func makeMediaViewerToolbarModifier(options: MediaViewerToolbarModifierOptions)-> some ViewModifier
-   public func makeVideoPlayerHeaderView(options: VideoPlayerHeaderViewOptions)-> some View
+   public func makeMediaViewerFooterView(options: MediaViewerFooterViewOptions)-> some View
-   public func makeVideoPlayerFooterView(options: VideoPlayerFooterViewOptions)-> some View
+   public func makeVideoPlayerHeaderView(options: VideoPlayerHeaderViewOptions)-> some View
-   public func makeDeletedMessageView(options: DeletedMessageViewOptions)-> some View
+   public func makeVideoPlayerFooterView(options: VideoPlayerFooterViewOptions)-> some View
-   public func makeSystemMessageView(options: SystemMessageViewOptions)-> some View
+   public func makeDeletedMessageView(options: DeletedMessageViewOptions)-> some View
-   public func makeEmojiTextView(options: EmojiTextViewOptions)-> some View
+   public func makeSystemMessageView(options: SystemMessageViewOptions)-> some View
-   public func makeCustomAttachmentViewType(options: CustomAttachmentViewTypeOptions)-> some View
+   public func makeEmojiTextView(options: EmojiTextViewOptions)-> some View
-   public func makeScrollToBottomButton(options: ScrollToBottomButtonOptions)-> some View
+   public func makeCustomAttachmentViewType(options: CustomAttachmentViewTypeOptions)-> some View
-   public func makeDateIndicatorView(options: DateIndicatorViewOptions)-> some View
+   public func makeScrollToBottomButton(options: ScrollToBottomButtonOptions)-> some View
-   public func makeMessageListDateIndicator(options: MessageListDateIndicatorViewOptions)-> some View
+   public func makeDateIndicatorView(options: DateIndicatorViewOptions)-> some View
-   public func makeInlineTypingIndicatorView(options: TypingIndicatorViewOptions)-> some View
+   public func makeMessageListDateIndicator(options: MessageListDateIndicatorViewOptions)-> some View
-   public func makeSubtitleTypingIndicatorView(options: SubtitleTypingIndicatorViewOptions)-> some View
+   public func makeInlineTypingIndicatorView(options: TypingIndicatorViewOptions)-> some View
-   public func makeGiphyBadgeViewType(options: GiphyBadgeViewTypeOptions)-> some View
+   public func makeSubtitleTypingIndicatorView(options: SubtitleTypingIndicatorViewOptions)-> some View
-   public func makeMessageRepliesView(options: MessageRepliesViewOptions)-> some View
+   public func makeGiphyBadgeViewType(options: GiphyBadgeViewTypeOptions)-> some View
-   public func makeMessageComposerViewType(options: MessageComposerViewTypeOptions)-> MessageComposerView<Self>
+   public func makeMessageRepliesView(options: MessageRepliesViewOptions)-> some View
-   public func makeLeadingComposerView(options: LeadingComposerViewOptions)-> some View
+   public func makeMessageComposerViewType(options: MessageComposerViewTypeOptions)-> MessageComposerView<Self>
-   @ViewBuilder public func makeComposerInputView(options: ComposerInputViewOptions)-> some View
+   public func makeLeadingComposerView(options: LeadingComposerViewOptions)-> some View
-   public func makeComposerTextInputView(options: ComposerTextInputViewOptions)-> some View
+   @ViewBuilder public func makeComposerInputView(options: ComposerInputViewOptions)-> some View
-   public func makeComposerInputTrailingView(options: ComposerInputTrailingViewOptions)-> some View
+   public func makeComposerTextInputView(options: ComposerTextInputViewOptions)-> some View
-   public func makeTrailingComposerView(options: TrailingComposerViewOptions)-> some View
+   public func makeComposerInputTrailingView(options: ComposerInputTrailingViewOptions)-> some View
-   public func makeSendMessageButton(options: SendMessageButtonOptions)-> some View
+   public func makeTrailingComposerView(options: TrailingComposerViewOptions)-> some View
-   public func makeConfirmEditButton(options: ConfirmEditButtonOptions)-> some View
+   public func makeSendMessageButton(options: SendMessageButtonOptions)-> some View
-   public func makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions)-> some View
+   public func makeConfirmEditButton(options: ConfirmEditButtonOptions)-> some View
-   public func makeAttachmentPickerView(options: AttachmentPickerViewOptions)-> some View
+   public func makeComposerVoiceRecordingInputView(options: ComposerVoiceRecordingInputViewOptions)-> some View
-   public func makeAttachmentCommandsPickerView(options: AttachmentCommandsPickerViewOptions)-> some View
+   public func makeAttachmentPickerView(options: AttachmentPickerViewOptions)-> some View
-   public func makeVoiceRecordingView(options: VoiceRecordingViewOptions)-> some View
+   public func makeAttachmentCommandsPickerView(options: AttachmentCommandsPickerViewOptions)-> some View
-   public func makeCustomAttachmentPickerView(options: CustomAttachmentPickerViewOptions)-> some View
+   public func makeVoiceRecordingView(options: VoiceRecordingViewOptions)-> some View
-   public func makeCustomAttachmentPreviewView(options: CustomAttachmentPreviewViewOptions)-> some View
+   public func makeCustomAttachmentPickerView(options: CustomAttachmentPickerViewOptions)-> some View
-   public func makeAttachmentTypePickerView(options: AttachmentTypePickerViewOptions)-> some View
+   public func makeCustomAttachmentPreviewView(options: CustomAttachmentPreviewViewOptions)-> some View
-   public func makeAttachmentMediaPickerView(options: AttachmentMediaPickerViewOptions)-> some View
+   public func makeAttachmentTypePickerView(options: AttachmentTypePickerViewOptions)-> some View
-   public func makeAttachmentFilePickerView(options: AttachmentFilePickerViewOptions)-> some View
+   public func makeAttachmentMediaPickerView(options: AttachmentMediaPickerViewOptions)-> some View
-   public func makeAttachmentCameraPickerView(options: AttachmentCameraPickerViewOptions)-> some View
+   public func makeAttachmentFilePickerView(options: AttachmentFilePickerViewOptions)-> some View
-   public func makeAttachmentPollPickerView(options: AttachmentPollPickerViewOptions)-> some View
+   public func makeAttachmentCameraPickerView(options: AttachmentCameraPickerViewOptions)-> some View
-   public func makeSendInChannelView(options: SendInChannelViewOptions)-> some View
+   public func makeAttachmentPollPickerView(options: AttachmentPollPickerViewOptions)-> some View
-   public func makeMessageActionsView(options: MessageActionsViewOptions)-> some View
+   public func makeSendInChannelView(options: SendInChannelViewOptions)-> some View
-   public func makeBottomReactionsView(options: ReactionsBottomViewOptions)-> some View
+   public func makeMessageActionsView(options: MessageActionsViewOptions)-> some View
-   public func makeMessageReactionView(options: MessageReactionViewOptions)-> some View
+   public func makeBottomReactionsView(options: ReactionsBottomViewOptions)-> some View
-   public func makeReactionsOverlayView(options: ReactionsOverlayViewOptions)-> some View
+   public func makeMessageReactionView(options: MessageReactionViewOptions)-> some View
-   public func makeReactionsContentView(options: ReactionsContentViewOptions)-> some View
+   public func makeReactionsOverlayView(options: ReactionsOverlayViewOptions)-> some View
-   public func makeMoreReactionsView(options: MoreReactionsViewOptions)-> some View
+   public func makeReactionsContentView(options: ReactionsContentViewOptions)-> some View
-   public func makeReactionsDetailView(options: ReactionsDetailViewOptions)-> some View
+   public func makeMoreReactionsView(options: MoreReactionsViewOptions)-> some View
-   public func makeComposerQuotedMessageView(options: ComposerQuotedMessageViewOptions)-> some View
+   public func makeReactionsDetailView(options: ReactionsDetailViewOptions)-> some View
-   public func makeChatQuotedMessageView(options: ChatQuotedMessageViewOptions)-> some View
+   public func makeComposerQuotedMessageView(options: ComposerQuotedMessageViewOptions)-> some View
-   public func makeQuotedMessageView(options: QuotedMessageViewOptions)-> some View
+   public func makeChatQuotedMessageView(options: ChatQuotedMessageViewOptions)-> some View
-   public func makeComposerEditedMessageView(options: ComposerEditedMessageViewOptions)-> some View
+   public func makeQuotedMessageView(options: QuotedMessageViewOptions)-> some View
-   public func makeMessageAttachmentPreviewThumbnailView(options: MessageAttachmentPreviewViewOptions)-> some View
+   public func makeComposerEditedMessageView(options: ComposerEditedMessageViewOptions)-> some View
-   public func makeMessageAttachmentPreviewIconView(options: MessageAttachmentPreviewIconViewOptions)-> some View
+   public func makeMessageAttachmentPreviewThumbnailView(options: MessageAttachmentPreviewViewOptions)-> some View
-   public func makeSuggestionsContainerView(options: SuggestionsContainerViewOptions)-> some View
+   public func makeMessageAttachmentPreviewIconView(options: MessageAttachmentPreviewIconViewOptions)-> some View
-   public func makeMessageReadIndicatorView(options: MessageReadIndicatorViewOptions)-> some View
+   public func makeSuggestionsContainerView(options: SuggestionsContainerViewOptions)-> some View
-   public func makeNewMessagesDividerView(options: NewMessagesDividerViewOptions)-> some View
+   public func makeMessageReadIndicatorView(options: MessageReadIndicatorViewOptions)-> some View
-   public func makeThreadRepliesDividerView(options: ThreadRepliesDividerViewOptions)-> some View
+   public func makeNewMessagesDividerView(options: NewMessagesDividerViewOptions)-> some View
-   public func makeJumpToUnreadButtonOverlay(options: JumpToUnreadButtonOptions)-> some ViewModifier
+   public func makeThreadRepliesDividerView(options: ThreadRepliesDividerViewOptions)-> some View
-   public func makePollView(options: PollViewOptions)-> some View
+   public func makeJumpToUnreadButtonOverlay(options: JumpToUnreadButtonOptions)-> some ViewModifier
-   public func makeThreadDestination(options: ThreadDestinationOptions)-> @MainActor (ChatThread) -> ChatChannelView<Self>
+   public func makePollView(options: PollViewOptions)-> some View
-   public func makeThreadListItem(options: ThreadListItemOptions<ThreadDestination>)-> some View
+   public func makeThreadDestination(options: ThreadDestinationOptions)-> @MainActor (ChatThread) -> ChatChannelView<Self>
-   public func makeEmptyThreadsView(options: EmptyThreadsViewOptions)-> some View
+   public func makeThreadListItem(options: ThreadListItemOptions<ThreadDestination>)-> some View
-   public func makeThreadListLoadingView(options: ThreadListLoadingViewOptions)-> some View
+   public func makeEmptyThreadsView(options: EmptyThreadsViewOptions)-> some View
-   public func makeThreadListContainerViewModifier(options: ThreadListContainerModifierOptions)-> some ViewModifier
+   public func makeThreadListLoadingView(options: ThreadListLoadingViewOptions)-> some View
-   public func makeThreadListHeaderViewModifier(options: ThreadListHeaderViewModifierOptions)-> some ViewModifier
+   public func makeThreadListContainerViewModifier(options: ThreadListContainerModifierOptions)-> some ViewModifier
-   public func makeThreadListHeaderView(options: ThreadListHeaderViewOptions)-> some View
+   public func makeThreadListHeaderViewModifier(options: ThreadListHeaderViewModifierOptions)-> some ViewModifier
-   public func makeThreadListFooterView(options: ThreadListFooterViewOptions)-> some View
+   public func makeThreadListHeaderView(options: ThreadListHeaderViewOptions)-> some View
-   public func makeThreadListBackground(options: ThreadListBackgroundOptions)-> some View
+   public func makeThreadListFooterView(options: ThreadListFooterViewOptions)-> some View
-   public func makeThreadListItemBackground(options: ThreadListItemBackgroundOptions)-> some View
+   public func makeThreadListBackground(options: ThreadListBackgroundOptions)-> some View
-   public func makeThreadListDividerItem(options: ThreadListDividerItemOptions)-> some View
+   public func makeThreadListItemBackground(options: ThreadListItemBackgroundOptions)-> some View
-   public func makeAddUsersView(options: AddUsersViewOptions)-> some View
+   public func makeThreadListDividerItem(options: ThreadListDividerItemOptions)-> some View
-   public func makeAttachmentTextView(options: AttachmentTextViewOptions)-> some View
+   public func makeMemberAddView(options: MemberAddViewOptions)-> some View
-   public func makeStreamTextView(options: StreamTextViewOptions)-> some View
+   public func makeAttachmentTextView(options: AttachmentTextViewOptions)-> some View
+   public func makeStreamTextView(options: StreamTextViewOptions)-> some View

} icon: {
Image(uiImage: images.gallery)
.customizable()
.frame(width: 16, height: 16)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could use token here, but not crucial

Copy link
Copy Markdown
Contributor

@martinmitrevski martinmitrevski left a comment

Choose a reason for hiding this comment

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

LGTM! Snapshots with the search bar are a bit weird on the add members view, but I assume it's a problem with the snapshot library.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why's the search bar black? 😅

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this seems like an issue with the snapshot library though

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

same here, it's ok in the app

@nuno-vieira nuno-vieira merged commit dc717fc into develop Apr 10, 2026
4 of 6 checks passed
@nuno-vieira nuno-vieira deleted the fix/latest-v5-qa-issues branch April 10, 2026 10:06
@Stream-SDK-Bot
Copy link
Copy Markdown
Collaborator

SDK Size

title develop branch diff status
StreamChatSwiftUI 8.03 MB 8.06 MB +34 KB 🟢

@Stream-SDK-Bot
Copy link
Copy Markdown
Collaborator

StreamChatSwiftUI XCSize

Object Diff (bytes)
AddUsersView.o -40180
MemberAddView.o +37892
MemberListView.o +20203
ChatChannelInfoHelperViews.o -14363
MediaViewer.o +10875
Show 81 more objects
Object Diff (bytes)
AddUsersViewModel.o -9953
MemberAddViewModel.o +9781
LiquidGlassModifiers.o +2642
Appearance.o -2584
MessageItemView.o +1888
CreatePollView.o +1464
MessageComposerView.o +1420
AttachmentViewFactoryOptions.o +974
EditGroupView.o +798
ChatChannelInfoView.o +722
MessageMediaAttachmentsContainerView.o +712
ParticipantInfoView.o +700
DefaultViewFactory.o +660
ChatThreadListItem.o +578
PollResultsView.o +568
PollAttachmentView.o +480
MediaAttachmentsView.o +475
L10n.o +466
SnackBarView.o +464
MarkdownFormatter.o -368
ReactionsDetailView.o +352
AttachmentTypePickerView.o +340
PollCommentsView.o +332
MessageAttachmentsView.o +328
MessageRepliesView.o +304
SearchBar.o +296
Styles.o -296
ReactionsOverlayView.o +276
ChatChannelHeaderViewModifier.o -260
EditedMessageView.o +256
ComposerAttachmentPickerButton.o +256
ComposerVoiceRecordingInputView.o +236
SearchResultsView.o -192
InjectedValuesExtensions.o -192
ComposerQuotedMessageView.o +188
ComposerVoiceRecordingAttachmentView.o +184
ChatChannelInfoViewModel.o +176
MessageAnnotationView.o +172
MediaBadge.o +164
BadgeNotificationView.o +156
GiphyAttachmentView.o +152
ChatChannelListItem.o +152
AttachmentCommandsPickerView.o +148
LinkAttachmentView.o +148
JumpToUnreadButton.o +148
MessageView.o +136
ReactionsIconProvider.o +128
MessageTopView.o +120
ViewFactory.o +118
VoiceRecordingLockView.o +116
AttachmentPickerPromptView.o +116
AttachmentMediaPickerItemView.o -108
ChatThreadListHeaderView.o -104
BadgeCountView.o +104
VoiceRecordingContainerView.o +96
FileAttachmentsView.o +92
GiphyBadgeView.o +92
CommandSuggestionsView.o +92
CommandsHandler.o +88
ReferenceMessageView.o +80
MessageContainerView.o +76
MessageThreadHeaderViewModifier.o +76
RadioCheckView.o +76
AttachmentCameraPickerView.o +72
SendInChannelView.o +72
PollAllOptionsView.o +72
DeletedMessageView.o +68
CommandChipView.o +64
StreamButton.o +64
ComposerViewFactoryOptions.o +60
ChatChannelHelperViews.o +60
MoreChannelActionsFullScreenWrappingView.o -60
SystemMessageView.o +60
MoreChannelActionsView.o +56
MediaViewerHeader.o +56
MessageAttachmentPreviewIconView.o +56
PinnedMessagesView.o +56
ActionItemView.o +52
TypingIndicatorView.o -44
ReactionsView.o +44
EmptyContentView.o +44

@sonarqubecloud
Copy link
Copy Markdown

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.

4 participants