@@ -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 }
@@ -220,7 +219,9 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
220219 .toString ()
221220 .replaceAll (RegExp ('\\ ,' ), '' );
222221 } else {
223- await calculateBestRate ();
222+ if (bestRateQuote != null || fiatCurrency == bestRateQuote? .fiatCurrency) {
223+ await calculateBestRate ();
224+ }
224225 }
225226 }
226227
@@ -250,7 +251,9 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
250251 .toString ()
251252 .replaceAll (RegExp ('\\ ,' ), '' );
252253 } else {
253- await calculateBestRate ();
254+ if (bestRateQuote != null || fiatCurrency == bestRateQuote? .fiatCurrency) {
255+ await calculateBestRate ();
256+ }
254257 }
255258 }
256259
@@ -308,7 +311,7 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
308311 }).toList ();
309312
310313 final updatedQuoteOptions = List <SelectableItem >.from ([
311- OptionTitle (title: 'Recommended' ),
314+ if (sortedRecommendedQuotes.isNotEmpty) OptionTitle (title: 'Recommended' ),
312315 ...sortedRecommendedQuotes,
313316 if (sortedQuotes.isNotEmpty) OptionTitle (title: 'All Providers' ),
314317 ...sortedQuotes,
@@ -352,13 +355,20 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
352355 Future <void > _getAvailablePaymentTypes () async {
353356 paymentMethodState = PaymentMethodLoading ();
354357 selectedPaymentMethod = null ;
355- final result = await Future .wait (providerList.map ((element) => element
358+ final resultNative = await Future .wait (providerList.map ((element) => element
356359 .getAvailablePaymentTypes (fiatCurrency.title, cryptoCurrency, isBuyAction)
357360 .timeout (
358361 Duration (seconds: 10 ),
359362 onTimeout: () => [],
360363 )));
361-
364+
365+ final resultSepa = await Future .wait (providerList.map ((element) => element
366+ .getAvailablePaymentTypes (FiatCurrency .eur.title, cryptoCurrency, isBuyAction)
367+ .timeout (
368+ Duration (seconds: 10 ),
369+ onTimeout: () => [],
370+ )));
371+ final result = [...resultNative, ...resultSepa];
362372 final Map <PaymentType , PaymentMethod > uniquePaymentMethods = {};
363373 for (var methods in result) {
364374 for (var method in methods) {
@@ -376,12 +386,26 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
376386 paymentMethodState = PaymentMethodFailed ();
377387 }
378388 }
389+ static const currenciesWithSepa = [
390+ // 'ALL', // Albanian lek
391+ FiatCurrency .bgn, // Bulgarian lev
392+ FiatCurrency .czk, // Czech koruna
393+ FiatCurrency .dkk, // Danish krone
394+ FiatCurrency .huf, // Hungarian forint
395+ FiatCurrency .isk, // Icelandic króna
396+ FiatCurrency .chf, // Liechtenstein/Swiss franc
397+ FiatCurrency .nok, // Norwegian krone
398+ FiatCurrency .pln, // Polish złoty
399+ FiatCurrency .ron, // Romanian leu
400+ FiatCurrency .sek, // Swedish krona
401+ FiatCurrency .gbp, // British pound sterling
402+ ];
379403
380404 @action
381405 Future <void > calculateBestRate () async {
382406 buySellQuotState = BuySellQuotLoading ();
383407
384- final List <BuyProvider > validProviders = providerList.where ((provider) {
408+ final List <BuyProvider > validProvidersNative = providerList.where ((provider) {
385409 if (isBuyAction) {
386410 return provider.supportedCryptoList.any ((pair) =>
387411 pair.from == cryptoCurrency && pair.to == fiatCurrency);
@@ -391,12 +415,25 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
391415 }
392416 }).toList ();
393417
394- if (validProviders.isEmpty) {
418+ final List <BuyProvider > validProvidersSepa = providerList.where ((provider) {
419+ if (currenciesWithSepa.contains (fiatCurrency)) {
420+ if (isBuyAction) {
421+ return provider.supportedCryptoList.any ((pair) =>
422+ pair.from == cryptoCurrency && pair.to == FiatCurrency .eur);
423+ } else {
424+ return provider.supportedFiatList.any ((pair) =>
425+ pair.from == FiatCurrency .eur && pair.to == cryptoCurrency);
426+ }
427+ }
428+ return false ;
429+ }).toList ();
430+
431+ if (validProvidersNative.isEmpty && validProvidersSepa.isEmpty) {
395432 buySellQuotState = BuySellQuotFailed ();
396433 return ;
397434 }
398435
399- final result = await Future .wait <List <Quote >?>(validProviders .map ((element) => element
436+ final result = await Future .wait <List <Quote >?>(validProvidersNative .map ((element) => element
400437 .fetchQuote (
401438 cryptoCurrency: cryptoCurrency,
402439 fiatCurrency: fiatCurrency,
@@ -409,44 +446,67 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
409446 Duration (seconds: 10 ),
410447 onTimeout: () => null ,
411448 )));
449+ final resultSepa = await Future .wait <List <Quote >?>(validProvidersSepa.map ((element) => element
450+ .fetchQuote (
451+ cryptoCurrency: cryptoCurrency,
452+ fiatCurrency: FiatCurrency .eur,
453+ amount: amount,
454+ paymentType: selectedPaymentMethod? .paymentMethodType,
455+ isBuyAction: isBuyAction,
456+ walletAddress: wallet.walletAddresses.address,
457+ )
458+ .timeout (
459+ Duration (seconds: 10 ),
460+ onTimeout: () => null ,
461+ )));
412462
413463 sortedRecommendedQuotes.clear ();
414464 sortedQuotes.clear ();
415465
416- final validQuotes = result
466+ final validQuotesNative = result
417467 .where ((element) => element != null && element.isNotEmpty)
418468 .expand ((element) => element! )
419469 .toList ();
420470
421- if (validQuotes.isEmpty) {
471+ final validQuotesSepa = resultSepa
472+ .where ((element) => element != null && element.isNotEmpty)
473+ .expand ((element) => element! )
474+ .toList ();
475+
476+ if (validQuotesNative.isEmpty && validQuotesSepa.isEmpty) {
422477 buySellQuotState = BuySellQuotFailed ();
423478 return ;
424479 }
425480
426- validQuotes.sort ((a, b) => a.rate.compareTo (b.rate));
481+ validQuotesNative.sort ((a, b) => a.rate.compareTo (b.rate));
482+ validQuotesSepa.sort ((a, b) => a.rate.compareTo (b.rate));
427483
428484 final Set <String > addedProviders = {};
429- final List <Quote > uniqueProviderQuotes = validQuotes.where ((element) {
485+
486+ final List <Quote > uniqueProviderQuotesNative = validQuotesNative.where ((element) {
430487 if (addedProviders.contains (element.provider.title)) return false ;
431488 addedProviders.add (element.provider.title);
432489 return true ;
433490 }).toList ();
434491
435- final List <Quote > successRateQuotes = validQuotes.where ((element) =>
492+
493+ final List <Quote > successRateQuotes = [...validQuotesNative, ...validQuotesSepa].where ((element) =>
436494 element.provider is OnRamperBuyProvider &&
437495 element.recommendations.contains (ProviderRecommendation .successRate)
438496 ).toList ();
439497
498+ final List <Quote > uniqueProviderQuotes = [];
499+
440500 for (final quote in successRateQuotes) {
441- if (! uniqueProviderQuotes .contains (quote)) {
501+ if (! uniqueProviderQuotesNative .contains (quote)) {
442502 uniqueProviderQuotes.add (quote);
443503 }
444504 }
445505
446506 sortedRecommendedQuotes.addAll (uniqueProviderQuotes);
447507
448508 sortedQuotes = ObservableList .of (
449- validQuotes .where ((element) => ! uniqueProviderQuotes.contains (element)).toList ());
509+ [...validQuotesNative, ...validQuotesSepa] .where ((element) => ! uniqueProviderQuotes.contains (element)).toList ());
450510
451511 if (sortedRecommendedQuotes.isNotEmpty) {
452512 sortedRecommendedQuotes.first
0 commit comments