Fix visible room sliding sync view ranges changing while inside rooms

This commit is contained in:
Stefan Ceriu
2023-02-22 17:58:06 +02:00
committed by Stefan Ceriu
parent bd61793798
commit 455a7105ef
2 changed files with 20 additions and 10 deletions
@@ -20,10 +20,6 @@ import SwiftUI
typealias HomeScreenViewModelType = StateStoreViewModel<HomeScreenViewState, HomeScreenViewAction> typealias HomeScreenViewModelType = StateStoreViewModel<HomeScreenViewState, HomeScreenViewAction>
class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol { class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol {
enum Constants {
static let slidingWindowBoundsPadding = 5
}
private let userSession: UserSessionProtocol private let userSession: UserSessionProtocol
private let visibleRoomsSummaryProvider: RoomSummaryProviderProtocol? private let visibleRoomsSummaryProvider: RoomSummaryProviderProtocol?
private let allRoomsSummaryProvider: RoomSummaryProviderProtocol? private let allRoomsSummaryProvider: RoomSummaryProviderProtocol?
@@ -277,9 +273,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
return return
} }
let lowerBound = max(0, range.lowerBound - Constants.slidingWindowBoundsPadding) visibleRoomsSummaryProvider.updateVisibleRange(range, timelineLimit: timelineLimit)
let upperBound = min(Int(visibleRoomsSummaryProvider.countPublisher.value), range.upperBound + Constants.slidingWindowBoundsPadding)
visibleRoomsSummaryProvider.updateVisibleRange(lowerBound..<upperBound, timelineLimit: timelineLimit)
} }
} }
@@ -17,13 +17,21 @@
import SwiftUI import SwiftUI
struct HomeScreen: View { struct HomeScreen: View {
enum Constants {
static let slidingWindowBoundsPadding = 5
}
@ObservedObject var context: HomeScreenViewModel.Context @ObservedObject var context: HomeScreenViewModel.Context
@State private var isViewVisible = false
@State private var scrollViewAdapter = ScrollViewAdapter() @State private var scrollViewAdapter = ScrollViewAdapter()
@State private var showingLogoutConfirmation = false @State private var showingLogoutConfirmation = false
@State private var visibleItemIdentifiers = Set<String>() { @State private var visibleItemIdentifiers = Set<String>() {
didSet { didSet {
updateVisibleRange() if isViewVisible {
updateVisibleRange()
}
} }
} }
@@ -69,6 +77,12 @@ struct HomeScreen: View {
.disableAutocorrection(true) .disableAutocorrection(true)
} }
} }
.onAppear {
isViewVisible = true
}
.onDisappear {
isViewVisible = false
}
.introspectScrollView { scrollView in .introspectScrollView { scrollView in
guard scrollView != scrollViewAdapter.scrollView else { return } guard scrollView != scrollViewAdapter.scrollView else { return }
scrollViewAdapter.scrollView = scrollView scrollViewAdapter.scrollView = scrollView
@@ -198,7 +212,10 @@ struct HomeScreen: View {
return return
} }
context.send(viewAction: .updateVisibleItemRange(range: firstIndex..<lastIndex, isScrolling: scrollViewAdapter.isScrolling.value)) let lowerBound = max(0, firstIndex - Constants.slidingWindowBoundsPadding)
let upperBound = min(Int(context.viewState.rooms.count), lastIndex + Constants.slidingWindowBoundsPadding)
context.send(viewAction: .updateVisibleItemRange(range: lowerBound..<upperBound, isScrolling: scrollViewAdapter.isScrolling.value))
} }
} }