Add PromiseKit dependency

- Added PromiseKit dependency
This commit is contained in:
2018-11-15 22:08:00 -04:00
parent 2689d86c18
commit be7b6b5881
541 changed files with 46282 additions and 0 deletions

View File

@@ -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)
}
}
}
}

View File

@@ -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)
}
}
}