mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-10-31 08:15:24 +00:00
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:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user