NewContactController.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import UIKit
  2. import DcCore
  3. class NewContactController: UITableViewController {
  4. let dcContext: DcContext
  5. var openChatOnSave = true
  6. let emailCell = TextFieldCell.makeEmailCell()
  7. let nameCell = TextFieldCell.makeNameCell()
  8. var doneButton: UIBarButtonItem?
  9. var cancelButton: UIBarButtonItem?
  10. func contactIsValid() -> Bool {
  11. return Utils.isValid(email: model.email)
  12. }
  13. var model: (name: String, email: String) = ("", "") {
  14. didSet {
  15. if contactIsValid() {
  16. doneButton?.isEnabled = true
  17. } else {
  18. doneButton?.isEnabled = false
  19. }
  20. }
  21. }
  22. let cells: [UITableViewCell]
  23. // for creating a new contact
  24. init(dcContext: DcContext) {
  25. self.dcContext = dcContext
  26. cells = [emailCell, nameCell]
  27. super.init(style: .grouped)
  28. emailCell.textField.delegate = self
  29. nameCell.textField.delegate = self
  30. // always show return key with name field, because
  31. // name is optional
  32. nameCell.textField.enablesReturnKeyAutomatically = false
  33. emailCell.textField.returnKeyType = .next
  34. nameCell.textField.returnKeyType = .done
  35. title = String.localized("menu_new_contact")
  36. doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(saveContactButtonPressed))
  37. doneButton?.isEnabled = false
  38. navigationItem.rightBarButtonItem = doneButton
  39. cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonPressed))
  40. navigationItem.leftBarButtonItem = cancelButton
  41. emailCell.textField.addTarget(self, action: #selector(NewContactController.emailTextChanged), for: UIControl.Event.editingChanged)
  42. nameCell.textField.addTarget(self, action: #selector(NewContactController.nameTextChanged), for: UIControl.Event.editingChanged)
  43. }
  44. override func viewDidAppear(_: Bool) {
  45. if emailCell.textField.isEnabled {
  46. emailCell.textField.becomeFirstResponder()
  47. } else {
  48. nameCell.textField.becomeFirstResponder()
  49. }
  50. }
  51. @objc func emailTextChanged() {
  52. let emailText = emailCell.textField.text ?? ""
  53. model.email = emailText
  54. }
  55. @objc func nameTextChanged() {
  56. let nameText = nameCell.textField.text ?? ""
  57. model.name = nameText
  58. }
  59. @objc func saveContactButtonPressed() {
  60. let contactId = dcContext.createContact(name: model.name, email: model.email)
  61. let chatId = dcContext.createChatByContactId(contactId: contactId)
  62. if openChatOnSave {
  63. showChat(chatId: chatId)
  64. } else {
  65. navigateBack()
  66. }
  67. }
  68. @objc func cancelButtonPressed() {
  69. navigateBack()
  70. }
  71. required init?(coder _: NSCoder) {
  72. fatalError("init(coder:) has not been implemented")
  73. }
  74. override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
  75. return cells.count
  76. }
  77. override func tableView(_: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  78. let row = indexPath.row
  79. return cells[row]
  80. }
  81. // MARK: - coordinator
  82. func navigateBack() {
  83. navigationController?.popViewController(animated: true)
  84. }
  85. func showChat(chatId: Int) {
  86. let chatViewController = ChatViewController(dcContext: dcContext, chatId: chatId)
  87. navigationController?.popToRootViewController(animated: false)
  88. navigationController?.pushViewController(chatViewController, animated: true)
  89. }
  90. }
  91. extension NewContactController: UITextFieldDelegate {
  92. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  93. if textField == emailCell.textField {
  94. // only switch to next line if email is valid
  95. if contactIsValid() {
  96. nameCell.textField.becomeFirstResponder()
  97. }
  98. } else if textField == nameCell.textField {
  99. if contactIsValid() {
  100. saveContactButtonPressed()
  101. }
  102. }
  103. return true
  104. }
  105. }