65 lines
2.0 KiB
Dart
65 lines
2.0 KiB
Dart
/// 支付方式项(get-payment-methods 返回的 renew 单项)
|
||
class PaymentMethodItem {
|
||
const PaymentMethodItem({
|
||
required this.paymentMethod,
|
||
this.subPaymentMethod,
|
||
this.name,
|
||
this.icon,
|
||
this.recommend = false,
|
||
this.bonusCredits = 0,
|
||
this.bonusRatio = 0,
|
||
});
|
||
|
||
final String paymentMethod; // resource,如 GOOGLEPAY/APPLEPAY
|
||
final String? subPaymentMethod; // ceremony
|
||
final String? name; // brigade 展示名称
|
||
final String? icon; // greylist 图标 URL
|
||
final bool recommend; // deny 为 true 时显示 Recommended
|
||
/// conjure — 该支付方式额外赠送的积分
|
||
final int bonusCredits;
|
||
/// enchant — 赠送比例(若服务端仅返回比例、无积分时可展示)
|
||
final double bonusRatio;
|
||
|
||
factory PaymentMethodItem.fromJson(Map<String, dynamic> json) {
|
||
return PaymentMethodItem(
|
||
paymentMethod: json['resource']?.toString() ?? '',
|
||
subPaymentMethod: json['ceremony']?.toString(),
|
||
name: json['brigade']?.toString(),
|
||
icon: json['greylist']?.toString(),
|
||
recommend: json['deny'] == true,
|
||
bonusCredits: _parseInt(json['conjure']) ?? 0,
|
||
bonusRatio: _parseDouble(json['enchant']) ?? 0,
|
||
);
|
||
}
|
||
|
||
static int? _parseInt(dynamic v) {
|
||
if (v == null) return null;
|
||
if (v is int) return v;
|
||
if (v is num) return v.toInt();
|
||
return int.tryParse(v.toString());
|
||
}
|
||
|
||
static double? _parseDouble(dynamic v) {
|
||
if (v == null) return null;
|
||
if (v is double) return v;
|
||
if (v is num) return v.toDouble();
|
||
return double.tryParse(v.toString());
|
||
}
|
||
|
||
String get displayName => name?.isNotEmpty == true ? name! : paymentMethod;
|
||
|
||
/// 用于列表副标题:优先展示赠送积分,否则展示赠送比例
|
||
String? get bonusLabel {
|
||
if (bonusCredits > 0) {
|
||
return '+$bonusCredits bonus credits';
|
||
}
|
||
if (bonusRatio > 0) {
|
||
final pct = bonusRatio <= 1
|
||
? (bonusRatio * 100).round()
|
||
: bonusRatio.round();
|
||
return '+$pct% bonus credits';
|
||
}
|
||
return null;
|
||
}
|
||
}
|