From 4fe58c2d0a0462ebe52fb8374cd36e34765353c5 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 30 Sep 2026 14:41:45 +0300 Subject: [PATCH] Don't hold the room list on skeletons for an empty filtered result The room list keeps showing skeletons while the provider reports loaded but no summaries have published yet, to avoid flashing an empty list before the first batch lands. That guard also fired when a filter (chips, space or search) legitimately matched nothing, leaving the home screen on placeholders forever instead of showing the empty filter state. --- .../Screens/HomeScreen/HomeScreenViewModel.swift | 6 ++++-- UnitTests/Sources/HomeScreenViewModelTests.swift | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) 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()