Files
omnivore/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift
2022-04-22 19:58:13 -07:00

115 lines
3.6 KiB
Swift

import Combine
import Models
import Services
import SwiftUI
import Views
// TODO: fix file
final class LabelsViewModel: ObservableObject {
private var hasLoadedInitialLabels = false
@Published var isLoading = false
@Published var selectedLabels = [LinkedItemLabel]()
@Published var unselectedLabels = [LinkedItemLabel]()
@Published var labels = [LinkedItemLabel]()
@Published var showCreateEmailModal = false
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 `[FeedItemLabel]` for filtering a list of items
func loadLabels(
dataService _: DataService,
item _: LinkedItem? = nil,
initiallySelectedLabels _: [LinkedItemLabel]? = nil
) {
guard !hasLoadedInitialLabels else { return }
isLoading = true
// dataService.labelsPublisher().sink(
// receiveCompletion: { _ in },
// receiveValue: { [weak self] allLabels in
// self?.isLoading = false
// self?.labels = allLabels
// self?.hasLoadedInitialLabels = true
// if let item = item {
// self?.selectedLabels = item.labels.asArray(of: LinkedItemLabel.self)
// self?.unselectedLabels = allLabels.filter { label in
// !item.labels.contains(where: { $0.id == label.id })
// }
// }
// if let initiallySelectedLabels = initiallySelectedLabels {
// self?.selectedLabels = initiallySelectedLabels
// self?.unselectedLabels = allLabels.filter { label in
// !initiallySelectedLabels.contains(where: { $0.id == label.id })
// }
// }
// }
// )
// .store(in: &subscriptions)
}
func createLabel(dataService _: DataService, name _: String, color _: Color, description _: String?) {
// isLoading = true
//
// dataService.createLabelPublisher(
// name: name,
// color: color.hex ?? "",
// description: description
// ).sink(
// receiveCompletion: { [weak self] _ in
// self?.isLoading = false
// },
// receiveValue: { [weak self] result in
// self?.isLoading = false
// self?.labels.insert(result, at: 0)
// self?.unselectedLabels.insert(result, at: 0)
// self?.showCreateEmailModal = false
// }
// )
// .store(in: &subscriptions)
}
func deleteLabel(dataService: DataService, labelID: String) {
isLoading = true
dataService.removeLabelPublisher(labelID: labelID).sink(
receiveCompletion: { [weak self] _ in
self?.isLoading = false
},
receiveValue: { [weak self] _ in
self?.isLoading = false
self?.labels.removeAll { $0.id == labelID }
}
)
.store(in: &subscriptions)
}
func saveItemLabelChanges(
itemID _: String,
dataService _: DataService,
onComplete _: @escaping ([LinkedItemLabel]) -> Void
) {
// isLoading = true
// dataService.updateArticleLabelsPublisher(itemID: itemID, labelIDs: selectedLabels.map(\.id)).sink(
// receiveCompletion: { [weak self] _ in
// self?.isLoading = false
// },
// receiveValue: { onComplete($0) }
// )
// .store(in: &subscriptions)
}
func addLabelToItem(_: LinkedItemLabel) {
// selectedLabels.insert(label, at: 0)
// unselectedLabels.removeAll { $0.id == label.id }
}
func removeLabelFromItem(_: LinkedItemLabel) {
// unselectedLabels.insert(label, at: 0)
// selectedLabels.removeAll { $0.id == label.id }
}
}