diff --git a/Multiplatform/Shared/Sidebar/SidebarView.swift b/Multiplatform/Shared/Sidebar/SidebarView.swift index a786134a6..ec87a9797 100644 --- a/Multiplatform/Shared/Sidebar/SidebarView.swift +++ b/Multiplatform/Shared/Sidebar/SidebarView.swift @@ -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 diff --git a/Multiplatform/Shared/Timeline/TimelineContainerView.swift b/Multiplatform/Shared/Timeline/TimelineContainerView.swift index 92fb29dba..fdd3d2f42 100644 --- a/Multiplatform/Shared/Timeline/TimelineContainerView.swift +++ b/Multiplatform/Shared/Timeline/TimelineContainerView.swift @@ -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 + } + } + } } } diff --git a/Multiplatform/Shared/Timeline/TimelineView.swift b/Multiplatform/Shared/Timeline/TimelineView.swift index 185f1abc7..b2e8c916b 100644 --- a/Multiplatform/Shared/Timeline/TimelineView.swift +++ b/Multiplatform/Shared/Timeline/TimelineView.swift @@ -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 }