From b195414e1619694fb412cf8d6f980eaa4c1ac591 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Fri, 8 Apr 2022 09:30:33 -0700 Subject: [PATCH] track selectedLinkItem in HomeFeedViewModel --- .../Components/FeedCardNavigationLink.swift | 9 +-- .../App/Views/Home/HomeFeedViewIOS.swift | 75 ++++++++----------- .../App/Views/Home/HomeFeedViewMac.swift | 3 - .../App/Views/Home/HomeFeedViewModel.swift | 3 +- 4 files changed, 35 insertions(+), 55 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift index 1c19b5398..dbf0084ca 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift @@ -8,8 +8,6 @@ struct FeedCardNavigationLink: View { let item: FeedItem - @Binding var selectedLinkItem: FeedItem? - @ObservedObject var viewModel: HomeFeedViewModel var body: some View { @@ -17,7 +15,7 @@ struct FeedCardNavigationLink: View { NavigationLink( destination: LinkItemDetailView(viewModel: LinkItemDetailViewModel(item: item, homeFeedViewModel: viewModel)), tag: item, - selection: $selectedLinkItem + selection: $viewModel.selectedLinkItem ) { EmptyView() } @@ -39,7 +37,6 @@ struct GridCardNavigationLink: View { let item: FeedItem let actionHandler: (GridCardAction) -> Void - @Binding var selectedLinkItem: FeedItem? @Binding var isContextMenuOpen: Bool @ObservedObject var viewModel: HomeFeedViewModel @@ -49,7 +46,7 @@ struct GridCardNavigationLink: View { NavigationLink( destination: LinkItemDetailView(viewModel: LinkItemDetailViewModel(item: item, homeFeedViewModel: viewModel)), tag: item, - selection: $selectedLinkItem + selection: $viewModel.selectedLinkItem ) { EmptyView() } @@ -58,7 +55,7 @@ struct GridCardNavigationLink: View { scale = 0.95 DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(150)) { scale = 1.0 - selectedLinkItem = item + viewModel.selectedLinkItem = item } } }) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index deb0f7cdc..7c5e60d82 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -10,7 +10,6 @@ import Views struct HomeFeedContainerView: View { @EnvironmentObject var dataService: DataService @AppStorage(UserDefaultKey.homeFeedlayoutPreference.rawValue) var prefersListLayout = UIDevice.isIPhone - @State private var selectedLinkItem: FeedItem? @ObservedObject var viewModel: HomeFeedViewModel var body: some View { @@ -18,7 +17,6 @@ import Views if #available(iOS 15.0, *) { HomeFeedView( prefersListLayout: $prefersListLayout, - selectedLinkItem: $selectedLinkItem, viewModel: viewModel ) .refreshable { @@ -51,7 +49,6 @@ import Views } else { HomeFeedView( prefersListLayout: $prefersListLayout, - selectedLinkItem: $selectedLinkItem, viewModel: viewModel ) .sheet(item: $viewModel.itemUnderLabelEdit) { item in @@ -76,14 +73,14 @@ import Views .navigationTitle("Home") .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in // Don't refresh the list if the user is currently reading an article - if selectedLinkItem == nil { + if viewModel.selectedLinkItem == nil { viewModel.loadItems(dataService: dataService, isRefresh: true) } } .onReceive(NotificationCenter.default.publisher(for: Notification.Name("PushFeedItem"))) { notification in if let feedItem = notification.userInfo?["feedItem"] as? FeedItem { viewModel.pushFeedItem(item: feedItem) - self.selectedLinkItem = feedItem + viewModel.selectedLinkItem = feedItem } } .formSheet(isPresented: $viewModel.snoozePresented) { @@ -101,7 +98,7 @@ import Views viewModel.loadItems(dataService: dataService, isRefresh: true) } } - .onChange(of: selectedLinkItem) { _ in + .onChange(of: viewModel.selectedLinkItem) { _ in viewModel.commitProgressUpdates() } } @@ -111,54 +108,46 @@ import Views @EnvironmentObject var dataService: DataService @Binding var prefersListLayout: Bool - @Binding var selectedLinkItem: FeedItem? @ObservedObject var viewModel: HomeFeedViewModel var body: some View { if prefersListLayout { - HomeFeedListView( - prefersListLayout: $prefersListLayout, - selectedLinkItem: $selectedLinkItem, - viewModel: viewModel - ) + HomeFeedListView(prefersListLayout: $prefersListLayout, viewModel: viewModel) } else { - HomeFeedGridView( - selectedLinkItem: $selectedLinkItem, - viewModel: viewModel - ) - .toolbar { - ToolbarItem { - if #available(iOS 15.0, *) { - Button("", action: {}) - .disabled(true) - .overlay { - if viewModel.isLoading { - ProgressView() + HomeFeedGridView(viewModel: viewModel) + .toolbar { + ToolbarItem { + if #available(iOS 15.0, *) { + Button("", action: {}) + .disabled(true) + .overlay { + if viewModel.isLoading { + ProgressView() + } } - } - } else { - if viewModel.isLoading { - Button(action: {}, label: { ProgressView() }) } else { + if viewModel.isLoading { + Button(action: {}, label: { ProgressView() }) + } else { + Button( + action: { viewModel.loadItems(dataService: dataService, isRefresh: true) }, + label: { Label("Refresh Feed", systemImage: "arrow.clockwise") } + ) + } + } + } + ToolbarItem { + if UIDevice.isIPad { Button( - action: { viewModel.loadItems(dataService: dataService, isRefresh: true) }, - label: { Label("Refresh Feed", systemImage: "arrow.clockwise") } + action: { prefersListLayout.toggle() }, + label: { + Label("Toggle Feed Layout", systemImage: prefersListLayout ? "square.grid.2x2" : "list.bullet") + } ) } } } - ToolbarItem { - if UIDevice.isIPad { - Button( - action: { prefersListLayout.toggle() }, - label: { - Label("Toggle Feed Layout", systemImage: prefersListLayout ? "square.grid.2x2" : "list.bullet") - } - ) - } - } - } } } } @@ -166,7 +155,6 @@ import Views struct HomeFeedListView: View { @EnvironmentObject var dataService: DataService @Binding var prefersListLayout: Bool - @Binding var selectedLinkItem: FeedItem? @State private var itemToRemove: FeedItem? @State private var confirmationShown = false @@ -179,7 +167,6 @@ import Views ForEach(viewModel.items) { item in let link = FeedCardNavigationLink( item: item, - selectedLinkItem: $selectedLinkItem, viewModel: viewModel ) .contextMenu { @@ -293,7 +280,6 @@ import Views struct HomeFeedGridView: View { @EnvironmentObject var dataService: DataService - @Binding var selectedLinkItem: FeedItem? @State private var itemToRemove: FeedItem? @State private var confirmationShown = false @@ -320,7 +306,6 @@ import Views let link = GridCardNavigationLink( item: item, actionHandler: { contextMenuActionHandler(item: item, action: $0) }, - selectedLinkItem: $selectedLinkItem, isContextMenuOpen: $isContextMenuOpen, viewModel: viewModel ) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewMac.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewMac.swift index e0d39f2bd..91cad42e8 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewMac.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewMac.swift @@ -9,7 +9,6 @@ import Views #if os(macOS) struct HomeFeedView: View { @EnvironmentObject var dataService: DataService - @State private var selectedLinkItem: FeedItem? @State private var itemToRemove: FeedItem? @State private var confirmationShown = false @@ -30,7 +29,6 @@ import Views ForEach(viewModel.items) { item in FeedCardNavigationLink( item: item, - selectedLinkItem: $selectedLinkItem, viewModel: viewModel ) .contextMenu { @@ -127,7 +125,6 @@ import Views ForEach(viewModel.items) { item in FeedCardNavigationLink( item: item, - selectedLinkItem: $selectedLinkItem, viewModel: viewModel ) } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index 8e8264f8c..8a34b30cc 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -17,7 +17,8 @@ final class HomeFeedViewModel: ObservableObject { @Published var itemUnderLabelEdit: FeedItem? @Published var searchQuery = "" @Published var snoozePresented = false - @Published var itemToSnooze: FeedItem? + @Published var itemToSnooze: FeedItem? // TODO: maybe combine itemToSnooze and snoozePresented? + @Published var selectedLinkItem: FeedItem? var cursor: String? var sendProgressUpdates = false