Add PromiseKit dependency
- Added PromiseKit dependency
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
import MessageUI.MFMailComposeViewController
|
||||
import UIKit.UIViewController
|
||||
#if !PMKCocoaPods
|
||||
import PromiseKit
|
||||
#endif
|
||||
|
||||
/**
|
||||
To import this `UIViewController` category:
|
||||
|
||||
use_frameworks!
|
||||
pod "PromiseKit/MessageUI"
|
||||
|
||||
And then in your sources:
|
||||
|
||||
import PromiseKit
|
||||
*/
|
||||
extension UIViewController {
|
||||
/// Presents the message view controller and resolves with the user action.
|
||||
public func promise(_ vc: MFMailComposeViewController, animated: Bool = true, completion:(() -> Void)? = nil) -> Promise<MFMailComposeResult> {
|
||||
let proxy = PMKMailComposeViewControllerDelegate()
|
||||
proxy.retainCycle = proxy
|
||||
vc.mailComposeDelegate = proxy
|
||||
present(vc, animated: animated, completion: completion)
|
||||
_ = proxy.promise.ensure {
|
||||
self.dismiss(animated: animated, completion: nil)
|
||||
}
|
||||
return proxy.promise
|
||||
}
|
||||
}
|
||||
|
||||
extension MFMailComposeViewController {
|
||||
/// Errors representing PromiseKit MFMailComposeViewController failures
|
||||
public enum PMKError: CancellableError, CustomStringConvertible {
|
||||
/// The user cancelled sending mail
|
||||
case cancelled
|
||||
case failed
|
||||
|
||||
/// - Returns: true
|
||||
public var isCancelled: Bool {
|
||||
switch self {
|
||||
case .cancelled:
|
||||
return true
|
||||
case .failed:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .failed:
|
||||
return "The attempt to save or send the message was unsuccessful."
|
||||
case .cancelled:
|
||||
return "The mail was cancelled"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class PMKMailComposeViewControllerDelegate: NSObject, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate {
|
||||
|
||||
let (promise, seal) = Promise<MFMailComposeResult>.pending()
|
||||
var retainCycle: NSObject?
|
||||
|
||||
@objc func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
|
||||
defer { retainCycle = nil }
|
||||
|
||||
if let error = error {
|
||||
seal.reject(error)
|
||||
} else {
|
||||
switch result {
|
||||
case .failed:
|
||||
seal.reject(MFMailComposeViewController.PMKError.failed)
|
||||
case .cancelled:
|
||||
seal.reject(MFMailComposeViewController.PMKError.cancelled)
|
||||
default:
|
||||
seal.fulfill(result)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
import Foundation
|
||||
import MessageUI.MFMessageComposeViewController
|
||||
import UIKit.UIViewController
|
||||
#if !PMKCocoaPods
|
||||
import PromiseKit
|
||||
#endif
|
||||
|
||||
/**
|
||||
To import this `UIViewController` category:
|
||||
|
||||
use_frameworks!
|
||||
pod "PromiseKit/MessageUI"
|
||||
|
||||
And then in your sources:
|
||||
|
||||
import PromiseKit
|
||||
*/
|
||||
extension UIViewController {
|
||||
/// Presents the message view controller and resolves with the user action.
|
||||
public func promise(_ vc: MFMessageComposeViewController, animated: Bool = true, completion:(() -> Void)? = nil) -> Promise<Void> {
|
||||
let proxy = PMKMessageComposeViewControllerDelegate()
|
||||
proxy.retainCycle = proxy
|
||||
vc.messageComposeDelegate = proxy
|
||||
present(vc, animated: animated, completion: completion)
|
||||
_ = proxy.promise.ensure {
|
||||
vc.dismiss(animated: animated, completion: nil)
|
||||
}
|
||||
return proxy.promise
|
||||
}
|
||||
}
|
||||
|
||||
extension MFMessageComposeViewController {
|
||||
/// Errors representing PromiseKit MFMailComposeViewController failures
|
||||
public enum PMKError: CancellableError, CustomStringConvertible {
|
||||
/// The user cancelled sending the message
|
||||
case cancelled
|
||||
case failed
|
||||
|
||||
/// - Returns: true
|
||||
public var isCancelled: Bool {
|
||||
switch self {
|
||||
case .cancelled:
|
||||
return true
|
||||
case .failed:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .failed:
|
||||
return "The attempt to save or send the message was unsuccessful."
|
||||
case .cancelled:
|
||||
return "The message was cancelled"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class PMKMessageComposeViewControllerDelegate: NSObject, MFMessageComposeViewControllerDelegate, UINavigationControllerDelegate {
|
||||
|
||||
let (promise, seal) = Promise<Void>.pending()
|
||||
var retainCycle: NSObject?
|
||||
|
||||
@objc func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
|
||||
defer { retainCycle = nil }
|
||||
|
||||
switch result {
|
||||
case .sent:
|
||||
seal.fulfill(())
|
||||
case .failed:
|
||||
seal.reject(MFMessageComposeViewController.PMKError.failed)
|
||||
case .cancelled:
|
||||
seal.reject(MFMessageComposeViewController.PMKError.cancelled)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user