Skip to content

Commit

Permalink
Allow setting searchType dynamically in ChatChannelListViewModel
Browse files Browse the repository at this point in the history
  • Loading branch information
laevandus committed Dec 18, 2024
1 parent 5a1ec9a commit 3e722f7
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

### ✅ Added
- Make `CreatePollView` public [#685](https://github.com/GetStream/stream-chat-swiftui/pull/685)
- Make `ChatChannelListViewModel.searchType` public and observable [#693](https://github.com/GetStream/stream-chat-swiftui/pull/693)
- Allow customizing channel and message search in the `ChatChannelListViewModel` [#XYZ](ADD)
- Allow overriding `ChatChannelListViewModel.performChannelSearch` and `ChatChannelListViewModel.performMessageSearch`
- Make `ChatChannelListViewModel.channelListSearchController` and `ChatChannelListViewModel.messageSearchController` public
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,16 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
}
}

private let searchType: ChannelListSearchType
/// The type for search results.
///
/// Setting a new value will reload search results.
@Published public var searchType: ChannelListSearchType {
didSet {
guard searchType != oldValue else { return }
performSearch()
}
}

/// The channel search controller which should be created only by ``performChannelSearch()``.
public var channelListSearchController: ChatChannelListController?
/// The message search controller which should be created only by ``performMessageSearch()``.
Expand All @@ -116,7 +125,7 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
@Published public var searchText = "" {
didSet {
if searchText != oldValue {
handleSearchTextChange()
performSearch()
}
}
}
Expand Down Expand Up @@ -337,7 +346,7 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
.filter { $0.id != chatClient.currentUserId }
}

private func handleSearchTextChange() {
private func performSearch() {
if searchText.isEmpty {
clearSearchResults()
return
Expand Down Expand Up @@ -393,10 +402,11 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
/// Creates a new message search controller, sets its delegate, and triggers the search operation.
open func performMessageSearch() {
messageSearchController = chatClient.messageSearchController()
messageSearchController?.delegate = self
loadingSearchResults = true
messageSearchController?.search(text: searchText) { [weak self] _ in
self?.loadingSearchResults = false
self?.messageSearchController?.delegate = self
self?.updateMessageSearchResults()
}
}

Expand All @@ -420,7 +430,7 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
}

private func updateMessageSearchResults() {
guard let messageSearchController = messageSearchController else {
guard let messageSearchController, searchType == .messages else {
return
}

Expand All @@ -433,7 +443,7 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
return ChannelSelectionInfo(
channel: channel,
message: message,
searchType: .channels
searchType: .messages
)
}
DispatchQueue.main.async {
Expand All @@ -443,7 +453,7 @@ open class ChatChannelListViewModel: ObservableObject, ChatChannelListController
}

private func updateChannelSearchResults() {
guard let channelListSearchController = self.channelListSearchController else {
guard let channelListSearchController, searchType == .channels else {
return
}

Expand Down

0 comments on commit 3e722f7

Please sign in to comment.