Files
suixinkan_uikit/suixinkan/UI/Common/AppStatusBadge.swift

117 lines
3.4 KiB
Swift

//
// AppStatusBadge.swift
// suixinkan
//
import SnapKit
import UIKit
/// 统一状态标签,合并订单 / 个人信息等 badge 配色逻辑。
final class AppStatusBadge: UIView {
/// 语义色调。
enum Tone {
case info
case success
case warning
case danger
case neutral
}
/// 订单 badge 字号与内边距样式。
enum OrderBadgeStyle {
case photographer
case deposit
}
private let label = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
label.textAlignment = .center
addSubview(label)
applyOrderBadgeStyle(.photographer)
layer.cornerRadius = AppRadius.xs
clipsToBounds = true
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
/// 设置订单 badge 样式(摄影师 14sp / 店铺 12sp)。
func applyOrderBadgeStyle(_ style: OrderBadgeStyle) {
switch style {
case .photographer:
label.font = .app(.bodyMedium)
label.snp.remakeConstraints { make in
make.edges.equalToSuperview().inset(
UIEdgeInsets(top: 0, left: AppSpacing.xxs, bottom: 0, right: AppSpacing.xxs)
)
}
case .deposit:
label.font = .app(.caption)
label.snp.remakeConstraints { make in
make.edges.equalToSuperview().inset(
UIEdgeInsets(top: 2, left: AppSpacing.xs, bottom: 2, right: AppSpacing.xs)
)
}
}
}
/// 按语义色调与文案刷新展示。
func apply(tone: Tone, text: String) {
label.text = text
switch tone {
case .info:
label.textColor = AppColor.info
backgroundColor = AppColor.infoBackground
case .success:
label.textColor = AppColor.success
backgroundColor = AppColor.successBackground
case .warning:
label.textColor = AppColor.warning
backgroundColor = AppColor.warningBackground
case .danger:
label.textColor = AppColor.danger
backgroundColor = AppColor.dangerBackground
case .neutral:
label.textColor = OrderTokens.depositRefunded
backgroundColor = OrderTokens.depositRefundedBackground
}
}
/// 摄影师订单状态映射(对齐 Android `OrderView`)。
func applyOrderStatus(_ status: Int, text: String) {
applyOrderBadgeStyle(.photographer)
switch status {
case 18:
apply(tone: .info, text: text)
case 30:
apply(tone: .success, text: text)
case 50:
apply(tone: .danger, text: text)
default:
apply(tone: .warning, text: text)
}
}
/// 店铺订单状态映射(对齐 Android `DepositOrderCard`)。
func applyDepositOrderStatus(_ status: Int, text: String) {
applyOrderBadgeStyle(.deposit)
switch status {
case 20:
apply(tone: .info, text: text)
case 30:
label.text = text
label.textColor = OrderTokens.depositSuccess
backgroundColor = OrderTokens.depositSuccessBackground
case 50:
apply(tone: .neutral, text: text)
default:
apply(tone: .warning, text: text)
}
}
}