AddGroupMembersViewController.swift 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import UIKit
  2. import DcCore
  3. class AddGroupMembersViewController: GroupMembersViewController {
  4. var onMembersSelected: ((Set<Int>) -> Void)?
  5. lazy var isVerifiedGroup: Bool = false
  6. lazy var isNewGroup: Bool = {
  7. return chat == nil
  8. }()
  9. private lazy var sections: [AddGroupMemberSections] = {
  10. if isVerifiedGroup {
  11. return [.memberList]
  12. } else {
  13. return [.newContact, .memberList]
  14. }
  15. }()
  16. enum AddGroupMemberSections {
  17. case newContact
  18. case memberList
  19. }
  20. private lazy var chatMemberIds: [Int] = {
  21. if let chat = chat {
  22. return chat.contactIds
  23. }
  24. return []
  25. }()
  26. private lazy var chat: DcChat? = {
  27. if let chatId = self.chatId {
  28. return dcContext.getChat(chatId: chatId)
  29. }
  30. return nil
  31. }()
  32. private var chatId: Int?
  33. private lazy var newContactCell: ActionCell = {
  34. let cell = ActionCell()
  35. cell.actionColor = SystemColor.blue.uiColor
  36. cell.actionTitle = String.localized("menu_new_contact")
  37. cell.selectionStyle = .none
  38. return cell
  39. }()
  40. private lazy var cancelButton: UIBarButtonItem = {
  41. let button = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonPressed))
  42. return button
  43. }()
  44. lazy var doneButton: UIBarButtonItem = {
  45. let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed))
  46. return button
  47. }()
  48. //add members of new group, no chat object yet
  49. init(preselected: Set<Int>, isVerified: Bool) {
  50. super.init()
  51. isVerifiedGroup = isVerified
  52. numberOfSections = sections.count
  53. selectedContactIds = preselected
  54. }
  55. //add members of existing group
  56. init(chatId: Int) {
  57. self.chatId = chatId
  58. super.init()
  59. isVerifiedGroup = chat?.isProtected ?? false
  60. numberOfSections = sections.count
  61. selectedContactIds = Set(dcContext.getChat(chatId: chatId).contactIds)
  62. }
  63. required init?(coder _: NSCoder) {
  64. fatalError("init(coder:) has not been implemented")
  65. }
  66. // MARK: - lifecycle
  67. override func viewDidLoad() {
  68. super.viewDidLoad()
  69. title = String.localized("group_add_members")
  70. navigationItem.rightBarButtonItem = doneButton
  71. navigationItem.leftBarButtonItem = cancelButton
  72. contactIds = loadMemberCandidates()
  73. }
  74. @objc func cancelButtonPressed() {
  75. navigationController?.popViewController(animated: true)
  76. }
  77. @objc func doneButtonPressed() {
  78. if let onMembersSelected = onMembersSelected {
  79. if isNewGroup {
  80. selectedContactIds.insert(Int(DC_CONTACT_ID_SELF))
  81. }
  82. onMembersSelected(selectedContactIds)
  83. }
  84. navigationController?.popViewController(animated: true)
  85. }
  86. override func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int {
  87. let sectionType = sections[section]
  88. switch sectionType {
  89. case .newContact:
  90. return 1
  91. case .memberList:
  92. return numberOfRowsForContactList
  93. }
  94. }
  95. override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  96. let sectionType = sections[indexPath.section]
  97. return sectionType == .memberList ? ContactCell.cellHeight : UITableView.automaticDimension
  98. }
  99. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  100. let sectionType = sections[indexPath.section]
  101. switch sectionType {
  102. case .newContact:
  103. return newContactCell
  104. case .memberList:
  105. return updateContactCell(for: indexPath)
  106. }
  107. }
  108. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  109. let sectionType = sections[indexPath.section]
  110. switch sectionType {
  111. case .newContact:
  112. tableView.deselectRow(at: indexPath, animated: true)
  113. showNewContactController()
  114. case .memberList:
  115. didSelectContactCell(at: indexPath)
  116. }
  117. }
  118. func loadMemberCandidates() -> [Int] {
  119. var flags: Int32 = 0
  120. if isVerifiedGroup {
  121. flags |= DC_GCL_VERIFIED_ONLY
  122. }
  123. return dcContext.getContacts(flags: flags)
  124. }
  125. private func showNewContactController() {
  126. let newContactController = NewContactController(dcContext: dcContext, searchResult: searchText)
  127. newContactController.createChatOnSave = false
  128. newContactController.onContactSaved = { [weak self] (contactId: Int) -> Void in
  129. guard let self = self else { return }
  130. self.contactIds = self.loadMemberCandidates()
  131. if self.contactIds.contains(contactId) {
  132. self.selectedContactIds.insert(contactId)
  133. self.tableView.reloadData()
  134. }
  135. }
  136. navigationController?.pushViewController(newContactController, animated: true)
  137. }
  138. }