diff --git a/iOS/Article/ArticleViewController.swift b/iOS/Article/ArticleViewController.swift index 99265597b..f60a5da49 100644 --- a/iOS/Article/ArticleViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -22,6 +22,7 @@ enum ArticleViewState: Equatable { class ArticleViewController: UIViewController { + @IBOutlet private weak var readerViewBarButtonItem: UIBarButtonItem! @IBOutlet private weak var nextUnreadBarButtonItem: UIBarButtonItem! @IBOutlet private weak var prevArticleBarButtonItem: UIBarButtonItem! @IBOutlet private weak var nextArticleBarButtonItem: UIBarButtonItem! @@ -178,6 +179,10 @@ class ArticleViewController: UIViewController { // MARK: Actions + @IBAction func toggleReaderView(_ sender: Any) { + coordinator.toggleArticleExtractor() + } + @IBAction func nextUnread(_ sender: Any) { coordinator.selectNextUnread() } diff --git a/iOS/Base.lproj/Main.storyboard b/iOS/Base.lproj/Main.storyboard index b15425794..ef74ea072 100644 --- a/iOS/Base.lproj/Main.storyboard +++ b/iOS/Base.lproj/Main.storyboard @@ -16,7 +16,7 @@ - + @@ -98,7 +98,17 @@ - + + + + + + + + + + + @@ -107,6 +117,7 @@ + @@ -152,6 +163,7 @@ + @@ -203,7 +215,10 @@ - + + + + @@ -226,6 +241,7 @@ + diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 0df1641d8..76952f867 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -27,6 +27,9 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { private var activityManager = ActivityManager() + private var isShowingExtractedArticle = false + private var articleExtractor: ArticleExtractor? = nil + private var rootSplitViewController: RootSplitViewController! private var masterNavigationController: UINavigationController! private var masterFeedViewController: MasterFeedViewController! @@ -795,6 +798,37 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { masterFeedViewController.present(addViewController, animated: true) } + func toggleArticleExtractor() { + + guard let article = currentArticle else { + return + } + + guard articleExtractor?.state != .processing else { + articleExtractor?.cancel() + articleExtractor = nil + isShowingExtractedArticle = false + articleViewController?.state = .article(article) + return + } + + guard !isShowingExtractedArticle else { + isShowingExtractedArticle = false + articleViewController?.state = .article(article) + return + } + + if let articleExtractor = articleExtractor, let extractedArticle = articleExtractor.article { + if currentArticle?.preferredLink == articleExtractor.articleLink { + isShowingExtractedArticle = true + articleViewController?.state = .extracted(article, extractedArticle) + } + } else { + startArticleExtractorForCurrentLink() + } + + } + func homePageURLForFeed(_ indexPath: IndexPath) -> URL? { guard let node = nodeFor(indexPath), let feed = node.representedObject as? Feed, @@ -880,6 +914,24 @@ extension SceneCoordinator: UINavigationControllerDelegate { } +// MARK: ArticleExtractorDelegate + +extension SceneCoordinator: ArticleExtractorDelegate { + + func articleExtractionDidFail(with: Error) { +// makeToolbarValidate() + } + + func articleExtractionDidComplete(extractedArticle: ExtractedArticle) { + if let article = currentArticle, articleExtractor?.state != .cancelled { + isShowingExtractedArticle = true + articleViewController?.state = .extracted(article, extractedArticle) +// makeToolbarValidate() + } + } + +} + // MARK: Private private extension SceneCoordinator { @@ -1181,6 +1233,14 @@ private extension SceneCoordinator { // MARK: Fetching Articles + func startArticleExtractorForCurrentLink() { + if let link = currentArticle?.preferredLink, let extractor = ArticleExtractor(link) { + extractor.delegate = self + extractor.process() + articleExtractor = extractor + } + } + func emptyTheTimeline() { if !articles.isEmpty { replaceArticles(with: Set
(), animate: true)