From 3a8bae74e4d3f8146829a5a2710859053ae1bb8e Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Wed, 20 May 2020 20:28:01 +0300 Subject: [PATCH] CWA-215 | added cryptocurrency icons to address book; applied new design to contact page; added suffixIcon parameter to base text form field; fixed seed widget --- assets/images/ada.png | Bin 0 -> 1653 bytes assets/images/bch.png | Bin 0 -> 1653 bytes assets/images/bnb.png | Bin 0 -> 1440 bytes assets/images/dash.png | Bin 0 -> 1259 bytes assets/images/eos.png | Bin 0 -> 1367 bytes assets/images/eth.png | Bin 0 -> 1710 bytes assets/images/nano.png | Bin 0 -> 1460 bytes assets/images/trx.png | Bin 0 -> 1387 bytes assets/images/usdt.png | Bin 0 -> 1514 bytes assets/images/xlm.png | Bin 0 -> 1200 bytes assets/images/xrp.png | Bin 0 -> 1189 bytes .../address_book/address_book_page.dart | 22 +- .../screens/address_book/contact_page.dart | 350 +++++++++--------- .../address_book/address_book_store.dart | 9 + lib/src/widgets/base_text_form_field.dart | 3 + lib/src/widgets/seed_widget.dart | 100 ++--- 16 files changed, 243 insertions(+), 241 deletions(-) create mode 100644 assets/images/ada.png create mode 100644 assets/images/bch.png create mode 100644 assets/images/bnb.png create mode 100644 assets/images/dash.png create mode 100644 assets/images/eos.png create mode 100644 assets/images/eth.png create mode 100644 assets/images/nano.png create mode 100644 assets/images/trx.png create mode 100644 assets/images/usdt.png create mode 100644 assets/images/xlm.png create mode 100644 assets/images/xrp.png diff --git a/assets/images/ada.png b/assets/images/ada.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfc1615ced429e75f6f8157a9251bdfc6ddfbee GIT binary patch literal 1653 zcmV-*28#KKP)LJfy*nm zthu$MMUT-LmF>Tc%Wt{LoLq4n0LNZ&iymW8gIb2$c6pVx?9suQUbR<>E~LPiA_|Nx zW+(yJ+7sDcbP-8Wh2%`F+>4%D9mK1&d8g#CjOwjYQ~@^#Vn#vCP((oN3GiC>qds~$}Da9ygq`NZ~=`vDXhS5jy1uE$=a84o>Mr`8Z(N);UjHt2^Yw68XVS9)P}nl3Dx zO`Jy(1Y}^{X~1~0B$bOCq9w7EO!38a_S~6Gs9m2ijcPy}9#;%T> zJaCS0e*A;p`tVD!HpQ@8?am~RPH1!iG(37j2VU?Lrw@xycW4}`q(gI9CXZTo27UU? zPn6GYE4bFh0nS9*QOEvcNaIMM(8wI>HGB&8JT(FZ&AQQ>AAA80U7@XUrjk20)#D)l;Oym6BPrhMBlPMyznvNVjPPm?Y=`DKwz0Wv5b^0`gWmHn1 z5mV`-FMmJ}dZ7VcM;l)7gg3wa&bZuP_y8!Bf#%xy^WS+ian{2WpVyQwT)05Eo@N8Q z^}*+$Y^Y=8N-3qW)9Jm%MQq9>kz9h_s;TF(Hh*g8?{gKyZhh3EdAvq0=W`phd- z(xMyZZF>%-+8%m)(g}F;0YY3!8`aiC(y#=g+LD0Cz@j-0oFgK&m_|;VMV zGDK!^jG1~b^&T>ghK-v+?!*F7k6xjLSjz*Ro&o$q-HCswEb-hBu{P9l{CDm`ns(2l zcPw8io47668fm6 z&=i#^nkC~rU;?r9-X~vDQPWPGD~(aaY8a29#GDH1J$MXBj(C#n3Dj%QXv!>Z#_}z{u6iynLCWwEZMA#~v(SzIIGDSPt^x5A_`Meb4%jwFvZuH(i9#hATPi}rxTq4191(0CL9M&=!>7YI&vO{V zQz*!pAlAsCrc>`BSff{f=R@2C4|p~9M~OE>h{j;QTM_Ic45EYx19)LoYtma|zy_#&pgA1|l9%_PIwfBHV z>!1m3cwF`GLiy!zszNMx2Lw8}fdV3OtPSj4VP8aOKnt4nU%YD#VfEJpwO0h$cl%3r z^5?@iuM4O}4|<^it!tY%{y0JyVgj^=u>q3xfWKsA;x-052}qs@*a$VKWj*823yo{t z_Nxuy&7hD!o7g*i6&3zk!$Sd*`L6)Ib(6njIR$`Y4>?v-j#{}#0gYS!ACbXFzJ-!} zJHzGECCC5|mva(o(Q^yN*Ssr$Pd#|w%xV7z^9Fhkf;$9O00000NkvXXu0mjfSv@56 literal 0 HcmV?d00001 diff --git a/assets/images/bch.png b/assets/images/bch.png new file mode 100644 index 0000000000000000000000000000000000000000..17872731feab738b290edf5c6c84da6f7f2e33eb GIT binary patch literal 1653 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 literal 0 HcmV?d00001 diff --git a/assets/images/eth.png b/assets/images/eth.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2d82a4779554ecb3e0892af0a0c5c21d1d1c2b GIT binary patch literal 1710 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 z zgs6dg+7})kuCKrTT9YSFhJZqpD_1V%$dQ8J$rV2`|Y=kP1mknV{EkC z%S$ZXNNZh)UZO;ap%@`EQWJo@bLY;QIB_D$+P{Clnm2E5G5D({SG0AZa! zf1YmOGd{}^nzk2WxL0KzNjSW~4h|hU#8vM6XU!>R!hn6DUAuNsqr^c*%)HFq!Y{&hZooZuVMT4?M0gz$KJhr#Z2+FY}rx=4;~an?Ay0bGiS~e z89xV1o-MV#k_wHR@P4);oocZeF z#fxHe*|KGmmz#Su(WZdd&hXd*0|6hR5fKrhjofF+l0_3HOwi-UkHw~|QKN=3XU;6* z=FFL+`Sa%!Lu?>E@DT043vkt(A`wR*-~&JY_@jFD>Lt5x*RGv@|NVDm%$QM#Ve8nj zqpn=J!gwq$ARn4mKrC0)CL{Ro)w`}-xw2NRS|!#z?a-k^HDbgFvBt)kfOwlWZOj&s z4qpBM=r^l4^`5BTPyftI!3 zepC{YC{dz1sZ*y`nlx!FSZULywX1<0ES~<{xpTUC^QP+5sbfBi54eUK4Ya(UW7`Xf zQl?Bf#G`Ye*p{$-lM?sk#+z8002ovPDHLkV1g5c65dA~dw=a);dUMFTJBy}u=6r!Y*BV5#v@qK1wvOx%yt^{Vw>Ovk z*yM6RFZN(BG_EFyW>IP4UeES4^5GNt_T;drNRL!6jZaq=K?7P>5<)Y(DmmY?EtR}G zGa+&bGNlR>a{wC9g68Ff(9A7~+3V4oOkVBj>JI|C}fb&uXin*zs*`iLGpb2ewTquOrzbg78 zkLDz##Rh?>=X&XCpO7b7NY-OKni2^f@KT>XHDax6eGG3%lyPrLpvY&tuR1``!}ZW$ zWKD9Ziy?UF--6Do^wd|b^>O6Z5HEw@kxzGBb%4MJYiT4+c)?RXz2B~tmQIzY$h9t( z8yK-7?ZWN?ih81*q8@JpJRYk5{r8`2^y^=LQq*IZS2Ddh4H}Z3tnE~FihQ;&vyyH> zJ2~#)VFYlgiB{oU9Yv1iC&-~}ILGPV|NbTE`R?~$$o~9MMGtVSI7QAiQA1j_B0NR_ zcuL=b&NnM;zzNM&kt&=jPb-+zkVtdevK2S*XAddXQ60`6rR?ViDdd4#lJo(_@Ps!4jI+-V{S_t-c#oyW2;-gorS#-y z?+72)^u|a`} zRQA$C0@bfP%5zwgc$yNQ>|*0QvMmfH8%AFro>G9Z&XL>iw=E7MyE74jF)B`ETNFk% zjCFpnfK^@)S>*y){a?7XYnS0q_zl`OuDq)ee zPZ{9XpUEt37n$?CvR|noXh&`N6kejI{2$0GD+S}W*NKDEV4(c@)+yN06&pw z$_}2Fdl=;yYtV)VyhKmMqh)S2T{S)0BxxI&@`=pScaOj>VXfl%`>FD|`vi)f=pmD& ztvtU|>{0GTKQy5Y57A5YXv9C4X2v@f)EXyjCXtNN>cL)UKnt4sAKs-xnBCy-w!$!c z#b<^wd{RCI1TP2lVh{F016r49u6iA}GR`;8nH*{uvGQw!$hBk;y^aiHSv+o|0?c6z zJ%$l0zP@?(q%iD-hWgqsKZI8NVvQM>36@4PZdr6&(ycq@K4=iQ@Lhu=%YOwJV-9QF zGabF+9_-bs%&#JdPQ1b!#p|>aPv11fR{?k|%( QQvd(}07*qoM6N<$g66L3vH$=8 literal 0 HcmV?d00001 diff --git a/assets/images/xlm.png b/assets/images/xlm.png new file mode 100644 index 0000000000000000000000000000000000000000..d4bf2f09678799be0aa34262109cdc2c4febbb09 GIT binary patch literal 1200 zcmV;h1W)^kP)r0!Pn-^$kXl#*^k^AP8ik zqEPKCm7=Ojm8zm@t5TAxUbPe@000Q^fU4|16*&8Uf5-I9{4>P7uf7`ho^!tQpZ}b5 zt@-%)+<^FvXR)!dO|XHjpxdCu#l_|L`}?1Z-}Dy37Cs+ML=z|aB_JT+072hF_#(!8 z649cgqiYbv9pqTro5dp{BKqLyPI64`Rq?2(C_cIS$+0z8C;#oWAXclDT3cIbY;25H zR#s?lZ;wVsMyS2Loy0UKeT+ty_n;C7h^>W3kwAF_xDp+SeWXLsi>%kJUuuzPydHzWK*hzyw7a`Y zz|ztZWn^SH*s+$uc6xDl!Onu>BtTgp;^qI?H|?Cfl518i+=Q9(h0Oh~L~YHn_(%gal;xw&!hWldd{ z-)uI2Q3*swMiNk4TkG&HJw2Tk7Z(Y@B$Skt;0n;J^2BFnX9QebT~T6UqH0TidA^1RRWornFPed#Mqvtq@>X7>?{EX2M1J9Q6ZZS%~w-XLnkLEwrT)vZEecxv8D$S zFpA9oQyDciH6aG>i;|L(XliPTfaBw1h}k;6va*s64-W~LnVF&FCF{ zz*GG3O=Z;8)n)5u0A)paQD&68w6s)~AHbNVrKQ2?E#y>+9vm^n z2OG~`Sb2I>%9)MO{Oh?14Ps~isxnGVO{Mwyc>=Ij%gV~obS}3c7SR3uz5GV-wJ6D& zatw7rlW2+;t9W{Pnt-FDBdV&Zf&(ZQkHunf2pAF)LVbOG1kBCNp?XfmSi@zrk1DDXm<@||H_cQYoKeMn6Yz-e1c3l*^$@EGr+b6MHzr^zcI*_9Vr)ywr2|b%SNZsBC91!mw8v7}d>6v3X=PU_^=@WYB zMPp+IsoQJ+gU$%0IwiW!ylw=EB57?!X?5zJufORw zAttA$KTee)j`uZE`>Ki6k6X4QAFB&S3wnOv4ORZl8lWe!ZVA$8}XcMce z1M+4CnrP#JSHV*kd=G=g?!4CQaErysAnlt4XrYNV9tE$WV4@}sc8ksRvdQKWv%OU; zj<(8hsuSpQ01dRzL>rHa{}&c6hudVaU2C*BwPrUW8wGmNKnu14qUD0 zB6`s%UVH6B)E927MMJQ0yX{67wwP{dHd;SyHd()KFTzxB`VIJx?=57B6Jsr^sm^_jd00000NkvXXu0mjf Dk48B# literal 0 HcmV?d00001 diff --git a/lib/src/screens/address_book/address_book_page.dart b/lib/src/screens/address_book/address_book_page.dart index 4a66c3092..bdcb3332d 100644 --- a/lib/src/screens/address_book/address_book_page.dart +++ b/lib/src/screens/address_book/address_book_page.dart @@ -216,43 +216,43 @@ class AddressBookPage extends BasePage { image = Image.asset('assets/images/monero.png', height: 24, width: 24); break; case CryptoCurrency.ada: - image = null; + image = Image.asset('assets/images/ada.png', height: 24, width: 24); break; case CryptoCurrency.bch: - image = null; + image = Image.asset('assets/images/bch.png', height: 24, width: 24); break; case CryptoCurrency.bnb: - image = null; + image = Image.asset('assets/images/bnb.png', height: 24, width: 24); break; case CryptoCurrency.btc: image = Image.asset('assets/images/bitcoin.png', height: 24, width: 24); break; case CryptoCurrency.dash: - image = null; + image = Image.asset('assets/images/dash.png', height: 24, width: 24); break; case CryptoCurrency.eos: - image = null; + image = Image.asset('assets/images/eos.png', height: 24, width: 24); break; case CryptoCurrency.eth: - image = null; + image = Image.asset('assets/images/eth.png', height: 24, width: 24); break; case CryptoCurrency.ltc: image = Image.asset('assets/images/litecoin.png', height: 24, width: 24); break; case CryptoCurrency.nano: - image = null; + image = Image.asset('assets/images/nano.png', height: 24, width: 24); break; case CryptoCurrency.trx: - image = null; + image = Image.asset('assets/images/trx.png', height: 24, width: 24); break; case CryptoCurrency.usdt: - image = null; + image = Image.asset('assets/images/usdt.png', height: 24, width: 24); break; case CryptoCurrency.xlm: - image = null; + image = Image.asset('assets/images/xlm.png', height: 24, width: 24); break; case CryptoCurrency.xrp: - image = null; + image = Image.asset('assets/images/xrp.png', height: 24, width: 24); break; default: image = null; diff --git a/lib/src/screens/address_book/contact_page.dart b/lib/src/screens/address_book/contact_page.dart index 7811c574c..13a9ff8cd 100644 --- a/lib/src/screens/address_book/contact_page.dart +++ b/lib/src/screens/address_book/contact_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:provider/provider.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/domain/common/crypto_currency.dart'; @@ -10,6 +11,9 @@ import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/address_text_field.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/palette.dart'; +import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; +import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker.dart'; +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; class ContactPage extends BasePage { ContactPage({this.contact}); @@ -19,6 +23,9 @@ class ContactPage extends BasePage { @override String get title => S.current.contact; + @override + Color get backgroundColor => PaletteDark.historyPanel; + @override Widget body(BuildContext context) => ContactForm(contact); } @@ -37,22 +44,31 @@ class ContactFormState extends State { final _contactNameController = TextEditingController(); final _currencyTypeController = TextEditingController(); final _addressController = TextEditingController(); + final currencies = CryptoCurrency.all; + final downArrow = Image.asset( + 'assets/images/arrow_bottom_purple_icon.png', + color: PaletteDark.walletCardText, + height: 8); - CryptoCurrency _selectectCrypto = CryptoCurrency.xmr; + CryptoCurrency _selectectCrypto; @override void initState() { super.initState(); - if (widget.contact == null) { - _currencyTypeController.text = _selectectCrypto.toString(); - } else { + if (widget.contact != null) { _selectectCrypto = widget.contact.type; _contactNameController.text = widget.contact.name; _currencyTypeController.text = _selectectCrypto.toString(); _addressController.text = widget.contact.address; + WidgetsBinding.instance.addPostFrameCallback(afterLayout); } } + void afterLayout(dynamic _) { + final addressBookStore = Provider.of(context); + addressBookStore.setDisabledStatus(false); + } + @override void dispose() { _contactNameController.dispose(); @@ -61,198 +77,164 @@ class ContactFormState extends State { super.dispose(); } - Future _setCurrencyType(BuildContext context) async { - var currencyType = CryptoCurrency.all[0].toString(); - var selectedCurrency = CryptoCurrency.all[0]; - - await showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text(S.of(context).please_select), - backgroundColor: Theme.of(context).backgroundColor, - content: Container( - height: 150.0, - child: CupertinoPicker( - backgroundColor: Theme.of(context).backgroundColor, - itemExtent: 45.0, - onSelectedItemChanged: (int index) { - selectedCurrency = CryptoCurrency.all[index]; - currencyType = CryptoCurrency.all[index].toString(); - }, - children: - List.generate(CryptoCurrency.all.length, (int index) { - return Center( - child: Text( - CryptoCurrency.all[index].toString(), - style: TextStyle( - color: Theme.of(context) - .primaryTextTheme - .caption - .color), - ), - ); - })), - ), - actions: [ - FlatButton( - onPressed: () { - Navigator.pop(context); - }, - child: Text(S.of(context).cancel)), - FlatButton( - onPressed: () { - _selectectCrypto = selectedCurrency; - _currencyTypeController.text = currencyType; - Navigator.of(context).pop(); - }, - child: Text(S.of(context).ok)) - ], - ); - }); + void onHandleControllers(AddressBookStore addressBookStore) { + if (_contactNameController.text.isNotEmpty && + _addressController.text.isNotEmpty && + _currencyTypeController.text.isNotEmpty) { + addressBookStore.setDisabledStatus(false); + } else { + addressBookStore.setDisabledStatus(true); + } } @override Widget build(BuildContext context) { final addressBookStore = Provider.of(context); - return ScrollableWithBottomSection( - content: Form( - key: _formKey, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextFormField( - style: TextStyle( - fontSize: 14.0, - color: Theme.of(context).primaryTextTheme.headline.color), - decoration: InputDecoration( - hintStyle: TextStyle(color: Theme.of(context).hintColor), - hintText: S.of(context).contact_name, - focusedBorder: UnderlineInputBorder( - borderSide: - BorderSide(color: Palette.cakeGreen, width: 2.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).focusColor, width: 1.0))), - controller: _contactNameController, - validator: (value) { - addressBookStore.validateContactName(value); - return addressBookStore.errorMessage; - }, - ), - SizedBox(height: 14.0), - Container( - child: InkWell( - onTap: () => _setCurrencyType(context), - child: IgnorePointer( - child: TextFormField( - style: TextStyle( - fontSize: 14.0, - color: Theme.of(context) - .primaryTextTheme - .headline - .color), - decoration: InputDecoration( - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Palette.cakeGreen, width: 2.0)), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).focusColor, - width: 1.0))), - controller: _currencyTypeController, + _contactNameController.addListener(() {onHandleControllers(addressBookStore);}); + _currencyTypeController.addListener(() {onHandleControllers(addressBookStore);}); + _addressController.addListener(() {onHandleControllers(addressBookStore);}); + + return Container( + color: PaletteDark.historyPanel, + child: ScrollableWithBottomSection( + contentPadding: EdgeInsets.all(24), + content: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + BaseTextFormField( + controller: _contactNameController, + hintText: S.of(context).contact_name, + borderColor: PaletteDark.walletCardSubAddressField, + validator: (value) { + addressBookStore.validateContactName(value); + return addressBookStore.errorMessage; + } + ), + Padding( + padding: EdgeInsets.only(top: 20), + child: Container( + child: InkWell( + onTap: () => _presentPicker(context), + child: IgnorePointer( + child: BaseTextFormField( + controller: _currencyTypeController, + hintText: S.of(context).settings_currency, + borderColor: PaletteDark.walletCardSubAddressField, + suffixIcon: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + downArrow + ], + ), + ) + ), ), ), ), + Padding( + padding: EdgeInsets.only(top: 20), + child: AddressTextField( + controller: _addressController, + options: [AddressTextFieldOption.qrCode], + validator: (value) { + addressBookStore.validateAddress(value, + cryptoCurrency: _selectectCrypto); + return addressBookStore.errorMessage; + }, + ), + ) + ], + ), + ), + bottomSectionPadding: EdgeInsets.only( + left: 24, + right: 24, + bottom: 24 + ), + bottomSection: Row( + children: [ + Expanded( + child: PrimaryButton( + onPressed: () { + setState(() { + _selectectCrypto = null; + _contactNameController.text = ''; + _currencyTypeController.text = ''; + _addressController.text = ''; + }); + }, + text: S.of(context).reset, + color: Colors.red, + textColor: Colors.white + ), ), - SizedBox(height: 14.0), - AddressTextField( - controller: _addressController, - options: [AddressTextFieldOption.qrCode], - validator: (value) { - addressBookStore.validateAddress(value, - cryptoCurrency: _selectectCrypto); - return addressBookStore.errorMessage; - }, + SizedBox(width: 20), + Expanded( + child: Observer( + builder: (_) => PrimaryButton( + onPressed: () async { + if (!_formKey.currentState.validate()) { + return; + } + + try { + if (widget.contact == null) { + final newContact = Contact( + name: _contactNameController.text, + address: _addressController.text, + type: _selectectCrypto); + + await addressBookStore.add(contact: newContact); + } else { + widget.contact.name = _contactNameController.text; + widget.contact.address = _addressController.text; + widget.contact + .updateCryptoCurrency(currency: _selectectCrypto); + + await addressBookStore.update( + contact: widget.contact); + } + Navigator.pop(context); + } catch (e) { + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertWithOneAction( + alertTitle: S.current.contact, + alertContent: e.toString(), + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop() + ); + }); + } + }, + text: S.of(context).save, + color: Colors.green, + textColor: Colors.white, + isDisabled: addressBookStore.isDisabledStatus, + ) + ) ) ], - ), + )), + ); + } + + void _presentPicker(BuildContext context) { + showDialog( + builder: (_) => CurrencyPicker( + selectedAtIndex: currencies.indexOf(_selectectCrypto), + items: currencies, + title: S.of(context).please_select, + onItemSelected: (CryptoCurrency item) { + _selectectCrypto = item; + _currencyTypeController.text = _selectectCrypto.toString(); + } ), - bottomSection: Row( - children: [ - Expanded( - child: PrimaryButton( - onPressed: () { - setState(() { - _selectectCrypto = CryptoCurrency.xmr; - _contactNameController.text = ''; - _currencyTypeController.text = - _selectectCrypto.toString(); - _addressController.text = ''; - }); - }, - text: S.of(context).reset, - color: - Theme.of(context).accentTextTheme.button.backgroundColor, - textColor: - Theme.of(context).primaryTextTheme.button.color), - ), - SizedBox(width: 20), - Expanded( - child: PrimaryButton( - onPressed: () async { - if (!_formKey.currentState.validate()) { - return; - } - - try { - if (widget.contact == null) { - final newContact = Contact( - name: _contactNameController.text, - address: _addressController.text, - type: _selectectCrypto); - - await addressBookStore.add(contact: newContact); - } else { - widget.contact.name = _contactNameController.text; - widget.contact.address = _addressController.text; - widget.contact - .updateCryptoCurrency(currency: _selectectCrypto); - - await addressBookStore.update( - contact: widget.contact); - } - Navigator.pop(context); - } catch (e) { - await showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text( - e.toString(), - textAlign: TextAlign.center, - ), - actions: [ - FlatButton( - onPressed: () => - Navigator.of(context).pop(), - child: Text(S.of(context).ok)) - ], - ); - }); - } - }, - text: S.of(context).save, - color: Theme.of(context) - .primaryTextTheme - .button - .backgroundColor, - textColor: Theme.of(context) - .primaryTextTheme - .button - .color)) - ], - )); + context: context); } } diff --git a/lib/src/stores/address_book/address_book_store.dart b/lib/src/stores/address_book/address_book_store.dart index 527809cbd..638d833ba 100644 --- a/lib/src/stores/address_book/address_book_store.dart +++ b/lib/src/stores/address_book/address_book_store.dart @@ -12,11 +12,15 @@ class AddressBookStore = AddressBookStoreBase with _$AddressBookStore; abstract class AddressBookStoreBase with Store { AddressBookStoreBase({@required this.contacts}) { updateContactList(); + isDisabledStatus = true; } @observable List contactList; + @observable + bool isDisabledStatus; + @observable bool isValid; @@ -37,6 +41,11 @@ abstract class AddressBookStoreBase with Store { @action Future delete({Contact contact}) async => await contact.delete(); + @action + void setDisabledStatus(bool isDisabled) { + isDisabledStatus = isDisabled; + } + void validateContactName(String value) { const pattern = '''^[^`,'"]{1,32}\$'''; final regExp = RegExp(pattern); diff --git a/lib/src/widgets/base_text_form_field.dart b/lib/src/widgets/base_text_form_field.dart index e05c3a277..6c69d16c2 100644 --- a/lib/src/widgets/base_text_form_field.dart +++ b/lib/src/widgets/base_text_form_field.dart @@ -17,6 +17,7 @@ class BaseTextFormField extends StatelessWidget { this.borderColor = PaletteDark.menuList, this.prefix, this.suffix, + this.suffixIcon, this.enabled = true, this.validator }); @@ -34,6 +35,7 @@ class BaseTextFormField extends StatelessWidget { final Color borderColor; final Widget prefix; final Widget suffix; + final Widget suffixIcon; final bool enabled; final FormFieldValidator validator; @@ -55,6 +57,7 @@ class BaseTextFormField extends StatelessWidget { decoration: InputDecoration( prefix: prefix, suffix: suffix, + suffixIcon: suffixIcon, hintStyle: TextStyle( color: hintColor, fontSize: 16 diff --git a/lib/src/widgets/seed_widget.dart b/lib/src/widgets/seed_widget.dart index 64298da6d..de4f38be7 100644 --- a/lib/src/widgets/seed_widget.dart +++ b/lib/src/widgets/seed_widget.dart @@ -13,7 +13,6 @@ import 'package:cake_wallet/src/domain/monero/mnemonics/russian.dart'; import 'package:cake_wallet/src/domain/monero/mnemonics/spanish.dart'; import 'package:cake_wallet/src/domain/common/mnemotic_item.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/src/widgets/top_panel.dart'; class SeedWidget extends StatefulWidget { SeedWidget({Key key, this.onMnemoticChange, this.onFinish, this.seedLanguage}) : super(key: key) { @@ -237,52 +236,61 @@ class SeedWidgetState extends State { Flexible( fit: FlexFit.tight, flex: 1, - child: TopPanel( - color: PaletteDark.menuList, - widget: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - S.of(context).restore_active_seed, - style: TextStyle( - fontSize: 14, - color: PaletteDark.walletCardText - ), - ), - Padding( - padding: EdgeInsets.only(top: 5), - child: Wrap( - children: items.map((item) { - final isValid = item.isCorrect(); - final isSelected = selectedItem == item; - - return InkWell( - onTap: () => onMnemoticTap(item), - child: Container( - decoration: BoxDecoration( - color: isValid ? Colors.transparent : Palette.red), - margin: EdgeInsets.only(right: 7, bottom: 8), - child: Text( - item.toString(), - style: TextStyle( - color: - isValid ? Colors.white : Palette.lightGrey, - fontSize: 16, - fontWeight: - isSelected ? FontWeight.w900 : FontWeight.w400, - decoration: isSelected - ? TextDecoration.underline - : TextDecoration.none), - )), - ); - }).toList(),) - ) - ], + child: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(24), + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(24), + bottomRight: Radius.circular(24) ), - ) - ) + color: PaletteDark.menuList + ), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + S.of(context).restore_active_seed, + style: TextStyle( + fontSize: 14, + color: PaletteDark.walletCardText + ), + ), + Padding( + padding: EdgeInsets.only(top: 5), + child: Wrap( + children: items.map((item) { + final isValid = item.isCorrect(); + final isSelected = selectedItem == item; + + return InkWell( + onTap: () => onMnemoticTap(item), + child: Container( + decoration: BoxDecoration( + color: isValid ? Colors.transparent : Palette.red), + margin: EdgeInsets.only(right: 7, bottom: 8), + child: Text( + item.toString(), + style: TextStyle( + color: + isValid ? Colors.white : Palette.lightGrey, + fontSize: 16, + fontWeight: + isSelected ? FontWeight.w900 : FontWeight.w400, + decoration: isSelected + ? TextDecoration.underline + : TextDecoration.none), + )), + ); + }).toList(),) + ) + ], + ), + ), + ), ), Flexible( fit: FlexFit.tight,