From 521d7294a7ad47eb5b443f4cb74faad4e7cd9362 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Wed, 7 Oct 2020 08:58:22 +0300 Subject: [PATCH 1/3] CAKE-92 | fixed templates saving bug on send and exchange pages; added comma for keyboard on templates pages; added fiat amount controller to send page; added crypto amount and fiat amount controllers to send template pages; added send template store to send view model; added updateTemplate(), addTemplate(), removeTemplate() to send view model and exchange view model; fixed remove template alert on send and exchange pages --- lib/di.dart | 10 +- lib/src/screens/exchange/exchange_page.dart | 17 ++- .../exchange/exchange_template_page.dart | 5 +- lib/src/screens/send/send_page.dart | 100 ++++++++++-------- lib/src/screens/send/send_template_page.dart | 32 ++++-- .../exchange/exchange_view_model.dart | 26 ++++- lib/view_model/send/send_view_model.dart | 22 +++- 7 files changed, 136 insertions(+), 76 deletions(-) diff --git a/lib/di.dart b/lib/di.dart index aac1bfa24..f038a5d02 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -222,10 +222,10 @@ Future setup( addressEditOrCreateViewModel: getIt.get(param1: item))); - // getIt.get() getIt.registerFactory(() => SendViewModel( getIt.get().wallet, getIt.get().settingsStore, + getIt.get(), getIt.get())); getIt.registerFactory( @@ -318,10 +318,10 @@ Future setup( () => NodeCreateOrEditPage(getIt.get())); getIt.registerFactory(() => ExchangeViewModel( - wallet: getIt.get().wallet, - exchangeTemplateStore: getIt.get(), - trades: tradesSource, - tradesStore: getIt.get())); + getIt.get().wallet, + tradesSource, + getIt.get(), + getIt.get())); getIt.registerFactory(() => ExchangeTradeViewModel( wallet: getIt.get().wallet, diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index ab154a98d..bf587776f 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -307,8 +307,7 @@ class ExchangePage extends BasePage { ), Observer(builder: (_) { final templates = exchangeViewModel.templates; - final itemCount = - exchangeViewModel.templates.length; + final itemCount = templates.length; return ListView.builder( scrollDirection: Axis.horizontal, @@ -338,24 +337,22 @@ class ExchangePage extends BasePage { alertContent: S .of(context) .confirm_delete_template, - leftButtonText: - S.of(context).delete, rightButtonText: + S.of(context).delete, + leftButtonText: S.of(context).cancel, - actionLeftButton: () { + actionRightButton: () { Navigator.of( dialogContext) .pop(); exchangeViewModel - .exchangeTemplateStore - .remove( + .removeTemplate( template: template); exchangeViewModel - .exchangeTemplateStore - .update(); + .updateTemplate(); }, - actionRightButton: () => + actionLeftButton: () => Navigator.of( dialogContext) .pop()); diff --git a/lib/src/screens/exchange/exchange_template_page.dart b/lib/src/screens/exchange/exchange_template_page.dart index 85ea1f280..c68efc473 100644 --- a/lib/src/screens/exchange/exchange_template_page.dart +++ b/lib/src/screens/exchange/exchange_template_page.dart @@ -134,6 +134,7 @@ class ExchangeTemplatePage extends BasePage { initialIsAddressEditable: exchangeViewModel .isDepositAddressEnabled, isAmountEstimated: false, + hasRefundAddress: true, currencies: CryptoCurrency.all, onCurrencySelected: (currency) => exchangeViewModel.changeDepositCurrency( @@ -220,7 +221,7 @@ class ExchangeTemplatePage extends BasePage { PrimaryButton( onPressed: () { if (_formKey.currentState.validate()) { - exchangeViewModel.exchangeTemplateStore.addTemplate( + exchangeViewModel.addTemplate( amount: exchangeViewModel.depositAmount, depositCurrency: exchangeViewModel.depositCurrency.toString(), @@ -229,7 +230,7 @@ class ExchangeTemplatePage extends BasePage { provider: exchangeViewModel.provider.toString(), depositAddress: exchangeViewModel.depositAddress, receiveAddress: exchangeViewModel.receiveAddress); - exchangeViewModel.exchangeTemplateStore.update(); + exchangeViewModel.updateTemplate(); Navigator.of(context).pop(); } }, diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index cc0a9d0ba..811d940dd 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -1,7 +1,9 @@ import 'dart:ui'; import 'package:cake_wallet/entities/transaction_priority.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; import 'package:cake_wallet/src/widgets/picker.dart'; +import 'package:cake_wallet/src/widgets/template_tile.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -416,53 +418,53 @@ class SendPage extends BasePage { )), ), ), - // Observer( - // builder: (_) { - // final templates = sendViewModel.templates; - // final itemCount = templates.length; + Observer( + builder: (_) { + final templates = sendViewModel.templates; + final itemCount = templates.length; - // return ListView.builder( - // scrollDirection: Axis.horizontal, - // shrinkWrap: true, - // physics: NeverScrollableScrollPhysics(), - // itemCount: itemCount, - // itemBuilder: (context, index) { - // final template = templates[index]; + return ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: itemCount, + itemBuilder: (context, index) { + final template = templates[index]; - // return TemplateTile( - // key: UniqueKey(), - // to: template.name, - // amount: template.amount, - // from: template.cryptoCurrency, - // onTap: () { - // _addressController.text = template.address; - // _cryptoAmountController.text = template.amount; - // getOpenaliasRecord(context); - // }, - // onRemove: () { - // showPopUp( - // context: context, - // builder: (dialogContext) { - // return AlertWithTwoActions( - // alertTitle: S.of(context).template, - // alertContent: S.of(context).confirm_delete_template, - // leftButtonText: S.of(context).delete, - // rightButtonText: S.of(context).cancel, - // actionLeftButton: () { - // Navigator.of(dialogContext).pop(); - // sendViewModel.sendTemplateStore.remove(template: template); - // sendViewModel.sendTemplateStore.update(); - // }, - // actionRightButton: () => Navigator.of(dialogContext).pop() - // ); - // } - // ); - // }, - // ); - // } - // ); - // } - // ) + return TemplateTile( + key: UniqueKey(), + to: template.name, + amount: template.amount, + from: template.cryptoCurrency, + onTap: () { + _addressController.text = template.address; + _cryptoAmountController.text = template.amount; + getOpenaliasRecord(context); + }, + onRemove: () { + showPopUp( + context: context, + builder: (dialogContext) { + return AlertWithTwoActions( + alertTitle: S.of(context).template, + alertContent: S.of(context).confirm_delete_template, + rightButtonText: S.of(context).delete, + leftButtonText: S.of(context).cancel, + actionRightButton: () { + Navigator.of(dialogContext).pop(); + sendViewModel.removeTemplate(template: template); + sendViewModel.updateTemplate(); + }, + actionLeftButton: () => Navigator.of(dialogContext).pop() + ); + } + ); + }, + ); + } + ); + } + ) ], ), ), @@ -507,6 +509,14 @@ class SendPage extends BasePage { } }); + _fiatAmountController.addListener(() { + final amount = _fiatAmountController.text; + + if (amount != sendViewModel.fiatAmount) { + sendViewModel.setFiatAmount(amount); + } + }); + reaction((_) => sendViewModel.sendAll, (bool all) { if (all) { _cryptoAmountController.text = S.current.all; diff --git a/lib/src/screens/send/send_template_page.dart b/lib/src/screens/send/send_template_page.dart index fcda9b7af..37708fcb2 100644 --- a/lib/src/screens/send/send_template_page.dart +++ b/lib/src/screens/send/send_template_page.dart @@ -134,7 +134,7 @@ class SendTemplatePage extends BasePage { signed: false, decimal: true), inputFormatters: [ BlacklistingTextInputFormatter( - RegExp('[\\-|\\ |\\,]')) + RegExp('[\\-|\\ ]')) ], prefixIcon: Padding( padding: EdgeInsets.only(top: 9), @@ -172,7 +172,7 @@ class SendTemplatePage extends BasePage { signed: false, decimal: true), inputFormatters: [ BlacklistingTextInputFormatter( - RegExp('[\\-|\\ |\\,]')) + RegExp('[\\-|\\ ]')) ], prefixIcon: Padding( padding: EdgeInsets.only(top: 9), @@ -210,12 +210,12 @@ class SendTemplatePage extends BasePage { bottomSection: PrimaryButton( onPressed: () { if (_formKey.currentState.validate()) { - // sendViewModel.sendTemplateStore.addTemplate( - // name: _nameController.text, - // address: _addressController.text, - // cryptoCurrency: sendViewModel.currency.title, - // amount: _cryptoAmountController.text); - // sendViewModel.sendTemplateStore.update(); + sendViewModel.addTemplate( + name: _nameController.text, + address: _addressController.text, + cryptoCurrency: sendViewModel.currency.title, + amount: _cryptoAmountController.text); + sendViewModel.updateTemplate(); Navigator.of(context).pop(); } }, @@ -249,6 +249,22 @@ class SendTemplatePage extends BasePage { } }); + _cryptoAmountController.addListener(() { + final amount = _cryptoAmountController.text; + + if (amount != sendViewModel.cryptoAmount) { + sendViewModel.setCryptoAmount(amount); + } + }); + + _fiatAmountController.addListener(() { + final amount = _fiatAmountController.text; + + if (amount != sendViewModel.fiatAmount) { + sendViewModel.setFiatAmount(amount); + } + }); + _addressController.addListener(() { final address = _addressController.text; diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index caca84b83..b6efa310f 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -27,10 +27,10 @@ class ExchangeViewModel = ExchangeViewModelBase with _$ExchangeViewModel; abstract class ExchangeViewModelBase with Store { ExchangeViewModelBase( - {this.wallet, + this.wallet, this.trades, - this.exchangeTemplateStore, - this.tradesStore}) { + this._exchangeTemplateStore, + this.tradesStore) { providerList = [ XMRTOExchangeProvider(), ChangeNowExchangeProvider(), @@ -54,7 +54,7 @@ abstract class ExchangeViewModelBase with Store { final WalletBase wallet; final Box trades; - final ExchangeTemplateStore exchangeTemplateStore; + final ExchangeTemplateStore _exchangeTemplateStore; final TradesStore tradesStore; @observable @@ -101,7 +101,7 @@ abstract class ExchangeViewModelBase with Store { @computed ObservableList get templates => - exchangeTemplateStore.templates; + _exchangeTemplateStore.templates; @action void changeProvider({ExchangeProvider provider}) { @@ -267,6 +267,22 @@ abstract class ExchangeViewModelBase with Store { _onPairChange(); } + void updateTemplate() => _exchangeTemplateStore.update(); + + void addTemplate({String amount, String depositCurrency, String receiveCurrency, + String provider, String depositAddress, String receiveAddress}) => + _exchangeTemplateStore.addTemplate( + amount: amount, + depositCurrency: depositCurrency, + receiveCurrency: receiveCurrency, + provider: provider, + depositAddress: depositAddress, + receiveAddress: receiveAddress + ); + + void removeTemplate({ExchangeTemplate template}) => + _exchangeTemplateStore.remove(template: template); + List providersForCurrentPair() { return _providersForPair(from: depositCurrency, to: receiveCurrency); } diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index eb4ec2f4a..3cdcc7bb2 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -1,4 +1,6 @@ import 'package:cake_wallet/entities/openalias_record.dart'; +import 'package:cake_wallet/entities/template.dart'; +import 'package:cake_wallet/store/templates/send_template_store.dart'; import 'package:intl/intl.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/core/template_validator.dart'; @@ -29,7 +31,8 @@ class SendViewModel = SendViewModelBase with _$SendViewModel; abstract class SendViewModelBase with Store { SendViewModelBase( - this._wallet, this._settingsStore, this._fiatConversationStore) + this._wallet, this._settingsStore, this._sendTemplateStore, + this._fiatConversationStore) : state = InitialExecutionState(), _cryptoNumberFormat = NumberFormat(), sendAll = false { @@ -88,8 +91,12 @@ abstract class SendViewModelBase with Store { @computed bool get isReadyForSend => _wallet.syncStatus is SyncedSyncStatus; + @computed + ObservableList