NewContactController.swift 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. //
  2. // NewContactController.swift
  3. // deltachat-ios
  4. //
  5. // Created by Jonas Reinsch on 17.11.17.
  6. // Copyright © 2017 Jonas Reinsch. All rights reserved.
  7. //
  8. import UIKit
  9. class NewContactController: UITableViewController {
  10. let emailCell = TextFieldCell.makeEmailCell()
  11. let nameCell = TextFieldCell.makeNameCell()
  12. var doneButton: UIBarButtonItem?
  13. var cancelButton: UIBarButtonItem?
  14. func contactIsValid() -> Bool {
  15. return Utils.isValid(model.email)
  16. }
  17. var model: (name: String, email: String) = ("", "") {
  18. didSet {
  19. if contactIsValid() {
  20. doneButton?.isEnabled = true
  21. } else {
  22. doneButton?.isEnabled = false
  23. }
  24. }
  25. }
  26. let cells: [UITableViewCell]
  27. // for editing existing contacts (only
  28. // the name may be edited, therefore disable
  29. // the email field)
  30. convenience init(contactIdForUpdate: Int) {
  31. self.init()
  32. title = "Edit Contact"
  33. let contact = MRContact(id: contactIdForUpdate)
  34. nameCell.textField.text = contact.name
  35. emailCell.textField.text = contact.email
  36. emailCell.textField.isEnabled = false
  37. emailCell.contentView.alpha = 0.3
  38. model.name = contact.name
  39. model.email = contact.email
  40. if contactIsValid() {
  41. doneButton?.isEnabled = true
  42. }
  43. }
  44. // for creating a new contact
  45. init() {
  46. cells = [emailCell, nameCell]
  47. super.init(style: .grouped)
  48. emailCell.textField.delegate = self
  49. nameCell.textField.delegate = self
  50. // always show return key with name field, because
  51. // name is optional
  52. nameCell.textField.enablesReturnKeyAutomatically = false
  53. emailCell.textField.returnKeyType = .next
  54. nameCell.textField.returnKeyType = .done
  55. title = "New Contact"
  56. doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(NewContactController.saveContactButtonPressed))
  57. doneButton?.isEnabled = false
  58. navigationItem.rightBarButtonItem = doneButton
  59. cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(NewContactController.cancelButtonPressed))
  60. navigationItem.leftBarButtonItem = cancelButton
  61. emailCell.textField.addTarget(self, action: #selector(NewContactController.emailTextChanged), for: UIControl.Event.editingChanged)
  62. nameCell.textField.addTarget(self, action: #selector(NewContactController.nameTextChanged), for: UIControl.Event.editingChanged)
  63. }
  64. override func viewDidAppear(_: Bool) {
  65. if emailCell.textField.isEnabled {
  66. emailCell.textField.becomeFirstResponder()
  67. } else {
  68. nameCell.textField.becomeFirstResponder()
  69. }
  70. }
  71. override func viewWillAppear(_: Bool) {
  72. navigationController?.setNavigationBarHidden(false, animated: false)
  73. navigationController?.navigationBar.prefersLargeTitles = false
  74. }
  75. @objc func emailTextChanged() {
  76. let emailText = emailCell.textField.text ?? ""
  77. model.email = emailText
  78. }
  79. @objc func nameTextChanged() {
  80. let nameText = nameCell.textField.text ?? ""
  81. model.name = nameText
  82. }
  83. @objc func saveContactButtonPressed() {
  84. dc_create_contact(mailboxPointer, model.name, model.email)
  85. navigationController?.popViewController(animated: true)
  86. }
  87. @objc func cancelButtonPressed() {
  88. navigationController?.popViewController(animated: true)
  89. }
  90. required init?(coder _: NSCoder) {
  91. fatalError("init(coder:) has not been implemented")
  92. }
  93. override func viewDidLoad() {
  94. super.viewDidLoad()
  95. navigationController?.navigationBar.prefersLargeTitles = true
  96. }
  97. override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
  98. return cells.count
  99. }
  100. override func tableView(_: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  101. let row = indexPath.row
  102. return cells[row]
  103. }
  104. override func didReceiveMemoryWarning() {
  105. super.didReceiveMemoryWarning()
  106. // Dispose of any resources that can be recreated.
  107. }
  108. }
  109. extension NewContactController: UITextFieldDelegate {
  110. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  111. if textField == emailCell.textField {
  112. // only switch to next line if email is valid
  113. if contactIsValid() {
  114. nameCell.textField.becomeFirstResponder()
  115. }
  116. } else if textField == nameCell.textField {
  117. if contactIsValid() {
  118. saveContactButtonPressed()
  119. }
  120. }
  121. return true
  122. }
  123. }