adapt assign labels view to work on a list

This commit is contained in:
Satindar Dhillon 2022-04-10 21:09:42 -07:00
parent bd652dc3ed
commit c8ad2f47a2
3 changed files with 52 additions and 22 deletions

View file

@ -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 {

View file

@ -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)
}
}
}
}

View file

@ -14,13 +14,12 @@ final class LabelsViewModel: ObservableObject {
var subscriptions = Set<AnyCancellable>()
/// 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