diff --git a/Localization/app.json b/Localization/app.json index 96f366933..35cdda165 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -51,6 +51,7 @@ "preview": "Preview", "share": "Share", "share_user": "Share %s", + "share_post": "Share post", "open_in_safari": "Open in Safari", "find_people": "Find people to follow", "manually_search": "Manually search instead", diff --git a/Mastodon/Extension/CoreDataStack/Status.swift b/Mastodon/Extension/CoreDataStack/Status.swift index 39b421dbc..015671cb5 100644 --- a/Mastodon/Extension/CoreDataStack/Status.swift +++ b/Mastodon/Extension/CoreDataStack/Status.swift @@ -70,3 +70,16 @@ extension Status { return author } } + +extension Status { + + var statusURL: URL { + return URL(string: "https://\(self.domain)/web/statuses/\(self.id)")! + } + + var activityItems: [Any] { + var items: [Any] = [] + items.append(statusURL) + return items + } +} diff --git a/Mastodon/Generated/Strings.swift b/Mastodon/Generated/Strings.swift index 8dd327048..c0d1cac6f 100644 --- a/Mastodon/Generated/Strings.swift +++ b/Mastodon/Generated/Strings.swift @@ -96,6 +96,8 @@ internal enum L10n { internal static let seeMore = L10n.tr("Localizable", "Common.Controls.Actions.SeeMore") /// Share internal static let share = L10n.tr("Localizable", "Common.Controls.Actions.Share") + /// Share post + internal static let sharePost = L10n.tr("Localizable", "Common.Controls.Actions.SharePost") /// Share %@ internal static func shareUser(_ p1: Any) -> String { return L10n.tr("Localizable", "Common.Controls.Actions.ShareUser", String(describing: p1)) diff --git a/Mastodon/Protocol/UserProvider/UserProviderFacade.swift b/Mastodon/Protocol/UserProvider/UserProviderFacade.swift index 0d839bd17..cbde09034 100644 --- a/Mastodon/Protocol/UserProvider/UserProviderFacade.swift +++ b/Mastodon/Protocol/UserProvider/UserProviderFacade.swift @@ -264,6 +264,23 @@ extension UserProviderFacade { children.append(shareAction) } + if let shareStatus = shareStatus { + let shareAction = UIAction(title: L10n.Common.Controls.Actions.sharePost, image: UIImage(systemName: "square.and.arrow.up"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak provider] _ in + guard let provider = provider else { return } + let activityViewController = createActivityViewControllerForMastodonUser(status: shareStatus, dependency: provider) + provider.coordinator.present( + scene: .activityViewController( + activityViewController: activityViewController, + sourceView: sourceView, + barButtonItem: barButtonItem + ), + from: provider, + transition: .activityViewControllerPresent(animated: true, completion: nil) + ) + } + children.append(shareAction) + } + return UIMenu(title: "", options: [], children: children) } @@ -274,5 +291,13 @@ extension UserProviderFacade { ) return activityViewController } + + static func createActivityViewControllerForMastodonUser(status: Status, dependency: NeedsDependency) -> UIActivityViewController { + let activityViewController = UIActivityViewController( + activityItems: status.activityItems, + applicationActivities: [SafariActivity(sceneCoordinator: dependency.coordinator)] + ) + return activityViewController + } } diff --git a/Mastodon/Resources/en.lproj/Localizable.strings b/Mastodon/Resources/en.lproj/Localizable.strings index da8bca1c9..a2f653d81 100644 --- a/Mastodon/Resources/en.lproj/Localizable.strings +++ b/Mastodon/Resources/en.lproj/Localizable.strings @@ -31,6 +31,7 @@ Please check your internet connection."; "Common.Controls.Actions.SavePhoto" = "Save photo"; "Common.Controls.Actions.SeeMore" = "See More"; "Common.Controls.Actions.Share" = "Share"; +"Common.Controls.Actions.SharePost" = "Share post"; "Common.Controls.Actions.ShareUser" = "Share %@"; "Common.Controls.Actions.SignIn" = "Sign In"; "Common.Controls.Actions.SignUp" = "Sign Up";