diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 11257243d..7792cc046 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -404,6 +404,7 @@ FF3ABF13232599810074C542 /* ArticleSorterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF3ABF09232599450074C542 /* ArticleSorterTests.swift */; }; FF3ABF1523259DDB0074C542 /* ArticleSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF3ABF1423259DDB0074C542 /* ArticleSorter.swift */; }; FF3ABF162325AF5D0074C542 /* ArticleSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF3ABF1423259DDB0074C542 /* ArticleSorter.swift */; }; + FFD43E412340F488009E5CA3 /* MarkArticlesReadAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFD43E372340F320009E5CA3 /* MarkArticlesReadAlertController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -1034,6 +1035,7 @@ DF999FF622B5AEFA0064B687 /* SafariView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariView.swift; sourceTree = ""; }; FF3ABF09232599450074C542 /* ArticleSorterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleSorterTests.swift; sourceTree = ""; }; FF3ABF1423259DDB0074C542 /* ArticleSorter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleSorter.swift; sourceTree = ""; }; + FFD43E372340F320009E5CA3 /* MarkArticlesReadAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkArticlesReadAlertController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1278,6 +1280,7 @@ 51C4525D226508F600C03939 /* MasterFeed */ = { isa = PBXGroup; children = ( + FFD43E372340F320009E5CA3 /* MarkArticlesReadAlertController.swift */, 51C45264226508F600C03939 /* MasterFeedViewController.swift */, 51CC9B3D231720B2000E842F /* MasterFeedDataSource.swift */, 51C45260226508F600C03939 /* Cell */, @@ -2810,6 +2813,7 @@ 51C4529F22650A1900C03939 /* AuthorAvatarDownloader.swift in Sources */, 519E743D22C663F900A78E47 /* SceneDelegate.swift in Sources */, 51CC9B3E231720B2000E842F /* MasterFeedDataSource.swift in Sources */, + FFD43E412340F488009E5CA3 /* MarkArticlesReadAlertController.swift in Sources */, 51C452A322650A1E00C03939 /* HTMLMetadataDownloader.swift in Sources */, 51C4528D2265095F00C03939 /* AddFolderViewController.swift in Sources */, 51C452782265091600C03939 /* MasterTimelineCellData.swift in Sources */, diff --git a/iOS/MasterFeed/MarkArticlesReadAlertController.swift b/iOS/MasterFeed/MarkArticlesReadAlertController.swift new file mode 100644 index 000000000..6e4f4a8a3 --- /dev/null +++ b/iOS/MasterFeed/MarkArticlesReadAlertController.swift @@ -0,0 +1,44 @@ +// +// MarkArticlesReadAlertControllerr.swift +// NetNewsWire +// +// Created by Phil Viso on 9/29/19. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import Foundation +import UIKit + +struct MarkArticlesReadAlertController { + + static func allArticlesAlert(handler: @escaping (UIAlertAction) -> Void) -> UIAlertController { + let message = NSLocalizedString("Mark all articles in all accounts as read?", + comment: "Mark all articles") + return markAllReadAlert(message: message, handler: handler) + } + + static func timelineArticlesAlert(handler: @escaping (UIAlertAction) -> Void) -> UIAlertController { + let message = NSLocalizedString("Mark all articles in this timeline as read?", + comment: "Mark all articles") + return markAllReadAlert(message: message, handler: handler) + } + + // MARK: - + + private static func markAllReadAlert(message: String, + handler: @escaping (UIAlertAction) -> Void) -> UIAlertController { + let title = NSLocalizedString("Mark All Read", comment: "Mark All Read") + let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel") + let markTitle = NSLocalizedString("Mark All Read", comment: "Mark All Read") + + let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) + let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel) + let markAction = UIAlertAction(title: markTitle, style: .default, handler: handler) + + alertController.addAction(cancelAction) + alertController.addAction(markAction) + + return alertController + } + +} diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index e6754ae1d..ef4f48736 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -344,24 +344,15 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { } @IBAction func markAllAsRead(_ sender: Any) { - - let title = NSLocalizedString("Mark All Read", comment: "Mark All Read") - let message = NSLocalizedString("Mark all articles in all accounts as read?", comment: "Mark all articles") - let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) - - let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel") - let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel) - alertController.addAction(cancelAction) - - let markTitle = NSLocalizedString("Mark All Read", comment: "Mark All Read") - let markAction = UIAlertAction(title: markTitle, style: .default) { [weak self] (action) in - self?.coordinator.markAllAsRead() - } - - alertController.addAction(markAction) - - present(alertController, animated: true) - + if coordinator.shouldDisplayMarkAllAsReadUndoTip { + let alertController = MarkArticlesReadAlertController.allArticlesAlert { [weak self] _ in + self?.coordinator.markAllAsRead() + } + + present(alertController, animated: true) + } else { + coordinator.markAllAsRead() + } } @IBAction func add(_ sender: UIBarButtonItem) { diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index 36c61034c..52d80e7f1 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -89,24 +89,15 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner // MARK: Actions @IBAction func markAllAsRead(_ sender: Any) { - - let title = NSLocalizedString("Mark All Read", comment: "Mark All Read") - let message = NSLocalizedString("Mark all articles in this timeline as read?", comment: "Mark all articles") - let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) - - let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel") - let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel) - alertController.addAction(cancelAction) - - let markTitle = NSLocalizedString("Mark All Read", comment: "Mark All Read") - let markAction = UIAlertAction(title: markTitle, style: .default) { [weak self] (action) in - self?.coordinator.markAllAsReadInTimeline() + if coordinator.shouldDisplayMarkAllAsReadUndoTip { + let alertController = MarkArticlesReadAlertController.timelineArticlesAlert { [weak self] _ in + self?.coordinator.markAllAsReadInTimeline() + } + + present(alertController, animated: true) + } else { + coordinator.markAllAsReadInTimeline() } - - alertController.addAction(markAction) - - present(alertController, animated: true) - } @IBAction func firstUnread(_ sender: Any) { diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 9a0b79878..3d1468d85 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -82,6 +82,8 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } } } + + private(set) var shouldDisplayMarkAllAsReadUndoTip = true private let treeControllerDelegate = FeedTreeControllerDelegate() private lazy var treeController: TreeController = {