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