diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift index fdf356573..377b7e0fe 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift @@ -185,16 +185,9 @@ struct WebReaderContainerView: View { .alert("Are you sure?", isPresented: $showDeleteConfirmation) { Button("Remove Link", role: .destructive) { Snackbar.show(message: "Link removed") - + dataService.removeLink(objectID: item.objectID, useViewContext: true) #if os(iOS) - let itemID = item.unwrappedID - dataService.viewContext.performAndWait { - item.remove(inContext: dataService.viewContext) - } - dataService.syncLinkDeletion(itemID: itemID, objectID: nil) presentationMode.wrappedValue.dismiss() - #else - dataService.removeLink(objectID: item.objectID) #endif } Button("Cancel", role: .cancel, action: {}) diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift index ee8184b4a..2df31817e 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift @@ -4,22 +4,31 @@ import Models import SwiftGraphQL public extension DataService { - func removeLink(objectID: NSManagedObjectID) { - // Update CoreData - backgroundContext.perform { [weak self] in - guard let self = self else { return } - guard let linkedItem = self.backgroundContext.object(with: objectID) as? LinkedItem else { return } - linkedItem.remove(inContext: self.backgroundContext) + func removeLink(objectID: NSManagedObjectID, useViewContext: Bool = false) { + let context = useViewContext ? viewContext : backgroundContext - // Send update to server - self.syncLinkDeletion(itemID: linkedItem.unwrappedID, objectID: objectID) + // Update CoreData + context.performAndWait { + guard let linkedItem = context.object(with: objectID) as? LinkedItem else { return } + linkedItem.serverSyncStatus = Int64(ServerSyncStatus.needsDeletion.rawValue) + + do { + try context.save() + logger.debug("LinkedItem succesfully marked for deletion") + } catch { + context.rollback() + logger.debug("Failed to mark LinkedItem for deletion: \(error.localizedDescription)") + } + } + + // Send update to server + backgroundContext.perform { [weak self] in + guard let linkedItem = self?.backgroundContext.object(with: objectID) as? LinkedItem else { return } + self?.syncLinkDeletion(itemID: linkedItem.unwrappedID, objectID: objectID) } } - // TODO: this doesn't really work since we usually delete from core data first - // and then sync the deletion with the server. So we have no way to recored a failed - // delete call to the server as it is now... - func syncLinkDeletion(itemID: String, objectID: NSManagedObjectID?) { + func syncLinkDeletion(itemID: String, objectID: NSManagedObjectID) { enum MutationResult { case success(linkId: String) case error(errorCode: Enums.SetBookmarkArticleErrorCode) @@ -56,23 +65,21 @@ public extension DataService { let data = try? result.get() let isSyncSuccess = data != nil - if let objectID = objectID { - context.perform { - guard let linkedItem = context.object(with: objectID) as? LinkedItem else { return } + context.perform { + guard let linkedItem = context.object(with: objectID) as? LinkedItem else { return } - if isSyncSuccess { - linkedItem.remove(inContext: context) - } else { - linkedItem.serverSyncStatus = Int64(ServerSyncStatus.needsDeletion.rawValue) - } + if isSyncSuccess { + linkedItem.remove(inContext: context) + } else { + linkedItem.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)") - } + do { + try context.save() + logger.debug("LinkedItem deleted succesfully") + } catch { + context.rollback() + logger.debug("Failed to delete LinkedItem: \(error.localizedDescription)") } } }