Initial commit: suixinkan_ios UIKit rewrite project.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -0,0 +1,132 @@
|
||||
//
|
||||
// WalletViewControllers.swift
|
||||
// suixinkan
|
||||
//
|
||||
// Created by Codex on 2026/6/26.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
/// 钱包首页。
|
||||
final class WalletViewController: ModuleTableViewController {
|
||||
private let viewModel = WalletViewModel()
|
||||
private let summaryLabel = UILabel()
|
||||
|
||||
override func viewDidLoad() {
|
||||
title = "我的钱包"
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(
|
||||
title: "提现",
|
||||
style: .plain,
|
||||
target: self,
|
||||
action: #selector(openWithdraw)
|
||||
)
|
||||
super.viewDidLoad()
|
||||
setupHeader()
|
||||
wireViewModel(viewModel) { [weak self] in self?.updateSummary() }
|
||||
}
|
||||
|
||||
private func setupHeader() {
|
||||
summaryLabel.numberOfLines = 0
|
||||
summaryLabel.font = .systemFont(ofSize: 14)
|
||||
summaryLabel.textAlignment = .center
|
||||
summaryLabel.textColor = AppDesign.textSecondary
|
||||
summaryLabel.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: 72)
|
||||
tableView.tableHeaderView = summaryLabel
|
||||
}
|
||||
|
||||
override func tableRowCount() -> Int {
|
||||
switch viewModel.selectedTab {
|
||||
case .earnings:
|
||||
return viewModel.earningsGroups.flatMap(\.items).count
|
||||
case .withdraws:
|
||||
return viewModel.withdrawRecords.count
|
||||
}
|
||||
}
|
||||
|
||||
override func configureCell(_ cell: TitleSubtitleTableViewCell, at indexPath: IndexPath) {
|
||||
switch viewModel.selectedTab {
|
||||
case .earnings:
|
||||
let items = viewModel.earningsGroups.flatMap(\.items)
|
||||
let item = items[indexPath.row]
|
||||
cell.configure(title: item.typeLabel, subtitle: item.amount, detail: item.createdAt)
|
||||
case .withdraws:
|
||||
let record = viewModel.withdrawRecords[indexPath.row]
|
||||
cell.configure(title: "¥\(record.amount)", subtitle: record.statusLabel, detail: record.createdAt)
|
||||
}
|
||||
}
|
||||
|
||||
override func reloadContent() async {
|
||||
await viewModel.loadInitial(api: services.walletAPI, staffId: services.staffId)
|
||||
updateSummary()
|
||||
}
|
||||
|
||||
private func updateSummary() {
|
||||
summaryLabel.text = "\(viewModel.withdrawableText) · \(viewModel.totalAmountText)"
|
||||
navigationItem.rightBarButtonItem?.title = viewModel.selectedTab == .earnings ? "提现记录" : "收益明细"
|
||||
}
|
||||
|
||||
@objc private func openWithdraw() {
|
||||
navigationController?.pushViewController(WalletWithdrawViewController(), animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
extension WalletViewModel: ViewModelBindable {}
|
||||
|
||||
/// 钱包提现页。
|
||||
final class WalletWithdrawViewController: ModuleTableViewController {
|
||||
private let viewModel = WithdrawApplyViewModel()
|
||||
private let amountField = UITextField()
|
||||
private let smsField = UITextField()
|
||||
|
||||
override func viewDidLoad() {
|
||||
title = "申请提现"
|
||||
navigationItem.rightBarButtonItems = [
|
||||
UIBarButtonItem(title: "提交", style: .done, target: self, action: #selector(submit)),
|
||||
UIBarButtonItem(title: "验证码", style: .plain, target: self, action: #selector(sendSms))
|
||||
]
|
||||
super.viewDidLoad()
|
||||
amountField.placeholder = "提现金额"
|
||||
amountField.borderStyle = .roundedRect
|
||||
amountField.keyboardType = .decimalPad
|
||||
smsField.placeholder = "短信验证码"
|
||||
smsField.borderStyle = .roundedRect
|
||||
let stack = UIStackView(arrangedSubviews: [amountField, smsField])
|
||||
stack.axis = .vertical
|
||||
stack.spacing = 8
|
||||
stack.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: 96)
|
||||
stack.layoutMargins = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16)
|
||||
stack.isLayoutMarginsRelativeArrangement = true
|
||||
tableView.tableHeaderView = stack
|
||||
wireViewModel(viewModel) { }
|
||||
}
|
||||
|
||||
override func tableRowCount() -> Int { 1 }
|
||||
|
||||
override func configureCell(_ cell: TitleSubtitleTableViewCell, at indexPath: IndexPath) {
|
||||
let amount = viewModel.info?.amountWithdrawable ?? "0"
|
||||
cell.configure(title: "可提现", subtitle: "¥ \(amount)")
|
||||
}
|
||||
|
||||
override func reloadContent() async {
|
||||
await viewModel.load(api: services.walletAPI)
|
||||
}
|
||||
|
||||
@objc private func sendSms() {
|
||||
Task { await viewModel.sendSms(api: services.walletAPI) }
|
||||
}
|
||||
|
||||
@objc private func submit() {
|
||||
viewModel.amountText = amountField.text ?? ""
|
||||
viewModel.smsCode = smsField.text ?? ""
|
||||
Task {
|
||||
if await viewModel.submit(api: services.walletAPI) {
|
||||
services.toastCenter.show("提现申请已提交")
|
||||
navigationController?.popViewController(animated: true)
|
||||
} else if let message = viewModel.errorMessage {
|
||||
services.toastCenter.show(message)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension WithdrawApplyViewModel: ViewModelBindable {}
|
||||
Reference in New Issue
Block a user