diff --git a/apple/Omnivore.xcodeproj/project.pbxproj b/apple/Omnivore.xcodeproj/project.pbxproj index 7b20a9b8c..24594bc28 100644 --- a/apple/Omnivore.xcodeproj/project.pbxproj +++ b/apple/Omnivore.xcodeproj/project.pbxproj @@ -1233,7 +1233,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 75; DEVELOPMENT_TEAM = QJF2XZ86HB; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = InfoPlists/ShareExtensionMac.plist; @@ -1243,7 +1243,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "app.omnivore.app.ShareExtension-Mac"; @@ -1265,7 +1265,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 75; DEVELOPMENT_TEAM = QJF2XZ86HB; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = InfoPlists/ShareExtensionMac.plist; @@ -1275,7 +1275,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "app.omnivore.app.ShareExtension-Mac"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1347,7 +1347,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 75; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = QJF2XZ86HB; ENABLE_HARDENED_RUNTIME = YES; @@ -1358,7 +1358,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; @@ -1381,7 +1381,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 75; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = QJF2XZ86HB; ENABLE_HARDENED_RUNTIME = YES; @@ -1392,7 +1392,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1447,7 +1447,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; PRODUCT_NAME = Omnivore; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1479,7 +1479,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ( @@ -1518,7 +1518,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ( "-framework", @@ -1544,7 +1544,7 @@ CODE_SIGN_ENTITLEMENTS = "Entitlements/SafariExtension-Mac.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 75; DEVELOPMENT_TEAM = QJF2XZ86HB; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1557,7 +1557,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ( @@ -1583,7 +1583,7 @@ CODE_SIGN_ENTITLEMENTS = "Entitlements/SafariExtension-Mac.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 75; DEVELOPMENT_TEAM = QJF2XZ86HB; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1596,7 +1596,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; MTL_FAST_MATH = YES; OTHER_LDFLAGS = ( "-framework", @@ -1683,7 +1683,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; PRODUCT_BUNDLE_IDENTIFIER = "app.omnivore.app.share-extension"; PRODUCT_NAME = ShareExtension; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1738,7 +1738,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; PRODUCT_BUNDLE_IDENTIFIER = app.omnivore.app; PRODUCT_NAME = Omnivore; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1767,7 +1767,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.14.0; + MARKETING_VERSION = 1.15.0; PRODUCT_BUNDLE_IDENTIFIER = "app.omnivore.app.share-extension"; PRODUCT_NAME = ShareExtension; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeleteHighlight.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeleteHighlight.swift index ff9a95b87..286e0524b 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeleteHighlight.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/DeleteHighlight.swift @@ -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) } } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift index fc7c02c2b..9df043f40 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLabelPublisher.swift @@ -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) { diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift index d6a3e3894..5fd1bbfca 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/RemoveLink.swift @@ -3,16 +3,26 @@ 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 } - guard let linkedItem = self.backgroundContext.object(with: objectID) as? LinkedItem else { return } - linkedItem.remove(inContext: self.backgroundContext) + viewContext.performAndWait { + guard let linkedItem = viewContext.object(with: objectID) as? LinkedItem else { return } + linkedItem.serverSyncStatus = Int64(ServerSyncStatus.needsDeletion.rawValue) - // Send update to server - self.syncLinkDeletion(itemID: linkedItem.unwrappedID, objectID: objectID) + do { + try viewContext.save() + logger.debug("LinkedItem succesfully marked for deletion") + } catch { + viewContext.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) } }