// // 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)->Void)? 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" } 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) } } catch { showError(error as NSError) } } @objc func close() { Task { @MainActor in await NavigationHandler.shared().popTopViewController() } } } 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) } } }