Avoid flashing the room list skeletons on launch

On a cold launch the home screen appeared just before the cached rooms
published, briefly showing skeletons that were immediately replaced.

The home screen now starts in a new awaitingCachedRooms mode, keeping
the list blank while a cached room list is about to publish and falling
back to the skeletons after 500ms. Without a cache the skeletons show
straight away as before.
This commit is contained in:
Stefan Ceriu
2026-10-02 10:06:00 +03:00
parent 4b6953e80f
commit a50c80c179
5 changed files with 42 additions and 10 deletions
@@ -421,6 +421,25 @@ final class HomeScreenViewModelTests {
try await deferred.fulfill()
}
@Test
func roomListModeGoesStraightToTheCachedRooms() async throws {
let (roomListSubject, _) = setupViewModelWithManualProvider(state: .loaded(totalNumberOfRooms: 8))
#expect(context.viewState.roomListMode == .awaitingCachedRooms)
let deferred = deferFulfillment(context.$viewState) { $0.roomListMode == .rooms }
roomListSubject.send(.mockRooms)
try await deferred.fulfill()
}
@Test
func roomListModeShowsSkeletonsWhenTheCachedRoomsAreSlow() async throws {
_ = setupViewModelWithManualProvider(state: .loaded(totalNumberOfRooms: 8))
#expect(context.viewState.roomListMode == .awaitingCachedRooms)
let deferred = deferFulfillment(context.$viewState) { $0.roomListMode == .skeletons }
try await deferred.fulfill()
}
@Test
func roomListModeDoesntReturnToSkeletonsWhenTheRoomsAreFilteredOut() async throws {
let (roomListSubject, stateSubject) = setupViewModelWithManualProvider()
@@ -437,9 +456,9 @@ final class HomeScreenViewModelTests {
try await failure.fulfill()
}
private func setupViewModelWithManualProvider() -> (CurrentValueSubject<[RoomSummary], Never>, CurrentValueSubject<RoomSummaryProviderState, Never>) {
private func setupViewModelWithManualProvider(state: RoomSummaryProviderState = .notLoaded) -> (CurrentValueSubject<[RoomSummary], Never>, CurrentValueSubject<RoomSummaryProviderState, Never>) {
let roomListSubject = CurrentValueSubject<[RoomSummary], Never>([])
let stateSubject = CurrentValueSubject<RoomSummaryProviderState, Never>(.notLoaded)
let stateSubject = CurrentValueSubject<RoomSummaryProviderState, Never>(state)
let provider = RoomSummaryProviderMock()
provider.roomListPublisher = roomListSubject.asCurrentValuePublisher()