From de7970314d1cee07c9c4bd666bfbaa09dd791443 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 19 Aug 2019 17:26:09 -0500 Subject: [PATCH] Add mark all as read for feed functionality --- iOS/AppAssets.swift | 4 ++ iOS/AppCoordinator.swift | 29 +++++------- .../MasterTimelineViewController.swift | 47 +++++++++++++++++++ 3 files changed, 62 insertions(+), 18 deletions(-) diff --git a/iOS/AppAssets.swift b/iOS/AppAssets.swift index dc4e68dbe..3d5cc7871 100644 --- a/iOS/AppAssets.swift +++ b/iOS/AppAssets.swift @@ -52,6 +52,10 @@ struct AppAssets { return RSImage(named: "feedImage")! }() + static var markAllInFeedAsReadImage: UIImage = { + return UIImage(systemName: "asterisk.circle")! + }() + static var markOlderAsReadDownImage: UIImage = { return UIImage(systemName: "arrowtriangle.down.circle")! }() diff --git a/iOS/AppCoordinator.swift b/iOS/AppCoordinator.swift index e7846a1de..91689b2b3 100644 --- a/iOS/AppCoordinator.swift +++ b/iOS/AppCoordinator.swift @@ -531,27 +531,24 @@ class AppCoordinator: NSObject, UndoableCommandRunner { } + func markAllAsRead(_ articles: [Article]) { + guard let undoManager = undoManager, let markReadCommand = MarkStatusCommand(initialArticles: articles, markingRead: true, undoManager: undoManager) else { + return + } + runCommand(markReadCommand) + } + func markAllAsRead() { let accounts = AccountManager.shared.activeAccounts var articles = Set
() accounts.forEach { account in articles.formUnion(account.fetchArticles(.unread)) } - - guard let undoManager = undoManager, - let markReadCommand = MarkStatusCommand(initialArticles: Array(articles), markingRead: true, undoManager: undoManager) else { - return - } - - runCommand(markReadCommand) + markAllAsRead(Array(articles)) } - + func markAllAsReadInTimeline() { - guard let undoManager = undoManager, - let markReadCommand = MarkStatusCommand(initialArticles: articles, markingRead: true, undoManager: undoManager) else { - return - } - runCommand(markReadCommand) + markAllAsRead(articles) masterNavigationController.popViewController(animated: true) } @@ -561,11 +558,7 @@ class AppCoordinator: NSObject, UndoableCommandRunner { if articlesToMark.isEmpty { return } - - guard let undoManager = undoManager, let markReadCommand = MarkStatusCommand(initialArticles: articlesToMark, markingRead: true, undoManager: undoManager) else { - return - } - runCommand(markReadCommand) + markAllAsRead(articles) } func toggleReadForCurrentArticle() { diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index 52fcabc5c..b84431c61 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -168,6 +168,10 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner alert.addAction(action) } + if let action = self.markAllInFeedAsReadAlertAction(indexPath: indexPath, completionHandler: completionHandler) { + alert.addAction(action) + } + let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel") alert.addAction(UIAlertAction(title: cancelTitle, style: .cancel) { _ in completionHandler(true) @@ -202,6 +206,10 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner actions.append(action) } + if let action = self.markAllInFeedAsReadAction(indexPath: indexPath) { + actions.append(action) + } + return UIMenu(title: "", children: actions) }) @@ -562,4 +570,43 @@ private extension MasterTimelineViewController { return action } + func markAllInFeedAsReadAction(indexPath: IndexPath) -> UIAction? { + guard let feed = coordinator.articles[indexPath.row].feed else { + return nil + } + + let articles = Array(feed.fetchArticles()) + guard articles.canMarkAllAsRead() else { + return nil + } + + let localizedMenuText = NSLocalizedString("Mark All as Read in “%@”", comment: "Command") + let title = NSString.localizedStringWithFormat(localizedMenuText as NSString, feed.nameForDisplay) as String + + let action = UIAction(title: title, image: AppAssets.markAllInFeedAsReadImage) { [weak self] action in + self?.coordinator.markAllAsRead(articles) + } + return action + } + + func markAllInFeedAsReadAlertAction(indexPath: IndexPath, completionHandler: @escaping (Bool) -> Void) -> UIAlertAction? { + guard let feed = coordinator.articles[indexPath.row].feed else { + return nil + } + + let articles = Array(feed.fetchArticles()) + guard articles.canMarkAllAsRead() else { + return nil + } + + let localizedMenuText = NSLocalizedString("Mark All as Read in “%@”", comment: "Command") + let title = NSString.localizedStringWithFormat(localizedMenuText as NSString, feed.nameForDisplay) as String + + let action = UIAlertAction(title: title, style: .default) { [weak self] action in + self?.coordinator.markAllAsRead(articles) + completionHandler(true) + } + return action + } + }