Move more logic out of the DetailViewController and into the AppCoordinator

This commit is contained in:
Maurice Parker 2019-07-06 11:49:53 -05:00
parent 4884aebbfd
commit d543b979ac
2 changed files with 42 additions and 18 deletions

View File

@ -28,6 +28,13 @@ class AppCoordinator {
private var masterFeedViewController: MasterFeedViewController! private var masterFeedViewController: MasterFeedViewController!
private var masterTimelineViewController: MasterTimelineViewController? private var masterTimelineViewController: MasterTimelineViewController?
private var detailViewController: DetailViewController? {
if let detailNavController = rootSplitViewController.viewControllers.last as? UINavigationController {
return detailNavController.topViewController as? DetailViewController
}
return nil
}
private let fetchAndMergeArticlesQueue = CoalescingQueue(name: "Fetch and Merge Articles", interval: 0.5) private let fetchAndMergeArticlesQueue = CoalescingQueue(name: "Fetch and Merge Articles", interval: 0.5)
private var articleRowMap = [String: Int]() // articleID: rowIndex private var articleRowMap = [String: Int]() // articleID: rowIndex
@ -478,6 +485,37 @@ class AppCoordinator {
} }
func toggleReadForCurrentArticle() {
if let article = currentArticle {
markArticles(Set([article]), statusKey: .read, flag: !article.status.read)
}
}
func toggleStarForCurrentArticle() {
if let article = currentArticle {
markArticles(Set([article]), statusKey: .starred, flag: !article.status.starred)
}
}
func showBrowserForCurrentArticle() {
guard let preferredLink = currentArticle?.preferredLink, let url = URL(string: preferredLink) else {
return
}
UIApplication.shared.open(url, options: [:])
}
func showActivityDialogForCurrentArticle() {
guard let detailViewController = detailViewController else {
return
}
guard let preferredLink = currentArticle?.preferredLink, let url = URL(string: preferredLink) else {
return
}
let itemSource = ArticleActivityItemSource(url: url, subject: currentArticle?.title)
let activityViewController = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil)
activityViewController.popoverPresentationController?.barButtonItem = detailViewController.actionBarButtonItem
detailViewController.present(activityViewController, animated: true) }
} }
// MARK: UISplitViewControllerDelegate // MARK: UISplitViewControllerDelegate

View File

@ -144,33 +144,19 @@ class DetailViewController: UIViewController {
} }
@IBAction func toggleRead(_ sender: Any) { @IBAction func toggleRead(_ sender: Any) {
if let article = coordinator.currentArticle { coordinator.toggleReadForCurrentArticle()
markArticles(Set([article]), statusKey: .read, flag: !article.status.read)
}
} }
@IBAction func toggleStar(_ sender: Any) { @IBAction func toggleStar(_ sender: Any) {
if let article = coordinator.currentArticle { coordinator.toggleStarForCurrentArticle()
markArticles(Set([article]), statusKey: .starred, flag: !article.status.starred)
}
} }
@IBAction func openBrowser(_ sender: Any) { @IBAction func openBrowser(_ sender: Any) {
guard let preferredLink = coordinator.currentArticle?.preferredLink, let url = URL(string: preferredLink) else { coordinator.showBrowserForCurrentArticle()
return
}
UIApplication.shared.open(url, options: [:])
} }
@IBAction func showActivityDialog(_ sender: Any) { @IBAction func showActivityDialog(_ sender: Any) {
guard let preferredLink = coordinator.currentArticle?.preferredLink, let url = URL(string: preferredLink) else { coordinator.showActivityDialogForCurrentArticle()
return
}
let itemSource = ArticleActivityItemSource(url: url, subject: coordinator.currentArticle?.title)
let activityViewController = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil)
activityViewController.popoverPresentationController?.barButtonItem = self.actionBarButtonItem
present(activityViewController, animated: true)
} }
} }