NetNewsWire/Mac/MainWindow/AddFeed/AddFeedController.swift

165 lines
4.9 KiB
Swift
Raw Normal View History

2017-05-27 10:43:27 -07:00
//
// AddFeedController.swift
2018-08-28 22:18:24 -07:00
// NetNewsWire
2017-05-27 10:43:27 -07:00
//
// Created by Brent Simmons on 8/28/16.
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
2017-05-27 10:43:27 -07:00
//
import AppKit
import CoreResources
2024-03-21 17:21:50 -07:00
import Tree
import Articles
2017-09-17 12:34:10 -07:00
import Account
import Parser
2024-04-06 22:09:17 -07:00
import CommonErrors
2017-05-27 10:43:27 -07:00
// Run add-feed sheet.
// If it returns with URL and optional name,
// run FeedFinder plus modal progress window.
// If FeedFinder returns feed,
// add feed.
// Else,
// display error sheet.
2024-03-19 23:05:30 -07:00
@MainActor final class AddFeedController: AddFeedWindowControllerDelegate {
2017-05-27 10:43:27 -07:00
2017-10-21 15:56:01 -07:00
private let hostWindow: NSWindow
private var addFeedWindowController: AddFeedWindowController?
private var foundFeedURLString: String?
private var titleFromFeed: String?
2017-05-27 10:43:27 -07:00
init(hostWindow: NSWindow) {
self.hostWindow = hostWindow
}
func showAddFeedSheet(_ urlString: String? = nil, _ name: String? = nil, _ account: Account? = nil, _ folder: Folder? = nil) {
2017-05-27 10:43:27 -07:00
let folderTreeControllerDelegate = FolderTreeControllerDelegate()
2019-05-01 14:56:26 -05:00
let folderTreeController = TreeController(delegate: folderTreeControllerDelegate)
2017-05-27 10:43:27 -07:00
addFeedWindowController = AddFeedWindowController(urlString: urlString ?? urlStringFromPasteboard,
name: name,
account: account,
folder: folder,
folderTreeController: folderTreeController,
delegate: self)
2017-05-27 10:43:27 -07:00
addFeedWindowController!.runSheetOnWindow(hostWindow)
}
// MARK: AddFeedWindowControllerDelegate
2020-04-21 21:25:45 -05:00
func addFeedWindowController(_: AddFeedWindowController, userEnteredURL url: URL, userEnteredTitle title: String?, container: Container) {
2017-09-17 12:54:08 -07:00
closeAddFeedSheet(NSApplication.ModalResponse.OK)
2017-10-21 15:56:01 -07:00
guard let accountAndFolderSpecifier = accountAndFolderFromContainer(container) else {
return
}
let account = accountAndFolderSpecifier.account
if account.hasFeed(withURL: url.absoluteString) {
2017-10-21 15:56:01 -07:00
showAlreadySubscribedError(url.absoluteString)
return
}
2024-04-02 20:46:28 -07:00
beginShowingProgress()
Task { @MainActor in
do {
let feed = try await account.createFeed(url: url.absoluteString, name: title, container: container, validateFeed: true)
NotificationCenter.default.post(name: .UserDidAddFeed, object: self, userInfo: [UserInfoKey.feed: feed])
2024-04-02 20:46:28 -07:00
2024-04-07 14:57:05 -07:00
} catch AccountError.createErrorAlreadySubscribed {
2024-04-02 20:46:28 -07:00
self.showAlreadySubscribedError(url.absoluteString)
2024-04-07 14:57:05 -07:00
} catch AccountError.createErrorNotFound {
2024-04-02 20:46:28 -07:00
self.showNoFeedsErrorMessage()
} catch {
NSApplication.shared.presentError(error)
2019-05-08 17:41:19 -05:00
}
2024-04-02 20:46:28 -07:00
self.endShowingProgress()
2019-05-08 17:41:19 -05:00
}
2017-05-27 10:43:27 -07:00
}
2020-04-21 21:25:45 -05:00
func addFeedWindowControllerUserDidCancel(_: AddFeedWindowController) {
2017-09-17 12:54:08 -07:00
closeAddFeedSheet(NSApplication.ModalResponse.cancel)
2017-05-27 10:43:27 -07:00
}
}
private extension AddFeedController {
var urlStringFromPasteboard: String? {
2020-01-10 14:00:22 -06:00
if let urlString = NSPasteboard.urlString(from: NSPasteboard.general) {
return urlString.normalizedURL
2017-05-27 10:43:27 -07:00
}
return nil
2017-05-27 10:43:27 -07:00
}
2017-10-21 15:56:01 -07:00
struct AccountAndFolderSpecifier {
let account: Account
let folder: Folder?
}
func accountAndFolderFromContainer(_ container: Container) -> AccountAndFolderSpecifier? {
if let account = container as? Account {
return AccountAndFolderSpecifier(account: account, folder: nil)
}
2017-10-21 16:37:40 -07:00
if let folder = container as? Folder, let account = folder.account {
return AccountAndFolderSpecifier(account: account, folder: folder)
2017-10-21 15:56:01 -07:00
}
return nil
}
2017-09-17 12:54:08 -07:00
func closeAddFeedSheet(_ returnCode: NSApplication.ModalResponse) {
2017-05-27 10:43:27 -07:00
if let sheetWindow = addFeedWindowController?.window {
hostWindow.endSheet(sheetWindow, returnCode: returnCode)
}
}
// MARK: Errors
2017-10-21 15:56:01 -07:00
func showAlreadySubscribedError(_ urlString: String) {
2017-05-27 10:43:27 -07:00
let alert = NSAlert()
alert.alertStyle = .informational
alert.messageText = NSLocalizedString("Already subscribed", comment: "Feed finder")
alert.informativeText = NSLocalizedString("Cant add this feed because youve already subscribed to it.", comment: "Feed finder")
alert.beginSheetModal(for: hostWindow)
}
func showInitialDownloadError(_ error: Error) {
let alert = NSAlert()
alert.alertStyle = .informational
alert.messageText = NSLocalizedString("Download Error", comment: "Feed finder")
let formatString = NSLocalizedString("Cant add this feed because of a download error: “%@”", comment: "Feed finder")
let errorText = NSString.localizedStringWithFormat(formatString as NSString, error.localizedDescription)
alert.informativeText = errorText as String
alert.beginSheetModal(for: hostWindow)
}
func showNoFeedsErrorMessage() {
let alert = NSAlert()
alert.alertStyle = .informational
alert.messageText = NSLocalizedString("Feed not found", comment: "Feed finder")
alert.informativeText = NSLocalizedString("Cant add a feed because no feed was found.", comment: "Feed finder")
alert.beginSheetModal(for: hostWindow)
}
// MARK: Progress
func beginShowingProgress() {
runIndeterminateProgressWithMessage(NSLocalizedString("Finding feed…", comment:"Feed finder"))
}
func endShowingProgress() {
stopIndeterminateProgress()
hostWindow.makeKeyAndOrderFront(self)
}
2020-04-21 21:25:45 -05:00
2017-05-27 10:43:27 -07:00
}