NewGroupAddMembersViewController.swift 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import UIKit
  2. import DcCore
  3. class NewGroupAddMembersViewController: 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 var contactAddedObserver: NSObjectProtocol?
  21. private lazy var chatMemberIds: [Int] = {
  22. if let chat = chat {
  23. return chat.contactIds
  24. }
  25. return []
  26. }()
  27. private lazy var chat: DcChat? = {
  28. if let chatId = self.chatId {
  29. return dcContext.getChat(chatId: chatId)
  30. }
  31. return nil
  32. }()
  33. private var chatId: Int?
  34. private lazy var newContactCell: ActionCell = {
  35. let cell = ActionCell()
  36. cell.actionColor = SystemColor.blue.uiColor
  37. cell.actionTitle = String.localized("menu_new_contact")
  38. cell.selectionStyle = .none
  39. return cell
  40. }()
  41. private lazy var cancelButton: UIBarButtonItem = {
  42. let button = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonPressed))
  43. return button
  44. }()
  45. lazy var doneButton: UIBarButtonItem = {
  46. let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed))
  47. return button
  48. }()
  49. //add members of new group, no chat object yet
  50. init(preselected: Set<Int>, isVerified: Bool) {
  51. super.init()
  52. isVerifiedGroup = isVerified
  53. numberOfSections = sections.count
  54. selectedContactIds = preselected
  55. }
  56. //add members of existing group
  57. init(chatId: Int) {
  58. self.chatId = chatId
  59. super.init()
  60. isVerifiedGroup = chat?.isVerified ?? false
  61. numberOfSections = sections.count
  62. selectedContactIds = []
  63. }
  64. required init?(coder _: NSCoder) {
  65. fatalError("init(coder:) has not been implemented")
  66. }
  67. // MARK: - lifecycle
  68. override func viewDidLoad() {
  69. super.viewDidLoad()
  70. title = String.localized("group_add_members")
  71. navigationItem.rightBarButtonItem = doneButton
  72. navigationItem.leftBarButtonItem = cancelButton
  73. contactIds = loadMemberCandidates()
  74. let nc = NotificationCenter.default
  75. contactAddedObserver = nc.addObserver(
  76. forName: dcNotificationContactChanged,
  77. object: nil,
  78. queue: nil
  79. ) { [weak self] notification in
  80. guard let self = self else { return }
  81. if let ui = notification.userInfo {
  82. if let contactId = ui["contact_id"] as? Int {
  83. if contactId == 0 {
  84. return
  85. }
  86. self.contactIds = self.loadMemberCandidates()
  87. if self.contactIds.contains(contactId) {
  88. self.selectedContactIds.insert(contactId)
  89. self.tableView.reloadData()
  90. }
  91. }
  92. }
  93. }
  94. }
  95. override func viewWillAppear(_ animated: Bool) {
  96. super.viewWillAppear(animated)
  97. }
  98. override func viewWillDisappear(_: Bool) {
  99. // TODO: - check this for new group context
  100. if !isMovingFromParent {
  101. // a subview was added to the navigation stack, no action needed
  102. return
  103. }
  104. let nc = NotificationCenter.default
  105. if let observer = self.contactAddedObserver {
  106. nc.removeObserver(observer)
  107. }
  108. }
  109. @objc func cancelButtonPressed() {
  110. navigationController?.popViewController(animated: true)
  111. }
  112. @objc func doneButtonPressed() {
  113. if let onMembersSelected = onMembersSelected {
  114. if isNewGroup {
  115. selectedContactIds.insert(Int(DC_CONTACT_ID_SELF))
  116. }
  117. onMembersSelected(selectedContactIds)
  118. }
  119. navigationController?.popViewController(animated: true)
  120. }
  121. override func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int {
  122. let sectionType = sections[section]
  123. switch sectionType {
  124. case .newContact:
  125. return 1
  126. case .memberList:
  127. return numberOfRowsForContactList
  128. }
  129. }
  130. override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  131. let sectionType = sections[indexPath.section]
  132. return sectionType == .memberList ? ContactCell.cellHeight : UITableView.automaticDimension
  133. }
  134. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  135. let sectionType = sections[indexPath.section]
  136. switch sectionType {
  137. case .newContact:
  138. return newContactCell
  139. case .memberList:
  140. return updateContactCell(for: indexPath)
  141. }
  142. }
  143. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  144. let sectionType = sections[indexPath.section]
  145. switch sectionType {
  146. case .newContact:
  147. tableView.deselectRow(at: indexPath, animated: true)
  148. showNewContactController()
  149. case .memberList:
  150. didSelectContactCell(at: indexPath)
  151. }
  152. }
  153. func loadMemberCandidates() -> [Int] {
  154. var flags: Int32 = 0
  155. if isVerifiedGroup {
  156. flags |= DC_GCL_VERIFIED_ONLY
  157. }
  158. var contactIds = dcContext.getContacts(flags: flags)
  159. let memberSet = Set(chatMemberIds)
  160. contactIds.removeAll(where: { memberSet.contains($0)})
  161. return Array(contactIds)
  162. }
  163. private func showNewContactController() {
  164. let newContactController = NewContactController(dcContext: dcContext)
  165. newContactController.openChatOnSave = false
  166. navigationController?.pushViewController(newContactController, animated: true)
  167. }
  168. }