NewContactController.swift 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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.textFieldDelegate = self
  29. nameCell.textFieldDelegate = 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. navigationController?.popViewController(animated: true)
  66. }
  67. }
  68. @objc func cancelButtonPressed() {
  69. navigationController?.popViewController(animated: true)
  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. private func showChat(chatId: Int) {
  83. if let chatlistViewController = navigationController?.viewControllers[0] {
  84. let chatViewController = ChatViewController(dcContext: dcContext, chatId: chatId)
  85. navigationController?.setViewControllers([chatlistViewController, chatViewController], animated: true)
  86. }
  87. }
  88. }
  89. extension NewContactController: UITextFieldDelegate {
  90. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  91. if textField == emailCell.textField {
  92. // only switch to next line if email is valid
  93. if contactIsValid() {
  94. nameCell.textField.becomeFirstResponder()
  95. }
  96. } else if textField == nameCell.textField {
  97. if contactIsValid() {
  98. saveContactButtonPressed()
  99. }
  100. }
  101. return true
  102. }
  103. }