diff --git a/CHANGELOG.md b/CHANGELOG.md index 134e27da..02eb210d 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 +- Fix openChannel not working when searching or another chat shown [#975](https://github.com/GetStream/stream-chat-swiftui/pull/975) # [4.89.1](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.89.1) _September 23, 2025_ diff --git a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift index d97b1769..d799d56c 100644 --- a/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift @@ -212,6 +212,14 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController } } } + + if isSearching { + searchText = "" + } + + if selectedChannel != nil { + selectedChannel = nil + } loadUntilFound() } diff --git a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift index 2082d373..ba358e7f 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannelList/ChatChannelListViewModel_Tests.swift @@ -491,6 +491,47 @@ class ChatChannelListViewModel_Tests: StreamChatTestCase { } wait(for: [expectation], timeout: 1.0) } + + func test_openChannel_whenSearching_shouldClearSearchState() { + // Given + let existingChannel = ChatChannel.mockDMChannel() + let channelListController = makeChannelListController(channels: [existingChannel]) + let viewModel = ChatChannelListViewModel( + channelListController: channelListController, + selectedChannelId: nil, + searchType: .messages + ) + viewModel.searchText = "query" + XCTAssertTrue(viewModel.isSearching, "Precondition failed: isSearching should be true before opening a channel") + + // When + viewModel.openChannel(with: existingChannel.cid) + + // Then + XCTAssertFalse(viewModel.isSearching, "isSearching should be false after opening a channel") + XCTAssertEqual(viewModel.searchText, "", "searchText should be cleared after opening a channel") + XCTAssertNil(viewModel.messageSearchController, "Message search controller should be cleared when search ends") + XCTAssertNil(viewModel.channelListSearchController, "Channel search controller should be cleared when search ends") + } + + func test_openChannel_whenSelectedChannelIsSet_shouldClearSelectedChannel() { + // Given + let existingChannel = ChatChannel.mockDMChannel() + let targetChannel = ChatChannel.mockDMChannel() // not in the list + let channelListController = makeChannelListController(channels: [existingChannel]) + let viewModel = ChatChannelListViewModel( + channelListController: channelListController, + selectedChannelId: nil + ) + viewModel.selectedChannel = existingChannel.channelSelectionInfo + XCTAssertNotNil(viewModel.selectedChannel, "Precondition failed: selectedChannel should be set before opening a channel") + + // When + viewModel.openChannel(with: targetChannel.cid) + + // Then + XCTAssertNil(viewModel.selectedChannel, "selectedChannel should be cleared immediately when opening another channel") + } // MARK: - private