From 00e5ea4ea8d420dd100e529ad181e314d6ca44a8 Mon Sep 17 00:00:00 2001 From: Serhii Date: Tue, 30 Dec 2025 17:06:45 +0200 Subject: [PATCH] CW-1153-Enable Revolut Pay for Moonpay (#2759) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update quote sorting logic for sell action * аix payment method selection * fix duplicates payment methods Updated the logic to consider payment methods as duplicates based only on paymentMethodType, ignoring customTitle. This simplifies duplicate detection and may address issues with adding similar payment methods. * add revolut support for moonpay * refactor best rate recommendation logic --- assets/images/revolut_dark.svg | 5 +++++ assets/images/revolut_light.svg | 5 +++++ lib/buy/moonpay/moonpay_provider.dart | 4 ++++ lib/buy/payment_method.dart | 4 ++++ lib/view_model/buy/buy_sell_view_model.dart | 15 +++++++++++---- 5 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 assets/images/revolut_dark.svg create mode 100644 assets/images/revolut_light.svg diff --git a/assets/images/revolut_dark.svg b/assets/images/revolut_dark.svg new file mode 100644 index 000000000..abc9daea6 --- /dev/null +++ b/assets/images/revolut_dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/revolut_light.svg b/assets/images/revolut_light.svg new file mode 100644 index 000000000..1333b6b58 --- /dev/null +++ b/assets/images/revolut_light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/buy/moonpay/moonpay_provider.dart b/lib/buy/moonpay/moonpay_provider.dart index 228f0dc5f..2255c2b1a 100644 --- a/lib/buy/moonpay/moonpay_provider.dart +++ b/lib/buy/moonpay/moonpay_provider.dart @@ -383,6 +383,8 @@ class MoonPayProvider extends BuyProvider { return 'yellow_card_bank_transfer'; case PaymentType.fiatBalance: return 'fiat_balance'; + case PaymentType.revolutPay: + return 'revolut_pay'; default: return null; } @@ -416,6 +418,8 @@ class MoonPayProvider extends BuyProvider { return PaymentType.sepaOpenBankingPayment; case 'yellow_card_bank_transfer': return PaymentType.yellowCardBankTransfer; + case 'revolut_pay': + return PaymentType.revolutPay; default: return PaymentType.unknown; } diff --git a/lib/buy/payment_method.dart b/lib/buy/payment_method.dart index 322ca68ba..f23d6fbce 100644 --- a/lib/buy/payment_method.dart +++ b/lib/buy/payment_method.dart @@ -124,6 +124,8 @@ extension PaymentTypeTitle on PaymentType { return 'assets/images/skrill.svg'; case PaymentType.applePay: return 'assets/images/apple_pay_round_light.svg'; + case PaymentType.revolutPay: + return 'assets/images/revolut_light.svg'; default: return null; } @@ -143,6 +145,8 @@ extension PaymentTypeTitle on PaymentType { return 'assets/images/skrill.svg'; case PaymentType.applePay: return 'assets/images/apple_pay_round_dark.svg'; + case PaymentType.revolutPay: + return 'assets/images/revolut_dark.svg'; default: return null; } diff --git a/lib/view_model/buy/buy_sell_view_model.dart b/lib/view_model/buy/buy_sell_view_model.dart index bb7cc5b8a..6dc15b178 100644 --- a/lib/view_model/buy/buy_sell_view_model.dart +++ b/lib/view_model/buy/buy_sell_view_model.dart @@ -367,8 +367,7 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S for (var methods in result) { for (var method in methods) { final alreadyExists = tempPaymentMethods.any((m) { - return m.paymentMethodType == method.paymentMethodType && - m.customTitle == method.customTitle; + return m.paymentMethodType == method.paymentMethodType; }); if (!alreadyExists) { @@ -468,8 +467,7 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S if (sortedRecommendedQuotes.isNotEmpty) { sortedRecommendedQuotes.first - ..setIsBestRate = true - ..recommendations.insert(0, ProviderRecommendation.bestRate); + ..setIsBestRate = true; bestRateQuote = sortedRecommendedQuotes.first; sortedRecommendedQuotes.sort((a, b) { @@ -478,6 +476,15 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S return 0; }); + final Quote effectiveBestRateQuote = + sortedRecommendedQuotes.reduce((a, b) { + return isBuyAction ? a.rate < b.rate ? a : b : a.rate > b.rate ? a : b; + }); + + + effectiveBestRateQuote.recommendations + .add(ProviderRecommendation.bestRate); + selectedQuote = sortedRecommendedQuotes.first; sortedRecommendedQuotes.first.setIsSelected = true; }