recharge_service.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import 'package:dio/dio.dart';
  2. import '../models/asset/recharge_order.dart';
  3. /// 链上充值订单 API(与 Web `stores/deposit.ts` 路径一致)
  4. class RechargeService {
  5. const RechargeService(this._dio);
  6. final Dio _dio;
  7. Future<List<RechargeParentCoin>> getRechargeParents() async {
  8. final response = await _dio.get<Map<String, dynamic>>(
  9. 'uc/coin-network/recharge-parents',
  10. );
  11. final data = response.data?['data'];
  12. if (data is List) {
  13. return data
  14. .whereType<Map<String, dynamic>>()
  15. .map(RechargeParentCoin.fromJson)
  16. .toList()
  17. ..sort((a, b) => a.sort.compareTo(b.sort));
  18. }
  19. return [];
  20. }
  21. Future<List<RechargeNetworkItem>> getRechargeNetworks({
  22. required String coinName,
  23. }) async {
  24. final response = await _dio.get<Map<String, dynamic>>(
  25. 'uc/coin-network/recharge-networks',
  26. queryParameters: {'coinName': coinName},
  27. );
  28. final data = response.data?['data'];
  29. if (data is! List) {
  30. return [];
  31. }
  32. return data
  33. .whereType<Map<String, dynamic>>()
  34. .map(RechargeNetworkItem.fromJson)
  35. .where((n) => n.id > 0)
  36. .toList()
  37. ..sort((a, b) => a.sort.compareTo(b.sort));
  38. }
  39. Future<List<RechargeConfigOption>> getRechargeConfigs({
  40. required String coinName,
  41. required int networkId,
  42. }) async {
  43. final response = await _dio.get<Map<String, dynamic>>(
  44. 'uc/coin-network/recharge-configs',
  45. queryParameters: {
  46. 'coinName': coinName,
  47. 'networkId': networkId,
  48. },
  49. );
  50. final data = response.data?['data'];
  51. if (data is! List) {
  52. return [];
  53. }
  54. return data
  55. .whereType<Map<String, dynamic>>()
  56. .map(RechargeConfigOption.fromJson)
  57. .where((c) => c.networkConfigId > 0)
  58. .toList()
  59. ..sort((a, b) => a.sort.compareTo(b.sort));
  60. }
  61. Future<RechargeOrderDetail> createRechargeOrder({
  62. required String coinName,
  63. required int networkConfigId,
  64. required String amount,
  65. }) async {
  66. final response = await _dio.post<Map<String, dynamic>>(
  67. 'uc/recharge/create',
  68. data: {
  69. 'coinName': coinName,
  70. 'networkConfigId': networkConfigId.toString(),
  71. 'amount': amount.trim(),
  72. },
  73. options: Options(contentType: Headers.formUrlEncodedContentType),
  74. );
  75. final data = response.data?['data'];
  76. if (data is Map<String, dynamic>) {
  77. return RechargeOrderDetail.fromJson(data);
  78. }
  79. throw StateError('create recharge: invalid response');
  80. }
  81. Future<RechargeOrderDetail> submitTxHash({
  82. required String orderNo,
  83. required String txHash,
  84. }) async {
  85. final response = await _dio.post<Map<String, dynamic>>(
  86. 'uc/recharge/submit-hash',
  87. data: {
  88. 'orderNo': orderNo,
  89. 'txHash': txHash.trim(),
  90. },
  91. options: Options(contentType: Headers.formUrlEncodedContentType),
  92. );
  93. final data = response.data?['data'];
  94. if (data is Map<String, dynamic>) {
  95. return RechargeOrderDetail.fromJson(data);
  96. }
  97. throw StateError('submit-hash: invalid response');
  98. }
  99. }