update delete labels function to work from core data

This commit is contained in:
Satindar Dhillon 2022-04-27 20:11:50 -07:00
parent acb1ae6c53
commit fb4312e52a
2 changed files with 38 additions and 43 deletions

View file

@ -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<AnyCancellable>()
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) {

View file

@ -3,8 +3,20 @@ import Foundation
import Models
import SwiftGraphQL
public extension DataService {
func removeLabelPublisher(labelID: String, name: String) -> AnyPublisher<Bool, BasicError> {
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()
}
}