From 2457c69faeb4dc0d6c8d42f09f42796c1bc3e69a Mon Sep 17 00:00:00 2001 From: Serhii Date: Sat, 4 Jan 2025 20:01:33 +0200 Subject: [PATCH 1/3] update amount in UI when best rate changes --- lib/src/screens/exchange/exchange_page.dart | 8 +++++++ .../exchange/exchange_view_model.dart | 21 ++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 2f8e3eb5ce..81a792a34c 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -476,6 +476,14 @@ class ExchangePage extends BasePage { } }); + reaction((_) => exchangeViewModel.bestRate, (double rate) { + if (exchangeViewModel.isFixedRateMode) { + exchangeViewModel.changeReceiveAmount(amount: receiveAmountController.text); + } else { + exchangeViewModel.changeDepositAmount(amount: depositAmountController.text); + } + }); + depositAddressController .addListener(() => exchangeViewModel.depositAddress = depositAddressController.text); diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 63e1db6bca..ff9b5a2351 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -144,7 +144,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with loadLimits(); reaction((_) => isFixedRateMode, (Object _) { loadLimits(); - _bestRate = 0; + bestRate = 0; _calculateBestRate(); }); @@ -334,7 +334,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with final ContactListViewModel contactListViewModel; - double _bestRate = 0.0; + @observable + double bestRate = 0.0; late Timer bestRateSync; @@ -366,7 +367,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with final _enteredAmount = double.tryParse(amount.replaceAll(',', '.')) ?? 0; - if (_bestRate == 0) { + if (bestRate == 0) { depositAmount = S.current.fetching; await _calculateBestRate(); @@ -374,7 +375,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with _cryptoNumberFormat.maximumFractionDigits = depositMaxDigits; depositAmount = _cryptoNumberFormat - .format(_enteredAmount / _bestRate) + .format(_enteredAmount / bestRate) .toString() .replaceAll(RegExp('\\,'), ''); } @@ -392,7 +393,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with final _enteredAmount = double.tryParse(amount.replaceAll(',', '.')) ?? 0; /// in case the best rate was not calculated yet - if (_bestRate == 0) { + if (bestRate == 0) { receiveAmount = S.current.fetching; await _calculateBestRate(); @@ -400,7 +401,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with _cryptoNumberFormat.maximumFractionDigits = receiveMaxDigits; receiveAmount = _cryptoNumberFormat - .format(_bestRate * _enteredAmount) + .format(bestRate * _enteredAmount) .toString() .replaceAll(RegExp('\\,'), ''); } @@ -453,7 +454,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with } } } - if (_sortedAvailableProviders.isNotEmpty) _bestRate = _sortedAvailableProviders.keys.first; + if (_sortedAvailableProviders.isNotEmpty) bestRate = _sortedAvailableProviders.keys.first; } @action @@ -533,7 +534,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with if (!(await provider.checkIsAvailable())) continue; - _bestRate = providerRate; + bestRate = providerRate; await changeDepositAmount(amount: depositAmount); final request = TradeRequest( @@ -693,7 +694,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with receiveAmount = ''; loadLimits(); _setAvailableProviders(); - _bestRate = 0; + bestRate = 0; _calculateBestRate(); } @@ -785,7 +786,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with isFixedRateMode = false; _defineIsReceiveAmountEditable(); loadLimits(); - _bestRate = 0; + bestRate = 0; _calculateBestRate(); final Map exchangeProvidersSelection = From 3d39b02773cb014873716b8b0f07b5183cf5c6cc Mon Sep 17 00:00:00 2001 From: Serhii Date: Sat, 4 Jan 2025 20:17:15 +0200 Subject: [PATCH 2/3] minor fixes --- lib/exchange/provider/letsexchange_exchange_provider.dart | 3 ++- lib/exchange/provider/sideshift_exchange_provider.dart | 3 ++- lib/exchange/provider/trocador_exchange_provider.dart | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/exchange/provider/letsexchange_exchange_provider.dart b/lib/exchange/provider/letsexchange_exchange_provider.dart index 95520d5f0a..599f88a173 100644 --- a/lib/exchange/provider/letsexchange_exchange_provider.dart +++ b/lib/exchange/provider/letsexchange_exchange_provider.dart @@ -11,6 +11,7 @@ import 'package:cake_wallet/exchange/trade_request.dart'; import 'package:cake_wallet/exchange/trade_state.dart'; import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:http/http.dart' as http; class LetsExchangeExchangeProvider extends ExchangeProvider { @@ -101,7 +102,7 @@ class LetsExchangeExchangeProvider extends ExchangeProvider { return isFixedRateMode ? amount / amountToGet : amountToGet / amount; } catch (e) { - log(e.toString()); + printV(e.toString()); return 0.0; } } diff --git a/lib/exchange/provider/sideshift_exchange_provider.dart b/lib/exchange/provider/sideshift_exchange_provider.dart index 7373d5f2d1..12ec591000 100644 --- a/lib/exchange/provider/sideshift_exchange_provider.dart +++ b/lib/exchange/provider/sideshift_exchange_provider.dart @@ -12,6 +12,7 @@ import 'package:cake_wallet/exchange/trade_request.dart'; import 'package:cake_wallet/exchange/trade_state.dart'; import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:http/http.dart'; class SideShiftExchangeProvider extends ExchangeProvider { @@ -152,7 +153,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { return double.parse(responseJSON['rate'] as String); } catch (e) { - log('Error fetching rate in SideShift Provider: ${e.toString()}'); + printV(e.toString()); return 0.00; } } diff --git a/lib/exchange/provider/trocador_exchange_provider.dart b/lib/exchange/provider/trocador_exchange_provider.dart index 151ded371c..f49fc6e053 100644 --- a/lib/exchange/provider/trocador_exchange_provider.dart +++ b/lib/exchange/provider/trocador_exchange_provider.dart @@ -138,6 +138,9 @@ class TrocadorExchangeProvider extends ExchangeProvider { final response = await get(uri, headers: {'API-Key': apiKey}); final responseJSON = json.decode(response.body) as Map; + + if (responseJSON['error'] != null) throw Exception(responseJSON['error']); + final fromAmount = double.parse(responseJSON['amount_from'].toString()); final toAmount = double.parse(responseJSON['amount_to'].toString()); final rateId = responseJSON['trade_id'] as String? ?? ''; From 9c3ab30e00f9463d6eef18ccde6d28198986b01d Mon Sep 17 00:00:00 2001 From: Serhii Date: Tue, 21 Jan 2025 16:13:49 +0200 Subject: [PATCH 3/3] update rate when amount has changed --- lib/src/screens/exchange/exchange_page.dart | 2 ++ .../exchange/exchange_view_model.dart | 17 ++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 81a792a34c..01c2a80c0a 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -499,6 +499,7 @@ class ExchangePage extends BasePage { : Debounce(Duration(milliseconds: 500)); _depositAmountDebounce.run(() { + exchangeViewModel.calculateBestRate(); exchangeViewModel.changeDepositAmount(amount: depositAmountController.text); exchangeViewModel.isReceiveAmountEntered = false; }); @@ -511,6 +512,7 @@ class ExchangePage extends BasePage { receiveAmountController.addListener(() { if (receiveAmountController.text != exchangeViewModel.receiveAmount) { _receiveAmountDebounce.run(() { + exchangeViewModel.calculateBestRate(); exchangeViewModel.changeReceiveAmount(amount: receiveAmountController.text); exchangeViewModel.isReceiveAmountEntered = true; }); diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index ff9b5a2351..86c4349909 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -115,9 +115,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with .toList()); _setAvailableProviders(); - _calculateBestRate(); + calculateBestRate(); - bestRateSync = Timer.periodic(Duration(seconds: 10), (timer) => _calculateBestRate()); + bestRateSync = Timer.periodic(Duration(seconds: 10), (timer) => calculateBestRate()); isDepositAddressEnabled = !(depositCurrency == wallet.currency); depositAmount = ''; @@ -145,7 +145,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with reaction((_) => isFixedRateMode, (Object _) { loadLimits(); bestRate = 0; - _calculateBestRate(); + calculateBestRate(); }); if (isElectrumWallet) { @@ -370,7 +370,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with if (bestRate == 0) { depositAmount = S.current.fetching; - await _calculateBestRate(); + await calculateBestRate(); } _cryptoNumberFormat.maximumFractionDigits = depositMaxDigits; @@ -396,7 +396,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with if (bestRate == 0) { receiveAmount = S.current.fetching; - await _calculateBestRate(); + await calculateBestRate(); } _cryptoNumberFormat.maximumFractionDigits = receiveMaxDigits; @@ -417,8 +417,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with return true; } - - Future _calculateBestRate() async { + Future calculateBestRate() async { final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount) ?? 1; final _providers = _tradeAvailableProviders @@ -695,7 +694,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with loadLimits(); _setAvailableProviders(); bestRate = 0; - _calculateBestRate(); + calculateBestRate(); } void _initialPairBasedOnWallet() { @@ -787,7 +786,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with _defineIsReceiveAmountEditable(); loadLimits(); bestRate = 0; - _calculateBestRate(); + calculateBestRate(); final Map exchangeProvidersSelection = json.decode(sharedPreferences.getString(PreferencesKey.exchangeProvidersSelection) ?? "{}")