diff --git a/lib/entities/fiat_currency.dart b/lib/entities/fiat_currency.dart index 1e5c61e1e..36a3c44a1 100644 --- a/lib/entities/fiat_currency.dart +++ b/lib/entities/fiat_currency.dart @@ -8,6 +8,9 @@ class FiatCurrency extends EnumerableItem with Serializable { static List get all => _all.values.toList(); + static List get currenciesAvailableToBuyWith => + [aud, brl, cad, chf, czk, eur, dkk, gbp, hkd, ils, jpy, krw, mxn, myr, nok, nzd, pln, sek, sgd, thb, usd, zar]; + static const aud = FiatCurrency(symbol: 'AUD', countryCode: "aus", fullName: "Australian Dollar"); static const bgn = FiatCurrency(symbol: 'BGN', countryCode: "bgr", fullName: "Bulgarian Lev"); static const brl = FiatCurrency(symbol: 'BRL', countryCode: "bra", fullName: "Brazilian Real"); diff --git a/lib/src/screens/buy/pre_order_page.dart b/lib/src/screens/buy/pre_order_page.dart index 3f403bf85..38fe4a813 100644 --- a/lib/src/screens/buy/pre_order_page.dart +++ b/lib/src/screens/buy/pre_order_page.dart @@ -2,6 +2,8 @@ import 'dart:ui'; import 'package:cake_wallet/buy/buy_amount.dart'; import 'package:cake_wallet/buy/buy_provider.dart'; import 'package:cake_wallet/buy/moonpay/moonpay_buy_provider.dart'; +import 'package:cake_wallet/entities/fiat_currency.dart'; +import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/src/screens/buy/widgets/buy_list_item.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; @@ -27,7 +29,6 @@ class PreOrderPage extends BasePage { PreOrderPage({@required this.buyViewModel}) : _amountFocus = FocusNode(), _amountController = TextEditingController() { - _amountController.addListener(() { final amount = _amountController.text; @@ -110,52 +111,70 @@ class PreOrderPage extends BasePage { .decorationColor, ], begin: Alignment.topLeft, end: Alignment.bottomRight), ), - child: Padding( - padding: EdgeInsets.only(top: 100, bottom: 65), - child: Center( - child: Container( - width: 210, - child: BaseTextFormField( - focusNode: _amountFocus, - controller: _amountController, - keyboardType: - TextInputType.numberWithOptions( - signed: false, decimal: true), - inputFormatters: [ - FilteringTextInputFormatter - .allow(RegExp(_amountPattern)) - ], - prefixIcon: Padding( - padding: EdgeInsets.only(top: 2), - child: - Text(buyViewModel.fiatCurrency.title + ': ', - style: TextStyle( - fontSize: 36, - fontWeight: FontWeight.w600, - color: Colors.white, - )), - ), - hintText: '0.00', - borderColor: Theme.of(context) - .primaryTextTheme - .body2 - .decorationColor, - borderWidth: 0.5, - textStyle: TextStyle( + child: Padding( + padding: EdgeInsets.only(top: 100, bottom: 65), + child: Center( + child: Container( + width: 210, + child: BaseTextFormField( + focusNode: _amountFocus, + controller: _amountController, + keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true), + inputFormatters: [FilteringTextInputFormatter.allow(RegExp(_amountPattern))], + prefixIcon: GestureDetector( + onTap: () { + showPopUp( + context: context, + builder: (_) => Picker( + hintText: S.current.search_currency, + items: FiatCurrency.currenciesAvailableToBuyWith, + selectedAtIndex: + FiatCurrency.currenciesAvailableToBuyWith.indexOf(buyViewModel.fiatCurrency), + onItemSelected: (FiatCurrency selectedCurrency) { + buyViewModel.buyAmountViewModel.fiatCurrency = selectedCurrency; + }, + images: FiatCurrency.currenciesAvailableToBuyWith + .map((e) => Image.asset("assets/images/flags/${e.countryCode}.png")) + .toList(), + isGridView: true, + matchingCriteria: (FiatCurrency currency, String searchText) { + return currency.title.toLowerCase().contains(searchText) || + currency.fullName.toLowerCase().contains(searchText); + }, + ), + ); + }, + child: Padding( + padding: EdgeInsets.only(top: 2), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.keyboard_arrow_down, color: Colors.white), + Text( + buyViewModel.fiatCurrency.title + ': ', + style: TextStyle( fontSize: 36, - fontWeight: FontWeight.w500, - color: Colors.white), - placeholderTextStyle: TextStyle( - color: Theme.of(context) - .primaryTextTheme - .headline - .decorationColor, - fontWeight: FontWeight.w500, - fontSize: 36), - ) - ) - ) - ) + fontWeight: FontWeight.w600, + color: Colors.white, + ), + ), + ], + ), + ), + ), + hintText: '0.00', + borderColor: Theme.of(context).primaryTextTheme.body2.decorationColor, + borderWidth: 0.5, + textStyle: TextStyle(fontSize: 36, fontWeight: FontWeight.w500, color: Colors.white), + placeholderTextStyle: TextStyle( + color: Theme.of(context).primaryTextTheme.headline.decorationColor, + fontWeight: FontWeight.w500, + fontSize: 36, + ), + ), + ), + ), + ), ), if (buyViewModel.isShowProviderButtons) Padding( padding: EdgeInsets.only(top: 38, bottom: 18), @@ -273,7 +292,7 @@ class PreOrderPage extends BasePage { buyViewModel.isRunning = true; final url = await buyViewModel.fetchUrl(); - + if (url.isNotEmpty) { if (buyViewModel.selectedProvider is MoonPayBuyProvider) { if (await canLaunch(url)) await launch(url); @@ -287,4 +306,4 @@ class PreOrderPage extends BasePage { buyViewModel.reset(); buyViewModel.isRunning = false; } -} \ No newline at end of file +} diff --git a/lib/view_model/buy/buy_amount_view_model.dart b/lib/view_model/buy/buy_amount_view_model.dart index e027166f9..d1913f679 100644 --- a/lib/view_model/buy/buy_amount_view_model.dart +++ b/lib/view_model/buy/buy_amount_view_model.dart @@ -1,3 +1,5 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; @@ -6,12 +8,24 @@ part 'buy_amount_view_model.g.dart'; class BuyAmountViewModel = BuyAmountViewModelBase with _$BuyAmountViewModel; abstract class BuyAmountViewModelBase with Store { - BuyAmountViewModelBase() : amount = ''; + BuyAmountViewModelBase() { + amount = ''; + + int selectedIndex = FiatCurrency.currenciesAvailableToBuyWith + .indexOf(getIt.get().fiatCurrency); + + if (selectedIndex == -1) { + selectedIndex = FiatCurrency.currenciesAvailableToBuyWith + .indexOf(FiatCurrency.usd); + } + fiatCurrency = FiatCurrency.currenciesAvailableToBuyWith[selectedIndex]; + } @observable String amount; - FiatCurrency get fiatCurrency => FiatCurrency.usd; + @observable + FiatCurrency fiatCurrency; @computed double get doubleAmount { @@ -25,4 +39,4 @@ abstract class BuyAmountViewModelBase with Store { return _amount; } -} \ No newline at end of file +} diff --git a/lib/view_model/buy/buy_view_model.dart b/lib/view_model/buy/buy_view_model.dart index b7b74d7ff..e484b819c 100644 --- a/lib/view_model/buy/buy_view_model.dart +++ b/lib/view_model/buy/buy_view_model.dart @@ -54,6 +54,7 @@ abstract class BuyViewModelBase with Store { double get doubleAmount => buyAmountViewModel.doubleAmount; + @computed FiatCurrency get fiatCurrency => buyAmountViewModel.fiatCurrency; CryptoCurrency get cryptoCurrency => walletTypeToCryptoCurrency(type); diff --git a/lib/view_model/settings/settings_view_model.dart b/lib/view_model/settings/settings_view_model.dart index 67cf35635..d335c8688 100644 --- a/lib/view_model/settings/settings_view_model.dart +++ b/lib/view_model/settings/settings_view_model.dart @@ -1,4 +1,3 @@ -import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/entities/language_service.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; @@ -172,9 +171,9 @@ abstract class SettingsViewModelBase with Store { displayItem: (dynamic code) { return LanguageService.list[code]; }, - selectedItem: () => getIt.get().languageCode, + selectedItem: () => _settingsStore.languageCode, onItemSelected: (String code) { - getIt.get().languageCode = code; + _settingsStore.languageCode = code; }, images: LanguageService.list.keys.map( (e) => Image.asset("assets/images/flags/${LanguageService.localeCountryCode[e]}.png"))