From b7a358c98663b316ffc56fd6ef043b637f63d337 Mon Sep 17 00:00:00 2001 From: Bryan Culver Date: Mon, 26 Sep 2022 07:03:14 -0400 Subject: [PATCH] Prototype --- ...idebarViewController+ContextualMenus.swift | 29 ++++++++++++++++- iOS/MasterFeed/MasterFeedViewController.swift | 31 ++++++++++++++++++- .../MarkAsReadAlertController.swift | 27 ++++++++++------ 3 files changed, 75 insertions(+), 12 deletions(-) diff --git a/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift b/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift index 46286cd64..9ede13706 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift @@ -211,7 +211,13 @@ private extension SidebarViewController { let menu = NSMenu(title: "") if webFeed.unreadCount > 0 { - menu.addItem(markAllReadMenuItem([webFeed])) +// menu.addItem(markAllReadMenuItem([webFeed])) + let catchUpMenuItem = catchUpMenuItem([webFeed]) + let catchUpSubMenu = catchUpSubMenu([webFeed]) + + menu.addItem(catchUpMenuItem) + menu.setSubmenu(catchUpSubMenu, for: catchUpMenuItem) + menu.addItem(NSMenuItem.separator()) } @@ -307,6 +313,27 @@ private extension SidebarViewController { return menuItem(NSLocalizedString("Mark All as Read", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects) } + + func catchUpSubMenu(_ objects: [Any]) -> NSMenu { + + let menu = NSMenu(title: "Catch up to articles older than...") + + menu.addItem(menuItem(NSLocalizedString("All", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + menu.addItem(menuItem(NSLocalizedString("Older than 1 day", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + menu.addItem(menuItem(NSLocalizedString("Older than 2 days", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + menu.addItem(menuItem(NSLocalizedString("Older than 3 days", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + menu.addItem(menuItem(NSLocalizedString("Older than 1 week", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + menu.addItem(menuItem(NSLocalizedString("Older than 2 weeks", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + menu.addItem(menuItem(NSLocalizedString("Older than 1 month", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + menu.addItem(menuItem(NSLocalizedString("Older than 1 year", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects)) + + return menu + } + + func catchUpMenuItem(_ objects: [Any]) -> NSMenuItem { + + return menuItem(NSLocalizedString("Mark as Read...", comment: "Command"), #selector(markObjectsReadFromContextualMenu(_:)), objects) + } func deleteMenuItem(_ objects: [Any]) -> NSMenuItem { diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index f8307cf20..833bf0345 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -905,8 +905,17 @@ private extension MasterFeedViewController { menuElements.append(UIMenu(title: "", options: .displayInline, children: pageActions)) } + var markActions = [UIAction]() if let markAllAction = self.markAllAsReadAction(indexPath: indexPath) { - menuElements.append(UIMenu(title: "", options: .displayInline, children: [markAllAction])) + markActions.append(markAllAction) + } + + if let catchUpAction = self.catchUpAction(indexPath: indexPath) { + markActions.append(catchUpAction) + } + if !markActions.isEmpty { + menuElements.append(UIMenu(title: "", options: .displayInline, children: markActions)) + } if includeDeleteRename { @@ -1139,6 +1148,26 @@ private extension MasterFeedViewController { return action } + func catchUpAction(indexPath: IndexPath) -> UIAction? { + guard let feed = coordinator.nodeFor(indexPath)?.representedObject as? Feed, + let contentView = self.tableView.cellForRow(at: indexPath)?.contentView, + feed.unreadCount > 0 else { + return nil + } + + let localizedMenuText = NSLocalizedString("Catch Up in “%@”", comment: "Command") + let title = NSString.localizedStringWithFormat(localizedMenuText as NSString, feed.nameForDisplay) as String + let action = UIAction(title: title, image: AppAssets.markAllAsReadImage) { [weak self] action in + MarkAsReadAlertController.confirm(self, coordinator: self?.coordinator, confirmTitle: title, sourceType: contentView) { [weak self] in + if let articles = try? feed.fetchUnreadArticles() { + self?.coordinator.markAllAsRead(Array(articles)) + } + } + } + + return action + } + func markAllAsReadAction(account: Account, contentView: UIView?) -> UIAction? { guard account.unreadCount > 0, let contentView = contentView else { return nil diff --git a/iOS/MasterTimeline/MarkAsReadAlertController.swift b/iOS/MasterTimeline/MarkAsReadAlertController.swift index 5bbce1406..fe37f2df8 100644 --- a/iOS/MasterTimeline/MarkAsReadAlertController.swift +++ b/iOS/MasterTimeline/MarkAsReadAlertController.swift @@ -46,23 +46,30 @@ struct MarkAsReadAlertController { completion: @escaping (UIAlertAction) -> Void) -> UIAlertController where T: MarkAsReadAlertControllerSourceType { - let title = NSLocalizedString("Mark As Read", comment: "Mark As Read") - let message = NSLocalizedString("You can turn this confirmation off in Settings.", - comment: "You can turn this confirmation off in Settings.") + let title = NSLocalizedString("Mark as Read", comment: "Catch Up") + let message = NSLocalizedString("Mark articles as read older than", + comment: "Mark articles as read older than") let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel") - let settingsTitle = NSLocalizedString("Open Settings", comment: "Open Settings") let alertController = UIAlertController(title: title, message: message, preferredStyle: .actionSheet) let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel) { _ in cancelCompletion?() } - let settingsAction = UIAlertAction(title: settingsTitle, style: .default) { _ in - coordinator.showSettings(scrollToArticlesSection: true) - } - let markAction = UIAlertAction(title: confirmTitle, style: .default, handler: completion) + let oneDayAction = UIAlertAction(title: "1 Day", style: .default, handler: completion) + let twoDaysAction = UIAlertAction(title: "2 Days", style: .default, handler: completion) + let threeDaysAction = UIAlertAction(title: "3 Days", style: .default, handler: completion) + let oneWeekAction = UIAlertAction(title: "1 Week", style: .default, handler: completion) + let twoWeeksAction = UIAlertAction(title: "2 Weeks", style: .default, handler: completion) + let oneMonthAction = UIAlertAction(title: "1 Month", style: .default, handler: completion) + let oneYearAction = UIAlertAction(title: "1 Year", style: .default, handler: completion) - alertController.addAction(markAction) - alertController.addAction(settingsAction) + alertController.addAction(oneDayAction) + alertController.addAction(twoDaysAction) + alertController.addAction(threeDaysAction) + alertController.addAction(oneWeekAction) + alertController.addAction(twoWeeksAction) + alertController.addAction(oneMonthAction) + alertController.addAction(oneYearAction) alertController.addAction(cancelAction) if let barButtonItem = sourceType as? UIBarButtonItem {