192 lines
7.2 KiB
Swift
192 lines
7.2 KiB
Swift
|
|
//
|
||
|
|
// SelectGroupMemberViewController.swift
|
||
|
|
// TUICallKit
|
||
|
|
//
|
||
|
|
// Created by vincepzhang on 2023/5/12.
|
||
|
|
//
|
||
|
|
|
||
|
|
import Foundation
|
||
|
|
import TUICore
|
||
|
|
|
||
|
|
class SelectGroupMemberViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
|
||
|
|
|
||
|
|
let viewModel = SelectGroupMemberViewModel()
|
||
|
|
let groupMemberObserver = Observer()
|
||
|
|
|
||
|
|
lazy var navigationView: UIView = {
|
||
|
|
let navigationView = UIView()
|
||
|
|
navigationView.backgroundColor = TUICoreDefineConvert.getTUICoreDynamicColor(colorKey: "head_bg_gradient_start_color",
|
||
|
|
defaultHex: "#EBF0F6")
|
||
|
|
return navigationView
|
||
|
|
}()
|
||
|
|
|
||
|
|
lazy var leftBtn: UIButton = {
|
||
|
|
let leftBtn = UIButton(type: .custom)
|
||
|
|
leftBtn.addTarget(self, action: #selector(goBack), for: .touchUpInside)
|
||
|
|
let defaultImage = TUICallKitCommon.getBundleImage(name: "icon_nav_back") ?? UIImage()
|
||
|
|
let leftBtnImage = TUICoreDefineConvert.getTUIDynamicImage(imageKey: "icon_nav_back_image",
|
||
|
|
module: TUIThemeModule.calling,
|
||
|
|
defaultImage: defaultImage)
|
||
|
|
leftBtn.setImage(leftBtnImage, for: .normal)
|
||
|
|
return leftBtn
|
||
|
|
}()
|
||
|
|
|
||
|
|
lazy var centerLabel: UILabel = {
|
||
|
|
let centerLabel = UILabel(frame: CGRect.zero)
|
||
|
|
centerLabel.font = UIFont.boldSystemFont(ofSize: 16.0)
|
||
|
|
centerLabel.textAlignment = .center
|
||
|
|
centerLabel.text = TUICallKitLocalize(key: "TUICallKit.Recents.addUser")
|
||
|
|
centerLabel.textColor = TUICoreDefineConvert.getTUICallKitDynamicColor(colorKey: "callkit_nav_title_text_color",
|
||
|
|
defaultHex: "#000000")
|
||
|
|
return centerLabel
|
||
|
|
}()
|
||
|
|
|
||
|
|
lazy var rightBtn: UIButton = {
|
||
|
|
let rightBtn = UIButton(type: .system)
|
||
|
|
rightBtn.addTarget(self, action: #selector(addUser), for: .touchUpInside)
|
||
|
|
rightBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17.0)
|
||
|
|
rightBtn.setTitle(TUICallKitLocalize(key: "TUICallKit.determine"), for: .normal)
|
||
|
|
rightBtn.setTitleColor(TUICoreDefineConvert.getTUICallKitDynamicColor(colorKey: "callkit_nav_item_title_text_color",
|
||
|
|
defaultHex: "#000000"), for: .normal)
|
||
|
|
return rightBtn
|
||
|
|
}()
|
||
|
|
|
||
|
|
let selectTableView: UITableView = {
|
||
|
|
let selectTableView = UITableView(frame: CGRect.zero)
|
||
|
|
selectTableView.backgroundColor = TUICoreDefineConvert.getTUICallKitDynamicColor(colorKey: "callkit_select_group_member_bg_color",
|
||
|
|
defaultHex: "#F2F2F2")
|
||
|
|
return selectTableView
|
||
|
|
}()
|
||
|
|
|
||
|
|
// MARK: UI Specification Processing
|
||
|
|
override func viewDidLoad() {
|
||
|
|
constructViewHierarchy()
|
||
|
|
activateConstraints()
|
||
|
|
bindInteraction()
|
||
|
|
registerObserve()
|
||
|
|
}
|
||
|
|
|
||
|
|
func constructViewHierarchy() {
|
||
|
|
view.addSubview(navigationView)
|
||
|
|
view.addSubview(leftBtn)
|
||
|
|
view.addSubview(leftBtn)
|
||
|
|
view.addSubview(centerLabel)
|
||
|
|
view.addSubview(rightBtn)
|
||
|
|
view.addSubview(selectTableView)
|
||
|
|
}
|
||
|
|
|
||
|
|
func activateConstraints() {
|
||
|
|
navigationView.snp.makeConstraints({ make in
|
||
|
|
make.leading.trailing.top.equalToSuperview()
|
||
|
|
make.height.equalTo(StatusBar_Height + 44)
|
||
|
|
})
|
||
|
|
leftBtn.snp.makeConstraints({ make in
|
||
|
|
make.leading.equalToSuperview().offset(12)
|
||
|
|
make.centerY.equalTo(centerLabel)
|
||
|
|
make.width.height.equalTo(30)
|
||
|
|
})
|
||
|
|
centerLabel.snp.makeConstraints({ make in
|
||
|
|
make.top.equalToSuperview().offset(StatusBar_Height)
|
||
|
|
make.centerX.equalToSuperview()
|
||
|
|
make.width.equalTo(Screen_Width * 2 / 3)
|
||
|
|
make.height.equalTo(44)
|
||
|
|
})
|
||
|
|
rightBtn.snp.makeConstraints({ make in
|
||
|
|
make.trailing.equalToSuperview().offset(-12)
|
||
|
|
make.centerY.equalTo(centerLabel)
|
||
|
|
})
|
||
|
|
selectTableView.snp.makeConstraints({ make in
|
||
|
|
make.top.equalTo(centerLabel.snp.bottom)
|
||
|
|
make.leading.trailing.bottom.equalToSuperview()
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func bindInteraction() {
|
||
|
|
selectTableView.dataSource = self
|
||
|
|
selectTableView.delegate = self
|
||
|
|
selectTableView.register(SelectGroupMemberCell.self, forCellReuseIdentifier: NSStringFromClass(SelectGroupMemberCell.self))
|
||
|
|
}
|
||
|
|
|
||
|
|
func registerObserve() {
|
||
|
|
viewModel.groupMemberList.addObserver(groupMemberObserver) {[weak self] _, _ in
|
||
|
|
guard let self = self else { return }
|
||
|
|
self.selectTableView.reloadData()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// MARK: Action
|
||
|
|
@objc func addUser() {
|
||
|
|
var userIds: [String] = []
|
||
|
|
for state in viewModel.groupMemberStateOrigin {
|
||
|
|
if state.value {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
if let isSelect = viewModel.groupMemberState[state.key] {
|
||
|
|
if isSelect {
|
||
|
|
userIds.append(state.key)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if userIds.count + TUICallState.instance.remoteUserList.value.count >= MAX_USER {
|
||
|
|
TUITool.makeToast(TUICallKitLocalize(key: "TUICallKit.User.Exceed.Limit"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
CallEngineManager.instance.inviteUser(userIds: userIds)
|
||
|
|
dismiss(animated: true)
|
||
|
|
}
|
||
|
|
|
||
|
|
@objc func goBack() {
|
||
|
|
dismiss(animated: true)
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
extension SelectGroupMemberViewController {
|
||
|
|
|
||
|
|
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||
|
|
return viewModel.groupMemberList.value.count + 1
|
||
|
|
}
|
||
|
|
|
||
|
|
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||
|
|
guard let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(SelectGroupMemberCell.self),
|
||
|
|
for: indexPath) as? SelectGroupMemberCell else {
|
||
|
|
return UITableViewCell()
|
||
|
|
}
|
||
|
|
|
||
|
|
if indexPath.row == 0 {
|
||
|
|
cell.configCell(user: viewModel.selfUser.value, isSelect: true)
|
||
|
|
} else {
|
||
|
|
let user = viewModel.groupMemberList.value[indexPath.row - 1]
|
||
|
|
let isSelect = viewModel.groupMemberState[user.id.value]
|
||
|
|
cell.configCell(user: user, isSelect: isSelect ?? false)
|
||
|
|
}
|
||
|
|
|
||
|
|
return cell
|
||
|
|
}
|
||
|
|
|
||
|
|
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||
|
|
return 60
|
||
|
|
}
|
||
|
|
|
||
|
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||
|
|
if indexPath.row == 0 {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
let user = viewModel.groupMemberList.value[indexPath.row - 1]
|
||
|
|
if viewModel.groupMemberStateOrigin[user.id.value] ?? false {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if viewModel.groupMemberState[user.id.value] ?? false {
|
||
|
|
viewModel.groupMemberState[user.id.value] = false
|
||
|
|
} else {
|
||
|
|
viewModel.groupMemberState[user.id.value] = true
|
||
|
|
}
|
||
|
|
|
||
|
|
selectTableView.reloadData()
|
||
|
|
}
|
||
|
|
}
|