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)