From 8d20cbfc68a65552ad0d6ba3bfb6bf0976acfff6 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 7 Nov 2023 17:54:04 +0200 Subject: [PATCH] =?UTF-8?q?Fixes=20#2040=20-=20Prevent=20the=20room=20list?= =?UTF-8?q?=20from=20staying=20empty=20after=20cancelli=E2=80=A6=20(#2041)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes #2040 - Prevent the room list from staying empty after cancelling a search * Address PR comments, simplify implementation --- .../HomeScreen/HomeScreenViewModel.swift | 35 +++++++++---------- changelog.d/2040.bugfix | 1 + 2 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 changelog.d/2040.bugfix diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift index 6007bdff9..9c6bf7340 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift @@ -98,21 +98,20 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol .weakAssign(to: \.state.selectedRoomID, on: self) .store(in: &cancellables) - context.$viewState - .map(\.bindings.searchQuery) - .removeDuplicates() - .sink { [weak self] searchQuery in + let isSearchFieldFocused = context.$viewState.map(\.bindings.isSearchFieldFocused) + let searchQuery = context.$viewState.map(\.bindings.searchQuery) + isSearchFieldFocused + .combineLatest(searchQuery) + .removeDuplicates { $0 == $1 } + .map { _ in () } + .sink { [weak self] in guard let self else { return } - updateFilter(isSearchFieldFocused: state.bindings.isSearchFieldFocused, searchQuery: searchQuery) - } - .store(in: &cancellables) - - context.$viewState - .map(\.bindings.isSearchFieldFocused) - .removeDuplicates() - .sink { [weak self] isSearchFieldFocused in - guard let self else { return } - updateFilter(isSearchFieldFocused: isSearchFieldFocused, searchQuery: state.bindings.searchQuery) + // Don't capture the values here as combine behaves incorrectly and `isSearchFieldFocused` is sometimes + // turning to true after cancelling the search. Read them directly from the state in the updateFilter + // method instead on the next run loop to make sure they're up to date. + DispatchQueue.main.async { + self.updateFilter() + } } .store(in: &cancellables) @@ -170,13 +169,13 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol // MARK: - Private - private func updateFilter(isSearchFieldFocused: Bool, searchQuery: String) { - if !isSearchFieldFocused { + private func updateFilter() { + if !state.bindings.isSearchFieldFocused { roomSummaryProvider?.setFilter(.all) - } else if searchQuery.isEmpty { + } else if state.bindings.searchQuery.isEmpty { roomSummaryProvider?.setFilter(.none) } else { - roomSummaryProvider?.setFilter(.normalizedMatchRoomName(searchQuery)) + roomSummaryProvider?.setFilter(.normalizedMatchRoomName(state.bindings.searchQuery)) } } diff --git a/changelog.d/2040.bugfix b/changelog.d/2040.bugfix new file mode 100644 index 000000000..72b6c1992 --- /dev/null +++ b/changelog.d/2040.bugfix @@ -0,0 +1 @@ +Prevent the room list from staying empty after cancelling a search \ No newline at end of file