From 6a522fcf7ba1ed5e917fd97cc7e01f02633cd50c Mon Sep 17 00:00:00 2001 From: Toomas Vahter Date: Mon, 23 Sep 2024 14:11:47 +0300 Subject: [PATCH 01/24] Reduce view updates when computing frame for long press action (#607) --- CHANGELOG.md | 3 ++- .../ChatChannel/MessageList/MessageContainerView.swift | 7 ++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85dbdc475..92949f5b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). # Upcoming -### 🔄 Changed +### 🐞 Fixed +- Rare crash when accessing frame of the view [#607](https://github.com/GetStream/stream-chat-swiftui/pull/607) # [4.63.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.63.0) _September 12, 2024_ diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 12c2c84c6..ea39a48d9 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -112,9 +112,7 @@ public struct MessageContainerView: View { GeometryReader { proxy in Rectangle().fill(Color.clear) .onChange(of: computeFrame, perform: { _ in - DispatchQueue.main.async { - frame = proxy.frame(in: .global) - } + frame = proxy.frame(in: .global) }) } ) @@ -347,9 +345,8 @@ public struct MessageContainerView: View { showsMessageActions: Bool, showsBottomContainer: Bool = true ) { - computeFrame = true + computeFrame.toggle() DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - computeFrame = false triggerHapticFeedback(style: .medium) onLongPress( MessageDisplayInfo( From f70197e7cdfc147a150ea30d404c83f85efd76fc Mon Sep 17 00:00:00 2001 From: Toomas Vahter Date: Mon, 23 Sep 2024 15:12:02 +0300 Subject: [PATCH 02/24] ChatChannelListView navigation did not trigger when using a custom container and its body reloaded (#609) --- CHANGELOG.md | 1 + .../ChatChannelList/ChatChannelListView.swift | 47 ++++++++++++++----- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92949f5b4..6ddd8b869 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### 🐞 Fixed - Rare crash when accessing frame of the view [#607](https://github.com/GetStream/stream-chat-swiftui/pull/607) +- `ChatChannelListView` navigation did not trigger when using a custom container and its body reloaded [#609](https://github.com/GetStream/stream-chat-swiftui/pull/609) # [4.63.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.63.0) _September 12, 2024_ diff --git a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListView.swift b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListView.swift index 6b688b06f..5f9dd7ca5 100644 --- a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListView.swift @@ -16,10 +16,29 @@ public struct ChatChannelListView: View { private let viewFactory: Factory private let title: String - private var onItemTap: (ChatChannel) -> Void + private let customOnItemTap: ((ChatChannel) -> Void)? private var embedInNavigationView: Bool private var handleTabBarVisibility: Bool - + + /// Creates a channel list view. + /// + /// - Parameters: + /// - viewFactory: The view factory used for creating views used by the channel list. + /// - viewModel: The view model instance providing the data. Default view model is created if nil. + /// - channelListController: The channel list controller managing the list of channels used as a data souce for the view model. Default controller is created if nil. + /// - title: A title used as the navigation bar title. + /// - onItemTap: A closure for handling a tap on the channel item. Default closure updates the ``ChatChannelListViewModel/selectedChannel`` property in the view model. + /// - selectedChannelId: The id of a channel to be opened after the initial channel list load. + /// - handleTabBarVisibility: True, if TabBar visibility should be automatically updated. + /// - embedInNavigationView: True, if the channel list view should be embedded in a navigation stack. + /// + /// Changing the instance of the passed in `viewModel` or `channelListController` does not have an effect without reloading the channel list view by assigning a custom identity. The custom identity should be refreshed when either of the passed in instances have been recreated. + /// ```swift + /// ChatChannelListView( + /// viewModel: viewModel + /// ) + /// .id(myCustomViewIdentity) + /// ``` public init( viewFactory: Factory = DefaultViewFactory.shared, viewModel: ChatChannelListViewModel? = nil, @@ -30,23 +49,25 @@ public struct ChatChannelListView: View { handleTabBarVisibility: Bool = true, embedInNavigationView: Bool = true ) { - let channelListVM = viewModel ?? ViewModelsFactory.makeChannelListViewModel( - channelListController: channelListController, - selectedChannelId: selectedChannelId - ) _viewModel = StateObject( - wrappedValue: channelListVM + wrappedValue: viewModel ?? ViewModelsFactory.makeChannelListViewModel( + channelListController: channelListController, + selectedChannelId: selectedChannelId + ) ) self.viewFactory = viewFactory self.title = title self.handleTabBarVisibility = handleTabBarVisibility self.embedInNavigationView = embedInNavigationView - if let onItemTap = onItemTap { - self.onItemTap = onItemTap - } else { - self.onItemTap = { channel in - channelListVM.selectedChannel = channel.channelSelectionInfo - } + customOnItemTap = onItemTap + } + + var onItemTap: (ChatChannel) -> Void { + if let customOnItemTap { + return customOnItemTap + } + return { [weak viewModel] channel in + viewModel?.selectedChannel = channel.channelSelectionInfo } } From 64dc5fa6d21b4bd37e8bed358e76cf8a590d7cfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 14:10:24 +0000 Subject: [PATCH 03/24] Bump puma from 6.4.2 to 6.4.3 (#608) Bumps [puma](https://github.com/puma/puma) from 6.4.2 to 6.4.3. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v6.4.2...v6.4.3) --- updated-dependencies: - dependency-name: puma dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Toomas Vahter --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9bec85b73..b5d03a66c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -306,7 +306,7 @@ GEM coderay (~> 1.1) method_source (~> 1.0) public_suffix (4.0.7) - puma (6.4.2) + puma (6.4.3) nio4r (~> 2.0) racc (1.8.1) rack (3.1.7) From 816076e9a165ae34d6c03a971baa37dea7818f7c Mon Sep 17 00:00:00 2001 From: Toomas Vahter Date: Tue, 24 Sep 2024 10:10:50 +0300 Subject: [PATCH 04/24] Channel was sometimes not marked as read when tapping the x on the unread message pill in the message list (#610) --- CHANGELOG.md | 1 + .../ChatChannel/MessageList/MessageListView.swift | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ddd8b869..4edda3737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### 🐞 Fixed - Rare crash when accessing frame of the view [#607](https://github.com/GetStream/stream-chat-swiftui/pull/607) - `ChatChannelListView` navigation did not trigger when using a custom container and its body reloaded [#609](https://github.com/GetStream/stream-chat-swiftui/pull/609) +- Channel was sometimes not marked as read when tapping the x on the unread message pill in the message list [#610](https://github.com/GetStream/stream-chat-swiftui/pull/610) # [4.63.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.63.0) _September 12, 2024_ diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift index e508f9308..aebc4132e 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift @@ -301,7 +301,7 @@ public struct MessageListView: View, KeyboardReadable { _ = onJumpToMessage?(firstUnreadMessageId ?? .unknownMessageId) }, onClose: { - firstUnreadMessageId = nil + chatClient.channelController(for: channel.cid).markRead() unreadButtonDismissed = true } ) : nil From f04bcb4e69d05d67123a3d9d3b6349fbe7e9103e Mon Sep 17 00:00:00 2001 From: Alexey Alter-Pesotskiy Date: Tue, 24 Sep 2024 10:05:32 +0100 Subject: [PATCH 05/24] Bump fastlane plugin --- Gemfile.lock | 4 ++-- fastlane/Pluginfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b5d03a66c..64253ce3f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -199,7 +199,7 @@ GEM fastlane pry fastlane-plugin-sonarcloud_metric_kit (0.2.1) - fastlane-plugin-stream_actions (0.3.63) + fastlane-plugin-stream_actions (0.3.70) xctest_list (= 1.2.1) fastlane-plugin-versioning (0.5.2) ffi (1.17.0) @@ -427,7 +427,7 @@ DEPENDENCIES fastlane-plugin-create_xcframework fastlane-plugin-lizard fastlane-plugin-sonarcloud_metric_kit - fastlane-plugin-stream_actions (= 0.3.63) + fastlane-plugin-stream_actions (= 0.3.70) fastlane-plugin-versioning jazzy json diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile index 882e92bd4..3d5398c7c 100644 --- a/fastlane/Pluginfile +++ b/fastlane/Pluginfile @@ -5,4 +5,4 @@ gem 'fastlane-plugin-versioning' gem 'fastlane-plugin-sonarcloud_metric_kit' gem 'fastlane-plugin-create_xcframework' -gem 'fastlane-plugin-stream_actions', '0.3.63' +gem 'fastlane-plugin-stream_actions', '0.3.70' From 89a3b4e82853975caccbf3e9dc98f1b51661579a Mon Sep 17 00:00:00 2001 From: Alexey Alter-Pesotskiy Date: Tue, 24 Sep 2024 12:06:43 +0100 Subject: [PATCH 06/24] [CI] Fix snapshots path --- fastlane/Fastfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index c4d53a098..e7bd15b36 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -190,8 +190,10 @@ lane :test_ui do |options| next if png_files.empty? # Discard all files apart from the snapshots - png_files.each { |png| sh("git add #{png}") || true } - sh('git restore .') + Dir.chdir('..') do + png_files.each { |png| sh("git add #{png}") || true } + sh('git restore .') + end pr_create( title: '[CI] Snapshots', From 4dd1264d697dbf2e5045b5f8c04b6dddb54e80f2 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 27 Sep 2024 17:47:19 +0100 Subject: [PATCH 07/24] Use LLC polls branch --- StreamChatSwiftUI.xcodeproj/project.pbxproj | 4 ++-- .../Infrastructure/Mocks/Poll_Mock.swift | 8 ++++++-- .../test_pollAttachmentView_closedPoll.1.png | Bin 35366 -> 35458 bytes 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/StreamChatSwiftUI.xcodeproj/project.pbxproj b/StreamChatSwiftUI.xcodeproj/project.pbxproj index 2145d9830..5828b5f0b 100644 --- a/StreamChatSwiftUI.xcodeproj/project.pbxproj +++ b/StreamChatSwiftUI.xcodeproj/project.pbxproj @@ -3720,8 +3720,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/GetStream/stream-chat-swift.git"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.63.0; + branch = "add/polls-ui-base"; + kind = branch; }; }; E3A1C01A282BAC66002D1E26 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { diff --git a/StreamChatSwiftUITests/Infrastructure/Mocks/Poll_Mock.swift b/StreamChatSwiftUITests/Infrastructure/Mocks/Poll_Mock.swift index 6a7405c32..ead778f5b 100644 --- a/StreamChatSwiftUITests/Infrastructure/Mocks/Poll_Mock.swift +++ b/StreamChatSwiftUITests/Infrastructure/Mocks/Poll_Mock.swift @@ -51,7 +51,9 @@ extension Poll { createdBy: .mock(id: "test", name: "test"), latestAnswers: [], options: [option], - latestVotesByOption: [option] + latestVotesByOption: [option], + latestVotes: [], + ownVotes: [] ) return poll } @@ -89,7 +91,9 @@ extension Poll { createdBy: .mock(id: "test", name: "test"), latestAnswers: [], options: options, - latestVotesByOption: options + latestVotesByOption: options, + latestVotes: [], + ownVotes: [] ) } } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/PollAttachmentView_Tests/test_pollAttachmentView_closedPoll.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/PollAttachmentView_Tests/test_pollAttachmentView_closedPoll.1.png index 4cad27e7ce87de867afde3c2b6d6c2b1967833d0..973eec26dad74a5ee04e81a2adb8fa2bbf76eca9 100644 GIT binary patch delta 19829 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 Date: Fri, 27 Sep 2024 17:47:51 +0100 Subject: [PATCH 08/24] Fix the vote progress view not having full width when the Poll is closed --- .../Polls/PollAllOptionsView.swift | 3 +- .../Polls/PollAttachmentView.swift | 80 +++++++++--------- ...tView_snapshotCommentsAndSuggestions.1.png | Bin 61581 -> 61561 bytes ...llAttachmentView_snapshotUniqueVotes.1.png | Bin 36995 -> 36967 bytes 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAllOptionsView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAllOptionsView.swift index c5106e3dc..e8a2de2fb 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAllOptionsView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAllOptionsView.swift @@ -31,7 +31,8 @@ struct PollAllOptionsView: View { viewModel: viewModel, option: option, optionFont: fonts.headline, - alternativeStyle: true + alternativeStyle: true, + checkboxButtonSpacing: 8 ) } } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift index 8e1512983..12f8543ef 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift @@ -190,51 +190,53 @@ struct PollOptionView: View { var maxVotes: Int? /// If true, only option name and vote count is shown, otherwise votes indicator and avatars appear as well. var alternativeStyle: Bool = false - + /// The spacing between the checkbox and the option name. + /// By default it is 4. For All Options View is 8. + var checkboxButtonSpacing: CGFloat = 4 + var body: some View { - VStack(spacing: 4) { - HStack(alignment: .top) { - if !viewModel.poll.isClosed { - Button { - if viewModel.optionVotedByCurrentUser(option) { - viewModel.removePollVote(for: option) - } else { - viewModel.castPollVote(for: option) - } - } label: { - if viewModel.optionVotedByCurrentUser(option) { - Image(systemName: "checkmark.circle.fill") - } else { - Image(systemName: "circle") - } + HStack(alignment: .top, spacing: checkboxButtonSpacing) { + if !viewModel.poll.isClosed { + Button { + if viewModel.optionVotedByCurrentUser(option) { + viewModel.removePollVote(for: option) + } else { + viewModel.castPollVote(for: option) + } + } label: { + if viewModel.optionVotedByCurrentUser(option) { + Image(systemName: "checkmark.circle.fill") + } else { + Image(systemName: "circle") } } - - Text(option.text) - .font(optionFont) - Spacer() - if !alternativeStyle, viewModel.showVoterAvatars { - HStack(spacing: -4) { - ForEach( - option.latestVotes.sorted(by: { $0.createdAt > $1.createdAt }).suffix(2) - ) { vote in - MessageAvatarView( - avatarURL: vote.user?.imageURL, - size: .init(width: 20, height: 20) - ) + } + VStack(spacing: 4) { + HStack(alignment: .top) { + Text(option.text) + .font(optionFont) + Spacer() + if !alternativeStyle, viewModel.showVoterAvatars { + HStack(spacing: -4) { + ForEach( + option.latestVotes.sorted(by: { $0.createdAt > $1.createdAt }).suffix(2) + ) { vote in + MessageAvatarView( + avatarURL: vote.user?.imageURL, + size: .init(width: 20, height: 20) + ) + } } } + Text("\(viewModel.poll.voteCountsByOption?[option.id] ?? 0)") + } + if !alternativeStyle { + PollVotesIndicatorView( + alternativeStyle: viewModel.poll.isClosed && viewModel.hasMostVotes(for: option), + optionVotes: optionVotes ?? 0, + maxVotes: maxVotes ?? 0 + ) } - Text("\(viewModel.poll.voteCountsByOption?[option.id] ?? 0)") - } - - if !alternativeStyle { - PollVotesIndicatorView( - alternativeStyle: viewModel.poll.isClosed && viewModel.hasMostVotes(for: option), - optionVotes: optionVotes ?? 0, - maxVotes: maxVotes ?? 0 - ) - .padding(.leading, 24) } } } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/PollAttachmentView_Tests/test_pollAttachmentView_snapshotCommentsAndSuggestions.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/PollAttachmentView_Tests/test_pollAttachmentView_snapshotCommentsAndSuggestions.1.png index 39ae151d5931e95d22cabbc11dc1ce9379ac2d59..d53ef697e8ea17bbbbea6cc3e330d99e9d01fd65 100644 GIT binary patch delta 32860 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 XW_~O`9e#cX{7{fnmMxV2;PZa~hWl-| delta 32819 zcmeEu^)^K4Fe1z9Ru=S zc%J(lIrsDY2k$R@uF-4uUVH7;>$~P`0VQk^CGr@EYLC@jxphnI)+>o;Z`_c!X3>*p zMr%&&M?5iU9@4F>$=!*({rnD+1Kypu)Z5ih-i*L$2yO2A-DK{_mM87=we0QnLYQ97!7NSm#jzfAl z`EKkEC5!JZH==5+rKt+u6 zZXW|z*-uR&lyEXZ*Ab64nGok2t6VP{iHB5&A7nzHE2G_PfB3aCZwziM-eOX;tr7IE zJ;9GF68a5Y;F^P5tqtE%Nj))7G$6cpPw;E1R!wi;6T5}<&mRDMq%=iNR9ROiP1LE5 ztM)Z)dl4O2FvRtp8pnROZ{WWu@fCZDVWw(uB)~oy;Q0ZAFP!vgWmKf~v}?=I+)#On>4ei22xp7iK zIU4+n=SRE`|4qg{Y^3d+jLCq%ULN#eO5*9TS(u6c?>BwL3Q@W02C>>|KHnxq$0092 zFW#C{UcX4aeiir^_r$VpgYVk&;gAcxQ7Ve^HH7X6kH-b!P_Udu;r=hY7`=YoSG)|% z^C<>j`EGX}H_6sfJ@p?l@IM=T!Urkf$B}x~Tw`?Kw}OBl^m!WwINb{w)N-1!DI0B{9ZkIq4zzc2={M%Br<%5n)?Iui5{R zkpDb2-!Y3#|7)va^N@o1;x5gWtN)_@7V;V87mYx`gt%56DJWc^c2X9v=iPtPz7paK zo>7)TwYkJ=Rdce@P_1z^&ExTZ^G)^lrugBc{5

- StreamChatSwiftUI + StreamChatSwiftUI

## SwiftUI StreamChat SDK diff --git a/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift b/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift index 922434ca3..a154345d2 100644 --- a/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift +++ b/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift @@ -7,5 +7,5 @@ import Foundation enum SystemEnvironment { /// A Stream Chat version. - public static let version: String = "4.63.0" + public static let version: String = "4.64.0" } diff --git a/Sources/StreamChatSwiftUI/Info.plist b/Sources/StreamChatSwiftUI/Info.plist index 4572be90d..9a56fe8f6 100644 --- a/Sources/StreamChatSwiftUI/Info.plist +++ b/Sources/StreamChatSwiftUI/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.63.0 + 4.64.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPhotoLibraryUsageDescription diff --git a/StreamChatSwiftUI-XCFramework.podspec b/StreamChatSwiftUI-XCFramework.podspec index 654552ae0..6bf762853 100644 --- a/StreamChatSwiftUI-XCFramework.podspec +++ b/StreamChatSwiftUI-XCFramework.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamChatSwiftUI-XCFramework' - spec.version = '4.63.0' + spec.version = '4.64.0' spec.summary = 'StreamChat SwiftUI Chat Components' spec.description = 'StreamChatSwiftUI SDK offers flexible SwiftUI components able to display data provided by StreamChat SDK.' diff --git a/StreamChatSwiftUI.podspec b/StreamChatSwiftUI.podspec index 4da618587..92d1fdd4a 100644 --- a/StreamChatSwiftUI.podspec +++ b/StreamChatSwiftUI.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamChatSwiftUI' - spec.version = '4.63.0' + spec.version = '4.64.0' spec.summary = 'StreamChat SwiftUI Chat Components' spec.description = 'StreamChatSwiftUI SDK offers flexible SwiftUI components able to display data provided by StreamChat SDK.' diff --git a/StreamChatSwiftUIArtifacts.json b/StreamChatSwiftUIArtifacts.json index 69566c06c..a7eb8a623 100644 --- a/StreamChatSwiftUIArtifacts.json +++ b/StreamChatSwiftUIArtifacts.json @@ -1 +1 @@ -{"4.40.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.40.0/StreamChatSwiftUI.zip","4.41.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.41.0/StreamChatSwiftUI.zip","4.42.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.42.0/StreamChatSwiftUI.zip","4.43.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.43.0/StreamChatSwiftUI.zip","4.44.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.44.0/StreamChatSwiftUI.zip","4.45.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.45.0/StreamChatSwiftUI.zip","4.46.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.46.0/StreamChatSwiftUI.zip","4.47.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.47.0/StreamChatSwiftUI.zip","4.47.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.47.1/StreamChatSwiftUI.zip","4.48.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.48.0/StreamChatSwiftUI.zip","4.49.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.49.0/StreamChatSwiftUI.zip","4.50.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.50.0/StreamChatSwiftUI.zip","4.50.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.50.1/StreamChatSwiftUI.zip","4.51.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.51.0/StreamChatSwiftUI.zip","4.52.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.52.0/StreamChatSwiftUI.zip","4.53.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.53.0/StreamChatSwiftUI.zip","4.54.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.54.0/StreamChatSwiftUI.zip","4.55.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.55.0/StreamChatSwiftUI.zip","4.56.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.56.0/StreamChatSwiftUI.zip","4.57.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.57.0/StreamChatSwiftUI.zip","4.58.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.58.0/StreamChatSwiftUI.zip","4.59.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.59.0/StreamChatSwiftUI.zip","4.60.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.60.0/StreamChatSwiftUI.zip","4.61.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.61.0/StreamChatSwiftUI.zip","4.62.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.62.0/StreamChatSwiftUI.zip","4.63.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.63.0/StreamChatSwiftUI.zip"} \ No newline at end of file +{"4.40.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.40.0/StreamChatSwiftUI.zip","4.41.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.41.0/StreamChatSwiftUI.zip","4.42.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.42.0/StreamChatSwiftUI.zip","4.43.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.43.0/StreamChatSwiftUI.zip","4.44.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.44.0/StreamChatSwiftUI.zip","4.45.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.45.0/StreamChatSwiftUI.zip","4.46.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.46.0/StreamChatSwiftUI.zip","4.47.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.47.0/StreamChatSwiftUI.zip","4.47.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.47.1/StreamChatSwiftUI.zip","4.48.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.48.0/StreamChatSwiftUI.zip","4.49.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.49.0/StreamChatSwiftUI.zip","4.50.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.50.0/StreamChatSwiftUI.zip","4.50.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.50.1/StreamChatSwiftUI.zip","4.51.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.51.0/StreamChatSwiftUI.zip","4.52.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.52.0/StreamChatSwiftUI.zip","4.53.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.53.0/StreamChatSwiftUI.zip","4.54.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.54.0/StreamChatSwiftUI.zip","4.55.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.55.0/StreamChatSwiftUI.zip","4.56.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.56.0/StreamChatSwiftUI.zip","4.57.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.57.0/StreamChatSwiftUI.zip","4.58.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.58.0/StreamChatSwiftUI.zip","4.59.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.59.0/StreamChatSwiftUI.zip","4.60.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.60.0/StreamChatSwiftUI.zip","4.61.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.61.0/StreamChatSwiftUI.zip","4.62.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.62.0/StreamChatSwiftUI.zip","4.63.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.63.0/StreamChatSwiftUI.zip","4.64.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.64.0/StreamChatSwiftUI.zip"} \ No newline at end of file

JHj1ktIg>DeUeUeq&^NOTKqm9 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≥$tP|&^u4G)}I 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¬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 diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/PollAttachmentView_Tests/test_pollAttachmentView_snapshotUniqueVotes.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/PollAttachmentView_Tests/test_pollAttachmentView_snapshotUniqueVotes.1.png index 042e8f541f6ab63a130da76768d969753decfde5..66c0294904f5c58791c7e0503ce4f2152500d13b 100644 GIT binary patch delta 21580 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 Date: Fri, 27 Sep 2024 18:10:31 +0100 Subject: [PATCH 09/24] Fix checkbox not marked when current user voted from another device --- .../MessageList/Polls/PollAttachmentViewModel.swift | 2 +- .../Tests/ChatChannel/PollAttachmentViewModel_Tests.swift | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift index 6165a366b..dbcf553ca 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift @@ -198,7 +198,7 @@ public class PollAttachmentViewModel: ObservableObject, PollControllerDelegate { /// True, if the current user has voted for the specified option, otherwise false. public func optionVotedByCurrentUser(_ option: PollOption) -> Bool { - currentUserVote(for: option) != nil + poll.hasCurrentUserVoted(for: option) } /// Adds a new option to the poll. diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift index e91e026e5..404bff676 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift @@ -92,15 +92,14 @@ final class PollAttachmentViewModel_Tests: StreamChatTestCase { func test_pollAttachmentViewModel_optionVotedByCurrentUser() { // Given + let vote = makePollVote() let pollController = makePollController() let viewModel = PollAttachmentViewModel( message: .mock(), - poll: .unique, + poll: .mock(ownVotes: [vote]), pollController: pollController ) - let vote = makePollVote() let option = PollOption(id: vote.optionId!, text: "") - viewModel.currentUserVotes = [vote] // When let optionVoted = viewModel.optionVotedByCurrentUser(option) From 58d8f900f557ef6af71f2fcd97ad9213bc72bb72 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 27 Sep 2024 18:42:00 +0100 Subject: [PATCH 10/24] Fix latest voter logic incorrect --- .../ChatChannelList/ChatChannelListItem.swift | 4 +- .../ChatChannelListItemView_Tests.swift | 56 +++++++++++++++++- ...nelListItem_pollMessage_someoneVoted.1.png | Bin 0 -> 24098 bytes ...channelListItem_pollMessage_youVoted.1.png | Bin 0 -> 23145 bytes 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 StreamChatSwiftUITests/Tests/ChatChannelList/__Snapshots__/ChatChannelListItemView_Tests/test_channelListItem_pollMessage_someoneVoted.1.png create mode 100644 StreamChatSwiftUITests/Tests/ChatChannelList/__Snapshots__/ChatChannelListItemView_Tests/test_channelListItem_pollMessage_youVoted.1.png diff --git a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift index 0e9c1c85f..0cb8257c5 100644 --- a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift +++ b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift @@ -360,8 +360,8 @@ extension ChatChannel { private func pollMessageText(for previewMessage: ChatMessage) -> String? { guard let poll = previewMessage.poll, !previewMessage.isDeleted else { return nil } var components = ["📊"] - if let latestVoter = poll.latestVotesByOption.first?.latestVotes.first?.user { - if previewMessage.isSentByCurrentUser { + if let latestVoter = poll.latestVotes.last?.user { + if latestVoter.id == membership?.id { components.append(L10n.Channel.Item.pollYouVoted) } else { components.append(L10n.Channel.Item.pollSomeoneVoted(latestVoter.name ?? latestVoter.id)) diff --git a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift index e98f45327..3e8f737dc 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift @@ -153,6 +153,54 @@ final class ChatChannelListItemView_Tests: StreamChatTestCase { assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) } + func test_channelListItem_pollMessage_youVoted() throws { + // Given + let currentUserId = UserId.unique + let message = try mockPollMessage(isSentByCurrentUser: false, latestVotes: [ + .unique, + .unique, + .mock(pollId: .unique, optionId: .unique, user: .mock(id: currentUserId)) + ]) + let channel = ChatChannel.mock(cid: .unique, membership: .mock(id: currentUserId), latestMessages: [message]) + + // When + let view = ChatChannelListItem( + channel: channel, + channelName: "Test", + avatar: .circleImage, + onlineIndicatorShown: true, + onItemTap: { _ in } + ) + .frame(width: defaultScreenSize.width) + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + + func test_channelListItem_pollMessage_someoneVoted() throws { + // Given + let currentUserId = UserId.unique + let message = try mockPollMessage(isSentByCurrentUser: false, latestVotes: [ + .unique, + .mock(pollId: .unique, optionId: .unique, user: .mock(id: currentUserId)), + .mock(pollId: .unique, optionId: .unique, user: .mock(id: .unique, name: "Steve Jobs")) + ]) + let channel = ChatChannel.mock(cid: .unique, membership: .mock(id: currentUserId), latestMessages: [message]) + + // When + let view = ChatChannelListItem( + channel: channel, + channelName: "Test", + avatar: .circleImage, + onlineIndicatorShown: true, + onItemTap: { _ in } + ) + .frame(width: defaultScreenSize.width) + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + // MARK: - private private func mockAudioMessage(text: String, isSentByCurrentUser: Bool) throws -> ChatMessage { @@ -271,7 +319,7 @@ final class ChatChannelListItemView_Tests: StreamChatTestCase { ) } - private func mockPollMessage(isSentByCurrentUser: Bool) throws -> ChatMessage { + private func mockPollMessage(isSentByCurrentUser: Bool, latestVotes: [PollVote] = []) throws -> ChatMessage { .mock( id: .unique, cid: .unique, @@ -281,7 +329,11 @@ final class ChatChannelListItemView_Tests: StreamChatTestCase { createdAt: Date(timeIntervalSince1970: 100), localState: nil, isSentByCurrentUser: isSentByCurrentUser, - poll: .mock(optionCount: 1, voteCountForOption: { _ in 0 }) + poll: .mock( + name: "Test poll", + createdBy: .mock(id: "test", name: "test"), + latestVotes: latestVotes + ) ) } } diff --git a/StreamChatSwiftUITests/Tests/ChatChannelList/__Snapshots__/ChatChannelListItemView_Tests/test_channelListItem_pollMessage_someoneVoted.1.png b/StreamChatSwiftUITests/Tests/ChatChannelList/__Snapshots__/ChatChannelListItemView_Tests/test_channelListItem_pollMessage_someoneVoted.1.png new file mode 100644 index 0000000000000000000000000000000000000000..20ffe5d51bc88118321fa5980278b1097345e3e2 GIT binary patch literal 24098 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 JN=y*p{{wv4hI#-1 literal 0 HcmV?d00001 diff --git a/StreamChatSwiftUITests/Tests/ChatChannelList/__Snapshots__/ChatChannelListItemView_Tests/test_channelListItem_pollMessage_youVoted.1.png b/StreamChatSwiftUITests/Tests/ChatChannelList/__Snapshots__/ChatChannelListItemView_Tests/test_channelListItem_pollMessage_youVoted.1.png new file mode 100644 index 0000000000000000000000000000000000000000..f05304e7f2b52234c78bf311a4c59db890d67b90 GIT binary patch literal 23145 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 literal 0 HcmV?d00001 From ac6b1c9f96e4722339939e9ae0ab374c393741b7 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 27 Sep 2024 19:20:41 +0100 Subject: [PATCH 11/24] Fix deprecated poll vote list query initializers --- .../MessageList/Polls/PollCommentsViewModel.swift | 5 +---- .../MessageList/Polls/PollOptionAllVotesViewModel.swift | 2 +- .../Tests/ChatChannel/PollCommentsViewModel_Tests.swift | 5 +---- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollCommentsViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollCommentsViewModel.swift index 826e4a5ae..34569209a 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollCommentsViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollCommentsViewModel.swift @@ -25,10 +25,7 @@ class PollCommentsViewModel: ObservableObject, PollVoteListControllerDelegate { convenience init(poll: Poll, pollController: PollController) { let query = PollVoteListQuery( pollId: poll.id, - optionId: nil, - filter: .and( - [.equal(.pollId, to: poll.id), .equal(.isAnswer, to: true)] - ) + filter: .equal(.isAnswer, to: true) ) self.init( pollController: pollController, diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollOptionAllVotesViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollOptionAllVotesViewModel.swift index 7f6a414d0..5fbf7de5b 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollOptionAllVotesViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollOptionAllVotesViewModel.swift @@ -24,7 +24,7 @@ class PollOptionAllVotesViewModel: ObservableObject, PollVoteListControllerDeleg self.option = option let query = PollVoteListQuery( pollId: poll.id, - optionId: option.id, filter: .equal(.optionId, to: option.id) + optionId: option.id ) controller = InjectedValues[\.chatClient].pollVoteListController(query: query) controller.delegate = self diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/PollCommentsViewModel_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/PollCommentsViewModel_Tests.swift index 2a9af80bd..c98b1513f 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/PollCommentsViewModel_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/PollCommentsViewModel_Tests.swift @@ -82,10 +82,7 @@ final class PollCommentsViewModel_Tests: StreamChatTestCase { private func makeCommentsController() -> PollVoteListController_Mock { let query = PollVoteListQuery( pollId: .unique, - optionId: nil, - filter: .and( - [.equal(.pollId, to: .unique), .equal(.isAnswer, to: true)] - ) + filter: .equal(.isAnswer, to: true) ) return PollVoteListController_Mock(query: query, client: chatClient) } From 11e4303d25177406c0514ef9f06a619579842141 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Sat, 28 Sep 2024 20:34:20 +0100 Subject: [PATCH 12/24] Improve voting UX by making it possible taping the option as well --- .../MessageList/Polls/PollAttachmentView.swift | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift index 12f8543ef..7a2ff49b3 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift @@ -198,11 +198,7 @@ struct PollOptionView: View { HStack(alignment: .top, spacing: checkboxButtonSpacing) { if !viewModel.poll.isClosed { Button { - if viewModel.optionVotedByCurrentUser(option) { - viewModel.removePollVote(for: option) - } else { - viewModel.castPollVote(for: option) - } + togglePollVote() } label: { if viewModel.optionVotedByCurrentUser(option) { Image(systemName: "checkmark.circle.fill") @@ -239,6 +235,18 @@ struct PollOptionView: View { } } } + .contentShape(Rectangle()) + .onTapGesture { + togglePollVote() + } + } + + func togglePollVote() { + if viewModel.optionVotedByCurrentUser(option) { + viewModel.removePollVote(for: option) + } else { + viewModel.castPollVote(for: option) + } } } From c6eca0790d6f7147bdd16cc6efadfeace61866d3 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Sat, 28 Sep 2024 20:52:06 +0100 Subject: [PATCH 13/24] Reuse logic from LLC --- .../MessageList/Polls/PollAttachmentView.swift | 4 ++-- .../MessageList/Polls/PollAttachmentViewModel.swift | 10 ++-------- .../ChatChannel/PollAttachmentViewModel_Tests.swift | 5 ++--- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift index 7a2ff49b3..3d3d3f7c4 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift @@ -55,8 +55,8 @@ public struct PollAttachmentView: View { PollOptionView( viewModel: viewModel, option: option, - optionVotes: poll.voteCountsByOption?[option.id], - maxVotes: poll.voteCountsByOption?.values.max() + optionVotes: poll.voteCount(for: option), + maxVotes: poll.currentMaximumVoteCount ) .layoutPriority(1) // do not compress long text } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift index dbcf553ca..47aa0c912 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift @@ -219,13 +219,7 @@ public class PollAttachmentViewModel: ObservableObject, PollControllerDelegate { /// /// - Note: When multiple options have the highest vote count, this function returns false. public func hasMostVotes(for option: PollOption) -> Bool { - guard let allCounts = poll.voteCountsByOption else { return false } - guard let optionVoteCount = allCounts[option.id], optionVoteCount > 0 else { return false } - guard let highestVotePerOption = allCounts.values.max() else { return false } - guard optionVoteCount == highestVotePerOption else { return false } - // Check if only one option has highest number for votes - let optionsByVoteCounts = Dictionary(grouping: allCounts, by: { $0.value }) - return optionsByVoteCounts[optionVoteCount]?.count == 1 + return poll.isOptionWithMostVotes(option) } // MARK: - PollControllerDelegate @@ -244,7 +238,7 @@ public class PollAttachmentViewModel: ObservableObject, PollControllerDelegate { // MARK: - private private func currentUserVote(for option: PollOption) -> PollVote? { - currentUserVotes.first(where: { $0.optionId == option.id }) + poll.currentUserVote(for: option) } private func notifySheetPresentation(shown: Bool) { diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift index 404bff676..ddc5d0402 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/PollAttachmentViewModel_Tests.swift @@ -58,14 +58,13 @@ final class PollAttachmentViewModel_Tests: StreamChatTestCase { func test_pollAttachmentViewModel_removeVoteCalled() { // Given + let vote = makePollVote() let pollController = makePollController() let viewModel = PollAttachmentViewModel( message: .mock(), - poll: .unique, + poll: .mock(ownVotes: [vote]), pollController: pollController ) - let vote = makePollVote() - viewModel.currentUserVotes = [vote] // When viewModel.removePollVote(for: .init(id: vote.optionId!, text: "")) From 65a92114b561c287cf9fbea092632016ff839988 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Sun, 29 Sep 2024 01:18:02 +0100 Subject: [PATCH 14/24] Use latestVotes order directly from LLC --- .../MessageList/Polls/PollAttachmentView.swift | 2 +- .../ChatChannel/MessageList/Polls/PollResultsView.swift | 2 +- .../ChatChannelList/ChatChannelListItem.swift | 2 +- StreamChatSwiftUI.xcodeproj/project.pbxproj | 4 ++-- .../ChatChannelList/ChatChannelListItemView_Tests.swift | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift index 3d3d3f7c4..7715f3049 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift @@ -215,7 +215,7 @@ struct PollOptionView: View { if !alternativeStyle, viewModel.showVoterAvatars { HStack(spacing: -4) { ForEach( - option.latestVotes.sorted(by: { $0.createdAt > $1.createdAt }).suffix(2) + option.latestVotes.prefix(2) ) { vote in MessageAvatarView( avatarURL: vote.user?.imageURL, diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollResultsView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollResultsView.swift index 06870fbc9..46b1b3e29 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollResultsView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollResultsView.swift @@ -45,7 +45,7 @@ struct PollResultsView: View { poll: viewModel.poll, option: option, votes: Array( - option.latestVotes.sorted(by: { $0.createdAt > $1.createdAt }) + option.latestVotes .prefix(numberOfItemsShown) ), hasMostVotes: viewModel.hasMostVotes(for: option), diff --git a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift index 0cb8257c5..831a07f4c 100644 --- a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift +++ b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListItem.swift @@ -360,7 +360,7 @@ extension ChatChannel { private func pollMessageText(for previewMessage: ChatMessage) -> String? { guard let poll = previewMessage.poll, !previewMessage.isDeleted else { return nil } var components = ["📊"] - if let latestVoter = poll.latestVotes.last?.user { + if let latestVoter = poll.latestVotes.first?.user { if latestVoter.id == membership?.id { components.append(L10n.Channel.Item.pollYouVoted) } else { diff --git a/StreamChatSwiftUI.xcodeproj/project.pbxproj b/StreamChatSwiftUI.xcodeproj/project.pbxproj index 5828b5f0b..b10457d55 100644 --- a/StreamChatSwiftUI.xcodeproj/project.pbxproj +++ b/StreamChatSwiftUI.xcodeproj/project.pbxproj @@ -3720,8 +3720,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/GetStream/stream-chat-swift.git"; requirement = { - branch = "add/polls-ui-base"; - kind = branch; + kind = revision; + revision = 12aa7994b834d352423b2b1670cfe0c4b2082cc7; }; }; E3A1C01A282BAC66002D1E26 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { diff --git a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift index 3e8f737dc..98988b360 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListItemView_Tests.swift @@ -157,9 +157,9 @@ final class ChatChannelListItemView_Tests: StreamChatTestCase { // Given let currentUserId = UserId.unique let message = try mockPollMessage(isSentByCurrentUser: false, latestVotes: [ + .mock(pollId: .unique, optionId: .unique, user: .mock(id: currentUserId)), .unique, - .unique, - .mock(pollId: .unique, optionId: .unique, user: .mock(id: currentUserId)) + .unique ]) let channel = ChatChannel.mock(cid: .unique, membership: .mock(id: currentUserId), latestMessages: [message]) @@ -181,9 +181,9 @@ final class ChatChannelListItemView_Tests: StreamChatTestCase { // Given let currentUserId = UserId.unique let message = try mockPollMessage(isSentByCurrentUser: false, latestVotes: [ + .mock(pollId: .unique, optionId: .unique, user: .mock(id: .unique, name: "Steve Jobs")), .unique, - .mock(pollId: .unique, optionId: .unique, user: .mock(id: currentUserId)), - .mock(pollId: .unique, optionId: .unique, user: .mock(id: .unique, name: "Steve Jobs")) + .mock(pollId: .unique, optionId: .unique, user: .mock(id: currentUserId)) ]) let channel = ChatChannel.mock(cid: .unique, membership: .mock(id: currentUserId), latestMessages: [message]) From c38c7b8e4ab9f72f49b36c83853a249afcf854f7 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 30 Sep 2024 10:26:19 +0100 Subject: [PATCH 15/24] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85dbdc475..7dcf48f11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). # Upcoming ### 🔄 Changed +- Improves Poll voting UX by making it possible to tap on the whole option as well [#612](https://github.com/GetStream/stream-chat-swiftui/pull/612) +### 🐞 Fixed +- Fix the poll vote progress view not having full width when the Poll is closed [#612](https://github.com/GetStream/stream-chat-swiftui/pull/612) +- Fix the last vote author not accurate in the channel preview [#612](https://github.com/GetStream/stream-chat-swiftui/pull/612) # [4.63.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.63.0) _September 12, 2024_ From 7871a1fb6dbbe9f54336408bf8d6b540db1a35a8 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 30 Sep 2024 12:11:56 +0100 Subject: [PATCH 16/24] Fix SwiftFormat --- .../ChatChannel/MessageList/Polls/PollAttachmentView.swift | 2 +- .../ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift index 7715f3049..ad17f8401 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentView.swift @@ -198,7 +198,7 @@ struct PollOptionView: View { HStack(alignment: .top, spacing: checkboxButtonSpacing) { if !viewModel.poll.isClosed { Button { - togglePollVote() + togglePollVote() } label: { if viewModel.optionVotedByCurrentUser(option) { Image(systemName: "checkmark.circle.fill") diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift index 47aa0c912..bf3e3ace9 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/Polls/PollAttachmentViewModel.swift @@ -219,7 +219,7 @@ public class PollAttachmentViewModel: ObservableObject, PollControllerDelegate { /// /// - Note: When multiple options have the highest vote count, this function returns false. public func hasMostVotes(for option: PollOption) -> Bool { - return poll.isOptionWithMostVotes(option) + poll.isOptionWithMostVotes(option) } // MARK: - PollControllerDelegate From 4a84d28fbcd971cbd10057815d1f774c45ba3d88 Mon Sep 17 00:00:00 2001 From: Alexey Alter-Pesotskiy Date: Mon, 30 Sep 2024 15:08:22 +0100 Subject: [PATCH 17/24] [CI] Improvements (#613) --- .github/workflows/release-publish.yml | 4 ---- fastlane/Fastfile | 7 ++++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml index 2d2a2deea..0d42daa8a 100644 --- a/.github/workflows/release-publish.yml +++ b/.github/workflows/release-publish.yml @@ -1,10 +1,6 @@ name: "Publish new release" on: - push: - branches: - - main - workflow_dispatch: jobs: diff --git a/fastlane/Fastfile b/fastlane/Fastfile index e7bd15b36..855ee8815 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -96,6 +96,11 @@ end lane :merge_release do |options| merge_release_to_main(author: options[:author]) + sh('gh workflow run release-publish.yml --ref main') +end + +lane :merge_main do + merge_main_to_develop end desc "Publish a new release to GitHub and CocoaPods" @@ -122,7 +127,7 @@ lane :publish_release do |options| update_spm(version: release_version) - merge_main_to_develop + merge_main end private_lane :appstore_api_key do From f73f4361d9fdafeae27e5908dfe600e68fa7a829 Mon Sep 17 00:00:00 2001 From: Alexey Alter-Pesotskiy Date: Mon, 30 Sep 2024 17:24:02 +0100 Subject: [PATCH 18/24] [CI] Remove the merge of main to develop from the pipeline and do it manually --- fastlane/Fastfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 855ee8815..240212be1 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -126,8 +126,6 @@ lane :publish_release do |options| ) update_spm(version: release_version) - - merge_main end private_lane :appstore_api_key do From 6e1c0a9259abc8cc78d6dd9135c5fd66a2520bdc Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Wed, 2 Oct 2024 00:24:07 +0100 Subject: [PATCH 19/24] Change branch to develop --- StreamChatSwiftUI.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/StreamChatSwiftUI.xcodeproj/project.pbxproj b/StreamChatSwiftUI.xcodeproj/project.pbxproj index b10457d55..89ba62b3c 100644 --- a/StreamChatSwiftUI.xcodeproj/project.pbxproj +++ b/StreamChatSwiftUI.xcodeproj/project.pbxproj @@ -3720,8 +3720,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/GetStream/stream-chat-swift.git"; requirement = { - kind = revision; - revision = 12aa7994b834d352423b2b1670cfe0c4b2082cc7; + branch = develop; + kind = branch; }; }; E3A1C01A282BAC66002D1E26 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { From d7bdf433cf1ea03aa179e49529c8b8dea3dc53a6 Mon Sep 17 00:00:00 2001 From: Martin Mitrevski Date: Wed, 2 Oct 2024 13:42:10 +0200 Subject: [PATCH 20/24] Made replacesMessageSent open in TwoStepMentionCommand (#615) --- .../InstantCommands/TwoStepMentionCommand.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Composer/Suggestions/InstantCommands/TwoStepMentionCommand.swift b/Sources/StreamChatSwiftUI/ChatChannel/Composer/Suggestions/InstantCommands/TwoStepMentionCommand.swift index dd544a9a8..cfdb9719d 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Composer/Suggestions/InstantCommands/TwoStepMentionCommand.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Composer/Suggestions/InstantCommands/TwoStepMentionCommand.swift @@ -40,7 +40,7 @@ open class TwoStepMentionCommand: CommandHandler { self.displayInfo = displayInfo } - public func canHandleCommand(in text: String, caretLocation: Int) -> ComposerCommand? { + open func canHandleCommand(in text: String, caretLocation: Int) -> ComposerCommand? { if text == id { return ComposerCommand( id: id, @@ -59,7 +59,7 @@ open class TwoStepMentionCommand: CommandHandler { } } - public func handleCommand( + open func handleCommand( for text: Binding, selectedRangeLocation: Binding, command: Binding, @@ -84,11 +84,11 @@ open class TwoStepMentionCommand: CommandHandler { selectedRangeLocation.wrappedValue = newCaretLocation } - public func canBeExecuted(composerCommand: ComposerCommand) -> Bool { + open func canBeExecuted(composerCommand: ComposerCommand) -> Bool { selectedUser != nil } - public func commandHandler(for command: ComposerCommand) -> CommandHandler? { + open func commandHandler(for command: ComposerCommand) -> CommandHandler? { if let selectedUser = selectedUser, command.typingSuggestion.text != "\(mentionSymbol)\(selectedUser.mentionText)" { self.selectedUser = nil @@ -96,7 +96,7 @@ open class TwoStepMentionCommand: CommandHandler { return command.id == id ? self : nil } - public func showSuggestions( + open func showSuggestions( for command: ComposerCommand ) -> Future { if selectedUser != nil { @@ -126,7 +126,7 @@ open class TwoStepMentionCommand: CommandHandler { return mentionsCommandHandler.showSuggestions(for: updated) } - public var replacesMessageSent: Bool { + open var replacesMessageSent: Bool { true } From ed144347b688f22994e24de51e7b72ed43888763 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:56:57 +0000 Subject: [PATCH 21/24] Bump webrick from 1.8.1 to 1.8.2 (#614) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 64253ce3f..9a4ebde82 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -396,7 +396,7 @@ GEM concurrent-ruby (~> 1.0) uber (0.1.0) unicode-display_width (2.5.0) - webrick (1.8.1) + webrick (1.8.2) word_wrap (1.0.0) xcinvoke (0.3.0) liferaft (~> 0.0.6) From 20a2d4afa9e816f03dc8bc44d6bbb3c92ff29e70 Mon Sep 17 00:00:00 2001 From: Toomas Vahter Date: Thu, 3 Oct 2024 10:36:37 +0300 Subject: [PATCH 22/24] Updated StreamChat dependency to 4.64.0 (#616) --- Package.swift | 2 +- StreamChatSwiftUI-XCFramework.podspec | 2 +- StreamChatSwiftUI.podspec | 2 +- StreamChatSwiftUI.xcodeproj/project.pbxproj | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Package.swift b/Package.swift index 44ef9bf45..74df90fef 100644 --- a/Package.swift +++ b/Package.swift @@ -16,7 +16,7 @@ let package = Package( ) ], dependencies: [ - .package(url: "https://github.com/GetStream/stream-chat-swift.git", from: "4.63.0"), + .package(url: "https://github.com/GetStream/stream-chat-swift.git", from: "4.64.0"), ], targets: [ .target( diff --git a/StreamChatSwiftUI-XCFramework.podspec b/StreamChatSwiftUI-XCFramework.podspec index 9e2e00999..654552ae0 100644 --- a/StreamChatSwiftUI-XCFramework.podspec +++ b/StreamChatSwiftUI-XCFramework.podspec @@ -19,7 +19,7 @@ Pod::Spec.new do |spec| spec.framework = 'Foundation', 'UIKit', 'SwiftUI' - spec.dependency 'StreamChat-XCFramework', '~> 4.63.0' + spec.dependency 'StreamChat-XCFramework', '~> 4.64.0' spec.cocoapods_version = '>= 1.11.0' end diff --git a/StreamChatSwiftUI.podspec b/StreamChatSwiftUI.podspec index 52980009a..4da618587 100644 --- a/StreamChatSwiftUI.podspec +++ b/StreamChatSwiftUI.podspec @@ -19,5 +19,5 @@ Pod::Spec.new do |spec| spec.framework = 'Foundation', 'UIKit', 'SwiftUI' - spec.dependency 'StreamChat', '~> 4.63.0' + spec.dependency 'StreamChat', '~> 4.64.0' end diff --git a/StreamChatSwiftUI.xcodeproj/project.pbxproj b/StreamChatSwiftUI.xcodeproj/project.pbxproj index 89ba62b3c..e6a6ac9e2 100644 --- a/StreamChatSwiftUI.xcodeproj/project.pbxproj +++ b/StreamChatSwiftUI.xcodeproj/project.pbxproj @@ -3720,8 +3720,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/GetStream/stream-chat-swift.git"; requirement = { - branch = develop; - kind = branch; + kind = upToNextMajorVersion; + minimumVersion = 4.64.0; }; }; E3A1C01A282BAC66002D1E26 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { From daa05d6d5a0f670f29d6d73e2afb3350240797d7 Mon Sep 17 00:00:00 2001 From: Toomas Vahter Date: Thu, 3 Oct 2024 12:12:06 +0300 Subject: [PATCH 23/24] Channel was sometimes not selected when setting selectedChannelId (#611) --------- Co-authored-by: Martin Mitrevski --- CHANGELOG.md | 1 + .../ChatChannelListViewModel.swift | 40 ++++++++++---- .../StreamChatModel.xcdatamodel/contents | 24 +++++++-- .../ChatChannelListViewModel_Tests.swift | 54 +++++++++++++++++++ 4 files changed, 105 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4107f8bd0..c651cc4ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Rare crash when accessing frame of the view [#607](https://github.com/GetStream/stream-chat-swiftui/pull/607) - `ChatChannelListView` navigation did not trigger when using a custom container and its body reloaded [#609](https://github.com/GetStream/stream-chat-swiftui/pull/609) - Channel was sometimes not marked as read when tapping the x on the unread message pill in the message list [#610](https://github.com/GetStream/stream-chat-swiftui/pull/610) +- Channel was sometimes not selected if `ChatChannelViewModel.selectedChannelId` was set to a channel created a moments ago [#611](https://github.com/GetStream/stream-chat-swiftui/pull/611) - Fix the poll vote progress view not having full width when the Poll is closed [#612](https://github.com/GetStream/stream-chat-swiftui/pull/612) - Fix the last vote author not accurate in the channel preview [#612](https://github.com/GetStream/stream-chat-swiftui/pull/612) diff --git a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift index 2265d8a41..1fe060e30 100644 --- a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift @@ -2,6 +2,7 @@ // Copyright © 2024 Stream.io Inc. All rights reserved. // +import Combine import Foundation import StreamChat import SwiftUI @@ -117,7 +118,13 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController public var isSearching: Bool { !searchText.isEmpty } - + + /// Creates a view model for the `ChatChannelListView`. + /// + /// - Parameters: + /// - channelListController: A controller providing the list of channels. If nil, a controller with default `ChannelListQuery` is created. + /// - selectedChannelId: The id of a channel to select. If the channel is not part of the channel list query, no channel is selected. + /// Consider using ``ChatChannelScreen`` for presenting channels what might not be part of the initial page of channels. public init( channelListController: ChatChannelListController? = nil, selectedChannelId: String? = nil @@ -265,15 +272,30 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController } } + private var deeplinkCancellable: AnyCancellable? + + /// Checks for currently loaded channels for opening a channel with id. private func checkForDeeplinks() { - if let selectedChannelId = selectedChannelId, - let channelId = try? ChannelId(cid: selectedChannelId) { - let chatController = chatClient.channelController( - for: channelId, - messageOrdering: .topToBottom - ) - selectedChannel = chatController.channel?.channelSelectionInfo - self.selectedChannelId = nil + guard let selectedChannelId else { return } + do { + let channelId = try ChannelId(cid: selectedChannelId) + if let channel = channels.first(where: { $0.cid == channelId }) { + selectedChannel = channel.channelSelectionInfo + } else { + // Start waiting for a channel list change because the channel is not part of the loaded list + deeplinkCancellable = $channels + .map { Array($0) } + .compactMap { channels in + channels.first(where: { $0.cid == channelId }) + } + .map(\.channelSelectionInfo) + .sink { [weak self] selection in + self?.deeplinkCancellable = nil + self?.selectedChannel = selection + } + } + } catch { + log.error("Failed to select a channel with id \(selectedChannelId) (\(error))") } } diff --git a/StreamChatSwiftUITests/Infrastructure/Shared/StreamChatModel.xcdatamodeld/StreamChatModel.xcdatamodel/contents b/StreamChatSwiftUITests/Infrastructure/Shared/StreamChatModel.xcdatamodeld/StreamChatModel.xcdatamodel/contents index 3d988576e..aca907f81 100644 --- a/StreamChatSwiftUITests/Infrastructure/Shared/StreamChatModel.xcdatamodeld/StreamChatModel.xcdatamodel/contents +++ b/StreamChatSwiftUITests/Infrastructure/Shared/StreamChatModel.xcdatamodeld/StreamChatModel.xcdatamodel/contents @@ -1,9 +1,11 @@ - + + + @@ -20,6 +22,7 @@ + @@ -36,10 +39,12 @@ + + @@ -132,6 +137,7 @@ + @@ -139,6 +145,7 @@ + @@ -323,10 +330,10 @@ - + - + @@ -345,7 +352,7 @@ - + @@ -372,9 +379,16 @@ + + + + + + + @@ -434,7 +448,7 @@ - + diff --git a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift index 3f6fde345..194d4fe89 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift @@ -4,6 +4,7 @@ @testable import StreamChat @testable import StreamChatSwiftUI +@testable import StreamChatTestTools import XCTest class ChatChannelListViewModel_Tests: StreamChatTestCase { @@ -270,6 +271,59 @@ class ChatChannelListViewModel_Tests: StreamChatTestCase { // Then XCTAssert(viewModel.hideTabBar == true) } + + func test_channelListVM_deeplinkToExistingChannel() throws { + // Given + let channels = (0..<3).map { ChatChannel.mock(cid: ChannelId(type: .messaging, id: "\($0)")) } + let channelListController = makeChannelListController(channels: channels) + let selectedId = channels[1].cid + let viewModel = ChatChannelListViewModel( + channelListController: channelListController, + selectedChannelId: selectedId.rawValue + ) + + // Then + let expectation = XCTestExpectation(description: "SelectedChannel") + let cancellable = viewModel.$selectedChannel + .filter { $0?.channel.cid == selectedId } + .sink { _ in + expectation.fulfill() + } + // Resume synchronize() + chatClient.mockAPIClient.test_simulateResponse(.success(ChannelListPayload(channels: []))) + wait(for: [expectation], timeout: defaultTimeout) + cancellable.cancel() + } + + func test_channelListVM_deeplinkToIncomingChannel() { + // Given + let channels = (0..<3).map { ChatChannel.mock(cid: ChannelId(type: .messaging, id: "\($0)")) } + let channelListController = makeChannelListController(channels: channels) + let selectedId = ChannelId(type: .messaging, id: "3") + let viewModel = ChatChannelListViewModel( + channelListController: channelListController, + selectedChannelId: selectedId.rawValue + ) + + // When + let expectation = XCTestExpectation(description: "SelectedChannel") + let cancellable = viewModel.$selectedChannel + .filter { $0?.channel.cid == selectedId } + .sink { _ in + expectation.fulfill() + } + let insertedChannel = ChatChannel.mock(cid: selectedId) + channelListController.simulate( + channels: channels + [insertedChannel], + changes: [.insert(insertedChannel, index: IndexPath(item: 0, section: 0))] + ) + // Resume synchronize() + chatClient.mockAPIClient.test_simulateResponse(.success(ChannelListPayload(channels: []))) + + // Then + wait(for: [expectation], timeout: defaultTimeout) + cancellable.cancel() + } // MARK: - private From ab2ecce4becfb0cb4915bfdb10f2491c2e07f796 Mon Sep 17 00:00:00 2001 From: Stream Bot Date: Thu, 3 Oct 2024 09:27:36 +0000 Subject: [PATCH 24/24] Bump 4.64.0 --- CHANGELOG.md | 5 +++++ README.md | 2 +- .../Generated/SystemEnvironment+Version.swift | 2 +- Sources/StreamChatSwiftUI/Info.plist | 2 +- StreamChatSwiftUI-XCFramework.podspec | 2 +- StreamChatSwiftUI.podspec | 2 +- StreamChatSwiftUIArtifacts.json | 2 +- 7 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c651cc4ba..837d4dd65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). # Upcoming +### 🔄 Changed + +# [4.64.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.64.0) +_October 03, 2024_ + ### 🔄 Changed - Improves Poll voting UX by making it possible to tap on the whole option as well [#612](https://github.com/GetStream/stream-chat-swiftui/pull/612) ### 🐞 Fixed diff --git a/README.md b/README.md index 2e09c4a01..0ee588e56 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@