Set visible ranges on the home screen sliding sync view (#342)

* Set visible ranges on the home screen sliding sync view
* Prevent the visible items from being updated while in search mode
* Enable diffs on invalidations as they seem to fix duplicated events in the home screen room list
* Promoted some diffing logs to info from verbose
This commit is contained in:
Stefan Ceriu
2022-11-25 17:50:43 +02:00
committed by GitHub
parent 1781f92882
commit 00cd2ab707
14 changed files with 271 additions and 88 deletions
@@ -36,6 +36,7 @@ enum HomeScreenViewAction {
case userMenu(action: HomeScreenViewUserMenuAction)
case verifySession
case skipSessionVerification
case updatedVisibleItemIdentifiers(Set<String>)
}
enum HomeScreenRoomListMode {
@@ -115,6 +115,8 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
callback?(.verifySession)
case .skipSessionVerification:
state.showSessionVerificationBanner = false
case .updatedVisibleItemIdentifiers(let identifiers):
updateVisibleRange(visibleItemIdentifiers: identifiers)
}
}
@@ -189,4 +191,20 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
state.rooms = rooms
roomsForIdentifiers = newRoomsForIdentifiers
}
private func updateVisibleRange(visibleItemIdentifiers items: Set<String>) {
let result = items.compactMap { itemIdentifier in
state.rooms.firstIndex { $0.id == itemIdentifier }
}.sorted()
guard !result.isEmpty else {
return
}
guard let lowerBound = result.first, let upperBound = result.last else {
return
}
userSession.clientProxy.roomSummaryProvider?.updateVisibleRange(lowerBound...upperBound)
}
}
@@ -18,9 +18,10 @@ import SwiftUI
struct HomeScreen: View {
@State private var showingLogoutConfirmation = false
@ObservedObject var context: HomeScreenViewModel.Context
@State private var visibleItemIdentifiers = Set<String>()
@State private var scrollViewAdapter = ScrollViewAdapter()
// MARK: Views
@ObservedObject var context: HomeScreenViewModel.Context
var body: some View {
ScrollView {
@@ -40,11 +41,19 @@ struct HomeScreen: View {
} else {
LazyVStack {
ForEach(context.viewState.visibleRooms) { room in
if room.isPlaceholder {
HomeScreenRoomCell(room: room, context: context)
.redacted(reason: .placeholder)
} else {
HomeScreenRoomCell(room: room, context: context)
Group {
if room.isPlaceholder {
HomeScreenRoomCell(room: room, context: context)
.redacted(reason: .placeholder)
} else {
HomeScreenRoomCell(room: room, context: context)
}
}
.onAppear {
visibleItemIdentifiers.insert(room.id)
}
.onDisappear {
visibleItemIdentifiers.remove(room.id)
}
}
}
@@ -52,6 +61,10 @@ struct HomeScreen: View {
.searchable(text: $context.searchQuery)
}
}
.introspectScrollView { scrollView in
guard scrollView != scrollViewAdapter.scrollView else { return }
scrollViewAdapter.scrollView = scrollView
}
.disabled(context.viewState.roomListMode == .skeletons)
.animation(.elementDefault, value: context.viewState.showSessionVerificationBanner)
.animation(.elementDefault, value: context.viewState.roomListMode)
@@ -63,6 +76,14 @@ struct HomeScreen: View {
userMenuButton
}
}
.onReceive(scrollViewAdapter.isScrolling) { isScrolling in
guard context.viewState.bindings.searchQuery.isEmpty,
!isScrolling else {
return
}
context.send(viewAction: .updatedVisibleItemIdentifiers(visibleItemIdentifiers))
}
}
@ViewBuilder