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

View File

@ -20,10 +20,6 @@ import SwiftUI
typealias HomeScreenViewModelType = StateStoreViewModel<HomeScreenViewState, HomeScreenViewAction>
class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol {
enum Constants {
static let slidingWindowBoundsPadding = 5
}
private let userSession: UserSessionProtocol
private let visibleRoomsSummaryProvider: RoomSummaryProviderProtocol?
private let allRoomsSummaryProvider: RoomSummaryProviderProtocol?
@ -277,9 +273,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
return
}
let lowerBound = max(0, range.lowerBound - Constants.slidingWindowBoundsPadding)
let upperBound = min(Int(visibleRoomsSummaryProvider.countPublisher.value), range.upperBound + Constants.slidingWindowBoundsPadding)
visibleRoomsSummaryProvider.updateVisibleRange(lowerBound..<upperBound, timelineLimit: timelineLimit)
visibleRoomsSummaryProvider.updateVisibleRange(range, timelineLimit: timelineLimit)
}
}

View File

@ -17,13 +17,21 @@
import SwiftUI
struct HomeScreen: View {
enum Constants {
static let slidingWindowBoundsPadding = 5
}
@ObservedObject var context: HomeScreenViewModel.Context
@State private var isViewVisible = false
@State private var scrollViewAdapter = ScrollViewAdapter()
@State private var showingLogoutConfirmation = false
@State private var visibleItemIdentifiers = Set<String>() {
didSet {
updateVisibleRange()
if isViewVisible {
updateVisibleRange()
}
}
}
@ -69,6 +77,12 @@ struct HomeScreen: View {
.disableAutocorrection(true)
}
}
.onAppear {
isViewVisible = true
}
.onDisappear {
isViewVisible = false
}
.introspectScrollView { scrollView in
guard scrollView != scrollViewAdapter.scrollView else { return }
scrollViewAdapter.scrollView = scrollView
@ -198,7 +212,10 @@ struct HomeScreen: View {
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))
}
}