From fe147ff9eda0fef9c4bb277773788dfc0cfd501f Mon Sep 17 00:00:00 2001 From: M Date: Wed, 30 Sep 2020 21:23:15 +0300 Subject: [PATCH] Fixes --- ios/Flutter/.last_build_id | 2 +- ios/Runner.xcodeproj/project.pbxproj | 6 +- .../AppIcon.appiconset/Contents.json | 57 ++-- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../AppIcon.appiconset/cake_xmr_1024.png | Bin 0 -> 23662 bytes .../AppIcon.appiconset/cake_xmr_120.png | Bin 0 -> 10387 bytes .../AppIcon.appiconset/cake_xmr_180.png | Bin 0 -> 14781 bytes lib/entities/node.dart | 7 +- lib/entities/node_list.dart | 6 +- lib/monero/monero_subaddress_list.dart | 18 +- lib/monero/monero_wallet_service.dart | 2 +- lib/monero/subaddress.dart | 5 +- lib/src/screens/auth/auth_page.dart | 87 +++--- .../screens/contact/contact_list_page.dart | 23 +- lib/src/screens/dashboard/wallet_menu.dart | 15 +- .../exchange/widgets/exchange_card.dart | 11 +- .../exchange_trade/exchange_confirm_page.dart | 160 ++++++----- .../exchange_trade/exchange_trade_page.dart | 254 +++++++++--------- lib/src/screens/login/login_page.dart | 114 -------- lib/src/screens/receive/receive_page.dart | 4 +- .../screens/receive/widgets/qr_widget.dart | 168 ++++++------ lib/src/screens/seed/wallet_seed_page.dart | 183 ++++++------- lib/src/screens/send/send_page.dart | 30 ++- .../trade_details/trade_details_page.dart | 10 +- .../transaction_details_page.dart | 11 +- .../screens/wallet_keys/wallet_keys_page.dart | 13 +- .../screens/wallet_list/wallet_list_page.dart | 161 ++++++++--- lib/src/widgets/address_text_field.dart | 4 +- lib/utils/mobx.dart | 8 +- lib/utils/show_bar.dart | 47 ++++ lib/view_model/send/send_view_model.dart | 11 +- .../wallet_address_list_view_model.dart | 7 +- .../wallet_list/wallet_list_view_model.dart | 1 + pubspec.lock | 7 + pubspec.yaml | 1 + 49 files changed, 702 insertions(+), 731 deletions(-) delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/cake_xmr_1024.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/cake_xmr_120.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/cake_xmr_180.png delete mode 100644 lib/src/screens/login/login_page.dart create mode 100644 lib/utils/show_bar.dart diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index c4f58572f..0c913ed64 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -bc336703210c48e30d7216fac3fe1c0f \ No newline at end of file +4dc2ef1ba73deeed13cd85894dacb10b \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 333591d2d..c0d7cb8e8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -354,7 +354,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -493,7 +493,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -526,7 +526,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fab2..6613d9583 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,117 +1,96 @@ { "images" : [ { - "size" : "20x20", "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", + "size" : "20x20", "scale" : "2x" }, { - "size" : "20x20", "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", + "size" : "20x20", "scale" : "3x" }, { - "size" : "29x29", "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { - "size" : "29x29", "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", + "size" : "29x29", "scale" : "3x" }, { - "size" : "40x40", "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", + "size" : "40x40", "scale" : "2x" }, { - "size" : "40x40", "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", + "size" : "40x40", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", + "filename" : "cake_xmr_120.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", + "filename" : "cake_xmr_180.png", "scale" : "3x" }, { + "idiom" : "ipad", "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", "scale" : "1x" }, { + "idiom" : "ipad", "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", "scale" : "2x" }, { + "idiom" : "ipad", "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", "scale" : "1x" }, { + "idiom" : "ipad", "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { - "size" : "40x40", "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", + "size" : "40x40", "scale" : "1x" }, { - "size" : "40x40", "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", + "size" : "40x40", "scale" : "2x" }, { - "size" : "76x76", "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", + "size" : "76x76", "scale" : "1x" }, { - "size" : "76x76", "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", + "size" : "76x76", "scale" : "2x" }, { + "idiom" : "ipad", "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", "scale" : "2x" }, { "size" : "1024x1024", "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", + "filename" : "cake_xmr_1024.png", "scale" : "1x" } ], @@ -119,4 +98,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4725e9b0ddb1deab583e5b5102493aa332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 literal 0 HcmV?d00001 diff --git a/lib/entities/node.dart b/lib/entities/node.dart index d96834dcb..f307111d2 100644 --- a/lib/entities/node.dart +++ b/lib/entities/node.dart @@ -39,12 +39,17 @@ class Node extends HiveObject with Keyable { int typeRaw; @override - dynamic get keyIndex => key; + dynamic get keyIndex { + _keyIndex ??= key; + return _keyIndex; + } WalletType get type => deserializeFromInt(typeRaw); set type(WalletType type) => typeRaw = serializeToInt(type); + dynamic _keyIndex; + Future requestNode() async { try { switch (type) { diff --git a/lib/entities/node_list.dart b/lib/entities/node_list.dart index 118394e6f..470b9bc99 100644 --- a/lib/entities/node_list.dart +++ b/lib/entities/node_list.dart @@ -39,9 +39,9 @@ Future> loadElectrumServerList() async { Future resetToDefault(Box nodeSource) async { final moneroNodes = await loadDefaultNodes(); - final bitcoinElectrumServerList = await loadElectrumServerList(); - final nodes = moneroNodes + bitcoinElectrumServerList; + // final bitcoinElectrumServerList = await loadElectrumServerList(); + // final nodes = moneroNodes + bitcoinElectrumServerList; await nodeSource.clear(); - await nodeSource.addAll(nodes); + await nodeSource.addAll(moneroNodes); } diff --git a/lib/monero/monero_subaddress_list.dart b/lib/monero/monero_subaddress_list.dart index 14df05912..1a9c56ec7 100644 --- a/lib/monero/monero_subaddress_list.dart +++ b/lib/monero/monero_subaddress_list.dart @@ -39,8 +39,22 @@ abstract class MoneroSubaddressListBase with Store { } List getAll() { - return subaddress_list - .getAllSubaddresses() + final subaddresses = subaddress_list.getAllSubaddresses(); + if (subaddresses.length > 1) { + // final primary = subaddresses.first; + // final last = subaddresses.last; + // subaddresses[subaddresses.length - 1] = primary; + // subaddresses[0] = last; + + // for (var i = subaddresses.length - 1; i >= 0; i--) { + // final pre = subaddresses[i]; + // final post = subaddresses[subaddresses.length - i]; + // subaddresses[subaddresses.length - i] = pre; + // subaddresses[i] = post; + // } + } + + return subaddresses .map((subaddressRow) => Subaddress.fromRow(subaddressRow)) .toList(); } diff --git a/lib/monero/monero_wallet_service.dart b/lib/monero/monero_wallet_service.dart index cb968e08a..5ff0c032f 100644 --- a/lib/monero/monero_wallet_service.dart +++ b/lib/monero/monero_wallet_service.dart @@ -88,7 +88,7 @@ class MoneroWalletService extends WalletService< Future openWallet(String name, String password) async { try { final path = await pathForWallet(name: name, type: WalletType.monero); - monero_wallet_manager.openWallet(path: path, password: password); + await monero_wallet_manager.openWalletAsync({'path': path, 'password': password}); final walletInfo = walletInfoSource.values.firstWhere( (info) => info.id == WalletBase.idFor(name, WalletType.monero), orElse: () => null); final wallet = MoneroWallet( diff --git a/lib/monero/subaddress.dart b/lib/monero/subaddress.dart index fce417fa9..cb230044a 100644 --- a/lib/monero/subaddress.dart +++ b/lib/monero/subaddress.dart @@ -11,7 +11,10 @@ class Subaddress { Subaddress.fromRow(SubaddressRow row) : this.id = row.getId(), this.address = row.getAddress(), - this.label = row.getLabel(); + this.label = row.getId() == 0 && + row.getLabel().toLowerCase() == 'Primary account'.toLowerCase() + ? 'Primary address' + : row.getLabel(); final int id; final String address; diff --git a/lib/src/screens/auth/auth_page.dart b/lib/src/screens/auth/auth_page.dart index 37f03f5c3..82d765fd6 100644 --- a/lib/src/screens/auth/auth_page.dart +++ b/lib/src/screens/auth/auth_page.dart @@ -1,3 +1,5 @@ +import 'package:cake_wallet/utils/show_bar.dart'; +import 'package:flushbar/flushbar.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; @@ -29,6 +31,8 @@ class AuthPageState extends State { final _backArrowImageDarkTheme = Image.asset('assets/images/close_button.png'); ReactionDisposer _reaction; + Flushbar _authBar; + Flushbar _progressBar; @override void initState() { @@ -39,37 +43,26 @@ class AuthPageState extends State { if (widget.onAuthenticationFinished != null) { widget.onAuthenticationFinished(true, this); } else { - _key.currentState.showSnackBar( - SnackBar( - content: Text(S.of(context).authenticated), - backgroundColor: Colors.green, - ), - ); + _authBar?.dismiss(); + showBar(context, S.of(context).authenticated); } }); } if (state is IsExecutingState) { WidgetsBinding.instance.addPostFrameCallback((_) { - _key.currentState.showSnackBar( - SnackBar( - content: Text(S.of(context).authentication), - backgroundColor: Colors.green, - ), - ); + _authBar = + createBar(S.of(context).authentication, duration: null) + ..show(context); }); } if (state is FailureState) { WidgetsBinding.instance.addPostFrameCallback((_) { _pinCodeKey.currentState.clear(); - _key.currentState.hideCurrentSnackBar(); - _key.currentState.showSnackBar( - SnackBar( - content: Text(S.of(context).failed_authentication(state.error)), - backgroundColor: Colors.red, - ), - ); + _authBar?.dismiss(); + showBar( + context, S.of(context).failed_authentication(state.error)); if (widget.onAuthenticationFinished != null) { widget.onAuthenticationFinished(false, this); @@ -80,13 +73,9 @@ class AuthPageState extends State { if (state is AuthenticationBanned) { WidgetsBinding.instance.addPostFrameCallback((_) { _pinCodeKey.currentState.clear(); - _key.currentState.hideCurrentSnackBar(); - _key.currentState.showSnackBar( - SnackBar( - content: Text(S.of(context).failed_authentication(state.error)), - backgroundColor: Colors.red, - ), - ); + _authBar?.dismiss(); + showBar( + context, S.of(context).failed_authentication(state.error)); if (widget.onAuthenticationFinished != null) { widget.onAuthenticationFinished(false, this); @@ -111,10 +100,22 @@ class AuthPageState extends State { super.dispose(); } - void changeProcessText(String text) => _key.currentState.showSnackBar( - SnackBar(content: Text(text), backgroundColor: Colors.green)); + void changeProcessText(String text) { + _authBar?.dismiss(); + _progressBar = createBar(text, duration: null) + ..show(_key.currentContext); + } - void close() => Navigator.of(_key.currentContext).pop(); + void hideProgressText() { + _progressBar?.dismiss(); + _progressBar = null; + } + + void close() { + _authBar?.dismiss(); + _progressBar?.dismiss(); + Navigator.of(_key.currentContext).pop(); + } @override Widget build(BuildContext context) { @@ -123,20 +124,20 @@ class AuthPageState extends State { appBar: CupertinoNavigationBar( leading: widget.closable ? Container( - padding: EdgeInsets.only(top: 10), - child: SizedBox( - height: 37, - width: 37, - child: ButtonTheme( - minWidth: double.minPositive, - child: FlatButton( - highlightColor: Colors.transparent, - splashColor: Colors.transparent, - padding: EdgeInsets.all(0), - onPressed: () => Navigator.of(context).pop(), - child: _backArrowImageDarkTheme), - ), - )) + padding: EdgeInsets.only(top: 10), + child: SizedBox( + height: 37, + width: 37, + child: ButtonTheme( + minWidth: double.minPositive, + child: FlatButton( + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + padding: EdgeInsets.all(0), + onPressed: () => Navigator.of(context).pop(), + child: _backArrowImageDarkTheme), + ), + )) : Container(), backgroundColor: Theme.of(context).backgroundColor, border: null), diff --git a/lib/src/screens/contact/contact_list_page.dart b/lib/src/screens/contact/contact_list_page.dart index 5344c4736..dee016ee8 100644 --- a/lib/src/screens/contact/contact_list_page.dart +++ b/lib/src/screens/contact/contact_list_page.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; @@ -56,16 +57,6 @@ class ContactListPage extends BasePage { @override Widget body(BuildContext context) { - final shortDivider = Container( - height: 1, - padding: EdgeInsets.only(left: 24), - color: Theme.of(context).backgroundColor, - child: Container( - height: 1, - color: Theme.of(context).primaryTextTheme.title.backgroundColor, - ), - ); - return Container( padding: EdgeInsets.only(top: 20.0, bottom: 20.0), child: Observer( @@ -92,16 +83,8 @@ class ContactListPage extends BasePage { if (isCopied != null && isCopied) { await Clipboard.setData( ClipboardData(text: contact.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: 1500), - ), - ); + await showBar(context, + S.of(context).copied_to_clipboard); } }, child: Column( diff --git a/lib/src/screens/dashboard/wallet_menu.dart b/lib/src/screens/dashboard/wallet_menu.dart index d06068c89..3d1d80026 100644 --- a/lib/src/screens/dashboard/wallet_menu.dart +++ b/lib/src/screens/dashboard/wallet_menu.dart @@ -13,6 +13,7 @@ class WalletMenu { final List items = [ S.current.reconnect, + S.current.rescan, S.current.wallets, S.current.nodes, S.current.show_seed, @@ -23,6 +24,7 @@ class WalletMenu { final List images = [ Image.asset('assets/images/reconnect_menu.png', height: 16, width: 16), + Image.asset('assets/images/filter_icon.png', height: 16, width: 16), Image.asset('assets/images/wallet_menu.png', height: 16, width: 16), Image.asset('assets/images/nodes_menu.png', height: 16, width: 16), Image.asset('assets/images/eye_menu.png', height: 16, width: 16), @@ -40,12 +42,15 @@ class WalletMenu { _presentReconnectAlert(context); break; case 1: - Navigator.of(context).pushNamed(Routes.walletList); + Navigator.of(context).pushNamed(Routes.rescan); break; case 2: - Navigator.of(context).pushNamed(Routes.nodeList); + Navigator.of(context).pushNamed(Routes.walletList); break; case 3: + Navigator.of(context).pushNamed(Routes.nodeList); + break; + case 4: Navigator.of(context).pushNamed(Routes.auth, arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) => isAuthenticatedSuccessfully @@ -53,7 +58,7 @@ class WalletMenu { : null); break; - case 4: + case 5: Navigator.of(context).pushNamed(Routes.auth, arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) => isAuthenticatedSuccessfully @@ -61,10 +66,10 @@ class WalletMenu { .popAndPushNamed(Routes.showKeys) : null); break; - case 5: + case 6: Navigator.of(context).pushNamed(Routes.addressBook); break; - case 6: + case 7: Navigator.of(context).pushNamed(Routes.settings); break; default: diff --git a/lib/src/screens/exchange/widgets/exchange_card.dart b/lib/src/screens/exchange/widgets/exchange_card.dart index e88f1b966..7706e7271 100644 --- a/lib/src/screens/exchange/widgets/exchange_card.dart +++ b/lib/src/screens/exchange/widgets/exchange_card.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; @@ -270,14 +271,8 @@ class ExchangeCardState extends State { onTap: () { Clipboard.setData( ClipboardData(text: addressController.text)); - 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), - )); + showBar(context, + S.of(context).copied_to_clipboard); }, child: Row( mainAxisSize: MainAxisSize.max, diff --git a/lib/src/screens/exchange_trade/exchange_confirm_page.dart b/lib/src/screens/exchange_trade/exchange_confirm_page.dart index 5e007a250..8fd4883df 100644 --- a/lib/src/screens/exchange_trade/exchange_confirm_page.dart +++ b/lib/src/screens/exchange_trade/exchange_confirm_page.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/store/dashboard/trades_store.dart'; +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -25,91 +26,84 @@ class ExchangeConfirmPage extends BasePage { children: [ Expanded( child: Column( - children: [ - Flexible( - child: Center( - child: Text( - S.of(context).exchange_result_write_down_trade_id, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.w500, - color: Theme.of(context).primaryTextTheme.title.color), + children: [ + Flexible( + child: Center( + child: Text( + S.of(context).exchange_result_write_down_trade_id, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, + color: Theme.of(context).primaryTextTheme.title.color), + ), + )), + Container( + height: 178, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(30)), + border: Border.all( + width: 1, + color: Theme.of(context).accentTextTheme.caption.color), + color: Theme.of(context).accentTextTheme.title.color), + child: Column( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.all(24), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + S.of(context).trade_id, + style: TextStyle( + fontSize: 12.0, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .primaryTextTheme + .overline + .color), + ), + Text( + trade.id, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: Theme.of(context) + .primaryTextTheme + .title + .color), + ), + ], + ), + )), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 10, 10), + child: Builder( + builder: (context) => PrimaryButton( + onPressed: () { + Clipboard.setData(ClipboardData(text: trade.id)); + showBar( + context, S.of(context).copied_to_clipboard); + }, + text: S.of(context).copy_id, + color: Theme.of(context) + .accentTextTheme + .caption + .backgroundColor, + textColor: + Theme.of(context).primaryTextTheme.title.color), ), ) - ), - Container( - height: 178, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30)), - border: Border.all( - width: 1, - color: Theme.of(context).accentTextTheme.caption.color - ), - color: Theme.of(context).accentTextTheme.title.color - ), - child: Column( - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.all(24), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - S.of(context).trade_id, - style: TextStyle( - fontSize: 12.0, - fontWeight: FontWeight.w500, - color: Theme.of(context).primaryTextTheme.overline.color - ), - ), - Text( - trade.id, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - color: Theme.of(context).primaryTextTheme.title.color - ), - ), - ], - ), - ) - ), - Padding( - padding: EdgeInsets.fromLTRB(10, 0, 10, 10), - child: Builder( - builder: (context) => PrimaryButton( - onPressed: () { - Clipboard.setData(ClipboardData(text: trade.id)); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text( - S.of(context).copied_to_clipboard, - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white), - ), - backgroundColor: Colors.green, - duration: Duration(milliseconds: 1500), - )); - }, - text: S.of(context).copy_id, - color: Theme.of(context).accentTextTheme.caption.backgroundColor, - textColor: Theme.of(context).primaryTextTheme.title.color - ), - ), - ) - ], - ), - ), - Flexible( - child: Offstage() - ), - ], - ) - ), + ], + ), + ), + Flexible(child: Offstage()), + ], + )), PrimaryButton( onPressed: () => Navigator.of(context) .pushReplacementNamed(Routes.exchangeTrade), diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 945bb298d..cfadd48ff 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -4,6 +4,7 @@ import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/src/screens/exchange_trade/exchange_trade_item.dart'; import 'package:cake_wallet/src/screens/exchange_trade/information_page.dart'; import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart'; import 'package:mobx/mobx.dart'; @@ -13,6 +14,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:cake_wallet/generated/i18n.dart'; + // import 'package:cake_wallet/src/stores/exchange_trade/exchange_trade_store.dart'; // import 'package:cake_wallet/src/stores/send/send_store.dart'; // import 'package:cake_wallet/src/stores/send/sending_state.dart'; @@ -25,23 +27,21 @@ import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; -void showInformation(ExchangeTradeViewModel exchangeTradeViewModel, BuildContext context) { +void showInformation( + ExchangeTradeViewModel exchangeTradeViewModel, BuildContext context) { final fetchingLabel = S.current.fetching; final trade = exchangeTradeViewModel.trade; final walletName = exchangeTradeViewModel.wallet.name; final information = exchangeTradeViewModel.isSendable ? S.current.exchange_result_confirm( - trade.amount ?? fetchingLabel, - trade.from.toString(), - walletName) + trade.amount ?? fetchingLabel, trade.from.toString(), walletName) : S.current.exchange_result_description( - trade.amount ?? fetchingLabel, trade.from.toString()); + trade.amount ?? fetchingLabel, trade.from.toString()); showPopUp( - context: context, - builder: (_) => InformationPage(information: information) - ); + context: context, + builder: (_) => InformationPage(information: information)); } class ExchangeTradePage extends BasePage { @@ -73,7 +73,8 @@ class ExchangeTradePage extends BasePage { } @override - Widget body(BuildContext context) => ExchangeTradeForm(exchangeTradeViewModel); + Widget body(BuildContext context) => + ExchangeTradeForm(exchangeTradeViewModel); } class ExchangeTradeForm extends StatefulWidget { @@ -87,6 +88,7 @@ class ExchangeTradeForm extends StatefulWidget { class ExchangeTradeState extends State { final fetchingLabel = S.current.fetching; + String get title => S.current.exchange; bool _effectsInstalled = false; @@ -104,127 +106,133 @@ class ExchangeTradeState extends State { @override Widget build(BuildContext context) { final copyImage = Image.asset('assets/images/copy_content.png', - height: 16, width: 16, + height: 16, + width: 16, color: Theme.of(context).primaryTextTheme.overline.color); //_setEffects(context); return Container( child: ScrollableWithBottomSection( - contentPadding: EdgeInsets.only(top: 10, bottom: 16), - content: Observer(builder: (_) { - final trade = widget.exchangeTradeViewModel.trade; + contentPadding: EdgeInsets.only(top: 10, bottom: 16), + content: Observer(builder: (_) { + final trade = widget.exchangeTradeViewModel.trade; - return Column( - children: [ - trade.expiredAt != null - ? Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - S.of(context).offer_expires_in, - style: TextStyle( - fontSize: 14.0, - fontWeight: FontWeight.w500, - color: Theme.of(context).primaryTextTheme.overline.color), - ), - TimerWidget(trade.expiredAt, - color: Theme.of(context).primaryTextTheme.title.color) - ]) - : Offstage(), - Padding( - padding: EdgeInsets.only(top: 32), - child: Row(children: [ - Spacer(flex: 3), - Flexible( - flex: 4, - child: Center( - child: AspectRatio( - aspectRatio: 1.0, - child: QrImage( - data: trade.inputAddress ?? fetchingLabel, - backgroundColor: Colors.transparent, - foregroundColor: Theme.of(context) - .accentTextTheme.subtitle.color, - )))), - Spacer(flex: 3) - ]), - ), - Padding( - padding: EdgeInsets.only(top: 16), - child: ListView.separated( - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemCount: widget.exchangeTradeViewModel.items.length, - separatorBuilder: (context, index) => Container( - height: 1, - color: Theme.of(context).accentTextTheme.subtitle.backgroundColor, - ), - itemBuilder: (context, index) { - final item = widget.exchangeTradeViewModel.items[index]; - String value; - - final content = Observer( - builder: (_) { - switch (index) { - case 0: - value = '${widget.exchangeTradeViewModel.trade.id ?? fetchingLabel}'; - break; - case 1: - value = '${widget.exchangeTradeViewModel.trade.amount ?? fetchingLabel}'; - break; - case 2: - value = '${widget.exchangeTradeViewModel.trade.state ?? fetchingLabel}'; - break; - case 3: - value = widget.exchangeTradeViewModel.trade.inputAddress ?? fetchingLabel; - break; - } - - return StandartListRow( - title: item.title, - value: value, - valueFontSize: 14, - image: item.isCopied ? copyImage : null, - ); - } - ); - - return item.isCopied - ? Builder( - builder: (context) => - GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData(text: value)); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text( - S.of(context).copied_to_clipboard, - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white), - ), - backgroundColor: Colors.green, - duration: Duration(milliseconds: 1500), - )); - }, - child: content, - ) - ) - : content; - }, + return Column( + children: [ + trade.expiredAt != null + ? Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + S.of(context).offer_expires_in, + style: TextStyle( + fontSize: 14.0, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .primaryTextTheme + .overline + .color), + ), + TimerWidget(trade.expiredAt, + color: Theme.of(context) + .primaryTextTheme + .title + .color) + ]) + : Offstage(), + Padding( + padding: EdgeInsets.only(top: 32), + child: Row(children: [ + Spacer(flex: 3), + Flexible( + flex: 4, + child: Center( + child: AspectRatio( + aspectRatio: 1.0, + child: QrImage( + data: trade.inputAddress ?? fetchingLabel, + backgroundColor: Colors.transparent, + foregroundColor: Theme.of(context) + .accentTextTheme + .subtitle + .color, + )))), + Spacer(flex: 3) + ]), ), - ), - ], - ); - }), - bottomSectionPadding: EdgeInsets.fromLTRB(24, 0, 24, 24), - bottomSection: PrimaryButton( - onPressed: () {}, - text: S.of(context).confirm, - color: Theme.of(context).accentTextTheme.body2.color, - textColor: Colors.white - ) - /*Observer( + Padding( + padding: EdgeInsets.only(top: 16), + child: ListView.separated( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: widget.exchangeTradeViewModel.items.length, + separatorBuilder: (context, index) => Container( + height: 1, + color: Theme.of(context) + .accentTextTheme + .subtitle + .backgroundColor, + ), + itemBuilder: (context, index) { + final item = widget.exchangeTradeViewModel.items[index]; + String value; + + final content = Observer(builder: (_) { + switch (index) { + case 0: + value = + '${widget.exchangeTradeViewModel.trade.id ?? fetchingLabel}'; + break; + case 1: + value = + '${widget.exchangeTradeViewModel.trade.amount ?? fetchingLabel}'; + break; + case 2: + value = + '${widget.exchangeTradeViewModel.trade.state ?? fetchingLabel}'; + break; + case 3: + value = widget.exchangeTradeViewModel.trade + .inputAddress ?? + fetchingLabel; + break; + } + + return StandartListRow( + title: item.title, + value: value, + valueFontSize: 14, + image: item.isCopied ? copyImage : null, + ); + }); + + return item.isCopied + ? Builder( + builder: (context) => GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: value)); + showBar(context, + S.of(context).copied_to_clipboard); + }, + child: content, + )) + : content; + }, + ), + ), + ], + ); + }), + bottomSectionPadding: EdgeInsets.fromLTRB(24, 0, 24, 24), + bottomSection: PrimaryButton( + onPressed: () {}, + text: S.of(context).confirm, + color: Theme.of(context).accentTextTheme.body2.color, + textColor: Colors.white) + /*Observer( builder: (_) => tradeStore.trade.from == CryptoCurrency.xmr && !(sendStore.state is TransactionCommitted) ? LoadingPrimaryButton( @@ -242,7 +250,7 @@ class ExchangeTradeState extends State { color: Colors.blue, textColor: Colors.white) : Offstage()),*/ - ), + ), ); } diff --git a/lib/src/screens/login/login_page.dart b/lib/src/screens/login/login_page.dart deleted file mode 100644 index 684a35d70..000000000 --- a/lib/src/screens/login/login_page.dart +++ /dev/null @@ -1,114 +0,0 @@ -// import 'package:cake_wallet/src/stores/auth/auth_state.dart'; -// import 'package:cake_wallet/src/stores/login/login_store.dart'; -// import 'package:flutter/material.dart'; -// import 'package:flutter/cupertino.dart'; -// import 'package:mobx/mobx.dart'; -// import 'package:provider/provider.dart'; -// import 'package:cake_wallet/src/screens/pin_code/pin_code.dart'; -// import 'package:cake_wallet/src/screens/base_page.dart'; - -// class LoginPage extends BasePage { -// @override -// Widget leading(BuildContext context) => Container(); - -// @override -// Widget body(BuildContext context) => _LoginPinCode(); -// } - -// class _LoginPinCode extends PinCode { -// _LoginPinCode([Key key]) : super((_, __) => null, false, key); - -// @override -// _LoginPinCodeState createState() => _LoginPinCodeState(); -// } - -// class _LoginPinCodeState extends PinCodeState<_LoginPinCode> { -// LoginStore _loginStore; -// String title = 'Enter your PIN'; - -// @override -// Future onPinCodeEntered(PinCodeState state) async { -// final password = pin.fold("", (ac, val) => ac + '$val'); - -// await _loginStore.authStore.auth(password: password); -// super.onPinCodeEntered(state); -// } - -// @override -// Widget build(BuildContext context) { -// _setLoginStore(store: Provider.of(context)); -// return body(context); -// } - -// void _setLoginStore({LoginStore store}) { -// if (_loginStore != null) { -// return; -// } - -// _loginStore = store; - -// reaction((_) => _loginStore.authStore.state, (state) { -// if (state is AuthenticationFailure) { -// WidgetsBinding.instance.addPostFrameCallback((_) { -// clear(); -// Scaffold.of(context).showSnackBar( -// SnackBar( -// content: Text(state.error), -// backgroundColor: Colors.red, -// ), -// ); -// }); -// } - -// if (state is AuthenticationBanned) { -// WidgetsBinding.instance.addPostFrameCallback((_) { -// clear(); -// Scaffold.of(context).showSnackBar( -// SnackBar( -// content: Text(state.error), -// backgroundColor: Colors.red, -// ), -// ); -// }); -// } - -// if (state is AuthenticationInProgress) { -// WidgetsBinding.instance.addPostFrameCallback((_) { -// Scaffold.of(context).hideCurrentSnackBar(); -// Scaffold.of(context).showSnackBar( -// SnackBar( -// content: Text('Authentication'), -// backgroundColor: Colors.green, -// ), -// ); -// }); -// } -// }); - -// reaction((_) => _loginStore.state, (state) { -// if (state is LoadedCurrentWalletFailure) { -// WidgetsBinding.instance.addPostFrameCallback((_) { -// clear(); -// Scaffold.of(context).showSnackBar( -// SnackBar( -// content: Text(state.errorMessage), -// backgroundColor: Colors.red, -// ), -// ); -// }); -// } - -// if (state is LoadingCurrentWallet) { -// WidgetsBinding.instance.addPostFrameCallback((_) { -// Scaffold.of(context).hideCurrentSnackBar(); -// Scaffold.of(context).showSnackBar( -// SnackBar( -// content: Text('Loading your wallet'), -// backgroundColor: Colors.green, -// ), -// ); -// }); -// } -// }); -// } -// } diff --git a/lib/src/screens/receive/receive_page.dart b/lib/src/screens/receive/receive_page.dart index b7b06fcdb..1ac4a073b 100644 --- a/lib/src/screens/receive/receive_page.dart +++ b/lib/src/screens/receive/receive_page.dart @@ -95,7 +95,7 @@ class ReceivePage extends BasePage { context: context, builder: (_) => getIt.get()), - title: addressListViewModel.accountLabel, + title: S.of(context).accounts, icon: Icon( Icons.arrow_forward_ios, size: 14, @@ -136,7 +136,7 @@ class ReceivePage extends BasePage { isCurrent: isCurrent, backgroundColor: backgroundColor, textColor: textColor, - onTap: (_) => addressListViewModel.address = item, + onTap: (_) => addressListViewModel.setAddress(item), onEdit: () => Navigator.of(context).pushNamed( Routes.newSubaddress, arguments: item)); diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index 3a30db535..0e0970000 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -9,13 +10,12 @@ import 'package:cake_wallet/core/amount_validator.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; class QRWidget extends StatelessWidget { - QRWidget({ - @required this.addressListViewModel, - this.isAmountFieldShow = false - }) : amountController = TextEditingController(), - _formKey = GlobalKey() { + QRWidget( + {@required this.addressListViewModel, this.isAmountFieldShow = false}) + : amountController = TextEditingController(), + _formKey = GlobalKey() { amountController.addListener(() => addressListViewModel.amount = - _formKey.currentState.validate() ? amountController.text : ''); + _formKey.currentState.validate() ? amountController.text : ''); } final WalletAddressListViewModel addressListViewModel; @@ -26,7 +26,7 @@ class QRWidget extends StatelessWidget { @override Widget build(BuildContext context) { final copyImage = Image.asset('assets/images/copy_address.png', - color: Theme.of(context).textTheme.subhead.decorationColor); + color: Theme.of(context).textTheme.subhead.decorationColor); final addressTopOffset = isAmountFieldShow ? 60.0 : 40.0; return Column( @@ -36,16 +36,17 @@ class QRWidget extends StatelessWidget { Row(children: [ Spacer(flex: 3), Observer( - builder: (_) => Flexible( - flex: 5, - child: Center( - child: AspectRatio( - aspectRatio: 1.0, - child: QrImage( - data: addressListViewModel.uri.toString(), - backgroundColor: Colors.transparent, - foregroundColor: Theme.of(context).textTheme.headline.color, - ))))), + builder: (_) => Flexible( + flex: 5, + child: Center( + child: AspectRatio( + aspectRatio: 1.0, + child: QrImage( + data: addressListViewModel.uri.toString(), + backgroundColor: Colors.transparent, + foregroundColor: + Theme.of(context).textTheme.headline.color, + ))))), Spacer(flex: 3) ]), Padding( @@ -53,85 +54,80 @@ class QRWidget extends StatelessWidget { child: Text( S.of(context).scan_qr_code, style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - color: Theme.of(context).indicatorColor - ), + fontSize: 12, + fontWeight: FontWeight.w500, + color: Theme.of(context).indicatorColor), ), ), isAmountFieldShow - ? Padding( - padding: EdgeInsets.only(top: 40), - 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, - textColor: Colors.white, - borderColor: Theme.of(context).textTheme.headline.decorationColor, - validator: AmountValidator( - type: addressListViewModel.type, - isAutovalidate: true - ), - autovalidate: true, - placeholderTextStyle: TextStyle( - color: Theme.of(context).hoverColor, - fontSize: 18, - fontWeight: FontWeight.w500)))) - ], - ), - ) - : Offstage(), + ? Padding( + padding: EdgeInsets.only(top: 40), + 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, + textColor: Colors.white, + borderColor: Theme.of(context) + .textTheme + .headline + .decorationColor, + validator: AmountValidator( + type: addressListViewModel.type, + isAutovalidate: true), + autovalidate: true, + placeholderTextStyle: TextStyle( + color: Theme.of(context).hoverColor, + 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), + onTap: () { + Clipboard.setData(ClipboardData( + text: addressListViewModel.address.address)); + showBar( + context, S.of(context).copied_to_clipboard); + }, + 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, + ) + ], ), - 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/src/screens/seed/wallet_seed_page.dart b/lib/src/screens/seed/wallet_seed_page.dart index 92d3b8504..c101561e6 100644 --- a/lib/src/screens/seed/wallet_seed_page.dart +++ b/lib/src/screens/seed/wallet_seed_page.dart @@ -2,6 +2,7 @@ import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/store/settings_store.dart'; +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -28,16 +29,20 @@ class WalletSeedPage extends BasePage { @override void onClose(BuildContext context) async { if (isNewWalletCreated) { - final confirmed = await showPopUp(context: context, builder: (BuildContext context) { - // FIXME: add translations - return AlertWithTwoActions( - alertTitle: 'Attention', - alertContent: 'The seed is the only way to recover your wallet. Have you written it down?', - leftButtonText: 'Go back', - rightButtonText: 'Yes, I have', - actionLeftButton: () => Navigator.of(context).pop(false), - actionRightButton: () => Navigator.of(context).pop(true)); - }) ?? false; + final confirmed = await showPopUp( + context: context, + builder: (BuildContext context) { + // FIXME: add translations + return AlertWithTwoActions( + alertTitle: 'Attention', + alertContent: + 'The seed is the only way to recover your wallet. Have you written it down?', + leftButtonText: 'Go back', + rightButtonText: 'Yes, I have', + actionLeftButton: () => Navigator.of(context).pop(false), + actionRightButton: () => Navigator.of(context).pop(true)); + }) ?? + false; if (confirmed) { Navigator.of(context).popUntil((route) => route.isFirst); @@ -57,39 +62,31 @@ class WalletSeedPage extends BasePage { Widget trailing(BuildContext context) { return isNewWalletCreated ? GestureDetector( - onTap: () => onClose(context), - child: Container( - width: 100, - height: 32, - alignment: Alignment.center, - margin: EdgeInsets.only(left: 10), - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(16)), - color: Theme - .of(context) - .accentTextTheme - .caption - .color), - child: Text( - S - .of(context) - .seed_language_next, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Palette.blueCraiola), - ), - ), - ) + onTap: () => onClose(context), + child: Container( + width: 100, + height: 32, + alignment: Alignment.center, + margin: EdgeInsets.only(left: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(16)), + color: Theme.of(context).accentTextTheme.caption.color), + child: Text( + S.of(context).seed_language_next, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: Palette.blueCraiola), + ), + ), + ) : Offstage(); } @override Widget body(BuildContext context) { final image = - getIt - .get() - .isDarkTheme ? imageDark : imageLight; + getIt.get().isDarkTheme ? imageDark : imageLight; return Container( padding: EdgeInsets.all(24), @@ -116,23 +113,21 @@ class WalletSeedPage extends BasePage { style: TextStyle( fontSize: 20, fontWeight: FontWeight.w600, - color: Theme - .of(context) + color: Theme.of(context) .primaryTextTheme .title .color), ), Padding( padding: - EdgeInsets.only(top: 20, left: 16, right: 16), + EdgeInsets.only(top: 20, left: 16, right: 16), child: Text( walletSeedViewModel.seed, textAlign: TextAlign.center, style: TextStyle( fontSize: 14, fontWeight: FontWeight.normal, - color: Theme - .of(context) + color: Theme.of(context) .primaryTextTheme .caption .color), @@ -146,78 +141,54 @@ class WalletSeedPage extends BasePage { children: [ isNewWalletCreated ? Padding( - padding: EdgeInsets.only( - bottom: 52, left: 43, right: 43), - child: Text( - S - .of(context) - .seed_reminder, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.normal, - color: Theme - .of(context) - .primaryTextTheme - .overline - .color), - ), - ) + padding: EdgeInsets.only( + bottom: 52, left: 43, right: 43), + child: Text( + S.of(context).seed_reminder, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .primaryTextTheme + .overline + .color), + ), + ) : Offstage(), Row( mainAxisSize: MainAxisSize.max, children: [ Flexible( child: Container( - padding: EdgeInsets.only(right: 8.0), - child: PrimaryButton( - onPressed: () => - Share.text( - S - .of(context) - .seed_share, - walletSeedViewModel.seed, - 'text/plain'), - text: S - .of(context) - .save, - color: Colors.green, - textColor: Colors.white), - )), + padding: EdgeInsets.only(right: 8.0), + child: PrimaryButton( + onPressed: () => Share.text( + S.of(context).seed_share, + walletSeedViewModel.seed, + 'text/plain'), + text: S.of(context).save, + color: Colors.green, + textColor: Colors.white), + )), Flexible( child: Container( - padding: EdgeInsets.only(left: 8.0), - child: Builder( - builder: (context) => - PrimaryButton( - onPressed: () { - Clipboard.setData(ClipboardData( - text: walletSeedViewModel - .seed)); - Scaffold.of(context) - .showSnackBar( - SnackBar( - content: Text(S - .of(context) - .copied_to_clipboard), - backgroundColor: Colors - .green, - duration: - Duration( - milliseconds: 1500), - ), - ); - }, - text: S - .of(context) - .copy, - color: Theme - .of(context) - .accentTextTheme - .body2 - .color, - textColor: Colors.white)), - )) + padding: EdgeInsets.only(left: 8.0), + child: Builder( + builder: (context) => PrimaryButton( + onPressed: () { + Clipboard.setData(ClipboardData( + text: walletSeedViewModel.seed)); + showBar(context, + S.of(context).copied_to_clipboard); + }, + text: S.of(context).copy, + color: Theme.of(context) + .accentTextTheme + .body2 + .color, + textColor: Colors.white)), + )) ], ) ], diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index 4a1a15443..7a856cb43 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -1,5 +1,7 @@ import 'dart:ui'; +import 'package:cake_wallet/entities/transaction_priority.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; +import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -691,19 +693,19 @@ class SendPage extends BasePage { } Future _setTransactionPriority(BuildContext context) async { - // final items = TransactionPriority.all; - // final selectedItem = items.indexOf(sendViewModel.transactionPriority); - // - // await showPopUp( - // builder: (_) => Picker( - // items: items, - // selectedAtIndex: selectedItem, - // title: S.of(context).please_select, - // mainAxisAlignment: MainAxisAlignment.center, - // onItemSelected: (TransactionPriority priority) => null, - // // sendViewModel.setTransactionPriority(priority), - // isAlwaysShowScrollThumb: true, - // ), - // context: context); + final items = TransactionPriority.all; + final selectedItem = items.indexOf(sendViewModel.transactionPriority); + + await showPopUp( + builder: (_) => Picker( + items: items, + selectedAtIndex: selectedItem, + title: S.of(context).please_select, + mainAxisAlignment: MainAxisAlignment.center, + onItemSelected: (TransactionPriority priority) => + sendViewModel.setTransactionPriority(priority), + isAlwaysShowScrollThumb: true, + ), + context: context); } } diff --git a/lib/src/screens/trade_details/trade_details_page.dart b/lib/src/screens/trade_details/trade_details_page.dart index da71e80ac..88e30bae9 100644 --- a/lib/src/screens/trade_details/trade_details_page.dart +++ b/lib/src/screens/trade_details/trade_details_page.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -68,14 +69,7 @@ class TradeDetailsPage extends BasePage { return GestureDetector( onTap: () { Clipboard.setData(ClipboardData(text: '${item.value}')); - Scaffold.of(context).showSnackBar( - SnackBar( - content: - Text(S.of(context).trade_details_copied(item.title)), - backgroundColor: Colors.green, - duration: Duration(milliseconds: 1500), - ), - ); + showBar(context, S.of(context).copied_to_clipboard); }, child: StandartListRow( title: '${item.title}', diff --git a/lib/src/screens/transaction_details/transaction_details_page.dart b/lib/src/screens/transaction_details/transaction_details_page.dart index 78bc9bd7c..7e9896fa2 100644 --- a/lib/src/screens/transaction_details/transaction_details_page.dart +++ b/lib/src/screens/transaction_details/transaction_details_page.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/utils/show_bar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:cake_wallet/generated/i18n.dart'; @@ -92,14 +93,8 @@ class TransactionDetailsPage extends BasePage { return GestureDetector( onTap: () { Clipboard.setData(ClipboardData(text: item.value)); - Scaffold.of(context).showSnackBar( - SnackBar( - content: Text( - S.of(context).transaction_details_copied(item.title)), - backgroundColor: Colors.green, - duration: Duration(milliseconds: 1500), - ), - ); + showBar(context, + S.of(context).transaction_details_copied(item.title)); }, child: StandartListRow( title: '${item.title}:', diff --git a/lib/src/screens/wallet_keys/wallet_keys_page.dart b/lib/src/screens/wallet_keys/wallet_keys_page.dart index e4a9954e8..48b326d47 100644 --- a/lib/src/screens/wallet_keys/wallet_keys_page.dart +++ b/lib/src/screens/wallet_keys/wallet_keys_page.dart @@ -1,3 +1,5 @@ +import 'package:cake_wallet/utils/show_bar.dart'; +import 'package:flushbar/flushbar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -41,15 +43,8 @@ class WalletKeysPage extends BasePage { return GestureDetector( onTap: () { Clipboard.setData(ClipboardData(text: item.value)); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text( - S.of(context).copied_key_to_clipboard(item.title), - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white), - ), - backgroundColor: Colors.green, - duration: Duration(seconds: 1), - )); + showBar(context, + S.of(context).copied_key_to_clipboard(item.title)); }, child: StandartListRow( title: item.title + ':', diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index 0b845f3ed..8b55347c4 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -1,5 +1,8 @@ +import 'package:cake_wallet/src/screens/auth/auth_page.dart'; import 'package:cake_wallet/src/screens/wallet_list/widgets/wallet_menu_alert.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -11,6 +14,7 @@ import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/screens/wallet_list/wallet_menu.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; class WalletListPage extends BasePage { WalletListPage({this.walletListViewModel}); @@ -65,48 +69,61 @@ class WalletListBodyState extends State { itemCount: widget.walletListViewModel.wallets.length, itemBuilder: (__, index) { final wallet = widget.walletListViewModel.wallets[index]; - final walletMenu = WalletMenu(context, widget.walletListViewModel); - final items = - walletMenu.generateItemsForWalletMenu(wallet.isCurrent); final currentColor = wallet.isCurrent - ? Theme.of(context).accentTextTheme.subtitle.decorationColor + ? Theme.of(context) + .accentTextTheme + .subtitle + .decorationColor : Theme.of(context).backgroundColor; + final row = GestureDetector( + onTap: () async { + if (wallet.isCurrent) { + return; + } - return GestureDetector( - onTap: () { - showPopUp( - context: context, - builder: (dialogContext) { - return WalletMenuAlert( - wallet: wallet, - walletMenu: walletMenu, - items: items); - } - ); - }, - child: Container( - height: tileHeight, - width: double.infinity, - child: Row( - children: [ - Container( - height: tileHeight, - width: 4, - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topRight: Radius.circular(4), - bottomRight: Radius.circular(4)), - color: currentColor + final confirmed = await showPopUp( + context: context, + builder: (dialogContext) { + // FIXME: + return AlertWithTwoActions( + alertTitle: 'Change current wallet', + alertContent: + 'Do you want to change current wallet to ${wallet.name} ?', + leftButtonText: S.of(context).cancel, + rightButtonText: S.of(context).change, + actionLeftButton: () => + Navigator.of(context).pop(false), + actionRightButton: () => + Navigator.of(context).pop(true)); + }) ?? false; + + if (confirmed) { + await _loadWallet(wallet); + } + }, + child: Container( + height: tileHeight, + width: double.infinity, + child: Row( + children: [ + Container( + height: tileHeight, + width: 4, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topRight: Radius.circular(4), + bottomRight: Radius.circular(4)), + color: currentColor), ), - ), - Expanded( + Expanded( child: Container( height: tileHeight, padding: EdgeInsets.only(left: 20, right: 20), color: Theme.of(context).backgroundColor, alignment: Alignment.centerLeft, child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ _imageFor(type: wallet.type), SizedBox(width: 10), @@ -115,17 +132,33 @@ class WalletListBodyState extends State { style: TextStyle( fontSize: 22, fontWeight: FontWeight.w600, - color: Theme.of(context).primaryTextTheme.title.color - ), + color: Theme.of(context) + .primaryTextTheme + .title + .color), ) ], ), ), - ), - ], - ), - ) - ); + ), + ], + ), + )); + + return wallet.isCurrent + ? row + : Slidable( + key: Key('${wallet.key}'), + actionPane: SlidableDrawerActionPane(), + child: row, + secondaryActions: [ + IconSlideAction( + caption: S.of(context).delete, + color: Colors.red, + icon: CupertinoIcons.delete, + onTap: () async => _removeWallet(wallet), + ) + ]); }), ), ), @@ -136,12 +169,13 @@ class WalletListBodyState extends State { image: newWalletImage, text: S.of(context).wallet_list_create_new_wallet, color: Theme.of(context).accentTextTheme.subtitle.decorationColor, - textColor: Theme.of(context).accentTextTheme.headline.decorationColor, + textColor: + Theme.of(context).accentTextTheme.headline.decorationColor, ), SizedBox(height: 10.0), PrimaryImageButton( - onPressed: () => Navigator.of(context) - .pushNamed(Routes.restoreWalletType), + onPressed: () => + Navigator.of(context).pushNamed(Routes.restoreWalletType), image: restoreWalletImage, text: S.of(context).wallet_list_restore_wallet, color: Theme.of(context).accentTextTheme.caption.color, @@ -160,4 +194,47 @@ class WalletListBodyState extends State { return null; } } + + Future _loadWallet(WalletListItem wallet) async { + await Navigator.of(context).pushNamed(Routes.auth, arguments: + (bool isAuthenticatedSuccessfully, AuthPageState auth) async { + if (!isAuthenticatedSuccessfully) { + return; + } + + try { + auth.changeProcessText( + S.of(context).wallet_list_loading_wallet(wallet.name)); + await widget.walletListViewModel.loadWallet(wallet); + auth.hideProgressText(); + auth.close(); + Navigator.of(context).pop(); + } catch (e) { + auth.changeProcessText(S + .of(context) + .wallet_list_failed_to_load(wallet.name, e.toString())); + } + }); + } + + Future _removeWallet(WalletListItem wallet) async { + await Navigator.of(context).pushNamed(Routes.auth, arguments: + (bool isAuthenticatedSuccessfully, AuthPageState auth) async { + if (!isAuthenticatedSuccessfully) { + return; + } + + try { + auth.changeProcessText( + S.of(context).wallet_list_removing_wallet(wallet.name)); + await widget.walletListViewModel.remove(wallet); + } catch (e) { + auth.changeProcessText(S + .of(context) + .wallet_list_failed_to_remove(wallet.name, e.toString())); + } + + auth.close(); + }); + } } diff --git a/lib/src/widgets/address_text_field.dart b/lib/src/widgets/address_text_field.dart index 9f46505c8..4ab07f860 100644 --- a/lib/src/widgets/address_text_field.dart +++ b/lib/src/widgets/address_text_field.dart @@ -2,7 +2,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/entities/contact.dart'; +import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/entities/qr_scanner.dart'; enum AddressTextFieldOption { paste, qrCode, addressBook } @@ -212,7 +212,7 @@ class AddressTextField extends StatelessWidget { final contact = await Navigator.of(context, rootNavigator: true) .pushNamed(Routes.pickerAddressBook); - if (contact is Contact && contact.address != null) { + if (contact is ContactRecord && contact.address != null) { controller.text = contact.address; } } diff --git a/lib/utils/mobx.dart b/lib/utils/mobx.dart index 344e16b64..9e2316af7 100644 --- a/lib/utils/mobx.dart +++ b/lib/utils/mobx.dart @@ -124,10 +124,16 @@ extension HiveBindable on ObservableList { listen().listen((event) => dest.acceptEntityChange(event)); void acceptBoxChange(BoxEvent event, {T transformed}) { + print('---------------------'); + print('event.key: ${event.key}; event.deleted: ${event.deleted};'); if (event.deleted) { - removeWhere((el) => el.keyIndex == event.key); + removeWhere((el) { + print('el.keyIndex ${el.keyIndex}'); + return el.keyIndex == event.key; }); } + print('---------------------'); + final dynamic value = transformed ?? event.value; if (value is T) { diff --git a/lib/utils/show_bar.dart b/lib/utils/show_bar.dart new file mode 100644 index 000000000..8d2355e4f --- /dev/null +++ b/lib/utils/show_bar.dart @@ -0,0 +1,47 @@ +import 'package:flushbar/flushbar.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +Future showBar(BuildContext context, String text, + {bool isDark = false, Duration duration = const Duration(seconds: 1), bool isDismissible = true}) { + final bar = Flushbar( + boxShadows: [ + BoxShadow( + color: Colors.black.withOpacity(0.09), + blurRadius: 8, + offset: Offset(0, 2)) + ], + backgroundColor: isDark ? Colors.black : Colors.white, + borderRadius: 35, + margin: EdgeInsets.all(50), + messageText: Text(text, + textAlign: TextAlign.center, + style: TextStyle(color: isDark ? Colors.white : Colors.black)), + duration: duration, + isDismissible: isDismissible, + flushbarPosition: FlushbarPosition.TOP, + flushbarStyle: FlushbarStyle.FLOATING); + + return bar.show(context); +} + +Flushbar createBar(String text, + {bool isDark = false, Duration duration = const Duration(seconds: 1), bool isDismissible = true}) { + return Flushbar( + boxShadows: [ + BoxShadow( + color: Colors.black.withOpacity(0.09), + blurRadius: 8, + offset: Offset(0, 2)) + ], + backgroundColor: isDark ? Colors.black : Colors.white, + borderRadius: 35, + margin: EdgeInsets.all(50), + messageText: Text(text, + textAlign: TextAlign.center, + style: TextStyle(color: isDark ? Colors.white : Colors.black)), + duration: duration, + isDismissible: isDismissible, + flushbarPosition: FlushbarPosition.TOP, + flushbarStyle: FlushbarStyle.FLOATING); +} diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 19678cd03..a37f39341 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -50,14 +50,15 @@ abstract class SendViewModelBase with Store { @observable bool sendAll; + @computed + double get estimatedFee => + _wallet.calculateEstimatedFee(_settingsStore.transactionPriority); + FiatCurrency get fiat => _settingsStore.fiatCurrency; TransactionPriority get transactionPriority => _settingsStore.transactionPriority; - double get estimatedFee => - _wallet.calculateEstimatedFee(_settingsStore.transactionPriority); - CryptoCurrency get currency => _wallet.currency; Validator get amountValidator => AmountValidator(type: _wallet.type); @@ -139,6 +140,10 @@ abstract class SendViewModelBase with Store { _updateCryptoAmount(); } + @action + void setTransactionPriority(TransactionPriority priority) => + _settingsStore.transactionPriority = priority; + @action void _updateFiatAmount() { try { 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 382083361..0c8d10502 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 @@ -109,9 +109,6 @@ abstract class WalletAddressListViewModelBase with Store { return addressList; } - set address(WalletAddressListItem address) => null; - // _wallet.address = address.address; - bool hasAccounts; WalletBase _wallet; @@ -129,6 +126,10 @@ abstract class WalletAddressListViewModelBase with Store { return null; } + @action + void setAddress(WalletAddressListItem address) => + _wallet.address = address.address; + void _init() { _baseItems = []; diff --git a/lib/view_model/wallet_list/wallet_list_view_model.dart b/lib/view_model/wallet_list/wallet_list_view_model.dart index 8bb102620..84885941e 100644 --- a/lib/view_model/wallet_list/wallet_list_view_model.dart +++ b/lib/view_model/wallet_list/wallet_list_view_model.dart @@ -31,6 +31,7 @@ abstract class WalletListViewModelBase with Store { await _keyService.getWalletPassword(walletName: wallet.name); final walletService = getIt.get(param1: wallet.type); _appStore.wallet = await walletService.openWallet(wallet.name, password); + _updateList(); } @action diff --git a/pubspec.lock b/pubspec.lock index 8a8469917..e1d6a52a9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -358,6 +358,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.10.11" + flushbar: + dependency: "direct main" + description: + name: flushbar + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.4" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 541ca0259..73cb7c48e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,6 +65,7 @@ dependencies: get_it: ^4.0.2 connectivity: ^0.4.9+2 keyboard_actions: ^3.3.0 + flushbar: ^1.10.4 dev_dependencies: flutter_test: