102 lines
3.2 KiB
Swift
102 lines
3.2 KiB
Swift
//
|
||
// BindAcquirerViewModel.swift
|
||
// suixinkan
|
||
//
|
||
|
||
import Foundation
|
||
|
||
/// 接受邀请 / 绑定获客员 ViewModel,对齐 Android `BindAcquirerViewModel`。
|
||
final class BindAcquirerViewModel {
|
||
|
||
private(set) var inviteInfo: SaleUserInviteInfoResponse?
|
||
private(set) var isLoading = false
|
||
private(set) var isAlreadyBound = false
|
||
private(set) var commissionRateDraft = ""
|
||
|
||
var onStateChange: (() -> Void)?
|
||
var onShowMessage: ((String) -> Void)?
|
||
var onBindSuccess: (() -> Void)?
|
||
var onShouldPop: (() -> Void)?
|
||
|
||
private var saleUserId = 0
|
||
|
||
func initSaleUserId(_ id: Int) {
|
||
guard saleUserId != id || (inviteInfo == nil && !isAlreadyBound) else { return }
|
||
saleUserId = id
|
||
isAlreadyBound = false
|
||
commissionRateDraft = ""
|
||
inviteInfo = nil
|
||
notifyStateChange()
|
||
}
|
||
|
||
func updateCommissionRateDraft(_ text: String) {
|
||
commissionRateDraft = String(text.filter(\.isNumber).prefix(3))
|
||
notifyStateChange()
|
||
}
|
||
|
||
func loadInviteInfo(api: OrderAPI) async {
|
||
guard saleUserId > 0 else {
|
||
onShowMessage?("获客员信息无效")
|
||
onShouldPop?()
|
||
return
|
||
}
|
||
isLoading = true
|
||
notifyStateChange()
|
||
do {
|
||
let data = try await api.saleUserInviteInfo(saleUserId: String(saleUserId))
|
||
let resolvedSaleUserId = data.saleUserId > 0 ? data.saleUserId : saleUserId
|
||
inviteInfo = SaleUserInviteInfoResponse(
|
||
saleUserId: resolvedSaleUserId,
|
||
isBound: data.isBound,
|
||
photographerName: data.photographerName,
|
||
photographerPhone: data.photographerPhone,
|
||
salerName: data.salerName,
|
||
salerPhone: data.salerPhone,
|
||
shareCode: data.shareCode,
|
||
subtitle: data.subtitle,
|
||
title: data.title
|
||
)
|
||
if data.isBound {
|
||
isAlreadyBound = true
|
||
}
|
||
} catch {
|
||
handleBindError(error.localizedDescription.isEmpty ? "获取邀请信息失败" : error.localizedDescription)
|
||
}
|
||
isLoading = false
|
||
notifyStateChange()
|
||
}
|
||
|
||
func acceptBind(api: OrderAPI) async {
|
||
guard saleUserId > 0, !isAlreadyBound else { return }
|
||
guard let commissionRate = Int(commissionRateDraft.trimmingCharacters(in: .whitespacesAndNewlines)) else {
|
||
onShowMessage?("请输入分账比例")
|
||
return
|
||
}
|
||
guard (0...100).contains(commissionRate) else {
|
||
onShowMessage?("分账比例需在0到100之间")
|
||
return
|
||
}
|
||
do {
|
||
try await api.saleUserAcceptBind(saleUserId: saleUserId, commissionRate: commissionRate)
|
||
onShowMessage?("绑定成功")
|
||
onBindSuccess?()
|
||
} catch {
|
||
handleBindError(error.localizedDescription.isEmpty ? "绑定失败" : error.localizedDescription)
|
||
}
|
||
}
|
||
|
||
private func handleBindError(_ message: String) {
|
||
onShowMessage?(message)
|
||
if message.contains("已绑定") {
|
||
isAlreadyBound = true
|
||
notifyStateChange()
|
||
return
|
||
}
|
||
onShouldPop?()
|
||
}
|
||
|
||
private func notifyStateChange() {
|
||
onStateChange?()
|
||
}
|
||
}
|