From 915bec37d2201c00578052a3e8999da9b17b3dd9 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Sat, 23 Apr 2022 20:29:59 -0700 Subject: [PATCH] fix label view models --- .../App/Views/Labels/LabelsViewModel.swift | 79 ++++++++++--------- .../UpdateArticleLabelsPublisher.swift | 37 +++++---- .../InternalLinkedItemLabel.swift | 2 + 3 files changed, 65 insertions(+), 53 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift index f2cd4ed4e..84bb1fa46 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift @@ -4,7 +4,6 @@ import Services import SwiftUI import Views -// TODO: -labels fix file final class LabelsViewModel: ObservableObject { private var hasLoadedInitialLabels = false @Published var isLoading = false @@ -46,25 +45,27 @@ final class LabelsViewModel: ObservableObject { .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 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] labelID in + if let label = dataService.viewContext.object(with: labelID) as? LinkedItemLabel { + self?.labels.insert(label, at: 0) + self?.unselectedLabels.insert(label, at: 0) + } + self?.isLoading = false + self?.showCreateEmailModal = false + } + ) + .store(in: &subscriptions) } func deleteLabel(dataService: DataService, labelID: String) { @@ -83,27 +84,31 @@ final class LabelsViewModel: ObservableObject { } func saveItemLabelChanges( - itemID _: String, - dataService _: DataService, - onComplete _: @escaping ([LinkedItemLabel]) -> Void + 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) + isLoading = true + dataService.updateArticleLabelsPublisher(itemID: itemID, labelIDs: selectedLabels.map(\.unwrappedID)).sink( + receiveCompletion: { [weak self] _ in + self?.isLoading = false + }, + receiveValue: { labelIDs in + onComplete( + labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel } + ) + } + ) + .store(in: &subscriptions) } - func addLabelToItem(_: LinkedItemLabel) { -// selectedLabels.insert(label, at: 0) -// unselectedLabels.removeAll { $0.id == label.id } + func addLabelToItem(_ label: 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 } + func removeLabelFromItem(_ label: LinkedItemLabel) { + unselectedLabels.insert(label, at: 0) + selectedLabels.removeAll { $0.id == label.id } } } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift index 5d0fc7916..20467443c 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleLabelsPublisher.swift @@ -5,6 +5,7 @@ import Models import SwiftGraphQL public extension DataService { + // swiftlint:disable:next function_body_length func updateArticleLabelsPublisher( itemID: String, labelIDs: [String] @@ -45,27 +46,31 @@ public extension DataService { switch payload.data { case let .saved(labels): - guard let linkedItem = LinkedItem.lookup(byID: itemID, inContext: self.backgroundContext) else { - promise(.failure(.message(messageText: "failed to set labels"))) - return - } - self.backgroundContext.perform { + guard let linkedItem = LinkedItem.lookup(byID: itemID, inContext: self.backgroundContext) else { + promise(.failure(.message(messageText: "failed to set labels"))) + return + } + if let existingLabels = linkedItem.labels { linkedItem.removeFromLabels(existingLabels) } - linkedItem.addToLabels(NSSet(array: labels)) - } + for label in labels { + if let labelObject = LinkedItemLabel.lookup(byID: label.id, inContext: self.backgroundContext) { + linkedItem.addToLabels(labelObject) + } + } - do { - try self.backgroundContext.save() - logger.debug("Item labels updated") - let labelObjects = linkedItem.labels.asArray(of: LinkedItemLabel.self) - promise(.success(labelObjects.map(\.objectID))) - } catch { - self.backgroundContext.rollback() - logger.debug("Failed to update item labels: \(error.localizedDescription)") - promise(.failure(.message(messageText: "failed to set labels"))) + do { + try self.backgroundContext.save() + logger.debug("Item labels updated") + let labelObjects = linkedItem.labels.asArray(of: LinkedItemLabel.self) + promise(.success(labelObjects.map(\.objectID))) + } catch { + self.backgroundContext.rollback() + logger.debug("Failed to update item labels: \(error.localizedDescription)") + promise(.failure(.message(messageText: "failed to set labels"))) + } } case .error: promise(.failure(.message(messageText: "failed to set labels"))) diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift index 79f154c28..f8dabe194 100644 --- a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift @@ -41,6 +41,8 @@ struct InternalLinkedItemLabel { } extension LinkedItemLabel { + public var unwrappedID: String { id ?? "" } + static func lookup(byID labelID: String, inContext context: NSManagedObjectContext) -> LinkedItemLabel? { let fetchRequest: NSFetchRequest = LinkedItemLabel.fetchRequest() fetchRequest.predicate = NSPredicate(