jsoncreator_app/JSONCreator_iOS/JSONCreator/MoleculeReplacementViewController.swift
2024-07-16 21:11:38 -04:00

169 lines
6.7 KiB
Swift

//
// MoleculeReplacementViewController.swift
// JSONCreator
//
// Created by Kyle Hedden on 7/9/24.
// Copyright © 2024 Verizon Wireless. All rights reserved.
//
import UIKit
import MVMCoreUI
class MoleculeReplacementViewController: UIViewController {
let textView = UITextView(frame: .zero)
var replaceCallback: (([AnyHashable : Any], MVMCoreLoadObject, _ delay: TimeInterval, _ replay: Bool)->Void)?
var applicationDelay = 3.0
var replay = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
guard textView.superview == nil else {
return
}
modalPresentationStyle = .fullScreen
view.addSubview(textView)
if UIDevice.current.userInterfaceIdiom == .pad {
textView.font = UIFont.systemFont(ofSize: 40)
} else {
textView.font = UIFont.systemFont(ofSize: 14)
}
textView.translatesAutoresizingMaskIntoConstraints = false
textView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
view.trailingAnchor.constraint(equalTo: textView.trailingAnchor).isActive = true
view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: textView.bottomAnchor).isActive = true
textView.delegate = self
textView.smartDashesType = .no
textView.smartQuotesType = .no
textView.smartInsertDeleteType = .no
textView.autocapitalizationType = .none
textView.autocorrectionType = .no
if let data = UserDefaults.standard.data(forKey: "priorReplace"),
let prior = String(data: data, encoding: .utf8) {
textView.text = prior
} else {
textView.text = """
{
"ResponseInfo" : {
"code" : "00000",
"type" : "Success"
},
"ModuleMap": {
}
}
"""
}
let clearButton = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(clearButtonPressed))
let buildButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(play))
navigationItem.setRightBarButtonItems([clearButton, buildButton], animated: true)
navigationItem.title = "Trigger Update"
resetToolbarItems()
}
func resetToolbarItems() {
if #available(iOS 16.0, *) {
let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
let delayButton = UIBarButtonItem(title: "\(applicationDelay)s", image: nil, target: self, action: #selector(delay))
let replayButton = UIBarButtonItem(barButtonSystemItem: replay ? .refresh : .compose, target: self, action: #selector(toggleReplay))
setToolbarItems([spacer, delayButton, replayButton], animated: true)
}
}
func showError(_ error: NSError) {
let alert = UIAlertController(title: "Error", message: "\(error)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
present(alert, animated: true, completion: nil)
}
@objc func clearButtonPressed() {
textView.text = ""
UserDefaults.standard.removeObject(forKey: "priorReplace")
}
@objc func play() {
do {
if let data = textView.text.data(using: .utf8),
let rawServerResponse = try JSONSerialization.jsonObject(with: data, options: []) as? [AnyHashable: Any],
let modulesJSON = rawServerResponse["ModuleMap"] as? [AnyHashable: Any] {
UserDefaults.standard.set(data, forKey: "priorReplace")
let loadObject = MVMCoreLoadObject(pageJSON: nil, modulesJSON: modulesJSON, requestParameters: nil, dataForPage: nil, delegateObject: nil)!
replaceCallback?(rawServerResponse, loadObject, applicationDelay, replay)
}
} catch {
showError(error as NSError)
}
}
@objc func delay() {
let alert = UIAlertController(title: "Delay", message: "Set delay", preferredStyle: .alert)
alert.addTextField { textField in
textField.text = "\(self.applicationDelay)"
textField.placeholder = "Delay in seconds"
}
let action = UIAlertAction(title: "Confirm", style: .default) { [weak self] action in
guard let self = self,
let input = alert.textFields?.first?.text,
let value = Double(input) else {
return
}
self.applicationDelay = value
self.resetToolbarItems()
}
alert.addAction(action)
present(alert, animated: true)
}
@objc func toggleReplay() {
replay = !replay
resetToolbarItems()
}
}
extension MoleculeReplacementViewController: UITextViewDelegate {
func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
guard textView.text.count > 0 else {
return true
}
do {
if let data = textView.text.data(using: .utf8) {
let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
_ = try JSONSerialization.data(withJSONObject: jsonObject, options: [.prettyPrinted, .sortedKeys])
}
return true
} catch {
let alert = UIAlertController(title: "Error", message: "\(error)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
present(alert, animated: true, completion: nil)
return false
}
}
func textViewDidEndEditing(_ textView: UITextView) {
guard textView.text.count > 0 else {
return
}
do {
if let data = textView.text.data(using: .utf8) {
let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
let prettyData = try JSONSerialization.data(withJSONObject: jsonObject, options: [.prettyPrinted, .sortedKeys])
let prettyString = String.init(data: prettyData, encoding: .utf8)
textView.text = prettyString
}
} catch {
let alert = UIAlertController(title: "Error", message: "\(error)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
present(alert, animated: true, completion: nil)
}
}
}