From 706d16b34680dec4b216978d448a0cbaa86d7593 Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Mon, 27 Jul 2020 20:07:37 +0300 Subject: [PATCH 1/2] CAKE-19 | created qr_widget (new design) and address_page; applied address page to dashboard page --- assets/images/copy_address.png | Bin 0 -> 493 bytes lib/di.dart | 4 +- lib/palette.dart | 4 + lib/src/screens/dashboard/dashboard_page.dart | 11 +- .../dashboard/widgets/address_page.dart | 59 ++++++++ .../screens/receive/widgets/qr_widget.dart | 134 ++++++++++++++++++ .../dashboard/dashboard_view_model.dart | 2 +- 7 files changed, 210 insertions(+), 4 deletions(-) create mode 100644 assets/images/copy_address.png create mode 100644 lib/src/screens/dashboard/widgets/address_page.dart create mode 100644 lib/src/screens/receive/widgets/qr_widget.dart diff --git a/assets/images/copy_address.png b/assets/images/copy_address.png new file mode 100644 index 0000000000000000000000000000000000000000..282fec6d57c1005322e2783314c629f1fa4018d4 GIT binary patch literal 493 zcmVl-PtcYGvCe%AT-@!MF^CLP=o{s0eXh;)Tvo^tY6br>>y!HAb{=Etaj9T zflhErCj~@Naq8s(B%swD9wXw50Ibk7lGq?plZ`Z_jO(-VD-D{0EjkZxyOG3@6LKRi zKn8rGu_tep2DwRBHlr-)TkeQ z1oNwVRpKaEiW@Cn=iC}EEK$r)ZdB4K8yrTO4YD`dr@>@9oQA*P9QWz7IXBI&(vSep zo0$s>`*D7A4Yph*sa^2hPwZ|mj}RYkYKPTTi`3Nchd4m^?tdA=1QcU3HCI3Q9~XX@ z_?O(mn`BQ357UvY!vAYRk;Lt)rF|)y+}t4r_=)pPE#e$~wb-yGc+Xax!({Y4DIJ`! jX+laV(i3;#)UCU3hxLw2+Yyi$00000NkvXXu0mjfk0{GA literal 0 HcmV?d00001 diff --git a/lib/di.dart b/lib/di.dart index e8f878327..f885ab20c 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -183,7 +183,9 @@ Future setup( closable: false)); getIt.registerFactory( - () => DashboardPage(walletViewModel: getIt.get())); + () => DashboardPage( + walletViewModel: getIt.get(), + addressListViewModel: getIt.get())); getIt.registerFactory(() => ReceivePage( addressListViewModel: getIt.get())); diff --git a/lib/palette.dart b/lib/palette.dart index 0daa53148..98bfe3fd7 100644 --- a/lib/palette.dart +++ b/lib/palette.dart @@ -34,6 +34,7 @@ class PaletteDark { static const Color backgroundColor = Color.fromRGBO(25, 35, 60, 1.0); static const Color nightBlue = Color.fromRGBO(35, 47, 79, 1.0); static const Color wildNightBlue = Color.fromRGBO(39, 53, 96, 1.0); + static const Color distantNightBlue = Color.fromRGBO(46, 57, 96, 1.0); static const Color cyanBlue = Color.fromRGBO(99, 113, 150, 1.0); static const Color darkCyanBlue = Color.fromRGBO(91, 112, 146, 1.0); static const Color orangeYellow = Color.fromRGBO(243, 166, 50, 1.0); @@ -41,6 +42,9 @@ class PaletteDark { static const Color oceanBlue = Color.fromRGBO(27, 39, 71, 1.0); static const Color lightNightBlue = Color.fromRGBO(39, 52, 89, 1.0); static const Color wildBlue = Color.fromRGBO(165, 176, 205, 1.0); + static const Color lightBlueGrey = Color.fromRGBO(125, 141, 183, 1.0); + static const Color darkGrey = Color.fromRGBO(118, 131, 169, 1.0); + static const Color dividerColor = Color.fromRGBO(48, 59, 95, 1.0); // FIXME: Rename. static const Color eee = Color.fromRGBO(236, 239, 245, 1.0); diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index b32b72e64..7a2fed936 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -9,13 +9,18 @@ import 'package:cake_wallet/palette.dart'; import 'package:dots_indicator/dots_indicator.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/balance_page.dart'; +import 'package:cake_wallet/src/screens/dashboard/widgets/address_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart'; +import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; class DashboardPage extends BasePage { - DashboardPage({@required this.walletViewModel}); + DashboardPage({ + @required this.walletViewModel, + @required this.addressListViewModel, + }); @override Color get backgroundLightColor => PaletteDark.backgroundColor; @@ -54,13 +59,14 @@ class DashboardPage extends BasePage { } final DashboardViewModel walletViewModel; + final WalletAddressListViewModel addressListViewModel; final sendImage = Image.asset('assets/images/upload.png', height: 22.24, width: 24, color: Colors.white); final exchangeImage = Image.asset('assets/images/transfer.png', height: 24.27, width: 22.25, color: Colors.white); final receiveImage = Image.asset('assets/images/download.png', height: 22.24, width: 24, color: Colors.white); - final controller = PageController(initialPage: 0); + final controller = PageController(initialPage: 1); var pages = []; bool _isEffectsInstalled = false; @@ -147,6 +153,7 @@ class DashboardPage extends BasePage { return; } + pages.add(AddressPage(addressListViewModel: addressListViewModel)); pages.add(BalancePage(dashboardViewModel: walletViewModel)); pages.add(TransactionsPage(dashboardViewModel: walletViewModel)); diff --git a/lib/src/screens/dashboard/widgets/address_page.dart b/lib/src/screens/dashboard/widgets/address_page.dart new file mode 100644 index 000000000..35134d51b --- /dev/null +++ b/lib/src/screens/dashboard/widgets/address_page.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; +import 'package:cake_wallet/palette.dart'; +import 'package:cake_wallet/src/screens/receive/widgets/qr_widget.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/generated/i18n.dart'; + +class AddressPage extends StatelessWidget { + AddressPage({@required this.addressListViewModel}); + + final WalletAddressListViewModel addressListViewModel; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.fromLTRB(24, 24, 24, 32), + child: Column( + children: [ + Expanded( + child: Center( + child: QRWidget(addressListViewModel: addressListViewModel), + ) + ), + GestureDetector( + onTap: () => Navigator.of(context).pushNamed(Routes.receive), + child: Container( + height: 50, + padding: EdgeInsets.only(left: 24, right: 12), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(25)), + color: PaletteDark.nightBlue + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + S.of(context).addresses, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: Colors.white + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 14, + color: Colors.white, + ) + ], + ), + ), + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart new file mode 100644 index 000000000..ea78b676d --- /dev/null +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart'; +import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; +import 'package:cake_wallet/core/amount_validator.dart'; +import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; +import 'package:cake_wallet/palette.dart'; + +class QRWidget extends StatelessWidget { + QRWidget({ + @required this.addressListViewModel, + this.isAmountFieldShow = false + }) : amountController = TextEditingController(), + _formKey = GlobalKey() { + amountController.addListener(() => addressListViewModel.amount = + _formKey.currentState.validate() ? amountController.text : ''); + } + + final WalletAddressListViewModel addressListViewModel; + final bool isAmountFieldShow; + final TextEditingController amountController; + final GlobalKey _formKey; + + @override + Widget build(BuildContext context) { + final copyImage = Image.asset('assets/images/copy_address.png', + color: PaletteDark.lightBlueGrey); + final addressTopOffset = isAmountFieldShow ? 60.0 : 40.0; + + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(children: [ + Spacer(flex: 2), + Observer( + builder: (_) => Flexible( + flex: 3, + child: Center( + child: AspectRatio( + aspectRatio: 1.0, + child: QrImage( + data: addressListViewModel.uri.toString(), + backgroundColor: Colors.transparent, + foregroundColor: PaletteDark.lightBlueGrey, + ))))), + Spacer(flex: 2) + ]), + Padding( + padding: EdgeInsets.only(top: 20), + child: Text( + 'Scan the QR code to get the address', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: PaletteDark.cyanBlue + ), + ), + ), + isAmountFieldShow + ? Padding( + padding: EdgeInsets.only(top: 60), + child: Row( + children: [ + Expanded( + child: Form( + key: _formKey, + child: BaseTextFormField( + controller: amountController, + keyboardType: + TextInputType.numberWithOptions(decimal: true), + inputFormatters: [ + BlacklistingTextInputFormatter( + RegExp('[\\-|\\ |\\,]')) + ], + textAlign: TextAlign.center, + hintText: S.of(context).receive_amount, + borderColor: PaletteDark.darkGrey, + validator: AmountValidator(), + autovalidate: true, + placeholderTextStyle: TextStyle( + color: PaletteDark.cyanBlue, + fontSize: 18, + fontWeight: FontWeight.w500)))) + ], + ), + ) + : Offstage(), + Padding( + padding: EdgeInsets.only(top: addressTopOffset), + child: Builder( + builder: (context) => Observer( + builder: (context) => GestureDetector( + onTap: () { + Clipboard.setData(ClipboardData( + text: addressListViewModel.address.address)); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text( + S.of(context).copied_to_clipboard, + style: TextStyle(color: Colors.white), + ), + backgroundColor: Colors.green, + duration: Duration(milliseconds: 500), + )); + }, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Text( + addressListViewModel.address.address, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.white), + ), + ), + Padding( + padding: EdgeInsets.only(left: 12), + child: copyImage, + ) + ], + ), + ))), + ) + ], + ); + } +} \ No newline at end of file diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index fac416af8..322dd4403 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -54,7 +54,7 @@ abstract class DashboardViewModelBase with Store { subname = _wallet.account?.label; } - currentPage = 0; + currentPage = 1; } @observable From 153673d4183b8fcd4251eb14906d6032a6223932 Mon Sep 17 00:00:00 2001 From: Oleksandr Sobol Date: Tue, 28 Jul 2020 19:03:34 +0300 Subject: [PATCH 2/2] CAKE-19 | created page view store, alert background, alert close button, cake scrollbar; applied new design to monero_account_edit_or_create_page, monero_account_list_page, address_edit_or_create_page; added scrollOffsetFromTop to monero_account_list_view_model; added string resources to arb files and colors to palette --- assets/images/2.0x/close.png | Bin 0 -> 378 bytes assets/images/2.0x/copy_address.png | Bin 0 -> 802 bytes assets/images/2.0x/share.png | Bin 319 -> 798 bytes assets/images/3.0x/close.png | Bin 0 -> 461 bytes assets/images/3.0x/copy_address.png | Bin 0 -> 1165 bytes assets/images/3.0x/share.png | Bin 498 -> 1170 bytes assets/images/close.png | Bin 0 -> 272 bytes assets/images/share.png | Bin 277 -> 392 bytes lib/di.dart | 5 +- lib/generated/i18n.dart | 45 ++++ lib/palette.dart | 8 +- lib/src/screens/base_page.dart | 8 +- lib/src/screens/dashboard/dashboard_page.dart | 5 +- .../monero_account_edit_or_create_page.dart | 9 +- .../monero_account_list_page.dart | 242 ++++++++++-------- .../monero_accounts/widgets/account_tile.dart | 5 +- lib/src/screens/receive/receive_page.dart | 202 ++++----------- .../screens/receive/widgets/address_cell.dart | 24 +- .../screens/receive/widgets/header_tile.dart | 6 +- .../screens/receive/widgets/qr_widget.dart | 15 +- .../address_edit_or_create_page.dart | 8 + lib/src/widgets/alert_background.dart | 26 ++ lib/src/widgets/alert_close_button.dart | 28 ++ lib/src/widgets/cake_scrollbar.dart | 45 ++++ lib/store/dashboard/page_view_store.dart | 19 ++ .../dashboard/dashboard_view_model.dart | 14 +- .../monero_account_list_view_model.dart | 10 +- .../wallet_address_list_view_model.dart | 4 + res/values/strings_de.arb | 2 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 2 + res/values/strings_hi.arb | 2 + res/values/strings_ja.arb | 2 + res/values/strings_ko.arb | 2 + res/values/strings_nl.arb | 2 + res/values/strings_pl.arb | 2 + res/values/strings_pt.arb | 2 + res/values/strings_ru.arb | 2 + res/values/strings_uk.arb | 2 + res/values/strings_zh.arb | 2 + 40 files changed, 447 insertions(+), 304 deletions(-) create mode 100644 assets/images/2.0x/close.png create mode 100644 assets/images/2.0x/copy_address.png create mode 100644 assets/images/3.0x/close.png create mode 100644 assets/images/3.0x/copy_address.png create mode 100644 assets/images/close.png create mode 100644 lib/src/widgets/alert_background.dart create mode 100644 lib/src/widgets/alert_close_button.dart create mode 100644 lib/src/widgets/cake_scrollbar.dart create mode 100644 lib/store/dashboard/page_view_store.dart diff --git a/assets/images/2.0x/close.png b/assets/images/2.0x/close.png new file mode 100644 index 0000000000000000000000000000000000000000..aa65228c8424628880203295268c5ec5a4e4c579 GIT binary patch literal 378 zcmV-=0fqjFP)N8CSTRr)C8U8M9DatNM6z>N$yhpP#<3#|=jR?k z8)D7~G+U0_2WpTq&jCCo;+B8;_v`!7;?$+YJm9>0@tA1qh|nt4B}oE21WcJ@&Idw$ zlth9T$^91LQE>DHZYT8iv~N-g_q}W1i%=LZ(cr~1z8mZk3;ai5m001TK$9>7R(PdA zk&qQ$E3iuH;Hp5AXz(JA)chr^geY4ipO#W;FC!YlRf&s%=l5fJ?F%iH|1QM9*YAsF zzwwBLhgzEiDexExQsGt!n!qiR=S)tA7gf#5*c40MBt1dX6V%&lr2M30?3c;RU*l)LH_wC!Z$9}2A+QEQ0SXRMfCx>cRGr(4 zw_8i+7!V2%_D}o+Zd_!GcOz~$&o)<^FhuCDA&J$L9xJy#DaU|Q{N8uZL{1X z=NOq_&I)TXcTWdtWAF5`!7gwX4dY|&5~L`v6nXn6m(?&bPKXcF%B-|2`efkde8 zfs;5d@do33WP%?lS=f8A{JY=pua0~tmqQH^;bg%bTbIxYlazQKwUJW!vG(EjFN^iK zh32M_E^8)FFvrGN_|vrsq>Nkf9V8x8S61s91_(uHL=BdOFLx89g3A#~N~$ExfoW}G zMz&GrxLybiiYq?+`L%!Q2S@=Pi$ki4?Hi?12QZ|QE$w~wJuW4!VK@Yb+r@?d?aW0U z6+Q3Vbe3gru=WdN4A$9?X@h>U3XYzA5LElOEDMC`kZTBTIX)=v;Su+)! zHB-S^V<^~8KJuJ26Q+>v%uzLs1eZ4#n;dfLv7r=dyZm|pDWS#c%rS1I3xXj!jCT*1 zHDtaC{jgK?lB=9099Rzyx1atT=%y27uX5udW3<>XaWZy^C>{3@^o$D!1tebb3_!q2 g>%1rOqA!a60mBmR8TbVucmMzZ07*qoM6N<$g1{nJ#sB~S literal 0 HcmV?d00001 diff --git a/assets/images/2.0x/share.png b/assets/images/2.0x/share.png index dc4610066b64fe3f6607bc86b402e19b8dd47b41..56f2bf7d16d47b23d5ff74d095bb476edba79da6 100644 GIT binary patch delta 760 zcmV*CK?FLLIkUGIDailIf z5R@o7mfs!x5di`OKoAtsl>ks!I$JXMz;8>frIPLmYrx4;k2rYjneG8^Tq>SuOK|8! zNSDB#EGPqCC=a!zQan3b`sV4oe;6yg%xz)4u($M6@ldVsHVR*hTWlP-o%&-YghfOq zh8CG2*Nm&MoNt~pG~sgSnwUJ_(@Gj-lr<9|0x9)U|4xu9}Rphb?`GXa;&CfOkf6aVIiJi?|!KerJk zy`haT=a^};a1e5Dv>h(u|32V=>w>3vq>TXAgv>_|A#S!g6x~5%vBc2R#!&L`fuD~# zD7`h%_E2@^cGR0;G*DWP6|~>>+j|d^EBg9^;ABn+U7yMC{P00000NkvXXu0mjfw}@}w diff --git a/assets/images/3.0x/close.png b/assets/images/3.0x/close.png new file mode 100644 index 0000000000000000000000000000000000000000..5c480a9260a55b4cafd8a2e199ebd5edb2868442 GIT binary patch literal 461 zcmV;;0W$uHP)!jAL=1&Maos*oL2qBkHc!y#+zMNpuA%#7{)n^=hxf6BwL2IR6ErV|KT z-zICvw`2E2D&Cd>VBXOZ#l`qGmIqp(B$yje zZIl!f1l2-mFi}t`N{dN?w5SqH79>TLVpt$93Vz}*#IQjeR4QDI2&6?xFk+AtCB>*f zT$BdmV@MI+NvccB?@;d3UPklp6M-ZcQli)(4Tcmb)`RBEz*nNL*m23qGkb?5zk?d9 z1k}RJDMg_srUnYNF{LQ9z?7iS3Zq4#B}RinYm5{XtbWwSa8c3fM+=P4`Ox*L89iD3 zsEy&Gg4K^!m>lZ2`mukVJ_zW2`|5z_WA{QUBsA_1WfXt;N##_i00000NkvXXu0mjf D;3>iI literal 0 HcmV?d00001 diff --git a/assets/images/3.0x/copy_address.png b/assets/images/3.0x/copy_address.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c198cf3cee3352ebf0c69fafed0c185bac3374 GIT binary patch literal 1165 zcmV;81akX{P)d=0Gt5)fb|>o1lAL{-k<~$ zEzo(sX{SbT7TUP8Y}5HAn{8&cneD%CXLkPc2Ejm~vXdg3dPpR*fS3V-G(-d>bLBY|P=40REM;0v672?%;Jx_#>A;u^%Zpx_wSfVQghn=+s!iBt-@9SBx zK%y57=23x&nkc|KJZOKbmgZX!0fl#a895BGF}3nx?>2;tATYl# zl%LFgfh(l6Fw^4B%Qw}v1*Rcn1jHBuiYy{yEku+!Av8`1jT1uSgwQx4G)@SO6GG#J z&?I04K}i{&j^m)$Cr-gHy|~!j8c87tMO6$e1N)wn%7LryC5E>_h#tETuLTH3}eG$Oc^7}9#LB>?xIi&*#89@k5 zV}+nAO&sB=axrLK_DyfaJX8{_dV?Fx{#%6)cxk@Eg4CkQY*VO=J}Ia2{5l+vyh6KR zfdqR_CBAB!Lwnx`x;5^?HGYC_>Cp89XaXv(xY& z@FPd2@?H)VM+G8={@jI(e{zEJV2Q2}Dk-DgCe?@!@ub!1Ow6ynh#=2WH6lb(h20j! z2<1E?Zh@KV;&_qGSuv3_V`iM(c2UOzLFgZ)yt4|BS z%K7qss^Vqezb?sNUb_DSEDl=amQBqN$yG$)Gor!H8f5LjT1uS zgwQx4G)@SO6GG#J&^RG95ek8^*ghFV=t3kC=BYfQOxxV0HweLoG_^t(Liw9PJ8x|6 z(z^`hg-%SsWQR{ow&70#+9 zx?_Ek*0w@#5s&RjDQ$&)M1MTce<{EUnjsx>8au3zg`z-d+Z1lPx@&Ffmo#RuMHJ!J z3f+@H!`^*HV}liHj*t86A;B|+{u27uWk#X6vuKDnUI*|h0{9r)Zm0(?C<4wRkM@$+ zScm{sqCS~z{DN0>ETHznUH8}!3$MGee6w~&LxQIh^tCF1*XO0eH+CyCf9N^IeaeQ! z#1alhPpFqipQvn?Txrx6*aZwcv+Y6YV_csb$J6KCi-109m3D&p1}yL%Or(sovKG(6 z)7K!ynudS6Ee_B;pg)!e_%1y({US5VVC5NLrqDhi9)-ep?x9^$4B(%d-pB`WmiA^z z0ZMmY&(M?i;J1h{rvumLf35@HrNXP*)J9|y;Nf|T+VPZ5Id1G9cos}40?>_;r(k3- zbac}J(6`GlE2G{cB`j!UfIhYJ5C(-nY-oglo?80LM35cK_!4mk#mYM$q2{bI8Y!HW zCFJeC`}yz>f#+s2nN&1VSlM3fpN;VNgHHPj=K|3$8b2f%^Y)K@e}%KdH1tB_$8X{O zhp21P{=pMoAi8qXX0$+^tsQhyR`!2-UbF}@f!FKUm1Q^?t3%JMZr9CqdrC_sn2OE_ zAqtP)x-C?~{j9lYD=aB?9v`Y5&Q0M=xL-9F|BJ$Znu~AE1$#N`%~)rSqfAfZ5b1*Ji$F)Pp=C616-picHnbVs2vG>C&4 zQt9Nfp-!(1`e920A%ScL?aw?&a|neIR}&;UifXriPqO=G zZ}>e`?2XzgTV=e>o@`v^%}K@;GhLvg#h@3?k`?-(7u;iHe_LuL*}@}C6kSJ!*O9Un z0$s@urHbE;hpANmN><&392ZO}PPQEh4-g}y3Mj+jQ4Vq0_CSZhy4H%(J0BjH@F*3L%_#DfrVT`GaXWl8qPl_5#UO)HrwH;v>#xp5^=lp9Bq zDVJALNG^}0u$-)<`F(uFct0^_e~CU8XOPBiB=&)A6^XChn7rUWZFgBuXSmpLXtfI;dcnG6-=QoP{2`vdE| z!tNn3uEkn^fec{I8oOm6^ocoNy8{~&XH6s`Z!;k|BIj=A20mg(eJb98e>_VfULR`k z9t!26W^oJhd{G1DM11dBmRXF)Y}`DuwOG0K4^j{h@&p;NlD2oEl^>U^!8UQ*AgD7q z1pDUf->TSUAts2Is>M#c9Q0*@iwbg4K`tuDMFqL2AQu(nqJmshkjr_kZUv}_^&d&9 z&_+@adUhNOtwAma!8a(BARj^e=-z|CDnJIBZ?)B;cWG@hCjbBd07*qoM6N<$g4>D5 AH~;_u diff --git a/assets/images/close.png b/assets/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa8fedde4bd19bf438c43923c240e6a429439c4 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k&H|6fVg?3oVGw3ym^DWND9BhG z4by4hYSQ*zVoq6c^DStw(EiG z5pG4fj`&?2E0mT#uu|&SDC@dOzx;RSlexXuy{8}l-OO+yKQHe4HRr(ZGBH0s&9FG9 z&LUoBQ?~u!OoIuw^S%`e?~mgSEohjZ#O-y=QmXxs$JYWTl{?2zZTaWhw!uPl&ldfV z)=4aL?gy~--SC>X@vB2N$F^%5t|{}zS!ciA$g2MJ`nA)uZ$vrsy8dN+-ahwOGwU6D Qpo1AaUHx3vIVCg!0DLKCO#lD@ literal 0 HcmV?d00001 diff --git a/assets/images/share.png b/assets/images/share.png index da95e38ba969ec91193aa46cac7d4186acdfc5d2..458d4e373d8600e5137c2809357174e4489d37b5 100644 GIT binary patch delta 351 zcmV-l0igbs0*C`4iBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4Ur)jWX^y8Ca83^}!F`Qb9yqIDtU{+8#gf<^3hKb& z5hiLO@0M~las{H3Jq+CDF+q!Be~uGpFB(qy!J#8tV3C)B3(md<)VG!38Y4@!5@5z4 z={H$#5Y+yl;=~4^p`H2!VRf!e0~p*So@$#Dc1auwwPHECyRN}pKK x_$9Hlj5?^fsuVckO#Q=92d;%XLEh+geF22g%)#~FAzJ_d002ovPDHLkV1mbmk{18~ delta 235 zcmV().wallet)); getIt.registerSingleton(TransactionFilterStore()); getIt.registerSingleton(FiatConvertationStore()); + getIt.registerSingleton(PageViewStore()); getIt.registerFactory( () => KeyService(getIt.get())); @@ -153,7 +155,8 @@ Future setup( appStore: getIt.get(), tradesStore: getIt.get(), tradeFilterStore: getIt.get(), - transactionFilterStore: getIt.get() + transactionFilterStore: getIt.get(), + pageViewStore: getIt.get() )); getIt.registerFactory(() => AuthService( diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 512866c0e..56f9ba2d0 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -162,6 +162,7 @@ class S implements WidgetsLocalizations { String get restore_wallet_restore_description => "Wallet restore description"; String get save => "Save"; String get saved_the_trade_id => "I've saved the trade ID"; + String get scan_qr_code => "Scan the QR code to get the address"; String get seed_choose => "Choose seed language"; String get seed_language_chinese => "Chinese"; String get seed_language_choose => "Please choose seed language:"; @@ -623,6 +624,8 @@ class $de extends S { @override String get xmr_available_balance => "XMR verfügbares Guthaben"; @override + String get scan_qr_code => "Scannen Sie den QR-Code, um die Adresse zu erhalten"; + @override String get trade_state_paid => "Bezahlt"; @override String get node_new => "Neuer Knoten"; @@ -749,6 +752,8 @@ class $de extends S { @override String get error_text_fiat => "Der Wert des Betrags darf den verfügbaren Kontostand nicht überschreiten.\nDie Anzahl der Nachkommastellen muss kleiner oder gleich 2 sein"; @override + String get addresses => "Adressen"; + @override String get transactions_by_date => "Transaktionen nach Datum"; @override String get restore_from_seed_placeholder => "Bitte geben Sie hier Ihren Code ein"; @@ -1243,6 +1248,8 @@ class $hi extends S { @override String get xmr_available_balance => "XMR उपलब्ध शेष राशि"; @override + String get scan_qr_code => "पता प्राप्त करने के लिए QR कोड स्कैन करें"; + @override String get trade_state_paid => "भुगतान किया है"; @override String get node_new => "नया नोड"; @@ -1369,6 +1376,8 @@ class $hi extends S { @override String get error_text_fiat => "राशि का मूल्य उपलब्ध शेष राशि से अधिक नहीं हो सकता.\nअंश अंकों की संख्या कम या 2 के बराबर होनी चाहिए"; @override + String get addresses => "पतों"; + @override String get transactions_by_date => "तारीख से लेन-देन"; @override String get restore_from_seed_placeholder => "कृपया अपना कोड वाक्यांश यहां दर्ज करें या पेस्ट करें"; @@ -1863,6 +1872,8 @@ class $ru extends S { @override String get xmr_available_balance => "Доступный XMR баланс"; @override + String get scan_qr_code => "Отсканируйте QR-код для получения адреса"; + @override String get trade_state_paid => "Оплаченная"; @override String get node_new => "Новая нода"; @@ -1989,6 +2000,8 @@ class $ru extends S { @override String get error_text_fiat => "Значение суммы не может превышать доступный баланс.\nКоличество цифр после запятой должно быть меньше или равно 2"; @override + String get addresses => "Адреса"; + @override String get transactions_by_date => "Сортировать по дате"; @override String get restore_from_seed_placeholder => "Введите или вставьте мнемоническую фразу вашего кошелька"; @@ -2483,6 +2496,8 @@ class $ko extends S { @override String get xmr_available_balance => "XMR 사용 가능한 잔액"; @override + String get scan_qr_code => "QR 코드를 스캔하여 주소를 얻습니다."; + @override String get trade_state_paid => "유료"; @override String get node_new => "새로운 노드"; @@ -2609,6 +2624,8 @@ class $ko extends S { @override String get error_text_fiat => "금액은 사용 가능한 잔액을 초과 할 수 없습니다.\n소수 자릿수는 2보다 작거나 같아야합니다"; @override + String get addresses => "구애"; + @override String get transactions_by_date => "날짜 별 거래"; @override String get restore_from_seed_placeholder => "여기에 코드 문구를 입력하거나 붙여 넣으십시오."; @@ -3103,6 +3120,8 @@ class $pt extends S { @override String get xmr_available_balance => "Saldo XMR disponível"; @override + String get scan_qr_code => "Digitalize o código QR para obter o endereço"; + @override String get trade_state_paid => "Paga"; @override String get node_new => "Novo nó"; @@ -3229,6 +3248,8 @@ class $pt extends S { @override String get error_text_fiat => "O valor do valor não pode exceder o saldo disponível.\nO número de dígitos decimais deve ser menor ou igual a 2"; @override + String get addresses => "Endereços"; + @override String get transactions_by_date => "Transações por data"; @override String get restore_from_seed_placeholder => "Digite ou cole sua frase de código aqui"; @@ -3723,6 +3744,8 @@ class $uk extends S { @override String get xmr_available_balance => "Доступний XMR баланс"; @override + String get scan_qr_code => "Скануйте QR-код для одержання адреси"; + @override String get trade_state_paid => "Оплачена"; @override String get node_new => "Новий вузол"; @@ -3849,6 +3872,8 @@ class $uk extends S { @override String get error_text_fiat => "Значення суми не може перевищувати доступний баланс.\nКількість цифр після коми повинно бути меншим або дорівнювати 2"; @override + String get addresses => "Адреси"; + @override String get transactions_by_date => "Сортувати по даті"; @override String get restore_from_seed_placeholder => "Введіть або вставте мнемонічну фразу вашого гаманця"; @@ -4343,6 +4368,8 @@ class $ja extends S { @override String get xmr_available_balance => "XMR利用可能残高"; @override + String get scan_qr_code => "QRコードをスキャンして住所を取得します"; + @override String get trade_state_paid => "有料"; @override String get node_new => "新しいノード"; @@ -4469,6 +4496,8 @@ class $ja extends S { @override String get error_text_fiat => "金額は利用可能な残高を超えることはできません.\n小数桁の数は2以下でなければなりません"; @override + String get addresses => "住所"; + @override String get transactions_by_date => "日付ごとの取引"; @override String get restore_from_seed_placeholder => "ここにコードフレーズを入力または貼り付けてください"; @@ -4967,6 +4996,8 @@ class $pl extends S { @override String get xmr_available_balance => "XMR Dostępne saldo"; @override + String get scan_qr_code => "Zeskanuj kod QR, aby uzyskać adres"; + @override String get trade_state_paid => "Płatny"; @override String get node_new => "Nowy węzeł"; @@ -5093,6 +5124,8 @@ class $pl extends S { @override String get error_text_fiat => "Wartość kwoty nie może przekroczyć dostępnego salda.\nLiczba cyfr ułamkowych musi być mniejsza lub równa 2"; @override + String get addresses => "Adresy"; + @override String get transactions_by_date => "Transakcje według daty"; @override String get restore_from_seed_placeholder => "Wpisz lub wklej tutaj swoją frazę kodową"; @@ -5587,6 +5620,8 @@ class $es extends S { @override String get xmr_available_balance => "XMR Available Balance"; @override + String get scan_qr_code => "Escanee el código QR para obtener la dirección"; + @override String get trade_state_paid => "Pagado"; @override String get node_new => "Nuevo nodo"; @@ -5713,6 +5748,8 @@ class $es extends S { @override String get error_text_fiat => "El valor de la cantidad no puede exceder el saldo disponible.\nEl número de dígitos de fracción debe ser menor o igual a 2"; @override + String get addresses => "Direcciones"; + @override String get transactions_by_date => "Transacciones por fecha"; @override String get restore_from_seed_placeholder => "Ingrese o pegue su frase de código aquí"; @@ -6207,6 +6244,8 @@ class $nl extends S { @override String get xmr_available_balance => "XMR Beschikbaar saldo"; @override + String get scan_qr_code => "Scan de QR-code om het adres te krijgen"; + @override String get trade_state_paid => "Betaald"; @override String get node_new => "Nieuw knooppunt"; @@ -6333,6 +6372,8 @@ class $nl extends S { @override String get error_text_fiat => "Waarde van bedrag kan het beschikbare saldo niet overschrijden.\nHet aantal breukcijfers moet kleiner zijn dan of gelijk zijn aan 2"; @override + String get addresses => "Adressen"; + @override String get transactions_by_date => "Transacties op datum"; @override String get restore_from_seed_placeholder => "Voer hier uw codefrase in of plak deze"; @@ -6827,6 +6868,8 @@ class $zh extends S { @override String get xmr_available_balance => "XMR 可用余额 "; @override + String get scan_qr_code => "掃描二維碼獲取地址"; + @override String get trade_state_paid => "已付费"; @override String get node_new => "新节点"; @@ -6953,6 +6996,8 @@ class $zh extends S { @override String get error_text_fiat => "金额不能超过可用余额.\n小数位数必须小于或等于2"; @override + String get addresses => "地址"; + @override String get transactions_by_date => "按日期交易"; @override String get restore_from_seed_placeholder => "请在此处输入或粘贴您的代码短语"; diff --git a/lib/palette.dart b/lib/palette.dart index 98bfe3fd7..d6bbcc694 100644 --- a/lib/palette.dart +++ b/lib/palette.dart @@ -18,10 +18,9 @@ class Palette { } class PaletteDark { - static const Color distantBlue = Color.fromRGBO(70, 85, 133, 1.0); // mainBackgroundColor + //static const Color distantBlue = Color.fromRGBO(70, 85, 133, 1.0); // mainBackgroundColor static const Color lightDistantBlue = Color.fromRGBO(81, 96, 147, 1.0); // borderCardColor static const Color gray = Color.fromRGBO(140, 153, 201, 1.0); // walletCardText - static const Color violetBlue = Color.fromRGBO(51, 63, 104, 1.0); // walletCardAddressField static const Color moderateBlue = Color.fromRGBO(63, 77, 122, 1.0); // walletCardSubAddressField static const Color darkNightBlue = Color.fromRGBO(33, 43, 73, 1.0); // historyPanel static const Color pigeonBlue = Color.fromRGBO(91, 112, 146, 1.0); // historyPanelText @@ -40,11 +39,16 @@ class PaletteDark { static const Color orangeYellow = Color.fromRGBO(243, 166, 50, 1.0); static const Color brightGreen = Color.fromRGBO(88, 243, 50, 1.0); static const Color oceanBlue = Color.fromRGBO(27, 39, 71, 1.0); + static const Color lightOceanBlue = Color.fromRGBO(32, 45, 80, 1.0); static const Color lightNightBlue = Color.fromRGBO(39, 52, 89, 1.0); static const Color wildBlue = Color.fromRGBO(165, 176, 205, 1.0); static const Color lightBlueGrey = Color.fromRGBO(125, 141, 183, 1.0); + static const Color wildBlueGrey = Color.fromRGBO(125, 137, 182, 1.0); static const Color darkGrey = Color.fromRGBO(118, 131, 169, 1.0); static const Color dividerColor = Color.fromRGBO(48, 59, 95, 1.0); + static const Color violetBlue = Color.fromRGBO(59, 72, 119, 1.0); + static const Color deepPurpleBlue = Color.fromRGBO(19, 29, 56, 1.0); + static const Color distantBlue = Color.fromRGBO(72, 85, 131, 1.0); // FIXME: Rename. static const Color eee = Color.fromRGBO(236, 239, 245, 1.0); diff --git a/lib/src/screens/base_page.dart b/lib/src/screens/base_page.dart index 88ad87ea6..f70fcc95d 100644 --- a/lib/src/screens/base_page.dart +++ b/lib/src/screens/base_page.dart @@ -23,9 +23,9 @@ abstract class BasePage extends StatelessWidget { Widget Function(BuildContext, Widget) get rootWrapper => null; - final _backArrowImage = Image.asset('assets/images/back_arrow.png'); + final _backArrowImage = Image.asset('assets/images/back_arrow.png', color: Colors.white); final _backArrowImageDarkTheme = - Image.asset('assets/images/back_arrow_dark_theme.png'); + Image.asset('assets/images/back_arrow_dark_theme.png', color: Colors.white); final _closeButtonImage = Image.asset('assets/images/close_button.png'); final _closeButtonImageDarkTheme = Image.asset('assets/images/close_button_dark_theme.png'); @@ -71,7 +71,9 @@ abstract class BasePage extends StatelessWidget { style: TextStyle( fontSize: 18.0, fontWeight: FontWeight.bold, - color: Theme.of(context).primaryTextTheme.title.color), + //color: Theme.of(context).primaryTextTheme.title.color, + color: Colors.white, + ), ); } diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index 7a2fed936..1d5eab711 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -28,6 +28,9 @@ class DashboardPage extends BasePage { @override Color get backgroundDarkColor => PaletteDark.backgroundColor; + @override + bool get resizeToAvoidBottomPadding => false; + @override Widget middle(BuildContext context) { return SyncIndicator(dashboardViewModel: walletViewModel); @@ -158,7 +161,7 @@ class DashboardPage extends BasePage { pages.add(TransactionsPage(dashboardViewModel: walletViewModel)); controller.addListener(() { - walletViewModel.currentPage = controller.page; + walletViewModel.pageViewStore.setCurrentPage(controller.page); }); reaction((_) => walletViewModel.currentPage, (double currentPage) { diff --git a/lib/src/screens/monero_accounts/monero_account_edit_or_create_page.dart b/lib/src/screens/monero_accounts/monero_account_edit_or_create_page.dart index 96ab7fba7..7cd1b200a 100644 --- a/lib/src/screens/monero_accounts/monero_account_edit_or_create_page.dart +++ b/lib/src/screens/monero_accounts/monero_account_edit_or_create_page.dart @@ -8,6 +8,7 @@ import 'package:cake_wallet/view_model/monero_account_list/monero_account_edit_o import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; +import 'package:cake_wallet/palette.dart'; class MoneroAccountEditOrCreatePage extends BasePage { MoneroAccountEditOrCreatePage({@required this.moneroAccountCreationViewModel}) @@ -23,6 +24,12 @@ class MoneroAccountEditOrCreatePage extends BasePage { @override String get title => S.current.account; + @override + Color get backgroundLightColor => PaletteDark.backgroundColor; + + @override + Color get backgroundDarkColor => PaletteDark.backgroundColor; + final GlobalKey _formKey; final TextEditingController _textController; @@ -31,7 +38,6 @@ class MoneroAccountEditOrCreatePage extends BasePage { Form( key: _formKey, child: Container( - color: Theme.of(context).backgroundColor, padding: EdgeInsets.all(24.0), child: Column( children: [ @@ -39,6 +45,7 @@ class MoneroAccountEditOrCreatePage extends BasePage { child: Center( child: BaseTextFormField( controller: _textController, + textColor: Colors.white, hintText: S.of(context).account, validator: MoneroLabelValidator(), ))), diff --git a/lib/src/screens/monero_accounts/monero_account_list_page.dart b/lib/src/screens/monero_accounts/monero_account_list_page.dart index 74792e4ff..c59e566d1 100644 --- a/lib/src/screens/monero_accounts/monero_account_list_page.dart +++ b/lib/src/screens/monero_accounts/monero_account_list_page.dart @@ -7,133 +7,157 @@ import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart'; import 'package:cake_wallet/src/screens/monero_accounts/widgets/account_tile.dart'; +import 'package:cake_wallet/src/widgets/alert_background.dart'; +import 'package:cake_wallet/src/widgets/cake_scrollbar.dart'; +import 'package:cake_wallet/src/widgets/alert_close_button.dart'; -class MoneroAccountListPage extends StatefulWidget { - MoneroAccountListPage({@required this.accountListViewModel}); +class MoneroAccountListPage extends StatelessWidget { + MoneroAccountListPage({@required this.accountListViewModel}) { + backgroundHeight = 194; + thumbHeight = 72; + isAlwaysShowScrollThumb = false; + controller = ScrollController(); + + controller.addListener(() { + final scrollOffsetFromTop = controller.hasClients + ? (controller.offset / controller.position.maxScrollExtent * (backgroundHeight - thumbHeight)) + : 0.0; + accountListViewModel.setScrollOffsetFromTop(scrollOffsetFromTop); + }); + } final MoneroAccountListViewModel accountListViewModel; + final closeIcon = Image.asset('assets/images/close.png'); - @override - MoneroAccountListPageForm createState() => - MoneroAccountListPageForm(accountListViewModel); -} - -class MoneroAccountListPageForm extends State { - MoneroAccountListPageForm(this.accountListViewModel); - - final MoneroAccountListViewModel accountListViewModel; + ScrollController controller; + double backgroundHeight; + double thumbHeight; + bool isAlwaysShowScrollThumb; @override Widget build(BuildContext context) { - return GestureDetector( - onTap: () => Navigator.of(context).pop(), - child: Container( - color: Colors.transparent, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0), - child: Container( - decoration: BoxDecoration( - color: PaletteDark.darkNightBlue.withOpacity(0.75)), - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: EdgeInsets.only(left: 24, right: 24), - child: Text( - S.of(context).choose_account, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - decoration: TextDecoration.none, - color: Colors.white), - ), + return AlertBackground( + child: Stack( + alignment: Alignment.center, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.only(left: 24, right: 24), + child: Text( + S.of(context).choose_account, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + decoration: TextDecoration.none, + color: Colors.white ), - Padding( - padding: EdgeInsets.only(left: 24, right: 24, top: 24), - child: GestureDetector( - onTap: () => null, - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(14)), - child: Container( - height: 296, - color: Theme.of(context) - .accentTextTheme - .title - .backgroundColor, - child: Column( - children: [ - Expanded(child: Observer(builder: (_) { - final accounts = - widget.accountListViewModel.accounts; + ), + ), + Padding( + padding: EdgeInsets.only(left: 24, right: 24, top: 24), + child: GestureDetector( + onTap: () => null, + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(14)), + child: Container( + height: 296, + color: PaletteDark.deepPurpleBlue, + child: Column( + children: [ + Expanded( + child: Observer( + builder: (_) { + final accounts = accountListViewModel.accounts; + isAlwaysShowScrollThumb = accounts == null + ? false + : accounts.length > 3; - return ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Theme.of(context).dividerColor, - height: 1), - itemCount: accounts.length ?? 0, - itemBuilder: (context, index) { - final account = accounts[index]; - - return AccountTile( - isCurrent: account.isSelected, - accountName: account.label, - onTap: () { - if (account.isSelected) { - return; - } - - widget.accountListViewModel - .select(account); - Navigator.of(context).pop(); - }); - }, - ); - })), - GestureDetector( - onTap: () async => await Navigator.of(context) - .pushNamed(Routes.accountCreation), - child: Container( - height: 62, - color: Colors.white, - padding: EdgeInsets.only(left: 24, right: 24), - child: Center( - child: Row( - mainAxisSize: MainAxisSize.min, + return Stack( + alignment: Alignment.center, children: [ - Icon( - Icons.add, - color: PaletteDark.darkNightBlue, - ), - Padding( - padding: EdgeInsets.only(left: 5), - child: Text( - S.of(context).create_new_account, - style: TextStyle( - fontSize: 15, - fontWeight: FontWeight.w600, - color: PaletteDark.darkNightBlue, - decoration: TextDecoration.none, - ), + ListView.separated( + controller: controller, + separatorBuilder: (context, index) => + Container( + height: 1, + color: PaletteDark.dividerColor, ), + itemCount: accounts.length ?? 0, + itemBuilder: (context, index) { + final account = accounts[index]; + + return AccountTile( + isCurrent: account.isSelected, + accountName: account.label, + onTap: () { + if (account.isSelected) { + return; + } + + accountListViewModel + .select(account); + Navigator.of(context).pop(); + }); + }, + ), + isAlwaysShowScrollThumb + ? CakeScrollbar( + backgroundHeight: backgroundHeight, + thumbHeight: thumbHeight, + fromTop: accountListViewModel + .scrollOffsetFromTop ) + : Offstage(), ], - ), - ), - ), + ); + } ) - ], ), - ), + GestureDetector( + onTap: () async => await Navigator.of(context) + .pushNamed(Routes.accountCreation), + child: Container( + height: 62, + color: Colors.white, + padding: EdgeInsets.only(left: 24, right: 24), + child: Center( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.add, + color: PaletteDark.darkNightBlue, + ), + Padding( + padding: EdgeInsets.only(left: 5), + child: Text( + S.of(context).create_new_account, + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.w600, + color: PaletteDark.darkNightBlue, + decoration: TextDecoration.none, + ), + ), + ) + ], + ), + ), + ), + ) + ], ), ), - ) - ], - ), - ), + ), + ), + ) + ], ), - ), + AlertCloseButton(image: closeIcon) + ], ), ); } diff --git a/lib/src/screens/monero_accounts/widgets/account_tile.dart b/lib/src/screens/monero_accounts/widgets/account_tile.dart index 84b965e03..a9f131f1c 100644 --- a/lib/src/screens/monero_accounts/widgets/account_tile.dart +++ b/lib/src/screens/monero_accounts/widgets/account_tile.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:cake_wallet/palette.dart'; class AccountTile extends StatelessWidget { AccountTile({ @@ -13,8 +14,8 @@ class AccountTile extends StatelessWidget { @override Widget build(BuildContext context) { - final color = isCurrent ? Theme.of(context).accentTextTheme.subtitle.decorationColor : Colors.transparent; - final textColor = isCurrent ? Colors.blue : Theme.of(context).primaryTextTheme.title.color; + final color = isCurrent ? PaletteDark.lightOceanBlue : Colors.transparent; + final textColor = isCurrent ? Colors.blue : Colors.white; return GestureDetector( onTap: onTap, diff --git a/lib/src/screens/receive/receive_page.dart b/lib/src/screens/receive/receive_page.dart index 19cc6fecc..21e8e3b5e 100644 --- a/lib/src/screens/receive/receive_page.dart +++ b/lib/src/screens/receive/receive_page.dart @@ -1,199 +1,72 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:esys_flutter_share/esys_flutter_share.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; -import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart'; import 'package:cake_wallet/src/screens/monero_accounts/monero_account_list_page.dart'; import 'package:cake_wallet/src/screens/receive/widgets/header_tile.dart'; -import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; -import 'package:cake_wallet/core/amount_validator.dart'; import 'package:cake_wallet/src/screens/receive/widgets/address_cell.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_account_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; +import 'package:cake_wallet/src/screens/receive/widgets/qr_widget.dart'; +import 'package:cake_wallet/palette.dart'; class ReceivePage extends BasePage { - ReceivePage({this.addressListViewModel}) - : amountController = TextEditingController(), - _formKey = GlobalKey() { - amountController.addListener(() => addressListViewModel.amount = - _formKey.currentState.validate() ? amountController.text : ''); - } + ReceivePage({this.addressListViewModel}); final WalletAddressListViewModel addressListViewModel; - final TextEditingController amountController; - final GlobalKey _formKey; @override - Color get backgroundLightColor => Colors.transparent; + String get title => S.current.receive; @override - Color get backgroundDarkColor => Colors.transparent; + Color get backgroundLightColor => PaletteDark.backgroundColor; @override - Widget Function(BuildContext, Widget) get rootWrapper => - (BuildContext context, Widget scaffold) => Container( - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Theme.of(context).scaffoldBackgroundColor, - Theme.of(context).primaryColor - ], begin: Alignment.topLeft, end: Alignment.bottomRight)), - child: scaffold); - - @override - Widget middle(BuildContext context) => Text( - S.of(context).receive, - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.bold, - color: Theme.of(context).primaryTextTheme.title.color), - ); + Color get backgroundDarkColor => PaletteDark.backgroundColor; @override Widget trailing(BuildContext context) { final shareImage = Image.asset('assets/images/share.png', - color: Theme.of(context).primaryTextTheme.title.color); + color: Colors.white); return SizedBox( height: 20.0, - width: 14.0, + width: 20.0, child: ButtonTheme( minWidth: double.minPositive, child: FlatButton( - highlightColor: Colors.transparent, - splashColor: Colors.transparent, - padding: EdgeInsets.all(0), - onPressed: () => Share.text(S.current.share_address, - addressListViewModel.address.address, 'text/plain'), - child: shareImage), + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + padding: EdgeInsets.all(0), + onPressed: () => Share.text(S.current.share_address, + addressListViewModel.address.address, 'text/plain'), + child: shareImage), ), ); } @override Widget body(BuildContext context) { - final copyImage = Image.asset('assets/images/copy_content.png', - color: Theme.of(context).primaryTextTheme.title.color); - return SingleChildScrollView( child: Column( children: [ - SizedBox(height: 25), - Row(children: [ - Spacer(flex: 4), - Observer( - builder: (_) => Flexible( - flex: 6, - child: Center( - child: AspectRatio( - aspectRatio: 1.0, - child: QrImage( - data: addressListViewModel.uri.toString(), - backgroundColor: Colors.transparent, - foregroundColor: Theme.of(context) - .primaryTextTheme - .display4 - .color, - ))))), - Spacer(flex: 4) - ]), Padding( - padding: EdgeInsets.fromLTRB(24, 40, 24, 0), - child: Row( - children: [ - Expanded( - child: Form( - key: _formKey, - child: BaseTextFormField( - controller: amountController, - keyboardType: - TextInputType.numberWithOptions(decimal: true), - inputFormatters: [ - BlacklistingTextInputFormatter( - RegExp('[\\-|\\ |\\,]')) - ], - textAlign: TextAlign.center, - hintText: S.of(context).receive_amount, - borderColor: Theme.of(context) - .primaryTextTheme - .headline5 - .color - .withOpacity(0.4), - validator: AmountValidator(), - autovalidate: true, - placeholderTextStyle: TextStyle( - color: Theme.of(context) - .primaryTextTheme - .headline5 - .color, - fontSize: 20, - fontWeight: FontWeight.w600)))) - ], + padding: EdgeInsets.fromLTRB(24, 80, 24, 40), + child: QRWidget( + addressListViewModel: addressListViewModel, + isAmountFieldShow: true, ), ), - Padding( - padding: EdgeInsets.only(left: 24, right: 24, bottom: 40, top: 40), - child: Builder( - builder: (context) => Observer( - builder: (context) => GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData( - text: addressListViewModel.address.address)); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text( - S.of(context).copied_to_clipboard, - style: TextStyle(color: Colors.white), - ), - backgroundColor: Colors.green, - duration: Duration(milliseconds: 500), - )); - }, - child: Container( - height: 48, - padding: EdgeInsets.only(left: 24, right: 24), - decoration: BoxDecoration( - borderRadius: - BorderRadius.all(Radius.circular(24)), - color: Theme.of(context) - .primaryTextTheme - .overline - .color), - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - child: Text( - addressListViewModel.address.address, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - color: Theme.of(context) - .primaryTextTheme - .title - .color), - ), - ), - Padding( - padding: EdgeInsets.only(left: 12), - child: copyImage, - ) - ], - ), - ), - ))), - ), Observer( builder: (_) => ListView.separated( separatorBuilder: (context, _) => - Divider(height: 1, color: Theme.of(context).dividerColor), + Container(height: 1, color: PaletteDark.dividerColor), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: addressListViewModel.items.length, @@ -210,8 +83,7 @@ class ReceivePage extends BasePage { icon: Icon( Icons.arrow_forward_ios, size: 14, - color: - Theme.of(context).primaryTextTheme.title.color, + color: Colors.white, )); } @@ -223,28 +95,40 @@ class ReceivePage extends BasePage { icon: Icon( Icons.add, size: 20, - color: - Theme.of(context).primaryTextTheme.title.color, + color: Colors.white, )); } if (item is WalletAddressListItem) { cell = Observer( - builder: (_) => AddressCell.fromItem(item, - isCurrent: item.address == - addressListViewModel.address.address, - onTap: (_) => addressListViewModel.address = item, - onEdit: () => Navigator.of(context).pushNamed( - Routes.newSubaddress, - arguments: item))); + builder: (_) { + final isCurrent = item.address == + addressListViewModel.address.address; + final backgroundColor = isCurrent + ? PaletteDark.lightOceanBlue + : PaletteDark.nightBlue; + final textColor = isCurrent + ? Colors.blue + : Colors.white; + + return AddressCell.fromItem(item, + isCurrent: isCurrent, + backgroundColor: backgroundColor, + textColor: textColor, + onTap: (_) => addressListViewModel.address = item, + onEdit: () => Navigator.of(context).pushNamed( + Routes.newSubaddress, + arguments: item)); + } + ); } return index != 0 ? cell : ClipRRect( borderRadius: BorderRadius.only( - topLeft: Radius.circular(24), - topRight: Radius.circular(24)), + topLeft: Radius.circular(30), + topRight: Radius.circular(30)), child: cell, ); })), diff --git a/lib/src/screens/receive/widgets/address_cell.dart b/lib/src/screens/receive/widgets/address_cell.dart index 5e725583b..153a3f51e 100644 --- a/lib/src/screens/receive/widgets/address_cell.dart +++ b/lib/src/screens/receive/widgets/address_cell.dart @@ -6,12 +6,16 @@ import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_i class AddressCell extends StatelessWidget { factory AddressCell.fromItem(WalletAddressListItem item, {@required bool isCurrent, + @required Color backgroundColor, + @required Color textColor, Function(String) onTap, Function() onEdit}) => AddressCell( address: item.address, name: item.name, isCurrent: isCurrent, + backgroundColor: backgroundColor, + textColor: textColor, onTap: onTap, onEdit: onEdit); @@ -19,12 +23,16 @@ class AddressCell extends StatelessWidget { {@required this.address, @required this.name, @required this.isCurrent, + @required this.backgroundColor, + @required this.textColor, this.onTap, this.onEdit}); final String address; final String name; final bool isCurrent; + final Color backgroundColor; + final Color textColor; final Function(String) onTap; final Function() onEdit; @@ -32,23 +40,19 @@ class AddressCell extends StatelessWidget { @override Widget build(BuildContext context) { - const currentTextColor = Colors.blue; // FIXME: Why it's defined here ? - final currentColor = - Theme.of(context).accentTextTheme.subtitle.decorationColor; - final notCurrentColor = Theme.of(context).backgroundColor; - final notCurrentTextColor = - Theme.of(context).primaryTextTheme.caption.color; final Widget cell = InkWell( onTap: () => onTap(address), child: Container( - color: isCurrent ? currentColor : notCurrentColor, + color: backgroundColor, padding: EdgeInsets.only(left: 24, right: 24, top: 28, bottom: 28), child: Text( name ?? address, + maxLines: 1, + overflow: TextOverflow.ellipsis, style: TextStyle( - fontSize: name?.isNotEmpty ?? false ? 18 : 10, + fontSize: 18, fontWeight: FontWeight.w600, - color: isCurrent ? currentTextColor : notCurrentTextColor, + color: textColor, ), ), )); @@ -62,7 +66,7 @@ class AddressCell extends StatelessWidget { secondaryActions: [ IconSlideAction( caption: S.of(context).edit, - color: Theme.of(context).primaryTextTheme.overline.color, + color: Colors.blue, icon: Icons.edit, onTap: () => onEdit?.call()) ]); diff --git a/lib/src/screens/receive/widgets/header_tile.dart b/lib/src/screens/receive/widgets/header_tile.dart index 84ed2b526..effb7349e 100644 --- a/lib/src/screens/receive/widgets/header_tile.dart +++ b/lib/src/screens/receive/widgets/header_tile.dart @@ -23,7 +23,7 @@ class HeaderTile extends StatelessWidget { top: 24, bottom: 24 ), - color: Theme.of(context).backgroundColor, + color: PaletteDark.nightBlue, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -33,7 +33,7 @@ class HeaderTile extends StatelessWidget { style: TextStyle( fontSize: 18, fontWeight: FontWeight.w500, - color: Theme.of(context).primaryTextTheme.title.color + color: Colors.white ), ), Container( @@ -41,7 +41,7 @@ class HeaderTile extends StatelessWidget { width: 32, decoration: BoxDecoration( shape: BoxShape.circle, - color: Theme.of(context).primaryTextTheme.overline.color + color: PaletteDark.distantNightBlue ), child: icon, ) diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index ea78b676d..c8fd78b5f 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -35,10 +35,10 @@ class QRWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Row(children: [ - Spacer(flex: 2), + Spacer(flex: 3), Observer( builder: (_) => Flexible( - flex: 3, + flex: 5, child: Center( child: AspectRatio( aspectRatio: 1.0, @@ -47,12 +47,12 @@ class QRWidget extends StatelessWidget { backgroundColor: Colors.transparent, foregroundColor: PaletteDark.lightBlueGrey, ))))), - Spacer(flex: 2) + Spacer(flex: 3) ]), Padding( padding: EdgeInsets.only(top: 20), child: Text( - 'Scan the QR code to get the address', + S.of(context).scan_qr_code, style: TextStyle( fontSize: 12, fontWeight: FontWeight.w500, @@ -62,7 +62,7 @@ class QRWidget extends StatelessWidget { ), isAmountFieldShow ? Padding( - padding: EdgeInsets.only(top: 60), + padding: EdgeInsets.only(top: 40), child: Row( children: [ Expanded( @@ -78,8 +78,11 @@ class QRWidget extends StatelessWidget { ], textAlign: TextAlign.center, hintText: S.of(context).receive_amount, + textColor: Colors.white, borderColor: PaletteDark.darkGrey, - validator: AmountValidator(), + validator: AmountValidator( + type: addressListViewModel.type + ), autovalidate: true, placeholderTextStyle: TextStyle( color: PaletteDark.cyanBlue, diff --git a/lib/src/screens/subaddress/address_edit_or_create_page.dart b/lib/src/screens/subaddress/address_edit_or_create_page.dart index 84c492196..77eacab88 100644 --- a/lib/src/screens/subaddress/address_edit_or_create_page.dart +++ b/lib/src/screens/subaddress/address_edit_or_create_page.dart @@ -8,6 +8,7 @@ import 'package:cake_wallet/core/address_label_validator.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/palette.dart'; class AddressEditOrCreatePage extends BasePage { AddressEditOrCreatePage({@required this.addressEditOrCreateViewModel}) @@ -28,6 +29,12 @@ class AddressEditOrCreatePage extends BasePage { @override String get title => S.current.new_subaddress_title; + @override + Color get backgroundLightColor => PaletteDark.backgroundColor; + + @override + Color get backgroundDarkColor => PaletteDark.backgroundColor; + @override Widget body(BuildContext context) { reaction((_) => addressEditOrCreateViewModel.state, @@ -48,6 +55,7 @@ class AddressEditOrCreatePage extends BasePage { child: Center( child: BaseTextFormField( controller: _labelController, + textColor: Colors.white, hintText: S.of(context).new_subaddress_label_name, validator: AddressLabelValidator()))), Observer( diff --git a/lib/src/widgets/alert_background.dart b/lib/src/widgets/alert_background.dart new file mode 100644 index 000000000..db73e7c0d --- /dev/null +++ b/lib/src/widgets/alert_background.dart @@ -0,0 +1,26 @@ +import 'dart:ui'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/palette.dart'; + +class AlertBackground extends StatelessWidget { + AlertBackground({@required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + height: double.infinity, + width: double.infinity, + color: Colors.transparent, + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0), + child: Container( + decoration: BoxDecoration(color: PaletteDark.darkNightBlue.withOpacity(0.75)), + child: child, + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/widgets/alert_close_button.dart b/lib/src/widgets/alert_close_button.dart new file mode 100644 index 000000000..0f21be5df --- /dev/null +++ b/lib/src/widgets/alert_close_button.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class AlertCloseButton extends StatelessWidget { + AlertCloseButton({@required this.image}); + + final Image image; + + @override + Widget build(BuildContext context) { + return Positioned( + bottom: 24, + child: GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Container( + height: 42, + width: 42, + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle + ), + child: Center( + child: image, + ), + ), + ) + ); + } +} \ No newline at end of file diff --git a/lib/src/widgets/cake_scrollbar.dart b/lib/src/widgets/cake_scrollbar.dart new file mode 100644 index 000000000..6258e5f0b --- /dev/null +++ b/lib/src/widgets/cake_scrollbar.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:cake_wallet/palette.dart'; + +class CakeScrollbar extends StatelessWidget { + CakeScrollbar({ + @required this.backgroundHeight, + @required this.thumbHeight, + @required this.fromTop + }); + + final double backgroundHeight; + final double thumbHeight; + final double fromTop; + + @override + Widget build(BuildContext context) { + return Positioned( + right: 6, + child: Container( + height: backgroundHeight, + width: 6, + decoration: BoxDecoration( + color: PaletteDark.violetBlue, + borderRadius: BorderRadius.all(Radius.circular(3)) + ), + child: Stack( + children: [ + AnimatedPositioned( + duration: Duration(milliseconds: 0), + top: fromTop, + child: Container( + height: thumbHeight, + width: 6.0, + decoration: BoxDecoration( + color: PaletteDark.wildBlueGrey, + borderRadius: BorderRadius.all(Radius.circular(3)) + ), + ), + ) + ], + ), + ) + ); + } +} \ No newline at end of file diff --git a/lib/store/dashboard/page_view_store.dart b/lib/store/dashboard/page_view_store.dart new file mode 100644 index 000000000..30b938519 --- /dev/null +++ b/lib/store/dashboard/page_view_store.dart @@ -0,0 +1,19 @@ +import 'package:mobx/mobx.dart'; + +part 'page_view_store.g.dart'; + +class PageViewStore = PageViewStoreBase with _$PageViewStore; + +abstract class PageViewStoreBase with Store { + PageViewStoreBase() { + setCurrentPage(1); + } + + @observable + double currentPage; + + @action + void setCurrentPage(double currentPage) { + this.currentPage = currentPage; + } +} \ No newline at end of file diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 322dd4403..64530b655 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -22,6 +22,7 @@ import 'package:cake_wallet/store/dashboard/trades_store.dart'; import 'package:cake_wallet/store/dashboard/trade_filter_store.dart'; import 'package:cake_wallet/store/dashboard/transaction_filter_store.dart'; import 'package:cake_wallet/view_model/dashboard/formatted_item_list.dart'; +import 'package:cake_wallet/store/dashboard/page_view_store.dart'; part 'dashboard_view_model.g.dart'; @@ -33,7 +34,8 @@ abstract class DashboardViewModelBase with Store { this.appStore, this.tradesStore, this.tradeFilterStore, - this.transactionFilterStore}) { + this.transactionFilterStore, + this.pageViewStore}) { name = appStore.wallet?.name; wallet ??= appStore.wallet; @@ -53,8 +55,6 @@ abstract class DashboardViewModelBase with Store { if (_wallet is MoneroWallet) { subname = _wallet.account?.label; } - - currentPage = 1; } @observable @@ -63,15 +63,15 @@ abstract class DashboardViewModelBase with Store { @observable String name; - @observable - double currentPage; - @observable ObservableList transactions; @observable String subname; + @computed + double get currentPage => pageViewStore.currentPage; + @computed String get address => wallet.address; @@ -130,6 +130,8 @@ abstract class DashboardViewModelBase with Store { TransactionFilterStore transactionFilterStore; + PageViewStore pageViewStore; + ReactionDisposer _reaction; void _onWalletChange(WalletBase wallet) { diff --git a/lib/view_model/monero_account_list/monero_account_list_view_model.dart b/lib/view_model/monero_account_list/monero_account_list_view_model.dart index e7ad6e4e9..c03fee8a3 100644 --- a/lib/view_model/monero_account_list/monero_account_list_view_model.dart +++ b/lib/view_model/monero_account_list/monero_account_list_view_model.dart @@ -9,7 +9,15 @@ class MoneroAccountListViewModel = MoneroAccountListViewModelBase with _$MoneroAccountListViewModel; abstract class MoneroAccountListViewModelBase with Store { - MoneroAccountListViewModelBase(this._moneroWallet); + MoneroAccountListViewModelBase(this._moneroWallet) : scrollOffsetFromTop = 0; + + @observable + double scrollOffsetFromTop; + + @action + void setScrollOffsetFromTop(double scrollOffsetFromTop) { + this.scrollOffsetFromTop = scrollOffsetFromTop; + } @computed List get accounts => _moneroWallet.accountList.accounts diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index e36dc18cb..4f2e3662c 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -7,6 +7,7 @@ import 'package:cake_wallet/utils/list_item.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_account_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; +import 'package:cake_wallet/src/domain/common/wallet_type.dart'; part 'wallet_address_list_view_model.g.dart'; @@ -62,6 +63,9 @@ abstract class WalletAddressListViewModelBase with Store { @observable String amount; + @computed + WalletType get type => _wallet.type; + @computed WalletAddressListItem get address => WalletAddressListItem(address: _wallet.address); diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index d5734da89..ab55c612f 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -137,6 +137,8 @@ "share_address" : "Adresse teilen ", "receive_amount" : "Menge", "subaddresses" : "Unteradressen", + "addresses" : "Adressen", + "scan_qr_code" : "Scannen Sie den QR-Code, um die Adresse zu erhalten", "rename" : "Umbenennen", "choose_account" : "Konto auswählen", "create_new_account" : "Neues Konto erstellen", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 64f3722a8..50dd4ee2f 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -138,6 +138,7 @@ "receive_amount" : "Amount", "subaddresses" : "Subaddresses", "addresses" : "Addresses", + "scan_qr_code" : "Scan the QR code to get the address", "rename" : "Rename", "choose_account" : "Choose account", "create_new_account" : "Create new account", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 47df624e1..2197f620c 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -137,6 +137,8 @@ "share_address" : "Compartir dirección", "receive_amount" : "Cantidad", "subaddresses" : "Subdirecciones", + "addresses" : "Direcciones", + "scan_qr_code" : "Escanee el código QR para obtener la dirección", "rename" : "Rebautizar", "choose_account" : "Elegir cuenta", "create_new_account" : "Crear una nueva cuenta", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 309918d7f..dd11bf3b2 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -137,6 +137,8 @@ "share_address" : "पता साझा करें", "receive_amount" : "रकम", "subaddresses" : "उप पते", + "addresses" : "पतों", + "scan_qr_code" : "पता प्राप्त करने के लिए QR कोड स्कैन करें", "rename" : "नाम बदलें", "choose_account" : "खाता चुनें", "create_new_account" : "नया खाता बनाएँ", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 91dc1e5ab..cc6fedefa 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -137,6 +137,8 @@ "share_address" : "住所を共有する", "receive_amount" : "量", "subaddresses" : "サブアドレス", + "addresses" : "住所", + "scan_qr_code" : "QRコードをスキャンして住所を取得します", "rename" : "リネーム", "choose_account" : "アカウントを選択", "create_new_account" : "新しいアカウントを作成する", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 896aae13a..1cd5afc1b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -137,6 +137,8 @@ "share_address" : "주소 공유", "receive_amount" : "양", "subaddresses" : "하위 주소", + "addresses" : "구애", + "scan_qr_code" : "QR 코드를 스캔하여 주소를 얻습니다.", "rename" : "이름 바꾸기", "choose_account" : "계정을 선택하십시오", "create_new_account" : "새 계정을 만들", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index f53b1d0b6..912fa39ec 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -138,6 +138,8 @@ "receive_amount" : "Bedrag", "subaddresses" : "Subadressen", "rename" : "Hernoemen", + "addresses" : "Adressen", + "scan_qr_code" : "Scan de QR-code om het adres te krijgen", "choose_account" : "Kies account", "create_new_account" : "Creëer een nieuw account", "accounts_subaddresses" : "Accounts en subadressen", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 9a8685746..941a7d550 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -137,6 +137,8 @@ "share_address" : "Udostępnij adres", "receive_amount" : "Ilość", "subaddresses" : "Podadresy", + "addresses" : "Adresy", + "scan_qr_code" : "Zeskanuj kod QR, aby uzyskać adres", "rename" : "Przemianować", "choose_account" : "Wybierz konto", "create_new_account" : "Stwórz nowe konto", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 9e86dbd3a..221fc2a1d 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -137,6 +137,8 @@ "share_address" : "Compartilhar endereço", "receive_amount" : "Quantia", "subaddresses" : "Sub-endereços", + "addresses" : "Endereços", + "scan_qr_code" : "Digitalize o código QR para obter o endereço", "rename" : "Renomear", "choose_account" : "Escolha uma conta", "create_new_account" : "Criar nova conta", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 2ac29cd73..4df1d4bd6 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -137,6 +137,8 @@ "share_address" : "Поделиться адресом", "receive_amount" : "Сумма", "subaddresses" : "Субадреса", + "addresses" : "Адреса", + "scan_qr_code" : "Отсканируйте QR-код для получения адреса", "rename" : "Переименовать", "choose_account" : "Выберите аккаунт", "create_new_account" : "Создать новый аккаунт", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index cb22979fe..1f8eda1fd 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -137,6 +137,8 @@ "share_address" : "Поділитися адресою", "receive_amount" : "Сума", "subaddresses" : "Субадреси", + "addresses" : "Адреси", + "scan_qr_code" : "Скануйте QR-код для одержання адреси", "rename" : "Перейменувати", "choose_account" : "Оберіть акаунт", "create_new_account" : "Створити новий акаунт", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 026880af4..1bda1fe86 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -137,6 +137,8 @@ "share_address" : "分享地址", "receive_amount" : "量", "subaddresses" : "子地址", + "addresses" : "地址", + "scan_qr_code" : "掃描二維碼獲取地址", "rename" : "改名", "choose_account" : "選擇帳號", "create_new_account" : "建立新帳戶",