mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
adapt assign labels view to work on a list
This commit is contained in:
parent
bd652dc3ed
commit
c8ad2f47a2
3 changed files with 52 additions and 22 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue