mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Add create Feedbin feed
This commit is contained in:
@@ -21,19 +21,12 @@ import RSParser
|
||||
// Else,
|
||||
// display error sheet.
|
||||
|
||||
class AddFeedController: AddFeedWindowControllerDelegate, FeedFinderDelegate {
|
||||
class AddFeedController: AddFeedWindowControllerDelegate {
|
||||
|
||||
private let hostWindow: NSWindow
|
||||
private var addFeedWindowController: AddFeedWindowController?
|
||||
private var userEnteredURL: URL?
|
||||
private var userEnteredFolder: Folder?
|
||||
private var userEnteredTitle: String?
|
||||
private var userEnteredAccount: Account?
|
||||
private var foundFeedURLString: String?
|
||||
private var titleFromFeed: String?
|
||||
private var feedFinder: FeedFinder?
|
||||
private var isFindingFeed = false
|
||||
private var bestFeedSpecifier: FeedSpecifier?
|
||||
|
||||
init(hostWindow: NSWindow) {
|
||||
|
||||
@@ -66,12 +59,30 @@ class AddFeedController: AddFeedWindowControllerDelegate, FeedFinderDelegate {
|
||||
return
|
||||
}
|
||||
|
||||
userEnteredAccount = account
|
||||
userEnteredURL = url
|
||||
userEnteredFolder = folder
|
||||
userEnteredTitle = title
|
||||
|
||||
findFeed()
|
||||
account.createFeed(with: nil, url: url.absoluteString) { [weak self] result in
|
||||
|
||||
self?.endShowingProgress()
|
||||
|
||||
switch result {
|
||||
case .success(let createFeedResult):
|
||||
switch createFeedResult {
|
||||
case .created(let feed):
|
||||
self?.processFeed(feed, account: account, folder: folder, url: url, title: title)
|
||||
case .multipleChoice(let feedChoices):
|
||||
print()
|
||||
case .alreadySubscribed:
|
||||
self?.showAlreadySubscribedError(url.absoluteString)
|
||||
case .notFound:
|
||||
self?.showNoFeedsErrorMessage()
|
||||
}
|
||||
case .failure(let error):
|
||||
NSApplication.shared.presentError(error)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
beginShowingProgress()
|
||||
|
||||
}
|
||||
|
||||
func addFeedWindowControllerUserDidCancel(_: AddFeedWindowController) {
|
||||
@@ -79,46 +90,8 @@ class AddFeedController: AddFeedWindowControllerDelegate, FeedFinderDelegate {
|
||||
closeAddFeedSheet(NSApplication.ModalResponse.cancel)
|
||||
}
|
||||
|
||||
// MARK: FeedFinderDelegate
|
||||
|
||||
public func feedFinder(_ feedFinder: FeedFinder, didFindFeeds feedSpecifiers: Set<FeedSpecifier>) {
|
||||
|
||||
isFindingFeed = false
|
||||
endShowingProgress()
|
||||
|
||||
if let error = feedFinder.initialDownloadError {
|
||||
if feedFinder.initialDownloadStatusCode == 404 {
|
||||
showNoFeedsErrorMessage()
|
||||
}
|
||||
else {
|
||||
showInitialDownloadError(error)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
guard let bestFeedSpecifier = FeedSpecifier.bestFeed(in: feedSpecifiers) else {
|
||||
showNoFeedsErrorMessage()
|
||||
return
|
||||
}
|
||||
|
||||
self.bestFeedSpecifier = bestFeedSpecifier
|
||||
self.foundFeedURLString = bestFeedSpecifier.urlString
|
||||
|
||||
if let url = URL(string: bestFeedSpecifier.urlString) {
|
||||
|
||||
InitialFeedDownloader.download(url) { (parsedFeed) in
|
||||
self.titleFromFeed = parsedFeed?.title
|
||||
self.addFeedIfPossible(parsedFeed)
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Shouldn't happen.
|
||||
showNoFeedsErrorMessage()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private extension AddFeedController {
|
||||
|
||||
var urlStringFromPasteboard: String? {
|
||||
@@ -151,50 +124,27 @@ private extension AddFeedController {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func addFeedIfPossible(_ parsedFeed: ParsedFeed?) {
|
||||
|
||||
// Add feed if not already subscribed-to.
|
||||
|
||||
guard let account = userEnteredAccount else {
|
||||
assertionFailure("Expected account.")
|
||||
return
|
||||
func processFeed(_ feed: Feed, account: Account, folder: Folder?, url: URL, title: String?) {
|
||||
|
||||
if let title = title {
|
||||
account.renameFeed(feed, to: title) { result in
|
||||
switch result {
|
||||
case .success:
|
||||
break
|
||||
case .failure(let error):
|
||||
NSApplication.shared.presentError(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
guard let feedURLString = foundFeedURLString else {
|
||||
assertionFailure("Expected feedURLString.")
|
||||
return
|
||||
}
|
||||
|
||||
if account.hasFeed(withURL: feedURLString) {
|
||||
showAlreadySubscribedError(feedURLString)
|
||||
return
|
||||
}
|
||||
|
||||
let feed = account.createFeed(with: titleFromFeed, editedName: userEnteredTitle, url: feedURLString)
|
||||
|
||||
if let parsedFeed = parsedFeed {
|
||||
account.update(feed, with: parsedFeed, {})
|
||||
}
|
||||
|
||||
account.addFeed(feed, to: userEnteredFolder)
|
||||
|
||||
// TODO: make this async and add to above code
|
||||
account.addFeed(feed, to: folder)
|
||||
|
||||
// Move this into the mess above
|
||||
NotificationCenter.default.post(name: .UserDidAddFeed, object: self, userInfo: [UserInfoKey.feed: feed])
|
||||
}
|
||||
|
||||
// MARK: Find Feeds
|
||||
|
||||
func findFeed() {
|
||||
|
||||
guard let url = userEnteredURL else {
|
||||
assertionFailure("Expected userEnteredURL.")
|
||||
return
|
||||
}
|
||||
|
||||
isFindingFeed = true
|
||||
feedFinder = FeedFinder(url: url, delegate: self)
|
||||
|
||||
beginShowingProgress()
|
||||
}
|
||||
|
||||
|
||||
// MARK: Errors
|
||||
|
||||
func showAlreadySubscribedError(_ urlString: String) {
|
||||
|
||||
Reference in New Issue
Block a user