// // ShareViewController.swift // NetNewsWire iOS Share Extension // // Created by Maurice Parker on 9/8/19. // Copyright © 2019 Ranchero Software. All rights reserved. // import UIKit import MobileCoreServices import Social import Account import Articles import RSCore import RSTree class ShareViewController: SLComposeServiceViewController, ShareFolderPickerControllerDelegate { private var url: URL? private var container: Container? private var folderItem: SLComposeSheetConfigurationItem! override func viewDidLoad() { AccountManager.shared = AccountManager() container = AddWebFeedDefaultContainer.defaultContainer title = "NetNewsWire" placeholder = "Feed Name (Optional)" if let button = navigationController?.navigationBar.topItem?.rightBarButtonItem { button.title = "Add Feed" button.isEnabled = true } // Hack the bottom table rows to be smaller since the controller itself doesn't have enough sense to size itself correctly if let nav = self.children.first as? UINavigationController, let tableView = nav.children.first?.view.subviews.first as? UITableView { tableView.rowHeight = 38 } var provider: NSItemProvider? = nil // Try to get any HTML that is maybe passed in for item in self.extensionContext!.inputItems as! [NSExtensionItem] { for itemProvider in item.attachments! { if itemProvider.hasItemConformingToTypeIdentifier(kUTTypePropertyList as String) { provider = itemProvider } } } if provider != nil { provider!.loadItem(forTypeIdentifier: kUTTypePropertyList as String, options: nil, completionHandler: { [weak self] (pList, error) in if error != nil { return } guard let dataGraph = pList as? NSDictionary else { return } guard let results = dataGraph["NSExtensionJavaScriptPreprocessingResultsKey"] as? NSDictionary else { return } if let url = URL(string: results["url"] as! String) { self?.url = url } }) return } // Try to get the URL if it is passed in for item in self.extensionContext!.inputItems as! [NSExtensionItem] { for itemProvider in item.attachments! { if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { provider = itemProvider } } } if provider != nil { provider!.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil, completionHandler: { [weak self] (urlCoded, error) in if error != nil { return } guard let url = urlCoded as? URL else { return } self?.url = url }) } } override func isContentValid() -> Bool { return url != nil && container != nil } override func didSelectPost() { guard let url = url, let container = container else { self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) 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 } else { self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) return } if account!.hasWebFeed(withURL: url.absoluteString) { let errorTitle = NSLocalizedString("Error", comment: "Error") presentError(title: errorTitle, message: AccountError.createErrorAlreadySubscribed.localizedDescription) self.extensionContext!.cancelRequest(withError: AccountError.createErrorAlreadySubscribed) return } let feedName = contentText.isEmpty ? nil : contentText ProcessInfo.processInfo.performExpiringActivity(withReason: "Adding web feed to account.") { expired in guard !expired else { return } DispatchQueue.main.async { account!.createWebFeed(url: url.absoluteString, name: feedName, container: container) { result in account!.save() AccountManager.shared.suspendNetworkAll() AccountManager.shared.suspendDatabaseAll() } } } self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) } func shareFolderPickerDidSelect(_ container: Container) { AddWebFeedDefaultContainer.saveDefaultContainer(container) self.container = container updateFolderItemValue() self.popConfigurationViewController() } override func configurationItems() -> [Any]! { // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. guard let urlItem = SLComposeSheetConfigurationItem() else { return nil } urlItem.title = "URL" urlItem.value = url?.absoluteString ?? "" folderItem = SLComposeSheetConfigurationItem() folderItem.title = "Folder" updateFolderItemValue() folderItem.tapHandler = { let folderPickerController = ShareFolderPickerController() folderPickerController.navigationController?.title = NSLocalizedString("Folder", comment: "Folder") folderPickerController.delegate = self folderPickerController.selectedContainer = self.container self.pushConfigurationViewController(folderPickerController) } return [folderItem!, urlItem] } } private extension ShareViewController { func updateFolderItemValue() { if let containerName = (container as? DisplayNameProvider)?.nameForDisplay { if container is Folder { self.folderItem.value = "\(container?.account?.nameForDisplay ?? "") / \(containerName)" } else { self.folderItem.value = containerName } } } }