Files
Yeti/YetiSignerAction/YetiSignerActionViewController.swift

82 lines
2.8 KiB
Swift

//
// YetiSignerActionViewController.swift
// YetiSignerAction
//
// Created by Terry Yiu on 1/26/25.
//
//import MobileCoreServices
import SwiftUI
import UIKit
import UniformTypeIdentifiers
class YetiSignerActionViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
guard
let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem,
let itemProvider = extensionItem.attachments?.first
else {
done()
return
}
let textDataType = UTType.plainText.identifier
guard itemProvider.hasItemConformingToTypeIdentifier(textDataType) else {
done()
return
}
itemProvider.loadItem(forTypeIdentifier: textDataType , options: nil) { (providedText, error) in
if let error {
self.done(signedEvent: error.localizedDescription)
return
}
if let text = providedText as? String {
DispatchQueue.main.async {
let contentView = UIHostingController(rootView: YetiSignerActionView(text: text))
self.addChild(contentView)
self.view.addSubview(contentView.view)
// set up constraints
contentView.view.translatesAutoresizingMaskIntoConstraints = false
contentView.view.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
contentView.view.bottomAnchor.constraint (equalTo: self.view.bottomAnchor).isActive = true
contentView.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
contentView.view.rightAnchor.constraint (equalTo: self.view.rightAnchor).isActive = true
}
} else {
self.done()
return
}
}
NotificationCenter.default.addObserver(forName: NSNotification.Name("done"), object: nil, queue: nil) { notification in
DispatchQueue.main.async {
self.done(signedEvent: notification.object as? String)
}
}
}
func done(signedEvent: String? = nil) {
if let extensionContext = self.extensionContext {
if let signedEvent {
let itemProvider = NSItemProvider(
item: signedEvent as NSSecureCoding?,
typeIdentifier: UTType.text.identifier
)
let extensionItem = NSExtensionItem()
extensionItem.attachments = [itemProvider]
extensionContext.completeRequest(returningItems: [extensionItem], completionHandler: nil)
} else {
extensionContext.completeRequest(returningItems: [], completionHandler: nil)
}
}
}
}