diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift index fdb8a2e75..7870449e2 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift @@ -1,4 +1,3 @@ -import Combine import Models import Services import SwiftUI @@ -12,8 +11,6 @@ import Views @Published var showCreateEmailModal = false @Published var labelSearchFilter = "" - var subscriptions = Set() - func loadLabels( dataService: DataService, item: LinkedItem? = nil, @@ -58,20 +55,10 @@ import Views } func deleteLabel(dataService: DataService, labelID: String, name: String) { - isLoading = true - - dataService.removeLabelPublisher(labelID: labelID, name: name).sink( - receiveCompletion: { [weak self] _ in - self?.isLoading = false - }, - receiveValue: { [weak self] _ in - self?.isLoading = false - self?.labels.removeAll { $0.name == name } - self?.selectedLabels.removeAll { $0.name == name } - self?.unselectedLabels.removeAll { $0.name == name } - } - ) - .store(in: &subscriptions) + 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) { diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift index ac1a9be7b..8b76b609b 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift @@ -3,8 +3,20 @@ import Foundation import Models import SwiftGraphQL -public extension DataService { - func removeLabelPublisher(labelID: String, name: String) -> AnyPublisher { +extension DataService { + public func removeLabel(labelID: String, name: String) { + // Update CoreData + backgroundContext.perform { [weak self] in + guard let self = self else { return } + guard let label = LinkedItemLabel.lookup(byName: name, inContext: self.backgroundContext) else { return } + label.remove(inContext: self.backgroundContext) + + // Send update to server + self.syncLabelDeletion(labelID: labelID, labelName: name) + } + } + + func syncLabelDeletion(labelID: String, labelName: String) { enum MutationResult { case success(labelID: String) case error(errorCode: Enums.DeleteLabelErrorCode) @@ -25,34 +37,30 @@ public extension DataService { let path = appEnvironment.graphqlPath let headers = networker.defaultHeaders + let context = backgroundContext - return Deferred { - Future { promise in - send(mutation, to: path, headers: headers) { result in - switch result { - case let .success(payload): - if payload.errors != nil { - promise(.failure(.message(messageText: "Error removing label"))) - } + send(mutation, to: path, headers: headers) { result in + let data = try? result.get() + let isSyncSuccess = data != nil - switch payload.data { - case .success: - if let label = LinkedItemLabel.lookup(byName: name, inContext: self.backgroundContext) { - label.remove(inContext: self.backgroundContext) - promise(.success(true)) - } else { - promise(.failure(.message(messageText: "Error removing label"))) - } - case .error: - promise(.failure(.message(messageText: "Error removing label"))) - } - case .failure: - promise(.failure(.message(messageText: "Error removing label"))) - } + context.perform { + let label = LinkedItemLabel.lookup(byName: labelName, inContext: context) + guard let label = label else { return } + + if isSyncSuccess { + label.remove(inContext: context) + } else { + label.serverSyncStatus = Int64(ServerSyncStatus.needsDeletion.rawValue) + } + + do { + try context.save() + logger.debug("LinkedItem deleted succesfully") + } catch { + context.rollback() + logger.debug("Failed to delete LinkedItem: \(error.localizedDescription)") } } } - .receive(on: DispatchQueue.main) - .eraseToAnyPublisher() } }