make sure coredata is updated before popping delted item

This commit is contained in:
Satindar Dhillon 2022-09-29 11:30:31 -07:00
parent 6b6a2c381d
commit 96ed76e562
2 changed files with 35 additions and 35 deletions

View file

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

View file

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