@@ -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