Adds AddSourceViewController to add sources by URL or from list of recommended sources

This commit is contained in:
Riley Testut
2023-10-18 18:56:40 -05:00
committed by Magesh K
parent 2aebaf80e0
commit 98125e93aa
13 changed files with 1096 additions and 23 deletions

View File

@@ -31,6 +31,30 @@ extension SourceDetailViewController
{
self.source = source
let sourceID = source.identifier
let addedPublisher = NotificationCenter.default.publisher(for: AppManager.didAddSourceNotification, object: nil)
let removedPublisher = NotificationCenter.default.publisher(for: AppManager.didRemoveSourceNotification, object: nil)
Publishers.Merge(addedPublisher, removedPublisher)
.filter { notification -> Bool in
guard let source = notification.object as? Source, let context = source.managedObjectContext else { return false }
let updatedSourceID = context.performAndWait { source.identifier }
return sourceID == updatedSourceID
}
.compactMap { notification in
switch notification.name
{
case AppManager.didAddSourceNotification: return true
case AppManager.didRemoveSourceNotification: return false
default: return nil
}
}
.filter { $0 != nil }
.receive(on: RunLoop.main)
.assign(to: &self.$isSourceAdded)
Task<Void, Never> {
do
{
@@ -49,6 +73,8 @@ class SourceDetailViewController: HeaderContentViewController<SourceHeaderView,
{
@Managed private(set) var source: Source
var addedSourceHandler: ((Source) -> Void)?
private let viewModel: ViewModel
private var addButton: VibrantButton!
@@ -224,7 +250,6 @@ class SourceDetailViewController: HeaderContentViewController<SourceHeaderView,
self.viewModel.isAddingSource = true
Task<Void, Never> { /* @MainActor in */ // Already on MainActor, even though this function wasn't called from async context.
var isSourceAdded: Bool?
var errorTitle = NSLocalizedString("Unable to Add Source", comment: "")
do
@@ -238,9 +263,9 @@ class SourceDetailViewController: HeaderContentViewController<SourceHeaderView,
else
{
try await AppManager.shared.add(self.source, presentingViewController: self)
self.addedSourceHandler?(self.source)
}
isSourceAdded = try await self.source.isAdded
}
catch is CancellationError {}
catch
@@ -249,11 +274,6 @@ class SourceDetailViewController: HeaderContentViewController<SourceHeaderView,
}
self.viewModel.isAddingSource = false
if let isSourceAdded
{
self.viewModel.isSourceAdded = isSourceAdded
}
}
}