From 760199b9f134c4c2de66f63a3650bfd26887b8be Mon Sep 17 00:00:00 2001 From: poka Date: Sun, 10 Dec 2023 01:20:23 +0100 Subject: [PATCH] (wip) UI: upgrade responsive_framework with breaking sizes --- assets/avatars/0.png | Bin 6994 -> 19507 bytes assets/avatars/1.png | Bin 6813 -> 18674 bytes assets/avatars/2.png | Bin 6791 -> 18847 bytes assets/avatars/3.png | Bin 5715 -> 16228 bytes assets/translations/en.json | 8 +- assets/translations/es.json | 8 +- assets/translations/fr.json | 8 +- assets/translations/it.json | 4 +- devtools_options.yaml | 1 + lib/globals.dart | 4 - lib/main.dart | 19 +- lib/models/widgets_keys.dart | 1 + lib/providers/substrate_sdk.dart | 1 - lib/screens/activity.dart | 10 +- lib/screens/certifications.dart | 20 +- lib/screens/debug_screen.dart | 7 +- lib/screens/home.dart | 51 ++--- lib/screens/myWallets/change_pin.dart | 7 +- lib/screens/myWallets/chest_options.dart | 36 ++-- lib/screens/myWallets/choose_chest.dart | 11 +- lib/screens/myWallets/custom_derivations.dart | 14 +- lib/screens/myWallets/import_g1_v1.dart | 129 +++++++----- lib/screens/myWallets/manage_membership.dart | 6 +- lib/screens/myWallets/migrate_identity.dart | 17 +- lib/screens/myWallets/restore_chest.dart | 29 ++- lib/screens/myWallets/show_seed.dart | 199 +++++++++--------- lib/screens/myWallets/unlocking_wallet.dart | 69 +++--- lib/screens/myWallets/wallet_options.dart | 79 +++---- lib/screens/myWallets/wallets_home.dart | 10 +- lib/screens/my_contacts.dart | 9 +- lib/screens/onBoarding/1.dart | 11 +- lib/screens/onBoarding/10.dart | 21 +- .../onBoarding/11_congratulations.dart | 23 +- lib/screens/onBoarding/2.dart | 11 +- lib/screens/onBoarding/3.dart | 11 +- lib/screens/onBoarding/4.dart | 11 +- lib/screens/onBoarding/5.dart | 175 ++++++++------- lib/screens/onBoarding/6.dart | 41 ++-- lib/screens/onBoarding/7.dart | 13 +- lib/screens/onBoarding/8.dart | 14 +- lib/screens/onBoarding/9.dart | 31 ++- lib/screens/qrcode_fullscreen.dart | 11 +- lib/screens/search.dart | 34 ++- lib/screens/search_result.dart | 17 +- lib/screens/settings.dart | 88 ++++---- lib/screens/template_screen.dart | 7 +- lib/screens/transaction_in_progress.dart | 61 +++--- lib/screens/wallet_view.dart | 67 +++--- lib/widgets/balance.dart | 7 +- lib/widgets/bottom_app_bar.dart | 2 +- lib/widgets/bubble_speak.dart | 4 +- .../buttons/add_new_derivation_button.dart | 10 +- .../buttons/chest_options_buttons.dart | 100 ++++----- lib/widgets/buttons/home_buttons.dart | 48 ++--- lib/widgets/cert_tile.dart | 20 +- lib/widgets/certifications.dart | 2 +- .../{certs_sent.dart => certs_list.dart} | 82 +++++--- lib/widgets/certs_received.dart | 104 --------- lib/widgets/cesium_avatar.dart | 1 - lib/widgets/commons/build_image.dart | 7 +- lib/widgets/commons/build_progress_bar.dart | 4 +- lib/widgets/commons/build_text.dart | 14 +- lib/widgets/commons/common_elements.dart | 21 -- lib/widgets/commons/intro_info.dart | 16 +- lib/widgets/commons/next_button.dart | 6 +- lib/widgets/contacts_list.dart | 6 +- lib/widgets/drag_tule_action.dart | 4 +- lib/widgets/drag_wallets_info.dart | 7 +- lib/widgets/drawer.dart | 180 +++++++++------- lib/widgets/header_profile.dart | 19 +- lib/widgets/history_view.dart | 35 ++- lib/widgets/payment_popup.dart | 141 ++++++------- lib/widgets/search_identity_query.dart | 99 +++++---- lib/widgets/search_result_list.dart | 91 ++++---- lib/widgets/transaction_tile.dart | 2 +- lib/widgets/ud_unit_display.dart | 9 +- lib/widgets/wallet_name.dart | 3 +- lib/widgets/wallet_tile.dart | 11 +- lib/widgets/wallet_tile_membre.dart | 18 +- pubspec.lock | 4 +- pubspec.yaml | 4 +- 81 files changed, 1156 insertions(+), 1329 deletions(-) create mode 100644 devtools_options.yaml rename lib/widgets/{certs_sent.dart => certs_list.dart} (56%) delete mode 100644 lib/widgets/certs_received.dart diff --git a/assets/avatars/0.png b/assets/avatars/0.png index 47e563e14283862667587106398567eee52ebd1e..98804aa926034cbb35fc69eea9c2876791e73aa4 100755 GIT binary patch literal 19507 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 QoIhjmboFyt=akR{0OtgR@Bjb+ literal 6994 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%0DCjeEkMWyN8fpOaJoY|0?YyATiJ8wa4}T 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 LNkvXXu0mjf4-(F+ diff --git a/assets/avatars/2.png b/assets/avatars/2.png index 9271e58615aa97e28ef735c4b41f62bf60cda853..19dfa748795de0ce1e9791ea1a2a3a9fa9fbb32b 100755 GIT binary patch literal 18847 zcmeIYbx<5%6E?cIy9Qlc65I*y?ryY)Iq7kwg#I?c>4YBbb7CxsSQcjL>IyD0 z)lK=Sq0SCsD<@iqI&**pxa|A?c3t~@G3OM?m^y!4Hh29+l4RhZE(-(px8IzYkXMb|zP|~g53I@_OYNUTHNOAG^?U1hX3^#G z>!f-`-+g+$ES+dq^2_;x_q4Ibb6>l$O`7{D)29pL72WsM|NQKJEL~fxCghu+{LzZq zx_w97XVbNBAHy_!cYgO$EkBd^xL0^3G@qvC`qVOuP?B=()&++Wj(h7FvGfzgeUABL ztjE$x<89^G|0TJr>fFIZmg01F_|ywDLFY#*>+zM?ug(4Ic((gyHH!nwmp&%{_D`?f zomQdfKEFxc|G+5>8e>l8dEK=&rChDeOTpW;-w^bptBpj)71w59g+F=GGfuf6#4JiZ z=qE&q%XLGr_16zTcRcPj6d{K)Whlb5x?uQ$3mJGqIfU;e$D_cCE)$t4{3A<+iVJ}D zb&rCf# zCpw_!=J^%NdDV%|n`PZ|Ul&40N}SfEXSKa#Ho<@{HS*vO zBTJ|w`0qw(`knf|uC_f4m$BY|`Zd=465cWJo84KV{CQyXmB(K2=Q1uzb!xpL9(|d> zly8UMw*foyc0vAcU0z$7q`yg-OhW_IML6LiD_8c@o$PU)sSu#JgBFJ^LCl8MvK&ek zZB{LPIY`jl$6@SN3YkhVy44dZc1+j(-^=TLcUoFC$RY4v_@A#5+N^n=Tk9tbD!F9H z^PH~$C93I_n(Oa$Nh@(GXmsobH8H!KQQIzZXrs2`zjlC zoORrHyWU{on3rbHXX4ksF=X}#aZB}> z#=YG8OCO5ZC6`K5ch;^Jm5)XzQZM5{-9!V?>{s#eUXdeu9r+&`l9Iw!WoaXFT#NizEA|(O zBL>4{ut2#RBKdxa072g5b(?h-=eSloPe6T)JoB{?AB`gW$=2K|u6>apJynx8{r!dG zPbJ$;6_E=!8QDfs!FZLkeorAKUMD63!(^EON~WMrrs)nfOcilOW`4%5KvTpkr3%hN zD*}E=3yVmie&_MyOLu= zg|3towbNmwmNSYv#zhm9!=UM!<&hw0XUw6xR2hUknT94k;NGDD)j7k(D#Kl>WSEk9 z?V6+(-)oOg5=;3{;N}FH@bqA!z({r0ii_k&LMX|*~CjBKI?w~T?1@sPAb>QEV6%Z8+FrX;ezI)PMqO-grHXx2-1 zRc>3z1ZL5N^XRFWG50cN$<&}igQ23s$>H0_v*X*cb)Z!3-nF6Q{|siV}}cL_gkcJ*0;AC8nyh;tX=}0ON#p0lFXK zcD4#9%?-`KzV&^-u(jKkzm?gNn2;$gHEz5mqYu$&9}$!|2`8fO7^M7E8#;vAj*!{V zR|fpNX%I)STT>Pp#<)b>9*Kbi?c)AA2$NkhfE6)W3z~YnVw2W#cJp!4ljKepS$HmF z(X>_XSj>uLX5l$au=YLN(^#QFU|;0eHl`|TvQ_*NU$#IY^C%;-cD3mb{k!joiy>&; zt~coFV)-6EOc?mluHTdcvFM>ya-IR?B&bNU9;M%Civ@frp5|yrgI@#^arD{!m0t?o zpbk)7T)>8_(xFjPLrWIA9#}(<)!BO37ktPY3hmoIdLJRx<19?rhQ|+hJH6^4we$!` zYe#Mf49RDwj{n&je*+!PCC<G z(B6_J_MU5*27Q`UnQ*!V5o1HT7YGBy{YYP+vC4#hpse)~Ul>-k%s}L3wPHD)TB{H> z2(T}Stnd0A3T}DD4w7=CTPQus0sL@XZ@|k>=gGv5xVJFcF*ZMbCZot0Ohgi5DKjF>!8*b11`&So*x!vUE=Bgpk~SaOTgSnH zVv~Ke6Whv$+CbTAGjv(&KsHksgF7|CDUT#MOd^PjMy?M57XKk5IE2r(D2lz2$; zcyMtOnyRWPfLbaNK!Q<#t`}@b(`q8x(#K?(&KYuRj)5vjptfZCUT=U8NHmc#NUSX? zZXN9|LYzZN>&n-5Ne#!Ruc5;)5?bS4rbdXNqwIkn7}~#+5LP$ut2+u=r|Jj1KBg%c zg*5Z72X0$hHM{BKj8jxGCzvvc*K>;8yG(`$ zg2~nw4ONPOt_Wc)lEdWaDujs8wsMj1j1Q13=-4Kos7zGoX58{etAVY7jjO;>; zv@*@5luTl&#gB|b?8KHYZA%%6AeT%7V&@}hLw&$pRg|UXqs!`gDelUf*DX@Os0_Z$ zPb*vV$)^g&Dh#-?fZ2S@VaF6ECR3h8Ckus@93jAY$5R*DOVzQak6$(IFeI~#@H)JB zxXkyXqkCyF`TaLnHU{XPAL0ZBH>e@4UwPE5(r^eFFVF2<)Ws$HuxTgt51C9WhwlfV zz5!Db@b?|=1A7jz12(L960?+99ZCwX*oJY9enopFW2b5^HPF6L9-5K&ALc#;z$}T{ zfgqU4g_)5MMV`2|V!gK_x}B{FuVG?M)fV#4Aryp9xGPU$MR>(5JgVi2BE#r6UHT;l zcngw{3SOa9yLXY(tBDRlH|S?+HV~S(A|W~)JH&9AA+zK&iE_+Ia=6CC`Cp!kMnr^8 z#3_EVj5^c@a8C^hA`q+!7ke}@yMKg6&;Fun$ecX6ZZ&t*f{ZjY;LTxE@eJ~Hxk*|` z4~TX?(Ku?F=EB}%F5)P5gJQ(>Im56x5(x7Il*fDCM+~6&tF%s9Napv()X~k9G5}yA zl?(BPDAu9B2;rdY&b!W>3n*VVeauaHQ=HK9-j2A(#)eqVp4YjbRd?KqPJe>H$GrR~ z{i4P^sNctk&?CM*Nu zJYE(V>K7Q1c5hap11I?e8YV$P;T3qAu zhM<|ai@-9B873pfbQ;~%12}8l@) zb4&dNZD-<;b5BUjP39~bgkcobWQTHZl}iAZFp)A+7!1c(UEgD>OahV1_*VIFvUF5m z1Sxke^gCCNa;Q4Y@Rp6<1&BB}VYq$!Z1dh&M*tm?ED8dCq2oK!d;zS^)9&Ign<1{$ zMaWiXbIR&hd_Q$tc-}LJ`%apNIfa?l>S?V5Sz%Iy-m}Y!JzX-*I>_i?OZaT9I8<87 z9~CoKA#o`|e^noLkU&z(LSQ&i|DaT5_<_q2KB}#0lz|SFmrITIhrabn9nlEUcK}V( z8wW*RTRZgXEUyL7xWoK@{(x9-BS4jwA-vdCXV{wPqkBHbJ3g88!|Ik_ikF_O89z>Y zu$BXVGW=MBJ(T<;%C6&MU4~FblD#h(vR;e3U5504%ymK@%@P8FxYX1 z-M4;TFt4K7cOwkBYAr)csW$G1l#V3b>?uaGkc?&~d9x*nh^XD1H5kyX+kwXR9TeAb zD9i|htB8e5=8ZSTstipnBMcc*7&@R=^h2&azyk6uiMep{y_CTqJ{#{mW=%L^y6F9|gbp~_{!yyz-ea&$cukVJs zPK!ZB2$n`);n*P#RAB?t45kkY=A}vB4ZDxMd2Em-Lyosfu%nwT@g@!rcSt7@dXX4R z7bIxC=eQJBe2?0sGp|E+i7Uu_ghf})*DWc=1=&mCoDC{(fr=Qi-W$2W$1W1Xh1-j8 zw}xqvS}cGDy>A8lyzHoe^U44GO3DO!IZ?)=SM7yPvob|B?*W(kj9*Hq>;frrEG%*I z2_>WT8|1tH_5ZI^I_`F;7gldc`ov)rX`_u$C+)W)4+Pz9B9YAc`yha;<#6{D_CCoZxVGHOS+0uxI zCuL($Xt_9#T6w)hFb`X=SZZ=b!WX|%Y`WM-4}sW;{shMtAl2V7|9j+IC#1Y3FM*~X z$r1@lDoL-2W%^Ylgd_*XU0A83Nzyv8hJ`#-3@6^++C|VvoH~(@;iom7Dtt^qj{H6s z>omSWs}rP7RgbXBFC9)@ZNi#(GW94)NBiKi-lw#i!j{&Ep6XvNeXRLvH1Yw#+L($3 z!72_AJJkt69g@=(S)pNKhqkLYj80QiI_LS+!yk+>A$x)?%Re7=6D&;7e`JLfhA5t_ z>AqYY370kON7n!N={rQZer|VMrAk8xeGVl`vY@A!zyeA9JMt^4+Ni5A7!1Ii@J+vM z_fAJN!jv!`gKiK(x)Pm>F|jlwzCo!%-80^K>&y!1%qA``e> zK`E%a)UzNjMCKky7ywnItGtCX_5H4W9`AsS$NM zV-N;f|12sk#P&MKT9s&8T&ye%qaI=yK4L13wI%To>BXdFqS*1Ba2T#eA-93-wrnuN zR`>exHwJPo)k7g)GVFzlg4-#qU7ui}?i5-r zKLaBn@NOQl=5S?|;bsm~;9dN>(<1teG7=AIy$LN`6s;9D0~zg>xdf4Jh%RXZ)c@UK(7gF zRlyL;$)uqN7ub2&z+f~z zgiNl3uhLZ)#5(T%#$kMPQp7YfJsDJotwKeB8Xz-gugb?f?1K5Cqd7)6p}Cs*oT)Q; zD(W1WhP+sXjtcD~*dLR3By+<>v?BGmK_W6iI4 zbxKEcu=?nz^x4U-n&e{RC%=)^udAuaWT4J%UTAWU@1hXbm_3zcYuJh<#*6O^S?uU| z9({=jr$6Usx%)~hhXrS8na(p5G^=u@gVY>--&*=Pzy2D!@K=~kZqO73;dSgnsCztg zR|LTgw`}x;(0o4@8o`}xiz$OYODU?O1f9qbQjsKX4TYqoH)I9M&lxjAU}R$x?=IhF z^zh^~D&Eu*PI3reOW7w%IM?K=TmFr}6^J;zK=J%>X>Q7xj6l*Xt>T&fOQH_Q{s6{w zzfY^%H@}FLd+x59|^C&)~;R9NxLl48qZBO)FEObsN} zS`M+bpyYjh-q6KOS_JR|T-eT=)a$n@5LX8Wd}Jl0#7`GOosy!?+7_axtmS{YE!AP; z+cD5=t_`;+5OTY=yM>v#9OXsxiVv9T%Dxps^`*exTX39)i&yuXYBLT|b1inN+gkBd z^J~wwoS%vzO$qD!!jBw?Xq{v*z48f+yuc>&PI(&t_%@xR z#e;|`0xbah(0UO^R;$Rfo<7&*I z(x1@?>DGF6t9f~ki?Iy!OUWE!J%lp|U4Js`+7ET=hp4);o1czM3P5hxM+dG^CqiK1 zoBeJpM9l*DOjmX%2BeZ3!9p9IP~iv1qhHkXAfnursgZuo)QcToV1+3QO&%zfWXMpJ zOEc!fy~^06(FaguUob$fTMe>wlIXw&A5niq(13bTeva0om9IRI$U*^Cf6$BLv<@Sd$Gc2oA-bbhV%H)3{e!%Y z>9Judst@&<)H&qIHR9ZT_fGMI9ps|4aOSRT`}#h1dI9ai@wX4!I;V$1!QwO; za^8{~u`e%jo8NLf0tSP_S)?RwBDYYcF3els%6tbknnPmxlg$b~@#4>N$*m~x76{6wj6p-}bi4h|G9*$q#II=1+K zop7l{a0ah8O$HrshXF;}C`X7NQT$MD)WTldCO-;C(Nrmo^*1U{}{lPC=2mxt`#Suvhl;@lkTDIgzcx0mfUtU2DY9v-M3Al09Wx0E{3u?b%#xE z$_&4+HR=j-*ldXz5TPBMZF7r0$qGeW%{_|s!Dqaxbm3^P0j?b1%;>RSZz&p`VtC;Iw8? zwXfJVg%lsZTMH5!uz(6!z`aE|AoI%NJUDooYdjy)FpdloDbEWtdO>$#{^C7vd-OGD z=ZgJ)kvY;0U+!3UdC~R2Y?P+8^mJ1s-O!PsdIAeTRX{sTpC}ke#j01TW`rq+!S1y& zU8L}swiiJF+Mg~#5+uJl;IO}C_yZ6%4^H) z2t^1v&*_|ufMh5|!@Z2X{)Avq5b?a;_o<|%2~k+|KG+}~dJ^X#9(8)yfK83i8OmbA zl(2dsJ!PI~XF4`zKK1+(qEPNI;xxS~HkN!5>K&<0`KR{pJ6?LR!qw}B0p&YPDvSMQ z!XlA;SZaK7J=*HTa)|rcV)8XR6mTxYcC|g!m?DmGtm3>P-s*<+ei~^MT!neC%OB_8 z^_a_XBI25sEO^+z4pE)@zg~$jxF}H?6W>rtTTCyJI7h4h2w08L%L^u>5PJ#a@b2M1 zFY0;^T8@%<2>96%v>fF@)d7$Eq~K*Z8z}U^(xKi5LxV1FC4{NvAJFh6kwQt>PKEzk z;r-Kbe%68$uet0m&e|CW?G?JAb%x*`Nf#-YZWdZQhCo13KEamwWJ?yAU5w7|l0pk4 zYZyStO9 zl>rAYo7D6p;hm>uZ!2YA3Fh_#KEsA25Coxc*wnRx>_0uY+$>-}Q2=sTTg`YUN?-HM zEX(+)R-bj}8_sB*up!Xj+Xh{Unu?z$X!Mpe{s36z9mlkNxoH`lO4IkRp;{gZd#%8E z-AaSJlw=`)lAgh?GWqG!4+j-f1QE-Lp0nPgIV<0PVV*rX`3=9R77DYwOh;^gEPQ@d z=7+&lwMrN~J8|c|_F4Kf@{N=@5#Xzsbf)TitehWZ=!0}awV?Oi!78Okmg$FO$vPGC{6jy@zGe^BIDatD9psd)?+3J^<=xjT_u=vk3+}7m%;g6 z*|$G`kL8*l)E~ylcDVnBJNe)j!WOGv002OQfJ8-=q(w#lanBljr#j0wfnTamh-l!G zV37(vq8qv+yjJ#yh$wC=oG2x-S;T7IG`%Mnd4fc2JjtHs&CNmMxt;-SO*lwXa86dDtp#$8uSU)wYmtdh*B}vtXUmu+FKn1+SRjK$2l*d2^}pBqplgE zQpOmv=ww0?C}wJgWD1oMQIYJYG<+|?v7abYfA^f*jrHz^WMWGL z^qE>-Ss+8)0?pT2y5elxJt3iU0^e7k)^Y}G3VzqaQ zp-d-M0zX?o00KWlpd~NIYhrK9Xk=<{Y{uwe>i~Yn007_<^l&gTu{Lu78k<>w?D)yg z+q=ktAX9#FO%8cxc?VH5OOTY8lbNcQf|`k!wF!?Yxu5_dp9e1(z}C#g2sl_&;&~ zL;4@K|0N8Tl9%Tdvo~@5qn@-FKlz{ec}?w2K&HHZeKj^=?6p*Xo&jEq>#xEYL%*f<#2 zP1!lYP#ioAtmbA$CLG3QW@cQRe?gg=@JiS_*&2bD6J%>-VaDWOXYtp8KZNrND@pT{ zvobROYmbtRk&8Ka06)1L$j;T{UkB7cwq~j>Mt|63;bLZGW#wdNX6FWz!Oi|JAq_Jp zXRs&!!DL}(WcwTLpJm|%8v`cR=#QU*0sa~RwuM*J$;`;b-bu~g-iDw2k4nHlBmZ)5 zAm85>MGE8$mhk-J@qhPuRWrxG{rX!7*ns{z1O)!&w!B6rf1AYF$j!|3uZh6p{&vX3 z(#X!j3>@Eocc_2t2mK!wi^bHOhlkyii@}7$#Dsy}%=8b}>}(8NTz)^7FGrpW;GTrUUp_) zX7=~YEWFIjw?G34qOGf zgD+>^%J&q(mqM_{vXWwe-+$hDoux_OJqQj`+Rgv~64sv&1Rx^|AG{OJMOt1QZXX#D zofi82xHumGK-eoSCamVMe5&uOrfQM#Tf9l+;hPk;?PKe_2L8M70DT$)zSU)`wVJj5 z>MB-#-I`x672ZEEf8E0#o<(o zH4v!63DOIKegWLY?HcrP(f3g9xhtSPwzl0T?%xZ1I=>cRLKgx+K>vSlm@$-~{UG0A z2Vet2j+^20hybL(px?m&Lyx;9m^S}wE+mA+=rA2(IAs?h?Dn1pb#AYlEQc)-B&a-Y zA!xxlz-Qcn)RX1gduZ`7(p#a%N7;_sdF8F%(3DaLcnI{cH!O|^J$Izo%Dx%JbIw+HTwqYC?PJ&LilAEO(-Et2 zQ}ETbAl}`{UPx*xQ>lS=JtW4+R_F^z9Oiqg2cnsoZdmgxyRC$)D_isrJVRzawxgKH z0w`r=Sln&`f3jX|`_B4>PoE4paS`N7lDK`V()k*EKblP*N>D-o_)=3~6QfD)*mCSe z)Mg=*lV4~MkrZQpYNm17r!43Cgp{vaVa``cQ><+mrcs~|*x@5j1OY`1nSGG2s3Y$U zR`_bLmWgAPVSYLiEw8NPYYYk|Up9TkBtn(+5T%6uXS2FFm9}AE4HId$RWFaD8vAUg6Dq zu39g>+4?QARS;kZC3eB5mGTRYJJecby8a`Lg&K|^E^D(6HtySk@5ZXGJu%K^R{9O0 zhqZZqY4LzU$AfW(`AW+K`YJb6W{&^ccSVAHwO*@NlAgwA;l%qAb^JZ}@0F+28Md4- z07fBbw8FNw&a=gRj=Zj;ntAO;cf_XxZC3>P z#v=mHznGHt#?p5ZkmPbXQJDB{ zO|(Any?H#y%6S%%N=rM3QFXt){tiC1_X%vi&h62uc8e(YbUd6kgsD4n(a%=QM6{P> zsho4(Pw8j}VR_aj^yp^-Gf}>1yhrtaq%t2v5e_dz0ywnG2J-ZK`KF!XYQKYAP#X4N)vZE`tHx_>B!tpS0_H?TxR@x*kFoEgQvQ*n1x+f=vcIJ)iJ! zneIwgk)HxLuderhZizO>pwTy$DJm+|JZ+D0&Fwh$`=F%jF#L%(h#2N?bc?B_Go7!` zD1<@2b96+C9`rXi@%7hxQ@6LbH2p3@*!jvz9Ap2umHu>9hpXu%yXdnQ~a1380l zF2hwbhl~t5O=a-oIwRpK6zBj03KL_2u0Js00rRn!f%yV*w@$Sk4{><-r>cu73bG&Sq8G{SCpex!iLFK zfD?9jipCZfuGR=P)3#Zx3v@~7dB0hXSRB%s$*G)CM9CLjW@{5d8)c}CTR=-rK>-Em zb|m7C6?Jvx(DMu4c!m$v{rov}>InK3#Vs5P=EG;Rt~ZW?R0dIR?~gJvGNzdEln5Cm zJGDkNsNF%7e`EigjC67a!s7WD}kD~zvlYF@?Ao=oGk{xl7T=u>xE1tFzFP@7s&m7yI z`yGfyQ&(OF&*J~O@Nn_q$j;6l0E91_vjS6;Gz<-3CWuk0oMX-$bN53|LI5X}yOSk@ zRMoWTHdsuduwy2OfM`@Snr$_D)`tYiA+0Zn7&5=IC8Z)>hydHG0{-#P4=0ti7aMqt zc^7N$WKrZEIpIBq;2FT2!Uh`!AjBIW1qF0;@Ey4Df~W4bWG821OZw>Za51wk7BZ~0 z05nt@@2qabvdzvO$8&WB!~=kcLPdn05j}AS7Y^hq<&@;fGUOj9LzEP96_9}mpQQj{ zYP^GOog_^4^wk=5b8`m>2*S$B7!BeW=8f-=`|>(Eh=PCtl+xN*_{gweLn8{{!;HF_ zk);yF?Ccn$K7UqLQ`>D`9@oWfWk-%G53fY0UgrHc2UdU%{Fw? zzHBmx+uk+?W2`lpp+gJfrV%YrQwrrP31N#D6&2+b7D6rP=+xN^W2(JAPDH??h>M6o zX4L5QR1K02p5L9r4LWXml7O8MTO5p0I0YZv0|+z9)2QsZ<^!veke!VZRRDyC#19KJ zsD+!jmXeZcEi^iDt7StGm?1TqDiD9ZJ6p5X>GFG}Pozxp^7ak}zw)On!DE7ggTaK) z*M33+)ag`nJMaDRLv&2cAlKu0qqz!oKmZ|^U0zWU^k5w6;EH`0%Jc29$FEXBaZ5Gq zlCaRNukCJIdiunicB}BQJ9!Jo_5Q#8s&twWrKP18yZi-dqX;haz_GK#4Gjlp0(J|h zZ7FnUo0S$6qQO8XoUIJGk{Qh!y?Q>m@$LR4PJ$<5j$C8bNn;Yk-IoplbtI&QJB^f*59bDTUEDxlup-3@QO>t7ndx zqeGJkT4ulsqc=E=nqLDxjx|)hc&e#kOC=@~^IL^XduEjUg6}qD9-0DEE$QmoY~vR# zL2={7KWoL|0PY7_wPE*zAF^Ij&F1z9vCEQJFcGbNxULauZP7+T~PoT64N&R$@qJaTPR8-V%6{-A8!ypp~(tYk6HLAdLPB2j;K0Y@WEzAg( zJM1h(r^AB<4k(Du5e+VSX94|+@9FDUIdE<_dUwQ#_4=2%t z&d<-I1YS6HES09ERpeG1$S)J4evp4{J*B9(7HbcKJM8T&u!^y*gNr$L7|6W1eccw$F0$HHiM0#nd1m0 zW!=o*(>3}(ep`df0N#(DfUx%qHIWlVMd-Ym4H69t;KcwlWL!Taf-SBbi&}(1hp@gz z8s8M?P47|XzgdHFb#)b=2!7(EAU+`hqHu~EsLZjLRrlfZ{f2*TWqG+a6sZ>Fag0Dv zc|nWDRqsu)x;iYtdYpsZbaw5VxGJ`|j9`mFZK{bsCHrrSf@p9!A&62;+7cY# zK=_;c`(R3G9#6_K94Uw2>r!PkH4T)8SstH!cxx&Mii(N-LHcu~ zwPjoZ7vTNNxlh;x7&d<(YiTC(}E)Mx>dVzyLLLXGP;D+#JV zTP<92*_HZuW>ZZe3;}$8X|s@+{tykp0{27=1UmIkNcVQ&5~?;dm94-BQQ1= zmFJF>XuAzdIAazQ8Umcc9v&zBV;e0dwlnR&W2~&K$OA?%3NUXXLu$_!@?e!PF-j== zL?xM+56{mBt5-S?&d(+7?U|mQo~9Ny1b18M5MfH>l!fxsg7Wg{(l|NbV{KmWnpRc_DMi{St%(c(9>fI3+H6AcX}Rk+TE;%tZjKr zGB_MOq_ZI%SmaW%HZPNLq%_CGEM5-N7>nChLtxcGW!ENGB&cFXC8o1Q7%C=iy4f== zi+z;wyL~?z6+O$BrvNf_@$eXCGVqzI+izY7n%Nucb2tq#myp;VD3%RAMGgOcv_0@_ zH?oB!282i+1CpByZVNk4E^NfjTa){}-XGVoGN6DfFIs?A;;>L63yWF!S6kJ%uU)3g z9iH5Gw+qRObLt1@Vzd$Psw(+pJtUn{gRXEvrTpYIa`GrCyj|9biH7dnWs&%fJ5)VA z47z6(&6_u%8So5>$+?0PP-WMee-V}TPAo){X?o2W>+V>;H%9lXpOTLH+{~ea(sYDe zCKuW>_}($V=R_H|zh5mzJV>Szhct^j5M25iHLm=sM$AcLg9D44LO4u(nOe_LV#UNT zBI%MEygdeVcc(Xv2s&(wsY$xKpPgwM^iWnGm~++|@RK8)pu%yUuD$I3(~4??jJmB>L8<5|2~gHS=tK#efyq?}P4ZqWgfo4dPo{Twd&AN}~B48CWL&RQvh znvDksNk5ask_ z5UiR-Diq*@soZGsSfyr?wLY{%j1b$|$-6_k1J;=t$rp#8fl%l=I`h#EXmgL@sKQCf zA-Kwv=lj$hU*KnF^YVtLVfECs(k`!0SBBw>F}pr6;-Y;?&D4WViykS6O&Fah#ldmF z*^5qI=SI){?A^LOhy<2l3?$afFoUUsX{0B3NCQKg3ES=Nyi%x1!+{maZ} z2L2RMrm})L)--|ro#sKDSRP+B3OFRF$h832cB}2F_AN_w@s#D#Z=XV!OG=CcTlcD# zvam(GC@>=ERIzuP%5$1^zS?bsy;r7$L|>`>^r`W3&3%A_0A(u*2(ZZ6fCnyoS-gVo zuVvE1pND%~UaG=Edyg@jLk+Q+rHXIr9qNpNLU^*aHZ*e>t!!kZ?#ZjaRKD>$=h5R> z11kVBt{i$FdOF?`B8hwJSIjv1JNAKV&zcp5n9Vm)EU^3!xoTWuR5-t^v@!voBWy%1 z+!~DI;nUaty%x@X2}wa_a*sj@sf*qIM7fal?>z+ho0Ek0Wgm%9`6ifGV-*E3oHeS1 zmbf+?L}Y*J$#o-dSnequ-H_*l5})NC<@`gWg&uRqbHt0BzoiP&z?TSS^M9rx^-T_P z<}Vq%c*x?}-309gfB^k(Ml!?H5au%p6wuy#ay7E5*qO0JTdN}Map}EHgQS{qn-rTy z)FP6fa`z*d&7vUtqFs_4ZY!R3?uW}%N+f@N5Ev~9bmwu(c^$;*!!(*EHescv_HHft zm9(ZXNf-%SJv+XA5Dy9p+U!~F_AugWHTzk2j}C+c-re3_bJ?w5RmrCk|q0 zkPpBQk_{ID;MrULWJD7bpWTUl-u0VRq_?EoZ*7Z(byJ|!{`?0E_;Q13B|FK4Xd*{r z4v)#nV~FiD0LaPS6j+j4P-TPkW@n4|{j0vHru#&QRfJ@g*>=u4C>qdRL_?!Vy!1Vr zpd53U7<{dUq*;>&B>)Lz=lc42{6Pk$(G%+E*dJ*vBed1ZS~Am8(n6EVZncBsg!e~+ zL;F{>uinoNJ9`W_tF3gtny1o`{S#T9hdb4}F>qgP$bRhLbFSDtOw@kg-dsw)L-#n9 zDNSeV`>CVjhUT~@HU$y;jQc@1G%U<|^O4%c#l<8_ge)|K)k}Z5u(pfz_4U8ss*kVrXopM*JsiS-A`v>LvS&14*l)FGAtC4MWX0gvCrscOJ+N+Ax;W3|it~(Z)?t{p zYE~S+PdyMmAKOq=sr-TTGn+^C`iPux1 zW~5$S?T-8wTo`bJSPTVx&I;0c^E%51F?Ib?EVy=OT&@=NM5#yI~( zBGh**49p-ZY3WHy>UDSA$rxy~D*jqcCWrc^n#{31CVBQw7ne>s+RGjFdT!h1UfORuIW%P@AcwMX50|U7vQ81%6ypGF&Q6~Es$YB;rYJSF> zW$N@s=SSZv% zVN3K7OlS;pL7L$Mqvjx%_ehVVe%uwglQxY#XAVQw2qxqZ{YfK(TY=1%RV?V zfT=1B*UQTebQozmsUN)6RxgBzy`6Pm)sU3jP01d(FZAYkZm>lttOdz*G_r@JKL-E` zvR(5ZRo1>q%O_3&ipVD(MNxNKd3S$5iGq!5!@?*kr2xCfH}`d6b1&YaMT6xZTs#7P zLp2Uq`ec;)$H7T7@@cCu?B7W_kRcy;lNv{4WUr-Y-bsWFyI`W2@edI;NvbxEg@Mn8 z-~?ai?oL5Y3C;6f6ZIHf26aa)@8(4Nlk{$3((%>1-{1S1Uox z?`j^6KX z9*+CdMhMN`=sWdRa0TP>h~^&vUZ?B5(Kc(+O+jwdc3GKz!Mc-`nCfb6z#DYlAfDeW zkaQXn8-NmE12`T|!jahA);j% zsC|2oynDX8tExRd*5t<}mX8*PZSR9PTje?V=!HF+FS>f!^)fJfu=;h_0-jmBB+vmN z*6XT%Fajx+DRpNYa%L)|1}cx*#JKD+PC({Ig<6DqIeMvzk+9E8K(W!8!sg*OUb)=0 zxYFqzaC;WqpQrusV$VlFf?}dEAMn!4yx#F_iUwhkB-^K|$S2Gg5tn+OWoKtC3SOkA z^Y2&>vZ>sy^Fj|nPyR|`z~QvC26xL0J#@TqaJbZ-Ed@_kRFnw|W)Rd2XNFRi|E{FT zr97hww|D1OnpuokE}`~O(us?$R;L+#Y;B)S{dD|@9=~aids2FT}=4$u^rP?4^$pM8-erOJ_&4HipjZ~mE^!y7uI@g89D zv19k)fn|cDj7L4c3t?^rQ)c@&2PY&WxtdP3CHQ;~WQ^r}+oidueCX+o12;`dG(NXy zzr`rgPfg9i_!BLyA5q{hST)OuNx@?y!uX++#z_@pzE@Q}j|9NU$SSYQhI|2mJQz7# z#kSfrBf(RGyT8cZRl~;M2=D!7!$$}VvdA|`&(NWgf0Cjg0D!xr_#C)``kLY3vw1x| zj?6^Pm(%azSZ!uxoXu?eDJ932ZY5Ze0!!2#ec@LP{>VRG{pf%Fq6N<(D) z)dRQ(_=i-!P7v)k6?y0BHbRNs zF|P@`>+yhsEz36viYy-u-RQ$^SCco_?bX#UN&vVsjo-q!>7u^|aB|_TjIM;Dyda)o zHZW~{bBkwTp?c=DB`?nCHP1xR{^%a%|J8+V%fP;lSMU>%HKf%r8v40RTw&e{MXO bAN*mZZ4}i5G`Yby_yE%43Su=PhC%-iapaLt literal 6791 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 diff --git a/assets/translations/en.json b/assets/translations/en.json index fde3597..cbecb40 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -159,8 +159,8 @@ "days": "{} days", "months": "{} months", "certify": "Certify this\nidentity", - "from": "From:", - "to": "To:", + "from": "From:{}", + "to": "To:{}", "amount": "Amount:", "choiceOfSourceWallet": "Choose a source wallet", "extrinsicInProgress": "{} in progress", @@ -171,7 +171,7 @@ "cancel": "Cancel", "inBlockchainResult": "In {} blockchain", "search": "Search an identity\nor an address", - "currencyNode": "{} node :", + "currencyNode": "node", "contactsManagementWithNbr": "My contacts ({})", "contactsManagement": "My contacts", "noContacts": "You don't have any contact", @@ -182,7 +182,7 @@ "importDerivationsInProgress": "Import address {}/{}", "youAreOffline": "You are offline...", "importG1v1": "Import old G1v1 account", - "selectDestWallet": "Select a target wallet:", + "migrateToThisWallet": "Migrate to this wallet:", "youMustWaitBeforeCashoutThisAccount": "You have to wait a few moment before migrate this account", "thisAccountIsEmpty": "This account is empty", "youCannotMigrateIdentityToExistingIdentity": "You cannot migrate an identity\nto an account that already has an identity", diff --git a/assets/translations/es.json b/assets/translations/es.json index d641978..466a36a 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -160,8 +160,8 @@ "days": "{} dias", "months": "{} meses", "certify": "Certificar esta\nidentidad", - "from": "De:", - "to": "A:", + "from": "De:{}", + "to": "A:{}", "amount": "Importe:", "choiceOfSourceWallet": "Elige un monedero de origen", "extrinsicInProgress": "{} en progreso", @@ -172,7 +172,7 @@ "cancel": "Cancelar", "inBlockchainResult": "En la blockchain {}", "search": "Buscar una identidad\no una dirección", - "currencyNode": "Nodo {} :", + "currencyNode": "Nodo", "contactsManagementWithNbr": "Mis contactos ({})", "contactsManagement": "Mis contactos", "noContacts": "No tienes ningún contacto", @@ -183,7 +183,7 @@ "importDerivationsInProgress": "Import address {}/{}", "youAreOffline": "Estás desconectado...", "importG1v1": "Importar la cuenta antigua de G1v1", - "selectDestWallet": "Selecciona un monedero destino:", + "migrateToThisWallet": "Migrate to this wallet:", "youMustWaitBeforeCashoutThisAccount": "Tienes que esperar unos minutos antes de migrar esta cuenta", "thisAccountIsEmpty": "Esta cuenta está vacía", "youCannotMigrateIdentityToExistingIdentity": "No se puede migrar una identidad\na una cuenta que ya tiene una identidad", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index ff8c14a..3286cce 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -159,8 +159,8 @@ "days": "{} jours", "months": "{} mois", "certify": "Certifier cette\nidentité", - "from": "Depuis:", - "to": "Vers:", + "from": "Depuis:{}", + "to": "Vers:{}", "amount": "Montant:", "choiceOfSourceWallet": "Choix du portefeuille source", "extrinsicInProgress": "{} en cours", @@ -171,7 +171,7 @@ "cancel": "Annuler", "inBlockchainResult": "Dans la blockchain {}", "search": "Rechercher une identité\nou une adresse", - "currencyNode": "Noeud {} :", + "currencyNode": "Noeud", "contactsManagementWithNbr": "Mes contacts ({})", "contactsManagement": "Mes contacts", "noContacts": "Vous n'avez aucun contact", @@ -182,7 +182,7 @@ "importDerivationsInProgress": "Importation de l'adresse {}/{}", "youAreOffline": "Vous êtes hors ligne...", "importG1v1": "Importer un ancien compte G1v1", - "selectDestWallet": "Sélectionnez un portefeuille cible:", + "migrateToThisWallet": "Migrer vers ce portefeuille:", "youMustWaitBeforeCashoutThisAccount": "Vous devez attendre quelques minutes\navant de pouvoir migrer ce compte", "thisAccountIsEmpty": "Ce compte est vide", "youCannotMigrateIdentityToExistingIdentity": "Vous ne pouvez pas migrer une identité\nvers un compte disposant déjà d'une identité", diff --git a/assets/translations/it.json b/assets/translations/it.json index b2fa492..876b688 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -172,7 +172,7 @@ "cancel": "Annulla", "inBlockchainResult": "Nella blockchain {}", "search": "Cerca una identitá\no un indirizzo", - "currencyNode": "Nodo {} :", + "currencyNode": "Nodo", "contactsManagementWithNbr": "I miei contatti ({})", "contactsManagement": "I miei contatti", "noContacts": "Non ci sono contatti salvati", @@ -181,7 +181,7 @@ "derivationsScanProgress": "Scannerizzando l'indirizzo {}/{}", "youAreOffline": "Disconnesso...", "importG1v1": "Importa il conto antico da G1v1, versione precedente", - "selectDestWallet": "Seleziona un portafoglio di destinazione:", + "migrateToThisWallet": "Seleziona un portafoglio di destinazione:", "youMustWaitBeforeCashoutThisAccount": "Devi aspettare qualche minuto prima di migrare questo conto", "thisAccountIsEmpty": "Questo conto é vuoto", "youCannotMigrateIdentityToExistingIdentity": "Non si puó migrare un'identitá\na un conto che ne ha giá una", diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..7e7e7f6 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1 @@ +extensions: diff --git a/lib/globals.dart b/lib/globals.dart index 641c106..253b0a1 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -27,10 +27,6 @@ String cesiumPod = "https://g1.data.le-sou.org"; // String cesiumPod = "https://g1.data.presles.fr"; // String cesiumPod = "https://g1.data.e-is.pro"; -// Responsive ratios -late bool isTall; -late double ratio; - // Contexts late BuildContext homeContext; diff --git a/lib/main.dart b/lib/main.dart index d7b8a72..bc6edfb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -139,17 +139,14 @@ class Gecko extends StatelessWidget { localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, - builder: (context, widget) => ResponsiveWrapper.builder( - BouncingScrollWrapper.builder(context, widget!), - maxWidth: 1200, - minWidth: 480, - defaultScale: true, - breakpoints: [ - const ResponsiveBreakpoint.resize(480, name: MOBILE), - const ResponsiveBreakpoint.autoScale(800, name: TABLET), - const ResponsiveBreakpoint.resize(1000, name: DESKTOP), - ], - background: Container(color: backgroundColor)), + builder: (context, child) => ResponsiveBreakpoints.builder( + child: child!, + breakpoints: [ + const Breakpoint(start: 0, end: 450, name: MOBILE), + const Breakpoint(start: 451, end: 800, name: TABLET), + const Breakpoint(start: 801, end: double.infinity, name: DESKTOP), + ], + ), title: 'Ğecko', theme: ThemeData( appBarTheme: const AppBarTheme( diff --git a/lib/models/widgets_keys.dart b/lib/models/widgets_keys.dart index cb558bc..38bdfdf 100644 --- a/lib/models/widgets_keys.dart +++ b/lib/models/widgets_keys.dart @@ -28,6 +28,7 @@ final keyDragAndDrop = GlobalKey(debugLabel: 'keyDragAndDrop'); // Wallet options const keyCopyAddress = Key('keyCopyAddress'); +const keyCopyPubkey = Key('keyCopyPubkey'); const keyOpenActivity = Key('keyOpenActivity'); const keyManageMembership = Key('keyManageMembership'); const keySetDefaultWallet = Key('keySetDefaultWallet'); diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 12d9f01..a68af58 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -471,7 +471,6 @@ class SubstrateSdk with ChangeNotifier { wrapPromise: false, ) ?? []; - // log.d('genesisHash: $genesisHash'); // log.d('genesisHash: ${HEX.decode(genesisHash.substring(2))}'); return genesisHash; } diff --git a/lib/screens/activity.dart b/lib/screens/activity.dart index 2831b91..471f41e 100644 --- a/lib/screens/activity.dart +++ b/lib/screens/activity.dart @@ -12,8 +12,7 @@ import 'package:gecko/widgets/history_query.dart'; import 'package:provider/provider.dart'; class ActivityScreen extends StatefulWidget { - const ActivityScreen( - {required this.address, this.username}) + const ActivityScreen({required this.address, this.username}) : super(key: keyActivityScreen); final String address; final String? username; @@ -42,11 +41,8 @@ class _ActivityScreenState extends State { child: Scaffold( appBar: AppBar( elevation: 0, - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('accountActivity'.tr()), - ), + toolbarHeight: 60, + title: Text('accountActivity'.tr()), ), bottomNavigationBar: const GeckoBottomAppBar(), body: Column(children: [ diff --git a/lib/screens/certifications.dart b/lib/screens/certifications.dart index 4502563..804f88e 100644 --- a/lib/screens/certifications.dart +++ b/lib/screens/certifications.dart @@ -2,9 +2,8 @@ import 'package:accordion/controllers.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; -import 'package:gecko/widgets/certs_received.dart'; +import 'package:gecko/widgets/certs_list.dart'; import 'package:gecko/widgets/certs_counter.dart'; -import 'package:gecko/widgets/certs_sent.dart'; import 'package:accordion/accordion.dart'; class CertificationsScreen extends StatelessWidget { @@ -20,11 +19,8 @@ class CertificationsScreen extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( elevation: 0, - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('certificationsOf'.tr(args: [username])), - )), + toolbarHeight: 60, + title: Text('certificationsOf'.tr(args: [username]))), body: SafeArea( child: Accordion( paddingListTop: 10, @@ -52,7 +48,8 @@ class CertificationsScreen extends StatelessWidget { const SizedBox(width: 5), CertsCounter(address: address) ]), - content: CertsReceived(address: address), + content: CertsList( + address: address, direction: CertDirection.sent), contentHorizontalPadding: 0, contentBorderWidth: 1, ), @@ -70,8 +67,11 @@ class CertificationsScreen extends StatelessWidget { const SizedBox(width: 5), CertsCounter(address: address, isSent: true) ]), - content: CertsSent(address: address), - contentHorizontalPadding: 20, + content: CertsList( + address: address, + direction: CertDirection.sent, + ), + contentHorizontalPadding: 0, contentBorderWidth: 1, // onOpenSection: () => print('onOpenSection ...'), // onCloseSection: () => print('onCloseSection ...'), diff --git a/lib/screens/debug_screen.dart b/lib/screens/debug_screen.dart index 4dbe27f..9ab47dd 100644 --- a/lib/screens/debug_screen.dart +++ b/lib/screens/debug_screen.dart @@ -13,12 +13,7 @@ class DebugScreen extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: const SizedBox( - height: 22, - child: Text('Debug screen'), - )), + appBar: AppBar(toolbarHeight: 60, title: const Text('Debug screen')), body: SafeArea( child: Column(children: [ const SizedBox(height: 40), diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 489e07a..cce156f 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -116,17 +116,10 @@ class _HomeScreenState extends State { Provider.of(context); final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); - isTall = false; - ratio = 1; - if (MediaQuery.of(context).size.height >= 930) { - isTall = true; - ratio = 1.125; - } - return Scaffold( resizeToAvoidBottomInset: false, drawer: MainDrawer(isWalletsExists: isWalletsExists), - backgroundColor: const Color(0xffF9F9F1), + backgroundColor: yellowC, body: isWalletsExists ? geckHome(context) : welcomeHome(context)); } } @@ -153,7 +146,7 @@ Widget geckHome(context) { key: keyDrawerMenu, icon: const Icon( Icons.menu, - color: Colors.white, + color: Colors.black, size: 35, ), onPressed: () => Scaffold.of(context).openDrawer(), @@ -162,18 +155,18 @@ Widget geckHome(context) { ), const Align( child: - Image(image: AssetImage('assets/home/header.png'), height: 210), + Image(image: AssetImage('assets/home/header.png'), height: 170), ), ]), Padding( - padding: EdgeInsets.only(top: 15 * ratio), + padding: const EdgeInsets.only(top: 15), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ DefaultTextStyle( textAlign: TextAlign.center, style: const TextStyle( color: Colors.white, - fontSize: 24, + fontSize: 20, fontWeight: FontWeight.w700, shadows: [ Shadow( @@ -249,11 +242,11 @@ Widget welcomeHome(context) { ), const Align( child: - Image(image: AssetImage('assets/home/header.png'), height: 210), + Image(image: AssetImage('assets/home/header.png'), height: 170), ), ]), Padding( - padding: EdgeInsets.only(top: 1 * ratio), + padding: const EdgeInsets.only(top: 1), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Text( @@ -261,7 +254,7 @@ Widget welcomeHome(context) { textAlign: TextAlign.center, style: const TextStyle( color: Colors.white, - fontSize: 24, + fontSize: 20, fontWeight: FontWeight.w700, shadows: [ Shadow( @@ -296,7 +289,7 @@ Widget welcomeHome(context) { child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 480), child: Column(children: [ - const Spacer(), + const Spacer(flex: 4), Row(children: [ Expanded( child: Stack(children: [ @@ -304,16 +297,17 @@ Widget welcomeHome(context) { padding: EdgeInsets.only(top: 55), child: Image( image: AssetImage('assets/home/gecko-bienvenue.png'), - height: 220, + height: 180, ), ), Positioned( - left: 180, + left: 160, + top: 10, child: BubbleSpeak(text: "noLizard".tr()), ), const Positioned( - left: 200, - top: 60, + left: 180, + top: 70, child: Image( image: AssetImage('assets/home/bout_de_bulle.png'), ), @@ -322,8 +316,8 @@ Widget welcomeHome(context) { ), ]), SizedBox( - width: 410, - height: 70, + width: 335, + height: 60, child: ElevatedButton( key: keyOnboardingNewChest, style: ElevatedButton.styleFrom( @@ -343,14 +337,14 @@ Widget welcomeHome(context) { child: Text( 'createWallet'.tr(), style: const TextStyle( - fontSize: 24, fontWeight: FontWeight.w600), + fontSize: 21, fontWeight: FontWeight.w600), ), ), ), - SizedBox(height: 25 * ratio), + const SizedBox(height: 25), SizedBox( - width: 410, - height: 70, + width: 335, + height: 60, child: OutlinedButton( key: keyRestoreChest, style: OutlinedButton.styleFrom( @@ -368,13 +362,14 @@ Widget welcomeHome(context) { child: Text( "restoreWallet".tr(), style: const TextStyle( - fontSize: 24, + fontSize: 21, color: orangeC, fontWeight: FontWeight.w600), ), ), ), - SizedBox(height: isTall ? 100 : 50) + // const SizedBox(height: 80) + const Spacer(flex: 3), ]), ), ), diff --git a/lib/screens/myWallets/change_pin.dart b/lib/screens/myWallets/change_pin.dart index c469393..4f4e419 100644 --- a/lib/screens/myWallets/change_pin.dart +++ b/lib/screens/myWallets/change_pin.dart @@ -48,11 +48,8 @@ class _ChangePinScreenState extends State { resizeToAvoidBottomInset: false, appBar: AppBar( elevation: 1, - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text(widget.walletName!), - ), + toolbarHeight: 60, + title: Text(widget.walletName!), ), body: Center( child: SafeArea( diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index f44730c..4e1da65 100644 --- a/lib/screens/myWallets/chest_options.dart +++ b/lib/screens/myWallets/chest_options.dart @@ -33,7 +33,7 @@ class ChestOptions extends StatelessWidget { resizeToAvoidBottomInset: false, appBar: AppBar( elevation: 1, - toolbarHeight: 60 * ratio, + toolbarHeight: 60, // leading: IconButton( // icon: const Icon(Icons.arrow_back, color: Colors.black), // onPressed: () { @@ -43,16 +43,13 @@ class ChestOptions extends StatelessWidget { // // ); // Navigator.pop(context); // }), - title: SizedBox( - height: 22, - child: Text(currentChest.name!), - )), + title: Text(currentChest.name!)), bottomNavigationBar: const GeckoBottomAppBar(), body: Stack(children: [ Builder( builder: (ctx) => SafeArea( child: Column(children: [ - SizedBox(height: 30 * ratio), + const SizedBox(height: 30), InkWell( key: keyShowSeed, onTap: () async { @@ -83,7 +80,7 @@ class ChestOptions extends StatelessWidget { } }, child: SizedBox( - height: 50, + height: 70, child: Row(children: [ const SizedBox(width: 20), Image.asset( @@ -91,17 +88,20 @@ class ChestOptions extends StatelessWidget { width: 60, ), const SizedBox(width: 15), - Text( - 'displayMnemonic'.tr(), - style: const TextStyle( - fontSize: 20, - color: orangeC, + SizedBox( + width: 270, + child: Text( + 'displayMnemonic'.tr(), + style: const TextStyle( + fontSize: 20, + color: orangeC, + ), ), ), ]), ), ), - SizedBox(height: 10 * ratio), + const SizedBox(height: 10), Consumer(builder: (context, sub, _) { return InkWell( key: keyChangePin, @@ -127,7 +127,7 @@ class ChestOptions extends StatelessWidget { // } // : null, child: SizedBox( - height: 50, + height: 70, child: Row(children: [ const SizedBox(width: 26), Image.asset( @@ -146,7 +146,7 @@ class ChestOptions extends StatelessWidget { ])), ); }), - SizedBox(height: 10 * ratio), + const SizedBox(height: 10), Consumer(builder: (context, sub, _) { return InkWell( key: keycreateRootDerivation, @@ -163,7 +163,7 @@ class ChestOptions extends StatelessWidget { } : null, child: SizedBox( - height: 50, + height: 70, child: Row(children: [ const SizedBox(width: 35), const Icon( @@ -183,14 +183,14 @@ class ChestOptions extends StatelessWidget { ), ); }), - SizedBox(height: 10 * ratio), + const SizedBox(height: 10), InkWell( key: keyDeleteChest, onTap: () async { await chestProvider.deleteChest(context, currentChest); }, child: SizedBox( - height: 50, + height: 70, child: Row(children: [ const SizedBox(width: 28), Image.asset( diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index 377c5f8..47e1730 100644 --- a/lib/screens/myWallets/choose_chest.dart +++ b/lib/screens/myWallets/choose_chest.dart @@ -33,15 +33,10 @@ class _ChooseChestState extends State { return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('selectMyChest'.tr()), - )), + appBar: AppBar(toolbarHeight: 60, title: Text('selectMyChest'.tr())), body: SafeArea( child: Column(children: [ - SizedBox(height: 160 * ratio), + const SizedBox(height: 160), CarouselSlider( carouselController: buttonCarouselController, options: CarouselOptions( @@ -102,7 +97,7 @@ class _ChooseChestState extends State { ); }).toList(), ), - SizedBox(height: 80 * ratio), + const SizedBox(height: 80), SizedBox( width: 400, height: 70, diff --git a/lib/screens/myWallets/custom_derivations.dart b/lib/screens/myWallets/custom_derivations.dart index b806e7a..022992b 100644 --- a/lib/screens/myWallets/custom_derivations.dart +++ b/lib/screens/myWallets/custom_derivations.dart @@ -48,12 +48,8 @@ class _CustomDerivationState extends State { return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('createCustomDerivation'.tr()), - )), + appBar: + AppBar(toolbarHeight: 60, title: Text('createCustomDerivation'.tr())), body: Center( child: SafeArea( child: Column(children: [ @@ -100,8 +96,8 @@ class _CustomDerivationState extends State { ), const Spacer(flex: 1), SizedBox( - width: 410, - height: 70, + width: 300, + height: 60, child: ElevatedButton( style: ElevatedButton.styleFrom( foregroundColor: Colors.white, elevation: 4, @@ -142,7 +138,7 @@ class _CustomDerivationState extends State { child: Text( 'validate'.tr(), style: const TextStyle( - fontSize: 24, fontWeight: FontWeight.w600), + fontSize: 22, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/import_g1_v1.dart b/lib/screens/myWallets/import_g1_v1.dart index 82f957b..a11dd99 100644 --- a/lib/screens/myWallets/import_g1_v1.dart +++ b/lib/screens/myWallets/import_g1_v1.dart @@ -40,12 +40,7 @@ class ImportG1v1 extends StatelessWidget { }, child: Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('importOldAccount'.tr()), - )), + appBar: AppBar(toolbarHeight: 60, title: Text('importOldAccount'.tr())), body: SafeArea( child: Consumer(builder: (context, sub, _) { return FutureBuilder( @@ -106,7 +101,7 @@ class ImportG1v1 extends StatelessWidget { final unit = isUdUnit ? 'ud'.tr(args: ['']) : currencyName; return Column(children: [ - const SizedBox(height: 20), + const SizedBox(height: 10), TextFormField( key: keyCesiumId, autofocus: true, @@ -117,9 +112,12 @@ class ImportG1v1 extends StatelessWidget { } debounce = Timer( const Duration(milliseconds: debouneTime), () { - sub.reload(); - sub.csToV2Address( - sub.csSalt.text, sub.csPassword.text); + if (sub.csSalt.text != '' && + sub.csPassword.text != '') { + sub.reload(); + sub.csToV2Address( + sub.csSalt.text, sub.csPassword.text); + } }); }, keyboardType: TextInputType.text, @@ -154,9 +152,12 @@ class ImportG1v1 extends StatelessWidget { debounce = Timer( const Duration(milliseconds: debouneTime), () { sub.g1V1NewAddress = ''; - sub.reload(); - sub.csToV2Address( - sub.csSalt.text, sub.csPassword.text); + if (sub.csSalt.text != '' && + sub.csPassword.text != '') { + sub.reload(); + sub.csToV2Address( + sub.csSalt.text, sub.csPassword.text); + } }); }, keyboardType: TextInputType.text, @@ -179,39 +180,67 @@ class ImportG1v1 extends StatelessWidget { ), ), const SizedBox(height: 20), - GestureDetector( - key: keyCopyAddress, - onTap: () { - Clipboard.setData( - ClipboardData(text: sub.g1V1OldPubkey)); - snackCopyKey(context); - }, - child: Text( - sub.g1V1OldPubkey, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), + Visibility( + visible: sub.g1V1OldPubkey != '', + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + GestureDetector( + key: keyCopyPubkey, + onTap: () { + Clipboard.setData( + ClipboardData(text: sub.g1V1OldPubkey)); + snackCopyKey(context); + }, + child: Text( + 'v1: ${getShortPubkey(sub.g1V1OldPubkey)}', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + fontFamily: 'Monospace'), + ), + ), + const SizedBox(height: 5), + GestureDetector( + key: keyCopyAddress, + onTap: () { + Clipboard.setData( + ClipboardData(text: sub.g1V1OldPubkey)); + snackCopyKey(context); + }, + child: Text( + 'v2: ${getShortPubkey(sub.g1V1NewAddress)}', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + fontFamily: 'Monospace'), + ), + ), + ], + ), + const SizedBox(width: 30), + Column( + children: [ + Text( + '${balance['transferableBalance']} $unit', + style: const TextStyle(fontSize: 17), + ), + IdentityStatus( + address: sub.g1V1NewAddress, + isOwner: false, + color: Colors.black), + const SizedBox(width: 10), + Certifications( + address: sub.g1V1NewAddress, size: 14) + ], + ), + ], ), ), const SizedBox(height: 20), - Text( - '${balance['transferableBalance']} $unit', - style: const TextStyle(fontSize: 17), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - IdentityStatus( - address: sub.g1V1NewAddress, - isOwner: false, - color: Colors.black), - const SizedBox(width: 10), - Certifications(address: sub.g1V1NewAddress, size: 14) - ], - ), - const SizedBox(height: 30), - Text('selectDestWallet'.tr()), + Text('migrateToThisWallet'.tr()), const SizedBox(height: 5), DropdownButtonHideUnderline( key: keySelectWallet, @@ -235,10 +264,10 @@ class ImportG1v1 extends StatelessWidget { }, ), ), - const SizedBox(height: 30), + const SizedBox(height: 10), SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 350, + height: 50, child: ElevatedButton( key: keyConfirm, style: ElevatedButton.styleFrom( @@ -270,7 +299,7 @@ class ImportG1v1 extends StatelessWidget { balance: balance, idtyStatus: idtyStatus); Navigator.pop(context); - Navigator.push( + await Navigator.push( context, MaterialPageRoute(builder: (context) { return TransactionInProgress( @@ -286,9 +315,8 @@ class ImportG1v1 extends StatelessWidget { : null, child: Text( 'migrateAccount'.tr(), - style: TextStyle( - fontSize: 23 * ratio, - fontWeight: FontWeight.w600), + style: const TextStyle( + fontSize: 23, fontWeight: FontWeight.w600), ), ), ), @@ -312,5 +340,6 @@ class ImportG1v1 extends StatelessWidget { sub.csSalt.text = ''; sub.csPassword.text = ''; sub.g1V1NewAddress = ''; + sub.g1V1OldPubkey = ''; } } diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index 8b7af18..c370933 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -32,11 +32,7 @@ class ManageMembership extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: const Text('manageMembership').tr(), - )), + toolbarHeight: 60, title: const Text('manageMembership').tr()), body: SafeArea( child: Column(children: [ const SizedBox(height: 20), diff --git a/lib/screens/myWallets/migrate_identity.dart b/lib/screens/myWallets/migrate_identity.dart index 31660b7..1674a12 100644 --- a/lib/screens/myWallets/migrate_identity.dart +++ b/lib/screens/myWallets/migrate_identity.dart @@ -65,12 +65,7 @@ class MigrateIdentityScreen extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('importOldAccount'.tr()), - )), + appBar: AppBar(toolbarHeight: 60, title: Text('importOldAccount'.tr())), body: SafeArea( child: Consumer(builder: (context, sub, _) { return FutureBuilder( @@ -166,7 +161,7 @@ class MigrateIdentityScreen extends StatelessWidget { fontFamily: 'Monospace'), ), const SizedBox(height: 30), - Text('selectDestWallet'.tr()), + Text('migrateToThisWallet'.tr()), const SizedBox(height: 5), DropdownButtonHideUnderline( key: keySelectWallet, @@ -192,8 +187,8 @@ class MigrateIdentityScreen extends StatelessWidget { ), const SizedBox(height: 30), SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( key: keyConfirm, style: ElevatedButton.styleFrom( @@ -240,8 +235,8 @@ class MigrateIdentityScreen extends StatelessWidget { : null, child: Text( 'migrateIdentity'.tr(), - style: TextStyle( - fontSize: 23 * ratio, fontWeight: FontWeight.w600), + style: const TextStyle( + fontSize: 23, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/restore_chest.dart b/lib/screens/myWallets/restore_chest.dart index ee4301f..48eaffc 100644 --- a/lib/screens/myWallets/restore_chest.dart +++ b/lib/screens/myWallets/restore_chest.dart @@ -36,18 +36,13 @@ class RestoreChest extends StatelessWidget { }, child: Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('restoreAChest'.tr()), - )), + appBar: AppBar(toolbarHeight: 60, title: Text('restoreAChest'.tr())), body: SafeArea( child: Stack(children: [ Column(children: [ - SizedBox(height: isTall ? 30 : 15), + const SizedBox(height: 25), bubbleSpeak('toRestoreEnterMnemonic'.tr()), - SizedBox(height: isTall ? 30 : 15), + const SizedBox(height: 25), Column(children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -82,7 +77,7 @@ class RestoreChest extends StatelessWidget { child: Align( alignment: Alignment.center, child: SizedBox( - width: 410, + width: 370, height: 70, child: ElevatedButton( key: keyGoNext, @@ -121,7 +116,7 @@ class RestoreChest extends StatelessWidget { Column(children: [ const SizedBox(height: 20), SizedBox( - width: 190, + width: 220, height: 60, child: ElevatedButton( key: keyPastMnemonic, @@ -137,14 +132,14 @@ class RestoreChest extends StatelessWidget { children: [ const Icon( Icons.content_paste_go, - size: 27, + size: 30, ), // const SizedBox(width: 10), Text( 'pasteFromClipboard'.tr(), textAlign: TextAlign.center, style: const TextStyle( - fontSize: 17, fontWeight: FontWeight.w400), + fontSize: 18, fontWeight: FontWeight.w400), ), ], )), @@ -161,7 +156,7 @@ class RestoreChest extends StatelessWidget { Widget bubbleSpeak(String text) { return Bubble( margin: const BubbleEdges.symmetric(horizontal: 20), - padding: BubbleEdges.all(isTall ? 25 : 15), + padding: const BubbleEdges.all(20), borderWidth: 1, borderColor: Colors.black, radius: Radius.zero, @@ -171,7 +166,7 @@ class RestoreChest extends StatelessWidget { key: keyBubbleSpeak, textAlign: TextAlign.justify, style: const TextStyle( - color: Colors.black, fontSize: 19, fontWeight: FontWeight.w400), + color: Colors.black, fontSize: 18, fontWeight: FontWeight.w400), ), ); } @@ -181,8 +176,8 @@ class RestoreChest extends StatelessWidget { Provider.of(context); return Container( - width: 102, - height: 40 * ratio, + width: 90, + height: 40, // ), decoration: BoxDecoration( border: Border.all(color: Colors.grey), @@ -213,7 +208,7 @@ class RestoreChest extends StatelessWidget { } }, textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20), + style: const TextStyle(fontSize: 18), ), ); } diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart index 0a146c3..2b07c35 100644 --- a/lib/screens/myWallets/show_seed.dart +++ b/lib/screens/myWallets/show_seed.dart @@ -33,12 +33,7 @@ class ShowSeed extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('myMnemonic'.tr()), - )), + appBar: AppBar(toolbarHeight: 60, title: Text('myMnemonic'.tr())), body: SafeArea( child: Column(children: [ const Spacer(flex: 1), @@ -64,62 +59,67 @@ class ShowSeed extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Column(children: [ - BuildText(text: 'keepYourMnemonicSecret'.tr()), - SizedBox(height: 35 * ratio), + BuildText( + text: 'keepYourMnemonicSecret'.tr(), size: 17), + const SizedBox(height: 35), sentanceArray(context, seed.data!.split(' ')), const SizedBox(height: 20), - SizedBox( - height: 40, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), + Row( + children: [ + SizedBox( + height: 40, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + backgroundColor: orangeC, + elevation: 1, // foreground + ), + onPressed: () { + Clipboard.setData( + ClipboardData(text: seed.data!)); + snackCopySeed(context); + }, + child: Row(children: [ + Image.asset( + 'assets/walletOptions/copy-white.png', + height: 25, + ), + const SizedBox(width: 7), + Text( + 'copy'.tr(), + style: TextStyle( + fontSize: 15, color: Colors.grey[50]), + ) + ]), ), - backgroundColor: orangeC, - elevation: 1, // foreground ), - onPressed: () { - Clipboard.setData( - ClipboardData(text: seed.data!)); - snackCopySeed(context); - }, - child: Row(children: [ - Image.asset( - 'assets/walletOptions/copy-white.png', - height: 25, + const SizedBox(width: 50), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return PrintWallet(seed.data); + }), + ); + }, + child: Image.asset( + 'assets/printer.png', + height: 42, ), - const SizedBox(width: 7), - Text( - 'copy'.tr(), - style: TextStyle( - fontSize: 15, color: Colors.grey[50]), - ) - ]), - ), - ), - const SizedBox(height: 30), - GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return PrintWallet(seed.data); - }), - ); - }, - child: Image.asset( - 'assets/printer.png', - height: 42 * ratio, - ), + ), + ], ), ]), ]); }), - const Spacer(flex: 2), + const Spacer(flex: 3), SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( style: ElevatedButton.styleFrom( foregroundColor: Colors.white, elevation: 4, @@ -130,8 +130,8 @@ class ShowSeed extends StatelessWidget { }, child: Text( 'close'.tr(), - style: TextStyle( - fontSize: 23 * ratio, fontWeight: FontWeight.w600), + style: const TextStyle( + fontSize: 23, fontWeight: FontWeight.w600), ), ), ), @@ -141,61 +141,57 @@ class ShowSeed extends StatelessWidget { } Widget sentanceArray(BuildContext context, List mnemonic) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 3), - child: Container( - constraints: const BoxConstraints(maxWidth: 450), - decoration: BoxDecoration( - border: Border.all(color: Colors.black), - color: const Color(0xffeeeedd), - borderRadius: const BorderRadius.all( - Radius.circular(10), - )), - padding: const EdgeInsets.all(20), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row(children: [ - arrayCell(mnemonic[0], 1), - arrayCell(mnemonic[1], 2), - arrayCell(mnemonic[2], 3), - arrayCell(mnemonic[3], 4), - ]), - const SizedBox(height: 15), - Row(children: [ - arrayCell(mnemonic[4], 5), - arrayCell(mnemonic[5], 6), - arrayCell(mnemonic[6], 7), - arrayCell(mnemonic[7], 8), - ]), - const SizedBox(height: 15), - Row(children: [ - arrayCell(mnemonic[8], 9), - arrayCell(mnemonic[9], 10), - arrayCell(mnemonic[10], 11), - arrayCell(mnemonic[11], 12), - ]), - ])), - ); + return Container( + constraints: const BoxConstraints(maxWidth: 375), + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: const Color(0xffeeeedd), + borderRadius: const BorderRadius.all( + Radius.circular(10), + )), + padding: const EdgeInsets.all(15), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(children: [ + arrayCell(mnemonic[0], 1), + arrayCell(mnemonic[1], 2), + arrayCell(mnemonic[2], 3), + arrayCell(mnemonic[3], 4), + ]), + const SizedBox(height: 15), + Row(children: [ + arrayCell(mnemonic[4], 5), + arrayCell(mnemonic[5], 6), + arrayCell(mnemonic[6], 7), + arrayCell(mnemonic[7], 8), + ]), + const SizedBox(height: 15), + Row(children: [ + arrayCell(mnemonic[8], 9), + arrayCell(mnemonic[9], 10), + arrayCell(mnemonic[10], 11), + arrayCell(mnemonic[11], 12), + ]), + ])); } Widget arrayCell(dataWord, int nbr) { log.d(nbr); return SizedBox( - width: 100, + width: 85, child: Column(children: [ Text( nbr.toString(), - style: - TextStyle(fontSize: 13 * ratio, color: const Color(0xff6b6b52)), + style: const TextStyle(fontSize: 13, color: Color(0xff6b6b52)), ), Text( dataWord, key: keyMnemonicWord(dataWord), - style: TextStyle(fontSize: 17 * ratio, color: Colors.black), + style: const TextStyle(fontSize: 17, color: Colors.black), ), ]), ); @@ -219,13 +215,10 @@ class PrintWallet extends StatelessWidget { }), backgroundColor: yellowC, foregroundColor: Colors.black, - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'printMyMnemonic'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'printMyMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), body: PdfPreview( diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 02b51d5..0b70e2b 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -77,18 +77,18 @@ class UnlockingWallet extends StatelessWidget { ), ), Column(children: [ - SizedBox(height: isTall ? 100 : 20), + const SizedBox(height: 80), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ currentChest.imageFile == null ? Image.asset( 'assets/chests/${currentChest.imageName}', - width: isTall ? 130 : 100, + width: 100, ) : Image.file( currentChest.imageFile!, - width: isTall ? 130 : 100, + width: 130, ), const SizedBox(width: 5), SizedBox( @@ -102,17 +102,18 @@ class UnlockingWallet extends StatelessWidget { fontWeight: FontWeight.w700), )), ]), - SizedBox(height: 30 * ratio), + const SizedBox(height: 30), SizedBox( - width: 400, + width: 350, child: Text( 'toUnlockEnterPassword'.tr(), + textAlign: TextAlign.center, style: const TextStyle( fontSize: 19, color: Colors.black, fontWeight: FontWeight.w400), )), - SizedBox(height: 30 * ratio), + const SizedBox(height: 30), if (!myWalletProvider.isPinValid && !myWalletProvider.isPinLoading) Text( @@ -120,9 +121,9 @@ class UnlockingWallet extends StatelessWidget { style: const TextStyle( color: Colors.red, fontWeight: FontWeight.w500), ), - SizedBox(height: 10 * ratio), + const SizedBox(height: 10), pinForm(context, pinLenght), - SizedBox(height: 3 * ratio), + const SizedBox(height: 10), if (canUnlock) Consumer( builder: (context, sub, _) { @@ -150,31 +151,31 @@ class UnlockingWallet extends StatelessWidget { ]), ); }), - const SizedBox(height: 10), + // const SizedBox(height: 10), // if (canUnlock) - InkWell( - key: keyChangeChest, - onTap: () { - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) { - // return const ChooseChest(); - // }), - // ); - }, - child: SizedBox( - width: 400, - height: 50, - child: Center( - child: Text( - 'changeChest'.tr(), - style: const TextStyle( - fontSize: 22, - color: Colors.grey, // orangeC - fontWeight: FontWeight.w600), - ), - ), - )), + // InkWell( + // key: keyChangeChest, + // onTap: () { + // // Navigator.push( + // // context, + // // MaterialPageRoute(builder: (context) { + // // return const ChooseChest(); + // // }), + // // ); + // }, + // child: SizedBox( + // width: 400, + // height: 50, + // child: Center( + // child: Text( + // 'changeChest'.tr(), + // style: const TextStyle( + // fontSize: 22, + // color: Colors.grey, // orangeC + // fontWeight: FontWeight.w600), + // ), + // ), + // )), ]), ]), ]), @@ -200,7 +201,7 @@ class UnlockingWallet extends StatelessWidget { return Form( child: Padding( - padding: EdgeInsets.symmetric(vertical: 5 * ratio, horizontal: 30), + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 30), child: PinCodeTextField( key: keyPinForm, textCapitalization: TextCapitalization.characters, @@ -228,7 +229,7 @@ class UnlockingWallet extends StatelessWidget { borderWidth: 4, shape: PinCodeFieldShape.box, borderRadius: BorderRadius.circular(5), - fieldHeight: 50 * ratio, + fieldHeight: 50, fieldWidth: 50, activeFillColor: Colors.black, ), diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 18f93ad..ab8e5e0 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -61,18 +61,14 @@ class WalletOptions extends StatelessWidget { backgroundColor: backgroundColor, resizeToAvoidBottomInset: false, appBar: AppBar( - toolbarHeight: 60 * ratio, + toolbarHeight: 60, elevation: 0, - title: SizedBox( - height: 22, - child: Consumer( - builder: (context, walletProvider, _) { - return Text(isWalletNameIndexed - ? duniterIndexer - .walletNameIndexer[walletOptions.address.text]! - : wallet.name!); - }), - ), + title: Consumer( + builder: (context, walletProvider, _) { + return Text(isWalletNameIndexed + ? duniterIndexer.walletNameIndexer[walletOptions.address.text]! + : wallet.name!); + }), actions: [ InkWell( onTap: () { @@ -88,7 +84,7 @@ class WalletOptions extends StatelessWidget { child: QrImageWidget( data: walletOptions.address.text, version: QrVersions.auto, - size: 80, + size: 70, ), ), ], @@ -99,7 +95,7 @@ class WalletOptions extends StatelessWidget { builder: (ctx) => SafeArea( child: Column(children: [ Container( - height: isTall ? 5 : 0, + height: 5, color: yellowC, ), Consumer( @@ -116,6 +112,7 @@ class WalletOptions extends StatelessWidget { )), child: Row(children: [ const Spacer(flex: 1), + const SizedBox(width: 15), avatar(walletProvider), const Spacer(flex: 1), Column( @@ -123,7 +120,7 @@ class WalletOptions extends StatelessWidget { children: [ Stack(children: [ SizedBox( - width: 250, + width: 230, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -167,7 +164,7 @@ class WalletOptions extends StatelessWidget { ), ), ]), - SizedBox(height: isTall ? 5 : 0), + const SizedBox(height: 5), Balance( address: walletProvider.address.text, size: 24), const SizedBox(width: 30), @@ -203,7 +200,7 @@ class WalletOptions extends StatelessWidget { size: 20) ]), ), - SizedBox(height: 10 * ratio), + const SizedBox(height: 10), ]), const Spacer(flex: 2), ]), @@ -231,7 +228,7 @@ class WalletOptions extends StatelessWidget { // size: isTall ? 150 : 80, // ), // ), - SizedBox(height: 30 * ratio), + const SizedBox(height: 30), Consumer( builder: (context, walletProvider, _) { final defaultWallet = @@ -242,17 +239,17 @@ class WalletOptions extends StatelessWidget { return Column(children: [ confirmIdentityButton(walletProvider), pubkeyWidget(walletProvider, ctx), - SizedBox(height: 10 * ratio), + const SizedBox(height: 12), activityWidget( context, historyProvider, walletProvider), - SizedBox(height: 12 * ratio), + const SizedBox(height: 13), setDefaultWalletWidget( context, walletProvider, myWalletProvider, walletOptions, currentChest), - SizedBox(height: 17 * ratio), + const SizedBox(height: 18), Column(children: [ if (!walletProvider.isDefaultWallet && !wallet.isMembre()) @@ -294,11 +291,11 @@ class WalletOptions extends StatelessWidget { child: wallet.imageCustomPath == null || wallet.imageCustomPath == '' ? Image.asset( 'assets/avatars/${wallet.imageDefaultPath}', - width: 110, + width: 130, ) : Container( - width: 150, - height: 150, + width: 130, + height: 130, decoration: BoxDecoration( shape: BoxShape.circle, color: Colors.transparent, @@ -404,7 +401,7 @@ class WalletOptions extends StatelessWidget { fontWeight: FontWeight.w800, fontFamily: 'Monospace', color: Colors.black)), - const SizedBox(width: 15), + const Spacer(), SizedBox( height: 40, child: ElevatedButton( @@ -426,14 +423,15 @@ class WalletOptions extends StatelessWidget { 'assets/walletOptions/copy-white.png', height: 25, ), - const SizedBox(width: 7), - Text( - 'copy'.tr(), - style: TextStyle(fontSize: 15, color: Colors.grey[50]), - ) + // const SizedBox(width: 7), + // Text( + // 'copy'.tr(), + // style: TextStyle(fontSize: 15, color: Colors.grey[50]), + // ) ]), ), ), + const Spacer(), ]), ), ); @@ -488,7 +486,7 @@ class WalletOptions extends StatelessWidget { } : null, child: SizedBox( - height: 50, + height: 60, child: Row(children: [ const SizedBox(width: 31), CircleAvatar( @@ -500,15 +498,18 @@ class WalletOptions extends StatelessWidget { ), ), const SizedBox(width: 22), - Text( - walletProvider.isDefaultWallet - ? 'thisWalletIsDefault'.tr() - : 'defineWalletAsDefault'.tr(), - style: TextStyle( - fontSize: 20, - color: walletProvider.isDefaultWallet - ? Colors.grey[500] - : Colors.black)), + SizedBox( + width: 270, + child: Text( + walletProvider.isDefaultWallet + ? 'thisWalletIsDefault'.tr() + : 'defineWalletAsDefault'.tr(), + style: TextStyle( + fontSize: 20, + color: walletProvider.isDefaultWallet + ? Colors.grey[500] + : Colors.black)), + ), ]), ), ); diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart index 5f7aa73..882ccfc 100644 --- a/lib/screens/myWallets/wallets_home.dart +++ b/lib/screens/myWallets/wallets_home.dart @@ -44,7 +44,7 @@ class _WalletsHomeState extends State { backgroundColor: backgroundColor, appBar: AppBar( elevation: 1, - toolbarHeight: 60 * ratio, + toolbarHeight: 60, title: Row( children: [ Image.asset( @@ -131,9 +131,9 @@ class _WalletsHomeState extends State { final screenWidth = MediaQuery.of(context).size.width; int nTule; - if (screenWidth >= 900) { + if (screenWidth >= 700) { nTule = 4; - } else if (screenWidth >= 650) { + } else if (screenWidth >= 450) { nTule = 3; } else { nTule = 2; @@ -148,7 +148,7 @@ class _WalletsHomeState extends State { TargetContent( child: Column( children: [ - Image.asset('assets/drag-and-drop.png', height: 140), + Image.asset('assets/drag-and-drop.png', height: 120), const SizedBox(height: 15), Text( 'explainDraggableWallet'.tr(), @@ -179,7 +179,7 @@ class _WalletsHomeState extends State { } return CustomScrollView(slivers: [ - const SliverToBoxAdapter(child: SizedBox(height: 20)), + const SliverToBoxAdapter(child: SizedBox(height: 15)), if (idtyWallet.address != '') SliverToBoxAdapter( child: DragTuleAction( diff --git a/lib/screens/my_contacts.dart b/lib/screens/my_contacts.dart index a42456c..c5f4864 100644 --- a/lib/screens/my_contacts.dart +++ b/lib/screens/my_contacts.dart @@ -26,12 +26,9 @@ class ContactsScreen extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( elevation: 1, - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'contactsManagementWithNbr'.tr(args: ['${myContacts.length}'])), - ), + toolbarHeight: 60, + title: Text( + 'contactsManagementWithNbr'.tr(args: ['${myContacts.length}'])), ), bottomNavigationBar: const GeckoBottomAppBar(), body: SafeArea( diff --git a/lib/screens/onBoarding/1.dart b/lib/screens/onBoarding/1.dart index 795db64..a8e46b9 100644 --- a/lib/screens/onBoarding/1.dart +++ b/lib/screens/onBoarding/1.dart @@ -15,13 +15,10 @@ class OnboardingStepOne extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'newWallet'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'newWallet'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 81ed468..a1e66fb 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -49,24 +49,21 @@ class OnboardingStepTen extends StatelessWidget { child: Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'myPassword'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, body: SafeArea( child: Stack(children: [ Column(children: [ - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), const BuildProgressBar(pagePosition: 9), - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), BuildText(text: "geckoWillCheckPassword".tr()), - SizedBox(height: isTall ? 60 : 10), + const SizedBox(height: 25), const ScanDerivationsInfo(), Consumer(builder: (context, mw, _) { return Visibility( @@ -79,7 +76,7 @@ class OnboardingStepTen extends StatelessWidget { ), ); }), - SizedBox(height: isTall ? 20 : 10), + const SizedBox(height: 20), Consumer(builder: (context, sub, _) { return sub.nodeConnected ? pinForm(context, walletOptions, pinLenght, 1, 2) @@ -173,7 +170,7 @@ class OnboardingStepTen extends StatelessWidget { borderWidth: 4, shape: PinCodeFieldShape.box, borderRadius: BorderRadius.circular(5), - fieldHeight: 50 * ratio, + fieldHeight: 50, fieldWidth: 50, activeFillColor: Colors.black, ), diff --git a/lib/screens/onBoarding/11_congratulations.dart b/lib/screens/onBoarding/11_congratulations.dart index 9480295..a5a0059 100644 --- a/lib/screens/onBoarding/11_congratulations.dart +++ b/lib/screens/onBoarding/11_congratulations.dart @@ -21,27 +21,24 @@ class OnboardingStepEleven extends StatelessWidget { child: Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, + toolbarHeight: 60, leading: const Icon(Icons.check), - title: SizedBox( - height: 22, - child: Text( - 'allGood'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + title: Text( + 'allGood'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, body: SafeArea( child: Stack(children: [ Column(children: [ - const SizedBox(height: 40), + const SizedBox(height: 30), BuildText( text: "yourChestAndWalletWereCreatedSuccessfully".tr()), - SizedBox(height: isTall ? 20 : 10), + const SizedBox(height: 15), Image.asset( 'assets/onBoarding/gecko-clin.gif', - height: isTall ? 400 : 300, + height: 350, ), Expanded( child: Align( @@ -84,8 +81,8 @@ class OnboardingStepEleven extends StatelessWidget { Widget finishButton(BuildContext context) { return SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( key: keyGoWalletsHome, style: ElevatedButton.styleFrom( @@ -99,7 +96,7 @@ Widget finishButton(BuildContext context) { }, child: Text( "accessMyChest".tr(), - style: TextStyle(fontSize: 22 * ratio, fontWeight: FontWeight.w600), + style: const TextStyle(fontSize: 22, fontWeight: FontWeight.w600), ), ), ); diff --git a/lib/screens/onBoarding/2.dart b/lib/screens/onBoarding/2.dart index 67a9896..a86da72 100644 --- a/lib/screens/onBoarding/2.dart +++ b/lib/screens/onBoarding/2.dart @@ -16,13 +16,10 @@ class OnboardingStepTwo extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'yourMnemonic'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, diff --git a/lib/screens/onBoarding/3.dart b/lib/screens/onBoarding/3.dart index f92d3cc..8a6a35c 100644 --- a/lib/screens/onBoarding/3.dart +++ b/lib/screens/onBoarding/3.dart @@ -16,13 +16,10 @@ class OnboardingStepThree extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'yourMnemonic'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, diff --git a/lib/screens/onBoarding/4.dart b/lib/screens/onBoarding/4.dart index 339ee7f..0ca53b4 100644 --- a/lib/screens/onBoarding/4.dart +++ b/lib/screens/onBoarding/4.dart @@ -16,13 +16,10 @@ class OnboardingStepFor extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'yourMnemonic'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index a258f36..b8b8626 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -40,47 +40,30 @@ class _ChooseChestState extends State { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'yourMnemonic'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, body: SafeArea( child: Stack(children: [ Column(children: [ - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), const BuildProgressBar(pagePosition: 4), - SizedBox(height: isTall ? 40 : 20), - BuildText(text: 'geckoGeneratedYourMnemonicKeepItSecret'.tr()), - SizedBox(height: 35 * ratio), + const SizedBox(height: 25), + BuildText( + text: 'geckoGeneratedYourMnemonicKeepItSecret'.tr(), size: 18), + const SizedBox(height: 15), sentanceArray(context), - SizedBox(height: 17 * ratio), + const SizedBox(height: 17), Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: MainAxisAlignment.center, children: [ - GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return PrintWallet( - generateWalletProvider.generatedMnemonic!); - }), - ); - }, - child: Image.asset( - 'assets/printer.png', - height: 42 * ratio, - ), - ), SizedBox( height: 40, - width: 120, + width: 130, child: ElevatedButton( style: ElevatedButton.styleFrom( foregroundColor: Colors.black, @@ -108,15 +91,31 @@ class _ChooseChestState extends State { ]), ), ), + const SizedBox(width: 70), + GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return PrintWallet( + generateWalletProvider.generatedMnemonic!); + }), + ); + }, + child: Image.asset( + 'assets/printer.png', + height: 42, + ), + ), ], ), - const SizedBox(height: 40), + const SizedBox(height: 17), Expanded( child: Align( alignment: Alignment.bottomCenter, child: SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( key: keyGenerateMnemonic, style: ElevatedButton.styleFrom( @@ -129,17 +128,16 @@ class _ChooseChestState extends State { }, child: Text("chooseAnotherMnemonic".tr(), textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22 * ratio, - fontWeight: FontWeight.w600))), + style: const TextStyle( + fontSize: 22, fontWeight: FontWeight.w600))), ), ), ), - SizedBox(height: 22 * ratio), + const SizedBox(height: 22), nextButton( context, "iNotedMyMnemonic".tr(), false, widget.skipIntro), const Spacer(), - // SizedBox(height: 35 * ratio), + // SizedBox(height: 35), ]), const OfflineInfo(), ]), @@ -152,68 +150,65 @@ Widget sentanceArray(BuildContext context) { final generateWalletProvider = Provider.of(context, listen: false); - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 3), - child: Container( - constraints: const BoxConstraints(maxWidth: 450), - decoration: BoxDecoration( - border: Border.all(color: Colors.black), - color: const Color(0xffeeeedd), - borderRadius: const BorderRadius.all( - Radius.circular(10), - )), - padding: const EdgeInsets.all(20), - child: FutureBuilder( - future: generateWalletProvider.generateWordList(context), - builder: (BuildContext context, AsyncSnapshot data) { - if (!data.hasData) { - return const Text(''); - } else { - mnemoList = data; - return Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row(children: [ - arrayCell(data.data![0]), - arrayCell(data.data![1]), - arrayCell(data.data![2]), - arrayCell(data.data![3]), - ]), - const SizedBox(height: 15), - Row(children: [ - arrayCell(data.data![4]), - arrayCell(data.data![5]), - arrayCell(data.data![6]), - arrayCell(data.data![7]), - ]), - const SizedBox(height: 15), - Row(children: [ - arrayCell(data.data![8]), - arrayCell(data.data![9]), - arrayCell(data.data![10]), - arrayCell(data.data![11]), - ]), - ]); - } - }), - ), + return Container( + constraints: const BoxConstraints(maxWidth: 375), + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: const Color(0xffeeeedd), + borderRadius: const BorderRadius.all( + Radius.circular(10), + )), + padding: const EdgeInsets.all(15), + child: FutureBuilder( + future: generateWalletProvider.generateWordList(context), + builder: (BuildContext context, AsyncSnapshot data) { + if (!data.hasData) { + return const Text(''); + } else { + mnemoList = data; + return Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(children: [ + arrayCell(data.data![0]), + arrayCell(data.data![1]), + arrayCell(data.data![2]), + arrayCell(data.data![3]), + ]), + const SizedBox(height: 12), + Row(children: [ + arrayCell(data.data![4]), + arrayCell(data.data![5]), + arrayCell(data.data![6]), + arrayCell(data.data![7]), + ]), + const SizedBox(height: 12), + Row(children: [ + arrayCell(data.data![8]), + arrayCell(data.data![9]), + arrayCell(data.data![10]), + arrayCell(data.data![11]), + ]), + ]); + } + }), ); } Widget arrayCell(dataWord) { return SizedBox( - width: 100, + width: 85, child: Column(children: [ Text( dataWord.split(':')[0], - style: TextStyle(fontSize: 13 * ratio, color: const Color(0xff6b6b52)), + style: const TextStyle(fontSize: 13, color: Color(0xff6b6b52)), ), Text( dataWord.split(':')[1], key: keyMnemonicWord(dataWord.split(':')[0]), - style: TextStyle(fontSize: 17 * ratio, color: Colors.black), + style: const TextStyle(fontSize: 17, color: Colors.black), ), ]), ); @@ -226,8 +221,8 @@ Widget nextButton( final myWalletProvider = Provider.of(context, listen: false); return SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( key: keyGoNext, style: ElevatedButton.styleFrom( @@ -251,7 +246,7 @@ Widget nextButton( }, child: Text( text, - style: TextStyle(fontSize: 22 * ratio, fontWeight: FontWeight.w600), + style: const TextStyle(fontSize: 22, fontWeight: FontWeight.w600), ), ), ); diff --git a/lib/screens/onBoarding/6.dart b/lib/screens/onBoarding/6.dart index 55dfa62..3c80b6e 100644 --- a/lib/screens/onBoarding/6.dart +++ b/lib/screens/onBoarding/6.dart @@ -42,13 +42,10 @@ class OnboardingStepSix extends StatelessWidget { resizeToAvoidBottomInset: false, extendBodyBehindAppBar: true, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'yourMnemonic'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'yourMnemonic'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), body: SafeArea( @@ -56,23 +53,23 @@ class OnboardingStepSix extends StatelessWidget { Align( alignment: Alignment.topCenter, child: Column(children: [ - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), const BuildProgressBar(pagePosition: 5), - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), BuildText( text: "didYouNoteMnemonicToBeSureTypeWord".tr(args: [ (generateWalletProvider.nbrWord + 1).toString() ]), - size: 20, + size: 18, isMd: true), - SizedBox(height: isTall ? 70 : 20), + const SizedBox(height: 40), Text('${generateWalletProvider.nbrWord + 1}', key: keyAskedWord, - style: TextStyle( - fontSize: isTall ? 17 : 15, + style: const TextStyle( + fontSize: 20, color: orangeC, - fontWeight: FontWeight.w400)), - const SizedBox(height: 10), + fontWeight: FontWeight.w500)), + const SizedBox(height: 5), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(7), @@ -80,7 +77,7 @@ class OnboardingStepSix extends StatelessWidget { color: Colors.grey[600]!, width: 3, )), - width: 430, + width: 350, child: TextFormField( key: keyInputWord, autofocus: true, @@ -95,7 +92,7 @@ class OnboardingStepSix extends StatelessWidget { textAlign: TextAlign.center, decoration: InputDecoration( labelStyle: TextStyle( - fontSize: 22.0, + fontSize: 19, color: Colors.grey[500], fontWeight: FontWeight.w500), labelText: generateWalletProvider.isAskedWordValid @@ -103,10 +100,10 @@ class OnboardingStepSix extends StatelessWidget { : "${generateWalletProvider.nbrWordAlpha} ${"nthMnemonicWord".tr()}", fillColor: const Color(0xffeeeedd), filled: true, - contentPadding: const EdgeInsets.all(12), + contentPadding: const EdgeInsets.all(10), ), style: TextStyle( - fontSize: 40.0, + fontSize: 32, color: generateWalletProvider.askedWordColor, fontWeight: FontWeight.w500))), Visibility( @@ -133,7 +130,7 @@ class OnboardingStepSix extends StatelessWidget { // ), // ), // ), - SizedBox(height: 35 * ratio), + const SizedBox(height: 40), ]), ), const OfflineInfo(), @@ -152,8 +149,8 @@ Widget nextButton(BuildContext context, String text, nextScreen, bool isFast) { generateWalletProvider.askedWordColor = Colors.black; return SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( key: keyGoNext, style: ElevatedButton.styleFrom( diff --git a/lib/screens/onBoarding/7.dart b/lib/screens/onBoarding/7.dart index ba427e4..c17b3d6 100644 --- a/lib/screens/onBoarding/7.dart +++ b/lib/screens/onBoarding/7.dart @@ -17,13 +17,10 @@ class OnboardingStepSeven extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'myPassword'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, @@ -35,7 +32,7 @@ class OnboardingStepSeven extends StatelessWidget { buttonText: '>', nextScreen: OnboardingStepEight(scanDerivation: scanDerivation), pagePosition: 6, - boxHeight: 400), + boxHeight: 320), const OfflineInfo(), ]), ), diff --git a/lib/screens/onBoarding/8.dart b/lib/screens/onBoarding/8.dart index 7650cf5..1a940b5 100644 --- a/lib/screens/onBoarding/8.dart +++ b/lib/screens/onBoarding/8.dart @@ -17,13 +17,10 @@ class OnboardingStepEight extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'myPassword'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, @@ -35,7 +32,8 @@ class OnboardingStepEight extends StatelessWidget { buttonText: '>', nextScreen: OnboardingStepNine(scanDerivation: scanDerivation), pagePosition: 7, - isMd: true), + isMd: true, + boxHeight: 320), const OfflineInfo(), ]), ), diff --git a/lib/screens/onBoarding/9.dart b/lib/screens/onBoarding/9.dart index 176ece3..867c5f9 100644 --- a/lib/screens/onBoarding/9.dart +++ b/lib/screens/onBoarding/9.dart @@ -31,24 +31,21 @@ class OnboardingStepNine extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text( - 'myPassword'.tr(), - style: const TextStyle(fontWeight: FontWeight.w600), - ), + toolbarHeight: 60, + title: Text( + 'myPassword'.tr(), + style: const TextStyle(fontWeight: FontWeight.w600), ), ), extendBodyBehindAppBar: true, body: SafeArea( child: Stack(children: [ Column(children: [ - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), const BuildProgressBar(pagePosition: 8), - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), BuildText(text: "hereIsThePasswordKeepIt".tr()), - const SizedBox(height: 100), + const SizedBox(height: 60), Stack( alignment: Alignment.centerRight, children: [ @@ -62,7 +59,7 @@ class OnboardingStepNine extends StatelessWidget { decoration: const InputDecoration(), style: const TextStyle( letterSpacing: 5, - fontSize: 35.0, + fontSize: 35, color: Colors.black, fontWeight: FontWeight.bold)), IconButton( @@ -84,8 +81,8 @@ class OnboardingStepNine extends StatelessWidget { child: Align( alignment: Alignment.bottomCenter, child: SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( key: keyChangePin, style: ElevatedButton.styleFrom( @@ -99,16 +96,16 @@ class OnboardingStepNine extends StatelessWidget { reload: true); }, child: Text("chooseAnotherPassword".tr(), - style: TextStyle( - fontSize: 22 * ratio, + style: const TextStyle( + fontSize: 22, fontWeight: FontWeight.w600))), ))), - SizedBox(height: 22 * ratio), + const SizedBox(height: 22), NextButton( text: "iNotedMyPassword".tr(), nextScreen: OnboardingStepTen(scanDerivation: scanDerivation), isFast: false), - SizedBox(height: 35 * ratio), + const SizedBox(height: 40), ]), const OfflineInfo(), ]), diff --git a/lib/screens/qrcode_fullscreen.dart b/lib/screens/qrcode_fullscreen.dart index 8726bcd..df8ea61 100644 --- a/lib/screens/qrcode_fullscreen.dart +++ b/lib/screens/qrcode_fullscreen.dart @@ -20,18 +20,15 @@ class QrCodeFullscreen extends StatelessWidget { appBar: AppBar( elevation: 0, backgroundColor: color ?? Colors.black, - toolbarHeight: 60 * ratio, + toolbarHeight: 60, leading: IconButton( icon: const Icon(Icons.arrow_back, color: orangeC), onPressed: () { Navigator.pop(context); }), - title: SizedBox( - height: 22, - child: Text( - 'QR Code de ${getShortPubkey(address)}', - style: const TextStyle(color: orangeC), - ), + title: Text( + 'QR Code de ${getShortPubkey(address)}', + style: const TextStyle(color: orangeC), )), body: SafeArea( child: SizedBox.expand( diff --git a/lib/screens/search.dart b/lib/screens/search.dart index 3b316fe..fc29360 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -28,9 +28,11 @@ class _SearchScreenState extends State { final int debouneTime = 50; Future getClipBoard() async { + final searchProvider = Provider.of(context, listen: false); final clipboard = await Clipboard.getData('text/plain'); pastedAddress = clipboard?.text ?? ''; canPasteAddress = isAddress(pastedAddress); + searchProvider.reload(); } @override @@ -44,10 +46,7 @@ class _SearchScreenState extends State { @override Widget build(BuildContext context) { final searchProvider = Provider.of(context); - final screenHeight = MediaQuery.of(context).size.height; - final canValidate = searchProvider.searchController.text.length >= 2; - // final canPasteAddress = false; return PopScope( onPopInvoked: (_) { @@ -57,16 +56,13 @@ class _SearchScreenState extends State { backgroundColor: backgroundColor, appBar: AppBar( elevation: 1, - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('search'.tr()), - ), + toolbarHeight: 60, + title: Text('search'.tr()), ), body: SafeArea( child: Stack(children: [ Column(children: [ - SizedBox(height: isTall ? 200 : 100), + const SizedBox(height: 165), Padding( padding: const EdgeInsets.symmetric(horizontal: 17), child: TextField( @@ -102,7 +98,7 @@ class _SearchScreenState extends State { suffixIcon: searchProvider.searchController.text == '' ? null : Padding( - padding: const EdgeInsets.symmetric(horizontal: 17), + padding: const EdgeInsets.symmetric(horizontal: 10), child: IconButton( onPressed: (() async => { searchProvider.searchController.text = '', @@ -117,10 +113,10 @@ class _SearchScreenState extends State { ), ), prefixIcon: const Padding( - padding: EdgeInsets.symmetric(horizontal: 17), + padding: EdgeInsets.symmetric(horizontal: 13), child: Image( image: AssetImage('assets/loupe-noire.png'), - height: 35), + height: 30), ), border: OutlineInputBorder( borderSide: @@ -131,19 +127,19 @@ class _SearchScreenState extends State { BorderSide(color: Colors.grey[500]!, width: 2.5), borderRadius: BorderRadius.circular(8), ), - contentPadding: const EdgeInsets.all(20), + contentPadding: const EdgeInsets.all(13), ), style: const TextStyle( - fontSize: 20, + fontSize: 18, color: Colors.black, fontWeight: FontWeight.w400, ), ), ), - const Spacer(flex: 1), + const Spacer(), SizedBox( - width: 320, - height: 90, + width: 280, + height: 80, child: ElevatedButton( key: keyConfirmSearch, style: ElevatedButton.styleFrom( @@ -178,11 +174,11 @@ class _SearchScreenState extends State { : 'search'.tr(), textAlign: TextAlign.center, style: const TextStyle( - fontSize: 21, fontWeight: FontWeight.w600), + fontSize: 19, fontWeight: FontWeight.w600), ), ), ), - Spacer(flex: screenHeight <= 800 ? 1 : 2), + const Spacer(), ]), const OfflineInfo(), ]), diff --git a/lib/screens/search_result.dart b/lib/screens/search_result.dart index 7f1b617..6efa0c2 100644 --- a/lib/screens/search_result.dart +++ b/lib/screens/search_result.dart @@ -20,7 +20,7 @@ class SearchResultScreen extends StatelessWidget { Provider.of(context, listen: false); final duniterIndexer = Provider.of(context, listen: false); - double avatarSize = 55; + double avatarSize = 45; // List myContacts = contactsBox.toMap().values.toList(); // myContacts = myContacts // .where((map) => @@ -33,11 +33,8 @@ class SearchResultScreen extends StatelessWidget { backgroundColor: backgroundColor, appBar: AppBar( elevation: 1, - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('researchResults'.tr()), - ), + toolbarHeight: 60, + title: Text('researchResults'.tr()), ), bottomNavigationBar: const GeckoBottomAppBar(), body: SafeArea( @@ -47,7 +44,7 @@ class SearchResultScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 30), + const SizedBox(height: 20), Center( child: Column( children: [ @@ -73,12 +70,12 @@ class SearchResultScreen extends StatelessWidget { // avatarSize: avatarSize, // walletsProfilesClass: walletsProfilesClass, // duniterIndexer: duniterIndexer), - const SizedBox(height: 40), + const SizedBox(height: 22), Text( 'inBlockchainResult'.tr(args: [currencyName]), - style: const TextStyle(fontSize: 20), + style: const TextStyle(fontSize: 18), ), - const SizedBox(height: 20), + const SizedBox(height: 15), SearchResult( searchProvider: searchProvider, duniterIndexer: duniterIndexer, diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 45be251..921f193 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -8,6 +8,7 @@ import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/settings_provider.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/globals.dart'; +import 'package:gecko/widgets/commons/loading.dart'; import 'package:polkawallet_sdk/api/types/networkParams.dart'; import 'package:provider/provider.dart'; @@ -18,61 +19,54 @@ class SettingsScreen extends StatelessWidget { @override Widget build(BuildContext context) { - const double buttonHigh = 50; - const double buttonWidth = 240; - const double fontSize = 16; - return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: SizedBox( - height: 22, - child: Text('parameters'.tr()), - )), + appBar: AppBar(toolbarHeight: 60, title: Text('parameters'.tr())), body: Column(children: [ const SizedBox(height: 30), Text( 'networkSettings'.tr(), - style: TextStyle(color: Colors.grey[500], fontSize: 22), + style: TextStyle(color: Colors.grey[500], fontSize: 20), ), const SizedBox(height: 20), duniterEndpointSelection(context), const SizedBox(height: 30), indexerEndpointSelection(context), - const SizedBox(height: 40), + const SizedBox(height: 35), Text( 'displaySettings'.tr(), - style: TextStyle(color: Colors.grey[500], fontSize: 22), + style: TextStyle(color: Colors.grey[500], fontSize: 20), ), const SizedBox(height: 20), chooseCurrencyUnit(context), // SizedBox(height: isTall ? 80 : 120), const Spacer(), - SizedBox( - height: buttonHigh, - width: buttonWidth, - child: Center( - child: InkWell( - key: keyDeleteAllWallets, - onTap: () async { - log.i('Oublier tous mes coffres'); - await _myWallets.deleteAllWallet(context); - }, - child: Text( - 'forgetAllMyChests'.tr(), - style: const TextStyle( - fontSize: fontSize + 4, - color: Color(0xffD80000), - fontWeight: FontWeight.w600, + Center( + child: InkWell( + key: keyDeleteAllWallets, + onTap: () async { + log.i('Oublier tous mes coffres'); + await _myWallets.deleteAllWallet(context); + }, + child: SizedBox( + height: 40, + width: 220, + child: Center( + child: Text( + 'forgetAllMyChests'.tr(), + style: const TextStyle( + fontSize: 18, + color: Color(0xffD80000), + fontWeight: FontWeight.w600, + ), ), ), ), ), ), // const Spacer(), - SizedBox(height: isTall ? 90 : 60), + const SizedBox(height: 70), ]), ); } @@ -144,22 +138,26 @@ class SettingsScreen extends StatelessWidget { log.d(sub.sdk.api.connectedNode?.endpoint); return Expanded( child: Row(children: [ - const SizedBox(width: 10), + const SizedBox(width: 2), SizedBox( - width: 80, + width: 60, child: Text( - 'currencyNode'.tr(args: ['']), + 'currencyNode'.tr(), ), ), const Spacer(), - Icon(sub.nodeConnected && !sub.isLoadingEndpoint - ? Icons.check - : Icons.close), + SizedBox( + width: 30, + child: Icon(sub.nodeConnected && !sub.isLoadingEndpoint + ? Icons.check + : Icons.close), + ), if (sub.nodeConnected && !sub.isLoadingEndpoint) const Icon(Icons.add_card_sharp, size: 0.01), const Spacer(), SizedBox( - width: 280, + height: 52, + width: 240, child: Consumer(builder: (context, set, _) { return DropdownButtonHideUnderline( key: keySelectDuniterNodeDropDown, @@ -184,9 +182,9 @@ class SettingsScreen extends StatelessWidget { ); }), ), - const Spacer(flex: 5), + const Spacer(flex: 3), sub.isLoadingEndpoint - ? const CircularProgressIndicator(color: orangeC) + ? const Loading(size: 33, stroke: 2.5) : Consumer(builder: (context, set, _) { return IconButton( key: keyConnectToEndpoint, @@ -196,7 +194,7 @@ class SettingsScreen extends StatelessWidget { sub.getConnectedEndpoint() ? orangeC : Colors.grey[500], - size: 40, + size: 36, ), onPressed: selectedDuniterEndpoint != sub.getConnectedEndpoint() @@ -297,9 +295,9 @@ class SettingsScreen extends StatelessWidget { log.d(indexer.listIndexerEndpoints); return Expanded( child: Row(children: [ - const SizedBox(width: 10), + const SizedBox(width: 5), const SizedBox( - width: 80, + width: 65, // child: Text('indexer'.tr()), // why translation does not work?? child: Text('Indexer'), ), @@ -307,7 +305,7 @@ class SettingsScreen extends StatelessWidget { Icon(indexerEndpoint != '' ? Icons.check : Icons.close), const Spacer(), SizedBox( - width: 280, + width: 240, child: Consumer(builder: (context, set, _) { return DropdownButtonHideUnderline( child: DropdownButton( @@ -332,7 +330,7 @@ class SettingsScreen extends StatelessWidget { ), const Spacer(flex: 5), indexer.isLoadingIndexer - ? const CircularProgressIndicator(color: orangeC) + ? const Loading(size: 33, stroke: 2.5) : Consumer(builder: (context, set, _) { return IconButton( icon: Icon( @@ -340,7 +338,7 @@ class SettingsScreen extends StatelessWidget { color: selectedIndexerEndpoint != indexerEndpoint ? orangeC : Colors.grey[500], - size: 40, + size: 36, ), onPressed: selectedIndexerEndpoint != indexerEndpoint ? () async { diff --git a/lib/screens/template_screen.dart b/lib/screens/template_screen.dart index 185a2da..31bc3bc 100644 --- a/lib/screens/template_screen.dart +++ b/lib/screens/template_screen.dart @@ -10,12 +10,7 @@ class TemplateScreen extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: 60 * ratio, - title: const SizedBox( - height: 22, - child: Text('Template screen'), - )), + appBar: AppBar(toolbarHeight: 60, title: const Text('Template screen')), body: const SafeArea( child: Column(children: [ SizedBox(height: 20), diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 62a247e..a7dcb02 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -94,19 +94,16 @@ class TransactionInProgress extends StatelessWidget { child: Scaffold( backgroundColor: backgroundColor, appBar: AppBar( - toolbarHeight: 60 * ratio, + toolbarHeight: 60, elevation: 0, automaticallyImplyLeading: false, - title: SizedBox( - height: 22, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('extrinsicInProgress'.tr(args: [ - actionMap[transType] ?? 'strangeTransaction'.tr() - ])) - ]), - )), + title: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('extrinsicInProgress'.tr(args: [ + actionMap[transType] ?? 'strangeTransaction'.tr() + ])) + ])), body: SafeArea( child: Align( alignment: FractionalOffset.bottomCenter, @@ -145,17 +142,24 @@ class TransactionInProgress extends StatelessWidget { style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w600), ), - const SizedBox(height: 10), - Text( - 'toMinus'.tr(), - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 18), - ), - Text( - toUsername ?? to, - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w600), + Visibility( + visible: from != to, + child: Column( + children: [ + const SizedBox(height: 10), + Text( + 'toMinus'.tr(), + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 18), + ), + Text( + toUsername ?? to, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.w600), + ), + ], + ), ), const SizedBox(height: 20), ]), @@ -196,7 +200,7 @@ class TransactionInProgress extends StatelessWidget { child: Text( resultText, textAlign: TextAlign.center, - style: TextStyle(fontSize: 19 * ratio), + style: const TextStyle(fontSize: 19), ), ), ]), @@ -205,8 +209,8 @@ class TransactionInProgress extends StatelessWidget { child: Align( alignment: Alignment.bottomCenter, child: SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 300, + height: 55, child: ElevatedButton( key: keyCloseTransactionScreen, style: ElevatedButton.styleFrom( @@ -219,15 +223,14 @@ class TransactionInProgress extends StatelessWidget { }, child: Text( 'close'.tr(), - style: TextStyle( - fontSize: 23 * ratio, - fontWeight: FontWeight.w600), + style: const TextStyle( + fontSize: 23, fontWeight: FontWeight.w600), ), ), ), ), ), - SizedBox(height: isTall ? 80 : 20) + const SizedBox(height: 80) ])), ), ), diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 17b8314..6564f37 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -23,8 +23,8 @@ import 'package:gecko/widgets/payment_popup.dart'; import 'package:provider/provider.dart'; import 'package:qr_flutter/qr_flutter.dart'; -const double buttonSize = 100; -const double buttonFontSize = 18; +const double buttonSize = 85; +const double buttonFontSize = 16; class WalletViewScreen extends StatelessWidget { const WalletViewScreen( @@ -53,7 +53,7 @@ class WalletViewScreen extends StatelessWidget { resizeToAvoidBottomInset: true, appBar: AppBar( elevation: 0, - toolbarHeight: 60 * ratio, + toolbarHeight: 60, actions: [ Row( children: [ @@ -98,22 +98,18 @@ class WalletViewScreen extends StatelessWidget { ], ) ], - title: SizedBox( - height: 22, - child: Text(duniterIndexer - .walletNameIndexer[walletProfile.address] == - null - ? 'seeAWallet'.tr() - : 'memberAccountOf'.tr(args: [ - duniterIndexer.walletNameIndexer[walletProfile.address] ?? - '?' - ]))), + title: Text(duniterIndexer.walletNameIndexer[walletProfile.address] == + null + ? 'seeAWallet'.tr() + : 'memberAccountOf'.tr(args: [ + duniterIndexer.walletNameIndexer[walletProfile.address] ?? '?' + ])), ), bottomNavigationBar: const GeckoBottomAppBar(), body: SafeArea( child: Column(children: [ HeaderProfile(address: address, username: username), - SizedBox(height: isTall ? 30 : 15), + const SizedBox(height: 25), Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Column(children: [ SizedBox( @@ -125,11 +121,12 @@ class WalletViewScreen extends StatelessWidget { key: keyViewActivity, splashColor: orangeC, // inkwell color child: const Padding( - padding: EdgeInsets.all(13), - child: Image( - image: AssetImage( - 'assets/walletOptions/clock.png'), - height: 90)), + padding: EdgeInsets.all(11), + child: Image( + image: + AssetImage('assets/walletOptions/clock.png'), + ), + ), onTap: () { Navigator.push( context, @@ -300,10 +297,11 @@ class WalletViewScreen extends StatelessWidget { key: keyCopyAddress, splashColor: orangeC, child: const Padding( - padding: EdgeInsets.all(20), - child: Image( - image: AssetImage('assets/copy_key.png'), - height: 90)), + padding: EdgeInsets.all(17), + child: Image( + image: AssetImage('assets/copy_key.png'), + ), + ), onTap: () { Clipboard.setData(ClipboardData(text: address)); snackCopyKey(context); @@ -361,7 +359,7 @@ class WalletViewScreen extends StatelessWidget { } : null, child: const Padding( - padding: EdgeInsets.all(14), + padding: EdgeInsets.all(10), child: Image( image: AssetImage('assets/vector_white.png')), )), @@ -381,7 +379,7 @@ class WalletViewScreen extends StatelessWidget { fontWeight: FontWeight.w500), ); }), - SizedBox(height: isTall ? 50 : 20) + const SizedBox(height: 50) ]), )); } @@ -390,17 +388,14 @@ class WalletViewScreen extends StatelessWidget { return Column(children: [ SizedBox( height: buttonSize, - child: Padding( - padding: const EdgeInsets.only(bottom: 0), - child: Container( - foregroundDecoration: const BoxDecoration( - color: Colors.grey, - backgroundBlendMode: BlendMode.saturation, - ), - child: const Opacity( - opacity: 0.5, - child: Image(image: AssetImage('assets/gecko_certify.png')), - ), + child: Container( + foregroundDecoration: const BoxDecoration( + color: Colors.grey, + backgroundBlendMode: BlendMode.saturation, + ), + child: const Opacity( + opacity: 0.5, + child: Image(image: AssetImage('assets/gecko_certify.png')), ), ), ), diff --git a/lib/widgets/balance.dart b/lib/widgets/balance.dart index 53517f0..310f483 100644 --- a/lib/widgets/balance.dart +++ b/lib/widgets/balance.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/widgets/ud_unit_display.dart'; @@ -34,9 +33,7 @@ class Balance extends StatelessWidget { walletOptions.balanceCache[address] != -1) { return Row(children: [ Text(walletOptions.balanceCache[address]!.toString(), - style: TextStyle( - fontSize: isTall ? size : size * 0.9, - color: color)), + style: TextStyle(fontSize: size, color: color)), const SizedBox(width: 5), UdUnitDisplay(size: size, color: color), ]); @@ -58,7 +55,7 @@ class Balance extends StatelessWidget { Text( walletOptions.balanceCache[address]!.toString(), style: TextStyle( - fontSize: isTall ? size : size * 0.9, + fontSize: size, color: color, ), ), diff --git a/lib/widgets/bottom_app_bar.dart b/lib/widgets/bottom_app_bar.dart index a72693c..bf48c5e 100644 --- a/lib/widgets/bottom_app_bar.dart +++ b/lib/widgets/bottom_app_bar.dart @@ -32,7 +32,7 @@ class GeckoBottomAppBar extends StatelessWidget { child: Container( color: yellowC, width: size.width, - height: 80, + height: 70, child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ const Spacer(), const SizedBox(width: 11), diff --git a/lib/widgets/bubble_speak.dart b/lib/widgets/bubble_speak.dart index 1505db8..a52f441 100644 --- a/lib/widgets/bubble_speak.dart +++ b/lib/widgets/bubble_speak.dart @@ -18,7 +18,7 @@ class BubbleSpeak extends StatelessWidget { Widget build(BuildContext context) { return Bubble( padding: long == null - ? const BubbleEdges.all(20) + ? const BubbleEdges.all(18) : BubbleEdges.symmetric(horizontal: long, vertical: 30), elevation: 5, color: backgroundColor, @@ -26,7 +26,7 @@ class BubbleSpeak extends StatelessWidget { text, key: textKey, style: const TextStyle( - color: Colors.black, fontSize: 21, fontWeight: FontWeight.w400), + color: Colors.black, fontSize: 18, fontWeight: FontWeight.w400), ), ); } diff --git a/lib/widgets/buttons/add_new_derivation_button.dart b/lib/widgets/buttons/add_new_derivation_button.dart index ed86d4e..ba9b0a0 100644 --- a/lib/widgets/buttons/add_new_derivation_button.dart +++ b/lib/widgets/buttons/add_new_derivation_button.dart @@ -21,7 +21,7 @@ class AddNewDerivationButton extends StatelessWidget { String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; return Padding( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(12), child: ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(12)), child: Column(children: [ @@ -56,17 +56,17 @@ class AddNewDerivationButton extends StatelessWidget { child: Center( child: myWalletProvider.isNewDerivationLoading ? const SizedBox( - height: 60, - width: 60, + height: 50, + width: 50, child: CircularProgressIndicator( color: orangeC, - strokeWidth: 7, + strokeWidth: 6, ), ) : const Text( '+', style: TextStyle( - fontSize: 150, + fontSize: 120, fontWeight: FontWeight.w700, color: Color(0xFFFCB437)), )), diff --git a/lib/widgets/buttons/chest_options_buttons.dart b/lib/widgets/buttons/chest_options_buttons.dart index 91fa11d..d9e9ad3 100644 --- a/lib/widgets/buttons/chest_options_buttons.dart +++ b/lib/widgets/buttons/chest_options_buttons.dart @@ -19,12 +19,12 @@ class ChestOptionsButtons extends StatelessWidget { return Column(children: [ const SizedBox(height: 50), SizedBox( - height: 80, - width: 420, + height: 65, + width: 340, child: ElevatedButton.icon( icon: Image.asset( 'assets/chests/config.png', - height: 60, + height: 40, ), style: ElevatedButton.styleFrom( foregroundColor: Colors.black, elevation: 2, @@ -39,67 +39,67 @@ class ChestOptionsButtons extends StatelessWidget { label: Text( " ${"manageChest".tr()}", style: const TextStyle( - fontSize: 22, + fontSize: 19, fontWeight: FontWeight.w700, color: Color(0xff8a3c0f), ), ), )), - const SizedBox(height: 30), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - 'assets/cesium_bw2.svg', - semanticsLabel: 'CS', - height: 50, - ), - const SizedBox(width: 5), - InkWell( - key: keyImportG1v1, - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return const ImportG1v1(); - }), - ); - }, - child: SizedBox( - width: 350, + const SizedBox(height: 20), + InkWell( + key: keyImportG1v1, + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const ImportG1v1(); + }), + ); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/cesium_bw2.svg', + semanticsLabel: 'CS', + height: 40, + ), + const SizedBox(width: 5), + SizedBox( + width: 300, height: 60, child: Center( child: Text('importG1v1'.tr(), style: TextStyle( - fontSize: 22, + fontSize: 18, color: Colors.blue[900], fontWeight: FontWeight.w500))), ), - ), - ], - ), - const SizedBox(height: 20), - InkWell( - key: keyChangeChest, - onTap: () { - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) { - // return const ChooseChest(); - // }), - // ); - }, - child: SizedBox( - width: 400, - height: 60, - child: Center( - child: Text('changeChest'.tr(), - style: const TextStyle( - fontSize: 22, - color: Colors.grey, //orangeC - fontWeight: FontWeight.w500))), + ], ), ), + const SizedBox(height: 20), + // InkWell( + // key: keyChangeChest, + // onTap: () { + // // Navigator.push( + // // context, + // // MaterialPageRoute(builder: (context) { + // // return const ChooseChest(); + // // }), + // // ); + // }, + // child: SizedBox( + // width: 270, + // height: 60, + // child: Center( + // child: Text('changeChest'.tr(), + // style: const TextStyle( + // fontSize: 20, + // color: Colors.grey, //orangeC + // fontWeight: FontWeight.w500))), + // ), + // ), const SizedBox(height: 30) ]); } diff --git a/lib/widgets/buttons/home_buttons.dart b/lib/widgets/buttons/home_buttons.dart index f8343ce..034da10 100644 --- a/lib/widgets/buttons/home_buttons.dart +++ b/lib/widgets/buttons/home_buttons.dart @@ -41,11 +41,11 @@ class HomeButtons extends StatelessWidget { color: orangeC, // button color child: InkWell( key: keyOpenSearch, - child: Padding( - padding: const EdgeInsets.all(18), + child: const Padding( + padding: EdgeInsets.all(16), child: Image( - image: const AssetImage('assets/home/loupe.png'), - height: 62 * ratio), + image: AssetImage('assets/home/loupe.png'), + height: 58), ), onTap: () { Navigator.push( @@ -58,17 +58,17 @@ class HomeButtons extends StatelessWidget { ), ), ), - const SizedBox(height: 12), + const SizedBox(height: 10), Text( "searchWallet".tr(), textAlign: TextAlign.center, - style: TextStyle( + style: const TextStyle( color: Colors.white, - fontSize: 15 * ratio, + fontSize: 13.5, fontWeight: FontWeight.w500), ) ]), - const SizedBox(width: 120), + const SizedBox(width: 110), Column(children: [ Container( decoration: const BoxDecoration( @@ -107,27 +107,27 @@ class HomeButtons extends StatelessWidget { Navigator.pushNamed(context, '/mywallets'); } }, - child: Padding( - padding: const EdgeInsets.all(18), + child: const Padding( + padding: EdgeInsets.all(15), child: Image( - image: const AssetImage('assets/home/wallet.png'), - height: 68 * ratio))), + image: AssetImage('assets/home/wallet.png'), + height: 61))), ), ), ), - const SizedBox(height: 12), + const SizedBox(height: 10), Text( "manageWallets".tr(), textAlign: TextAlign.center, - style: TextStyle( + style: const TextStyle( color: Colors.white, - fontSize: 15 * ratio, + fontSize: 13.5, fontWeight: FontWeight.w500), ) ]) ]), Padding( - padding: EdgeInsets.only(top: 35 * ratio), + padding: const EdgeInsets.only(top: 35), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Column(children: [ @@ -144,30 +144,30 @@ class HomeButtons extends StatelessWidget { child: Material( color: orangeC, // button color child: InkWell( - child: Padding( - padding: const EdgeInsets.all(18), + child: const Padding( + padding: EdgeInsets.all(14), child: Image( - image: const AssetImage('assets/home/qrcode.png'), - height: 68 * ratio)), + image: AssetImage('assets/home/qrcode.png'), + height: 62)), onTap: () async { await historyProvider.scan(context); }), ), ), ), - const SizedBox(height: 12), + const SizedBox(height: 10), Text( "scanQRCode".tr(), textAlign: TextAlign.center, - style: TextStyle( + style: const TextStyle( color: Colors.white, - fontSize: 15 * ratio, + fontSize: 13.5, fontWeight: FontWeight.w500), ) ]) ]), ), - SizedBox(height: isTall ? 80 : 40) + const SizedBox(height: 70) ]); } } diff --git a/lib/widgets/cert_tile.dart b/lib/widgets/cert_tile.dart index dc0e25b..1d11381 100644 --- a/lib/widgets/cert_tile.dart +++ b/lib/widgets/cert_tile.dart @@ -16,7 +16,7 @@ class CertTile extends StatelessWidget { @override Widget build(BuildContext context) { int keyID = 0; - const double avatarSize = 200; + const double avatarSize = 50; return Column( children: listCerts.map((repository) { @@ -25,15 +25,17 @@ class CertTile extends StatelessWidget { padding: const EdgeInsets.only(right: 0), child: ListTile( key: keyTransaction(keyID++), - contentPadding: const EdgeInsets.only( - left: 20, right: 30, top: 15, bottom: 15), + contentPadding: + const EdgeInsets.only(left: 10, right: 0, top: 7, bottom: 7), leading: ClipOval( child: defaultAvatar(avatarSize), ), title: Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text(repository['name'], - style: const TextStyle(fontSize: 22)), + padding: const EdgeInsets.only(bottom: 2), + child: Text( + repository['name'], + style: const TextStyle(fontSize: 18), + ), ), subtitle: RichText( text: TextSpan( @@ -44,12 +46,13 @@ class CertTile extends StatelessWidget { children: [ TextSpan( text: repository['date'], + style: const TextStyle(fontSize: 16), ), if (repository[2] != '') TextSpan( text: ' · ', style: TextStyle( - fontSize: 20, + fontSize: 19, color: Colors.grey[550], ), ), @@ -57,8 +60,9 @@ class CertTile extends StatelessWidget { text: getShortPubkey(repository['address']), style: TextStyle( fontStyle: FontStyle.italic, + fontFamily: 'Monospace', color: Colors.grey[600], - fontSize: 18), + fontSize: 16), ), ], ), diff --git a/lib/widgets/certifications.dart b/lib/widgets/certifications.dart index ac7f342..24c029a 100644 --- a/lib/widgets/certifications.dart +++ b/lib/widgets/certifications.dart @@ -35,7 +35,7 @@ class Certifications extends StatelessWidget { ) ], ) - : const Text(''); + : const SizedBox(); }); }), ]); diff --git a/lib/widgets/certs_sent.dart b/lib/widgets/certs_list.dart similarity index 56% rename from lib/widgets/certs_sent.dart rename to lib/widgets/certs_list.dart index 689f7f5..c3105e9 100644 --- a/lib/widgets/certs_sent.dart +++ b/lib/widgets/certs_list.dart @@ -6,9 +6,14 @@ import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/widgets/cert_tile.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -class CertsSent extends StatelessWidget { - const CertsSent({Key? key, required this.address}) : super(key: key); +class CertsList extends StatelessWidget { + const CertsList( + {Key? key, + required this.address, + this.direction = CertDirection.received}) + : super(key: key); final String address; + final CertDirection direction; @override Widget build(BuildContext context) { @@ -21,6 +26,17 @@ class CertsSent extends StatelessWidget { '$indexerEndpoint/v1/graphql', ); + late String gertCertsReq; + late String certFrom; + + if (direction == CertDirection.received) { + gertCertsReq = getCertsReceived; + certFrom = 'issuer'; + } else { + gertCertsReq = getCertsSent; + certFrom = 'receiver'; + } + final client = ValueNotifier( GraphQLClient( cache: GraphQLCache(store: HiveStore()), @@ -31,7 +47,7 @@ class CertsSent extends StatelessWidget { client: client, child: Query( options: QueryOptions( - document: gql(getCertsSent), + document: gql(gertCertsReq), variables: { 'address': address, }, @@ -62,44 +78,46 @@ class CertsSent extends StatelessWidget { ) ]); } + + final List certsData = result.data!['certification']; + List listCerts = []; + for (final cert in certsData) { + final String issuerAddress = cert[certFrom]['pubkey']; + final String issuerName = cert[certFrom]['name']; + final date = DateTime.parse(cert['created_at']); + final dp = DateTime(date.year, date.month, date.day); + final dateForm = '${dp.day}-${dp.month}-${dp.year}'; + listCerts.add({ + 'address': issuerAddress, + 'name': issuerName, + 'date': dateForm + }); + } + // Build history list return SizedBox( height: windowHeight, child: ListView( key: keyListTransactions, - children: [certsView(result)], + children: [ + result.data == null + ? Column(children: [ + const SizedBox(height: 50), + Text( + "noTransactionToDisplay".tr(), + style: const TextStyle(fontSize: 18), + ) + ]) + : Column(children: [ + CertTile(listCerts: listCerts), + ]) + ], ), ); }, ), ); } - - Widget certsView(QueryResult result) { - List listCerts = []; - final List certsData = result.data!['certification']; - - for (final cert in certsData) { - final String issuerAddress = cert['receiver']['pubkey']; - final String issuerName = cert['receiver']['name']; - final date = DateTime.parse(cert['created_at']); - final dp = DateTime(date.year, date.month, date.day); - final dateForm = '${dp.day}-${dp.month}-${dp.year}'; - - listCerts.add( - {'address': issuerAddress, 'name': issuerName, 'date': dateForm}); - } - - return result.data == null - ? Column(children: [ - const SizedBox(height: 50), - Text( - "noTransactionToDisplay".tr(), - style: const TextStyle(fontSize: 18), - ) - ]) - : Column(children: [ - CertTile(listCerts: listCerts), - ]); - } } + +enum CertDirection { received, sent } diff --git a/lib/widgets/certs_received.dart b/lib/widgets/certs_received.dart deleted file mode 100644 index 32c274e..0000000 --- a/lib/widgets/certs_received.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; -import 'package:gecko/models/queries_indexer.dart'; -import 'package:gecko/models/widgets_keys.dart'; -import 'package:gecko/widgets/cert_tile.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; - -class CertsReceived extends StatelessWidget { - const CertsReceived({Key? key, required this.address}) : super(key: key); - final String address; - - @override - Widget build(BuildContext context) { - final screenHeight = MediaQuery.of(context).size.height; - final appBarHeight = AppBar().preferredSize.height; - log.d(appBarHeight); - final windowHeight = screenHeight - appBarHeight - 200; - - final httpLink = HttpLink( - '$indexerEndpoint/v1/graphql', - ); - - final client = ValueNotifier( - GraphQLClient( - cache: GraphQLCache(store: HiveStore()), - link: httpLink, - ), - ); - return GraphQLProvider( - client: client, - child: Query( - options: QueryOptions( - document: gql(getCertsReceived), - variables: { - 'address': address, - }, - ), - builder: (QueryResult result, {fetchMore, refetch}) { - if (result.isLoading && result.data == null) { - return const Center( - child: CircularProgressIndicator(), - ); - } - - if (result.hasException || result.data == null) { - log.e('Error Indexer: ${result.exception}'); - return Column(children: [ - const SizedBox(height: 50), - Text( - "noNetworkNoHistory".tr(), - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 18), - ) - ]); - } else if (result.data?['certification']?.isEmpty) { - return Column(children: [ - const SizedBox(height: 50), - Text( - "noDataToDisplay".tr(), - style: const TextStyle(fontSize: 18), - ) - ]); - } - // Build history list - return SizedBox( - height: windowHeight, - child: ListView( - key: keyListTransactions, - children: [certsView(result)], - ), - ); - }, - ), - ); - } - - Widget certsView(QueryResult result) { - List listCerts = []; - final List certsData = result.data!['certification']; - - for (final cert in certsData) { - final String issuerAddress = cert['issuer']['pubkey']; - final String issuerName = cert['issuer']['name']; - final date = DateTime.parse(cert['created_at']); - final dp = DateTime(date.year, date.month, date.day); - final dateForm = '${dp.day}-${dp.month}-${dp.year}'; - listCerts.add( - {'address': issuerAddress, 'name': issuerName, 'date': dateForm}); - } - - return result.data == null - ? Column(children: [ - const SizedBox(height: 50), - Text( - "noTransactionToDisplay".tr(), - style: const TextStyle(fontSize: 18), - ) - ]) - : Column(children: [ - CertTile(listCerts: listCerts), - ]); - } -} diff --git a/lib/widgets/cesium_avatar.dart b/lib/widgets/cesium_avatar.dart index 4290189..e941ab0 100644 --- a/lib/widgets/cesium_avatar.dart +++ b/lib/widgets/cesium_avatar.dart @@ -13,7 +13,6 @@ class CesiumAvatar extends StatelessWidget { @override Widget build(BuildContext context) { final csProvider = Provider.of(context, listen: false); - log.d('tatata'); return ClipOval( child: FutureBuilder( diff --git a/lib/widgets/commons/build_image.dart b/lib/widgets/commons/build_image.dart index d3b284a..86b7e44 100644 --- a/lib/widgets/commons/build_image.dart +++ b/lib/widgets/commons/build_image.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; class BuildImage extends StatelessWidget { const BuildImage({ @@ -17,8 +16,8 @@ class BuildImage extends StatelessWidget { Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(0), - width: 440, - height: isTall ? boxHeight : boxHeight * 0.9, + width: imageWidth, + height: boxHeight, decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topLeft, @@ -29,6 +28,6 @@ class BuildImage extends StatelessWidget { ], ), border: Border.all(color: Colors.grey[900]!)), - child: Image.asset('assets/onBoarding/$assetName', width: imageWidth)); + child: Image.asset('assets/onBoarding/$assetName')); } } diff --git a/lib/widgets/commons/build_progress_bar.dart b/lib/widgets/commons/build_progress_bar.dart index 6436388..cee04ff 100644 --- a/lib/widgets/commons/build_progress_bar.dart +++ b/lib/widgets/commons/build_progress_bar.dart @@ -16,8 +16,10 @@ class BuildProgressBar extends StatelessWidget { dotsCount: 10, position: pagePosition, decorator: DotsDecorator( + size: const Size.square(7), + activeSize: const Size.square(10), spacing: const EdgeInsets.symmetric(horizontal: 10), - color: Colors.grey[300]!, // Inactive color + color: Colors.grey[400]!, activeColor: orangeC, ), ); diff --git a/lib/widgets/commons/build_text.dart b/lib/widgets/commons/build_text.dart index eac00be..14f4d33 100644 --- a/lib/widgets/commons/build_text.dart +++ b/lib/widgets/commons/build_text.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; -import 'package:gecko/globals.dart'; class BuildText extends StatelessWidget { const BuildText({ Key? key, required this.text, - this.size = 20, + this.size = 18, this.isMd = true, }) : super(key: key); @@ -17,16 +16,13 @@ class BuildText extends StatelessWidget { @override Widget build(BuildContext context) { final mdStyle = MarkdownStyleSheet( - p: TextStyle( - fontSize: isTall ? size : size * 0.9, - color: Colors.black, - letterSpacing: 0.3), + p: TextStyle(fontSize: size, color: Colors.black, letterSpacing: 0.3), textAlign: WrapAlignment.spaceBetween, ); return Container( padding: const EdgeInsets.all(12), - width: 440, + width: 375, decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.grey[900]!)), child: isMd @@ -34,9 +30,7 @@ class BuildText extends StatelessWidget { : Text(text, textAlign: TextAlign.justify, style: TextStyle( - fontSize: isTall ? size : size * 0.9, - color: Colors.black, - letterSpacing: 0.3)), + fontSize: size, color: Colors.black, letterSpacing: 0.3)), ); } } diff --git a/lib/widgets/commons/common_elements.dart b/lib/widgets/commons/common_elements.dart index 93f42fb..ca51eab 100644 --- a/lib/widgets/commons/common_elements.dart +++ b/lib/widgets/commons/common_elements.dart @@ -194,24 +194,3 @@ bool isAddress(address) { return false; } } - -// Widget geckoAppBar() { -// return AppBar( -// toolbarHeight: 60 * ratio, -// elevation: 0, -// leading: IconButton( -// icon: const Icon(Icons.arrow_back, color: Colors.black), -// onPressed: () { -// _walletOptions.isEditing = false; -// _walletOptions.isBalanceBlur = false; -// Navigator.pop(context); -// }), -// title: SizedBox( -// height: 22, -// child: Consumer( -// builder: (context, walletProvider, _) { -// return Text(_walletOptions.nameController.text); -// }), -// ), -// ); -// } diff --git a/lib/widgets/commons/intro_info.dart b/lib/widgets/commons/intro_info.dart index 5169004..632c9f9 100644 --- a/lib/widgets/commons/intro_info.dart +++ b/lib/widgets/commons/intro_info.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; import 'package:gecko/widgets/commons/build_image.dart'; import 'package:gecko/widgets/commons/build_progress_bar.dart'; import 'package:gecko/widgets/commons/build_text.dart'; @@ -15,9 +14,9 @@ class InfoIntro extends StatelessWidget { required this.pagePosition, this.isMd = false, this.isFast = false, - this.boxHeight = 440, - this.imageWidth = 350, - this.textSize = 20, + this.boxHeight = 375, + this.imageWidth = 375, + this.textSize = 18, }) : super(key: key); final String text; @@ -34,12 +33,10 @@ class InfoIntro extends StatelessWidget { @override Widget build(BuildContext context) { return Column(children: [ - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 25), BuildProgressBar(pagePosition: pagePosition), - SizedBox(height: isTall ? 40 : 20), - + const SizedBox(height: 25), BuildText(text: text, size: textSize, isMd: isMd), - BuildImage( assetName: assetName, boxHeight: boxHeight, imageWidth: imageWidth), Expanded( @@ -49,8 +46,7 @@ class InfoIntro extends StatelessWidget { text: buttonText, nextScreen: nextScreen, isFast: false), ), ), - // const SizedBox(height: 40), - SizedBox(height: isTall ? 40 : 20), + const SizedBox(height: 40), ]); } } diff --git a/lib/widgets/commons/next_button.dart b/lib/widgets/commons/next_button.dart index 2a92142..7f636ae 100644 --- a/lib/widgets/commons/next_button.dart +++ b/lib/widgets/commons/next_button.dart @@ -18,8 +18,8 @@ class NextButton extends StatelessWidget { @override Widget build(BuildContext context) { return SizedBox( - width: 380 * ratio, - height: 60 * ratio, + width: 370, + height: 60, child: ElevatedButton( key: keyGoNext, style: ElevatedButton.styleFrom( @@ -32,7 +32,7 @@ class NextButton extends StatelessWidget { }, child: Text( text, - style: TextStyle(fontSize: 23 * ratio, fontWeight: FontWeight.w600), + style: const TextStyle(fontSize: 23, fontWeight: FontWeight.w600), ), ), ); diff --git a/lib/widgets/contacts_list.dart b/lib/widgets/contacts_list.dart index 128ed94..7c5980d 100644 --- a/lib/widgets/contacts_list.dart +++ b/lib/widgets/contacts_list.dart @@ -27,11 +27,11 @@ class ContactsList extends StatelessWidget { final duniterIndexer = Provider.of(context, listen: false); return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: 5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 20, width: double.infinity), + const SizedBox(height: 10, width: double.infinity), if (myContacts.isEmpty) Text('noContacts'.tr()) else @@ -42,7 +42,7 @@ class ContactsList extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 5), child: ListTile( key: keySearchResult('keyID++'), - horizontalTitleGap: 40, + horizontalTitleGap: 7, contentPadding: const EdgeInsets.all(5), leading: CesiumAvatar(address: g1Wallet.address, size: 55), diff --git a/lib/widgets/drag_tule_action.dart b/lib/widgets/drag_tule_action.dart index 1c3e640..44b600b 100644 --- a/lib/widgets/drag_tule_action.dart +++ b/lib/widgets/drag_tule_action.dart @@ -23,9 +23,7 @@ class DragTuleAction extends StatelessWidget { delay: const Duration(milliseconds: 200), data: wallet.address, dragAnchorStrategy: (Draggable _, BuildContext __, Offset ___) => - const Offset(0, 0), - // feedbackOffset: const Offset(-500, -500), - // dragAnchorStrategy: childDragAnchorStrategy, + const Offset(55, 55), onDragStarted: () => myWalletProvider.dragAddress = wallet, onDragEnd: (_) { myWalletProvider.lastFlyBy = null; diff --git a/lib/widgets/drag_wallets_info.dart b/lib/widgets/drag_wallets_info.dart index 6428d4a..ed0820d 100644 --- a/lib/widgets/drag_wallets_info.dart +++ b/lib/widgets/drag_wallets_info.dart @@ -31,15 +31,16 @@ class DragWalletsInfo extends StatelessWidget { return Container( color: yellowC, width: screenWidth, - height: 80, + height: 90, child: Center( child: Column( children: [ const SizedBox(height: 2), Text('${'executeATransfer'.tr()}:'), - MarkdownBody(data: '${'from'.tr()} **$fromName**'), + MarkdownBody(data: '${'from'.tr(args: [''])} **$fromName**'), if (isSameAddress) Text('chooseATargetWallet'.tr()), - if (!isSameAddress) MarkdownBody(data: 'Vers: **$toName**'), + if (!isSameAddress) + MarkdownBody(data: '${'to'.tr(args: [''])} **$toName**'), ], )), ); diff --git a/lib/widgets/drawer.dart b/lib/widgets/drawer.dart index 68bc78b..f00e046 100644 --- a/lib/widgets/drawer.dart +++ b/lib/widgets/drawer.dart @@ -19,82 +19,116 @@ class MainDrawer extends StatelessWidget { @override Widget build(BuildContext context) { - return Drawer( - child: Column( - children: [ - Expanded( - child: ListView(padding: EdgeInsets.zero, children: [ - const DrawerHeader( - decoration: BoxDecoration( - color: orangeC, + const listStyle = TextStyle(fontSize: 16); + + return SizedBox( + width: MediaQuery.of(context).size.width * 0.67, + child: Drawer( + child: Column( + children: [ + Expanded( + child: ListView(padding: EdgeInsets.zero, children: [ + const DrawerHeader( + decoration: BoxDecoration( + color: orangeC, + ), + child: Column(children: [ + Image( + image: AssetImage('assets/icon/gecko_final.png'), + height: 130), + ]), ), - child: Column(children: [ - SizedBox(height: 0), - Image( - image: AssetImage('assets/icon/gecko_final.png'), - height: 130), - ]), - ), - ListTile( - key: keyParameters, - title: Text('parameters'.tr()), - onTap: () { - Navigator.pop(context); - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return SettingsScreen(); + const SizedBox(height: 10), + Opacity( + opacity: 0.8, + child: ListTile( + key: keyParameters, + leading: const Icon(Icons.settings), + title: Text( + 'parameters'.tr(), + style: listStyle, + ), + onTap: () { + Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return SettingsScreen(); + }), + ); + }, + ), + ), + const SizedBox(height: 5), + if (isWalletsExists) + Opacity( + opacity: 0.8, + child: ListTile( + key: keyContacts, + leading: const Icon(Icons.contacts_rounded), + title: Text( + 'contactsManagement'.tr(), + style: listStyle, + ), + onTap: () { + Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const ContactsScreen(); + }), + ); + }, + ), + ), + const SizedBox(height: 5), + if (kDebugMode) + Opacity( + opacity: 0.8, + child: ListTile( + key: keyDebugScreen, + leading: const Icon(Icons.developer_mode_rounded), + title: Text( + 'Debug screen'.tr(), + style: listStyle, + ), + onTap: () { + Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const DebugScreen(); + }), + ); + }, + ), + ), + ])), + Align( + alignment: FractionalOffset.bottomCenter, + child: InkWell( + key: keyCopyAddress, + splashColor: orangeC, + child: Padding( + padding: const EdgeInsets.all(15), + child: Opacity( + opacity: 0.8, + child: Text('Ğecko v$appVersion', + style: const TextStyle(fontSize: 13)), + ), + ), + onTap: () { + Clipboard.setData( + ClipboardData(text: 'Ğecko v$appVersion')); + snackMessage(context, + message: + 'Le numéro de version de Ğecko a été copié dans votre presse papier', + duration: 4); }), - ); - }, ), - if (isWalletsExists) - ListTile( - key: keyContacts, - title: Text('contactsManagement'.tr()), - onTap: () { - Navigator.pop(context); - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return const ContactsScreen(); - }), - ); - }, - ), - if (kDebugMode) - ListTile( - key: keyDebugScreen, - title: Text('Debug screen'.tr()), - onTap: () { - Navigator.pop(context); - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return const DebugScreen(); - }), - ); - }, - ), - ])), - Align( - alignment: FractionalOffset.bottomCenter, - child: InkWell( - key: keyCopyAddress, - splashColor: orangeC, - child: Padding( - padding: const EdgeInsets.all(20), - child: Text('Ğecko v$appVersion')), - onTap: () { - Clipboard.setData(ClipboardData(text: 'Ğecko v$appVersion')); - snackMessage(context, - message: - 'Le numéro de version de Ğecko a été copié dans votre presse papier', - duration: 4); - }), - ), - const SizedBox(height: 20) - ], + const SizedBox(height: 15) + ], + ), ), ); } diff --git a/lib/widgets/header_profile.dart b/lib/widgets/header_profile.dart index d852e54..b7aeac4 100644 --- a/lib/widgets/header_profile.dart +++ b/lib/widgets/header_profile.dart @@ -27,7 +27,7 @@ class HeaderProfile extends StatelessWidget { @override Widget build(BuildContext context) { - const double avatarSize = 140; + const double avatarSize = 130; final duniterIndexer = Provider.of(context, listen: false); final walletOptions = Provider.of(context, listen: false); @@ -37,7 +37,7 @@ class HeaderProfile extends StatelessWidget { Consumer(builder: (context, sub, _) { bool isAccountExist = walletOptions.balanceCache[address] != 0; return Container( - height: 185, + height: 170, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, @@ -50,13 +50,13 @@ class HeaderProfile extends StatelessWidget { )); }), Padding( - padding: const EdgeInsets.only(left: 30, right: 30), + padding: const EdgeInsets.only(left: 20, right: 20), child: Row(children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - height: 10, + height: 5, color: yellowC, ), Row(children: [ @@ -69,14 +69,15 @@ class HeaderProfile extends StatelessWidget { child: Text( getShortPubkey(address), style: const TextStyle( - fontSize: 30, - fontWeight: FontWeight.w800, + fontSize: 27, + fontFamily: 'Monospace', + fontWeight: FontWeight.w900, ), ), ), ]), - const SizedBox(height: 18), - Balance(address: address, size: 25), + const SizedBox(height: 15), + Balance(address: address, size: 23), const SizedBox(height: 5), InkWell( onTap: () => sub.certsCounterCache[address] != null @@ -106,7 +107,9 @@ class HeaderProfile extends StatelessWidget { ), ]), const Spacer(), + // const SizedBox(width: 20), Column(children: [ + const SizedBox(height: 15), CesiumAvatar(address: address, size: avatarSize), ]), ]), diff --git a/lib/widgets/history_view.dart b/lib/widgets/history_view.dart index b17a9d9..480f7f1 100644 --- a/lib/widgets/history_view.dart +++ b/lib/widgets/history_view.dart @@ -24,7 +24,7 @@ class HistoryView extends StatelessWidget { final sub = Provider.of(homeContext, listen: false); int keyID = 0; - const double avatarSize = 200; + const double avatarSize = 50; bool isMigrationPassed = false; List pastDelimiters = []; @@ -51,21 +51,19 @@ class HistoryView extends StatelessWidget { return Column(children: [ if (isMigrationTime) Padding( - padding: const EdgeInsets.symmetric(vertical: 30), + padding: const EdgeInsets.symmetric(vertical: 25), child: Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ const Image( image: AssetImage('assets/party.png'), height: 40), - const SizedBox(width: 40), Text( 'blockchainStart'.tr(), style: const TextStyle( - fontSize: 25, + fontSize: 23, color: Colors.blueAccent, fontWeight: FontWeight.w500), ), - const SizedBox(width: 40), const Image( image: AssetImage('assets/party.png'), height: 40), ], @@ -76,7 +74,7 @@ class HistoryView extends StatelessWidget { !(pastDelimiters[pastDelimiters.length - 2] == answer['dateDelimiter'])) Padding( - padding: const EdgeInsets.symmetric(vertical: 30), + padding: const EdgeInsets.symmetric(vertical: 20), child: Text( answer['dateDelimiter'], style: const TextStyle( @@ -117,30 +115,29 @@ class HistoryView extends StatelessWidget { }), ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - const Icon( + Icon( Icons.account_circle, size: 40, - color: Colors.blueAccent, + color: Colors.green[700], ), - const SizedBox(width: 40), Column(children: [ Text( 'Identité migré:'.tr(), - style: const TextStyle( - fontSize: 25, - color: Colors.blueAccent, + style: TextStyle( + fontSize: 23, + color: Colors.green[700], fontWeight: FontWeight.w500), ), - Text( - 'Ancienne adresse: ${getShortPubkey(sub.oldOwnerKeys[address]![0])}') + Text('from'.tr(args: [ + ' ${getShortPubkey(sub.oldOwnerKeys[address]![0])}' + ])), ]), - const SizedBox(width: 40), - const Icon( + Icon( Icons.account_circle, size: 40, - color: Colors.blueAccent, + color: Colors.green[700], ), ], ), diff --git a/lib/widgets/payment_popup.dart b/lib/widgets/payment_popup.dart index b18fbf0..8950b55 100644 --- a/lib/widgets/payment_popup.dart +++ b/lib/widgets/payment_popup.dart @@ -117,7 +117,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { ), child: Padding( padding: const EdgeInsets.only( - top: 24, bottom: 0, left: 24, right: 24), + top: 15, bottom: 0, left: 17, right: 17), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -128,11 +128,11 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { Text( 'executeATransfer'.tr(), style: const TextStyle( - fontSize: 26, fontWeight: FontWeight.w700), + fontSize: 24, fontWeight: FontWeight.w700), ), IconButton( key: keyPopButton, - iconSize: 40, + iconSize: 35, icon: const Icon(Icons.cancel_outlined), onPressed: () { Navigator.pop(context); @@ -141,7 +141,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { ]), const SizedBox(height: 5), Text( - 'from'.tr(), + 'from'.tr(args: ['']), style: TextStyle( fontSize: 19, fontWeight: FontWeight.w500, @@ -149,31 +149,62 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { ), const SizedBox(height: 5), Consumer(builder: (context, sub, _) { - return DropdownButton( - dropdownColor: const Color(0xffffeed1), - elevation: 12, - key: keyDropdownWallets, - value: defaultWallet, - menuMaxHeight: 300, - onTap: () { - FocusScope.of(context).requestFocus(amountFocus); - }, - selectedItemBuilder: (_) { - return myWalletProvider.listWallets + return Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.blueAccent.shade200, width: 2), + borderRadius: + const BorderRadius.all(Radius.circular(10.0)), + ), + padding: const EdgeInsets.all(0), + child: DropdownButton( + dropdownColor: const Color(0xffffeed1), + elevation: 12, + key: keyDropdownWallets, + value: defaultWallet, + menuMaxHeight: 300, + onTap: () { + FocusScope.of(context) + .requestFocus(amountFocus); + }, + selectedItemBuilder: (_) { + return myWalletProvider.listWallets + .map((WalletData wallet) { + return Container( + width: 330, + padding: const EdgeInsets.all(8), + child: Visibility( + visible: wallet.address == + defaultWallet.address, + child: Row(children: [ + NameByAddress( + wallet: wallet, + fontStyle: FontStyle.normal), + const Spacer(), + Balance( + address: wallet.address, size: 20), + ]), + ), + ); + }).toList(); + }, + onChanged: (WalletData? newSelectedWallet) async { + defaultWallet = newSelectedWallet!; + await sub.setCurrentWallet(newSelectedWallet); + sub.reload(); + amountFocus.requestFocus(); + setState(() {}); + }, + items: myWalletProvider.listWallets .map((WalletData wallet) { - return Container( - width: 408, - decoration: BoxDecoration( - border: Border.all( - color: Colors.blueAccent.shade200, - width: 2), - borderRadius: const BorderRadius.all( - Radius.circular(10.0)), - ), - padding: const EdgeInsets.all(7), - child: Visibility( - visible: - wallet.address == defaultWallet.address, + return DropdownMenuItem( + value: wallet, + key: keySelectThisWallet(wallet.address), + child: Container( + color: const Color(0xffffeed1), + width: 332, + height: 80, + padding: const EdgeInsets.all(7), child: Row(children: [ NameByAddress( wallet: wallet, @@ -184,58 +215,26 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { ]), ), ); - }).toList(); - }, - onChanged: (WalletData? newSelectedWallet) async { - defaultWallet = newSelectedWallet!; - await sub.setCurrentWallet(newSelectedWallet); - sub.reload(); - amountFocus.requestFocus(); - setState(() {}); - }, - items: myWalletProvider.listWallets - .map((WalletData wallet) { - return DropdownMenuItem( - value: wallet, - key: keySelectThisWallet(wallet.address), - child: Container( - color: const Color(0xffffeed1), - width: 408, - height: 80, - padding: const EdgeInsets.all(7), - child: Row(children: [ - NameByAddress( - wallet: wallet, - fontStyle: FontStyle.normal), - const Spacer(), - Balance(address: wallet.address, size: 20), - ]), - ), - ); - }).toList()); + }).toList()), + ); }), const SizedBox(height: 12), Row( children: [ Text( - 'to'.tr(), + 'to'.tr(args: ['']), style: TextStyle( fontSize: 19, fontWeight: FontWeight.w500, color: Colors.grey[600]), ), const SizedBox(width: 10), - Column( - children: [ - const SizedBox(height: 2), - Text( - username ?? getShortPubkey(toAddress), - style: const TextStyle( - fontSize: 21, - fontWeight: FontWeight.w600, - ), - ), - ], + Text( + username ?? getShortPubkey(toAddress), + style: const TextStyle( + fontSize: 21, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -320,10 +319,10 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { color: Colors.grey[500]!, width: 2), borderRadius: BorderRadius.circular(8), ), - contentPadding: const EdgeInsets.all(15), + contentPadding: const EdgeInsets.all(10), ), style: const TextStyle( - fontSize: 33, + fontSize: 30, color: Colors.black, fontWeight: FontWeight.w600, ), diff --git a/lib/widgets/search_identity_query.dart b/lib/widgets/search_identity_query.dart index 2a2a351..170b234 100644 --- a/lib/widgets/search_identity_query.dart +++ b/lib/widgets/search_identity_query.dart @@ -80,57 +80,54 @@ class SearchIdentityQuery extends StatelessWidget { return Expanded( child: ListView(children: [ for (Map profile in identities) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), - child: ListTile( - key: keySearchResult(profile['pubkey']), - horizontalTitleGap: 40, - contentPadding: const EdgeInsets.all(5), - leading: CesiumAvatar( - address: profile['pubkey'], size: avatarSize), - title: Row(children: [ - Text(getShortPubkey(profile['pubkey']), - style: const TextStyle( - fontSize: 18, - fontFamily: 'Monospace', - fontWeight: FontWeight.w500), - textAlign: TextAlign.center), - ]), - trailing: SizedBox( - width: 110, - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Balance( - address: profile['pubkey'], size: 16), - ]), - ]), - ), - subtitle: Row(children: [ - Text(profile['name'] ?? '', - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w500), - textAlign: TextAlign.center), - ]), - dense: false, - isThreeLine: false, - onTap: () { - Navigator.pop(context); - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - walletsProfiles.address = profile['pubkey']; - return WalletViewScreen( - address: profile['pubkey'], - username: profile['name'], - ); - }), - ); - }), - ), + ListTile( + key: keySearchResult(profile['pubkey']), + horizontalTitleGap: 10, + contentPadding: const EdgeInsets.only(right: 2), + leading: CesiumAvatar( + address: profile['pubkey'], size: avatarSize), + title: Row(children: [ + Text(getShortPubkey(profile['pubkey']), + style: const TextStyle( + fontSize: 18, + fontFamily: 'Monospace', + fontWeight: FontWeight.w500), + textAlign: TextAlign.center), + ]), + trailing: SizedBox( + width: 120, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Balance( + address: profile['pubkey'], size: 16), + ]), + ]), + ), + subtitle: Row(children: [ + Text(profile['name'] ?? '', + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.w500), + textAlign: TextAlign.center), + ]), + dense: false, + isThreeLine: false, + onTap: () { + Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + walletsProfiles.address = profile['pubkey']; + return WalletViewScreen( + address: profile['pubkey'], + username: profile['name'], + ); + }), + ); + }), ]), ); }), diff --git a/lib/widgets/search_result_list.dart b/lib/widgets/search_result_list.dart index 6c701a3..a3496c5 100644 --- a/lib/widgets/search_result_list.dart +++ b/lib/widgets/search_result_list.dart @@ -41,7 +41,7 @@ class SearchResult extends StatelessWidget { return Expanded( child: ListView(children: [ for (G1WalletsList g1Wallet in snapshot.data ?? []) - resultTile(g1Wallet, context), + resultTileAddressSearch(g1Wallet, context), ]), ); } @@ -58,53 +58,50 @@ class SearchResult extends StatelessWidget { ); } - Padding resultTile(G1WalletsList g1Wallet, BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), - child: ListTile( - key: keySearchResult(g1Wallet.address), - horizontalTitleGap: 40, - contentPadding: const EdgeInsets.all(5), - leading: CesiumAvatar(address: g1Wallet.address, size: avatarSize), - title: Row(children: [ - Text(getShortPubkey(g1Wallet.address), - style: const TextStyle( - fontSize: 18, - fontFamily: 'Monospace', - fontWeight: FontWeight.w500), - textAlign: TextAlign.center), - ]), - trailing: + Widget resultTileAddressSearch(G1WalletsList g1Wallet, BuildContext context) { + return ListTile( + key: keySearchResult(g1Wallet.address), + horizontalTitleGap: 10, + contentPadding: const EdgeInsets.all(5), + leading: CesiumAvatar(address: g1Wallet.address, size: avatarSize), + title: Row(children: [ + Text(getShortPubkey(g1Wallet.address), + style: const TextStyle( + fontSize: 18, + fontFamily: 'Monospace', + fontWeight: FontWeight.w500), + textAlign: TextAlign.center), + ]), + trailing: + Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + SizedBox( + width: 110, + child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ Column(mainAxisAlignment: MainAxisAlignment.center, children: [ - SizedBox( - width: 110, - child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ - Column(mainAxisAlignment: MainAxisAlignment.center, children: [ - Balance(address: g1Wallet.address, size: 16), - ]), + Balance(address: g1Wallet.address, size: 16), ]), - ), - ]), - subtitle: Row(children: [ - NameByAddress( - wallet: WalletData(address: g1Wallet.address), - ), - ]), - dense: false, - isThreeLine: false, - onTap: () { - Navigator.pop(context); - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - walletsProfilesClass.address = g1Wallet.address; - return WalletViewScreen( - address: g1Wallet.address, - username: g1Wallet.username, - ); - }), - ); - }), - ); + ]), + ), + ]), + subtitle: Row(children: [ + NameByAddress( + wallet: WalletData(address: g1Wallet.address), + ), + ]), + dense: false, + isThreeLine: false, + onTap: () { + Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + walletsProfilesClass.address = g1Wallet.address; + return WalletViewScreen( + address: g1Wallet.address, + username: g1Wallet.username, + ); + }), + ); + }); } } diff --git a/lib/widgets/transaction_tile.dart b/lib/widgets/transaction_tile.dart index 86b79c4..c9b1487 100644 --- a/lib/widgets/transaction_tile.dart +++ b/lib/widgets/transaction_tile.dart @@ -36,7 +36,7 @@ class TransactionTile extends StatelessWidget { child: ListTile( key: keyTransaction(newKey), contentPadding: - const EdgeInsets.only(left: 20, right: 30, top: 15, bottom: 15), + const EdgeInsets.symmetric(horizontal: 15, vertical: 5), leading: ClipOval( child: defaultAvatar(avatarSize), ), diff --git a/lib/widgets/ud_unit_display.dart b/lib/widgets/ud_unit_display.dart index 942b155..da0c375 100644 --- a/lib/widgets/ud_unit_display.dart +++ b/lib/widgets/ud_unit_display.dart @@ -21,15 +21,14 @@ class UdUnitDisplay extends StatelessWidget { children: [ Text( 'ud'.tr(args: ['']), - style: TextStyle( - fontSize: isTall ? size : size * 0.9, color: color), + style: TextStyle(fontSize: size, color: color), ), Column( children: [ Text( currencyName, style: TextStyle( - fontSize: (isTall ? size : size * 0.9) * 0.7, + fontSize: size * 0.7, fontWeight: FontWeight.w500, color: color), ), @@ -38,8 +37,6 @@ class UdUnitDisplay extends StatelessWidget { ) ], ) - : Text(currencyName, - style: - TextStyle(fontSize: isTall ? size : size * 0.9, color: color)); + : Text(currencyName, style: TextStyle(fontSize: size, color: color)); } } diff --git a/lib/widgets/wallet_name.dart b/lib/widgets/wallet_name.dart index b1a2b63..b91e20f 100644 --- a/lib/widgets/wallet_name.dart +++ b/lib/widgets/wallet_name.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:truncate/truncate.dart'; @@ -23,7 +22,7 @@ class WalletName extends StatelessWidget { truncate(wallet.name ?? '', 20), textAlign: TextAlign.center, style: TextStyle( - fontSize: isTall ? newSize : newSize * 0.9, + fontSize: newSize, color: color, fontWeight: FontWeight.w400, fontStyle: FontStyle.italic, diff --git a/lib/widgets/wallet_tile.dart b/lib/widgets/wallet_tile.dart index a5f6a3b..76ed330 100644 --- a/lib/widgets/wallet_tile.dart +++ b/lib/widgets/wallet_tile.dart @@ -24,7 +24,7 @@ class WalletTile extends StatelessWidget { final defaultWallet = myWalletProvider.getDefaultWallet(); return Padding( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(12), child: GestureDetector( key: keyOpenWallet(repository.address), onTap: () { @@ -91,12 +91,12 @@ class WalletTile extends StatelessWidget { children: [ Column( children: [ - const SizedBox(height: 7), + const SizedBox(height: 3), Opacity( opacity: 0.7, child: NameByAddress( wallet: repository, - size: 20, + size: 19, color: defaultWallet.address == repository.address ? Colors.white @@ -134,8 +134,7 @@ class BalanceBuilder extends StatelessWidget { width: double.infinity, color: isDefault ? orangeC : yellowC, child: Padding( - padding: - const EdgeInsets.only(left: 5, right: 5, top: 38, bottom: 10), + padding: const EdgeInsets.only(left: 5, right: 5, top: 30, bottom: 7), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -143,7 +142,7 @@ class BalanceBuilder extends StatelessWidget { opacity: 0.7, child: Balance( address: address, - size: 16, + size: 15, color: isDefault ? Colors.white : Colors.black, loadingColor: isDefault ? yellowC : orangeC), ) diff --git a/lib/widgets/wallet_tile_membre.dart b/lib/widgets/wallet_tile_membre.dart index aebb95a..23f9cca 100644 --- a/lib/widgets/wallet_tile_membre.dart +++ b/lib/widgets/wallet_tile_membre.dart @@ -22,7 +22,7 @@ class WalletTileMembre extends StatelessWidget { final myWalletProvider = Provider.of(context); final defaultWallet = myWalletProvider.getDefaultWallet(); return Padding( - padding: const EdgeInsets.symmetric(horizontal: 70, vertical: 20), + padding: const EdgeInsets.symmetric(horizontal: 60, vertical: 16), child: GestureDetector( key: keyOpenWallet(repository.address), onTap: () { @@ -37,7 +37,7 @@ class WalletTileMembre extends StatelessWidget { }, child: SizedBox( key: repository.number == 1 ? keyDragAndDrop : const Key('nothing'), - height: 240, + height: 200, child: ClipOvalShadow( shadow: const Shadow( color: Colors.transparent, @@ -84,12 +84,12 @@ class WalletTileMembre extends StatelessWidget { ), ), Positioned( - left: 25, - top: 25, + left: 20, + top: 20, child: Opacity( opacity: 0.6, child: Image.asset('assets/medal.png', - color: Colors.black, height: 40), + color: Colors.black, height: 35), ), ), ], @@ -101,7 +101,7 @@ class WalletTileMembre extends StatelessWidget { isDefault: repository.address == defaultWallet.address), Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Column(children: [ - const SizedBox(height: 10), + const SizedBox(height: 7), Opacity( opacity: 0.7, child: NameByAddress( @@ -116,7 +116,7 @@ class WalletTileMembre extends StatelessWidget { ]), ]), Positioned( - right: 25, + right: 12, top: 25, child: Opacity( opacity: 0.7, @@ -125,7 +125,7 @@ class WalletTileMembre extends StatelessWidget { color: defaultWallet.address == repository.address ? Colors.white : Colors.black, - size: 18), + size: 16), ), ), ]), @@ -155,7 +155,7 @@ class BalanceBuilder extends StatelessWidget { color: isDefault ? orangeC : yellowC, child: Padding( padding: - const EdgeInsets.only(left: 5, right: 5, top: 45, bottom: 15), + const EdgeInsets.only(left: 5, right: 5, top: 37, bottom: 12), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/pubspec.lock b/pubspec.lock index e63bcb1..ea9b101 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1298,10 +1298,10 @@ packages: dependency: "direct main" description: name: responsive_framework - sha256: e083346029b008335b008274c4d3fac5b9e0ca8796f201ed20884f579101d584 + sha256: "23aa7be5d5136922df708f6ddccb5ec4e0eb8bc576c3f105f5093f31d6b68e50" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "1.1.1" rxdart: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f9e54cf..84ecc47 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: Pay with G1. # pub.dev using `pub publish`. This is preferred for private packages. publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: 0.1.2+59 +version: 0.1.3+60 environment: sdk: ">=2.12.0 <3.0.0" @@ -31,7 +31,7 @@ dependencies: git: url: https://github.com/insinfo/qr.flutter.git ref: master - responsive_framework: 0.2.0 + responsive_framework: ^1.1.1 sentry_flutter: ^7.4.1 truncate: ^3.0.1 unorm_dart: ^0.3.0