Skip to content

Commit a8ff1e8

Browse files
committed
ui: show EUR offers for SEPA currencies on onramping screen
1 parent 4942072 commit a8ff1e8

File tree

1 file changed

+78
-18
lines changed

1 file changed

+78
-18
lines changed

lib/view_model/buy/buy_sell_view_model.dart

Lines changed: 78 additions & 18 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
}
@@ -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

Comments
 (0)