Refactor ExtensionPoints to make them easier to create in the future.

This commit is contained in:
Maurice Parker
2020-04-14 16:47:05 -05:00
parent f5aac9516f
commit e206909237
16 changed files with 381 additions and 246 deletions

View File

@@ -7,16 +7,23 @@
//
import Cocoa
import AuthenticationServices
import OAuthSwift
import Secrets
class ExtensionPointEnableBasicWindowController: NSWindowController {
class ExtensionPointEnableWindowController: NSWindowController {
@IBOutlet weak var imageView: NSImageView!
@IBOutlet weak var titleLabel: NSTextField!
@IBOutlet weak var descriptionLabel: NSTextField!
var extensionPointType: ExtensionPointType?
private weak var hostWindow: NSWindow?
private let callbackURL = URL(string: "vincodennw://")!
private var oauth: OAuthSwift?
var extensionPointType: ExtensionPoint.Type?
convenience init() {
self.init(windowNibName: NSNib.Name("ExtensionPointEnableBasic"))
}
@@ -46,16 +53,81 @@ class ExtensionPointEnableBasicWindowController: NSWindowController {
@IBAction func enable(_ sender: Any) {
guard let extensionPointType = extensionPointType else { return }
switch extensionPointType {
case .marsEdit:
ExtensionPointManager.shared.activateExtensionPoint(ExtensionPointIdentifer.marsEdit)
case .microblog:
ExtensionPointManager.shared.activateExtensionPoint(ExtensionPointIdentifer.microblog)
default:
assertionFailure("Unknown extension point.")
if let oauth1 = extensionPointType as? OAuth1SwiftProvider.Type {
enableOauth1(oauth1)
} else {
ExtensionPointManager.shared.activateExtensionPoint(extensionPointType)
hostWindow!.endSheet(window!, returnCode: NSApplication.ModalResponse.OK)
}
hostWindow!.endSheet(window!, returnCode: NSApplication.ModalResponse.OK)
}
}
extension ExtensionPointEnableWindowController: OAuthSwiftURLHandlerType {
public func handle(_ url: URL) {
let session = ASWebAuthenticationSession(url: url, callbackURLScheme: callbackURL.scheme, completionHandler: { (url, error) in
if let callbackedURL = url {
OAuth1Swift.handle(url: callbackedURL)
}
guard let error = error else { return }
self.oauth?.cancel()
self.oauth = nil
if case ASWebAuthenticationSessionError.canceledLogin = error {
print("Login cancelled.")
} else {
NSApplication.shared.presentError(error)
}
})
session.presentationContextProvider = self
if !session.start() {
print("Session failed to start!!!")
}
}
}
extension ExtensionPointEnableWindowController: ASWebAuthenticationPresentationContextProviding {
public func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
return hostWindow!
}
}
private extension ExtensionPointEnableWindowController {
func enableOauth1(_ provider: OAuth1SwiftProvider.Type) {
let oauth1 = provider.oauth1Swift
self.oauth = oauth1
oauth1.authorizeURLHandler = self
oauth1.authorize(withCallbackURL: callbackURL) { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let tokenSuccess):
// let token = tokenSuccess.credential.oauthToken
// let secret = tokenSuccess.credential.oauthTokenSecret
let screenName = tokenSuccess.parameters["screen_name"] as? String ?? ""
print("******************* \(screenName)")
self.hostWindow!.endSheet(self.window!, returnCode: NSApplication.ModalResponse.OK)
case .failure(let oauthSwiftError):
NSApplication.shared.presentError(oauthSwiftError)
}
self.oauth?.cancel()
self.oauth = nil
}
}
}