mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
update delete labels function to work from core data
This commit is contained in:
parent
acb1ae6c53
commit
fb4312e52a
2 changed files with 38 additions and 43 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue