78 lines
2.3 KiB
Swift
78 lines
2.3 KiB
Swift
import Models
|
|
import Services
|
|
import SwiftUI
|
|
import Views
|
|
|
|
@MainActor final class LabelsViewModel: ObservableObject {
|
|
@Published var isLoading = false
|
|
@Published var selectedLabels = [LinkedItemLabel]()
|
|
@Published var unselectedLabels = [LinkedItemLabel]()
|
|
@Published var labels = [LinkedItemLabel]()
|
|
@Published var showCreateEmailModal = false
|
|
@Published var labelSearchFilter = ""
|
|
|
|
func loadLabels(
|
|
dataService: DataService,
|
|
item: LinkedItem? = nil,
|
|
initiallySelectedLabels: [LinkedItemLabel]? = nil
|
|
) async {
|
|
isLoading = true
|
|
|
|
if let labelIDs = try? await dataService.labels() {
|
|
dataService.viewContext.performAndWait {
|
|
self.labels = labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel }
|
|
}
|
|
let selLabels = initiallySelectedLabels ?? item?.labels.asArray(of: LinkedItemLabel.self) ?? []
|
|
for label in labels {
|
|
if selLabels.contains(label) {
|
|
selectedLabels.append(label)
|
|
} else {
|
|
unselectedLabels.append(label)
|
|
}
|
|
}
|
|
}
|
|
|
|
isLoading = false
|
|
}
|
|
|
|
func createLabel(dataService: DataService, name: String, color: Color, description: String?) {
|
|
isLoading = true
|
|
|
|
guard let labelObjectID = try? dataService.createLabel(
|
|
name: name,
|
|
color: color.hex ?? "",
|
|
description: description
|
|
) else {
|
|
return
|
|
}
|
|
|
|
if let label = dataService.viewContext.object(with: labelObjectID) as? LinkedItemLabel {
|
|
labels.insert(label, at: 0)
|
|
unselectedLabels.insert(label, at: 0)
|
|
}
|
|
|
|
showCreateEmailModal = false
|
|
}
|
|
|
|
func deleteLabel(dataService: DataService, labelID: String, name: String) {
|
|
dataService.removeLabel(labelID: labelID, name: name)
|
|
labels.removeAll { $0.name == name }
|
|
selectedLabels.removeAll { $0.name == name }
|
|
unselectedLabels.removeAll { $0.name == name }
|
|
}
|
|
|
|
func saveItemLabelChanges(itemID: String, dataService: DataService) {
|
|
dataService.updateItemLabels(itemID: itemID, labelNames: selectedLabels.map(\.unwrappedName))
|
|
}
|
|
|
|
func addLabelToItem(_ label: LinkedItemLabel) {
|
|
selectedLabels.insert(label, at: 0)
|
|
unselectedLabels.removeAll { $0.name == label.name }
|
|
}
|
|
|
|
func removeLabelFromItem(_ label: LinkedItemLabel) {
|
|
unselectedLabels.insert(label, at: 0)
|
|
selectedLabels.removeAll { $0.name == label.name }
|
|
}
|
|
}
|