QmeraUserChooserViewController.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. //
  2. // QmeraUserStreamingTableViewController.swift
  3. // Qmera
  4. //
  5. // Created by Yayan Dwi on 02/11/21.
  6. //
  7. import UIKit
  8. class QmeraUserChooserViewController: UITableViewController {
  9. private var searchController: UISearchController!
  10. var ignored: [User] = []
  11. var isDismiss: (([User]) -> ())?
  12. private var availableUser: [User] = []
  13. private var fillteredUser: [User] = []
  14. private var isSearchBarEmpty: Bool {
  15. return searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
  16. }
  17. private var isFilltering: Bool {
  18. return searchController.isActive && !isSearchBarEmpty
  19. }
  20. private var userSelected: [User] = []
  21. private let cellIdentifier = "reuseIdentifier"
  22. lazy var table: UITableView = {
  23. let tableView = UITableView(frame: CGRect.zero)
  24. tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
  25. tableView.tableFooterView = UIView()
  26. return tableView
  27. }()
  28. override func viewDidLoad() {
  29. super.viewDidLoad()
  30. title = "Friends".localized()
  31. navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
  32. navigationController?.navigationBar.prefersLargeTitles = true
  33. navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(add(sender:)))
  34. navigationItem.rightBarButtonItem?.isEnabled = false
  35. searchController = UISearchController(searchResultsController: nil)
  36. searchController.delegate = self
  37. searchController.searchResultsUpdater = self
  38. searchController.searchBar.autocapitalizationType = .none
  39. searchController.searchBar.delegate = self
  40. searchController.searchBar.updateHeight(height: 36, radius: 18)
  41. searchController.obscuresBackgroundDuringPresentation = false
  42. searchController.searchBar.searchTextField.attributedPlaceholder = NSAttributedString(string: "Search".localized(), attributes: [NSAttributedString.Key.foregroundColor: UIColor.gray, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16)])
  43. definesPresentationContext = true
  44. navigationItem.searchController = searchController
  45. navigationItem.hidesSearchBarWhenScrolling = true
  46. tableView = table
  47. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
  48. self.getData { users in
  49. self.availableUser.append(contentsOf: users)
  50. DispatchQueue.main.async {
  51. self.tableView.reloadData()
  52. }
  53. }
  54. })
  55. }
  56. override func viewWillAppear(_ animated: Bool) {
  57. pullBuddy()
  58. }
  59. override func viewWillDisappear(_ animated: Bool) {
  60. navigationController?.navigationBar.prefersLargeTitles = false
  61. }
  62. @objc func add(sender: Any) {
  63. isDismiss?(userSelected)
  64. navigationController?.popViewController(animated: true)
  65. }
  66. private func pullBuddy() {
  67. if let me = User.getMyPin() {
  68. DispatchQueue.global().async {
  69. let _ = Nexilis.write(message: CoreMessage_TMessageBank.getBatchBuddiesInfos(p_f_pin: me, last_update: 0))
  70. }
  71. }
  72. }
  73. // MARK: - Data source
  74. private func getData(completion: @escaping ([User]) -> ()) {
  75. DispatchQueue.global().async {
  76. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  77. do {
  78. var r: [User] = []
  79. if let cursorData = Database.shared.getRecords(fmdb: fmdb, query: "SELECT f_pin, first_name, last_name, image_id FROM BUDDY where f_pin not in (\(self.ignored.map{ "'\($0.pin)'" }.joined(separator: ","))) and f_pin <> '\(User.getMyPin()!)' and official_account <> 1 order by 2 collate nocase asc") {
  80. while cursorData.next() {
  81. let user = User(pin: cursorData.string(forColumnIndex: 0) ?? "",
  82. firstName: cursorData.string(forColumnIndex: 1) ?? "",
  83. lastName: cursorData.string(forColumnIndex: 2) ?? "",
  84. thumb: cursorData.string(forColumnIndex: 3) ?? "")
  85. if (user.firstName + " " + user.lastName).trimmingCharacters(in: .whitespaces) == "USR\(user.pin)" {
  86. continue
  87. }
  88. r.append(user)
  89. }
  90. cursorData.close()
  91. }
  92. completion(r)
  93. } catch {
  94. rollback.pointee = true
  95. print("Access database error: \(error.localizedDescription)")
  96. }
  97. })
  98. }
  99. }
  100. private func filterContentForSearchText(_ searchText: String) {
  101. fillteredUser = availableUser.filter({ d in
  102. let name = "\(d.firstName) \(d.lastName)".trimmingCharacters(in: .whitespaces)
  103. return name.lowercased().contains(searchText.lowercased())
  104. })
  105. tableView.reloadData()
  106. }
  107. // MARK: - Table view data source
  108. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  109. let user: User
  110. if isFilltering {
  111. user = fillteredUser[indexPath.row]
  112. } else {
  113. user = availableUser[indexPath.row]
  114. }
  115. user.isSelected = !user.isSelected
  116. tableView.reloadData()
  117. if user.isSelected {
  118. userSelected.append(user)
  119. } else {
  120. if let index = userSelected.firstIndex(of: user) {
  121. userSelected.remove(at: index)
  122. }
  123. }
  124. if userSelected.count == 1 {
  125. navigationItem.rightBarButtonItem?.isEnabled = true
  126. } else if userSelected.count == 0 {
  127. navigationItem.rightBarButtonItem?.isEnabled = false
  128. }
  129. }
  130. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  131. if isFilltering {
  132. return fillteredUser.count
  133. }
  134. return availableUser.count
  135. }
  136. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  137. let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
  138. var content = cell.defaultContentConfiguration()
  139. let user: User
  140. if isFilltering {
  141. user = fillteredUser[indexPath.row]
  142. } else {
  143. user = availableUser[indexPath.row]
  144. }
  145. content.imageProperties.maximumSize = CGSize(width: 40, height: 40)
  146. getImage(name: user.thumb, placeholderImage: UIImage(named: "Profile---Purple", in: Bundle.resourceBundle(for: Nexilis.self), with: nil), isCircle: true, tableView: tableView, indexPath: indexPath) { result, isDownloaded, image in
  147. content.image = image
  148. }
  149. content.text = "\(user.firstName) \(user.lastName)"
  150. cell.contentConfiguration = content
  151. cell.accessoryType = user.isSelected ? .checkmark : .none
  152. return cell
  153. }
  154. }
  155. extension QmeraUserChooserViewController: UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {
  156. func updateSearchResults(for searchController: UISearchController) {
  157. filterContentForSearchText(searchController.searchBar.text!.trimmingCharacters(in: .whitespacesAndNewlines))
  158. }
  159. }