delete link from view context rather than background context

This commit is contained in:
Satindar Dhillon
2022-09-29 08:39:31 -07:00
parent d97eddaf7d
commit 6b6a2c381d
2 changed files with 29 additions and 17 deletions

View File

@ -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: {})

View File

@ -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)")
}
}
}
}