Skip to content

Commit 9f75928

Browse files
committed
ui: show EUR offers for SEPA currencies on onramping screen
1 parent 35472aa commit 9f75928

File tree

1 file changed

+69
-33
lines changed

1 file changed

+69
-33
lines changed

lib/view_model/buy/buy_sell_view_model.dart

Lines changed: 69 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,12 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
149149

150150
@computed
151151
bool get isReadyToTrade {
152-
final hasSelectedQuote = selectedQuote != null;
152+
// final hasSelectedQuote = selectedQuote != null;
153153
final hasSelectedPaymentMethod = selectedPaymentMethod != null;
154154
final isPaymentMethodLoaded = paymentMethodState is PaymentMethodLoaded;
155155
final isBuySellQuotLoaded = buySellQuotState is BuySellQuotLoaded;
156156

157-
return hasSelectedQuote &&
158-
hasSelectedPaymentMethod &&
157+
return hasSelectedPaymentMethod &&
159158
isPaymentMethodLoaded &&
160159
isBuySellQuotLoaded;
161160
}
@@ -215,12 +214,14 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
215214

216215
if (bestRateQuote != null) {
217216
_cryptoNumberFormat.maximumFractionDigits = cryptoCurrency.decimals;
218-
cryptoAmount = _cryptoNumberFormat
219-
.format(enteredAmount / bestRateQuote!.rate)
220-
.toString()
221-
.replaceAll(RegExp('\\,'), '');
217+
cryptoAmount = _cryptoNumberFormat
218+
.format(enteredAmount / bestRateQuote!.rate)
219+
.toString()
220+
.replaceAll(RegExp('\\,'), '');
222221
} else {
223-
await calculateBestRate();
222+
if (bestRateQuote != null || fiatCurrency == bestRateQuote?.fiatCurrency) {
223+
await calculateBestRate();
224+
}
224225
}
225226
}
226227

@@ -243,14 +244,15 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
243244
fiatAmount = '';
244245
return;
245246
}
246-
247247
if (bestRateQuote != null) {
248248
fiatAmount = _cryptoNumberFormat
249249
.format(enteredAmount * bestRateQuote!.rate)
250250
.toString()
251251
.replaceAll(RegExp('\\,'), '');
252252
} else {
253-
await calculateBestRate();
253+
if (bestRateQuote != null || fiatCurrency == bestRateQuote?.fiatCurrency) {
254+
await calculateBestRate();
255+
}
254256
}
255257
}
256258

@@ -308,7 +310,7 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
308310
}).toList();
309311

310312
final updatedQuoteOptions = List<SelectableItem>.from([
311-
OptionTitle(title: 'Recommended'),
313+
if (sortedRecommendedQuotes.isNotEmpty) OptionTitle(title: 'Recommended'),
312314
...sortedRecommendedQuotes,
313315
if (sortedQuotes.isNotEmpty) OptionTitle(title: 'All Providers'),
314316
...sortedQuotes,
@@ -352,13 +354,20 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
352354
Future<void> _getAvailablePaymentTypes() async {
353355
paymentMethodState = PaymentMethodLoading();
354356
selectedPaymentMethod = null;
355-
final result = await Future.wait(providerList.map((element) => element
357+
final resultNative = await Future.wait(providerList.map((element) => element
356358
.getAvailablePaymentTypes(fiatCurrency.title, cryptoCurrency, isBuyAction)
357359
.timeout(
358360
Duration(seconds: 10),
359361
onTimeout: () => [],
360362
)));
361-
363+
364+
final resultSepa = await Future.wait(providerList.map((element) => element
365+
.getAvailablePaymentTypes(FiatCurrency.eur.title, cryptoCurrency, isBuyAction)
366+
.timeout(
367+
Duration(seconds: 10),
368+
onTimeout: () => [],
369+
)));
370+
final result = [...resultNative, ...resultSepa];
362371
final Map<PaymentType, PaymentMethod> uniquePaymentMethods = {};
363372
for (var methods in result) {
364373
for (var method in methods) {
@@ -395,36 +404,35 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
395404
Future<void> calculateBestRate() async {
396405
buySellQuotState = BuySellQuotLoading();
397406

398-
final List<BuyProvider> validProviders = providerList.where((provider) {
399-
bool isValid = false;
407+
final List<BuyProvider> validProvidersNative = providerList.where((provider) {
400408
if (isBuyAction) {
401-
isValid = provider.supportedCryptoList.any((pair) =>
409+
return provider.supportedCryptoList.any((pair) =>
402410
pair.from == cryptoCurrency && pair.to == fiatCurrency);
403411
} else {
404-
isValid = provider.supportedFiatList.any((pair) =>
412+
return provider.supportedFiatList.any((pair) =>
405413
pair.from == fiatCurrency && pair.to == cryptoCurrency);
406414
}
407-
if (isValid) {
408-
return true;
409-
}
415+
}).toList();
416+
417+
final List<BuyProvider> validProvidersSepa = providerList.where((provider) {
410418
if (currenciesWithSepa.contains(fiatCurrency)) {
411419
if (isBuyAction) {
412-
isValid = provider.supportedCryptoList.any((pair) =>
413-
pair.from == cryptoCurrency && pair.to == fiatCurrency);
420+
return provider.supportedCryptoList.any((pair) =>
421+
pair.from == cryptoCurrency && pair.to == FiatCurrency.eur);
414422
} else {
415-
isValid = provider.supportedFiatList.any((pair) =>
416-
pair.from == fiatCurrency && pair.to == cryptoCurrency);
423+
return provider.supportedFiatList.any((pair) =>
424+
pair.from == FiatCurrency.eur && pair.to == cryptoCurrency);
417425
}
418426
}
419427
return false;
420428
}).toList();
421429

422-
if (validProviders.isEmpty) {
430+
if (validProvidersNative.isEmpty && validProvidersSepa.isEmpty) {
423431
buySellQuotState = BuySellQuotFailed();
424432
return;
425433
}
426434

427-
final result = await Future.wait<List<Quote>?>(validProviders.map((element) => element
435+
final result = await Future.wait<List<Quote>?>(validProvidersNative.map((element) => element
428436
.fetchQuote(
429437
cryptoCurrency: cryptoCurrency,
430438
fiatCurrency: fiatCurrency,
@@ -437,44 +445,72 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
437445
Duration(seconds: 10),
438446
onTimeout: () => null,
439447
)));
448+
final resultSepa = await Future.wait<List<Quote>?>(validProvidersSepa.map((element) => element
449+
.fetchQuote(
450+
cryptoCurrency: cryptoCurrency,
451+
fiatCurrency: FiatCurrency.eur,
452+
amount: amount,
453+
paymentType: selectedPaymentMethod?.paymentMethodType,
454+
isBuyAction: isBuyAction,
455+
walletAddress: wallet.walletAddresses.address,
456+
)
457+
.timeout(
458+
Duration(seconds: 10),
459+
onTimeout: () => null,
460+
)));
440461

441462
sortedRecommendedQuotes.clear();
442463
sortedQuotes.clear();
443464

444-
final validQuotes = result
465+
final validQuotesNative = result
445466
.where((element) => element != null && element.isNotEmpty)
446467
.expand((element) => element!)
447468
.toList();
448469

449-
if (validQuotes.isEmpty) {
470+
final validQuotesSepa = resultSepa
471+
.where((element) => element != null && element.isNotEmpty)
472+
.expand((element) => element!)
473+
.toList();
474+
475+
if (validQuotesNative.isEmpty && validQuotesSepa.isEmpty) {
450476
buySellQuotState = BuySellQuotFailed();
451477
return;
452478
}
453479

454-
validQuotes.sort((a, b) => a.rate.compareTo(b.rate));
480+
validQuotesNative.sort((a, b) => a.rate.compareTo(b.rate));
481+
validQuotesSepa.sort((a, b) => a.rate.compareTo(b.rate));
455482

456483
final Set<String> addedProviders = {};
457-
final List<Quote> uniqueProviderQuotes = validQuotes.where((element) {
484+
485+
final List<Quote> uniqueProviderQuotesNative = validQuotesNative.where((element) {
486+
if (addedProviders.contains(element.provider.title)) return false;
487+
addedProviders.add(element.provider.title);
488+
return true;
489+
}).toList();
490+
491+
final List<Quote> uniqueProviderQuotesSepa = validQuotesSepa.where((element) {
458492
if (addedProviders.contains(element.provider.title)) return false;
459493
addedProviders.add(element.provider.title);
460494
return true;
461495
}).toList();
462496

463-
final List<Quote> successRateQuotes = validQuotes.where((element) =>
497+
final List<Quote> successRateQuotes = [...validQuotesNative, ...validQuotesSepa].where((element) =>
464498
element.provider is OnRamperBuyProvider &&
465499
element.recommendations.contains(ProviderRecommendation.successRate)
466500
).toList();
467501

502+
final List<Quote> uniqueProviderQuotes = [];
503+
468504
for (final quote in successRateQuotes) {
469-
if (!uniqueProviderQuotes.contains(quote)) {
505+
if (!uniqueProviderQuotesNative.contains(quote)) {
470506
uniqueProviderQuotes.add(quote);
471507
}
472508
}
473509

474510
sortedRecommendedQuotes.addAll(uniqueProviderQuotes);
475511

476512
sortedQuotes = ObservableList.of(
477-
validQuotes.where((element) => !uniqueProviderQuotes.contains(element)).toList());
513+
[...validQuotesNative, ...validQuotesSepa].where((element) => !uniqueProviderQuotes.contains(element)).toList());
478514

479515
if (sortedRecommendedQuotes.isNotEmpty) {
480516
sortedRecommendedQuotes.first

0 commit comments

Comments
 (0)