import MBProgressHUD
import ThreemaFramework
import ThreemaMacros
import UIKit
final class SafeServerViewController: IDCreationPageViewController {
@IBOutlet
var titleLabel: UILabel!
@IBOutlet
var descriptionLabel: UILabel!
@IBOutlet
var serverSwitchLabel: UILabel!
@IBOutlet
var serverSwitch: UISwitch!
@IBOutlet
var serverStackView: UIStackView!
@IBOutlet
var serverField: SetupTextField!
@IBOutlet
var serverLabel: UILabel!
@IBOutlet
var serverUsernameField: SetupTextField!
@IBOutlet
var serverPasswordField: SetupTextField!
@IBOutlet
var cancelButton: SetupButton!
@IBOutlet
var okButton: SetupButton!
var keyboardResize: KeyboardResizeCenterY?
var isServerForRestore =
false
private var cancelSegueID: String?
private var okSegueID: String?
var customServer: String?
var server: String?
var serverUsername: String?
var serverPassword: String?
var maxBackupBytes:
Int?
var retentionDays:
Int?
override func viewDidLoad() {
super.viewDidLoad()
/// With a transparent background, the button is only accessible when
/// the finger is positioned over the text
cancelButton.backgroundColor = .black.withAlphaComponent(
0.
02)
overrideUserInterfaceStyle = .dark
cancelSegueID = isServerForRestore ?
"CancelRestoreSafeServer" :
"CancelSafeServer"
okSegueID = isServerForRestore ?
"OkRestoreSafeServer" :
"OkSafeServer"
hideKeyboardWhenTappedAround()
keyboardResize = KeyboardResizeCenterY(parent: view, resize: mainContentView)
titleLabel.text = String.localizedStringWithFormat(
#localize(
"safe_configure_choose_server"),
TargetManager.localizedAppName
)
if TargetManager.isOnPrem {
descriptionLabel.text = String.localizedStringWithFormat(
#localize(
"safe_configure_server_explain_onprem"),
TargetManager.localizedAppName
)
}
else {
descriptionLabel.text = String.localizedStringWithFormat(
#localize(
"safe_configure_server_explain"),
TargetManager.localizedAppName
)
}
serverSwitchLabel.text = #localize(
"safe_use_default_server")
serverField.delegate = self
serverField.placeholder =
"https://server.example.com"
serverLabel.text = #localize(
"safe_server_authentication")
serverUsernameField.delegate = self
serverUsernameField.placeholder = #localize(
"username")
serverPasswordField.delegate = self
serverPasswordField.placeholder = #localize(
"Password")
cancelButton.setTitle(#localize(
"cancel"),
for: .normal)
okButton.setTitle(#localize(
"ok"),
for: .normal)
let isDefault = server == nil
serverSwitch.isOn = isDefault
serverStackView.isHidden = isDefault
serverField.text = customServer
serverUsernameField.text = serverUsername
serverPasswordField.text = serverPassword
}
// MARK: - Controlling the Keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
true
}
func validateServer(completion: @escaping (Bool) ->
Void) {
guard !serverSwitch.isOn
else {
customServer = nil
server = nil
serverUsername = nil
serverPassword = nil
maxBackupBytes = nil
retentionDays = nil
completion(
true)
return
}
guard let customServer = serverField.text,
let customServerURL = URL(string: customServer)
else {
let alert = IntroQuestionViewHelper(parent: self, onAnswer: nil)
alert.showAlert(SafeError.RestoreError.invalidInput.description, title: #localize(
"safe_test_server"))
return
}
DispatchQueue.main.async {
MBProgressHUD.showAdded(to: self.view, animated:
true)
}
SafeManager.testServer(
serverURL: customServerURL,
user: serverUsernameField.text,
password: serverPasswordField.text
) { errorMessage, maxBackupBytes, retentionDays in
DispatchQueue.main.async {
MBProgressHUD.hide(
for: self.view, animated:
true)
if let errorMessage {
let alert = IntroQuestionViewHelper(parent: self, onAnswer: nil)
alert.showAlert(errorMessage, title: #localize(
"safe_test_server"))
completion(
false)
return
}
self.customServer = customServer
self.server = customServerURL.absoluteString
self.serverUsername = self.serverUsernameField.text
self.serverPassword = self.serverPasswordField.text
self.maxBackupBytes = maxBackupBytes
self.retentionDays = retentionDays
completion(
true)
}
}
}
}
// MARK: - SetupTextFieldDelegate
extension SafeServerViewController: SetupTextFieldDelegate {
func editingChangedTextField(_ sender: SetupTextField, forEvent event: UIEvent) { }
func primaryActionTriggered(_ sender: SetupTextField, forEvent event: UIEvent) {
if sender == serverField {
serverUsernameField.becomeFirstResponder()
}
else if sender == serverUsernameField {
serverPasswordField.becomeFirstResponder()
}
else if sender == serverPasswordField {
sender.resignFirstResponder()
validateServer { success in
if success {
self.performSegue(withIdentifier: self.okSegueID!, sender: self)
}
}
}
}
}
extension SafeServerViewController {
@IBAction func changedServerSwitch(_ sender: UISwitch) {
serverStackView.isHidden = sender.isOn
}
@IBAction func touchDownButton(_ sender: UIButton) {
if sender == cancelButton {
performSegue(withIdentifier: cancelSegueID!, sender: sender)
}
else if sender == okButton {
validateServer { success in
if success {
self.performSegue(withIdentifier: self.okSegueID!, sender: sender)
}
}
}
}
}
extension SafeServerViewController {
override func dismissKeyboard() {
super.dismissKeyboard()
serverField.resignFirstResponder()
serverUsernameField.resignFirstResponder()
serverPasswordField.resignFirstResponder()
}
}