diff --git a/Classes/Issues/Comments/IssueCommentSectionController.swift b/Classes/Issues/Comments/IssueCommentSectionController.swift index adf4a8832..e37d673d5 100644 --- a/Classes/Issues/Comments/IssueCommentSectionController.swift +++ b/Classes/Issues/Comments/IssueCommentSectionController.swift @@ -93,7 +93,7 @@ final class IssueCommentSectionController: weak var weakSelf = self return AlertAction(AlertActionBuilder { $0.rootViewController = weakSelf?.viewController }) - .share([url], activities: [TUSafariActivity()]) { $0.popoverPresentationController?.sourceView = sender } + .share([url], activities: [TUSafariActivity()], type: .shareUrl) { $0.popoverPresentationController?.sourceView = sender } } var deleteAction: UIAlertAction? { diff --git a/Classes/Repository/RepositoryCodeBlobViewController.swift b/Classes/Repository/RepositoryCodeBlobViewController.swift index c9027f804..60def540e 100644 --- a/Classes/Repository/RepositoryCodeBlobViewController.swift +++ b/Classes/Repository/RepositoryCodeBlobViewController.swift @@ -8,6 +8,7 @@ import UIKit import Squawk +import TUSafariActivity final class RepositoryCodeBlobViewController: UIViewController { @@ -19,9 +20,13 @@ final class RepositoryCodeBlobViewController: UIViewController { private let feedRefresh = FeedRefresh() private let emptyView = EmptyView() private var sharingPayload: Any? - private lazy var sharingButton: UIBarButtonItem = { + private var repoUrl: URL { + return URL(string: "https://github.com/\(repo.owner)/\(repo.name)/blob/\(branch)/\(path.path)")! + } + + private lazy var moreOptionsItem: UIBarButtonItem = { let barButtonItem = UIBarButtonItem( - barButtonSystemItem: .action, + image: UIImage(named: "bullets-hollow"), target: self, action: #selector(RepositoryCodeBlobViewController.onShare(sender:))) barButtonItem.isEnabled = false @@ -61,7 +66,7 @@ final class RepositoryCodeBlobViewController: UIViewController { codeView.refreshControl = feedRefresh.refreshControl feedRefresh.refreshControl.addTarget(self, action: #selector(onRefresh), for: .valueChanged) - navigationItem.rightBarButtonItem = sharingButton + navigationItem.rightBarButtonItem = moreOptionsItem fetch() feedRefresh.beginRefreshing() @@ -88,19 +93,43 @@ final class RepositoryCodeBlobViewController: UIViewController { func didFetchPayload(_ payload: Any) { sharingPayload = payload - sharingButton.isEnabled = true + moreOptionsItem.isEnabled = true } @objc func onRefresh() { fetch() } - @objc func onShare(sender: UIBarButtonItem) { - guard let payload = sharingPayload else { return } - let activityController = UIActivityViewController(activityItems: [payload], applicationActivities: nil) - activityController.popoverPresentationController?.barButtonItem = sender + @objc func onShare(sender: UIButton) { + let alertTitle = "\(repo.owner)/\(repo.name):\(branch)" + let alert = UIAlertController.configured(title: alertTitle, preferredStyle: .actionSheet) + + weak var weakSelf = self + let alertBuilder = AlertActionBuilder { $0.rootViewController = weakSelf } + var actions = [ + AlertAction(alertBuilder).share([path.path], activities: nil, type: .shareFilePath) { + $0.popoverPresentationController?.setSourceView(sender) + }, + AlertAction(alertBuilder).share([repoUrl], activities: [TUSafariActivity()], type: .shareUrl) { + $0.popoverPresentationController?.setSourceView(sender) + }, + AlertAction.cancel() + ] + + if let name = self.path.components.last { + actions.insert(AlertAction(alertBuilder).share([name], activities: nil, type: .shareFileName) { + $0.popoverPresentationController?.setSourceView(sender) + }, at: 1) + } + if let payload = self.sharingPayload { + actions.insert(AlertAction(alertBuilder).share([payload], activities: nil, type: .shareContent) { + $0.popoverPresentationController?.setSourceView(sender) + }, at: actions.endIndex - 1) + } - present(activityController, animated: trueUnlessReduceMotionEnabled) + alert.addActions(actions) + alert.popoverPresentationController?.setSourceView(sender) + present(alert, animated: trueUnlessReduceMotionEnabled) } func fetch() { diff --git a/Classes/Repository/RepositoryCodeDirectoryViewController.swift b/Classes/Repository/RepositoryCodeDirectoryViewController.swift index 60eb8adad..bae1f8e19 100644 --- a/Classes/Repository/RepositoryCodeDirectoryViewController.swift +++ b/Classes/Repository/RepositoryCodeDirectoryViewController.swift @@ -8,6 +8,7 @@ import UIKit import IGListKit +import TUSafariActivity final class RepositoryCodeDirectoryViewController: BaseListViewController, BaseListViewControllerDataSource, @@ -20,6 +21,18 @@ RepositoryBranchUpdatable private let path: FilePath private let repo: RepositoryDetails private var files = [RepositoryFile]() + private var repoUrl: URL { + return URL(string: "https://github.com/\(repo.owner)/\(repo.name)/tree/\(branch)/\(path.path)")! + } + private lazy var moreOptionsItem: UIBarButtonItem = { + let barButtonItem = UIBarButtonItem( + image: UIImage(named: "bullets-hollow"), + target: self, + action: #selector(RepositoryCodeDirectoryViewController.onShare(sender:))) + barButtonItem.isEnabled = false + + return barButtonItem + }() init( client: GithubClient, @@ -50,6 +63,7 @@ RepositoryBranchUpdatable super.viewDidLoad() configureTitle(filePath: path, target: self, action: #selector(onFileNavigationTitle(sender:))) makeBackBarItemEmpty() + navigationItem.rightBarButtonItem = moreOptionsItem } // MARK: Public API @@ -73,6 +87,33 @@ RepositoryBranchUpdatable showAlert(filePath: path, sender: sender) } + @objc func onShare(sender: UIButton) { + let alertTitle = "\(repo.owner)/\(repo.name):\(branch)" + let alert = UIAlertController.configured(title: alertTitle, preferredStyle: .actionSheet) + + weak var weakSelf = self + let alertBuilder = AlertActionBuilder { $0.rootViewController = weakSelf } + var actions = [ + AlertAction(alertBuilder).share([path.path], activities: nil, type: .shareFilePath) { + $0.popoverPresentationController?.setSourceView(sender) + }, + AlertAction(alertBuilder).share([repoUrl], activities: [TUSafariActivity()], type: .shareUrl) { + $0.popoverPresentationController?.setSourceView(sender) + }, + AlertAction.cancel() + ] + + if let name = self.path.components.last { + actions.insert(AlertAction(alertBuilder).share([name], activities: nil, type: .shareFileName) { + $0.popoverPresentationController?.setSourceView(sender) + }, at: 1) + } + + alert.addActions(actions) + alert.popoverPresentationController?.setSourceView(sender) + present(alert, animated: trueUnlessReduceMotionEnabled) + } + // MARK: Overrides override func fetch(page: NSNumber?) { @@ -88,6 +129,7 @@ RepositoryBranchUpdatable case .success(let files): self?.files = files self?.update(animated: trueUnlessReduceMotionEnabled) + self?.moreOptionsItem.isEnabled = true } } } diff --git a/Classes/Repository/RepositoryViewController.swift b/Classes/Repository/RepositoryViewController.swift index fae07b06d..d84b168eb 100644 --- a/Classes/Repository/RepositoryViewController.swift +++ b/Classes/Repository/RepositoryViewController.swift @@ -169,7 +169,7 @@ ContextMenuDelegate { alert.addActions([ repo.hasIssuesEnabled ? newIssueAction() : nil, - AlertAction(alertBuilder).share([repoUrl], activities: [TUSafariActivity()]) { + AlertAction(alertBuilder).share([repoUrl], activities: [TUSafariActivity()], type: .shareUrl) { $0.popoverPresentationController?.setSourceView(sender) }, switchBranchAction(), diff --git a/Classes/Utility/AlertAction.swift b/Classes/Utility/AlertAction.swift index cda454073..76858ed74 100644 --- a/Classes/Utility/AlertAction.swift +++ b/Classes/Utility/AlertAction.swift @@ -21,6 +21,24 @@ struct AlertAction { let title: String? let style: UIAlertActionStyle + enum AlertShareType { + case shareUrl + case shareContent + case shareFilePath + case shareFileName + case `default` + + var localizedString: String { + switch self { + case .shareUrl: return NSLocalizedString("Share URL", comment: "") + case .shareContent: return NSLocalizedString("Share Content", comment: "") + case .shareFilePath: return NSLocalizedString("Copy Path", comment: "") + case .shareFileName: return NSLocalizedString("Copy Name", comment: "") + default: return NSLocalizedString("Share", comment: "") + } + } + } + // MARK: Init init(_ builder: AlertActionBuilder) { @@ -37,8 +55,9 @@ struct AlertAction { func share(_ items: [Any], activities: [UIActivity]?, + type: AlertShareType = .default, buildActivityBlock: ((UIActivityViewController) -> Void)?) -> UIAlertAction { - return UIAlertAction(title: NSLocalizedString("Share", comment: ""), style: .default) { _ in + return UIAlertAction(title: type.localizedString, style: .default) { _ in let activityController = UIActivityViewController(activityItems: items, applicationActivities: activities) buildActivityBlock?(activityController) self.rootViewController?.present(activityController, animated: trueUnlessReduceMotionEnabled)