Move onReceive to container view for timeline

This commit is contained in:
Maurice Parker 2020-07-26 07:18:05 -05:00
parent a3459bc57a
commit 71acfb524d
3 changed files with 38 additions and 49 deletions

View File

@ -11,15 +11,16 @@ import Account
struct SidebarView: View {
// I had to comment out SceneStorage because it blows up if used on macOS
// @SceneStorage("expandedContainers") private var expandedContainerData = Data()
@StateObject private var expandedContainers = SidebarExpandedContainers()
@Binding var sidebarItems: [SidebarItem]
@EnvironmentObject private var refreshProgress: RefreshProgressModel
@EnvironmentObject private var sceneModel: SceneModel
@EnvironmentObject private var sidebarModel: SidebarModel
@Binding var sidebarItems: [SidebarItem]
// I had to comment out SceneStorage because it blows up if used on macOS
// @SceneStorage("expandedContainers") private var expandedContainerData = Data()
@StateObject private var expandedContainers = SidebarExpandedContainers()
private let threshold: CGFloat = 80
@State private var previousScrollOffset: CGFloat = 0
@State private var scrollOffset: CGFloat = 0

View File

@ -14,13 +14,40 @@ struct TimelineContainerView: View {
@Environment(\.undoManager) var undoManager
@EnvironmentObject private var sceneModel: SceneModel
@State private var timelineItems = TimelineItems()
@State private var isReadFiltered: Bool? = nil
@ViewBuilder var body: some View {
TimelineView()
TimelineView(timelineItems: $timelineItems, isReadFiltered: $isReadFiltered)
.modifier(TimelineToolbarModifier())
.environmentObject(sceneModel.timelineModel)
.onAppear {
sceneModel.timelineModel.undoManager = undoManager
}
.onReceive(sceneModel.timelineModel.readFilterAndFeedsPublisher!) { (_, filtered) in
isReadFiltered = filtered
}
.onReceive(sceneModel.timelineModel.timelineItemsPublisher!) { items in
timelineItems = items
}
.onReceive(sceneModel.timelineModel.articleStatusChangePublisher!) { articleIDs in
articleIDs.forEach { articleID in
if let position = timelineItems.index[articleID] {
// This animation will trigger a deselect on iPhones and iPads, so we will disable it for now
#if os(macOS)
if timelineItems.items[position].isReadOnly {
withAnimation {
timelineItems.items[position].updateStatus()
}
} else {
timelineItems.items[position].updateStatus()
}
#else
timelineItems.items[position].updateStatus()
#endif
}
}
}
}
}

View File

@ -10,10 +10,12 @@ import SwiftUI
struct TimelineView: View {
@Binding var timelineItems: TimelineItems
@Binding var isReadFiltered: Bool?
@EnvironmentObject private var timelineModel: TimelineModel
@State private var timelineItems = TimelineItems()
@State private var timelineItemFrames = [String: CGRect]()
@State private var isReadFiltered: Bool? = nil
@ViewBuilder var body: some View {
GeometryReader { geometryReaderProxy in
@ -63,27 +65,6 @@ struct TimelineView: View {
}
}
}
.onReceive(timelineModel.readFilterAndFeedsPublisher!) { (_, filtered) in
isReadFiltered = filtered
}
.onReceive(timelineModel.timelineItemsPublisher!) { items in
withAnimation {
timelineItems = items
}
}
.onReceive(timelineModel.articleStatusChangePublisher!) { articleIDs in
articleIDs.forEach { articleID in
if let position = timelineItems.index[articleID] {
if timelineItems.items[position].isReadOnly {
withAnimation {
timelineItems.items[position].updateStatus()
}
} else {
timelineItems.items[position].updateStatus()
}
}
}
}
.navigationTitle(Text(verbatim: timelineModel.nameForDisplay))
#else
ScrollViewReader { scrollViewProxy in
@ -115,26 +96,6 @@ struct TimelineView: View {
}
}
}
.onReceive(timelineModel.timelineItemsPublisher!) { items in
// Animations crash on iPadOS right now
// withAnimation {
timelineItems = items
// }
}
.onReceive(timelineModel.articleStatusChangePublisher!) { articleIDs in
articleIDs.forEach { articleID in
if let position = timelineItems.index[articleID] {
// This will trigger a deselect on iPhones and iPads, so we will disable it for now
// if timelineItems.items[position].isReadOnly {
// withAnimation {
// timelineItems.items[position].updateStatus()
// }
// } else {
timelineItems.items[position].updateStatus()
// }
}
}
}
.navigationBarTitle(Text(verbatim: timelineModel.nameForDisplay), displayMode: .inline)
#endif
}