From a03430a790e5254c96560278d27faef59c915881 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 5 May 2021 21:24:27 -0500 Subject: [PATCH] Retain existing feeds for folders that haven't been created yet. Fixes #3047 --- .../CloudKitAccountZoneDelegate.swift | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift b/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift index 73d347ec0..8ff7fbe3f 100644 --- a/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift +++ b/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift @@ -16,8 +16,9 @@ import Articles class CloudKitAcountZoneDelegate: CloudKitZoneDelegate { private typealias UnclaimedWebFeed = (url: URL, name: String?, editedName: String?, homePageURL: String?, webFeedExternalID: String) - private var unclaimedWebFeeds = [String: [UnclaimedWebFeed]]() - + private var newUnclaimedWebFeeds = [String: [UnclaimedWebFeed]]() + private var existingUnclaimedWebFeeds = [String: [WebFeed]]() + private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit") weak var account: Account? @@ -75,7 +76,7 @@ class CloudKitAcountZoneDelegate: CloudKitZoneDelegate { if let container = account.existingContainer(withExternalID: containerExternalID) { createWebFeedIfNecessary(url: url, name: name, editedName: editedName, homePageURL: homePageURL, webFeedExternalID: record.externalID, container: container) } else { - addUnclaimedWebFeed(url: url, name: name, editedName: editedName, homePageURL: homePageURL, webFeedExternalID: record.externalID, containerExternalID: containerExternalID) + addNewUnclaimedWebFeed(url: url, name: name, editedName: editedName, homePageURL: homePageURL, webFeedExternalID: record.externalID, containerExternalID: containerExternalID) } } } @@ -106,19 +107,27 @@ class CloudKitAcountZoneDelegate: CloudKitZoneDelegate { folder?.externalID = record.externalID } - if let folder = folder, let containerExternalID = folder.externalID, let unclaimedWebFeeds = unclaimedWebFeeds[containerExternalID] { - for unclaimedWebFeed in unclaimedWebFeeds { - createWebFeedIfNecessary(url: unclaimedWebFeed.url, - name: unclaimedWebFeed.name, - editedName: unclaimedWebFeed.editedName, - homePageURL: unclaimedWebFeed.homePageURL, - webFeedExternalID: unclaimedWebFeed.webFeedExternalID, + guard let folder = folder, let containerExternalID = folder.externalID else { return } + + if let newUnclaimedWebFeeds = newUnclaimedWebFeeds[containerExternalID] { + for newUnclaimedWebFeed in newUnclaimedWebFeeds { + createWebFeedIfNecessary(url: newUnclaimedWebFeed.url, + name: newUnclaimedWebFeed.name, + editedName: newUnclaimedWebFeed.editedName, + homePageURL: newUnclaimedWebFeed.homePageURL, + webFeedExternalID: newUnclaimedWebFeed.webFeedExternalID, container: folder) } - self.unclaimedWebFeeds.removeValue(forKey: containerExternalID) + self.newUnclaimedWebFeeds.removeValue(forKey: containerExternalID) } + if let existingUnclaimedWebFeeds = existingUnclaimedWebFeeds[containerExternalID] { + for existingUnclaimedWebFeed in existingUnclaimedWebFeeds { + folder.addWebFeed(existingUnclaimedWebFeed) + } + self.existingUnclaimedWebFeeds.removeValue(forKey: containerExternalID) + } } func removeContainer(_ externalID: String) { @@ -152,6 +161,8 @@ private extension CloudKitAcountZoneDelegate { case .insert(_, let externalID, _): if let container = account.existingContainer(withExternalID: externalID) { container.addWebFeed(webFeed) + } else { + addExistingUnclaimedWebFeed(webFeed, containerExternalID: externalID) } } } @@ -170,14 +181,25 @@ private extension CloudKitAcountZoneDelegate { container.addWebFeed(webFeed) } - func addUnclaimedWebFeed(url: URL, name: String?, editedName: String?, homePageURL: String?, webFeedExternalID: String, containerExternalID: String) { - if var unclaimedWebFeeds = self.unclaimedWebFeeds[containerExternalID] { + func addNewUnclaimedWebFeed(url: URL, name: String?, editedName: String?, homePageURL: String?, webFeedExternalID: String, containerExternalID: String) { + if var unclaimedWebFeeds = self.newUnclaimedWebFeeds[containerExternalID] { unclaimedWebFeeds.append(UnclaimedWebFeed(url: url, name: name, editedName: editedName, homePageURL: homePageURL, webFeedExternalID: webFeedExternalID)) - self.unclaimedWebFeeds[containerExternalID] = unclaimedWebFeeds + self.newUnclaimedWebFeeds[containerExternalID] = unclaimedWebFeeds } else { var unclaimedWebFeeds = [UnclaimedWebFeed]() unclaimedWebFeeds.append(UnclaimedWebFeed(url: url, name: name, editedName: editedName, homePageURL: homePageURL, webFeedExternalID: webFeedExternalID)) - self.unclaimedWebFeeds[containerExternalID] = unclaimedWebFeeds + self.newUnclaimedWebFeeds[containerExternalID] = unclaimedWebFeeds + } + } + + func addExistingUnclaimedWebFeed(_ webFeed: WebFeed, containerExternalID: String) { + if var unclaimedWebFeeds = self.existingUnclaimedWebFeeds[containerExternalID] { + unclaimedWebFeeds.append(webFeed) + self.existingUnclaimedWebFeeds[containerExternalID] = unclaimedWebFeeds + } else { + var unclaimedWebFeeds = [WebFeed]() + unclaimedWebFeeds.append(webFeed) + self.existingUnclaimedWebFeeds[containerExternalID] = unclaimedWebFeeds } }