From c8ad2f47a2c2e137cc582ed8bb8e1f8f0d121a4b Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Sun, 10 Apr 2022 21:09:42 -0700 Subject: [PATCH] adapt assign labels view to work on a list --- .../App/Views/Home/HomeFeedViewIOS.swift | 23 ++++------ .../App/Views/Labels/ApplyLabelsView.swift | 46 ++++++++++++++++--- .../App/Views/Labels/LabelsViewModel.swift | 5 +- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index bf5c6b885..611979fc9 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -38,11 +38,14 @@ import Views // it feels like it works ok without viewModel.loadItems(dataService: dataService, isRefresh: true) } + .onChange(of: viewModel.selectedLabels) { _ in + viewModel.loadItems(dataService: dataService, isRefresh: true) + } .onSubmit(of: .search) { viewModel.loadItems(dataService: dataService, isRefresh: true) } .sheet(item: $viewModel.itemUnderLabelEdit) { item in - ApplyLabelsView(item: item) { labels in + ApplyLabelsView(mode: .item(item)) { labels in viewModel.updateLabels(itemID: item.id, labels: labels) } } @@ -52,7 +55,7 @@ import Views viewModel: viewModel ) .sheet(item: $viewModel.itemUnderLabelEdit) { item in - ApplyLabelsView(item: item) { labels in + ApplyLabelsView(mode: .item(item)) { labels in viewModel.updateLabels(itemID: item.id, labels: labels) } } @@ -111,14 +114,6 @@ import Views @State private var showLabelsSheet = false @ObservedObject var viewModel: HomeFeedViewModel - // TODO: remove stub - let demoFilterChips = [ - FeedItemLabel(id: "1", name: "Inbox", color: "#039466", createdAt: nil, description: nil), - FeedItemLabel(id: "2", name: "NotInbox", color: "#039466", createdAt: nil, description: nil), - FeedItemLabel(id: "3", name: "Atari", color: "#039466", createdAt: nil, description: nil), - FeedItemLabel(id: "4", name: "iOS", color: "#039466", createdAt: nil, description: nil) - ] - var body: some View { VStack { ScrollView(.horizontal, showsIndicators: false) { @@ -126,16 +121,18 @@ import Views TextChipButton.makeAddLabelButton { showLabelsSheet = true } - ForEach(demoFilterChips, id: \.self) { label in + ForEach(viewModel.selectedLabels, id: \.self) { label in TextChipButton.makeRemovableLabelButton(feedItemLabel: label) { - print("tapped label named \(label.name)") + viewModel.selectedLabels.removeAll { $0.id == label.id } } } Spacer() } .padding(.horizontal) .sheet(isPresented: $showLabelsSheet) { - Text("select labels stub") + ApplyLabelsView(mode: .list(viewModel.selectedLabels)) { labels in + viewModel.selectedLabels = labels + } } } if prefersListLayout { diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift index 0d46e15b7..3b0c80a85 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift @@ -4,7 +4,30 @@ import SwiftUI import Views struct ApplyLabelsView: View { - let item: FeedItem + enum Mode { + case item(FeedItem) + case list([FeedItemLabel]) + + var navTitle: String { + switch self { + case .item: + return "Assign Labels" + case .list: + return "Apply Label Filters" + } + } + + var confirmButtonText: String { + switch self { + case .item: + return "Save" + case .list: + return "Apply" + } + } + } + + let mode: Mode let commitLabelChanges: ([FeedItemLabel]) -> Void @EnvironmentObject var dataService: DataService @@ -63,7 +86,7 @@ struct ApplyLabelsView: View { .disabled(viewModel.isLoading) } } - .navigationTitle("Assign Labels") + .navigationTitle(mode.navTitle) #if os(iOS) .navigationBarTitleDisplayMode(.inline) .toolbar { @@ -76,12 +99,18 @@ struct ApplyLabelsView: View { ToolbarItem(placement: .navigationBarTrailing) { Button( action: { - viewModel.saveItemLabelChanges(itemID: item.id, dataService: dataService) { labels in - commitLabelChanges(labels) + switch mode { + case let .item(feedItem): + viewModel.saveItemLabelChanges(itemID: feedItem.id, dataService: dataService) { labels in + commitLabelChanges(labels) + presentationMode.wrappedValue.dismiss() + } + case .list: + commitLabelChanges(viewModel.selectedLabels) presentationMode.wrappedValue.dismiss() } }, - label: { Text("Save").foregroundColor(.appGrayTextContrast) } + label: { Text(mode.confirmButtonText).foregroundColor(.appGrayTextContrast) } ) } } @@ -112,7 +141,12 @@ struct ApplyLabelsView: View { } } .onAppear { - viewModel.loadLabels(dataService: dataService, item: item) + switch mode { + case let .item(feedItem): + viewModel.loadLabels(dataService: dataService, item: feedItem) + case let .list(labels): + viewModel.loadLabels(dataService: dataService, initiallySelectedLabels: labels) + } } } } diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift index e8020c684..35159e8ca 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift @@ -14,13 +14,12 @@ final class LabelsViewModel: ObservableObject { var subscriptions = Set() - /// Loads initial set of labels when a edit labels list is displayed /// - Parameters: /// - dataService: `DataService` reference /// - item: Optional `FeedItem` for applying labels to a single item - /// - initiallySelectedLabels: Optional `[FeedItem]` for filtering a list of items - func loadLabels(dataService: DataService, item: FeedItem?, initiallySelectedLabels: [FeedItem]?) { + /// - initiallySelectedLabels: Optional `[FeedItemLabel]` for filtering a list of items + func loadLabels(dataService: DataService, item: FeedItem? = nil, initiallySelectedLabels: [FeedItemLabel]? = nil) { guard !hasLoadedInitialLabels else { return } isLoading = true