mark highlights and labels for deletion before server sync

This commit is contained in:
Satindar Dhillon 2022-09-29 20:24:43 -07:00
parent 157edb0ae3
commit 924592ab6b
5 changed files with 37 additions and 22 deletions

View file

@ -233,7 +233,7 @@ import Views
func removeLink(dataService: DataService, objectID: NSManagedObjectID) {
Snackbar.show(message: "Link removed")
dataService.removeLink(objectID: objectID, useViewContext: true)
dataService.removeLink(objectID: objectID)
}
func snoozeUntil(dataService: DataService, linkId: String, until: Date, successMessage: String?) async {

View file

@ -185,7 +185,7 @@ 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)
dataService.removeLink(objectID: item.objectID)
#if os(iOS)
presentationMode.wrappedValue.dismiss()
#endif

View file

@ -5,20 +5,30 @@ import SwiftGraphQL
public extension DataService {
func deleteHighlight(highlightID: String) {
if let highlight = Highlight.lookup(byID: highlightID, inContext: backgroundContext) {
if let highlight = Highlight.lookup(byID: highlightID, inContext: viewContext) {
deleteHighlight(objectID: highlight.objectID)
}
}
private func deleteHighlight(objectID: NSManagedObjectID) {
// Update CoreData
backgroundContext.perform { [weak self] in
guard let self = self else { return }
guard let highlight = self.backgroundContext.object(with: objectID) as? Highlight else { return }
highlight.remove(inContext: self.backgroundContext)
viewContext.performAndWait {
guard let highlight = viewContext.object(with: objectID) as? Highlight else { return }
highlight.serverSyncStatus = Int64(ServerSyncStatus.needsDeletion.rawValue)
// Send update to server
self.syncHighlightDeletion(highlightID: highlight.unwrappedID, objectID: objectID)
do {
try viewContext.save()
logger.debug("Highlight succesfully marked for deletion")
} catch {
viewContext.rollback()
logger.debug("Failed to mark Highlight for deletion: \(error.localizedDescription)")
}
}
// Send update to server
backgroundContext.perform { [weak self] in
guard let highlight = self?.backgroundContext.object(with: objectID) as? Highlight else { return }
self?.syncHighlightDeletion(highlightID: highlight.unwrappedID, objectID: objectID)
}
}

View file

@ -5,14 +5,21 @@ import SwiftGraphQL
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(byID: labelID, inContext: self.backgroundContext) else { return }
label.remove(inContext: self.backgroundContext)
viewContext.performAndWait {
guard let label = LinkedItemLabel.lookup(byID: labelID, inContext: self.viewContext) else { return }
label.serverSyncStatus = Int64(ServerSyncStatus.needsDeletion.rawValue)
// Send update to server
self.syncLabelDeletion(labelID: labelID, labelName: name)
do {
try viewContext.save()
logger.debug("Label succesfully marked for deletion")
} catch {
viewContext.rollback()
logger.debug("Failed to mark Label for deletion: \(error.localizedDescription)")
}
}
// Send update to server
syncLabelDeletion(labelID: labelID, labelName: name)
}
func syncLabelDeletion(labelID: String, labelName _: String) {

View file

@ -4,19 +4,17 @@ import Models
import SwiftGraphQL
public extension DataService {
func removeLink(objectID: NSManagedObjectID, useViewContext: Bool = false) {
let context = useViewContext ? viewContext : backgroundContext
func removeLink(objectID: NSManagedObjectID) {
// Update CoreData
context.performAndWait {
guard let linkedItem = context.object(with: objectID) as? LinkedItem else { return }
viewContext.performAndWait {
guard let linkedItem = viewContext.object(with: objectID) as? LinkedItem else { return }
linkedItem.serverSyncStatus = Int64(ServerSyncStatus.needsDeletion.rawValue)
do {
try context.save()
try viewContext.save()
logger.debug("LinkedItem succesfully marked for deletion")
} catch {
context.rollback()
viewContext.rollback()
logger.debug("Failed to mark LinkedItem for deletion: \(error.localizedDescription)")
}
}