Delay rendering bottom timeline items when scrolled up and avoid content shifts

- builds on top of langleyd/timeline_defer_new_items
- improve animations
This commit is contained in:
Stefan Ceriu
2023-07-31 13:34:54 +03:00
committed by Stefan Ceriu
parent beaf9a8dbf
commit 3c8daebfe1
9 changed files with 87 additions and 33 deletions
@@ -80,6 +80,8 @@ enum RoomScreenViewAction {
case retrySend(itemID: TimelineItemIdentifier)
case cancelSend(itemID: TimelineItemIdentifier)
case scrolledToBottom
}
struct RoomScreenViewState: BindableState {
@@ -94,7 +96,7 @@ struct RoomScreenViewState: BindableState {
var timelineViewState = TimelineViewState() // check the doc before changing this
var composerMode: RoomScreenComposerMode = .default
var swiftUITimelineEnabled = false
var bindings: RoomScreenViewStateBindings
/// A closure providing the actions to show when long pressing on an item in the timeline.
@@ -109,7 +111,7 @@ struct RoomScreenViewStateBindings {
var composerText: String
var composerFocused: Bool
var scrollToBottomButtonVisible = false
var isScrolledToBottom = true
var showAttachmentPopover = false {
didSet {
composerFocused = false
@@ -184,12 +186,15 @@ struct TimelineViewState {
var scrollToBottomPublisher = PassthroughSubject<Void, Never>()
var itemsDictionary = OrderedDictionary<String, RoomTimelineItemViewState>()
var renderedTimelineIDs = [String]()
var pendingTimelineIDs = [String]()
var timelineIDs: [String] {
itemsDictionary.keys.elements
}
var itemViewStates: [RoomTimelineItemViewState] {
itemsDictionary.values.elements
renderedTimelineIDs.compactMap { itemsDictionary[$0] }
}
}