From 9d0945aa03307602addf31b8037bbbd9eb21010f Mon Sep 17 00:00:00 2001 From: Stream Bot Date: Fri, 7 Nov 2025 18:25:40 +0000 Subject: [PATCH 1/8] Update release version to snapshot --- .../StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift b/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift index 7f2ac48c..7b05bf77 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.92.0" + public static let version: String = "4.93.0-SNAPSHOT" } From 57261bb8b65177c3cc8297e3b8d6cf2ff8decd75 Mon Sep 17 00:00:00 2001 From: Alexey Alter-Pesotskiy Date: Mon, 10 Nov 2025 12:21:43 +0000 Subject: [PATCH 2/8] [CI] Bump xcsize plugin version (#1045) --- Gemfile.lock | 8 ++++---- fastlane/Pluginfile | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 300196b5..277f76f8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -211,8 +211,8 @@ GEM fastlane-plugin-stream_actions (0.3.101) xctest_list (= 1.2.1) fastlane-plugin-versioning (0.7.1) - fastlane-plugin-xcsize (1.1.0) - xcsize (= 1.1.0) + fastlane-plugin-xcsize (1.2.0) + xcsize (= 1.2.0) fastlane-sirp (1.0.0) sysrandom (~> 1.0) ffi (1.17.2) @@ -415,7 +415,7 @@ GEM rouge (~> 3.28.0) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) - xcsize (1.1.0) + xcsize (1.2.0) commander (>= 4.6, < 6.0) xctest_list (1.2.1) @@ -432,7 +432,7 @@ DEPENDENCIES fastlane-plugin-sonarcloud_metric_kit fastlane-plugin-stream_actions (= 0.3.101) fastlane-plugin-versioning - fastlane-plugin-xcsize (= 1.1.0) + fastlane-plugin-xcsize (= 1.2.0) json lefthook plist diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile index 772a0573..cda52658 100644 --- a/fastlane/Pluginfile +++ b/fastlane/Pluginfile @@ -6,4 +6,4 @@ gem 'fastlane-plugin-versioning' gem 'fastlane-plugin-sonarcloud_metric_kit' gem 'fastlane-plugin-create_xcframework' gem 'fastlane-plugin-stream_actions', '0.3.101' -gem 'fastlane-plugin-xcsize', '1.1.0' +gem 'fastlane-plugin-xcsize', '1.2.0' From 62d831f5884dbc8f8cdb4f102f06b64c6e06a852 Mon Sep 17 00:00:00 2001 From: Martin Mitrevski Date: Tue, 11 Nov 2025 15:59:51 +0100 Subject: [PATCH 3/8] Add init method with view model for the message list (#1046) --- .../MessageList/MessageListView.swift | 43 ++++++++++++++ .../ChatChannel/MessageListView_Tests.swift | 56 ++++++++++++++++++ ...geListView_viewModelInit_noReactions.1.png | Bin 0 -> 70246 bytes ...stView_viewModelInit_unreadIndicator.1.png | Bin 0 -> 78020 bytes ...ListView_viewModelInit_withReactions.1.png | Bin 0 -> 74024 bytes 5 files changed, 99 insertions(+) create mode 100644 StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_messageListView_viewModelInit_noReactions.1.png create mode 100644 StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_messageListView_viewModelInit_unreadIndicator.1.png create mode 100644 StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_messageListView_viewModelInit_withReactions.1.png diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift index 2bfe8a96..c2c0e6d0 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift @@ -114,6 +114,49 @@ public struct MessageListView: View, KeyboardReadable { ) } } + + public init( + factory: Factory = DefaultViewFactory.shared, + channel: ChatChannel, + viewModel: ChatChannelViewModel, + onLongPress: @escaping (MessageDisplayInfo) -> Void = { _ in } + ) { + self.init( + factory: factory, + channel: channel, + messages: viewModel.messages, + messagesGroupingInfo: viewModel.messagesGroupingInfo, + scrolledId: Binding( + get: { viewModel.scrolledId }, + set: { viewModel.scrolledId = $0 } + ), + showScrollToLatestButton: Binding( + get: { viewModel.showScrollToLatestButton }, + set: { viewModel.showScrollToLatestButton = $0 } + ), + quotedMessage: Binding( + get: { viewModel.quotedMessage }, + set: { viewModel.quotedMessage = $0 } + ), + currentDateString: viewModel.currentDateString, + listId: viewModel.listId, + isMessageThread: viewModel.isMessageThread, + shouldShowTypingIndicator: viewModel.shouldShowTypingIndicator, + scrollPosition: Binding( + get: { viewModel.scrollPosition }, + set: { viewModel.scrollPosition = $0 } + ), + loadingNextMessages: viewModel.loadingNextMessages, + firstUnreadMessageId: Binding( + get: { viewModel.firstUnreadMessageId }, + set: { viewModel.firstUnreadMessageId = $0 } + ), + onMessageAppear: viewModel.handleMessageAppear(index:scrollDirection:), + onScrollToBottom: viewModel.scrollToLastMessage, + onLongPress: onLongPress, + onJumpToMessage: viewModel.jumpToMessage(messageId:) + ) + } public var body: some View { ZStack { diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift index d11c2fc4..b322c8bb 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift @@ -98,6 +98,40 @@ class MessageListView_Tests: StreamChatTestCase { assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) } + // MARK: - Init with ChatChannelViewModel snapshot tests + + func test_messageListView_viewModelInit_withReactions() { + // Given + let channel = ChatChannel.mockDMChannel(config: .init(reactionsEnabled: true)) + let view = makeMessageListViewWithViewModel(channel: channel, messages: [.mock(id: .unique, cid: channel.cid, text: "Hello", author: .mock(id: .unique), reactionScores: [MessageReactionType(rawValue: "like"): 1])]) + .applyDefaultSize() + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + + func test_messageListView_viewModelInit_noReactions() { + // Given + let channel = ChatChannel.mockDMChannel(config: .init(reactionsEnabled: false)) + let view = makeMessageListViewWithViewModel(channel: channel, messages: [.mock(id: .unique, cid: channel.cid, text: "Hello", author: .mock(id: .unique))]) + .applyDefaultSize() + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + + func test_messageListView_viewModelInit_unreadIndicator() { + // Given + var channel = ChatChannel.mockDMChannel() + // Set unread count on the channel + channel = ChatChannel.mockDMChannel(unreadCount: .mock(messages: 2)) + let view = makeMessageListViewWithViewModel(channel: channel, messages: [.mock(id: .unique, cid: channel.cid, text: "Unread 1", author: .mock(id: .unique))]) + .applyDefaultSize() + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + // MARK: - private func makeMessageListView( @@ -138,4 +172,26 @@ class MessageListView_Tests: StreamChatTestCase { return messageListView } + + private func makeMessageListViewWithViewModel( + channel: ChatChannel, + messages: [ChatMessage] + ) -> MessageListView { + // Create a mock channel controller seeded with channel and messages + let controller = ChatChannelTestHelpers.makeChannelController( + chatClient: chatClient, + chatChannel: channel, + messages: messages + ) + + // Build the view model + let viewModel = ChatChannelViewModel(channelController: controller) + + // Return the view using the new initializer + return MessageListView( + factory: DefaultViewFactory.shared, + channel: channel, + viewModel: viewModel + ) + } } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_messageListView_viewModelInit_noReactions.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_messageListView_viewModelInit_noReactions.1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ffa0e3c07a82cbec2a8210655c73991048dbecf GIT binary patch literal 70246 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 Y5-}IFeEyX74Dj<*N=`Cc{MGya0}ipJy#N3J literal 0 HcmV?d00001 diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_messageListView_viewModelInit_unreadIndicator.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageListView_Tests/test_messageListView_viewModelInit_unreadIndicator.1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d864f2944184c90fa5a04073ac9abb4ce3b52fd GIT binary patch literal 78020 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 literal 0 HcmV?d00001 From dfcd961f5452554d0b420db3fb7d3430f63c561e Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 13 Nov 2025 12:39:41 +0000 Subject: [PATCH 4/8] Expose `AddedVoiceRecordingsView` + Expose composer attachments functions (#1049) * Make the AddedVoiceRecordingsView public (#1035) * Make the AddedVoiceRecordingsView public * Make the initializer of FilePickerView public * Add `updateAddedAssets` func * Update CHANGELOG.md --------- Co-authored-by: Lucas Nguyen --- CHANGELOG.md | 5 ++++- .../ChatChannel/Composer/FilePickerView.swift | 4 ++++ .../ChatChannel/Composer/MessageComposerViewModel.swift | 4 ++++ .../Composer/VoiceRecording/AddedVoiceRecordingsView.swift | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1a1d05..c270ff3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). # Upcoming -### 🔄 Changed +### ✅ Added +- Expose `AddedVoiceRecordingsView` [#1049](https://github.com/GetStream/stream-chat-swiftui/pull/1049) +- Expose `FilePickerView.init(fileURLs:)` [#1049](https://github.com/GetStream/stream-chat-swiftui/pull/1049) +- Add `MessageComposerViewModel.updateAddedAssets()` [#1049](https://github.com/GetStream/stream-chat-swiftui/pull/1049) # [4.92.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.92.0) _November 07, 2025_ diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Composer/FilePickerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/Composer/FilePickerView.swift index 2604ef2a..ced4647e 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Composer/FilePickerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Composer/FilePickerView.swift @@ -9,6 +9,10 @@ import UniformTypeIdentifiers public struct FilePickerView: UIViewControllerRepresentable { @Injected(\.chatClient) var client @Binding var fileURLs: [URL] + + public init(fileURLs: Binding<[URL]>) { + self._fileURLs = fileURLs + } public func makeUIViewController(context: Context) -> UIDocumentPickerViewController { let picker = UIDocumentPickerViewController(forOpeningContentTypes: openingContentTypes) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Composer/MessageComposerViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/Composer/MessageComposerViewModel.swift index 545b5a57..813e7796 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Composer/MessageComposerViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Composer/MessageComposerViewModel.swift @@ -874,6 +874,10 @@ open class MessageComposerViewModel: ObservableObject { return checkAttachmentSize(with: url) } + public func updateAddedAssets(_ assets: [AddedAsset]) { + addedAssets = assets + } + private func checkAttachmentSize(with url: URL?) -> Bool { guard let url = url else { return true } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Composer/VoiceRecording/AddedVoiceRecordingsView.swift b/Sources/StreamChatSwiftUI/ChatChannel/Composer/VoiceRecording/AddedVoiceRecordingsView.swift index e38726c5..88850d6a 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Composer/VoiceRecording/AddedVoiceRecordingsView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Composer/VoiceRecording/AddedVoiceRecordingsView.swift @@ -5,7 +5,7 @@ import StreamChat import SwiftUI -struct AddedVoiceRecordingsView: View { +public struct AddedVoiceRecordingsView: View { @Injected(\.colors) private var colors @Injected(\.utils) private var utils From 1e35bca8d065f66324410f2821b06446e60252ea Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 14 Nov 2025 11:23:19 +0000 Subject: [PATCH 5/8] Fix Throttler crash in `ChatChannelViewModel.handleMessageAppear()` (#1050) --- CHANGELOG.md | 4 +++ .../ChatChannel/ChatChannelViewModel.swift | 6 ++--- .../ChatChannelViewModel_Tests.swift | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c270ff3d..a7bb67d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Expose `FilePickerView.init(fileURLs:)` [#1049](https://github.com/GetStream/stream-chat-swiftui/pull/1049) - Add `MessageComposerViewModel.updateAddedAssets()` [#1049](https://github.com/GetStream/stream-chat-swiftui/pull/1049) +### 🐞 Fixed +- Fix `Throttler` crash in `ChatChannelViewModel.handleMessageAppear()` [#1050](https://github.com/GetStream/stream-chat-swiftui/pull/1050) +- Remove unnecessary channel query call when leaving the channel view in a mid-page [#1050](https://github.com/GetStream/stream-chat-swiftui/pull/1050) + # [4.92.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.92.0) _November 07, 2025_ diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift index 5b40308e..5e5d90c5 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift @@ -50,7 +50,7 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { private var channelName = "" private var onlineIndicatorShown = false private var lastReadMessageId: String? - var throttler = Throttler(interval: 3, broadcastLatestEvent: true) + var throttler = Throttler(interval: 3, broadcastLatestEvent: true, queue: .main) public var channelController: ChatChannelController public var messageController: ChatMessageController? @@ -833,14 +833,12 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { } deinit { + throttler.cancel() messageCachingUtils.clearCache() if messageController == nil { utils.channelControllerFactory.clearCurrentController() cleanupAudioPlayer() ImageCache.shared.trim(toCost: utils.messageListConfig.cacheSizeOnChatDismiss) - if !channelDataSource.hasLoadedAllNextMessages { - channelDataSource.loadFirstPage { _ in } - } } } } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelViewModel_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelViewModel_Tests.swift index ace127d7..8ac70038 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelViewModel_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelViewModel_Tests.swift @@ -772,6 +772,31 @@ class ChatChannelViewModel_Tests: StreamChatTestCase { XCTAssertEqual(0, channelController.markReadCallCount) } + func test_chatChannelVM_handleMessageAppear_doesNotCrashWhenDeallocated() { + let message = ChatMessage.mock() + let channelController = makeChannelController(messages: [message]) + channelController.hasLoadedAllNextMessages_mock = nil + channelController.channel_mock = .mock( + cid: .unique, + unreadCount: ChannelUnreadCount(messages: 1, mentions: 0) + ) + + for _ in 0..<1000 { + autoreleasepool { + let viewModel = ChatChannelViewModel(channelController: channelController) + viewModel.handleMessageAppear(index: 0, scrollDirection: .down) + viewModel.handleMessageAppear(index: 0, scrollDirection: .down) + viewModel.handleMessageAppear(index: 0, scrollDirection: .down) + viewModel.handleMessageAppear(index: 0, scrollDirection: .down) + viewModel.handleMessageAppear(index: 0, scrollDirection: .down) + viewModel.handleMessageAppear(index: 0, scrollDirection: .down) + } + } + + // Then - Should not crash + XCTAssert(true) + } + // MARK: - highlightMessage Tests func test_highlightMessage_highlightsWhenSkipHighlightMessageIdIsNotSet() { From c18253b02df74e58a6d4974867bb2a6a8f52cf45 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 17 Nov 2025 10:53:57 +0000 Subject: [PATCH 6/8] Fix crash when force unwrapping messageDisplayInfo in ChatChannelView (#1052) * Fix crash when force unwrapping messageDisplayInfo in ChatChannelView * Update CHANGELOG.md --- CHANGELOG.md | 1 + .../ChatChannel/ChatChannelView.swift | 2 +- .../ChatChannel/ChatChannelView_Tests.swift | 72 +++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7bb67d6..8c81aa71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### 🐞 Fixed - Fix `Throttler` crash in `ChatChannelViewModel.handleMessageAppear()` [#1050](https://github.com/GetStream/stream-chat-swiftui/pull/1050) - Remove unnecessary channel query call when leaving the channel view in a mid-page [#1050](https://github.com/GetStream/stream-chat-swiftui/pull/1050) +- Fix crash when force unwrapping `messageDisplayInfo` in `ChatChannelView` [#1052](https://github.com/GetStream/stream-chat-swiftui/pull/1052) # [4.92.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.92.0) _November 07, 2025_ diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift index 17cb5476..1e4ee9c3 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift @@ -145,7 +145,7 @@ public struct ChatChannelView: View, KeyboardReadable { .opacity(0) // Fixes showing accessibility button shape } .overlay( - viewModel.reactionsShown ? + viewModel.currentSnapshot != nil && messageDisplayInfo != nil && viewModel.reactionsShown ? factory.makeReactionsOverlayView( channel: channel, currentSnapshot: viewModel.currentSnapshot!, diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelView_Tests.swift index 8ee7f36e..530106b7 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelView_Tests.swift @@ -167,4 +167,76 @@ class ChatChannelView_Tests: StreamChatTestCase { // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) } + + // MARK: - Reactions Overlay Tests + + func test_chatChannelView_doesNotCrash_whenCurrentSnapshotIsNil_andReactionsShownIsTrue() { + // Given + let controller = ChatChannelController_Mock.mock( + channelQuery: .init(cid: .unique), + channelListQuery: nil, + client: chatClient + ) + let mockChannel = ChatChannel.mock(cid: .unique, name: "Test channel") + let message = ChatMessage.mock( + id: .unique, + cid: mockChannel.cid, + text: "Test message", + author: .mock(id: .unique, name: "User") + ) + controller.simulateInitial(channel: mockChannel, messages: [message], state: .remoteDataFetched) + + let viewModel = ChatChannelViewModel(channelController: controller) + + // When + viewModel.currentSnapshot = nil + viewModel.reactionsShown = true + + let view = ChatChannelView( + viewFactory: DefaultViewFactory.shared, + viewModel: viewModel, + channelController: controller + ) + + // Then - Should not crash when rendering + let hostingController = UIHostingController(rootView: view) + XCTAssertNotNil(hostingController.view) + XCTAssertNil(viewModel.currentSnapshot) + XCTAssertTrue(viewModel.reactionsShown) + } + + func test_chatChannelView_doesNotCrash_whenMessageDisplayInfoIsNil_andReactionsShownIsTrue() { + // Given + let controller = ChatChannelController_Mock.mock( + channelQuery: .init(cid: .unique), + channelListQuery: nil, + client: chatClient + ) + let mockChannel = ChatChannel.mock(cid: .unique, name: "Test channel") + let message = ChatMessage.mock( + id: .unique, + cid: mockChannel.cid, + text: "Test message", + author: .mock(id: .unique, name: "User") + ) + controller.simulateInitial(channel: mockChannel, messages: [message], state: .remoteDataFetched) + + let viewModel = ChatChannelViewModel(channelController: controller) + + // When + viewModel.showReactionOverlay(for: AnyView(EmptyView())) + // messageDisplayInfo remains nil (not set) + + let view = ChatChannelView( + viewFactory: DefaultViewFactory.shared, + viewModel: viewModel, + channelController: controller + ) + + // Then - Should not crash when rendering + let hostingController = UIHostingController(rootView: view) + XCTAssertNotNil(hostingController.view) + XCTAssertNotNil(viewModel.currentSnapshot) + XCTAssertTrue(viewModel.reactionsShown) + } } From 690e8f1f4ed3dad00486e9283844e074d24e5a0c Mon Sep 17 00:00:00 2001 From: Alexey Alter-Pesotskiy Date: Tue, 18 Nov 2025 16:28:43 +0000 Subject: [PATCH 7/8] Update StreamChat dependency to 4.93.0 (#1054) --- Package.swift | 2 +- StreamChatSwiftUI-XCFramework.podspec | 2 +- StreamChatSwiftUI.podspec | 2 +- StreamChatSwiftUI.xcodeproj/project.pbxproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index ddd1fb18..28246de0 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.92.0") + .package(url: "https://github.com/GetStream/stream-chat-swift.git", from: "4.93.0") ], targets: [ .target( diff --git a/StreamChatSwiftUI-XCFramework.podspec b/StreamChatSwiftUI-XCFramework.podspec index bef1bf4d..4d97bfa8 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.92.0' + spec.dependency 'StreamChat-XCFramework', '~> 4.93.0' spec.cocoapods_version = '>= 1.11.0' end diff --git a/StreamChatSwiftUI.podspec b/StreamChatSwiftUI.podspec index 1f38e2e6..d5d64b5a 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.92.0' + spec.dependency 'StreamChat', '~> 4.93.0' end diff --git a/StreamChatSwiftUI.xcodeproj/project.pbxproj b/StreamChatSwiftUI.xcodeproj/project.pbxproj index cb726deb..9eb15a08 100644 --- a/StreamChatSwiftUI.xcodeproj/project.pbxproj +++ b/StreamChatSwiftUI.xcodeproj/project.pbxproj @@ -3946,7 +3946,7 @@ repositoryURL = "https://github.com/GetStream/stream-chat-swift.git"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 4.92.0; + minimumVersion = 4.93.0; }; }; E3A1C01A282BAC66002D1E26 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { From d3116d797dd89881f2d94c9e354bbf826df1b924 Mon Sep 17 00:00:00 2001 From: Stream Bot Date: Tue, 18 Nov 2025 16:51:03 +0000 Subject: [PATCH 8/8] Bump 4.93.0 --- CHANGELOG.md | 5 +++++ .../Generated/SystemEnvironment+Version.swift | 2 +- Sources/StreamChatSwiftUI/Info.plist | 2 +- StreamChatSwiftUI-XCFramework.podspec | 2 +- StreamChatSwiftUI.podspec | 2 +- StreamChatSwiftUIArtifacts.json | 2 +- 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c81aa71..123e67fc 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.93.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.93.0) +_November 18, 2025_ + ### ✅ Added - Expose `AddedVoiceRecordingsView` [#1049](https://github.com/GetStream/stream-chat-swiftui/pull/1049) - Expose `FilePickerView.init(fileURLs:)` [#1049](https://github.com/GetStream/stream-chat-swiftui/pull/1049) diff --git a/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift b/Sources/StreamChatSwiftUI/Generated/SystemEnvironment+Version.swift index 7b05bf77..3265af9b 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.93.0-SNAPSHOT" + public static let version: String = "4.93.0" } diff --git a/Sources/StreamChatSwiftUI/Info.plist b/Sources/StreamChatSwiftUI/Info.plist index 6bc4b9c0..3e93a0a5 100644 --- a/Sources/StreamChatSwiftUI/Info.plist +++ b/Sources/StreamChatSwiftUI/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.92.0 + 4.93.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPhotoLibraryUsageDescription diff --git a/StreamChatSwiftUI-XCFramework.podspec b/StreamChatSwiftUI-XCFramework.podspec index 4d97bfa8..0cf88805 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.92.0' + spec.version = '4.93.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 d5d64b5a..5b25b08f 100644 --- a/StreamChatSwiftUI.podspec +++ b/StreamChatSwiftUI.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'StreamChatSwiftUI' - spec.version = '4.92.0' + spec.version = '4.93.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 59343d47..af7772a8 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","4.64.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.64.0/StreamChatSwiftUI.zip","4.65.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.65.0/StreamChatSwiftUI.zip","4.66.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.66.0/StreamChatSwiftUI.zip","4.67.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.67.0/StreamChatSwiftUI.zip","4.68.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.68.0/StreamChatSwiftUI.zip","4.69.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.69.0/StreamChatSwiftUI.zip","4.70.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.70.0/StreamChatSwiftUI.zip","4.71.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.71.0/StreamChatSwiftUI.zip","4.72.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.72.0/StreamChatSwiftUI.zip","4.73.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.73.0/StreamChatSwiftUI.zip","4.74.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.74.0/StreamChatSwiftUI.zip","4.75.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.75.0/StreamChatSwiftUI.zip","4.76.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.76.0/StreamChatSwiftUI.zip","4.77.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.77.0/StreamChatSwiftUI.zip","4.78.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.78.0/StreamChatSwiftUI.zip","4.79.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.79.0/StreamChatSwiftUI.zip","4.79.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.79.1/StreamChatSwiftUI.zip","4.80.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.80.0/StreamChatSwiftUI.zip","4.81.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.81.0/StreamChatSwiftUI.zip","4.82.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.82.0/StreamChatSwiftUI.zip","4.83.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.83.0/StreamChatSwiftUI.zip","4.84.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.84.0/StreamChatSwiftUI.zip","4.85.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.85.0/StreamChatSwiftUI.zip","4.86.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.86.0/StreamChatSwiftUI.zip","4.87.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.87.0/StreamChatSwiftUI.zip","4.88.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.88.0/StreamChatSwiftUI.zip","4.89.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.89.0/StreamChatSwiftUI.zip","4.89.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.89.1/StreamChatSwiftUI.zip","4.90.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.90.0/StreamChatSwiftUI.zip","4.91.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.91.0/StreamChatSwiftUI.zip","4.92.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.92.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","4.65.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.65.0/StreamChatSwiftUI.zip","4.66.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.66.0/StreamChatSwiftUI.zip","4.67.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.67.0/StreamChatSwiftUI.zip","4.68.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.68.0/StreamChatSwiftUI.zip","4.69.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.69.0/StreamChatSwiftUI.zip","4.70.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.70.0/StreamChatSwiftUI.zip","4.71.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.71.0/StreamChatSwiftUI.zip","4.72.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.72.0/StreamChatSwiftUI.zip","4.73.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.73.0/StreamChatSwiftUI.zip","4.74.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.74.0/StreamChatSwiftUI.zip","4.75.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.75.0/StreamChatSwiftUI.zip","4.76.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.76.0/StreamChatSwiftUI.zip","4.77.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.77.0/StreamChatSwiftUI.zip","4.78.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.78.0/StreamChatSwiftUI.zip","4.79.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.79.0/StreamChatSwiftUI.zip","4.79.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.79.1/StreamChatSwiftUI.zip","4.80.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.80.0/StreamChatSwiftUI.zip","4.81.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.81.0/StreamChatSwiftUI.zip","4.82.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.82.0/StreamChatSwiftUI.zip","4.83.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.83.0/StreamChatSwiftUI.zip","4.84.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.84.0/StreamChatSwiftUI.zip","4.85.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.85.0/StreamChatSwiftUI.zip","4.86.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.86.0/StreamChatSwiftUI.zip","4.87.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.87.0/StreamChatSwiftUI.zip","4.88.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.88.0/StreamChatSwiftUI.zip","4.89.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.89.0/StreamChatSwiftUI.zip","4.89.1":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.89.1/StreamChatSwiftUI.zip","4.90.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.90.0/StreamChatSwiftUI.zip","4.91.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.91.0/StreamChatSwiftUI.zip","4.92.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.92.0/StreamChatSwiftUI.zip","4.93.0":"https://github.com/GetStream/stream-chat-swiftui/releases/download/4.93.0/StreamChatSwiftUI.zip"} \ No newline at end of file