diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift index 3624aec4b..fdf356573 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift @@ -185,9 +185,16 @@ struct WebReaderContainerView: View { .alert("Are you sure?", isPresented: $showDeleteConfirmation) { Button("Remove Link", role: .destructive) { Snackbar.show(message: "Link removed") - dataService.removeLink(objectID: item.objectID) + #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 d6a3e3894..ee8184b4a 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift @@ -3,8 +3,8 @@ import Foundation import Models import SwiftGraphQL -extension DataService { - public func removeLink(objectID: NSManagedObjectID) { +public extension DataService { + func removeLink(objectID: NSManagedObjectID) { // Update CoreData backgroundContext.perform { [weak self] in guard let self = self else { return } @@ -16,7 +16,10 @@ extension DataService { } } - func syncLinkDeletion(itemID: String, objectID: NSManagedObjectID) { + // 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?) { enum MutationResult { case success(linkId: String) case error(errorCode: Enums.SetBookmarkArticleErrorCode) @@ -53,21 +56,23 @@ extension DataService { let data = try? result.get() let isSyncSuccess = data != nil - context.perform { - guard let linkedItem = context.object(with: objectID) as? LinkedItem else { return } + if let objectID = objectID { + 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)") + } } } }