添加即时收款流程并对齐 Android
This commit is contained in:
110
suixinkan/UI/Payment/PaymentCollectionRecordViewController.swift
Normal file
110
suixinkan/UI/Payment/PaymentCollectionRecordViewController.swift
Normal file
@ -0,0 +1,110 @@
|
||||
//
|
||||
// PaymentCollectionRecordViewController.swift
|
||||
// suixinkan
|
||||
//
|
||||
|
||||
import SnapKit
|
||||
import UIKit
|
||||
|
||||
/// 收款记录页,展示近 7 天按日分组的收款明细。
|
||||
final class PaymentCollectionRecordViewController: BaseViewController {
|
||||
|
||||
private let viewModel = PaymentCollectionRecordViewModel()
|
||||
private let paymentAPI = NetworkServices.shared.paymentAPI
|
||||
|
||||
private let scrollView = UIScrollView()
|
||||
private let contentStack = UIStackView()
|
||||
private let emptyLabel = UILabel()
|
||||
private let recordCardView = UIView()
|
||||
private let groupsStack = UIStackView()
|
||||
private let footerLabel = UILabel()
|
||||
|
||||
override func setupNavigationBar() {
|
||||
title = "收款记录"
|
||||
}
|
||||
|
||||
override func setupUI() {
|
||||
view.backgroundColor = AppColor.pageBackground
|
||||
|
||||
contentStack.axis = .vertical
|
||||
contentStack.spacing = AppSpacing.md
|
||||
|
||||
emptyLabel.text = "暂无收款记录"
|
||||
emptyLabel.font = .systemFont(ofSize: 14)
|
||||
emptyLabel.textColor = AppColor.textTertiary
|
||||
emptyLabel.textAlignment = .center
|
||||
emptyLabel.isHidden = true
|
||||
|
||||
recordCardView.backgroundColor = .white
|
||||
recordCardView.layer.cornerRadius = AppRadius.lg
|
||||
recordCardView.isHidden = true
|
||||
|
||||
groupsStack.axis = .vertical
|
||||
groupsStack.spacing = AppSpacing.md
|
||||
|
||||
footerLabel.text = "仅支持查看7天的数据"
|
||||
footerLabel.font = .systemFont(ofSize: 12)
|
||||
footerLabel.textColor = UIColor(hex: 0xB6BECA)
|
||||
footerLabel.textAlignment = .center
|
||||
footerLabel.isHidden = true
|
||||
|
||||
view.addSubview(scrollView)
|
||||
scrollView.addSubview(contentStack)
|
||||
contentStack.addArrangedSubview(emptyLabel)
|
||||
contentStack.addArrangedSubview(recordCardView)
|
||||
contentStack.addArrangedSubview(footerLabel)
|
||||
recordCardView.addSubview(groupsStack)
|
||||
}
|
||||
|
||||
override func setupConstraints() {
|
||||
scrollView.snp.makeConstraints { make in
|
||||
make.edges.equalTo(view.safeAreaLayoutGuide)
|
||||
}
|
||||
contentStack.snp.makeConstraints { make in
|
||||
make.edges.equalToSuperview().inset(AppSpacing.screenHorizontalInset)
|
||||
make.width.equalTo(scrollView.snp.width).offset(-AppSpacing.screenHorizontalInset * 2)
|
||||
}
|
||||
emptyLabel.snp.makeConstraints { make in
|
||||
make.height.greaterThanOrEqualTo(240)
|
||||
}
|
||||
groupsStack.snp.makeConstraints { make in
|
||||
make.edges.equalToSuperview().inset(AppSpacing.md)
|
||||
}
|
||||
}
|
||||
|
||||
override func bindActions() {
|
||||
viewModel.onStateChange = { [weak self] in
|
||||
Task { @MainActor in self?.applyViewModel() }
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
Task { await loadData() }
|
||||
}
|
||||
|
||||
private func loadData() async {
|
||||
showLoading()
|
||||
await viewModel.loadRecord(api: paymentAPI)
|
||||
hideLoading()
|
||||
}
|
||||
|
||||
@MainActor
|
||||
private func applyViewModel() {
|
||||
let hasData = !viewModel.groups.isEmpty
|
||||
emptyLabel.isHidden = hasData
|
||||
recordCardView.isHidden = !hasData
|
||||
footerLabel.isHidden = !hasData
|
||||
|
||||
groupsStack.arrangedSubviews.forEach {
|
||||
groupsStack.removeArrangedSubview($0)
|
||||
$0.removeFromSuperview()
|
||||
}
|
||||
|
||||
viewModel.groups.forEach { group in
|
||||
let groupView = PaymentRecordGroupView()
|
||||
groupView.apply(group: group)
|
||||
groupsStack.addArrangedSubview(groupView)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user