Fix v5 QA issues: navigation headers, member view renames, media viewer, and swipe-to-reply#1402
Fix v5 QA issues: navigation headers, member view renames, media viewer, and swipe-to-reply#1402nuno-vieira merged 14 commits intodevelopfrom
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
Disabled knowledge base sources:
📝 WalkthroughWalkthroughRenamed 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
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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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 |
Generated by 🚫 Danger |
There was a problem hiding this comment.
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 = .rightToLeftvariant 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 unusedchatClientinjection.The
chatClientis 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
⛔ Files ignored due to path filters (46)
StreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/AddUsersView_Tests/test_addUsersView_alreadyMemberSnapshot.1.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/AddUsersView_Tests/test_addUsersView_selectedUsersSnapshot.1.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/AddUsersView_Tests/test_addUsersView_snapshot.1.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/ChatChannelInfoView_Tests/test_chatChannelInfoView_navigationBarAppearance.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_alreadyMemberSnapshot.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_selectedUsersSnapshot.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberAddView_Tests/test_memberAddView_snapshot.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withAddButtonSnapshot.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/__Snapshots__/MemberListView_Tests/test_memberListView_withoutAddButtonSnapshot.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MediaViewer_Tests/test_mediaViewerHeader_withMessageCreatedToday_snapshot.1.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MediaViewer_Tests/test_mediaViewerHeader_withMessageExactDate_snapshot.1.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MediaViewer_Tests/test_mediaViewer_snapshotLoading.1.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageItemView_Tests/test_swipeToReplyIndicator_outgoing_snapshot.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotEmptyCount.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotHighUnreadCount.small-dark.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.default-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.extraExtraExtraLarge-light.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.rightToLeftLayout-default.pngis excluded by!**/*.pngStreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_scrollToBottomButton_snapshotUnreadCount.small-dark.pngis excluded by!**/*.png
📒 Files selected for processing (20)
Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoHelperViews.swiftSources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoView.swiftSources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MediaAttachmentsView.swiftSources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberAddView.swiftSources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberAddViewModel.swiftSources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swiftSources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swiftSources/StreamChatSwiftUI/ChatMessageList/Gallery/ShareButtonView.swiftSources/StreamChatSwiftUI/ChatMessageList/MessageItemView.swiftSources/StreamChatSwiftUI/Utils/LiquidGlassModifiers.swiftSources/StreamChatSwiftUI/ViewFactory/DefaultViewFactory.swiftSources/StreamChatSwiftUI/ViewFactory/Options/AttachmentViewFactoryOptions.swiftSources/StreamChatSwiftUI/ViewFactory/Options/ChannelViewFactoryOptions.swiftSources/StreamChatSwiftUI/ViewFactory/ViewFactory.swiftStreamChatSwiftUI.xcodeproj/project.pbxprojStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/MemberAddViewModel_Tests.swiftStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/MemberAddView_Tests.swiftStreamChatSwiftUITests/Tests/ChatChannel/ChannelInfo/MemberListView_Tests.swiftStreamChatSwiftUITests/Tests/ChatChannel/MessageItemView_Tests.swiftStreamChatSwiftUITests/Tests/Utils/ViewFactory_Tests.swift
💤 Files with no reviewable changes (1)
- Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoHelperViews.swift
martinmitrevski
left a comment
There was a problem hiding this comment.
looks good, but left few comments, lmk what you think
| .sheet(isPresented: $viewModel.addUsersShown) { | ||
| factory.makeAddUsersView( | ||
| options: AddUsersViewOptions( | ||
| factory.makeMemberAddView( |
| /// - Returns: ViewModifier applied to the media viewer's navigation content. | ||
| func makeMediaViewerToolbarModifier(options: MediaViewerToolbarModifierOptions) -> MediaViewerToolbarModifierType | ||
|
|
||
| associatedtype MediaViewerFooterViewType: View |
There was a problem hiding this comment.
I don't think we should expose this tbh, it's too small and specific. People should replace the whole view in this case.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
ok, let's keep this then
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
Sources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swift (1)
218-225:⚠️ Potential issue | 🟡 MinorLabel 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 useL10naccessors 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.
leaveButtonnow 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 thestream-chat-swiftSHA 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
developbranch 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 fontsAs 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 throughpresentationMode. 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
⛔ Files ignored due to path filters (1)
Sources/StreamChatSwiftUI/Generated/L10n.swiftis excluded by!**/generated/**
📒 Files selected for processing (7)
Sources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoView.swiftSources/StreamChatSwiftUI/ChatChannel/ChannelInfo/ChatChannelInfoViewModel.swiftSources/StreamChatSwiftUI/ChatChannel/ChannelInfo/MemberListView.swiftSources/StreamChatSwiftUI/ChatMessageList/Gallery/MediaViewer.swiftSources/StreamChatSwiftUI/Resources/en.lproj/Localizable.stringsStreamChatSwiftUI.xcodeproj/project.pbxprojStreamChatSwiftUITests/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
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) |
There was a problem hiding this comment.
Could use token here, but not crucial
martinmitrevski
left a comment
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
why's the search bar black? 😅
There was a problem hiding this comment.
this seems like an issue with the snapshot library though
There was a problem hiding this comment.
same here, it's ok in the app
SDK Size
|
StreamChatSwiftUI XCSize
Show 81 more objects
|
|



🔗 Issue Links
🎯 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
LiquidGlassBorderlessModifiermakeToolbarConfirmActionModifierstylingAddUsersView→MemberAddView,AddUsersViewModel→MemberAddViewModel, and extractMemberListViewinto its own file🧪 Manual Testing Notes
☑️ Contributor Checklist
docs-contentrepoSummary by CodeRabbit
New Features
Bug Fixes
Style
Localization