diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift index cefd04afb..6f2bcf015 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift @@ -334,12 +334,14 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol } private func updateRoomListMode(with roomSummaryProviderState: RoomSummaryProviderState, hasRooms: Bool) { + let isFiltering = state.bindings.filtersState.isFiltering || state.selectedSpaceFilter != nil || state.bindings.isSearchFieldFocused + let roomListMode: HomeScreenRoomListMode = if !roomSummaryProviderState.isLoaded { .skeletons // Still loading. } else if roomSummaryProviderState.totalNumberOfRooms == 0 { .empty // Loaded, there are no rooms at all. - } else if hasRooms { - .rooms // Loaded and the summaries have published. + } else if hasRooms || isFiltering { + .rooms // Loaded and the summaries have published (or filtered down to nothing). } else if state.roomListMode == .skeletons { .skeletons // Loaded but nothing published yet, flipping to .rooms would flash an empty list. } else { diff --git a/UnitTests/Sources/HomeScreenViewModelTests.swift b/UnitTests/Sources/HomeScreenViewModelTests.swift index ab06aa135..72fa1012d 100644 --- a/UnitTests/Sources/HomeScreenViewModelTests.swift +++ b/UnitTests/Sources/HomeScreenViewModelTests.swift @@ -408,6 +408,19 @@ final class HomeScreenViewModelTests { try await deferred.fulfill() } + @Test + func roomListModeDoesntHoldSkeletonsForAnEmptyFilteredResult() async throws { + let (roomListSubject, stateSubject) = setupViewModelWithManualProvider() + #expect(context.viewState.roomListMode == .skeletons) + + // A filter is active before anything has published and the filtered list is loaded but empty. + context.filtersState.activateFilter(.people) + let deferred = deferFulfillment(context.$viewState) { $0.roomListMode == .rooms } + roomListSubject.send([]) + stateSubject.send(.loaded(totalNumberOfRooms: 8)) + try await deferred.fulfill() + } + @Test func roomListModeDoesntReturnToSkeletonsWhenTheRoomsAreFilteredOut() async throws { let (roomListSubject, stateSubject) = setupViewModelWithManualProvider()