155 lines
5.5 KiB
Swift
155 lines
5.5 KiB
Swift
//
|
||
// OrderSourcePickerViewController.swift
|
||
// suixinkan
|
||
//
|
||
|
||
import SnapKit
|
||
import UIKit
|
||
|
||
/// 订单来源获客员选择 Bottom Sheet 首页,点击获客员后 push 带客单页。
|
||
final class OrderSourcePickerViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
|
||
|
||
private let orderNumber: String
|
||
private let viewModel: OrderListViewModel
|
||
private let referralOrder: BoundReferralOrderEntity?
|
||
private let loadLeads: (OrderSourcePerson) async -> Void
|
||
private let onLeadBound: (OrderSourceSelection) -> Void
|
||
private let onCallPhone: (String) -> Void
|
||
|
||
private let subtitleLabel = UILabel()
|
||
private let tableView = UITableView(frame: .zero, style: .plain)
|
||
private let loadingIndicator = UIActivityIndicatorView(style: .medium)
|
||
private let emptyLabel = UILabel()
|
||
|
||
init(
|
||
orderNumber: String,
|
||
viewModel: OrderListViewModel,
|
||
referralOrder: BoundReferralOrderEntity?,
|
||
loadLeads: @escaping (OrderSourcePerson) async -> Void,
|
||
onLeadBound: @escaping (OrderSourceSelection) -> Void,
|
||
onCallPhone: @escaping (String) -> Void
|
||
) {
|
||
self.orderNumber = orderNumber
|
||
self.viewModel = viewModel
|
||
self.referralOrder = referralOrder
|
||
self.loadLeads = loadLeads
|
||
self.onLeadBound = onLeadBound
|
||
self.onCallPhone = onCallPhone
|
||
super.init(nibName: nil, bundle: nil)
|
||
}
|
||
|
||
@available(*, unavailable)
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
title = "选择获客员"
|
||
navigationItem.largeTitleDisplayMode = .never
|
||
view.backgroundColor = .white
|
||
setupUI()
|
||
applyViewModel()
|
||
}
|
||
|
||
func reloadFromViewModel() {
|
||
applyViewModel()
|
||
(navigationController?.topViewController as? OrderSourceLeadListViewController)?
|
||
.reloadFromViewModel()
|
||
}
|
||
|
||
private func setupUI() {
|
||
subtitleLabel.font = .systemFont(ofSize: 13)
|
||
subtitleLabel.textColor = AppColor.text666
|
||
subtitleLabel.text = "选择人员后,再选择该人员创建的带客单"
|
||
subtitleLabel.numberOfLines = 0
|
||
|
||
tableView.separatorStyle = .none
|
||
tableView.backgroundColor = .white
|
||
tableView.dataSource = self
|
||
tableView.delegate = self
|
||
tableView.register(OrderSourcePersonCell.self, forCellReuseIdentifier: OrderSourcePersonCell.reuseIdentifier)
|
||
|
||
loadingIndicator.hidesWhenStopped = true
|
||
loadingIndicator.color = AppColor.primary
|
||
|
||
emptyLabel.font = .systemFont(ofSize: 14)
|
||
emptyLabel.textColor = AppColor.text666
|
||
emptyLabel.textAlignment = .center
|
||
emptyLabel.numberOfLines = 0
|
||
emptyLabel.text = "暂无合作获客员"
|
||
|
||
view.addSubview(subtitleLabel)
|
||
view.addSubview(tableView)
|
||
view.addSubview(loadingIndicator)
|
||
view.addSubview(emptyLabel)
|
||
|
||
subtitleLabel.snp.makeConstraints { make in
|
||
make.top.equalTo(view.safeAreaLayoutGuide).offset(AppSpacing.md)
|
||
make.leading.trailing.equalToSuperview().inset(AppSpacing.md)
|
||
}
|
||
tableView.snp.makeConstraints { make in
|
||
make.top.equalTo(subtitleLabel.snp.bottom).offset(14)
|
||
make.leading.trailing.bottom.equalToSuperview()
|
||
}
|
||
loadingIndicator.snp.makeConstraints { make in
|
||
make.center.equalTo(tableView)
|
||
}
|
||
emptyLabel.snp.makeConstraints { make in
|
||
make.center.equalTo(tableView)
|
||
make.leading.trailing.equalTo(tableView).inset(AppSpacing.lg)
|
||
}
|
||
}
|
||
|
||
private func applyViewModel() {
|
||
if viewModel.isLoadingOrderSourcePeople {
|
||
loadingIndicator.startAnimating()
|
||
tableView.isHidden = true
|
||
emptyLabel.isHidden = true
|
||
} else {
|
||
loadingIndicator.stopAnimating()
|
||
tableView.isHidden = false
|
||
let isEmpty = viewModel.orderSourcePeople.isEmpty
|
||
emptyLabel.isHidden = !isEmpty
|
||
tableView.reloadData()
|
||
}
|
||
}
|
||
|
||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||
viewModel.orderSourcePeople.count
|
||
}
|
||
|
||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||
let cell = tableView.dequeueReusableCell(
|
||
withIdentifier: OrderSourcePersonCell.reuseIdentifier,
|
||
for: indexPath
|
||
) as! OrderSourcePersonCell
|
||
let person = viewModel.orderSourcePeople[indexPath.row]
|
||
let currentSelection = viewModel.orderSourceSelection(
|
||
orderNumber: orderNumber,
|
||
referralOrder: referralOrder
|
||
)
|
||
cell.configure(
|
||
person: person,
|
||
selected: currentSelection?.person.key == person.key
|
||
)
|
||
cell.onCallPhone = onCallPhone
|
||
return cell
|
||
}
|
||
|
||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||
let person = viewModel.orderSourcePeople[indexPath.row]
|
||
let leadController = OrderSourceLeadListViewController(
|
||
person: person,
|
||
orderNumber: orderNumber,
|
||
viewModel: viewModel,
|
||
referralOrder: referralOrder,
|
||
loadLeads: loadLeads,
|
||
onLeadBound: onLeadBound,
|
||
onCallPhone: onCallPhone
|
||
)
|
||
navigationController?.setNavigationBarHidden(false, animated: true)
|
||
navigationController?.pushViewController(leadController, animated: true)
|
||
}
|
||
}
|