// // AddFeedViewController.swift // NetNewsWire // // Created by Maurice Parker on 4/16/19. // Copyright © 2019 Ranchero Software, LLC. All rights reserved. // import UIKit import Account import RSCore import RSTree import RSParser class AddWebFeedViewController: UITableViewController, AddContainerViewControllerChild { @IBOutlet private weak var urlTextField: UITextField! @IBOutlet weak var urlTextFieldToSuperViewConstraint: NSLayoutConstraint! @IBOutlet weak var urlBuilderButton: UIButton! @IBOutlet private weak var nameTextField: UITextField! private var folderLabel = "" private var userCancelled = false weak var delegate: AddContainerViewControllerChildDelegate? var initialFeed: String? var initialFeedName: String? var container: Container? override func viewDidLoad() { super.viewDidLoad() if initialFeed == nil, let urlString = UIPasteboard.general.string { if urlString.mayBeURL { initialFeed = urlString.normalizedURL } } urlTextField.autocorrectionType = .no urlTextField.autocapitalizationType = .none urlTextField.text = initialFeed urlTextField.delegate = self if ExtensionPointManager.shared.isTwitterEnabled { urlTextFieldToSuperViewConstraint.isActive = false urlTextField.trailingAnchor.constraint(equalTo: urlBuilderButton.leadingAnchor, constant: -8).isActive = true } else { urlBuilderButton.isHidden = true } if initialFeed != nil { delegate?.readyToAdd(state: true) } nameTextField.text = initialFeedName nameTextField.delegate = self if let defaultContainer = AddWebFeedDefaultContainer.defaultContainer { container = defaultContainer } else { delegate?.readyToAdd(state: false) } updateFolderLabel() // I couldn't figure out the gap at the top of the UITableView, so I took a hammer to it. tableView.contentInset = UIEdgeInsets(top: -28, left: 0, bottom: 0, right: 0) tableView.register(UINib(nibName: "AddWebFeedSelectFolderTableViewCell", bundle: nil), forCellReuseIdentifier: "AddWebFeedSelectFolderTableViewCell") NotificationCenter.default.addObserver(self, selector: #selector(textDidChange(_:)), name: UITextField.textDidChangeNotification, object: urlTextField) } @IBAction func showURLBuilder(_ sender: Any) { let navController = UIStoryboard.add.instantiateViewController(withIdentifier: "SelectURLBuilderNavViewController") as! UINavigationController navController.modalPresentationStyle = .currentContext let selectURLBuilder = navController.topViewController as! SelectURLBuilderTableViewController selectURLBuilder.delegate = self present(navController, animated: true) } func cancel() { userCancelled = true delegate?.processingDidCancel() } func add() { let urlString = urlTextField.text ?? "" let normalizedURLString = urlString.normalizedURL guard !normalizedURLString.isEmpty, let url = URL(unicodeString: normalizedURLString) else { delegate?.processingDidCancel() return } guard let container = container else { return } var account: Account? if let containerAccount = container as? Account { account = containerAccount } else if let containerFolder = container as? Folder, let containerAccount = containerFolder.account { account = containerAccount } if account!.hasWebFeed(withURL: url.absoluteString) { presentError(AccountError.createErrorAlreadySubscribed) return } delegate?.processingDidBegin() let feedName = (nameTextField.text?.isEmpty ?? true) ? nil : nameTextField.text BatchUpdate.shared.start() account!.createWebFeed(url: url.absoluteString, name: feedName, container: container) { result in BatchUpdate.shared.end() switch result { case .success(let feed): self.delegate?.processingDidEnd() NotificationCenter.default.post(name: .UserDidAddFeed, object: self, userInfo: [UserInfoKey.webFeed: feed]) case .failure(let error): self.presentError(error) self.delegate?.processingDidCancel() } } } @objc func textDidChange(_ note: Notification) { updateUI() } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.row == 2 { let cell = tableView.dequeueReusableCell(withIdentifier: "AddWebFeedSelectFolderTableViewCell", for: indexPath) as? AddWebFeedSelectFolderTableViewCell cell!.detailLabel.text = folderLabel return cell! } else { return super.tableView(tableView, cellForRowAt: indexPath) } } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if indexPath.row == 2 { let navController = UIStoryboard.add.instantiateViewController(withIdentifier: "AddWebFeedFolderNavViewController") as! UINavigationController navController.modalPresentationStyle = .currentContext let folderViewController = navController.topViewController as! AddWebFeedFolderViewController folderViewController.delegate = self folderViewController.initialContainer = container present(navController, animated: true) } } } // MARK: AddWebFeedFolderViewControllerDelegate extension AddWebFeedViewController: AddWebFeedFolderViewControllerDelegate { func didSelect(container: Container) { self.container = container updateFolderLabel() AddWebFeedDefaultContainer.saveDefaultContainer(container) } } // MARK: AddWebFeedFolderViewControllerDelegate extension AddWebFeedViewController: SelectURLBuilderDelegate { func selectURLBuilderDidBuildURL(_ url: URL) { urlTextField.text = url.absoluteString updateUI() } } // MARK: UITextFieldDelegate extension AddWebFeedViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } } // MARK: Private private extension AddWebFeedViewController { func updateUI() { delegate?.readyToAdd(state: urlTextField.text?.mayBeURL ?? false) } func updateFolderLabel() { if let containerName = (container as? DisplayNameProvider)?.nameForDisplay { if container is Folder { folderLabel = "\(container?.account?.nameForDisplay ?? "") / \(containerName)" } else { folderLabel = containerName } tableView.reloadData() } } }