From dc623f3293fba818c937f79af5b8d63bcb58b689 Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Wed, 29 Jun 2022 14:38:44 +0200 Subject: [PATCH] Rework settings pickers (#398) Updated pickers and settings screen --- assets/images/flags/aus.png | Bin 0 -> 1390 bytes assets/images/flags/bgr.png | Bin 0 -> 735 bytes assets/images/flags/bra.png | Bin 0 -> 1269 bytes assets/images/flags/cad.png | Bin 0 -> 1005 bytes assets/images/flags/che.png | Bin 0 -> 855 bytes assets/images/flags/chn.png | Bin 0 -> 860 bytes assets/images/flags/czk.png | Bin 0 -> 915 bytes assets/images/flags/deu.png | Bin 0 -> 703 bytes assets/images/flags/dnk.png | Bin 0 -> 801 bytes assets/images/flags/esp.png | Bin 0 -> 1090 bytes assets/images/flags/eur.png | Bin 0 -> 1005 bytes assets/images/flags/fra.png | Bin 0 -> 700 bytes assets/images/flags/gbr.png | Bin 0 -> 1341 bytes assets/images/flags/hkg.png | Bin 0 -> 1023 bytes assets/images/flags/hrv.png | Bin 0 -> 1088 bytes assets/images/flags/hun.png | Bin 0 -> 728 bytes assets/images/flags/idn.png | Bin 0 -> 684 bytes assets/images/flags/ind.png | Bin 0 -> 845 bytes assets/images/flags/isl.png | Bin 0 -> 867 bytes assets/images/flags/isr.png | Bin 0 -> 937 bytes assets/images/flags/ita.png | Bin 0 -> 705 bytes assets/images/flags/jpn.png | Bin 0 -> 896 bytes assets/images/flags/kor.png | Bin 0 -> 997 bytes assets/images/flags/mex.png | Bin 0 -> 1013 bytes assets/images/flags/mys.png | Bin 0 -> 1082 bytes assets/images/flags/nld.png | Bin 0 -> 762 bytes assets/images/flags/nor.png | Bin 0 -> 898 bytes assets/images/flags/nzl.png | Bin 0 -> 1373 bytes assets/images/flags/phl.png | Bin 0 -> 1179 bytes assets/images/flags/pol.png | Bin 0 -> 707 bytes assets/images/flags/prt.png | Bin 0 -> 1169 bytes assets/images/flags/rou.png | Bin 0 -> 705 bytes assets/images/flags/rus.png | Bin 0 -> 702 bytes assets/images/flags/saf.png | Bin 0 -> 1319 bytes assets/images/flags/sgp.png | Bin 0 -> 902 bytes assets/images/flags/swe.png | Bin 0 -> 752 bytes assets/images/flags/tha.png | Bin 0 -> 774 bytes assets/images/flags/ukr.png | Bin 0 -> 695 bytes assets/images/flags/usa.png | Bin 0 -> 1220 bytes assets/images/flags/ven.png | Bin 0 -> 1009 bytes assets/images/search_icon.png | Bin 0 -> 469 bytes lib/di.dart | 3 - lib/entities/fiat_currency.dart | 71 ++-- lib/entities/language_service.dart | 19 + lib/router.dart | 5 - lib/routes.dart | 1 - lib/src/screens/settings/change_language.dart | 63 --- lib/src/screens/settings/settings.dart | 10 + .../settings/widgets/language_row.dart | 30 -- .../widgets/settings_choices_cell.dart | 71 ++++ .../widgets/settings_picker_cell.dart | 49 ++- lib/src/widgets/alert_background.dart | 22 +- lib/src/widgets/picker.dart | 398 +++++++++++------- lib/src/widgets/standard_list.dart | 14 +- lib/src/widgets/standart_switch.dart | 2 +- lib/themes/bright_theme.dart | 8 + lib/themes/dark_theme.dart | 8 + lib/themes/light_theme.dart | 8 + lib/themes/theme_list.dart | 2 +- .../settings/choices_list_item.dart | 25 ++ lib/view_model/settings/picker_list_item.dart | 19 +- .../settings/settings_view_model.dart | 74 +++- pubspec_base.yaml | 1 + res/values/strings_de.arb | 4 +- res/values/strings_en.arb | 4 +- res/values/strings_es.arb | 4 +- res/values/strings_fr.arb | 6 +- res/values/strings_hi.arb | 4 +- res/values/strings_hr.arb | 4 +- res/values/strings_it.arb | 4 +- res/values/strings_ja.arb | 4 +- res/values/strings_ko.arb | 4 +- res/values/strings_nl.arb | 4 +- res/values/strings_pl.arb | 4 +- res/values/strings_pt.arb | 4 +- res/values/strings_ru.arb | 4 +- res/values/strings_uk.arb | 4 +- res/values/strings_zh.arb | 4 +- 78 files changed, 604 insertions(+), 361 deletions(-) create mode 100644 assets/images/flags/aus.png create mode 100644 assets/images/flags/bgr.png create mode 100644 assets/images/flags/bra.png create mode 100644 assets/images/flags/cad.png create mode 100644 assets/images/flags/che.png create mode 100644 assets/images/flags/chn.png create mode 100644 assets/images/flags/czk.png create mode 100644 assets/images/flags/deu.png create mode 100644 assets/images/flags/dnk.png create mode 100644 assets/images/flags/esp.png create mode 100644 assets/images/flags/eur.png create mode 100644 assets/images/flags/fra.png create mode 100644 assets/images/flags/gbr.png create mode 100644 assets/images/flags/hkg.png create mode 100644 assets/images/flags/hrv.png create mode 100644 assets/images/flags/hun.png create mode 100644 assets/images/flags/idn.png create mode 100644 assets/images/flags/ind.png create mode 100644 assets/images/flags/isl.png create mode 100644 assets/images/flags/isr.png create mode 100644 assets/images/flags/ita.png create mode 100644 assets/images/flags/jpn.png create mode 100644 assets/images/flags/kor.png create mode 100644 assets/images/flags/mex.png create mode 100644 assets/images/flags/mys.png create mode 100644 assets/images/flags/nld.png create mode 100644 assets/images/flags/nor.png create mode 100644 assets/images/flags/nzl.png create mode 100644 assets/images/flags/phl.png create mode 100644 assets/images/flags/pol.png create mode 100644 assets/images/flags/prt.png create mode 100644 assets/images/flags/rou.png create mode 100644 assets/images/flags/rus.png create mode 100644 assets/images/flags/saf.png create mode 100644 assets/images/flags/sgp.png create mode 100644 assets/images/flags/swe.png create mode 100644 assets/images/flags/tha.png create mode 100644 assets/images/flags/ukr.png create mode 100644 assets/images/flags/usa.png create mode 100644 assets/images/flags/ven.png create mode 100644 assets/images/search_icon.png delete mode 100644 lib/src/screens/settings/change_language.dart delete mode 100644 lib/src/screens/settings/widgets/language_row.dart create mode 100644 lib/src/screens/settings/widgets/settings_choices_cell.dart create mode 100644 lib/view_model/settings/choices_list_item.dart diff --git a/assets/images/flags/aus.png b/assets/images/flags/aus.png new file mode 100644 index 0000000000000000000000000000000000000000..c8837731c58a5746ff36872629dfabac35b11026 GIT binary patch literal 1390 zcmV-!1(EuRP)~*6YZFN-iXtSlF)57H3;jrLvI28Vz+EHCYLxV#7P(9UY`{nxR=qQYh zjm144kJ8)QOMS$(M2Vm!5{cL{GBPaDXjG78S#Ua?M4G*jbeqklEG#U*y=$mi#zB_d!~6HahmsZg2me$%ZawxK96i+q z)S|oP7_@g?QlIVKS^)1t0BWyZW%th(R>Me0fiy9*$30$wQtt2Xk6BS6*Nf;y@ugai z`-Dq|>hCYZ7odO{VJ+?u{0;3#8&w_t3MmJVoi!o&xKtcnk@2TGp zM#BEWJhg}Ik7mO+TQgLG!!I^Nr(}bH!9P-BaO&g>AT5P;f5i;M2}2NcLmaggJJcg7%KER0 z%OUjBML0Ba4XqW3J@Yh+(KAD{rbJxM%^(FskPIK4^q`Fcn&0Tw*)1nM$%FU{Hs+2#nFyz^ z{R8QMJUo3L_FX-FpjmF1f)7tB(fRp%d(n;F+ESRyveSpZlmGs7Aen@N5qxo@63xrY zgTMUA8??N>7Y^>LVgq$o&(CYlD(eAqp51O|9u-q*K(SZ#L=lse0B)R4$;0V@hOD(f z&f^{>qH8X5DE692K12z~i zk>Xru9>onid$DEsbI$x&>@mk zwDk$w5Z7^8#^m7OV0Z<=ZFwPEk|iZ2tS^#u&ux)pBtJiYWqNu#N}M3ET{eSyU|>8n w;P;6G3DNk>?2y55cp*ZP0|~M-J9yyuAKVAP`)@@c&Hw-a07*qoM6N<$g3Ef7xBvhE literal 0 HcmV?d00001 diff --git a/assets/images/flags/bgr.png b/assets/images/flags/bgr.png new file mode 100644 index 0000000000000000000000000000000000000000..a89509f1fe0a556e5c983509983685d07615e426 GIT binary patch literal 735 zcmV<50wDc~P)2&y%HoqLIRfknat<6 zUYX6lB&9#eZ)WZBypLJWcx@q`A@kZ~GI1b@NWN#2(;U-EHPxm07&Pp6aIZnu>AVWQjZDj$tTgS7qac9WG#h4eV)p>Hr45d5GYeWqWn zuU0FuUa#Zvcudpj6h2~;C>WKK& z|9QA$>2dAy@MVod77loNB6RfSIW-Sw=kuBB_4-@w%lOFJn$WhG@47Bsuh+2C>4XW< zIL&%Ql{*72us%XJ@5pu RD02V+002ovPDHLkV1kFePZt0H literal 0 HcmV?d00001 diff --git a/assets/images/flags/bra.png b/assets/images/flags/bra.png new file mode 100644 index 0000000000000000000000000000000000000000..ecac6f5a3e8a3c3a191f64fa2fe3a1e1814ff0cc GIT binary patch literal 1269 zcmVLBkly*~N#{RIDRg7$f2FwO~83Tpk+dwz^F1`;`*q-g)2iCDY3Bx|@ zsT-zXnPH}Mqj9*}G+LRf#UwRpVwyj<-|y%N*PB1a=z~A_IOm@GopXQpJKy=vcMj1( zD3xSlVnRi!>$*}+r-GBkT3*X_}^Uz1Y^)R^YO* zw6v606h)Yrn7w6VW8=&pUn~FcV;7wctoeUF^B$M^Kp;@ixB}CwY(@5umeWEK=;GP4 z@GKVapvqSEDGQwd`kl{(oCJ)VR5~Fzv^-6{^O)wnVIkA+KcueaEFBkEgeXfy;l$J+ zMmshs;=4zqotve$;fv2`zV87IU)Z8XvAw-bGJ0sT5v!c&XtVETi%nm8$Wy&TGq*3( zO_skNou|YLEA@Y{P9vW_plOx?SB%D1x@m3KdZh8~c6%v&YSbXcJx_!MG3Ap#T@zx& zoxeMUM4#Ge{L8yEcrHehkq#mCB9%%NTUuH~{m4Fwg>vueeL)l?Zw32kX8v<>zu_cD zYjc@CegM{%KNsh@iS!*S4}a99qywL38>X+71yi64gVPCn|OnN1fRhPtNSp%tpW14;9gCw4M4_v;GX z{B}c-o|^ouYX9gV7A*@;2nE%EKmKItvY0M22CqFMqzn$8@=BQdWtA;@tE?Sk^)6na zJ8?VJf}HIV(f0QCnjP@xWB+!OXTf{G3IkXFEKNNi3B$_L(t{t~F1^2>dW}8~T@qs@ z^0k8wj8|sSdI6FkE5i&H3Br#gi!#BB39z5F(dfYMLIzdX}zq?*)9248+gUSK+sh9Pj~|;7ptBRV8zwd)dDZ8 zbvi9zE_{Y7ur+bG(+?c(xYV|`wlv=NRph68sox$@ua>hK4`=WznM|0+FzXs2br#`b;Pw5)SlCdyzinAv4W zT`AB-+1c4C#zKi_smmm@E|+UJ8ja?_iT01nl~B4cFkc$T=lu%_)%>o~C4=emLZvDf f640x3@gVUEYCWjJ76m-_00000NkvXXu0mjfz1VG< literal 0 HcmV?d00001 diff --git a/assets/images/flags/cad.png b/assets/images/flags/cad.png new file mode 100644 index 0000000000000000000000000000000000000000..106cea5b9cc398a4b2287a4f5397c90f144dda31 GIT binary patch literal 1005 zcmVk^WF50!?e&&XZ$5M_c3Q~zn**MzKD*ZG)r@Hb1HJvG?n9Q znk3b3-{M`>ma7h1OPBy+I4LtTGfJUQP^PA)XnlQMJVSYZe_z?!+A1h-FpdD@Yer0)MV}p{(q%k`?Yc4GFhs%+($(#Qw$@8413;|KBsyC#)zJf}_(Lob&* zH^57Fe%s7`u;<53!K;B(N2MvPVy|Cb>c|?=Sh#^tM{}b0nC$_ z+~qWcw?AthHWvln-FW=H{kulKGuH(mg&&-9E%8 zwD1{D=b?vK^T^?j^FSt(3GlkFA{6XfKa`IP5BuQ^afKm6+1ZEF){eBr`j!Hny7wUZiaPX;Jh@D_4U`GhlEHC#q0%uI60mD_ b@gVsN{LmIAoja<=00000NkvXXu0mjf#EIR1 literal 0 HcmV?d00001 diff --git a/assets/images/flags/che.png b/assets/images/flags/che.png new file mode 100644 index 0000000000000000000000000000000000000000..427db0fbcedfb9f5799a40fd9c7ca644c5b698f1 GIT binary patch literal 855 zcmV-d1E~CoP)ICtFS*9-rJcslV9Gv`FKMVhB2ySvsnQtr8LIbj3^>#|DV1h zAVtL1C#C>0T#TcmBct7J8~gkFbai#5+MqWY4Wm>l$;cn0-Q8U^#`^lY)b_S*8%s+| zQn#ZY>JASNCB{KL>Vo5HJ(tT-KA-oFkB{Za$qB~rf0Vx5I)-5=7ZbBLE0s#}ZS(tQuDC}r z0JHx3?Dm5_R-NK-OGAU*VatBRLD^;qQ;GcZY?lb{%* z)9H9xk2TS?wKdXo_gS~?Fm}}B_{4qZmUJkk4mV{+6sFx+U~VmG%fUO`$RW4 zH;G!;6A$qF?3BKoh2sq|x#)c~nM{T~8b`o+yubS!{@f?hO+w#s_02lAz=ayX)T^8M z!NCE|i=Qu_`}!;kCyHjXDGP;y(p8Lt^&&1M_NV!8OF`gd(kYQY^++=)X5g(UeAaUU z<`s)Y*CY9jVghjC9L{BLf~*WBcPy=HwQBLXFAxgBs~_}n;So&E5Lfy#5gj9H8-%t+ zf73K&x7&4gc6N|2fvD#np-j}{$^pB(&mC+|U6n-PfqQJyg+vL~4{f_zUtV5T^5Wvc z?lH8jF0h5%-riPYLE>B6GRb}>lj)VqSqMIuF_NkKu8)TyY_rODr*OqV`A6;0Bopg~CiRRoB}0*NLG z#*RPm*WGRAEt$*SVFNB~-ILBcH#x2tlwoR)gD zgKuMFLn9CT@Y#9AJ~}$0Oiz(pwE_{<$CXIgd0A ze>yY^*qrX{5hNF04r9LF50Bbk=ZvzCUkzy5z#>HHi35{ZY>+Fx?~+$G3y$)y2UOpg zr{C-gPZnwjT&$u9&ivSi-5>PzoD4HggmX@%e-*CW> zOjsMfwX#EtkZeyFdiju9z_5|OyN6;{+mj7%!g! zr3^MFqbOg%!e+A>u%zdd5`YVzo&p|vkkzrv-Pzfhx45|I@@3268=;vBK@g~wm6cc$ z)bXv;w7tB%B)eYPp{sDe@NB#c(zOhmARoB$pwmgVMJBb&-hgj*Cg&HsyTrG^6M#&K$r~a!y m@z$ls%4mj(7M6^0000P)xL4tec=q1VIa} zirU&@32CWX14&boCQXyP>-jD{kC#Up(=h7l4*u@$t`Ut!mFFL$;o)ID zM^8_WlK5OMXLNRUDtV7_=o=dwQsVvEiDxd!_X2F zv$wXlw*zazD?ga?Ao}i2g}Gg(c7d0Fb7ErR0=vaXBvR73!P1-i`}?Ml1RlPK(8Z}I z^ewtW?EtGd$g5`|4e@Ns3(hIa8@%;5MdLST>Hh3%+RGeJtKsHk)-vGf!bcjvHB0Zm z#;Dc6M+oZ>MG{vV0Clh3eb!QS6Nv=L?%@!{S6<6tQFrdmXKFUOy1E=rH7>Pb# zn%4FswH=~;eSMUmljH1Rh8}Fbqf41T z)M!AwKp;@AXg#it44uF~b|!4i(+tt;y!XS^HX1 zK7iR98yh9gf-MPZmx=;g(H5WKN}QG`OjOz7j;${qkNfzrWg->ar62s`(!+f?LtaTS z;hn=9>xRT)yk%J`o6Q!7hK6un0#Vzko|vf3oduRV&jWINbk!D(Cq|{5g++7sAH`v^J(Q&yFoC^c*rGY#jT}YVT pca<&~JeL-8!I zg8{8pE7b@4d_IfaZYOg;jQah)nxollO6?y6fv8j}QukvV+D4<1#5`z6n>nwx*XuQH zHk))ZnaJ5}hB;D`Cz>ePQtsNcF*?cQ}gJA8%w2-gxy~Ud03t zj&9{W<&tGEIXPrG@Df62M6rp$=kS{kYfb#q;?bMAPiRXQC-LMjY;t2LxQYDh=U@Z|vejL(KMvudi)R z%amR$7Qv07eYL2z-U{XPOGdX&pW$Sw@>mj?RzaUtR4`-(0Z la+enly||EoU(v;b#&0DM!YFi}<8=T4002ovPDHLkV1jXJM412p literal 0 HcmV?d00001 diff --git a/assets/images/flags/dnk.png b/assets/images/flags/dnk.png new file mode 100644 index 0000000000000000000000000000000000000000..69dd1b2b8d6117df195668916b901d61126123d6 GIT binary patch literal 801 zcmV++1K#|JP)-4sQrU=nABEA<% zK=4mcJP+?~GqbqIdT4S46ZZXJnc3ah@#pN`>>q$buw$j!Y#Jmv=j@ctkz%O!e;8{h z(g@iG!~}>87FMs<*=n_7)oK-by`JbJeX&@u(P+d&e+(*>itv%mX1TPtZJS+OTyWV> z9JUh&*yXa9l~Rz9@WmWERMRL%jGEfb7l5WD$z+0vQhE{# z7LzVK{_-)h6El-KsNZ{W2?flpXT|epfhvf~1)C_{hrflDPKolbaBI?&B^xLeIM?4J zJD{moBk2BIfwx@2xglpeAeztT;nSlhksXBh`XBE;oOQ1!%12sWJRI=6$%jJ@*5f!X;Je1JRq()RsJzX1x-St?KiEQ%sE>_147Y;=Y`nS(Nd+Bm(PTrCirT)n-AFx|ObXfQbnGoc z+R8$Wgo% literal 0 HcmV?d00001 diff --git a/assets/images/flags/esp.png b/assets/images/flags/esp.png new file mode 100644 index 0000000000000000000000000000000000000000..0193a6a44bf2ffce70281ce6137a2301239dcb15 GIT binary patch literal 1090 zcmV-I1ikx-P)M%mtAVg^iDovr?(V(&;qj=H}c!(l<6X*z)o+ zZ~0?LrBd!3y}i9$+E=Sp77PZt?5A z7GunHF$8-xo6Q=3K3ID!8qUB65UgMPb}@BcsMhrKw5r# z6PA%g-YjA*cLrIuiW=icpA!=~MRXeFa@h%mLLWx-%HOYGJ~gn-GZ>1;@p7$*t?x^? zG=`2N8jaFIk{!#JuO9ro)i@Yx*Pp?UX`oeBw8pG4jk}NDu^z20;#WRNN=yhJbMb)Z~cqS z)!X94c!Hfm6g>$WorYZP=4OhEjR9o#9kBhp2Ipb~T9=K$*>wz8O&IqLY>nK(&_Efv z&ws$qHbXZ$2XdZa7<)Z>7-C=Os5EqR}}<&Jso90kT2nv zPnX_RLN>lVxzy~Vph@Byjsx-nFG=d7qocvU9_2RSBm8_icw%vJu_jc@jZtDvmlF64 z^kpJ$1esKU(hT?vVk0?HcReZ+Fej7A*bcaF?s>#T{*K7!8L;t{C-Dk4n7h1-=3O2zVm#Ab2vd2V?L`(u@XLfdp&O__eQmK>Jw4Up@i=X4Y=|-N$H&Lo-rk<&`eQUcJ}%Z6 z92~Tye6?ED0)c=f$1x9mlarGc)h-$6 zudmP7Xf!m_G_`?&0Vpkg5WL^-w@RfF{R{3nlJ8c|Fbs?NRyZ7PGHtG}ubY~t2@?}* z?<*7vH`ad5eCN+Gx*ph141Bo5)XZcuO@kSjUS})nJdiWV^3nao)kwAf*P^|o0v>eM!9l}9^c)h z+~El2n4kOj%pQvk7ig9h&+JT)7Zi&{3I>BB$V9H<)WCWgfvoxRgsup%D*luT;`BDe zq{3;>^z3@LbZKU}Yx#v_ni3N`q=K`vvzFuy@(8#(|KoPo@(Zg|lrM!z1))#~`CRZq zQEXUFx+-f>z8F!G&lQHL7YNtOz- z^7DLJ;nY$Aj3+G$*DD2*M7OS&iT>&0Yw`kF)KXEqGWP-m)*H62%m8rj?884UMudOfj49__iE_DY>!!7}_TOZDtv&xqJwlXu zfojhQ9=K<`3-ZZS#aS;3XLRD4K{e_bUai*&97rv`jtE{vJzv0DySuwwNm~bWZD1Yn z9j?jNL}6l`yWBA~j*gBDKKFIhr?}wBY2Zc8+5yhX8TJ*53GnVU+_FwcS^=w8fnbHg_HSg0HTEqVdAm6ctc3XMbC^BKiLQenGR@Y_-Oava&%I zbaZr7tObg1Da%UMhlYk~`Fy?sov3|X?gab6!2M_-zuONIx_hkCBZKSlLZ=HJBp}!6 b;X&dzW2Yyj8Uy;000000NkvXXu0mjfD{|Wg literal 0 HcmV?d00001 diff --git a/assets/images/flags/fra.png b/assets/images/flags/fra.png new file mode 100644 index 0000000000000000000000000000000000000000..91dce8ff249363df0de2e3ca30d522f1fd706630 GIT binary patch literal 700 zcmV;t0z>_YP)#{zZ z&0s#C$Nhd^4TnQoBQ}W=LC5#~Tt1(7f*=rK7>ZJY`*@)?h`zK)`t@O`u+`Gg59UjFERi9<$eAm z%5XFqMJ_7jdWl|?kCJ>PJmKy+xQh{WB#+{ma=2 zx?nNLd3e7k9<};K;ux1BYimIPH9>onS=)xg;h;>9YSuOeCG=%7J*u~!(hRT+cs1RA z>oEa~7mEc((&`y30Wy5X94^AGC$j1$xkKr0HX9d{ElEeg4E;#IcRbAGjLsDY6X`Y5 zwkFt?<~xp~&gXO3YPBd|BBF6};Um!)2Lp7sj}tshUA3f!3t!OWOp=;8eziTbUMv>1 z9FND|1;Mu5$d+WY+0<*1q(0jsNx#u(Tvn@9K%C&3E@vSr7^I5^+`kqiWcpcFks(#Q ikZ`9UL3UY%2gVO+dD`psrUXG?E(WAGEG;dSd^{JObGElsCHL-u6K8&hp>HOj5IOKlJq&)d zA12GUtKPdq)6ntumj&6empuqaI$ng18Y@HxhT!I9@6~r}9nWA@YJ7Y=&Bg}0UW`Vg zB2rhaoH_^L=6%o=TY$OYHyK1Rg#f#cG{YaqTVT({Z((`wVOYEDrLL~R-ZRiJBt4Ng zz%gYoS3V{iC^m2|KrX~WO#E3?Hl9A#4b@-tK{0^~0VD=uA)!e~xsfZ-Ag1x;dZGfl zQE68q0M|blfW)=GWMIJ5)!qU}5%}a!^YGn|({ObuSTLY+3@-P0RrS_}9k8W+H(W3~ zp|yXM*?r0o1e?uvYm#wAn&p)HQK1mv!wB5b>47shQXom2doUkhY3Bj7lZH=Ej;Vee zAysjdVkSD&Xxa8c=S}U02$(#P{Qe?#(XUw`Wu9A}Akmxk{O9!AQoB{xlh8jn2H~}M zR{byMkC&B}mab!bPN_gACML2#Z%1;0{$HuDueV`O#|e~mJq=h4x>+B(Q@LY%Pg~?7 zoArFTyPrjb`&@WCF+1rLh(~8 z_A(2Gr=8&N{|SGeKATlMpXg-dFOAo$;n9yuq-?Y%7$!3daD_B{c{67I1I~q0Q=v= zeZX2Q@A^-kqHW#~+TGpM00$4f0jA-vVdeBWR!=LQ@6a)*Mc^wszCR#q27Jbo?>u@9!65 zghC-x+7}81rK6+6l<)B!`l8XOiE+@6KKr;*-`Uxr-Q8VdY;4S2T3W&whMgz~dP=2| zx2>(sQ!bYkUDp-A-w)E_2cdhtUNezM(BI(vM(Y1-r)iqWy3yU;U13?-+S<|;MG-D0 zX77o`VwYZ}_V)O(ms$f~A6&UPz*1jdU$1Da!1XG75&6+7B!OOzo`<7Y!GkJ$Ij20- zVz6^ksl|aw2x$>T5>pf48y%<1v-70-1LPL*c${SQu!v%olS_mqA2Z44)OlxwjBJ|R zA`l2zoLq(8={4Wz1m%`ri+=5Dgxn&R%NbJF$OSG9Tqm_FAiP)n@LrJX>>8os#|`px z3V=A?<=0jyIsc66MKBmdJ^w=#3Cl&7>IH}))cW@$(ql)0Q2F?XD%^sPrpU;oNryf; zCH_!+?g=#t5qg=h^&-EvDm(^~?L$#I<>%b;B9)o=kLgKagZ}iwOFDhKN^amPM?n&V z;Mt#_KT&vkR`eN}jL?w+$MR?1O@ItWWv3IG;$VwjRMX)SMVDJN|CQh=6BfBlv#Ko zB>hQsB4IWo)bJiA6LJ!SzumpTC2NDSZx+c7+XteXutB!N^aWpNWZieo^tHYLpjRwi%*3&ae1NA1s4*qt99`p@e3{wPU)Pkr<(u(002ovPDHLkV1f^;;NAcL literal 0 HcmV?d00001 diff --git a/assets/images/flags/hrv.png b/assets/images/flags/hrv.png new file mode 100644 index 0000000000000000000000000000000000000000..9c87c5d0ed8fc429c3918b628d71cf64f49a63fa GIT binary patch literal 1088 zcmV-G1i$-e?b|>3?m~kYv~QHl1~|q-rNA^n;gqJNtI>?R#%#=M9h#rI7UW^r+n0 zwymsWQ$SR&{Xd>nJ+11qb%{A(G9*eQ5>XZw7L=Bj77Pv!I`>$gnVC^WM@Mbni=nBh z$r+=jrp6Zb$z)Oq27|V^&(CpRdwaXh<8VLsdB+ucJRZl;(2&*9(P8)X_3;>%mnaj| zQmIr~MMZ^{PN$VjCZkkWS2Jnn4_PlOE3>Dkr|~!VpAq{1+64jun{=zTwl+&`c3@y2 zqbN#l3}UafwY9MeOcHxN2)WTD=T(vf*pbc;xn3nNa(;xdPC%g!Q}i^7VwSH}af5P7 zLn)x^C>6Y%0w@w@?N+?seE_L<;|Mj>(^FQRaF6^cke<5U5$-^ zVF1sc1BVXfI!QN3H*Q_e^-Dl+ZRPd+4^d87T67@|5s52T$ivD5uJ(mHpo07GJuIo-o z#1KUlxXi#h11(LK&>fFb0cMSij8Jk}a+}6Afi*@oT$V!5WbM4-j@rP)#6*C;`zoh` zck9RcO6lP(&N#0)WUTwg@Y{MJZ25Uj)9gedkueM-6N|-|sO5f{h^R%KX>xapXBw5R zPRl|AFOf-tTNZEsvTZ`>v@LVm{{H^t5<%DsVOwq+8XBCjxaDhMOC(eE_4P}pX{MPI zmdoWra1RXphX&$$`9MPT-z#*;;5)ofvBH4_+Z8%^5cmy@k8EL^E@CYJ0000A< zmUZT{@XD-~jL{jT^yAo08uTd(Ml(9b?4kDY)Dl?9G=xeoF3hSUB zefGLWACJd0nM}e?r=xnk9@YqLq9EvL z_#C4@*UtBS#d=sSmoF?Y!{IOxLTDEgv-cK@Mf%h4^iM(Rft-N)^|tE0VkPMJ`xl=T zxL&dsrJ$4}BmwcjyXWyPUhpMNH=ikw9D~hClH;!2@D#WR zv)j>Ss#GfE8sNNiI;}l=bL&5R`A9AS&f{Ajc{I96-+w%kYcMgciL9Lk0%`z6qsZJf zY`0rwdsMS_F(@e(i^BG(-g=}NA-}5}R-|vHZy^eedM8oKpiHU~X zd1iN?c*22GS1r+a;Uk;uA<^vqtL@(C9F}Q07z_?ahOspbwve@2O|J!sZ)3|OPt|Jm zIG@kY;6&GSISEn0AYL>u-`9eKjE^N18Dhl?Np}houuCdD82km`kEoA_`E;NF0000< KMNUMnLSTXzGE1=l literal 0 HcmV?d00001 diff --git a/assets/images/flags/idn.png b/assets/images/flags/idn.png new file mode 100644 index 0000000000000000000000000000000000000000..52c9659213385314b3c321c31eaace4332e5df9e GIT binary patch literal 684 zcmV;d0#p5oP)M#&a+NxJj`~#OB@fBPNE_?~!$M^9i+zPtXm57|B;14LRr9Zjz9XZ zYiof6HK0AptZl>nepjYPHESCWCD@rvkLu8)%n+7=mZtn(PX$!Rq=d(w}mV;CN)NL*LtgP=qBuv<)&$#Pyz9Ek_x*S{9LB5F z3PjUvXCk60bw=dwkOl-)x@rxfiC<*mLqp8|x2@0ZMx&widc6)_1h!>?E%ab8&~riK znQe(=*zfmWr_(6{C-E+q%aC0d6fX_<`F$bb6yKFyG88T^9P!~o0(NB=4~)NR4JK$w S6mZ)B0000wS=L3{z_4T!y2HRrS8W# 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 literal 0 HcmV?d00001 diff --git a/assets/images/flags/mys.png b/assets/images/flags/mys.png new file mode 100644 index 0000000000000000000000000000000000000000..022476291461fe068760cc472e5ea14c49b156cc GIT binary patch literal 1082 zcmV-A1jYM_P)IL#z~BFM1M{Qt;zq4|)}~e?Yt|y{ebu#Y+(jy?N>0 zN}<7mwqg(M21><3+LVN(X_6h^n|8Llo2?cdp+6Yjo7p$BzkTy&_RRozp#+s&E~k=Y zj421%1QgY6|A)S+OR7FwhZqNu!J-(3p_I#IC6mcOKA-2$NZ;JtRF;>QneW4(zrUZ4 z(b?I_gng}6Q=-u*6VIt1wG9pqG8%{4sm(pE&=(dKU~zHL9v&WM6B83OhV3Rw1hsm- z9*RUFTBFfWn$4yXkH?8Le5}8Y{2i}?<4fX+UdH^P`A6fx>_h(b8~Y|MNznm z0oiM-tE=Iene*SUdJ6s#bMO`)*JTZRQ&UU9@6MX+lrL>+tdACoZ49y5bN_oh*a(BhF>15{43f zKoDYv0WuJM{aV8i1P@U+#-7b^G8Z2VIb?`5;mN%(uvLkGwHCt?=fwT^dipd-K{m@5 zriUm6F-ao$@a7VXipbxluX^oQMa$J#F zA6ZaB?M5h@%^qV%4C!>5_Q4PqMHj3oDUp`-NJ8So3Fk<}6K86qV}`6eQWm0?W#e(g zsVj68>Fw=}+O}O_M+B`_t1vJy5Ji4Gq4yl_Q0nXJ>pK4TRSE@>`VmMMIjbM;!&#|R zVu?gzcklC!;kR`|*iwH@(^$1yZKhHwIxo>F)OPYwBx+-01OEhd>`=p_E09n&%{XJ=+9oVk)*n?MUwUI?(S{NvKqt*_KwRza4rm( z@6tfj_bwz<|1%bF$>6)ZP~m_J39@4W7Y_oz07Cgry5D4;BLDyZ07*qoM6N<$g1;y5 A+yDRo literal 0 HcmV?d00001 diff --git a/assets/images/flags/nld.png b/assets/images/flags/nld.png new file mode 100644 index 0000000000000000000000000000000000000000..62dbc205834a2822186eb8423d4af92be5f4e6a2 GIT binary patch literal 762 zcmV-Abrr&AUCW1?28@fyWqQEC0d;UKfwtkUC{hrULmp|B46 z(Pyr!<{{NfZR#)9IADySsBQmy7g$U*_|9kmetRoJytCYPAx7 zLVS*v|5eZPJVkO?DwP7NgTY|nODWmJg4nzB`8@sc`|7I{@|Cav#QNL)%NMV6xtvdy z4L$0U%jHs@&u8#{`r8@)FQgRD7K?>TE)!5w!Fk!_nM}qNmVsQt(Xt~f2Lc;)L==G{ zECYRdSQWfvL==%OECZ!H%}IIYz}qjMh4k!jRptBQ)BAU-TrP9_hUk-OMc4#Q65vm- z9oA;>9t(%HF__G_iSnq8!35)(>4^n85LjnX;F_K|m{>4Ufi*xLrBfL5;=NuE%zkX> z^kT#F^J?^ml;|4KBBq8?W5^?GMYuqT>uAV=mJg%&=N${sa} z*?-mDYnd)%T=)C^!;zqMb%8GGN~OYUp+;Nl63G+!=5aQgUBF3Puggh@9t`4-2D*KH skZ|H-NskP%#|uY1@*n}dq=yHMpY=|<^gs1VNdN!<07*qoM6N<$f*b&2ZvX%Q literal 0 HcmV?d00001 diff --git a/assets/images/flags/nor.png b/assets/images/flags/nor.png new file mode 100644 index 0000000000000000000000000000000000000000..bd226c0a6a50b3bd61123d838f48336157bcd3d9 GIT binary patch literal 898 zcmV-|1AY97P)4?W~>5PR0*souOOh(ZLxe?X5~zivIKV6V0(wY0@v z`URy_%_)!%OwEVc-SNF4GuZ#5dSL)l_+px2x}!^6WwTKpmDfk1%g^Lgk5w~y4l+8KtyQMY5Un1#~X*w`=`VQ47pqmRz&0RI4nNB={X3k^@`}&>3qFna`FiTgTdyE z5{~C@cXg)eDRlo{%eLCvcToSl0)ql255IbqQMDqO>+8@Dto{AIV>BUrUhRqH&f2%2 z4K;y?s-3ytP%IX?GoymFA2%h@Xp}iKD!QJI8Q?SE)MQItWE2lz_QAn{Wdr{SJ^^vT zGn|E8Ph@%1;SQyd&1MZ;_ca;{&aEHm?S_Z*a7N>bx{P#p47aTl(w6*nUFYR;*-Ru7 zbY3E&wpv1wsEw6%Om__(DtL4ik_rZ{qDh$~6=!|Jwk&nrmI=AGwpOVkq^&GuOLBaC zT*M+t&(ao2)<#E1t4Bvib>ak#<8mvg3j_D1fqZUUNNDc1R+kK}%L@(KTu6{ztBVJT Yf8aCZ8PR=&y8r+H07*qoM6N<$f>9Qp`v3p{ literal 0 HcmV?d00001 diff --git a/assets/images/flags/nzl.png b/assets/images/flags/nzl.png new file mode 100644 index 0000000000000000000000000000000000000000..11c6ade9cd644d01e7dbaf97538302ba811d55cc GIT binary patch literal 1373 zcmV-j1)}vhl)C*WYmu$(rrif-(^|VlaShf=x{a)AVq9XHkGuChcyE(P{C{i*Ton(l$U!|=fMj8@qHDUrxhLTiYUoZK5KB=;@62rs8 zqK@^sxjAWaa#Bh7F%%UQi9T|2aun4*5C}+FSy_r&&+WLZrlv;Wez=^=V*6Efhr@xf zv9V}NON-Lm+sl1KV~H|BV=x#@%gD$uhC(4J91cq+lZi=-53-(?mZr?k&SE7bwo&!} zYA4IGLV7eeH#b5uGBh+4mLy5I7{uP_a=Fq^1arp`juie=TZ2#CM)dqL9oPBk58puf z(IW^>{{c_uaWuVmF0Q_Q`_nl1co@a~SA

RULNeUn-ye}lVb>eT zi-uz*FBZ01BY5oU4``=~)@FUeiMUVjYe6u&rxE8H_Tuc739JEyGi%kF3hXmY)ZY zHvo@M-|NhYLQv>pW>FwhXvkRy+CKKi8ou0E2IYG@BHnqCw>0m@Z?&%quT_lp!T;+- zT-^oxBz-iXwLfzFB5u28l9Jp{Kk1WXocLR&A6rg#oAsKR;&hQFS4bn8N%+X&o5%l% zgV|d#l4ed?|9Ra8xP13;^qT$z-E6#MCIo0T32Q^ovm7Z#`^d_EA(9#=IksZ_WM`b= z&Mg~YzCJ2+qj^1Yns?!Pd6PEuEbmR<5%rO>QuIySjcXr0^(}SkLNX){_ts5jxaLDz z%q}b}M6+s}aon zs#{bpzR-lupaoss4$3)ky3`ie`I#>VafW1F^>b*gkBIg2rK>-pfeBaLCu~`tg|^+r zXmF0e*jS14mqwQnog%x#WJh}(kz76sf~dOPz4J{1!HZ1r4pzf}{U!!<2)nDF$0_g- z2Qa=6g~wWgfx(+e`xzZe9wu?i(<_^Hd2i(9qwBH*Ye8N0Q`nd3!~5S&;ZH**9u%?5 zlNO^hGc#y+^D^qiTA_LvYappY9c_bJke8Q-M-A*eo5FPC4>T>3BDA3mU1m<(r&j07741Y zn%I_QK|z7&izVk(TOt{>TCIyyQ&S=4gr)1U9<&F8#76@)zw{tsNUYO)WJq|tFd)f; f1l#F7JgE2=4E*4{CRBGF00000NkvXXu0mjfXibP` literal 0 HcmV?d00001 diff --git a/assets/images/flags/phl.png b/assets/images/flags/phl.png new file mode 100644 index 0000000000000000000000000000000000000000..b453f3933bef2d4dff687e33c06ef62e44e38e70 GIT binary patch literal 1179 zcmV;M1Z4Y(P)L{Co-rlzLUJFc&- zt%CB6OYNV{W<@w0mij&SC)faL-7!1nQ)m7{Te;-}HSHD0YAgS)Q zw6r*6oyp0`f)GN57{uOArBb1xuW!tJJUG)i^zA$j9&(}Y(ACGNQWzZ_b(A(J^w#$F zw$=S`Q|DLbBe?a=b2!=^$H78$((KtRLw>S!Gil1k-P@42-$vqrM*KSb0tVlI8i@xZ zI4CGiC0J!|LhZ1+t^;BZ!8uwoGk1?PHA@M54fpwra95()J?zX zblOEVqVmosa5uk$+QEYDMbiIXg(S=H>bF*e<8ZLZZ@-Ri1JoozL=+%_EO0jWfI$CK-0OOPC{m2{nU>n#`QR3&^`Au?}y(d>S`jd95akWiPC+uS;)46>F80@W0RB z7g&T!hrCc`pFdTz#ZnFY&!i*D8dX!z#|)L`J^BNdJ{_*B4tE1>O)e$Q&_wwF=8lh# zJL$>a78lOG(^2m!t^^lyks}J788S6?X z6aF#$zFufw?r+<+%w#f!L?XfGB_`^c?1_lF)R?Dm=cq%Lj;_jbp@DbECBv4Bx4q<> z(e=j0Mr9`^CbByO?W+s>vhC>TP-C&>XYETQb8T&HJM;7NdFF)Dak&!Ag@OOlKtGo* tBrN~CN|y}2%L@y;Tu88ArHcoR{{Tu0a@fY&eG~uy002ovPDHLkV1n1YKLh{( literal 0 HcmV?d00001 diff --git a/assets/images/flags/pol.png b/assets/images/flags/pol.png new file mode 100644 index 0000000000000000000000000000000000000000..30d5a937142eed15a38ddce4a631634da569e945 GIT binary patch literal 707 zcmV;!0zCbRP)+Uax> zmdSd(j-`|zKA62b8jb24@*`P-G)<4w>9h)N2&9LP^Z6`auNR{GCM*F*@$Gavxx8c& zek3ej71mm<<_gQeOTy8*BP<6J8!{(~L=l#OryfxSFPRfXrVGo!B~NoAtEZmpYCg+W z6YX}pxvq%n1#2_Z9*YHQV=|d}gMv@G^Y@Qm!Y24XeKO0FQp|;G6SDFo@}0>j1=av{ zR7X_p^}4>KL{XR*F-i0MdNxbu^BjKt4`*6q7$>!KJmP-8A7@0xIvhIFHoSOfD@E4E+fKeOMK56vc&b%3ae)Hzd58!zi z-OBRvvMJK{ed9cvF2!uO@6p$6lV*o)i&y|5!(up&W1O6v7>Pszxm+%26aDDu$k^T8 z^*jC;W@cuBF(xJ^d~IJYmyJjy;_G(lCw24l^S+ED^-|Y9uGTj;Hn6$5*;rg$^w-wb zWQ;~TQ6U(rR4OB*qobi}wQAIAHDi2yTu28$DEi3Ah<|u^h!>%=kJew-&ay0@dSh~O zvQAlFUtg~oh7q_JWFOkw+Y3Lw`FM+;m(eFyGr-;7F;tLs;UmYnLA932Wa<_balJ_| zn*WF7s{%cEnX?z-EY{`Q)D4WO5H1+nIhnZNkVPoc(iIZK=mTmLSXuyV{%1D=L8D`l0x>;TEP0Oux<`hg!|66O-LNzhP0+5zI!RUQL_BwL*N zp8C`+;Okoo(KPVe1D2l{^{UzSl*OKPP*|Z7$G|8Siw&(?{d80@rlI$mx>EqWr6g25 zjuc7RLM)$#&3c!9$S;v=3IoBmZOP|>9(Ys-Y%e(1NWeQAB*Wq)fiJ$nogY5{?%xmC zN(d+tv|S7}*##ce+g&fn0(zJhg7oIMEdTrsy89 zwHTgk|Ao7^85g-Nc%BQJ1ieQXN}AHM9UP^2a$y>^BH7vO@rydymw@kY(|fXCJWyCj zxKK}0aNmBHB!6ZSO_M+4RPvKc&whx3@Xpn%(Qr6?%F|S}uc`M+jL|=s-zcM>d7NsS zi8BrL)tA&s?pSfk^YkkJ)IAK0SS;4^s1WUIM_T2P^AV#Ylk@Pt<>AUF9#)cy(@l1( zE|TPq&zl>-Frd%4!RZNoV&&InPECEx58uPnEe{!HDkZUbXDGS81$}_mBuD1v=6c5H zd3Y7)QNfMt*WcLQ-ae&T3u07Q_j@RL9gv+#xC!*73UbZB1p^mSYp)MH$_rRyXJ%QJICm>ZHKm% z{-IFFFO^C)rIg&4glMCcM@h87$|~JmVTUrWu7Q-ofhC|zBBiv~pV^kQJ~lQM$ZR%S zJ|(oRE@CTkdU`q-OQd{jTav6yO--G;u3HsOIJ+))L+iny^U*+mpFK#Joo(G789E*> jOq}x|A$Hv!9yI;~FbO%In{hR}00000NkvXXu0mjf9GWNq literal 0 HcmV?d00001 diff --git a/assets/images/flags/rou.png b/assets/images/flags/rou.png new file mode 100644 index 0000000000000000000000000000000000000000..49b36b438d254a3a8a5c957df494a81db4b1f9cc GIT binary patch literal 705 zcmV;y0zUnTP)xK~#7F)mXc( z8Zi*Hy-N@hh?hi>f{UoqrJ$vt$tUn7`2qeSe~^Zspo@^8i3Dj7B3D#MJQNTQv8*%4 zVpe9ePo>@B5ncuv98tNL~hmK_I0xE*8Yzo6qMTe*F3Ji#R`t2N8V#CSHS|t-`~$#QOKw z&mTYGXL`Nf#U}->SL8+Y8j^1f^57Hgo=3ZQ!L#B4I#Zr-3^pev90y)P$cQKov2YB_ zz4g1@E@a(lqJ=`?)}wr2U4|jb2i9f0zv~HCfs6R(dMcO8 z!ZpBo>``Ah3^8$@Zw(dZZb` zG0@d?`>m%0ESyXxh@_u|BM60lrX21O7OXPc-2`sjHD_wD6Hk_K;|H|J8QS zdN!Livfu9?js&*l23yE#wQAOa#53Cx$y23LInHLYGdPKBx}1clU=S}F@bk4Gq2gmn nMTS`MLWw&C3D_kS9vFWCo`R#l57l*#00000NkvXXu0mjfNK_)&QxL`m$<=Z7P| zG_+m%eUh1pJvJZXiJ39cdx)YoolZSSrIdJPQ_wuy{vUHaOL{rmjF<+~=eq`(f1Y_w^dhW>XpaFbqYdQc-3c^UyaMjTF{FKl&@(~16u{2ZhIuU!xX zignp)wNjSpa=A=|5N~TRdw)0_R@mixljy3;Y*Xf!g9YN94!U4|xV0@h`GyyFQ+fs6R#cxt!X67+cd|3)$^<^;(d4HnvPM>U28y{eB;V6Fti1B4if^DtBpMo*x$yUVcm!Tr%V? kFFbm3Aptv8aPeU98x%(>K{(uA8UO$Q07*qoM6N<$g7b4YPXGV_ literal 0 HcmV?d00001 diff --git a/assets/images/flags/saf.png b/assets/images/flags/saf.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9cbded835862dc7257ce7bfb0d046fbe6ea1d3 GIT binary patch literal 1319 zcmV+?1=#wDP)>+g5q)Jt~@o3wtDoAc|vzkB-W@0{PS z=Nw?a6r;=M^O?BSG)>9pV{n=D{)fD4(zT`>-z=CA!_cL;-EL)jds}I3ZN=2olz7H= zI2=|M78bOeABLu;CecS_Wu+$lcXoCZo6V-l=lmYu>*(mvxF5dH_w@ZrduC<^v$M0A z?(S}Fbaa&a$ml^C(40slELN-4oJ=N_R4S#EmzOiN_(HZV7K^sIxru|6`;N39)K67a zjqFTSRaKhW^yK7ZN>LOMVi3JK7z~z-KkN97(2vW`T$Q!(w4O!Z*;kNS{R`2rKF8MZ z4g4P>>LssQagxlG-|tVG$>3o!$K!Ezt@+r1-Z>Kg8~%k~@Zr=qa8}o&{l%AHKX)FP z=r)q`zoVF<2s%E9#NMHi&4fasj7dIVSWjKp@TEX_4W7|=apI~MAOAUvN3ZnbvC%J3 z_QH7-Q_Li7lm5Z*6G1FKGY7XLio<|^jBR9rt*4(xvBXKZ50odd_c|rYRt$GeFA8W^ z={@8F?!5UXyaXMzs;GPKCY)D%Q0wbaNNsFvKvoYiM;jU%7})aV_kp*DZbz}SmV)Q0 zG<+w+aM_ahIa-QH%6wl(KZO=BG;thB+pS% zRH=qhKvmns#Ke}~(ewNx=(~6fu38l%tCi?qtU(}NlDFgC3UQIDMGc}~e}?$<6po^f zk3KnOx7*`XpHl~dvRt)h0xlE43^}suAmG}(oy(GTxuXk?(lQ)H?d|Oql=VAV(3X}K z3l-f`BTzlCk6UOT%+Lj1!ka`0j^rwnF49X@!;v z|3SxT&hAPxOtL~smM8g*q7)n?N11}YS1ZudWhXcjdjF`yV9<$TOOAFH)ai6$etsTC zfR`_nqvwJhpqkmgSSF$<*B3jFOU){SiG3aA@V>0Q;|vA+UTGM-c~) zk|`U}`x0rlepZM~9|=+Y3_N)K9J%!?`UePdWeZ1D+vCWti5WDzcy^z%ih9YdKU@ay zbS?am{KMyNIz@mli`GB30`Ik3)Gnitk_&hdQ8wDz+Hhx}S^#!FBw*(og$HCsA`xwF zZcf;$q~=9Q=XBG7fc&pB+}$exd1yPkiUTO+a5xlwM8(kaHp3sW8NWcu!K-{ul*ru# zdf)yQgEuBoY*A^-&~`-FBBHbb%Z!hYr*Y=VWx{UM1IkRsJym4#;QNyTw&>EdW!l4~ zDVn^w)Anud7<_$wU8Vnh6Hf)+;K}#c=6gnc>NjURuXxDV&g~=DS1;+y@0-nLEf$NV zTrL;yml*Wltq6f;=w_0_o#2H4ZCypn7j+ybml(Hv>F@9P#-z>5GHz*svqSr^tgpP- zm)pk1M$s3y{8{=EWTK{~CLRa`lFWp??Xr=w2L`!^2J-XXfrKgdnb9Fb&f$d#c@8Al d&*K{d9$Klrzc(wol002ovPDHLkV1hg3gyjGL literal 0 HcmV?d00001 diff --git a/assets/images/flags/sgp.png b/assets/images/flags/sgp.png new file mode 100644 index 0000000000000000000000000000000000000000..5782ea1448b20532100edbaeb2afcab47b8cee9c GIT binary patch literal 902 zcmV;119|+3P)kkaJP6fR zPmO}1)KU=w`O&2LakD$VZ_KQdHL1Nc><7bpGy7)p<(s#&Gegu3(W|VitXQy8O3^Q- zN3qQK|MayCYlUJ1VhSL`MJz5ZifXkg=H}*TYimnAgI_L}#m>%-4E-^ho}N}?jEsy( z9p7j)L^7F_`Z@ZcZDCm!EAzLgKNv|FOQM~2am$h0D z3?&a9JS6#dC8LAYM@re_MkbR9ezfP*BOg)X7ta3)Vs#UjE-GKC$@M{?R;&4R7*U{l z=N{ST&M0E?XO-M{A5?qm#Vf8KznZ}C@Nl=HI$=#9AAelFsnkm@-wwz@X{-c;2G-Fa zVZ#6^RA)=@*HQjw;jinX~Zi3;##G8I)*k7EW!47@aTf9v@G=I8Tyk57Ml z6cPBozsF}dkEb4FW!K@3ty3rz96oGWNCk822ftr>n1?gumEKH*#|X!o(6Q)m+qSIN z>+PwjDV&!;)DON)Ow{K_m*sA8hXx;Al||u!n;cSyMKRkuv32dIQYmFOHZ~efhK|(* zv9J>p6KX72)O9SAY>kbLHFtM+U2vk#ak&?Q3xn{bfv$HhB&_hWUY87^%L|M8Tu30U c*TsXzZ^Tmp`=k5dkN^Mx07*qoM6N<$g3Df|CjbBd literal 0 HcmV?d00001 diff --git a/assets/images/flags/swe.png b/assets/images/flags/swe.png new file mode 100644 index 0000000000000000000000000000000000000000..ef73086f6d3a0054edddd56f218f9f49a9908350 GIT binary patch literal 752 zcmV1OE&1Mruqmg_^`ew6Xv)N3<{uneG4e6s)DhXxpI1bBZvqHV6an#pp zwFLR0e(KZxDt$a2!(=iEJDrZ`^?KwZ)QJ*7%XQsUCX=x|&ttytvwS{Jq~#Bio=T;} zdcB69AwEXw*V@^(El>~3<#K>B7!HR%V@!q^kiE57EYe?|zP(4zw{QhMzq*4LHmx7Y5*r-tGIYyCROY;AK-Qw(7IEw*2an+4$$^yfnbK+n) z=p!T<5v4^8hGDf@fyy2cQTockFcb=fh?CJ%zu)ger5jDOSS&^nrSv2hEGAtD-@Jz3 zMf>LdkH#nA`RG}s%ZRE4Ycd{QdZJWdBGhc#s-se=0RMP*wS#}Z*8@CSy@PZ*&CZCL z2nrtN_bA~T{UNC{t~yy83p!8}WJDEf)3Ducg&tAK+QdT%?M!+^<HR0$gVJ-koRovX zz&Rq6t!iXTvR11}UnJ>S*&<1|TCE=E^SMWy;8ZRrA-XV#UmB?A(}e_&ze~Dgh+STA ixNspsc1afx3O@jfc(L7|H`M9?0000CjASwi(((^N zkHunQKA+Ry5T2v-|FyGiTd?kBvsss=+v#*1!!V?aiP>9|$>i+ic=we*FGvr3`}ipJ zn5ENdwOpGOxZY$h^8T=NAqiY?^em2|iw{%v@}9CtGXy!=!GR|?SELm_+{l9o)hCKg z{P6iD>4e$!Yf7b3@{swV$0;Yxz$AT6C!xRl{DpMFdcF1%iGxm06Z#W#f-20t00l07t=dw3JR-6=fEbZxZYICt= zB0mkLe$deuwP>(7!@fc?0X@7%*ft1di}{viiOpu?6pKaFOCaj`7d{j9xbwj7-eX^I z=_(}}FT7)u4J2By|7g2WI;Uk)w%hIPj-hN-gDqsCP>^du;#=7=$$dVb-;KxP131yK zT#kbOU=V&ZP~XP~2{Swv^~exF;pOKXW@-_a1yCCRNvk@`DYy=;m_`sRz)M>1t zovXQb*$0}c?x}8%)ipg`MRX7KsP%e14^nHbp4mKTo^AieT+fnT$~GZp05aTEr_)jU z{a&?NEgFx<<{9+ucB|&|xla8tYBrl@jdHoH#r||Usa!6ntC-|6^5ZI6bc}1eh_*llhK>ahW>~29MRuv z7X*Q3J+4$L5zA;a8ih(J<6>g={&Kne@U!{-7k6LC4gBu>{qd1yI2a6~fEBpjV=p2; zTpua zIK-kmO|(=h-Fs95)@2x?60j~KusizO7jg-ozkYgsJmDyC5wDJ?YPCwP0nQVT2IMf{ zJU-tOk2?J#$sJd2*3JSKYQT6@Si6SZZl`UJ8rCjeO7LZ}J!-ZdX$Cn4KAP^o^_+mk zv)L@tn*NX@h?xuLa1n1k$m+Y~j%Bb~tpZNAJcNRM^@IK_JnZBQaV3|D^crbf8)A$3 zzVGYf@fbE54dhE88Yc%n6ODQB%I?1KgcGN(Mxyb;XEr%PqS@m&+oS0DeBQ|6aCka1 z#8w(?A?x+JSql<2|FJt;`Q d?or`E@DFUqq)bc02A2Q;002ovPDHLkV1ibEI&J^} literal 0 HcmV?d00001 diff --git a/assets/images/flags/usa.png b/assets/images/flags/usa.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c44ce75b7960e2d1cd9cd820ebba0ad23c2334 GIT binary patch literal 1220 zcmV;#1UvhQP)tvxTMOVXY3|4~ z-$zqVHt01gPcGv3dtv`|wzZX&mAc6pNUyVsx}l$qPEAFGK!1OesLlNZ5sd7(9w~e3;71bIO3tW)EoQjR{JvJ{Gbd2;byngjU%H zpfjt#J{E!?4}~u!-ll8wQF0T$@0JXng49M77#Ru4kb(p(2teK2w{Oye2akkcsbmT9 z`S}~Pyu2Zufq(ald(`)(MQ#I&u#G4tF^2N&%%Vu-ijaX?b8|O@WP-^i*`hP?_=Nao zW+rHBD=SLB|LQdgg$!~N$3J{afk2?S$dnVS+{0hDm{`(50;rJ^l^nqV~YHgopXCVkdMW}>D0}{&*H(EXn{hd3vXldzZ@qsKl6i%mHANo?M z)bRWL-HAdeD5h3F$f;q6q8NH1$?7dXTo)gbd3Z*?&>*>qU?s1$EhbD@-gLzQVt4Pp zLyL>w%ZdkKnF_oUV3A=SOJ|rQEWXj9cR&4rUUzxuDHdyG<^PobzIZK}K93pw3-b{} z4T4zpAmUUMbJXdB!syWTKXWu`x;ykA=e7f^sKtNHwYH%Lxg#bA3xEI;<|TZxv5z$U zSyoZS0ik{mQRM|}Pshi{wD|Q$)KlQ0SBIMx(V?Ls`t7|Bsh0rpyk2j+qJVYq2lWyl z9?#L1qOD`tn~#2^UczTQ^y-W&rzcgg^~vYdYfuMxQ52bIG)jeyH1!frPfzVkCL?)K zlUaLSVx&^3zo~~1i^baZQ6YQ}80?~%90-0!oomG~*f_cGLSFuRk@HvN+VUe8vi`cTt^RZ0q`ue(c z&QP%`Ar>|q4oh3G_*St@vNAk8e7?80R|O}!xGr}?>%pM&(LjA)JV@xBW!)YbIvy`{ idd`Cc;<`ONDEtG<61ko@ElBC1{gTOhJM(t>?VC5RZw8UV3We(u$0f|rSb7`SY2J^W2EPDIVqV;GRKF(z`y{X zqobpP3Hws1BzZg@CdTPK>YJRLWHb-;Q=ffap|7v6Lp&ZgXJ=>G{QNx4VcLljL8V+S zyWDQKQmIs=YPBl)d_E%0e~@&S%f+(UEF1;rJ3>FMovNw~bu$nM7$}WcELN2yiK#S* z?B#Si?OL9Dzk$^I^*n&4X#j=}tpc*%y#6RWI5jmzA7Btsa=naRl!@flt_r`B!w}E( zz}V#vaH%^3tpF}{KdzpFt7y=(ECw*96q3)D0}%R>f$mRh@G|BGy`n;^AUF|Z=U~5D zfT#J}@Hq1TqOl;Xr4(o-XcLmOh*A)fycY1o+Sdg5D$6j`DS>v{1+Bu)&JKv|VXZ6e za*{6Z54bzh31xQzE}qihN^b#L1;5{KrO%oGe6cjbr4dj-FOEV&D?noDEVK%RLc#QU zyaS*-vhs)jj+(0_2aHDVfk34&17w)n}5DRJ7EF5R!uA_ z>$U|I)C3}GRp#vmUDui2qnx!UO4~cWy)Q6bmfv7PE7xgMUvF){Rg&1p<`Lb<;u!RX%8W6 zMI&31eSLj=E|T;tY>{NStE+1-l}c5J6C50u>%qD(a9$dS=YtCg**RA4lEHC#A;TdT f5@c8J;z8gqB@7!k&4^c200000NkvXXu0mjfmiNpA literal 0 HcmV?d00001 diff --git a/assets/images/search_icon.png b/assets/images/search_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4ec0772226b405d143973ea158dc5b47cd739e GIT binary patch literal 469 zcmV;`0V@89P)kgkpwzN)sVf>i<9&|b3D&XfJqdNi zsckB$A>w$HSsFi9GeoK?!*MO}G+{N~dK>kH2W1UdsZ-h)#(;uPv)7{h1?C;j00000 LNkvXXu0mjfRFK2L literal 0 HcmV?d00001 diff --git a/lib/di.dart b/lib/di.dart index 763a82834..7391e59ca 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -38,7 +38,6 @@ import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart'; import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart'; import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart'; import 'package:cake_wallet/src/screens/send/send_template_page.dart'; -import 'package:cake_wallet/src/screens/settings/change_language.dart'; import 'package:cake_wallet/src/screens/settings/settings.dart'; import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart'; import 'package:cake_wallet/src/screens/support/support_page.dart'; @@ -507,8 +506,6 @@ Future setup( getIt.registerFactory(() => FaqPage(getIt.get())); - getIt.registerFactory(() => LanguageListPage(getIt.get())); - getIt.registerFactoryParam( (type, _) => WalletRestoreViewModel(getIt.get(), getIt.get(param1: type), _walletInfoSource, diff --git a/lib/entities/fiat_currency.dart b/lib/entities/fiat_currency.dart index c5fa3a602..1e5c61e1e 100644 --- a/lib/entities/fiat_currency.dart +++ b/lib/entities/fiat_currency.dart @@ -1,43 +1,46 @@ import 'package:cw_core/enumerable_item.dart'; class FiatCurrency extends EnumerableItem with Serializable { - const FiatCurrency({String symbol}) : super(title: symbol, raw: symbol); + const FiatCurrency({String symbol, this.countryCode, this.fullName}) : super(title: symbol, raw: symbol); + + final String countryCode; + final String fullName; static List get all => _all.values.toList(); - static const aud = FiatCurrency(symbol: 'AUD'); - static const bgn = FiatCurrency(symbol: 'BGN'); - static const brl = FiatCurrency(symbol: 'BRL'); - static const cad = FiatCurrency(symbol: 'CAD'); - static const chf = FiatCurrency(symbol: 'CHF'); - static const cny = FiatCurrency(symbol: 'CNY'); - static const czk = FiatCurrency(symbol: 'CZK'); - static const eur = FiatCurrency(symbol: 'EUR'); - static const dkk = FiatCurrency(symbol: 'DKK'); - static const gbp = FiatCurrency(symbol: 'GBP'); - static const hkd = FiatCurrency(symbol: 'HKD'); - static const hrk = FiatCurrency(symbol: 'HRK'); - static const huf = FiatCurrency(symbol: 'HUF'); - static const idr = FiatCurrency(symbol: 'IDR'); - static const ils = FiatCurrency(symbol: 'ILS'); - static const inr = FiatCurrency(symbol: 'INR'); - static const isk = FiatCurrency(symbol: 'ISK'); - static const jpy = FiatCurrency(symbol: 'JPY'); - static const krw = FiatCurrency(symbol: 'KRW'); - static const mxn = FiatCurrency(symbol: 'MXN'); - static const myr = FiatCurrency(symbol: 'MYR'); - static const nok = FiatCurrency(symbol: 'NOK'); - static const nzd = FiatCurrency(symbol: 'NZD'); - static const php = FiatCurrency(symbol: 'PHP'); - static const pln = FiatCurrency(symbol: 'PLN'); - static const ron = FiatCurrency(symbol: 'RON'); - static const rub = FiatCurrency(symbol: 'RUB'); - static const sek = FiatCurrency(symbol: 'SEK'); - static const sgd = FiatCurrency(symbol: 'SGD'); - static const thb = FiatCurrency(symbol: 'THB'); - static const usd = FiatCurrency(symbol: 'USD'); - static const zar = FiatCurrency(symbol: 'ZAR'); - static const vef = FiatCurrency(symbol: 'VEF'); + static const aud = FiatCurrency(symbol: 'AUD', countryCode: "aus", fullName: "Australian Dollar"); + static const bgn = FiatCurrency(symbol: 'BGN', countryCode: "bgr", fullName: "Bulgarian Lev"); + static const brl = FiatCurrency(symbol: 'BRL', countryCode: "bra", fullName: "Brazilian Real"); + static const cad = FiatCurrency(symbol: 'CAD', countryCode: "cad", fullName: "Canadian Dollar"); + static const chf = FiatCurrency(symbol: 'CHF', countryCode: "che", fullName: "Swiss Franc"); + static const cny = FiatCurrency(symbol: 'CNY', countryCode: "chn", fullName: "Chinese Yuan"); + static const czk = FiatCurrency(symbol: 'CZK', countryCode: "czk", fullName: "Czech Koruna"); + static const eur = FiatCurrency(symbol: 'EUR', countryCode: "eur", fullName: "Euro"); + static const dkk = FiatCurrency(symbol: 'DKK', countryCode: "dnk", fullName: "Danish Krone"); + static const gbp = FiatCurrency(symbol: 'GBP', countryCode: "gbr", fullName: "Pound sterling"); + static const hkd = FiatCurrency(symbol: 'HKD', countryCode: "hkg", fullName: "Hong Kong Dollar"); + static const hrk = FiatCurrency(symbol: 'HRK', countryCode: "hrv", fullName: "Croatian Kuna"); + static const huf = FiatCurrency(symbol: 'HUF', countryCode: "hun", fullName: "Hungarian Forint"); + static const idr = FiatCurrency(symbol: 'IDR', countryCode: "idn", fullName: "Indonesian Rupiah"); + static const ils = FiatCurrency(symbol: 'ILS', countryCode: "isr", fullName: "Israeli New Shekel"); + static const inr = FiatCurrency(symbol: 'INR', countryCode: "ind", fullName: "Indian Rupee"); + static const isk = FiatCurrency(symbol: 'ISK', countryCode: "isl", fullName: "Icelandic Króna"); + static const jpy = FiatCurrency(symbol: 'JPY', countryCode: "jpn", fullName: "Japanese Yen equals"); + static const krw = FiatCurrency(symbol: 'KRW', countryCode: "kor", fullName: "South Korean won"); + static const mxn = FiatCurrency(symbol: 'MXN', countryCode: "mex", fullName: "Mexican Peso"); + static const myr = FiatCurrency(symbol: 'MYR', countryCode: "mys", fullName: "Malaysian Ringgit"); + static const nok = FiatCurrency(symbol: 'NOK', countryCode: "nor", fullName: "Norwegian Krone"); + static const nzd = FiatCurrency(symbol: 'NZD', countryCode: "nzl", fullName: "New Zealand Dollar"); + static const php = FiatCurrency(symbol: 'PHP', countryCode: "phl", fullName: "Philippine peso"); + static const pln = FiatCurrency(symbol: 'PLN', countryCode: "pol", fullName: "Poland złoty"); + static const ron = FiatCurrency(symbol: 'RON', countryCode: "rou", fullName: "Romanian Leu"); + static const rub = FiatCurrency(symbol: 'RUB', countryCode: "rus", fullName: "Russian Ruble"); + static const sek = FiatCurrency(symbol: 'SEK', countryCode: "swe", fullName: "Swedish Krona"); + static const sgd = FiatCurrency(symbol: 'SGD', countryCode: "sgp", fullName: "Singapore Dollar"); + static const thb = FiatCurrency(symbol: 'THB', countryCode: "tha", fullName: "Thai Baht"); + static const usd = FiatCurrency(symbol: 'USD', countryCode: "usa", fullName: "United States Dollar"); + static const zar = FiatCurrency(symbol: 'ZAR', countryCode: "saf", fullName: "South African Rand"); + static const vef = FiatCurrency(symbol: 'VEF', countryCode: "ven", fullName: "Venezuelan Bolívar"); static final _all = { FiatCurrency.aud.raw: FiatCurrency.aud, diff --git a/lib/entities/language_service.dart b/lib/entities/language_service.dart index fc3349dee..367223e0d 100644 --- a/lib/entities/language_service.dart +++ b/lib/entities/language_service.dart @@ -20,6 +20,25 @@ class LanguageService { 'hr': 'Hrvatski (Croatian)', 'it': 'Italiano (Italian)' }; + + static const Map localeCountryCode = { + 'en': 'usa', + 'de': 'deu', + 'es': 'esp', + 'fr': 'fra', + 'hi': 'ind', + 'ja': 'jpn', + 'ko': 'kor', + 'nl': 'nld', + 'pl': 'pol', + 'pt': 'prt', + 'ru': 'rus', + 'uk': 'ukr', + 'zh': 'chn', + 'hr': 'hrv', + 'it': 'ita' + }; + static final list = {}; static void loadLocaleList() { diff --git a/lib/router.dart b/lib/router.dart index 01443a138..a3c7573ea 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -47,7 +47,6 @@ import 'package:cake_wallet/src/screens/monero_accounts/monero_account_edit_or_c import 'package:cake_wallet/src/screens/contact/contact_list_page.dart'; import 'package:cake_wallet/src/screens/contact/contact_page.dart'; import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart'; -import 'package:cake_wallet/src/screens/settings/change_language.dart'; import 'package:cake_wallet/src/screens/restore/restore_wallet_from_seed_details.dart'; import 'package:cake_wallet/src/screens/exchange/exchange_page.dart'; import 'package:cake_wallet/src/screens/settings/settings.dart'; @@ -359,10 +358,6 @@ Route createRoute(RouteSettings settings) { case Routes.faq: return MaterialPageRoute(builder: (_) => getIt.get()); - case Routes.changeLanguage: - return MaterialPageRoute( - builder: (_) => getIt.get()); - case Routes.preSeed: return MaterialPageRoute( builder: (_) => diff --git a/lib/routes.dart b/lib/routes.dart index eea2b7488..1200d558a 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -41,7 +41,6 @@ class Routes { static const unlock = '/auth_not_closable'; static const rescan = '/rescan'; static const faq = '/faq'; - static const changeLanguage = '/change_language'; static const newWalletType = '/new_wallet_type'; static const sendTemplate = '/send_template'; static const exchangeTemplate = '/exchange_template'; diff --git a/lib/src/screens/settings/change_language.dart b/lib/src/screens/settings/change_language.dart deleted file mode 100644 index d4c7c36d8..000000000 --- a/lib/src/screens/settings/change_language.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:cake_wallet/src/screens/settings/widgets/language_row.dart'; -import 'package:cake_wallet/src/widgets/standard_list.dart'; -import 'package:cake_wallet/store/settings_store.dart'; -import 'package:cake_wallet/utils/show_pop_up.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/entities/language_service.dart'; -import 'package:cake_wallet/src/screens/base_page.dart'; -import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; - -class LanguageListPage extends BasePage { - LanguageListPage(this.settingsStore); - - final SettingsStore settingsStore; - - @override - String get title => S.current.settings_change_language; - - @override - Widget body(BuildContext context) { - return Container( - padding: EdgeInsets.only(top: 10.0), - child: SectionStandardList( - sectionCount: 1, - context: context, - itemCounter: (int sectionIndex) => LanguageService.list.values.length, - itemBuilder: (_, sectionIndex, index) { - return Observer(builder: (BuildContext context) { - final item = LanguageService.list.values.elementAt(index); - final code = LanguageService.list.keys.elementAt(index); - final isCurrent = code == settingsStore.languageCode ?? false; - - return LanguageRow( - title: item, - isSelected: isCurrent, - handler: (context) async { - if (!isCurrent) { - await showPopUp( - context: context, - builder: (BuildContext context) { - return AlertWithTwoActions( - alertTitle: S.of(context).change_language, - alertContent: - S.of(context).change_language_to(item), - rightButtonText: S.of(context).change, - leftButtonText: S.of(context).cancel, - actionRightButton: () { - settingsStore.languageCode = code; - Navigator.of(context).pop(); - }, - actionLeftButton: () => - Navigator.of(context).pop()); - }); - } - }, - ); - }); - }, - )); - } -} diff --git a/lib/src/screens/settings/settings.dart b/lib/src/screens/settings/settings.dart index feda1cf61..168b8d297 100644 --- a/lib/src/screens/settings/settings.dart +++ b/lib/src/screens/settings/settings.dart @@ -1,4 +1,6 @@ +import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_version_cell.dart'; +import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:cake_wallet/view_model/settings/version_list_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; @@ -46,6 +48,10 @@ class SettingsPage extends BasePage { selectedItem: item.selectedItem(), items: item.items, onItemSelected: (dynamic value) => item.onItemSelected(value), + images: item.images, + searchHintText: item.searchHintText, + isGridView: item.isGridView, + matchingCriteria: (dynamic value, String searchText) => item.matchingCriteria(value, searchText), ); }); } @@ -80,6 +86,10 @@ class SettingsPage extends BasePage { }); } + if (item is ChoicesListItem) { + return SettingsChoicesCell(item); + } + return Container(); }); } diff --git a/lib/src/screens/settings/widgets/language_row.dart b/lib/src/screens/settings/widgets/language_row.dart deleted file mode 100644 index 0f807a843..000000000 --- a/lib/src/screens/settings/widgets/language_row.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:cake_wallet/palette.dart'; -import 'package:flutter/material.dart'; -import 'package:cake_wallet/src/widgets/standard_list.dart'; - -class LanguageRow extends StandardListRow { - LanguageRow({@required String title, @required this.isSelected, @required Function(BuildContext context) handler}) : - super(title: title, isSelected: isSelected, onTap: handler); - - @override - final bool isSelected; - - @override - Widget buildCenter(BuildContext context, {@required bool hasLeftOffset}) { - return Expanded( - child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ - if (hasLeftOffset) SizedBox(width: 10), - Text(title, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: titleColor(context))) - ])); - } - - @override - Widget buildTrailing(BuildContext context) => - isSelected - ? Icon(Icons.done, color: Palette.blueCraiola) - : Offstage(); -} \ No newline at end of file diff --git a/lib/src/screens/settings/widgets/settings_choices_cell.dart b/lib/src/screens/settings/widgets/settings_choices_cell.dart new file mode 100644 index 000000000..abbd33231 --- /dev/null +++ b/lib/src/screens/settings/widgets/settings_choices_cell.dart @@ -0,0 +1,71 @@ +import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; +import 'package:flutter/material.dart'; + +class SettingsChoicesCell extends StatelessWidget { + const SettingsChoicesCell(this.choicesListItem, {Key key}) : super(key: key); + + final ChoicesListItem choicesListItem; + + @override + Widget build(BuildContext context) { + return Container( + color: Theme.of(context).backgroundColor, + padding: EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + choicesListItem.title, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: Theme.of(context).primaryTextTheme.title.color, + ), + ), + ], + ), + const SizedBox(height: 24), + Center( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: Theme.of(context).accentTextTheme.display2.color, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: choicesListItem.items.map((dynamic e) { + final isSelected = choicesListItem.selectedItem == e; + return GestureDetector( + onTap: () { + choicesListItem.onItemSelected?.call(e); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 32, vertical: 8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: isSelected ? Theme.of(context).accentTextTheme.body2.color : null, + ), + child: Text( + choicesListItem.displayItem?.call(e) ?? e.toString(), + style: TextStyle( + color: isSelected ? Colors.white : Theme.of(context).primaryTextTheme.caption.color, + fontWeight: isSelected ? FontWeight.w700 : FontWeight.normal, + ), + ), + ), + ); + }).toList(), + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/screens/settings/widgets/settings_picker_cell.dart b/lib/src/screens/settings/widgets/settings_picker_cell.dart index 691b73835..6116a6ea5 100644 --- a/lib/src/screens/settings/widgets/settings_picker_cell.dart +++ b/lib/src/screens/settings/widgets/settings_picker_cell.dart @@ -2,7 +2,6 @@ import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; -import 'package:cake_wallet/generated/i18n.dart'; class SettingsPickerCell extends StandardListRow { SettingsPickerCell( @@ -10,29 +9,43 @@ class SettingsPickerCell extends StandardListRow { @required this.displayItem, this.selectedItem, this.items, + this.images, + this.searchHintText, + this.isGridView = false, + this.matchingCriteria, this.onItemSelected}) : super( - title: title, - isSelected: false, - onTap: (BuildContext context) async { - final selectedAtIndex = items.indexOf(selectedItem); + title: title, + isSelected: false, + onTap: (BuildContext context) async { + final selectedAtIndex = items.indexOf(selectedItem); - await showPopUp( - context: context, - builder: (_) => Picker( - items: items, - displayItem: displayItem, - selectedAtIndex: selectedAtIndex, - title: S.current.please_select, - mainAxisAlignment: MainAxisAlignment.center, - onItemSelected: (ItemType item) => - onItemSelected?.call(item))); - }); + await showPopUp( + context: context, + builder: (_) => Picker( + items: items, + displayItem: displayItem, + selectedAtIndex: selectedAtIndex, + mainAxisAlignment: MainAxisAlignment.start, + onItemSelected: (ItemType item) => onItemSelected?.call(item), + images: images, + isSeparated: false, + hintText: searchHintText, + isGridView: isGridView, + matchingCriteria: matchingCriteria, + ), + ); + }, + ); final ItemType selectedItem; final List items; final void Function(ItemType item) onItemSelected; final String Function(ItemType item) displayItem; + final List images; + final String searchHintText; + final bool isGridView; + final bool Function(ItemType, String) matchingCriteria; @override Widget buildTrailing(BuildContext context) { @@ -40,9 +53,7 @@ class SettingsPickerCell extends StandardListRow { displayItem?.call(selectedItem) ?? selectedItem.toString(), textAlign: TextAlign.right, style: TextStyle( - fontSize: 14.0, - fontWeight: FontWeight.w500, - color: Theme.of(context).primaryTextTheme.overline.color), + fontSize: 14.0, fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.overline.color), ); } } diff --git a/lib/src/widgets/alert_background.dart b/lib/src/widgets/alert_background.dart index db73e7c0d..e8368e27c 100644 --- a/lib/src/widgets/alert_background.dart +++ b/lib/src/widgets/alert_background.dart @@ -10,15 +10,19 @@ class AlertBackground extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - height: double.infinity, - width: double.infinity, - color: Colors.transparent, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0), - child: Container( - decoration: BoxDecoration(color: PaletteDark.darkNightBlue.withOpacity(0.75)), - child: child, + return Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: Colors.transparent, + body: Container( + height: double.infinity, + width: double.infinity, + color: Colors.transparent, + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0), + child: Container( + decoration: BoxDecoration(color: PaletteDark.darkNightBlue.withOpacity(0.75)), + child: child, + ), ), ), ); diff --git a/lib/src/widgets/picker.dart b/lib/src/widgets/picker.dart index 3748bf28f..b5cad676b 100644 --- a/lib/src/widgets/picker.dart +++ b/lib/src/widgets/picker.dart @@ -2,7 +2,6 @@ import 'dart:ui'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/alert_background.dart'; -import 'package:cake_wallet/src/widgets/cake_scrollbar.dart'; import 'package:cake_wallet/src/widgets/alert_close_button.dart'; import 'package:cake_wallet/palette.dart'; @@ -10,13 +9,19 @@ class Picker extends StatefulWidget { Picker({ @required this.selectedAtIndex, @required this.items, - @required this.title, @required this.onItemSelected, + this.title, this.displayItem, this.images, this.description, this.mainAxisAlignment = MainAxisAlignment.start, - }); + this.isGridView = false, + this.isSeparated = true, + this.hintText, + this.matchingCriteria, + }) : assert(hintText == null || + matchingCriteria != + null); // make sure that if the search field is enabled then there is a searching criteria provided final int selectedAtIndex; final List items; @@ -26,6 +31,10 @@ class Picker extends StatefulWidget { final Function(Item) onItemSelected; final MainAxisAlignment mainAxisAlignment; final String Function(Item) displayItem; + final bool isGridView; + final bool isSeparated; + final String hintText; + final bool Function(Item, String) matchingCriteria; @override PickerState createState() => PickerState(items, images, onItemSelected); @@ -35,8 +44,10 @@ class PickerState extends State { PickerState(this.items, this.images, this.onItemSelected); final Function(Item) onItemSelected; - final List items; - final List images; + List items; + List images; + + final TextEditingController searchController = TextEditingController(); final closeButton = Image.asset( 'assets/images/close.png', @@ -44,161 +55,248 @@ class PickerState extends State { ); ScrollController controller = ScrollController(); - final double backgroundHeight = 193; - final double thumbHeight = 72; - double fromTop = 0; + @override + void initState() { + super.initState(); + + searchController.addListener(() { + items = []; + images = []; + for (int i=0;i 3 : false; - return AlertBackground( - child: Stack( - alignment: Alignment.center, - children: [ - Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: EdgeInsets.only(left: 24, right: 24), - child: Text( - widget.title, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - fontFamily: 'Lato', - fontWeight: FontWeight.bold, - decoration: TextDecoration.none, - color: Colors.white), - ), - ), - Padding( - padding: EdgeInsets.only(left: 24, right: 24, top: 24), - child: GestureDetector( - onTap: () => null, - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(14)), - child: Container( - height: 233, + child: Stack( + alignment: Alignment.center, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (widget.title?.isNotEmpty ?? false) + Container( + padding: EdgeInsets.symmetric(horizontal: 24), + child: Text( + widget.title, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + fontFamily: 'Lato', + fontWeight: FontWeight.bold, + decoration: TextDecoration.none, + color: Colors.white, + ), + ), + ), + Padding( + padding: EdgeInsets.only(left: 24, right: 24, top: 24), + child: GestureDetector( + onTap: () => null, + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(30)), + child: Container( color: Theme.of(context).accentTextTheme.title.color, - child: Stack( - alignment: Alignment.center, - children: [ - ListView.separated( - padding: EdgeInsets.all(0), - controller: controller, - separatorBuilder: (context, index) => Divider( - color: Theme.of(context) - .accentTextTheme - .title - .backgroundColor, - height: 1, - ), - itemCount: items == null ? 0 : items.length, - itemBuilder: (context, index) { - final item = items[index]; - final image = - images != null ? images[index] : null; - final isItemSelected = - index == widget.selectedAtIndex; - - final color = isItemSelected - ? Theme.of(context).textTheme.body2.color - : Theme.of(context) - .accentTextTheme - .title - .color; - final textColor = isItemSelected - ? Palette.blueCraiola - : Theme.of(context) - .primaryTextTheme - .title - .color; - - return GestureDetector( - onTap: () { - if (onItemSelected == null) { - return; - } - Navigator.of(context).pop(); - onItemSelected(item); - }, - child: Container( - height: 77, - padding: EdgeInsets.only(left: 24, right: 24), - color: color, - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: widget.mainAxisAlignment, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - image ?? Offstage(), - Padding( - padding: EdgeInsets.only( - left: image != null ? 12 : 0), - child: Text( - widget.displayItem?.call(item) ?? - item.toString(), - style: TextStyle( - fontSize: 18, - fontFamily: 'Lato', - fontWeight: FontWeight.w600, - color: textColor, - decoration: TextDecoration.none, - ), - ), - ) - ], + child: ConstrainedBox( + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.height * 0.65, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (widget.hintText != null) + Padding( + padding: const EdgeInsets.all(16), + child: TextFormField( + controller: searchController, + style: TextStyle(color: Theme.of(context).primaryTextTheme.title.color), + decoration: InputDecoration( + hintText: widget.hintText, + prefixIcon: Image.asset("assets/images/search_icon.png"), + filled: true, + fillColor: Theme.of(context).accentTextTheme.display2.color, + alignLabelWithHint: false, + contentPadding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide( + color: Colors.transparent, + )), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide( + color: Colors.transparent, + )), ), ), - ); - }, - ), - ((widget.description != null) && - (widget.description.isNotEmpty)) - ? Positioned( - bottom: 24, - left: 24, - right: 24, - child: Text( - widget.description, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - fontFamily: 'Lato', - decoration: TextDecoration.none, - color: Theme.of(context) - .primaryTextTheme - .title - .color), - )) - : Offstage(), - isShowScrollThumb - ? CakeScrollbar( - backgroundHeight: backgroundHeight, - thumbHeight: thumbHeight, - fromTop: fromTop) - : Offstage(), - ], - )), + ), + Divider( + color: Theme.of(context).accentTextTheme.title.backgroundColor, + height: 1, + ), + if (widget.selectedAtIndex != -1) buildSelectedItem(), + Flexible( + child: Stack( + alignment: Alignment.center, + children: [ + (items?.length ?? 0) > 3 ? Scrollbar( + controller: controller, + child: itemsList(), + ) : itemsList(), + (widget.description?.isNotEmpty ?? false) + ? Positioned( + bottom: 24, + left: 24, + right: 24, + child: Text( + widget.description, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + fontFamily: 'Lato', + decoration: TextDecoration.none, + color: Theme.of(context).primaryTextTheme.title.color, + ), + ), + ) + : Offstage(), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ) + ], + ), + AlertCloseButton(image: closeButton) + ], + ), + ); + } + + Widget itemsList() { + return Container( + color: Theme.of(context).accentTextTheme.headline6.backgroundColor, + child: widget.isGridView + ? GridView.builder( + padding: EdgeInsets.zero, + controller: controller, + itemCount: items == null || items.isEmpty ? 0 : items.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 2, + childAspectRatio: 3, + ), + itemBuilder: (context, index) => buildItem(index), + ) + : ListView.separated( + padding: EdgeInsets.zero, + controller: controller, + shrinkWrap: true, + separatorBuilder: (context, index) => widget.isSeparated + ? Divider( + color: Theme.of(context).accentTextTheme.title.backgroundColor, + height: 1, + ) + : const SizedBox(), + itemCount: items == null || items.isEmpty ? 0 : items.length, + itemBuilder: (context, index) => buildItem(index), + ), + ); + } + + Widget buildItem(int index) { + /// don't show selected item in the list view + if (widget.items[widget.selectedAtIndex] == items[index] && !widget.isGridView) { + return const SizedBox(); + } + + final item = items[index]; + final image = images != null ? images[index] : null; + + return GestureDetector( + onTap: () { + if (onItemSelected == null) { + return; + } + Navigator.of(context).pop(); + onItemSelected(item); + }, + child: Container( + height: 55, + color: Theme.of(context).accentTextTheme.headline6.color, + padding: EdgeInsets.only(left: 24, right: 24), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: widget.mainAxisAlignment, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + image ?? Offstage(), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: image != null ? 12 : 0), + child: Text( + widget.displayItem?.call(item) ?? item.toString(), + style: TextStyle( + fontSize: 14, + fontFamily: 'Lato', + fontWeight: FontWeight.w600, + color: Theme.of(context).primaryTextTheme.title.color, + decoration: TextDecoration.none, + ), ), ), - ) + ), ], ), - AlertCloseButton(image: closeButton) - ], - )); + ), + ); + } + + Widget buildSelectedItem() { + final item = widget.items[widget.selectedAtIndex]; + final image = images != null ? widget.images[widget.selectedAtIndex] : null; + + return Container( + height: 55, + color: Theme.of(context).accentTextTheme.headline6.color, + padding: EdgeInsets.only(left: 24, right: 24), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: widget.mainAxisAlignment, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + image ?? Offstage(), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: image != null ? 12 : 0), + child: Text( + widget.displayItem?.call(item) ?? item.toString(), + style: TextStyle( + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.w700, + color: Theme.of(context).primaryTextTheme.title.color, + decoration: TextDecoration.none, + ), + ), + ), + ), + Icon(Icons.check_circle, color: Theme.of(context).accentTextTheme.body2.color), + ], + ), + ); } } diff --git a/lib/src/widgets/standard_list.dart b/lib/src/widgets/standard_list.dart index c12f1b347..572f03791 100644 --- a/lib/src/widgets/standard_list.dart +++ b/lib/src/widgets/standard_list.dart @@ -37,11 +37,15 @@ class StandardListRow extends StatelessWidget { return Expanded( child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ if (hasLeftOffset) SizedBox(width: 10), - Text(title, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.normal, - color: titleColor(context))) + Expanded( + child: Text(title, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: titleColor(context), + ), + ), + ) ])); } diff --git a/lib/src/widgets/standart_switch.dart b/lib/src/widgets/standart_switch.dart index 8760279a1..06d13d6aa 100644 --- a/lib/src/widgets/standart_switch.dart +++ b/lib/src/widgets/standart_switch.dart @@ -24,7 +24,7 @@ class StandartSwitchState extends State { height: 28, decoration: BoxDecoration( color: widget.value - ? Colors.green + ? Theme.of(context).accentTextTheme.body2.color : Theme.of(context).accentTextTheme.display4.color, borderRadius: BorderRadius.all(Radius.circular(14.0))), child: Container( diff --git a/lib/themes/bright_theme.dart b/lib/themes/bright_theme.dart index 5adb5d2f1..67f4e20bf 100644 --- a/lib/themes/bright_theme.dart +++ b/lib/themes/bright_theme.dart @@ -78,6 +78,14 @@ class BrightTheme extends ThemeBase { decorationColor: Colors.white, // menu background ) ), + scrollbarTheme: ScrollbarThemeData( + thumbColor: MaterialStateProperty.all(Palette.moderatePurpleBlue), + trackColor: MaterialStateProperty.all(Palette.periwinkleCraiola), + radius: Radius.circular(3), + thickness: MaterialStateProperty.all(6), + isAlwaysShown: true, + crossAxisMargin: 6, + ), primaryTextTheme: TextTheme( title: TextStyle( color: Palette.darkBlueCraiola, // title color diff --git a/lib/themes/dark_theme.dart b/lib/themes/dark_theme.dart index 646afc964..3a1361913 100644 --- a/lib/themes/dark_theme.dart +++ b/lib/themes/dark_theme.dart @@ -77,6 +77,14 @@ class DarkTheme extends ThemeBase { decorationColor: PaletteDark.deepPurpleBlue, // menu background ) ), + scrollbarTheme: ScrollbarThemeData( + thumbColor: MaterialStateProperty.all(PaletteDark.wildBlueGrey), + trackColor: MaterialStateProperty.all(PaletteDark.violetBlue), + radius: Radius.circular(3), + thickness: MaterialStateProperty.all(6), + isAlwaysShown: true, + crossAxisMargin: 6, + ), primaryTextTheme: TextTheme( title: TextStyle( color: Colors.white, // title color diff --git a/lib/themes/light_theme.dart b/lib/themes/light_theme.dart index 763872efe..a00b07f91 100644 --- a/lib/themes/light_theme.dart +++ b/lib/themes/light_theme.dart @@ -78,6 +78,14 @@ class LightTheme extends ThemeBase { decorationColor: Colors.white, // menu background ) ), + scrollbarTheme: ScrollbarThemeData( + thumbColor: MaterialStateProperty.all(Palette.moderatePurpleBlue), + trackColor: MaterialStateProperty.all(Palette.periwinkleCraiola), + radius: Radius.circular(3), + thickness: MaterialStateProperty.all(6), + isAlwaysShown: true, + crossAxisMargin: 6, + ), primaryTextTheme: TextTheme( title: TextStyle( color: Palette.darkBlueCraiola, // title color diff --git a/lib/themes/theme_list.dart b/lib/themes/theme_list.dart index b4cea1391..06bdde3f7 100644 --- a/lib/themes/theme_list.dart +++ b/lib/themes/theme_list.dart @@ -4,7 +4,7 @@ import 'package:cake_wallet/themes/light_theme.dart'; import 'package:cake_wallet/themes/theme_base.dart'; class ThemeList { - static final all = [lightTheme, brightTheme, darkTheme]; + static final all = [brightTheme, lightTheme, darkTheme]; static final lightTheme = LightTheme(raw: 0); static final brightTheme = BrightTheme(raw: 1); diff --git a/lib/view_model/settings/choices_list_item.dart b/lib/view_model/settings/choices_list_item.dart new file mode 100644 index 000000000..040968597 --- /dev/null +++ b/lib/view_model/settings/choices_list_item.dart @@ -0,0 +1,25 @@ +import 'package:flutter/foundation.dart'; +import 'package:cake_wallet/view_model/settings/settings_list_item.dart'; +import 'package:flutter/material.dart'; + +class ChoicesListItem extends SettingsListItem { + ChoicesListItem( + {@required String title, + @required this.selectedItem, + @required this.items, + this.displayItem, + void Function(ItemType item) onItemSelected}) + : _onItemSelected = onItemSelected, + super(title); + + final ItemType selectedItem; + final List items; + final String Function(ItemType item) displayItem; + final void Function(ItemType item) _onItemSelected; + + void onItemSelected(dynamic item) { + if (item is ItemType) { + _onItemSelected?.call(item); + } + } +} diff --git a/lib/view_model/settings/picker_list_item.dart b/lib/view_model/settings/picker_list_item.dart index 0785232bb..ae4bfd128 100644 --- a/lib/view_model/settings/picker_list_item.dart +++ b/lib/view_model/settings/picker_list_item.dart @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:cake_wallet/view_model/settings/settings_list_item.dart'; +import 'package:flutter/material.dart'; class PickerListItem extends SettingsListItem { PickerListItem( @@ -7,18 +8,34 @@ class PickerListItem extends SettingsListItem { @required this.selectedItem, @required this.items, this.displayItem, - void Function(ItemType item) onItemSelected}) + this.images, + this.searchHintText, + this.isGridView = false, + void Function(ItemType item) onItemSelected, + bool Function(ItemType item, String searchText) matchingCriteria}) : _onItemSelected = onItemSelected, + _matchingCriteria = matchingCriteria, super(title); final ItemType Function() selectedItem; final List items; final String Function(ItemType item) displayItem; final void Function(ItemType item) _onItemSelected; + final List images; + final String searchHintText; + final bool isGridView; + final bool Function(ItemType, String) _matchingCriteria; void onItemSelected(dynamic item) { if (item is ItemType) { _onItemSelected?.call(item); } } + + bool matchingCriteria(dynamic item, String searchText) { + if (item is ItemType) { + return _matchingCriteria?.call(item, searchText); + } + return true; + } } diff --git a/lib/view_model/settings/settings_view_model.dart b/lib/view_model/settings/settings_view_model.dart index 555b0d2a0..67cf35635 100644 --- a/lib/view_model/settings/settings_view_model.dart +++ b/lib/view_model/settings/settings_view_model.dart @@ -1,6 +1,7 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/entities/language_service.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; -import 'package:cake_wallet/utils/show_pop_up.dart'; -import 'package:cake_wallet/view_model/settings/link_list_item.dart'; +import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:flutter/cupertino.dart'; import 'package:mobx/mobx.dart'; import 'package:package_info/package_info.dart'; @@ -75,7 +76,7 @@ abstract class SettingsViewModelBase with Store { //var connectYatUrl = YatLink.baseUrl + YatLink.signInSuffix; //final connectYatUrlParameters = // _yatStore.defineQueryParameters(); - + //if (connectYatUrlParameters.isNotEmpty) { // connectYatUrl += YatLink.queryParameter + connectYatUrlParameters; //} @@ -83,7 +84,7 @@ abstract class SettingsViewModelBase with Store { //var manageYatUrl = YatLink.baseUrl + YatLink.managePath; //final manageYatUrlParameters = // _yatStore.defineQueryParameters(); - + //if (manageYatUrlParameters.isNotEmpty) { // manageYatUrl += YatLink.queryParameter + manageYatUrlParameters; //} @@ -91,27 +92,41 @@ abstract class SettingsViewModelBase with Store { //var createNewYatUrl = YatLink.startFlowUrl; //final createNewYatUrlParameters = // _yatStore.defineQueryParameters(); - + //if (createNewYatUrlParameters.isNotEmpty) { // createNewYatUrl += '?sub1=' + createNewYatUrlParameters; //} - + sections = [ [ - PickerListItem( - title: S.current.settings_display_balance_as, - items: BalanceDisplayMode.all, - selectedItem: () => balanceDisplayMode, - onItemSelected: (BalanceDisplayMode mode) => - _settingsStore.balanceDisplayMode = mode), + SwitcherListItem( + title: S.current.settings_display_balance, + value: () => balanceDisplayMode == BalanceDisplayMode.displayableBalance, + onValueChange: (_, bool value) { + if (value) { + _settingsStore.balanceDisplayMode = BalanceDisplayMode.displayableBalance; + } else { + _settingsStore.balanceDisplayMode = BalanceDisplayMode.hiddenBalance; + } + }, + ), if (!isHaven) PickerListItem( title: S.current.settings_currency, + searchHintText: S.current.search_currency, items: FiatCurrency.all, selectedItem: () => fiatCurrency, onItemSelected: (FiatCurrency currency) => - setFiatCurrency(currency)), + setFiatCurrency(currency), + images: FiatCurrency.all.map( + (e) => Image.asset("assets/images/flags/${e.countryCode}.png")) + .toList(), + isGridView: true, + matchingCriteria: (FiatCurrency currency, String searchText) { + return currency.title.toLowerCase().contains(searchText) || currency.fullName.toLowerCase().contains(searchText); + }, + ), PickerListItem( title: S.current.settings_fee_priority, items: priorityForWalletType(wallet.type), @@ -150,10 +165,23 @@ abstract class SettingsViewModelBase with Store { } }); }), - RegularListItem( - title: S.current.settings_change_language, - handler: (BuildContext context) => - Navigator.of(context).pushNamed(Routes.changeLanguage), + PickerListItem( + title: S.current.settings_change_language, + searchHintText: S.current.search_language, + items: LanguageService.list.keys.toList(), + displayItem: (dynamic code) { + return LanguageService.list[code]; + }, + selectedItem: () => getIt.get().languageCode, + onItemSelected: (String code) { + getIt.get().languageCode = code; + }, + images: LanguageService.list.keys.map( + (e) => Image.asset("assets/images/flags/${LanguageService.localeCountryCode[e]}.png")) + .toList(), + matchingCriteria: (String code, String searchText) { + return LanguageService.list[code].toLowerCase().contains(searchText); + }, ), SwitcherListItem( title: S.current.settings_allow_biometrical_authentication, @@ -180,12 +208,12 @@ abstract class SettingsViewModelBase with Store { setAllowBiometricalAuthentication(value); } }), - PickerListItem( - title: S.current.color_theme, - items: ThemeList.all, - selectedItem: () => theme, - onItemSelected: (ThemeBase theme) => - _settingsStore.currentTheme = theme) + ChoicesListItem( + title: S.current.color_theme, + items: ThemeList.all, + selectedItem: theme, + onItemSelected: (ThemeBase theme) => _settingsStore.currentTheme = theme, + ), ], //[ //if (_yatStore.emoji.isNotEmpty) ...[ diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 8d1c098ae..83d461546 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -76,6 +76,7 @@ flutter: assets: - assets/images/ + - assets/images/flags/ - assets/node_list.yml - assets/haven_node_list.yml - assets/bitcoin_electrum_server_list.yml diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index fa34eeced..304e91a1b 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Knoten", "settings_current_node" : "Aktueller Knoten", "settings_wallets" : "Wallets", - "settings_display_balance_as" : "Kontostand anzeigen in", + "settings_display_balance" : "Kontostand anzeigen", "settings_currency" : "Währung", "settings_fee_priority" : "Gebührenpriorität", "settings_save_recipient_address" : "Empfängeradresse speichern", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats leben auch außerhalb von Cake Wallet. Jede Wallet-Adresse auf der Welt kann durch ein Yat ersetzt werden!", "learn_more" : "Erfahren Sie mehr", "search": "Suche", + "search_language": "Sprache suchen", + "search_currency": "Währung suchen", "new_template" : "neue Vorlage", "electrum_address_disclaimer": "Wir generieren jedes Mal neue Adressen, wenn Sie eine verwenden, aber vorherige Adressen funktionieren weiterhin" } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 25c449929..2f9b0cf78 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Nodes", "settings_current_node" : "Current node", "settings_wallets" : "Wallets", - "settings_display_balance_as" : "Display balance as", + "settings_display_balance" : "Display balance", "settings_currency" : "Currency", "settings_fee_priority" : "Fee priority", "settings_save_recipient_address" : "Save recipient address", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats live outside of Cake Wallet, too. Any wallet address on earth can be replaced with a Yat!", "learn_more" : "Learn More", "search": "Search", + "search_language": "Search language", + "search_currency": "Search currency", "new_template" : "New Template", "electrum_address_disclaimer": "We generate new addresses each time you use one, but previous addresses continue to work" } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index e520ff727..76284f46d 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Nodos", "settings_current_node" : "Nodo actual", "settings_wallets" : "Carteras", - "settings_display_balance_as" : "Mostrar saldo como", + "settings_display_balance" : "Mostrar saldo", "settings_currency" : "Moneda", "settings_fee_priority" : "Prioridad de tasa", "settings_save_recipient_address" : "Guardar dirección del destinatario", @@ -530,6 +530,8 @@ "third_intro_content" : "Los Yats también viven fuera de Cake Wallet. Cualquier dirección de billetera en la tierra se puede reemplazar con un Yat!", "learn_more" : "Aprende más", "search": "Búsqueda", + "search_language": "Idioma de búsqueda", + "search_currency": "Moneda de búsqueda", "new_template" : "Nueva plantilla", "electrum_address_disclaimer": "Generamos nuevas direcciones cada vez que usa una, pero las direcciones anteriores siguen funcionando" } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index af41bb225..32abb9ac7 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -226,7 +226,7 @@ "settings_nodes" : "Nœuds", "settings_current_node" : "Nœud actuel", "settings_wallets" : "Portefeuilles", - "settings_display_balance_as" : "Afficher le solde en", + "settings_display_balance" : "Afficher le solde", "settings_currency" : "Devise", "settings_fee_priority" : "Priorité des frais", "settings_save_recipient_address" : "Sauvegarder l'adresse du bénéficiaire", @@ -527,7 +527,9 @@ "third_intro_title" : "Yat joue bien avec les autres", "third_intro_content" : "Les Yats existent aussi en dehors de Cake Wallet. Toute adresse sur terre peut être remplacée par un Yat !", "learn_more" : "En savoir plus", - + "search": "Chercher", + "search_language": "Langue de recherche", + "search_currency": "Devise de recherche", "new_template" : "Nouveau Modèle", "electrum_address_disclaimer": "Nous générons de nouvelles adresses à chaque fois que vous en utilisez une, mais les adresses précédentes continuent à fonctionner" } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 9c61e180f..c8b738277 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -228,7 +228,7 @@ "settings_nodes" : "नोड्स", "settings_current_node" : "वर्तमान नोड", "settings_wallets" : "पर्स", - "settings_display_balance_as" : "के रूप में संतुलन प्रदर्शित करें", + "settings_display_balance" : "प्रदर्शन संतुलन", "settings_currency" : "मुद्रा", "settings_fee_priority" : "शुल्क प्राथमिकता", "settings_save_recipient_address" : "प्राप्तकर्ता का पता सहेजें", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats Cake Wallet के बाहर भी रहता है। धरती पर किसी भी वॉलेट पते को Yat से बदला जा सकता है!", "learn_more" : "और अधिक जानें", "search": "खोज", + "search_language": "भाषा खोजें", + "search_currency": "मुद्रा खोजें", "new_template" : "नया टेम्पलेट", "electrum_address_disclaimer": "हर बार जब आप एक का उपयोग करते हैं तो हम नए पते उत्पन्न करते हैं, लेकिन पिछले पते काम करना जारी रखते हैं" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 16142ccd3..48a0ef4e2 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Nodovi", "settings_current_node" : "Trenutni node", "settings_wallets" : "Novčanik", - "settings_display_balance_as" : "Prikaži stanje računa kao", + "settings_display_balance" : "Prikaži stanje računa", "settings_currency" : "Valuta", "settings_fee_priority" : "Prioritet naknade", "settings_save_recipient_address" : "Spremi primateljevu adresu", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats žive i izvan Cake Wallet -a. Bilo koja adresa novčanika na svijetu može se zamijeniti Yat!", "learn_more" : "Saznajte više", "search": "Traži", + "search_language": "Jezik pretraživanja", + "search_currency": "Traži valutu", "new_template" : "novi predložak", "electrum_address_disclaimer": "Minden egyes alkalommal új címeket generálunk, de a korábbi címek továbbra is működnek" } diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 10c22001a..cb21d43dd 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Nodi", "settings_current_node" : "Nodo attuale", "settings_wallets" : "Portafogli", - "settings_display_balance_as" : "Mostra saldo come", + "settings_display_balance" : "Mostra saldo", "settings_currency" : "Moneta", "settings_fee_priority" : "Priorità commissione", "settings_save_recipient_address" : "Salva indirizzo di destinazione", @@ -530,6 +530,8 @@ "third_intro_content" : "Anche Yats vive fuori da Cake Wallet. Qualsiasi indirizzo di portafoglio sulla terra può essere sostituito con un Yat!", "learn_more" : "Impara di più", "search": "Ricerca", + "search_language": "Cerca lingua", + "search_currency": "Cerca valuta", "new_template" : "Nuovo modello", "electrum_address_disclaimer": "Generiamo nuovi indirizzi ogni volta che ne utilizzi uno, ma gli indirizzi precedenti continuano a funzionare" } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 3e2c3e886..6f162b8dc 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -228,7 +228,7 @@ "settings_nodes" : "ノード", "settings_current_node" : "現在のノード", "settings_wallets" : "財布", - "settings_display_balance_as" : "残高を表示", + "settings_display_balance" : "ディスプレイバランス", "settings_currency" : "通貨", "settings_fee_priority" : "料金優先", "settings_save_recipient_address" : "受信者のアドレスを保存", @@ -530,6 +530,8 @@ "third_intro_content" : "YatsはCakeWalletの外にも住んでいます。 地球上のどのウォレットアドレスもYatに置き換えることができます!", "learn_more" : "もっと詳しく知る", "search": "検索", + "search_language": "検索言語", + "search_currency": "検索通貨", "new_template" : "新しいテンプレート", "electrum_address_disclaimer": "使用するたびに新しいアドレスが生成されますが、以前のアドレスは引き続き機能します" } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index ad3e3ac5b..124edbd7c 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -228,7 +228,7 @@ "settings_nodes" : "노드", "settings_current_node" : "현재 노드", "settings_wallets" : "지갑", - "settings_display_balance_as" : "잔액 표시", + "settings_display_balance" : "디스플레이 잔액", "settings_currency" : "통화", "settings_fee_priority" : "수수료 우선", "settings_save_recipient_address" : "수신자 주소 저장", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats는 Cake Wallet 밖에서도 살고 있습니다. 지구상의 모든 지갑 주소는 Yat!", "learn_more" : "더 알아보기", "search": "찾다", + "search_language": "검색 언어", + "search_currency": "통화 검색", "new_template" : "새 템플릿", "electrum_address_disclaimer": "사용할 때마다 새 주소가 생성되지만 이전 주소는 계속 작동합니다." } diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 834da2c02..9ac238793 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -228,7 +228,7 @@ "settings_nodes" : "knooppunten", "settings_current_node" : "Huidige knooppunt", "settings_wallets" : "Portemonnee", - "settings_display_balance_as" : "Toon saldo als", + "settings_display_balance" : "Saldo weergeven", "settings_currency" : "Valuta", "settings_fee_priority" : "Tariefprioriteit", "settings_save_recipient_address" : "Adres ontvanger opslaan", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats wonen ook buiten Cake Wallet. Elk portemonnee-adres op aarde kan worden vervangen door een Yat!", "learn_more" : "Kom meer te weten", "search": "Zoekopdracht", + "search_language": "Zoektaal", + "search_currency": "Zoek valuta", "new_template" : "Nieuwe sjabloon", "electrum_address_disclaimer": "We generate new addresses each time you use one, but previous addresses continue to work" } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 6bcccb1e1..d6db3d206 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Węzły", "settings_current_node" : "Bieżący węzeł", "settings_wallets" : "Portfele", - "settings_display_balance_as" : "Wyświetl saldo jako", + "settings_display_balance" : "Wyświetl saldo", "settings_currency" : "Waluta", "settings_fee_priority" : "Priorytet opłaty", "settings_save_recipient_address" : "Zapisz adres odbiorcy", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats mieszkają również poza Cake Wallet. Każdy adres portfela na ziemi można zastąpić Yat!", "learn_more" : "Ucz się więcej", "search": "Szukaj", + "search_language": "Wyszukaj język", + "search_currency": "Wyszukaj walutę", "new_template" : "Nowy szablon", "electrum_address_disclaimer": "Za każdym razem, gdy korzystasz z jednego z nich, generujemy nowe adresy, ale poprzednie adresy nadal działają" } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 8737de6c0..f44ffaf6f 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Nós", "settings_current_node" : "Nó atual", "settings_wallets" : "Carteiras", - "settings_display_balance_as" : "Saldo a exibir", + "settings_display_balance" : "Exibir saldo", "settings_currency" : "Moeda", "settings_fee_priority" : "Prioridade da taxa", "settings_save_recipient_address" : "Salvar endereço do destinatário", @@ -530,6 +530,8 @@ "third_intro_content" : "Yats também mora fora da Cake Wallet. Qualquer endereço de carteira na Terra pode ser substituído por um Yat!", "learn_more" : "Saber mais", "search": "Procurar", + "search_language": "Idioma de pesquisa", + "search_currency": "Pesquisar moeda", "new_template" : "Novo modelo", "electrum_address_disclaimer": "Geramos novos endereços cada vez que você usa um, mas os endereços anteriores continuam funcionando" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 7df0463fb..bbb3482b2 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -228,7 +228,7 @@ "settings_nodes" : "Ноды", "settings_current_node" : "Текущая нода", "settings_wallets" : "Кошельки", - "settings_display_balance_as" : "Отображать баланс как", + "settings_display_balance" : "Отображать баланс", "settings_currency" : "Валюта", "settings_fee_priority" : "Приоритет транзакции", "settings_save_recipient_address" : "Сохранять адрес получателя", @@ -530,6 +530,8 @@ "third_intro_content" : "Yat находятся за пределами Cake Wallet. Любой адрес кошелька на земле можно заменить на Yat!", "learn_more" : "Узнать больше", "search": "Поиск", + "search_language": "Язык поиска", + "search_currency": "Валюта поиска", "new_template" : "Новый шаблон", "electrum_address_disclaimer": "Мы генерируем новые адреса каждый раз, когда вы их используете, но предыдущие адреса продолжают работать." } diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 2ef8cbb6b..ec13da291 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -227,7 +227,7 @@ "settings_nodes" : "Вузли", "settings_current_node" : "Поточний вузол", "settings_wallets" : "Гаманці", - "settings_display_balance_as" : "Відображати баланс як", + "settings_display_balance" : "Відображати баланс", "settings_currency" : "Валюта", "settings_fee_priority" : "Пріоритет транзакції", "settings_save_recipient_address" : "Зберігати адресу отримувача", @@ -529,6 +529,8 @@ "third_intro_content" : "Yat знаходиться за межами Cake Wallet. Будь-яку адресу гаманця на землі можна замінити на Yat!", "learn_more" : "Дізнатися більше", "search": "Пошук", + "search_language": "Мова пошуку", + "search_currency": "Шукати валюту", "new_template" : "Новий шаблон", "electrum_address_disclaimer": "Ми створюємо нові адреси щоразу, коли ви використовуєте їх, але попередні адреси продовжують працювати" } diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index f8632ee98..d1cb625ee 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -228,7 +228,7 @@ "settings_nodes" : "节点数", "settings_current_node" : "当前节点", "settings_wallets" : "钱包", - "settings_display_balance_as" : "将余额显示为", + "settings_display_balance" : "显示余额为", "settings_currency" : "货币", "settings_fee_priority" : "交易优先级", "settings_save_recipient_address" : "保存收件人地址", @@ -528,6 +528,8 @@ "third_intro_content" : "Yats 也住在 Cake Wallet 之外。 地球上任何一個錢包地址都可以用一個Yat來代替!", "learn_more" : "了解更多", "search": "搜索", + "search_language": "搜索语言", + "search_currency": "搜索货币", "new_template" : "新模板", "electrum_address_disclaimer": "每次您使用一个地址时,我们都会生成新地址,但之前的地址仍然有效" }