// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import UIKit import SessionUIKit import SessionMessagingKit final class UserSelectionVC: BaseVC, UITableViewDataSource, UITableViewDelegate { private let navBarTitle: String private let usersToExclude: Set private let completion: (Set) -> Void private var selectedUsers: Set = [] private lazy var users: [Profile] = { return Profile .fetchAllContactProfiles(excluding: usersToExclude) }() // MARK: - Components @objc private lazy var tableView: UITableView = { let result: UITableView = UITableView() result.dataSource = self result.delegate = self result.separatorStyle = .none result.themeBackgroundColor = .clear result.showsVerticalScrollIndicator = false result.alwaysBounceVertical = false result.register(view: SessionCell.self) return result }() // MARK: - Lifecycle init(with title: String, excluding usersToExclude: Set, completion: @escaping (Set) -> Void) { self.navBarTitle = title self.usersToExclude = usersToExclude self.completion = completion super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { preconditionFailure("Use init(excluding:) instead.") } override init(nibName: String?, bundle: Bundle?) { preconditionFailure("Use init(excluding:) instead.") } override func viewDidLoad() { super.viewDidLoad() setNavBarTitle(navBarTitle) let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(handleDoneButtonTapped)) doneButton.accessibilityLabel = "Done" navigationItem.rightBarButtonItem = doneButton view.addSubview(tableView) tableView.pin(to: view) } // MARK: - UITableViewDataSource func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return users.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell: SessionCell = tableView.dequeue(type: SessionCell.self, for: indexPath) let profile: Profile = users[indexPath.row] cell.update( with: SessionCell.Info( id: profile, position: Position.with(indexPath.row, count: users.count), leftAccessory: .profile(id: profile.id, profile: profile), title: profile.displayName(), rightAccessory: .radio(isSelected: { [weak self] in self?.selectedUsers.contains(profile.id) == true }), styling: SessionCell.StyleInfo(backgroundStyle: .edgeToEdge), accessibility: Accessibility(identifier: "Contact") ) ) return cell } // MARK: - Interaction func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if !selectedUsers.contains(users[indexPath.row].id) { selectedUsers.insert(users[indexPath.row].id) } else { selectedUsers.remove(users[indexPath.row].id) } tableView.deselectRow(at: indexPath, animated: true) tableView.reloadRows(at: [indexPath], with: .none) } @objc private func handleDoneButtonTapped() { completion(selectedUsers) navigationController!.popViewController(animated: true) } }