123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- import Foundation
- import SVGKit
- import NextcloudKit
- import UIKit
- extension UIViewController {
- fileprivate func handleProfileAction(_ action: NKHovercard.Action, for userId: String) {
- switch action.appId {
- case "email":
- guard
- let url = action.hyperlinkUrl,
- url.scheme == "mailto",
- let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
- else {
- let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_cannot_send_mail_error_")
- NCContentPresenter.shared.showError(error: error)
- return
- }
- sendEmail(to: components.path)
- case "spreed":
- guard
- let appDelegate = UIApplication.shared.delegate as? AppDelegate,
- let talkUrl = URL(string: "nextcloudtalk://open-conversation?server=\(appDelegate.urlBase)&user=\(appDelegate.userId)&withUser=\(userId)"),
- UIApplication.shared.canOpenURL(talkUrl)
- else { fallthrough }
- UIApplication.shared.open(talkUrl)
- default:
- guard let url = action.hyperlinkUrl, UIApplication.shared.canOpenURL(url) else {
- let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_open_url_error_")
- NCContentPresenter.shared.showError(error: error)
- return
- }
- UIApplication.shared.open(url, options: [:])
- }
- }
- func showProfileMenu(userId: String) {
- guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
- let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: appDelegate.account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
- guard serverVersionMajor >= NCGlobal.shared.nextcloudVersion23 else { return }
- NextcloudKit.shared.getHovercard(for: userId) { account, card, data, _ in
- guard let card = card, account == appDelegate.account else { return }
- let personHeader = NCMenuAction(
- title: card.displayName,
- icon: NCUtility.shared.loadUserImage(
- for: userId,
- displayName: card.displayName,
- userBaseUrl: appDelegate),
- action: nil)
- let actions = card.actions.map { action -> NCMenuAction in
- var image = NCUtility.shared.loadImage(named: "user", color: .label)
- if let url = URL(string: action.icon),
- let svgSource = SVGKSourceURL.source(from: url),
- let svg = SVGKImage(source: svgSource) {
- image = svg.uiImage.imageColor(.label)
- }
- return NCMenuAction(
- title: action.title,
- icon: image,
- action: { _ in self.handleProfileAction(action, for: userId) })
- }
- let allActions = [personHeader] + actions
- self.presentMenu(with: allActions)
- }
- }
- func sendEmail(to email: String) {
- guard MFMailComposeViewController.canSendMail() else {
- let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_cannot_send_mail_error_")
- NCContentPresenter.shared.showError(error: error)
- return
- }
- let mail = MFMailComposeViewController()
- mail.mailComposeDelegate = self
- mail.setToRecipients([email])
- present(mail, animated: true)
- }
- func presentMenu(with actions: [NCMenuAction]) {
- guard !actions.isEmpty else { return }
- guard let menuViewController = NCMenu.makeNCMenu(with: actions) else {
- let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_internal_generic_error_")
- NCContentPresenter.shared.showError(error: error)
- return
- }
- let menuPanelController = NCMenuPanelController()
- menuPanelController.parentPresenter = self
- menuPanelController.delegate = menuViewController
- menuPanelController.set(contentViewController: menuViewController)
- menuPanelController.track(scrollView: menuViewController.tableView)
- present(menuPanelController, animated: true, completion: nil)
- }
- }
- extension UIViewController: MFMailComposeViewControllerDelegate {
- public func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
- controller.dismiss(animated: true)
- }
- }
|