forked from shadowfacts/Tusker
55 lines
1.8 KiB
Swift
55 lines
1.8 KiB
Swift
|
//
|
||
|
// XCBManager.swift
|
||
|
// Tusker
|
||
|
//
|
||
|
// Created by Shadowfacts on 9/23/18.
|
||
|
// Copyright © 2018 Shadowfacts. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import UIKit
|
||
|
|
||
|
class XCBManager {
|
||
|
|
||
|
static var specs: [XCallbackURLSpec] = [
|
||
|
XCallbackURLSpec(path: "/postStatus", arguments: ["mentioning": true, "text": true], handle: postStatus)
|
||
|
]
|
||
|
|
||
|
static var currentSession: XCBSession?
|
||
|
|
||
|
static func handle(url: URL) -> Bool {
|
||
|
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return false }
|
||
|
if let spec = specs.first(where: { $0.matches(components) }) {
|
||
|
let xcbURL = XCallbackURL(spec: spec, components: components)
|
||
|
return spec.handle(xcbURL)
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
static func didComplete(session type: XCBSessionType, result: XCBSessionResult) {
|
||
|
if let currentSession = currentSession,
|
||
|
currentSession.type == type {
|
||
|
currentSession.complete(with: result)
|
||
|
self.currentSession = nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static func createSession(type: XCBSessionType, url: XCallbackURL) -> XCBSession {
|
||
|
let session = XCBSession(type: type, success: url.success, error: url.error, cancel: url.cancel)
|
||
|
currentSession = session
|
||
|
return session
|
||
|
}
|
||
|
|
||
|
static func postStatus(_ url: XCallbackURL) -> Bool {
|
||
|
let mentioning = url.arguments["mentioning"]
|
||
|
let text = url.arguments["text"]
|
||
|
if let window = UIApplication.shared.keyWindow {
|
||
|
let session = createSession(type: .postStatus, url: url)
|
||
|
let vc = ComposeViewController.create(for: session, mentioning: mentioning, text: text)
|
||
|
window.rootViewController?.present(vc, animated: true)
|
||
|
return true
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
}
|