diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift index a71bdac83..b6361c47b 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift @@ -47,7 +47,6 @@ enum HomeScreenViewAction { case skipSessionVerification case updateVisibleItemRange(range: Range, isScrolling: Bool) case selectInvites - case updatedSearchQuery } enum HomeScreenRoomListMode: CustomStringConvertible { @@ -85,7 +84,11 @@ struct HomeScreenViewState: BindableState { return placeholderRooms } - return rooms + if bindings.searchQuery.isEmpty { + return rooms + } + + return rooms.filter { $0.name.localizedStandardContains(bindings.searchQuery) } } var bindings = HomeScreenViewStateBindings() diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift index 71b0e27f5..9840f249f 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift @@ -187,8 +187,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol callback?(.presentStartChatScreen) case .selectInvites: callback?(.presentInvitesScreen) - case .updatedSearchQuery: - roomSummaryProvider?.updateFilterPattern(state.bindings.searchQuery) } } diff --git a/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift b/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift index d27975d12..6e33c9577 100644 --- a/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift +++ b/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift @@ -79,9 +79,8 @@ struct HomeScreen: View { .onReceive(scrollViewAdapter.isScrolling) { _ in updateVisibleRange() } - .onChange(of: context.searchQuery) { _ in - context.send(viewAction: .updatedSearchQuery) - + .onChange(of: context.searchQuery) { searchQuery in + guard searchQuery.isEmpty else { return } // Dispatch allows the view to update after changing the query DispatchQueue.main.async { updateVisibleRange() } } diff --git a/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift b/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift index 525a23701..1a07170a8 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/MockRoomSummaryProvider.swift @@ -45,8 +45,6 @@ class MockRoomSummaryProvider: RoomSummaryProviderProtocol { func setRoomList(_ roomList: RoomList) { } func updateVisibleRange(_ range: Range) { } - - func updateFilterPattern(_ pattern: String?) { } } extension Array where Element == RoomSummary { diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift index 87df65917..ddd5339ad 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift @@ -28,7 +28,6 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { private var roomList: RoomListProtocol? private var cancellables = Set() - private var listUpdatesSubscriptionResult: RoomListEntriesWithDynamicFilterResult? private var listUpdatesTaskHandle: TaskHandle? private var stateUpdatesTaskHandle: TaskHandle? @@ -74,17 +73,21 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { self.roomList = roomList do { - listUpdatesSubscriptionResult = roomList.entriesWithDynamicFilter(listener: RoomListEntriesListenerProxy { [weak self] updates in + let listUpdatesSubscriptionResult = roomList.entries(listener: RoomListEntriesListenerProxy { [weak self] updates in guard let self else { return } MXLog.info("\(name): Received list update") diffsPublisher.send(updates) }) - - listUpdatesTaskHandle = listUpdatesSubscriptionResult?.entriesStream - - // Forces the listener above to be called with the current state - updateFilterPattern(nil) + listUpdatesTaskHandle = listUpdatesSubscriptionResult.entriesStream + + rooms = listUpdatesSubscriptionResult.entries.map { roomListEntry in + buildSummaryForRoomListEntry(roomListEntry) + } + + // Manually call it here as the didSet doesn't work from constructors + roomListSubject.send(rooms) + let stateUpdatesSubscriptionResult = try roomList.loadingState(listener: RoomListStateObserver { [weak self] state in guard let self else { return } MXLog.info("\(name): Received state update: \(state)") @@ -110,15 +113,6 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { } } - func updateFilterPattern(_ pattern: String?) { - guard let pattern, !pattern.isEmpty else { - _ = listUpdatesSubscriptionResult?.dynamicFilter.set(kind: .all) - return - } - - _ = listUpdatesSubscriptionResult?.dynamicFilter.set(kind: .fuzzyMatchRoomName(pattern: pattern.lowercased())) - } - // MARK: - Private fileprivate func updateRoomsWithDiffs(_ diffs: [RoomListEntriesUpdate]) { diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift index 545bd2fdd..a804163fd 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProviderProtocol.swift @@ -99,6 +99,4 @@ protocol RoomSummaryProviderProtocol { func setRoomList(_ roomList: RoomList) func updateVisibleRange(_ range: Range) - - func updateFilterPattern(_ pattern: String?) } diff --git a/changelog.d/pr-1483.feature b/changelog.d/pr-1483.feature deleted file mode 100644 index f457e4115..000000000 --- a/changelog.d/pr-1483.feature +++ /dev/null @@ -1 +0,0 @@ -Allow fuzzy searching for room list rooms \ No newline at end of file