// // SupportController.swift // Befund // // Created by Artur Savitskiy on 17.08.22. // Copyright © 2022 MVZ Dr. Stein und Kollegen. All rights reserved. // import Foundation import UIKit class SupportController: UIViewController, UITextFieldDelegate, UIAlertViewDelegate, UITextViewDelegate { private var Settings: Core.Models.Settings? = nil private var SupportTopicsRegistered: NSMutableArray = [ Core.Lang.Get(key: "LBL_SUPPORT_TOPIC_INFO") , Core.Lang.Get(key: "LBL_SUPPORT_TOPIC_TROUBLE") , Core.Lang.Get(key: "LBL_SUPPORT_TOPIC_ACCOUNT_DELETE")] private var SupportTopicsUnregistered: NSMutableArray = [ Core.Lang.Get(key: "LBL_SUPPORT_TOPIC_INFO") , Core.Lang.Get(key: "LBL_SUPPORT_TOPIC_TROUBLE")] //@IBOutlet weak var LBL_BACK: UILabel! @IBOutlet weak var popupSettings_labelYourLabor: UILabel! @IBOutlet weak var popupSettings_labelName: UILabel! @IBOutlet weak var popupSettings_labelStreet: UILabel! @IBOutlet weak var popupSettings_labelCity: UILabel! @IBOutlet weak var popupSettings_labelTel: UILabel! @IBOutlet weak var popupSettings_labelWeb: UILabel! @IBOutlet weak var popupSettings_laborLogo: UIImageView! @IBOutlet weak var support_LabHeader: UILabel! @IBOutlet weak var support_btnBack: UIButton! @IBOutlet weak var support_btnSend: UIButton! @IBOutlet weak var support_Loading: UIActivityIndicatorView! @IBOutlet weak var support_Status: UILabel! @IBOutlet weak var support_txtEMail: UITextField! @IBOutlet weak var support_txtTopic: UITextField! var topicDownPicker: DownPicker! @IBOutlet weak var support_txtMessage: UITextView! @IBOutlet weak var supportPassword_Overlay: UIView! @IBOutlet weak var supportPassword_Content: UIView! @IBOutlet weak var supportPassword_txtPassword: UITextField! @IBOutlet weak var supportPassword_pwdStatus: UILabel! @IBOutlet weak var supportPassword_btnBack: UIButton! @IBOutlet weak var supportPassword_btnOK: UIButton! @IBOutlet weak var LBLBACK_Bottom: NSLayoutConstraint! override func viewDidLoad() { super.viewDidLoad() self.Initialize() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.SetLabels() } private func Initialize() { Settings = Core.Models.Settings.loadFromFile(atPath: Core.System.SettingsPath()) self.support_Loading.isHidden = true self.support_Status.text = "" self.support_txtMessage.text = "" self.support_txtEMail.delegate = self self.addDoneToolbar([self.support_txtEMail]) self.support_txtTopic.delegate = self self.support_txtMessage.delegate = self self.addDoneToolbar(self.support_txtMessage) self.supportPassword_txtPassword.delegate = self self.supportPassword_txtPassword.enablePasswordToggle() if(Settings?.verificator_hash != nil && AppDelegate.Session.DevicePassword != nil) { self.topicDownPicker = DownPicker(textField: self.support_txtTopic, withData: (SupportTopicsRegistered as! [Any])) } else { self.topicDownPicker = DownPicker(textField: self.support_txtTopic, withData: (SupportTopicsUnregistered as! [Any])) } self.supportPassword_Overlay.frame = self.view.frame self.view.addSubview(self.supportPassword_Overlay) self.supportPassword_Overlay.isHidden = true self.hideKeyboardWhenTappedAround() } private func SetLabels() { //self.LBL_BACK.text = Core.Lang.Get(key: "BTN_BACK") if(self.view.frame.height < 700) { //move circle button to bottom to save place for Status label for iPhone 8 self.support_btnBack.frame.origin.y = self.support_btnBack.frame.origin.y + 30 //self.LBLBACK_Bottom.constant = -5 } self.support_LabHeader.text = Core.Lang.Get(key: "LBL_SUPPORT") self.support_txtEMail.placeholder = Core.Lang.Get(key: "LBL_EMAIL") self.support_btnSend.setTitle(Core.Lang.Get(key: "BTN_SEND"), for: .normal) self.supportPassword_txtPassword.placeholder = Core.Lang.Get(key: "LBL_PASSWORD") self.supportPassword_btnBack.setTitle(Core.Lang.Get(key: "BTN_CANCEL"), for: .normal) self.supportPassword_btnOK.setTitle(Core.Lang.Get(key: "BTN_SEND"), for: .normal) if(Settings?.labor != nil) { self.popupSettings_labelName.text = Settings?.labor?.name self.popupSettings_labelStreet.text = Settings?.labor?.street self.popupSettings_labelCity.text = Settings?.labor?.city self.popupSettings_labelTel.text = Settings?.labor?.tel self.popupSettings_labelWeb.text = Settings?.labor?.web self.popupSettings_laborLogo.image = Settings?.labor?.logo } } private func ShowConfirmPassword() { self.supportPassword_pwdStatus.text = "" self.supportPassword_Content.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) self.supportPassword_Overlay.alpha = 0.0 self.supportPassword_Overlay.isHidden = false UIView.animate(withDuration: 0.24) { self.supportPassword_Content.transform = CGAffineTransform.identity self.supportPassword_Overlay.alpha = 70.0 } } @IBAction func supportPassword_BtnOK_Click(_ sender: Any) { let pwd = self.supportPassword_txtPassword.text ?? "" if(pwd.count==0) { self.supportPassword_pwdStatus.text = Core.Lang.Get(key: "ERROR_ENTER_PASSWORD") } else { let pwdDecrypted = Core.Security.AES.Decrypt(value: (Settings?.hashed_private_key ?? ""), password: pwd) if(pwdDecrypted != nil) { let txtEMail = self.support_txtEMail.text ?? "" let txtTopic = self.support_txtTopic.text ?? "" let txtMessage = self.support_txtMessage.text ?? "" self.SendAsync(txtEmail: txtEMail, txtTopic: txtTopic, txtMessage: txtMessage, deleteDevice: true) self.HidePasswordResetPopup() } else { self.supportPassword_pwdStatus.text = Core.Lang.Get(key: "ERROR_INVALID_PASSWORD") } } } @IBAction func supportPassword_BtnBack_Click(_ sender: Any) { self.HidePasswordResetPopup() } private func HidePasswordResetPopup() { self.view.endEditing(true) UIView.animate(withDuration: 0.24, animations: { self.supportPassword_Overlay.alpha = 0.0 self.supportPassword_Content.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) }) {_ in self.supportPassword_Overlay.isHidden = true } } @IBAction func goBack(_ sender: Any) { self.view.endEditing(true) self.dismiss(animated: true, completion: nil) } private func support_HideLoading(message: String? = nil) { self.support_Loading.isHidden = true self.support_Loading.stopAnimating() if(message != nil) { self.support_Status.text = message! self.support_Status.isHidden = false } } @IBAction func support_BtnSend_Click(_ sender: Any) { self.support_Status.text = "" let txtEMail = self.support_txtEMail.text ?? "" let txtTopic = self.support_txtTopic.text ?? "" let txtMessage = self.support_txtMessage.text ?? "" if(txtEMail.count == 0) { self.support_HideLoading(message: Core.Lang.Get(key: "ERROR_ENTER_EMAIL")) } else if(txtTopic.count == 0) { self.support_HideLoading(message: Core.Lang.Get(key: "ERROR_ENTER_TOPIC")) } else if(txtMessage.count == 0) { self.support_HideLoading(message: Core.Lang.Get(key: "ERROR_ENTER_TEXT")) } else { let deleteDevice = (txtTopic == Core.Lang.Get(key: "LBL_SUPPORT_TOPIC_ACCOUNT_DELETE")) if(deleteDevice) { self.ShowConfirmPassword() } else { self.SendAsync(txtEmail: txtEMail, txtTopic: txtTopic, txtMessage: txtMessage, deleteDevice: deleteDevice) self.support_btnSend.isEnabled = false } } } private func SendAsync(txtEmail: String, txtTopic: String, txtMessage: String, deleteDevice: Bool) { self.support_Loading.isHidden = false self.support_Loading.startAnimating() let requestKeyPair = Core.Security.Curve25519.GenerateKeyPair() let support = Core.Models.Request.Support() support.email = txtEmail support.topic = txtTopic support.text = txtMessage support.udid = AppDelegate.Session.Device?.udid support.verificator_hash = Settings?.verificator_hash support.delete_device = deleteDevice let currentHost = ViewController.Settings!.labor?.host ?? .DEVELOPMENT Core.Https.Request.KeyExchangeAsync(host: currentHost, keyPair: requestKeyPair, onSuccess: { publicKey in let sharedKey = requestKeyPair.GetSharedKey(peerPublicKeyBase64: publicKey.key) let encryptedRequest = Core.Models.Request.EncryptedRequest(descriptor: "Support", contentObject: support, requestType: .REQUEST_SUPPORT, key: sharedKey!) Core.Https.Request.EncryptedRequestAsync(host: currentHost, controller: "results", action: "support", request: encryptedRequest, serverPublicKey: publicKey, keyPair: requestKeyPair, onSuccess: { encryptedResponse in encryptedResponse.Decrypt(key: sharedKey!) DispatchQueue.main.async { if(encryptedResponse.descriptor.lowercased().elementsEqual("success")) { if(deleteDevice) { if (Core.System.DeleteAllFiles()) { self.support_HideLoading(message: Core.Lang.Get(key: "MSG_ACCOUNT_SUCCESSFULLY_DELETED")) DispatchQueue.main.asyncAfter(deadline: .now() + 1) { AppDelegate.Session.DevicePassword = nil UIApplication.shared.windows[0].rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SelectLabor") } } } else { self.support_HideLoading(message: Core.Lang.Get(key: "MSG_SUPPORT_SUCCESSFULLY_SENT")) } } else { if(deleteDevice) { self.support_HideLoading(message: Core.Lang.Get(key: "MSG_ACCOUNT_COULD_NOT_DELETED")) } else { self.support_HideLoading(message: Core.Lang.Get(key: "MSG_SUPPORT_COULD_NOT_SEND")) } } self.support_btnSend.isEnabled = true self.support_txtEMail.text = "" self.support_txtTopic.text = "" self.support_txtMessage.text = "" } }, onError: { error in DispatchQueue.main.async { //self.PasswordActivity_HideLoading(message: error) Core.Log.Critical(msg: "Server not reachable", namespace: "LoginController", method: "ChangePassword") self.support_btnSend.isEnabled = true } }) }, onError: { error in DispatchQueue.main.async { //self.PasswordActivity_HideLoading(message: error) Core.Log.Critical(msg: "Server not reachable", namespace: "SupportController", method: "DeleteAccount") self.support_btnSend.isEnabled = true } }) } }