Add create Feedbin feed

This commit is contained in:
Maurice Parker
2019-05-08 17:41:19 -05:00
parent 72c92587d2
commit 43d32b1281
16 changed files with 344 additions and 280 deletions

View File

@@ -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) {