优化:三方支付显示增加积分

This commit is contained in:
ivan 2026-04-13 19:02:16 +08:00
parent 1242f2b3fe
commit 40b4ae8948
2 changed files with 73 additions and 17 deletions

View File

@ -6,6 +6,8 @@ class PaymentMethodItem {
this.name, this.name,
this.icon, this.icon,
this.recommend = false, this.recommend = false,
this.bonusCredits = 0,
this.bonusRatio = 0,
}); });
final String paymentMethod; // resource GOOGLEPAY/APPLEPAY final String paymentMethod; // resource GOOGLEPAY/APPLEPAY
@ -13,6 +15,10 @@ class PaymentMethodItem {
final String? name; // brigade final String? name; // brigade
final String? icon; // greylist URL final String? icon; // greylist URL
final bool recommend; // deny true Recommended final bool recommend; // deny true Recommended
/// conjure
final int bonusCredits;
/// enchant
final double bonusRatio;
factory PaymentMethodItem.fromJson(Map<String, dynamic> json) { factory PaymentMethodItem.fromJson(Map<String, dynamic> json) {
return PaymentMethodItem( return PaymentMethodItem(
@ -21,8 +27,38 @@ class PaymentMethodItem {
name: json['brigade']?.toString(), name: json['brigade']?.toString(),
icon: json['greylist']?.toString(), icon: json['greylist']?.toString(),
recommend: json['deny'] == true, 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 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;
}
} }

View File

@ -784,10 +784,10 @@ class _PaymentMethodItem extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GestureDetector( return GestureDetector(
onTap: onTap, onTap: onTap,
child: AnimatedContainer( child: AnimatedContainer(
duration: const Duration(milliseconds: 150), duration: const Duration(milliseconds: 150),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
height: 64, constraints: const BoxConstraints(minHeight: 64),
decoration: BoxDecoration( decoration: BoxDecoration(
color: isSelected ? const Color(0x158B5CF6) : AppColors.surface, color: isSelected ? const Color(0x158B5CF6) : AppColors.surface,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
@ -804,28 +804,48 @@ class _PaymentMethodItem extends StatelessWidget {
_PaymentIcon(iconUrl: item.icon), _PaymentIcon(iconUrl: item.icon),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
child: Row( child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Flexible( Row(
child: Text( children: [
item.displayName, Flexible(
style: AppTypography.bodyRegular.copyWith( child: Text(
color: AppColors.textPrimary, item.displayName,
fontWeight: FontWeight.w600, style: AppTypography.bodyRegular.copyWith(
fontSize: 16, color: AppColors.textPrimary,
fontWeight: FontWeight.w600,
fontSize: 16,
),
overflow: TextOverflow.ellipsis,
),
), ),
overflow: TextOverflow.ellipsis, if (item.recommend) ...[
), const SizedBox(width: 6),
Text(
'Recommended',
style: AppTypography.caption.copyWith(
color: AppColors.primary,
fontWeight: FontWeight.w600,
fontSize: 11,
),
),
],
],
), ),
if (item.recommend) ...[ if (item.bonusLabel != null) ...[
const SizedBox(width: 6), const SizedBox(height: 4),
Text( Text(
'Recommended', item.bonusLabel!,
style: AppTypography.caption.copyWith( style: AppTypography.caption.copyWith(
color: AppColors.primary, color: AppColors.primary,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w500,
fontSize: 11, fontSize: 12,
), ),
maxLines: 1,
overflow: TextOverflow.ellipsis,
), ),
], ],
], ],