From 775a69a2950a2890d4b4ce318fdc008b4ab9740b Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 12 May 2020 11:17:47 -0500 Subject: [PATCH] Add iOS Reddit URL builder --- .../Reddit/RedditFeedProvider.swift | 8 - NetNewsWire.xcodeproj/project.pbxproj | 28 ++ iOS/Add/Reddit/RedditAdd.storyboard | 362 ++++++++++++++++++ ...RedditEnterDetailTableViewController.swift | 66 ++++ ...dditSelectAccountTableViewController.swift | 44 +++ .../RedditSelectSortTableViewController.swift | 49 +++ .../RedditSelectTypeTableViewController.swift | 56 +++ .../SelectURLBuilderTableViewController.swift | 29 +- .../UIStoryboard-Extensions.swift | 4 + 9 files changed, 632 insertions(+), 14 deletions(-) create mode 100644 iOS/Add/Reddit/RedditAdd.storyboard create mode 100644 iOS/Add/Reddit/RedditEnterDetailTableViewController.swift create mode 100644 iOS/Add/Reddit/RedditSelectAccountTableViewController.swift create mode 100644 iOS/Add/Reddit/RedditSelectSortTableViewController.swift create mode 100644 iOS/Add/Reddit/RedditSelectTypeTableViewController.swift diff --git a/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift b/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift index 1ebebbd73..18f0b1934 100644 --- a/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift +++ b/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift @@ -240,16 +240,8 @@ public final class RedditFeedProvider: FeedProvider { components.user = username components.path = "/\(sort.rawValue)" case .popular: - guard let username = username else { - return nil - } - components.user = username components.path = "/r/popular/\(sort.rawValue)" case .all: - guard let username = username else { - return nil - } - components.user = username components.path = "/r/all/\(sort.rawValue)" case .subreddit: guard let subreddit = subreddit else { diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index a36afc3b2..599e8123f 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -165,6 +165,11 @@ 516A093B2360A4A000EAE89B /* SettingsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 516A093A2360A4A000EAE89B /* SettingsTableViewCell.xib */; }; 516A09402361240900EAE89B /* Account.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 516A093F2361240900EAE89B /* Account.storyboard */; }; 516A09422361248000EAE89B /* Inspector.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 516A09412361248000EAE89B /* Inspector.storyboard */; }; + 516AE600246AF34200731738 /* RedditAdd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 516AE5FF246AF34100731738 /* RedditAdd.storyboard */; }; + 516AE602246AF36100731738 /* RedditSelectTypeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE601246AF36100731738 /* RedditSelectTypeTableViewController.swift */; }; + 516AE604246AF37B00731738 /* RedditSelectAccountTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE603246AF37B00731738 /* RedditSelectAccountTableViewController.swift */; }; + 516AE606246AF3A900731738 /* RedditEnterDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE605246AF3A900731738 /* RedditEnterDetailTableViewController.swift */; }; + 516AE608246AFC9900731738 /* RedditSelectSortTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE607246AFC9900731738 /* RedditSelectSortTableViewController.swift */; }; 516AE9B32371C372007DEEAA /* MasterFeedTableViewSectionHeaderLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE9B22371C372007DEEAA /* MasterFeedTableViewSectionHeaderLayout.swift */; }; 516AE9DF2372269A007DEEAA /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE9DE2372269A007DEEAA /* IconImage.swift */; }; 516AE9E02372269A007DEEAA /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE9DE2372269A007DEEAA /* IconImage.swift */; }; @@ -1491,6 +1496,11 @@ 516A093A2360A4A000EAE89B /* SettingsTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SettingsTableViewCell.xib; sourceTree = ""; }; 516A093F2361240900EAE89B /* Account.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Account.storyboard; sourceTree = ""; }; 516A09412361248000EAE89B /* Inspector.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Inspector.storyboard; sourceTree = ""; }; + 516AE5FF246AF34100731738 /* RedditAdd.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RedditAdd.storyboard; sourceTree = ""; }; + 516AE601246AF36100731738 /* RedditSelectTypeTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedditSelectTypeTableViewController.swift; sourceTree = ""; }; + 516AE603246AF37B00731738 /* RedditSelectAccountTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedditSelectAccountTableViewController.swift; sourceTree = ""; }; + 516AE605246AF3A900731738 /* RedditEnterDetailTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedditEnterDetailTableViewController.swift; sourceTree = ""; }; + 516AE607246AFC9900731738 /* RedditSelectSortTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedditSelectSortTableViewController.swift; sourceTree = ""; }; 516AE9B22371C372007DEEAA /* MasterFeedTableViewSectionHeaderLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterFeedTableViewSectionHeaderLayout.swift; sourceTree = ""; }; 516AE9DE2372269A007DEEAA /* IconImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconImage.swift; sourceTree = ""; }; 51707438232AA97100A461A3 /* ShareFolderPickerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareFolderPickerController.swift; sourceTree = ""; }; @@ -2114,6 +2124,18 @@ path = Account; sourceTree = ""; }; + 516AE5DD246AF2DD00731738 /* Reddit */ = { + isa = PBXGroup; + children = ( + 516AE5FF246AF34100731738 /* RedditAdd.storyboard */, + 516AE601246AF36100731738 /* RedditSelectTypeTableViewController.swift */, + 516AE603246AF37B00731738 /* RedditSelectAccountTableViewController.swift */, + 516AE605246AF3A900731738 /* RedditEnterDetailTableViewController.swift */, + 516AE607246AFC9900731738 /* RedditSelectSortTableViewController.swift */, + ); + path = Reddit; + sourceTree = ""; + }; 517A754524451BD500B553B9 /* Products */ = { isa = PBXGroup; children = ( @@ -2311,6 +2333,7 @@ 510289D32451BD7B00426DDF /* SelectURLBuilder.swift */, 510289A92451967500426DDF /* SelectURLBuilderTableViewController.swift */, 51E36E8B239D6765006F47A5 /* AddWebFeedSelectFolderTableViewCell.xib */, + 516AE5DD246AF2DD00731738 /* Reddit */, 510289CE2451BA1E00426DDF /* Twitter */, ); path = Add; @@ -3868,6 +3891,7 @@ 510289D02451BA3A00426DDF /* TwitterAdd.storyboard in Resources */, 51F85BEB22724CB600C787DC /* About.rtf in Resources */, 516A093B2360A4A000EAE89B /* SettingsTableViewCell.xib in Resources */, + 516AE600246AF34200731738 /* RedditAdd.storyboard in Resources */, 511D43D1231FA62800FB1562 /* SidebarKeyboardShortcuts.plist in Resources */, 516A09402361240900EAE89B /* Account.storyboard in Resources */, 51C452AB22650DC600C03939 /* template.html in Resources */, @@ -4286,15 +4310,18 @@ 5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */, B2B80778239C4C7000F191E0 /* RSImage-AppIcons.swift in Sources */, 518ED21D23D0F26000E0A862 /* UIViewController-Extensions.swift in Sources */, + 516AE604246AF37B00731738 /* RedditSelectAccountTableViewController.swift in Sources */, 51A9A5F52380F6A60033AADF /* ModalNavigationController.swift in Sources */, 51EAED96231363EF00A9EEE3 /* NonIntrinsicButton.swift in Sources */, 51C4527B2265091600C03939 /* MasterUnreadIndicatorView.swift in Sources */, + 516AE608246AFC9900731738 /* RedditSelectSortTableViewController.swift in Sources */, 5186A635235EF3A800C97195 /* VibrantLabel.swift in Sources */, 51F85BF92274AA7B00C787DC /* UIBarButtonItem-Extensions.swift in Sources */, 51B62E68233186730085F949 /* IconView.swift in Sources */, 51C45296226509D300C03939 /* OPMLExporter.swift in Sources */, 51C45291226509C800C03939 /* SmartFeed.swift in Sources */, 51C452A722650A3D00C03939 /* RSImage-Extensions.swift in Sources */, + 516AE606246AF3A900731738 /* RedditEnterDetailTableViewController.swift in Sources */, 511B9807237DCAC90028BCAA /* UserInfoKey.swift in Sources */, 51C45269226508F600C03939 /* MasterFeedTableViewCell.swift in Sources */, 51F85BFD2275DCA800C787DC /* SingleLineUILabelSizer.swift in Sources */, @@ -4380,6 +4407,7 @@ 515A517B243E90260089E588 /* ExtensionPoint.swift in Sources */, 51C4529C22650A1000C03939 /* SingleFaviconDownloader.swift in Sources */, 51E595A6228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */, + 516AE602246AF36100731738 /* RedditSelectTypeTableViewController.swift in Sources */, 51F9F3F723DF6DB200A314FD /* ArticleIconSchemeHandler.swift in Sources */, 512AF9C2236ED52C0066F8BE /* ImageHeaderView.swift in Sources */, 515A5181243E90260089E588 /* ExtensionPointIdentifer.swift in Sources */, diff --git a/iOS/Add/Reddit/RedditAdd.storyboard b/iOS/Add/Reddit/RedditAdd.storyboard new file mode 100644 index 000000000..c1b976f78 --- /dev/null +++ b/iOS/Add/Reddit/RedditAdd.storyboard @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS/Add/Reddit/RedditEnterDetailTableViewController.swift b/iOS/Add/Reddit/RedditEnterDetailTableViewController.swift new file mode 100644 index 000000000..41791d4f7 --- /dev/null +++ b/iOS/Add/Reddit/RedditEnterDetailTableViewController.swift @@ -0,0 +1,66 @@ +// +// RedditEnterDetailTableViewController.swift +// NetNewsWire-iOS +// +// Created by Maurice Parker on 5/12/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import Foundation + +import UIKit +import Account + +class RedditEnterDetailTableViewController: UITableViewController, SelectURLBuilder { + + @IBOutlet weak var detailTextField: UITextField! + + var nextBarButtonItem = UIBarButtonItem() + var redditFeedType: RedditFeedType? + weak var delegate: SelectURLBuilderDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + + nextBarButtonItem.title = NSLocalizedString("Next", comment: "Next") + nextBarButtonItem.style = .plain + nextBarButtonItem.target = self + nextBarButtonItem.action = #selector(nextScene) + navigationItem.rightBarButtonItem = nextBarButtonItem + + detailTextField.delegate = self + NotificationCenter.default.addObserver(self, selector: #selector(textDidChange(_:)), name: UITextField.textDidChangeNotification, object: detailTextField) + + updateUI() + } + + @objc func nextScene() { + let selectSort = UIStoryboard.redditAdd.instantiateController(ofType: RedditSelectSortTableViewController.self) + selectSort.redditFeedType = redditFeedType + selectSort.subreddit = detailTextField.text?.collapsingWhitespace + selectSort.delegate = delegate + navigationController?.pushViewController(selectSort, animated: true) + } + + @objc func textDidChange(_ note: Notification) { + updateUI() + } + +} + +extension RedditEnterDetailTableViewController: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + +} + +private extension RedditEnterDetailTableViewController { + + func updateUI() { + nextBarButtonItem.isEnabled = !(detailTextField.text?.isEmpty ?? false) + } + +} diff --git a/iOS/Add/Reddit/RedditSelectAccountTableViewController.swift b/iOS/Add/Reddit/RedditSelectAccountTableViewController.swift new file mode 100644 index 000000000..fddceedd8 --- /dev/null +++ b/iOS/Add/Reddit/RedditSelectAccountTableViewController.swift @@ -0,0 +1,44 @@ +// +// RedditSelectAccountTableViewController.swift +// NetNewsWire-iOS +// +// Created by Maurice Parker on 5/12/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import Foundation + +import UIKit +import Account + +class RedditSelectAccountTableViewController: UITableViewController, SelectURLBuilder { + + private var redditFeedProviders = [RedditFeedProvider]() + + var redditFeedType: RedditFeedType? + weak var delegate: SelectURLBuilderDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + redditFeedProviders = ExtensionPointManager.shared.activeExtensionPoints.values.compactMap { $0 as? RedditFeedProvider } + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return redditFeedProviders.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) + cell.textLabel?.text = redditFeedProviders[indexPath.row].title + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let selectSort = UIStoryboard.redditAdd.instantiateController(ofType: RedditSelectSortTableViewController.self) + selectSort.redditFeedType = redditFeedType + selectSort.username = redditFeedProviders[indexPath.row].username + selectSort.delegate = delegate + navigationController?.pushViewController(selectSort, animated: true) + } + +} diff --git a/iOS/Add/Reddit/RedditSelectSortTableViewController.swift b/iOS/Add/Reddit/RedditSelectSortTableViewController.swift new file mode 100644 index 000000000..167d2ca75 --- /dev/null +++ b/iOS/Add/Reddit/RedditSelectSortTableViewController.swift @@ -0,0 +1,49 @@ +// +// RedditSelectSortTableViewController.swift +// NetNewsWire-iOS +// +// Created by Maurice Parker on 5/12/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import UIKit +import Account + +class RedditSelectSortTableViewController: UITableViewController, SelectURLBuilder { + + weak var delegate: SelectURLBuilderDelegate? + var redditFeedType: RedditFeedType? + var username: String? + var subreddit: String? + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + let sort: RedditSort + switch indexPath.row { + case 0: + sort = .best + case 1: + sort = .hot + case 2: + sort = .new + case 3: + sort = .top + case 4: + sort = .rising + default: + fatalError() + } + + guard let redditFeedType = redditFeedType else { return } + + if let url = RedditFeedProvider.buildURL(redditFeedType, username: username, subreddit: subreddit, sort: sort) { + delegate?.selectURLBuilderDidBuildURL(url) + } + dismiss(animated: true) + } + +} diff --git a/iOS/Add/Reddit/RedditSelectTypeTableViewController.swift b/iOS/Add/Reddit/RedditSelectTypeTableViewController.swift new file mode 100644 index 000000000..afc5069c9 --- /dev/null +++ b/iOS/Add/Reddit/RedditSelectTypeTableViewController.swift @@ -0,0 +1,56 @@ +// +// RedditSelectTypeTableViewController.swift +// NetNewsWire-iOS +// +// Created by Maurice Parker on 5/12/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import UIKit +import Account + +class RedditSelectTypeTableViewController: UITableViewController, SelectURLBuilder { + + weak var delegate: SelectURLBuilderDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + switch indexPath.row { + case 0: + let redditFeedProviders = ExtensionPointManager.shared.activeExtensionPoints.values.compactMap { $0 as? RedditFeedProvider } + if redditFeedProviders.count == 1 { + let selectSort = UIStoryboard.redditAdd.instantiateController(ofType: RedditSelectSortTableViewController.self) + selectSort.redditFeedType = .home + selectSort.username = redditFeedProviders.first!.username + selectSort.delegate = delegate + navigationController?.pushViewController(selectSort, animated: true) + } else { + let selectAccount = UIStoryboard.redditAdd.instantiateController(ofType: RedditSelectAccountTableViewController.self) + selectAccount.redditFeedType = .home + selectAccount.delegate = delegate + navigationController?.pushViewController(selectAccount, animated: true) + } + case 1: + let selectSort = UIStoryboard.redditAdd.instantiateController(ofType: RedditSelectSortTableViewController.self) + selectSort.redditFeedType = .popular + selectSort.delegate = delegate + navigationController?.pushViewController(selectSort, animated: true) + case 2: + let selectSort = UIStoryboard.redditAdd.instantiateController(ofType: RedditSelectSortTableViewController.self) + selectSort.redditFeedType = .all + selectSort.delegate = delegate + navigationController?.pushViewController(selectSort, animated: true) + case 3: + let enterDetail = UIStoryboard.redditAdd.instantiateController(ofType: RedditEnterDetailTableViewController.self) + enterDetail.redditFeedType = .subreddit + enterDetail.delegate = delegate + navigationController?.pushViewController(enterDetail, animated: true) + default: + fatalError() + } + } + +} diff --git a/iOS/Add/SelectURLBuilderTableViewController.swift b/iOS/Add/SelectURLBuilderTableViewController.swift index 8bbffd8b5..1706fac39 100644 --- a/iOS/Add/SelectURLBuilderTableViewController.swift +++ b/iOS/Add/SelectURLBuilderTableViewController.swift @@ -23,20 +23,37 @@ class SelectURLBuilderTableViewController: UITableViewController, SelectURLBuild } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 + return 2 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "URLBuilderCell", for: indexPath) as! SelectComboTableViewCell - cell.icon?.image = AppAssets.extensionPointTwitter - cell.label?.text = NSLocalizedString("Twitter", comment: "Twitter") + switch indexPath.row { + case 0: + cell.icon?.image = AppAssets.extensionPointReddit + cell.label?.text = NSLocalizedString("Reddit", comment: "Reddit") + case 1: + cell.icon?.image = AppAssets.extensionPointTwitter + cell.label?.text = NSLocalizedString("Twitter", comment: "Twitter") + default: + break + } return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let twitterURLBuilder = UIStoryboard.twitterAdd.instantiateInitialViewController() as! TwitterSelectTypeTableViewController - twitterURLBuilder.delegate = delegate - navigationController?.pushViewController(twitterURLBuilder, animated: true) + switch indexPath.row { + case 0: + let redditURLBuilder = UIStoryboard.redditAdd.instantiateInitialViewController() as! RedditSelectTypeTableViewController + redditURLBuilder.delegate = delegate + navigationController?.pushViewController(redditURLBuilder, animated: true) + case 1: + let twitterURLBuilder = UIStoryboard.twitterAdd.instantiateInitialViewController() as! TwitterSelectTypeTableViewController + twitterURLBuilder.delegate = delegate + navigationController?.pushViewController(twitterURLBuilder, animated: true) + default: + break + } } // MARK: Actions diff --git a/iOS/UIKit Extensions/UIStoryboard-Extensions.swift b/iOS/UIKit Extensions/UIStoryboard-Extensions.swift index 5c059adcb..92caedf99 100644 --- a/iOS/UIKit Extensions/UIStoryboard-Extensions.swift +++ b/iOS/UIKit Extensions/UIStoryboard-Extensions.swift @@ -20,6 +20,10 @@ extension UIStoryboard { return UIStoryboard(name: "Add", bundle: nil) } + static var redditAdd: UIStoryboard { + return UIStoryboard(name: "RedditAdd", bundle: nil) + } + static var twitterAdd: UIStoryboard { return UIStoryboard(name: "TwitterAdd", bundle: nil) }