mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 00:49:44 +00:00
Fix visible room sliding sync view ranges changing while inside rooms
This commit is contained in:
committed by
Stefan Ceriu
parent
bd61793798
commit
455a7105ef
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user