From e55892f36ed0c1db139faa89ee1d0fa0f4a754e0 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Fri, 28 Nov 2025 11:57:51 +0500 Subject: [PATCH 01/30] BASE: Add Necessary Assets. --- assets/images/click_logo.png | Bin 0 -> 3916 bytes assets/images/cosmetics_img.png | Bin 0 -> 34726 bytes assets/images/delivery_img.png | Bin 0 -> 28549 bytes assets/images/fondex_logo.png | Bin 0 -> 8176 bytes assets/images/fondex_logo_main.png | Bin 0 -> 9465 bytes assets/images/food_img.png | Bin 0 -> 178763 bytes assets/images/garderob_img.png | Bin 0 -> 122677 bytes assets/images/ic_pick_drop_location.png | Bin 0 -> 2712 bytes assets/images/keys_img.png | Bin 0 -> 33422 bytes assets/images/location_indicatorl | Bin 0 -> 25321 bytes assets/images/money_logo.png | Bin 0 -> 2769 bytes assets/images/outer_city_taxi_option.png | Bin 0 -> 129017 bytes assets/images/payme_logo.png | Bin 0 -> 7496 bytes assets/images/products_img.png | Bin 0 -> 60067 bytes assets/images/taxi_img.png | Bin 0 -> 189113 bytes assets/images/taxi_option.png | Bin 0 -> 138583 bytes lib/main.dart | 125 +++--- .../service_list_screen.dart | 373 +++++++++++++++++- lib/themes/app_them_data.dart | 6 + pubspec.lock | 8 + pubspec.yaml | 1 + 21 files changed, 452 insertions(+), 61 deletions(-) create mode 100644 assets/images/click_logo.png create mode 100644 assets/images/cosmetics_img.png create mode 100644 assets/images/delivery_img.png create mode 100644 assets/images/fondex_logo.png create mode 100644 assets/images/fondex_logo_main.png create mode 100644 assets/images/food_img.png create mode 100644 assets/images/garderob_img.png create mode 100644 assets/images/ic_pick_drop_location.png create mode 100644 assets/images/keys_img.png create mode 100644 assets/images/location_indicatorl create mode 100644 assets/images/money_logo.png create mode 100644 assets/images/outer_city_taxi_option.png create mode 100644 assets/images/payme_logo.png create mode 100644 assets/images/products_img.png create mode 100644 assets/images/taxi_img.png create mode 100644 assets/images/taxi_option.png diff --git a/assets/images/click_logo.png b/assets/images/click_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1709cdbca5ceedc8acc7c5c9d444dca360df88d0 GIT binary patch literal 3916 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 literal 0 HcmV?d00001 diff --git a/assets/images/fondex_logo.png b/assets/images/fondex_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..50fc8f28eadc9e506c1704d34555d3bda0e9809e GIT binary patch literal 8176 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
_}HMe$+!74|XIL3M=|3 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/images/garderob_img.png b/assets/images/garderob_img.png new file mode 100644 index 0000000000000000000000000000000000000000..ef351e1a0c6f2ef60ad4b62711df041fd20f9c30 GIT binary patch literal 122677 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

?)L0w(l%+KT* zOf0c@kh=!g4-rYoROgt7gDZ}*p@oG-;b_9lOTk)0w;@=Ccr2_6R!4T+1ej3ONPfTag63Z(zS;(~N-!u7N;kfLjOW@geY z+WLR|_3pPfd-snbRw`EH*9VXyl>_ySh}0soXi1AXOO!YOBDJz5vf5Y|Nc`X5Bee51=?@5pwj1m&dbi+?hW>ISz9Qwe!{`<~v)BoRf z{6#}P`#b;U3!jU%wSC}hwZKG%!vRNCvsINdhWj(gkYYsr!7E<$DJ#F&3e7>NE@1XT zym1?2QPGGpG}Rjg^chZ2!z)YCyw_Yxhy;3}vR`GJElC@jykPyjfeku7n&OR`5&lUU zVxYvWY;%OIEUs#f0c(LbG77EHn-9@OklxtXP;V%)X}iQelk&rzb`!5sM)C zR`Xj$C!MQK^X8GNsY1mGXkLA(H1v=rs)omHxvJLyy5)dD&~>qpT~VJ{YS^k$T$pA) zEj=O2rCNJ{=LV9?4bg<_3q|xyHTmidH@(r<`Ha{9E&Vhqxa2O1)%5n~UiQU9`yRgQ z-2P_!g|B$2zTup0(%LMaO-s`atPkB5`DZ5mi*B@g+4Q=hcqp>%C6ChSq zR`Z_!{M5n1^h`&9xx4KHQPh)B)q)r&e_op-!LNY{Rb6V%@NlAE{X7iV5+`u%P^9$?F*Rgy13LRY;;2P*EPiO$VZ z`h!?rGRMZLpOJkIa~=uZ3fY;)N~ z%CO5?U~8(#oKXpCn64`gH7X@`@0hE)`s%A`dS;eFyonbXye_%uB0BH93n(?2qy3Nl zgptM-my>;9de*b9XUnRG4jnwe#JP_`2&FTxG|$iPYHO#?HfY{wX`0>6d|`pcC&q=J zgEH&%^qBO21mKXDx0XmG8E|}(8&+X(fQ1E13!P?C9DPLU0ssh+Qb~zONEaw-NHmyN`upL4K}^23b%#K4Ny>X6Guvbw5laHQT5q<*dDonV@38jJxca>G|v2 z7rgXEh7m%VNtQ2|qr=f=f_|yST%zIgIiavmYwzFknZEO1(RG@#>i>UZ_s*Thk^J1_ z#fh;Y$dzyIi<1#-;yE-qsKoc2*R9>!H~gnRc<37XpMlrX5D+_CT}TJ=fJidsXs*}T z0>QphiL7$M6|KqxLDO~ohOTvY_tU<82dS^WPuiTB3U<^&mkq$DIHHeUDUdY9VE06v zJ4YqVBGQIU8HAoZX^Mkmjx50cpf!GIY>sBx4O>jj%j*;~MFy>s2n9;FAGQ+Qnk%o3 z?Drx^F4wGCM>{XSQi$+n1O2pR{U#1a6CFBofKD7g!7jz6w0y%Rnm#c}`}aOXI!C+G z(1l{|@1lz@reg>9apWM#fXM`WBuS$u57YeI0=2LUH#D@ICg)PLX6;(ux-J9b0!J#F zdGk9`Y7_*&!k@j!t|Fk{WN@l+pd#Q?8y>(Ut|oHP`16F>r9qzC;_R&C!KFBGA+p*K zbktN?48S|ip9O-4u*l*Jc16#n1t7vzg%ve3JuN?rKf(W5JH(u0@i|s`<|CyOg-0(~7SDeB!!N1c@wcxTx$|T1{LYD^d#Ad5 zi=md*Wpw3D&(|`%Mi5;@SM`cy)U%7sb5<#&?0`S6_byv|X>|SducXtLBJuOXePI6h zp4#l#Diq;w>|yIU(nvKg3UBg0C`CKVYua14(r*V|OXKV$@$(Q=VfPJb0Y1NVYW956 z$v}qvmY40i(`Jhz=ri<=&Nhz59i)DC&7^1+$*%@Ui**2(ttrGqLWb)#jzDUF^cv)w zg#v6@HF&IQAt5E>;m$yY;%_#wAs(2^rKyO#E_58SZ7GAw z@(H$O^JYRoVRU4K+Sr|Hh$rdL@xye*v#ubEU9;my_OWYcQ<_1so1>D?yyBU3@11wi z%-kGXS?!c5ltpC~k}RuMuB5rt1iK%$H0xO8=Z_DMQfE^OO`>Mg)B8e-gTX)pO?>cH zxb`4gZ81m{p{pixE{5=501H@Xu)ttpWthm9nof}9{GLH3@$neTQnK2pjDY)GVx9`w z=*Y=J)DhMwh#47A8FQH})W~bEqpOt~+8cbnpwVmkvRB>w{43}MH(je=ec4*=zVChAJ-GK# zXZXNTXMQ^4R4mJxof~zVVgV`#dvkNvc*3{*sypfQx{Rkj3;y$x^Ea$3PK~VtFRbY` zww4=7<~rFSwa z>ETFRa-tCR!clMV=?n`DVQ&fI$|i8hQ@xQ}h#Gf@iQ#H zu*mF?WMD&s{qXRN7k1 zbx^#qg)O#5iZMvXlP$D*MVGd!r&*8qih9^h>D7f1-O8r5eftm4_`ds{`N#90e(duf z_~QpY{Oei`+)6cO24wUg#|=*FNt}|Miu} z=znK@$vA6^xgC*8aaFkAn?hdL0%bwJdv~=|bmF0~-pUJQ?}5X#a>amj&W4d@xm60A zVO40WnUY7Q`kUEa0We3qB>ziwA4Z!roi`b>-$l-*qRM}2R$21Gd~AIf8qx-!7-7*P z2S;h+%1(ZKK_Xz-tOaDXqZ2nuTA~4JZEvRD-hLWBF-BXrZI^tm@#9BCtzh`r5h-Ot z0c`)eRrH$nHu}~*cT#^x7j-OKN9pMaTDSQeiZn2%$Gp)Nj#kdhO;byI3*C47Ug5Nm z;8|l(XyfNJHY8|jet|mLJLv=y{sRMjG&eUd8y#Gj%>ab}1NbUfY53bLKfbA{kviFW zSgK{rm5QSOfAYv-8XR0si*u9A+prbPu4Oq@mA{p$Sq_lIkzpI?REGu6CYpj^eVbw=g%$fY~h3&pUr`8(n$LHEc2Y*p15T{2GoY>m{HIAx7|D zJ|84?LQ>s;1ILxFOtu_Ik_sbAxYD;yCB5qI>1gPo`NF}M`SZq?#zrUUg*We{JX_zG zE8J(t22fkl0SNaq1S=G!X~;D+p(DrqW0I{}(`&!S)+ji;61&mtHaD`HaZ`GJ;ig=^ zuzUMJg1-DGud4C-KBiU8d*<@#@8#yo4?gB=oBre{Kl#52PzVrRd(NtNj2t-pSD3Oj zN#>0CunTiw0&aLXh}L^q3a#A!$#;L@+h3q30lYBIS^z^Q8Pa3CQ@jj%S^f`YndlK*z(@Q9RAMc6V*GAWNJX)qjN z>lRVe3PnOOc6Fyk$34*zQMHH3D5cqbmb49|P_WyGL|8u)RZWdeat$~Lpf!f(x|wvI zdAd9USsP_jixh4#WL^uo9J^_z6rw^#M@q*yXkv&WuO|1@_S9?dH*)NKNgE50iE81VeTnBrB7d0#q{S>I!uQ$j-}K1){`)(x@t*f9!RsGh|N7`ydc=3(rGs6?MSp8!T<;0G(U9va zqnu!+W>wlau+w_B0vK2chZ=^f! z_%6GyvoyfmOW(jU`tG;xrsv(%O_PfYl7Wwf3AIjC1|Vk%9}S=gYbDMg66bFg_&R49 zJbSiuO4PrDf|SWjFi*LRrl;~0W~;HluI}K#N}5kigP3252bR2kr)5bN2fJSrTD(*)z2IH)>pszg(UM`O@3W#ZfhoufeY>FAZ4!eVN^-B z&HcsKZr|4U`kR-n3N^N-5<#YKwXSM0w$U&ut;`j)SOxz;G+qgpt&q>DW&@i-D|nCU z)Z8B84Hy>rZw{wRIhpN7sljYHJ1wv%PkI@hr9&9s3z1;{IJzw9y!9*Xc=8uaYvK9ARIfP!r%{p7wM zP_1aunhobNPgSIW!BtGumuUT^m$U14lpbc#Te)T}Z^Q^&R9$rZ=opP28KG`=2?4m% z(^C`*G*C}hFC9OAkRE#ILAq+^X8QgechL3=&!;2<%k=cTs8Jwg0v(kRL2PIYNnY6; z2L})}jPbnY84wp1)6$?rxnY_lk0N;&pTYDc1@s^X1kgZf5$`Ihl>pYJB$bBQ!U}~V z(t&9y1q0e@j;(4wm$*ytXUrqX&-?f9r7at`N)^CKzJIG%t)pBz%`~K~Lo*)16Kp&5 z6i^3_A3DUId`S4=^@Rjb{lr_xmK@$%sz({p)+|M?SlI zv|{`Ae&BEalBRux})qZf)u#4O2;QN+J;Ra{YhFa%7H#Cd=T@WJ*3l{~S!NF+&v%a_r} zk&{&AFnO6tex1YTncO6``?~17OD>~{@maP$0`&NvhiG_goFk7{Gar?r<*U~-|8{`E zshfsR4%7I3_p>$CK`G|GB8w5>obq1cE97|0P>?pR+eDxG^k?YSSH2iBCp5RnAcCxU zwg8dQ4)B5-T;ywwg#A*4ypS$XnWLLfoq$DI=BS!p^+^O#5=K$N6$Wu{%fWzwgwh&+ zK7b<3kr48iypkcbXM@X%bPTwukPOnCngClCG@kz)tNQbRoW1ap8}Th0}| ztXv^0^^yl4^EvDWGDYNwN=}eYdN-N18jYuY|JeerLRFclXbdU`t)gYa{V)2`Vae-p8wIe z+?WhE1)36JbG505&vk0%^#>>CJ0ni5p*8Fp%);{P@WIKSIl<9moSaN%aKIqSTqY<3 z1~Dxl>pKz&!A50J9^#6$6Rlx0fLi32XYP^$wo$HxXH_wA?l27?mp+BP<|3SZ|| z9WnrvhT&{`_I1?0tUs7rNNX;ei?&tO4E8z-yjJF^z!U-lZb&+X)oPl-FP*9c1Nu>h zshKi4`)w(km&GOhOMv;-au8!>)E_%6QyTnsC94!levD1#ly7c(ft%> zD+juX^Ye=$wOhzKbnzvZQ1`KMCf?gWe}mo3GDZD5J^b*)v~Al4249OB!pIe?NZlp62BC<(R4NFtI9?+V zHiXzUWTHK0in<2KexR}d9)C`7R){3R9j;mYdj=QOK8jScrK~VN17m{SB{-UCb~zmb zC07kX&d)OtBXZo$(bbbDPSQNmLAp>>pBByjTsq4jSf-(&ezqWw35N+=!gATyLGBkL zmE;^F$ICE19eMYZC8sS(Ah}A^a7o@9(NL2kk_(yq6rJAT)`|5-gW!KhYQNJ1FX<>d-3-O|>up3y+>PiExm=h}$ z5!px}0&|%yBpm)hv0@X+Ci<%{e#VJ}`5556)Y0CGq!4M6qoL}`sW_KB`*JrLsnGP% zhaAf_bUvq?GUM8OMJp`&qTgQ`uD$wb{M9Os+SAvX~ThH&*!l&p(dgh8r*w_ko%mXnguK^-5`1V8|*<3x3hfvbr8 zrHX9iniOhd1pwF}#{&flSS!+dTM4wQ8a)2~$jB`9wy;~)7Nrs1v_osx)A7gl(6u+- zL|^~b_ZigIlU^&!X8++2?-Wa`rLloVMoXkI*E2CQN6S|Z(M=2huzDuOk29B4;t)K8 zg~8m@LPoj|!NNPr(ZS~Sc4}qI=Jp@lLFa7WN{>DKAa$@sY6|GEr4@~cj18)4-9p3U3CE zn(?8*?gWDuO0dwN1k60inD*UUV0Ja@W0oyDSlY_kVx*)^?6&H|w_B$QEX@ zQYm$2ie7u3M%S#K}2cVLFCe9G_&%9uW+`<_ktO00fkb@s~iz5jgfT+P-G7p?rKIO04% zb*y-3zGd0s?%lh8W$xNp31E_)Rr6F&*->wZhN+29H&|KYBcsxZNB2%?zu)vEZb^EbF&0GBIO6G7=!2p1pZ3i8TC#nS__0|yQe zWW8r*)wQ7LeC4V&lG;*}G96d;o+J%>T%%M?FuLL(ktA1FxO|n247bsXG|N}E{NnJV zPTz3*TcaNuIWf!kv&sk42Fgz#>VUm|DZ~jCDE%^}mp$I8& z4Wft50y5xC)f#d{)x?sdQWr%Crf3%M=YC#GF)0zr}wEiETy`vThX@0lrI!(<{9ol+G+pd*z?uA!w zr@m$FT4^!Q=Xp)@nNdx-=tT-9!@?Wa*aB>_c{j$ihMJRUa4O{?)6uREGf;PTSk&pC zc5eUMch31j+HneMcV%<6A5Uj1M<%QLPwd`(m!uAyoqZu8e=okhpHF+D%eStUG9R56 zyAL|!hzOceN9IKz*+=Kcn$kTRr6`(|nWzEl%#cJ3%M+i2rG?Ff6W#Xoyug1Ubpzay zJj+$pc}tN?A(9cDL+XX*9XhH8oQ_RosIj4if_xG;8%=D5t)j`PDJq{V(aH^L$S7n8 z^w0FjFg5q~vo+F8S&rBx+(BB;mL(%79p(*AwS=fsppY7}Iq}A3DqDQ5-~kzoW9){d z(<$oi>Z3#V9g-Gks|Go$H$6vSwFXwouL#5f=~tQXB=w=Z94sV$jPn z-vukGi{0vJ=7o@NwrbT%nwuPBcP2@-pik;H@wa9D{TykXXE3i(q*3LExwcoh?d5f$ zFQfu1O(MgR3x+~`P4}D`RU;`ttOuw`E1i~N?xj&Em7d*{Oz`Jx<271lDj-F{Xo&B7 zge{^7&9RFdj>L5*U# z4Nn(y`wggY&!)#Sp=h;*4x~qT=`I1nuNi-V|9oNBE@OYAvw6>v*$11#eDLxtw#Ji= z%k+X#eEwTDc8gQGK9y8ObJa6u2;_d`0Dd8v-320r1I)5MsP zq=x4iV(zGrfd!SKGK1_6=C@D;9cBw9#%@V7Tb76x&Tw$xy6di@sks>{ETpKfyBls6 zJ@~+nsJ**igclvQhPLqY@4fF{>h0;KGP{`IL$s>P93cZ(!jK3Za=LQ4j98p;cFp4K zMr4@}E6z+Xm({@6H%z5`o_u_Lh^Ce+ixgzAnq@8zwULNqBAukj0K#in)Ggpj0<1zo zQzU#4iA97n$zgv)Kw%-GhXBf~EWWPJPUy2`XzvNOSlHEtg*V9oj5SxTmBzlhQ{l~^ zBv_H7Ck5dsdgRUGAlbESd(t{ju*8-Mx?NRb;b&0Z>)NNIlt{)iFIwG^o12Nn63w)J z`5H%=7{u8lfpC=qpwnYuL7&k-2<+#MFF~i>1X;e(<~&NoS`I zwHMy@(Z4(`jYpQobHDgS`?;5$^LF?mR?T)2Q6Ea~cx}15+0p;_f}_3Y$bpk)HPP}4 z&F3!XsQOw{H`)WnVj#lqOqeZoORRHSybQy~?!GIk#SWB9;N>u|>A@fZIf{-D<<vGu!##vMw4^AC#SayU zrCK_G8vw~&YQO;t15H_R+5@<}e^P-DtgTU?yqCR#zWV8Zp?7`w&**Dk{xYGNNPur}YGIxtG1ZvVVXJ0gWQ6A18|l%9 zACa7#md+mP?vKzTkM5)EuD+hW^_BmkbIw1Pd<+CXxb2&4b@kHr^Dm+Q_qk8;iQh_+xN7e8L2Op$2ciLzwc!y1CPVi58<48YmUyts_e z3qu(b?g!j*>FLSPpJL182wQu|pMw%cnjfD)tz|HY6o-r;6ytBKnNwPSCMzN&oYYNRcK5TU~ zburIg7m|<%2Eu*$>LJBhNq87hMq5J2KGBV0qL~Rz!!^Y!0LK9LLPKK&-Cp9_McILE zUv@i{c9iQ8!Lq?2TP@Pimbj<@I{Ykp{5bX5D?x1@Bo>9Y(5gz}_*8MFvhpCC)79Qd zU;FCU>E*Y+mcIAB+obz;XLpZC1~+x~GVm!*CzD&G!OiE88E&A z;~?kf*rjC4Q@5oVO0tpv#`B9_m*@qF1>DF%2^=2iJBeD%V#$$%1gA6Hb5uAqvE}S% z7G`pMRNQqd?9kplKjGKU(UuMCWsY$esWcVU;1-r0EM(k1(3q-x$o1~A=DC~7<-|SD zq_#T(*s&uLXaO%~GZ77IE6v1x zp8qvBa@36<3*Pd`v6FPc`AF(rl*ClsD;-kv&tS$@gHKAsn8frJ*8*1YpZhyow?~^=$}^edm)4#0s@q73oSZShwKTG+MI#)JIhAx;k0Bwr zr5{IzrdMi4sb-)hidefb-S9_hR-=y!avhK9OdDt`xuu z#37Uy{C?GDKA=J49xd*5@6>jsfEzV*OAA~TY?J(Kntl-|LWD(Rb8IE{ELALMF6*jP z0R-@|EJYpE_PA45iRbARSJDu)ifYucB)@rVe46^Z8<}UwF}XcQF$M`(l5O1s(l`Xk znUC?tUN}BNS+`1s`2||OawVN)z6c$R+-(dP{9Y3$#;AXwk6qHBsuti43#pl=1Y4So zNt$9y3>~47$qu({)8@@gl21~M!D4h`n4^_p>SsWM!bSvH^=xf98bHcq*HJY(aVsU- ze(q&--;eH<`pkzPd6?%WB>8TW<6{(WX7I~ZX(40NLRzP}g_>BVTh=y7nn{}ZuOwSt z0q~NGPaoOp=0~O&BQgU8ut0z zP}Q}A*>Z{L4kHk9E9}6Ond&I=ezD+*lF1PWrgB0Z;j)B+(~d3ts)6bQk+q6Q%1n1# z3mxP2(%%wxb-Sval>pYvYc}djFiGsA#WJ*~VubaQh=qjn2!^84ZXSu1u)0udW|}Hf z8)Zb&sMb|dJgStEtuWUS!e8X1;eL2Z6aXmE|8nT3+WTm7>#C+0nkPxEOX@^T)!d

dk%$+X*_Cyy``2#~cPRWA?GzK2c@76O2+H4-N&};h z;x3)js!iD8qfjBFqeE+9T1T`<(9X< zSNfV+f#;a-wHj~!kZrbT67FHV}aS#_7=o84?aAK14 zh-8aRU+hod<4B2?Yd98JU}A=8*5zO|I9`;k_L4VqwN}Y9 zH<>U$OatKk?OEfPf+*rKGt$7kCaqMofpunFeo1C-*=-|6scw6VL(;2jYZNhj_L--( z)auC5BgbU#q5X3ISHC2oX21=_z{+~zuV^6p`XApf(dM!|cj5(^nw}P<9hG`jyLqXM zPVAC~W?IPp&YwRc)x{-i{j znN>KUkrN+;c?Ukvbqt#4Ldpbkdwdok^n!E?Eir)jpvoW!gE$zxb8KY$LaBAZZejm31YWRdn4g{#&3X%ziZtt3x6yGCUhJ`@`RrJA4d6Axr@L^YBU&%?7_n7LWgi91GHGsCtuajHn@Bv^JLT`&86yrubJBb-BNn^yl4L62ANWKPIDl_saCxgsf|J zQ=gjRd>|ApDkTlt8e~>h=H#YZZ_g z;JDe+Z3;Fe*X>F)o9$>|8K0;U4+RE^mGOqrbrq1<1ssi1gCK^_8W|e`bB&`yH92$U zw2Wz2lEE}c|BLLeWO-2lyYL6)P@U+&k@TA%^S^S-8T*PlVfuBg5q?L z_tEA+zqc+6EAwp`u5G)%X8`-y2R?9PcXOlM%Z+k?vcZ*e2+kK5ea*3pI{gT7r?gVW z%CU4yVn?>3%Xk_}{;qtN7Ukgecu zj%=}4_z&hLJ7Z#h7RYQxl*CE9M)Alz4+>m~0z3ZPlh11TZ2Ig}v!UXIVSX(6fVZ*p zm6$YiT%mCYF3`f>E%b8JN=d`@kc||mqTyGj@U*_xb)$nApoB+7Dn zN9y-=-QFk_N_s=OsHNB+B%&d;gfS(k{sO}-I=-ooK<4gV71PiIS)X>TTYw|_ihs?> z{PG29R7PcCZnY!BwQbk;3}9oU^&^0ZOJQohiqP*;fE1Yxx`_Zx(Za_yhL%5+P%X%q z(Jd}!WM(-zU?mSmy#ZZe+Iix_I4Ri-?hHF~)Nvxf_GbbpZ*asdH z8?7RWtzkgE85;pcWhnS=p=N9W4L7nuw-w*>!Yr9JTbOO}7IXnrI$*}Z#`H?5{-NzKj%Clh859M&?jttIL{S%EW= zmZaU*8U+-CzGmmTG5`Hf|FC3Qg3qt@6?C7G8*X?NeI8?Xv4RE|GU{@pMpGA?mIzoP zvV#bsGGtN_wjK+ZNV-O>rW<$@+aPV3hc@xD&pj#FNCAT0eyZVD| zW2X&5ETn7 zxqTzR5vVRc0N+p+VH8r+ z=QJj!CDX@GOzzU-v7t98;Ee#%waYj)POK07va{#r^yW9^wt3b}iK;a@bo2(f>hM)^ zMw4jO-co4g@_k7~0y!EE77= z62EL_FgRB-y%};|SDPf_jUBs*=@qkli;)#}V6{Rng$6Ts~J0BYUMgnN1!fem*G!x=KKX-;=cy!t3MG>=6 zK`af!JbLt`B~EUWRMiuJ0GX{I(^*XaBc<{jJab^WS;h>RNZI zRI9&zbb8n4dwJSK2}TF%sKl}hCm$SVXtXhCskwA?W?2DEHc;m1_Xut%4ZGga%pIH# z!I(!@1?mMmi7`8h?C@2rB+O|cra*b8>u%u2Rxi4i77T4WEJH(y1}>Pe1f}j*R-Dke z^R+VKH*B$sIUgNAaZ1GPb_21}7O^kPLNAvMw*g=dRydh%2%vqZc_cBn$pjp8lMnI( z+x2-%b4v;a`+#f$K@gJC3|>CajeP(B9g)}?lY18-izM!!lOKhP88-=V=#Vi()DY}- z9FW!34Ngw$tND759G;HFKRj1l=>*#$*Z!o z-lU#er29OsP{P>6h+JG;mEHRe$m!=_(8uY|XU^(-?bdR0uVPA@tZc`ppo|eQz+#?p zuLd26H{$cg&kz>GO>ksvgc|w)_0c_KX069x-;y*P@ajTimC!a0#MilVr)6Br)wb?u zMS~|~qiJiW`@Y(QOcU(z$b{MHo{O%QA=w0gKY$1{s}OiUnLGj3uLv;P=X~yx1pZ!Hy)yKA1F3EFG-zPJ>56JTR zid=icYl#ib9-KAFXAKH4%blK?k*aoa&YU}^Q6Q0tXjDcv$pAru)0 zF0B+3(B}w|{ta4S82Hv?OiRF&vyZ~gav9lTezp~7fC}q1bHg$(&b~A8eKI1m8yv>W zP|hODo1EM$jcP128i*Gm)|n@(GF;nw{k3hQe&sX2HK+glmVe2ezx_}CtBaSKKih6~ zKA`99_(-kGwmB}WN(8BClm`iC)R5+*iv%&jUfQ-`hjbqRd~9UdzGq2he3A3_MyarF zBHV&Xp*0GM3mvQAXBFUfKJZ#BI#0piF_gOL_ng~R;upJwdLf)UcUA*smw^vuqiKp+ zKuSrXjR~}ulLndJBc&0(U*>a)zyy127z9qVHT;Z^q2`wnG^5B!oK$9wOsAb}d=Zn; zL6CzY1Tqm6aQe8!aYiUGprpk1>ZzwOG_*Ke99Qn!tvAn+_z^xZwBU+K0=%hB{+U2e-52sNO0Hn z=5c9(O(JL~1stuyNSfb>ki}~Dh0+*nd1+NMxw1eWprwJl*;+?eQX$pN&yANWztm=j zIyXEuj9mlF4UNUz&0C#Lt{vY1`E#qA%TrH0CO2q_jq^-9r^_;2+j_lZEaN-=_W%6t zU;c;x>nDEUAAEMA6)fzjk2Zd$)$9MEVo(=XVRyd?pfu%0MJ^6phTJ=`z{`5bb}|F( zQ6^nz~ zvsRL`r_Ygo0R9=Uzm(aJi7}R93w&{sIOb$t00{@$x3IR@rKb>dKe&CN;fxx12ot;-I^T8%uqBlrRE2kY(!z*XnR}Z}C`I zCT*E3$IcXsi{p5UTBDCb7KVVou(ZekkF2|)!MY!WS-IPKL9`6)Wg0+}kflGRz4O53 zmvROu&?+{ygHD+!Em_w$Hc6_j)oWBQQP^QYhHG1|m&LgAzx%cS{i6Q!Z~aTY@aw-` zogN*zWvR9Hca~S?-<3qc_{fx&k6A;4j?MP<#mc!<%MEsr6dPezG6u=f{3Wsa2wH(r z6biZNUO)4(5g!oGw>V@u+KZtDNX}E_oc@Vz0;vwb;y^fhvB z?yMZU=6YFLIA?0On#%*V^bn7i2{e^G;_$U6}Pk!W6|7hYXkDg6x z)ybQCtPejy(0B@)X>uBL#mh^NHO^x>rfg2*MeQ-dSf{Q zN9x=#1SD#YrTu|lKw)BQIA1D0jqO1%91MJ${+BDrI=dgGcA=bMvyTQqM{X}?dSQi{ zE%wEXg|VH`;KGH80P@g756S-hyXCCdXuKq(-U?-v898Q{;(Z zb`skTAum2*}>7V=D=X(0} zuzriLe}v!N{d=F^SBax{ZMK>}u3e|sXPw>w?E*5PcB5kdCG>PPj#7D5wj8VqVa?N=g<)I0_|!GySc}i3=wWw_5Rq zSuW*nI3Jk~*yA}f#GW@7awqQ=1|qps@dEoMGRY{*C3L@`O5Gxo2SK$ z*#j zj(#@{gV$+uB!c$~H5;iC z2Bb%B_ED6K1<2lLRJC*f`~D2437U%WOifM@>;>>!E*UP>?zU+#!AybWr>UxDEEz#c zt=O1KY+{NaV1hot60+AH&^Iy{h3r$V+f+Ev!LuMITb_^#F+=PxOO1oZP?Z^J7at)+ z18sDv&-u=hcK^o8k&%Rb@EO|lCp1X?H^1~tid?VB%EE$7Xld78Z_3;Y&rvUogkC*F zBZ_fdc;XBtYml~-;BKwkjA48n!rl454#8tl-mZR@^& z_n}AVy#B&7FK}N`dhg%2S8jRz8?{8=AXI=-5z`zSn(;vktV+6!22vac@WAx>t(NY0 zR+VGNj`6d(aA8iH4;N(5zG*o)dx*yj@<9#7uf|5lQnVlj<4Jx_1TLL~A3>-_b~`#f zewW^!KHKT`s=#JDAn{fBg1mCvKVE zeZxw-b=%U)!aMR_ev4)UyGqHX)KCH@RvsqEVt^|p0qwL*(ZT8ml%lxM!9y~~qAkh- ze&1T%V0KWMm@>ga(jIK?uu#GPQ5WxHk~&saX1O_WLu#nVhHUOJAjb^Z6mYkY^4mpY zqA=VoO5BVW7pD(M`)HZ!MsBo`5`%W1_zgOoR5GP;i1|{Q>PC+x8G;coE6io0^g43n zh+K8#pqA-PdG6t-8&ZAsQPTKeyX{QmF# zNBNb%_scZa&AOX%-|_iB87Y;15>1|dfSZ;n01pID3>M|Q?1@L8SsokP)$6SS7e znyp*QN%^3bRi#>e#Kuqb0)p{IRwzPo)TlQYuC{TUm>1`BPoI#Q2De?A&>dV$JT~ zE0bf2$7v8Nxk?FCWe;9;m1cQ!vTyeu;+(H}{jGA>SN@Ys>0|4S5qaW~hvXZ7`px`r z{oViZO!xeWUrokqKUu5PSvq3wG!6T9V?O*@C`2Bb8`ggMvQR&E~wTtgc`^kIe7SCSW z7$2*}C@;06*6nu`V$s4au?roMpsby@lV?s*Rb!*MZovs7J9*$8MeA4sTQj$BQ(@)k zOBk_hSZP#@x8{l&1>l^!@dss;k;TB15`<4|te2>T=9h8Wf0Tpl& zA=1o5_X3mn#!M;ZQr9)h8mmU8DB4d+9G;w*Pz>xk0`1SAdPZJ-!)r9CX{n?o-FO|P z*TiMic}yY!)>$S-fzDGn>s;Cz9dX*6S6kHu=W) z{`A>v-u01h-G0ZXe(kLv{l%Mq;*_6343Wx)2~lrdV-B4rHD5S5#me zncZ{GKc@krF9#-e%kk$=OI2~Qrh@F3mKNmE`@W-PvDwizmrl!trM66H17$_K!<)@D zz7AGN|GuQp2{p*iC`P8Sh*)8*)}SL&qdrRP3q9oV(T0|gW=K1#0TlbOqBs@OGYrv# zUk2G9NGUZmivo`rFmvL9q)8&NHi6z0wn-K zi+}59K2GVNvkS{|+Z$f5Sx-|Y_RMGu@5q6JM`crkaJ#iG`wm~PK>dc?d+#^owm1Kf z9Dn>ND7F#%1LqE9Av(e9?)8|7(L11OiY_8JV^G}1hz_#DQSibv(p@-nUP>CMo0>W8 z(QYMb7xufrm@iMw91vLiushK?*AUp6u(Z_ZO=Jz{IPHikLFDa0JM&9<$cgft` z1$pAZZ|AEkb3rhAba%af?sP}-cjA`a)Q2)cZVO8LkXm7i6*f14^y5ag#AB=(cSkeh zh6dZFVrz}rbX z%Ctf%2_$wvG)3u$;dWg7z__Z4_mmS;VD0CrV`?@;jj^q%$r*Y2>1X8+zW9f7aQB#e zl8m{a^m&W;inY z){lMcXTQ;?wtBz|(Rs!IJN+0!87SOR=|q1~uU6S*%=^8T>Dd9t!~{rNQVsrNW0ONi zqHVr*WB}8E1aUAewe-Y>r9Gr*$|ZvKRE^Lwu({E)SxF3_C$SlSn57rYJ@j|r zA_Y<3W+MaZ2nzX+A*F@j4rBz|loJOg<&*nZk;(UD-tsSGU*eJ*)>6VdXE}+$1!?P~ zmQao+*6mKTghc5J%&t~5EQ-?FL2RY1`%)q@KK$K><^6y2gYwpQzE2+2jOv=#-omk= z#^j_1m4;mZnww?u+(~)syWS^v-T6Cm-K%fr9OnGoi!!z6fZY47ugb{8m~1RBa$g}O zR0b(kGrW%OBRak)aj`!b;2){hnZ;nH5%aDX&K}j^1F9V6A<@Mg(|^IrhxUA}+K|z) zQI?UAz#bVNr(y>cPXZGq+%vOVgP3M``rcEZhA75Ws%W#NvFE9`z3+XE4}Sa;-@@LO z_jWq?tg_G?s)$qOTbjFkJxp&zF+utirDPtO=Yyuw^JmY>%)!0L`VPr(ZR@q8O2}eS z`lq3p69D<#cvu)Lu3^9&cj(l{U0~9RObdWCvW{4>nJ(w`D&$)s7=-~GbgWdQ4}g{~ zwfeZZN%#5#iUSAKVYe1;$wFshGmRlW2I%Jb;5mSK3r0CzhM1k{HAZKsmYL*YNE?2U zYndr|AW&2^!1X}lO|=x#?aWK&3YAdBA(Xk}CuH&BvR?cnQiXn(cM*{tC5l~rQ{@bziIX=Av%rGu`&)VwlBMv{GvO4pwygH^$=fe@f$UsT7UebYW@vpGr};>w4^K z&E^mN%7~mk(Y0T2Kwd1viqT!xn??jObccHPTKdnMFn3C&k@>}C?Vv8p_-r^dwcX}x zM+Pu)d^XgJDvOQ5A4)NErx}m_4hE{J-j#Dd`9l{X;$^+mrMl;kgWw`lyJw`ex~66LrsN#mO69=^ z?jx!6MFqn_ZbfHwQ-jCE-dUMCaQG`9`}i;X`1kry{_fBH+~mG$du%O;+an9>oxk%N zpZ|Zug#QnJ@fW+s#xjT`g6@F@Zkm3mEN{E1`6ZBrUmsxxR<4!L^fX&eayt*8LW?fz zNF$z=;o8<~rv@-)Pf_j}7e;f^l9mz~ag$ijca%Id2I=%kg#h>tqS- z#&&4=RN@Gf0`oA+?ZpgKoEy!JXdBgI*T;%{Kpb4CjQp`)uPrkZyA(9Xd?i9~#Lgq; zMl%KApLpzXIeg7QdCNQQkojkxmb6xtJ=0V2#G{YMkACo@^85e(cjO&E_M_4%O-f@- zalf@yxj1)9o_y+Q#kfwhi-*A9)u0-cfQ_w6Qf*6ByOe=qd)03L`%)8r`5Bv5D;K=ykHTGN-|_!hNSEn_kT4&YjlBY|7O)TrFSwqd$?E zT~(RaAU+AeeR{86%(;B!|N0N|6Ce4wJpI)3=#P>T@#QamK_2?<{c>qxf&8?v9HFnl z;03a6wF>O6N~{iLw~Qx&yv*y4J6@HpwAZpMFzq-Tb2LLPmkLH$%X|Gx_-S!{Z4+j= zE$wiEc)ZctG%?P_<$8|x<#27=wNpQwyrrdGIXB=QK?@wE_QobvPE!s?ha7t$&gDUh zz`7GtXpdaTkE_7;C|Q z*a86Ol}aQP1?+)!!L1vhIV{W?&{(6tW{JkG=+5D}7%O7dmzml|hyX&4mNE5-sAFhc zzcyDcNo8b0jz9CHy#E6ql1J`-Kn~1I$%FUZtEJS4jE+xGgZ}GZ{gPaJ{q^$AKm8hs zr7+|e(PIJoG8)T*%!JqkK-_Mk6Axz3q)SI&$}a{-V6@w%a9w{{7U1oH%h@ zcFpdWLx+zj2!FLKY3B9zcfUh6wS0{I7(y`@1Lxq;m2~^!a?I_hu~TYJP&s6NGPx2e zr+I5_Jq2$qawjJf&~e3~jGC~ry10ZnTP+)t4r~HR3fALV)8~b-XVV+SzH6>&$Z&1j zwIc(V28RHQ`dslXs4P^#odQ?O$8!Kyquc@Ilyj2!0^P!$g@7edi%Val4mDQJQ-&;| zguO*D?@iW+fy^z@3SUet>a^!pUP7-O%&%ymIp$L@kkJV(0|fIvA?w~UxX4vBFpr7s zr>a2$B_(h#T!fXXIi(jWuHd)DWxQZn%R6f>grV`zu%9E<5jt7F@hyKtR<+BxxN=UO zc;Eqf^^G@5V{}}uI&?&K&FquDme;d~56dIpxkv85=c^jPV-F98xgn?`E2~$l++Jpd zC76&@Xnm(CV_&Yoin2J(Sk4Cw(#3Ry9eZom%&%=gcvJT7ncskXHZV)LIAOL@Fiy5` zQ7$emjmmIs+qGlsdtzU>$o0fU)&;&0N=XbtuOYL*FmzB@v!x6`eYa@K+{Y24Eh!z! z?Oz)m3Vop4vo2y|Te8vx3x5j;%Bf+N*@Vj=`$DNnEK4l=LU0IRt%gz(!5|Ll0)>B3 zO47~fGV3`DW`(=A@y}qH23H^I@}u+ULW;=5A}ZjAa`4b$nZIyR#*(_c?r*$V7A~yA zzFL;%&uZggLz@~+`R>=hEUlJ;^T6&{c7+_-3EgNI!5`c%jyuJ+E$GhTpqKN!EmvT5 zAn1delvj?$F-JERqfQ_#AKZ6<8b41y-B`4dBfBx+NkG0XE?tz{ZhrNM4A-_@J2rr! zJnVN{3ZYy32d)XNzCm#Hf|VwJE4TCco{tvH4Ay)hdv_z>R5=1ylD4kd=Dm;HzkPB`w(Z)XC1fS& zYUHSt!U3m>oG4~Led>gPs0orMwbhZSxZ0_K_R1q@7LKSXtF=X`9YJmaA%z zl^`yxopjwyq%97;u8O}^nCC7p8l>V9azEjh?Wo2p6f;h;%M)n_QbTO+GlhTItb4*+= z8aOFM9N`gWu{1x<(1pYZPp~L2{|X;l{>B|^-|TO``5iwZH{N_3Rda>oU^|Geb_x?4250Ib?)m5zU|?gRqy#P$C!qd^BwX5ihgP}*e^VT$TrN4* zRkCg-bpDB}rF`uO-A`!OmveSAX^^V{X`)=WkV!^*PJ`J~b8|9!-K+GqG^hm$x4-ZE z7W(6;SPPpr208QR1a61F=dO)Lw{bcq*~k()j6o;^m!&ZD?G@ZXNo(Wc73o4M z_7(K=THy$3hA_E1bAtktB*!m%co-%lub-K{>V(UxQG&Y8gtoVtQ8W?qNKrYa=_RfghS=PiSP-Zq_odLXuiTcNw?R5@b_iW*Quz z#tNyI&~>X&64BxfTs3{&S}EcD9>WB>ex-_n)ka~WlM^t%T3t>&_q6=j`|scoHY~|d z4#PjdjzK_KZ1a?~pj}W8m{EGRir{4#p#?9L(Q(*kc2i1>7)$#%kVDC%0c(;+7G1RR|DQD`M9vNO2vP*1*BbREs0gBgMd$Bnww?GL>DpKG(hfPCQS z<}QxxCS?|Bq}dV!O2#raqv=Pv1a}@SCpBncuo-024Cb*8uJ^>s;1YHE^MSq@-Ia=K zH?wSv*=dmRF*qg(d1O7yyfBa1&8cr@(*z0mbR3k5avxB~h*g`q^al=Kdqpy^gYn_| z=H@1+0HTslKIndBfpO~=FJ1bxzwi|9^oQ@fGcB4hzJ|eT8?T*-fpt3CYt&4N!KTlQ z18N0*xJm2x(Cz|8gp$b&Z}r00lOAfLl)hnbF@`)Z{?KR+z)w<|a#%->*FN2%ji!+j z_zyi(3LN$~K9;zw4_K_B`&}09;-#wbsEpcSY8b$jN)Q(WRY3zOH1pAwjP&PvZA7!d zgtE`T`G~%0fPr2;#+}GSr$T9oay=|@gS_y?HIowT1B3u$E5AtNh+Q=UV11lW+>lL! z&~QD0IV=X#k=@4PWhJkzWKu7Ucg`A;I4*~PxKErm-GvYs;7{p5#5mko#`E>ty8m95jsgeIZ054m2N z4Iv{cmyI6=PFI|m^bR;}CuOV;?troO}a0; z8Ufb}3vSq{}mUhHXRk}@E%d&W$|WTSy=;ev%Z1XWgZGoWBbh6E+97;nny^-M7$ z8*+|v8{7u@X-n(NhQEn`g{H%f4+42#R7#0YArb8LTP$BumZ7X9H5M3{7;7HhikzQB zxrq|aro(*?jpGlm#)t;Ii8NQ1q&hOD;U#5B%BY2evfWXTAHgOicMX|cABa)dH8Di` zVuogTq0tvjfdqULZ6vUec-xts>#yXJ=-vNaizDEgc0W z*e_v!LL2oWaTlDm{Ig_`mLw{lFp z9PH-~%KHqU%~N_=D8{?$yB{RWG-71P!%8+o$&sbdJC){!Q_L+UQD9uIz{K|ob6a5- z%^3Ss#9%OqY`!pb6$`O0W-JEaAhL~;UG4=V#j9p5A=&=-n#Bpp*0As0#9$HRAshH?p}P}B zRD>1le#X|N40BUXWhjXXY3kTBr_jGLBa;?ZVqmUmAiT7=B!{m$EE~*Xdxfofw=$*sRMwCc}2osi|_&Z0W-JUITN=3*L%S>&> zCNg=k8M!qwY-^C+6r0H!HhiII^s)2(+0^8w5V)#QDb9vMZ2ZqW~g`6$Ug=O&I)%>v>kl|8gro^{b&J z>{H+Q&dVOa?zrQQq`BEHk^Tbg5+hc$Q`0TXKmn=TC&TrMSUVL1138`d<(xqxrMfBE z^OA4LKhus(s6L9vv|3Ge|1fz|rvAMMj3dyw1S_6O49Hx>O2vRpufT#D8UB_E{Q$J0*jHM&~^DEjybYS4B+HcvaX}0W!yUk$T+mX z-B!%-&F^{7%U(j>@t%#b_0_)ar``}SXrI9`Nc%e~X;FnFJ$FG;r`=P0o59ogT; z`9evSc|gpwE%YmQdL?+DDAjBbI`BzJVYY`z!GI>tESD|Z&4NWX2xdk3Xn`!H2K=jT zxIvOqMeuRY&K}b3&84PY#N*FBBUxv|lp@e@Kqd%PS&lQsV(^=B%rL$bJF^|-B*)IF z((3e&&`M7PU8an{36Ff7yq*Km3WWEZlI@_2*mdrt~|TvI*MAMB`f% zSM8k);`$e5xLz@9#|AKz6a{7lSSARzFs34tF&addB_tluZnr5Q*iSoVtbvPMOdB4h zXYM5&J8+ceNg13F?DEito3R+0!s0v2wy5MF#vEsm00#^vws0hZ&DQ`^a;ipHGzC(= zSekCdg`$K60hYS{`Zk~bhku_+uJ~c?!g)D=;#rv*txIclnOGNQF^i0ioyWj9T@WfX zvk~xKqpb{3%*Z#lI(48_A(!cIS-T-(aKjhy!xM`qn)33m@TY(EGy6&-d*9or@BQ4= z#Pr+t&0h1?@$o||Qj8f4*DGS}SSCIrmX=jL4P+eW@pIZPP-t@HmXSb|5aUJeEMz7g zCjN&p8px?q11zbKAX=*hCX9#+A9B;(lyiX~z7`4<=oDIjL_o-m#hwN>6iwvaZ9z2C zfk7*>w*-_5cPgT!wGCj}wzAn^#=F=S6CyMv4DPJ{eq&`#CdS5?QGyG#XYU?+jm!`` z2HwDg2btSBh8ARQ@rKMXbS(DBHG{&8p&jzB?&}Q)Znz?f zta!s4ZhzZX^xv-xKJ#JVdd00BnSsIR4;fPiU@5YTjOAUP4H)GEAUxaBrNYoCFlJ;l#SJ9z5u)6?bS3~O>GYta%Wy!4NtzHaBZInzY9%DIHE%)`Y8xg6WVDaajV`NkRqnm_-YX)fBmd7}H4I*_z_mk}_>GWR zl338n^ZBip!|(5sTVV8p2`IFbP`av3Ss7E4U4YAHp{-3f~U z?O@QcG}7r7_)i=z4_#^Bs3pi8Lu0#gM@UIvc^R6tPRuR0QnR2_FjhJEA7mZ?Lrw-% zDizebS47ZoxOT?cktJleyOC8YBh;=>Djs+|Z%N!X>S9>}a+9na_M?sBk)5 zFWK6`AbupR4z%@vS()JjO2Q&xK`EG1!``@3D4B2}b~;@$)3JCZMj=g8L9>Wr!=rLf zctURqPyi70*q|hy=rL=-Xb<%3L%8@P@KB8C@kogph!a*SB!9+nnE{NTxpy6j&qYNU zX##|qcOfnFix>bYB!j>PugP@4A~Ttv+Fz zer}vM5?MpDeuG9nl`EplK>vVqoL8!R9IhR*cBUqNqY(!EwzRt9lm*9j0;3`z`{0<2 zXJQCwn;N)gCMPs=LeR^2v4UEW7uIR6;l+#yuzpXZGf$CZ&Q3+JpoA46LL^xR0WniqLY+1KZ^* zbAAP}t_bpAHY=HPj36}qw4jja$)#d$a>F%TFWK6WC1h`7qhG1jq`9$f*#Xs0G02^= zR7_LLHaLu}7|*Oq z68&>Y0q&ZV6tAjO(Q&Nmzjf++#Yu%27|`*|Wou&RW(~|{eLJ$t39_zJHo)@Gs3@{2 zsLaOkfHD&PIT6GyJ+eaX$GWi|ygVRdp>s*@KIbP3nu%$V;gu2&cUylG*<`Pu4)L$y zdP&#L5G~A@Ecgi|;_2jr(l4o)b2pjx#iCeXiIO_vqe7sEPSO zm|Gw01UU(k> z^bAU&Q4zqLkE4p2d$@I3Oeq@6-hwtUl5PRQ+q8fU5~M`@jlG`_<|&PRpPTY)PkI$dUvxQ1o$~=*uFkqwkX09HfzSZQ1vQ zQfoXI9ZI3f>a2Ytc*r!P*gJ?BOJD?Ta?o z)Bx>rCE??lrQ`*URH!jnP^2Ir!~uOosN|$smXehUIbaN4c%3+LDo19N1P@-~lm}o{ zhG~gsjZUM;Em#O?5?v{@`fX*NUE$}xcN={KiCHMe#F=%W1%T2yqkOd+gy5KEF6pD# zR*;zfSr}%_!Vs)5@C|wimh)h_|Hv=f&1UrrU-&{K!!=wl(b|y#tRw9J7jM63OmZ;F zd$|uK2WEo0H4vQ}X|o6CHKR|U+h|FRm7RzHP_#f$p^kpMHQqBY$|#i$8}qKEy+_HI z>$!FG_>!>&Gz3=$PW-)ZSsjR>DXrUrfr=_tkzjG2)3ir5qw6D=bK%3S=AUJh2H=zX zWiioIWAg$d1J%Rkpv_63N671QJ;4xERilTh|Y>*S@Sr9g&jxL%^QGrK~N8t$8XG;QZ4 z^|H{k=tG})X7-~20mRj;m(idVI2PTAwERN{GIK3ekYZE%LYhQ#lo)f~a5U30WBhTMT?L=j|f1yOF*Lw8MvB6=$y99 zGa+^yo#ug6j8M^(L$?z@kphz2M)AE0bymjGK1ZX-{>n}B5oW+tqooIAEXC9~rv`Gv o*4o#sF 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 Q^?S`#D~HR~mhgxF0XmAm#{d8T literal 0 HcmV?d00001 diff --git a/assets/images/keys_img.png b/assets/images/keys_img.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7c835e796067aec52ddb44b0572fedfab3f2e0 GIT binary patch literal 33422 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

C%KnZcOiUVQK58cK%o64mHdAt*7ZWHL*GEdQ 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

tGy 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 C8y*V) literal 0 HcmV?d00001 diff --git a/assets/images/location_indicatorl b/assets/images/location_indicatorl new file mode 100644 index 0000000000000000000000000000000000000000..a48f948c74602b62ff8c8d2434c3814f5c9935c9 GIT binary patch literal 25321 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 literal 0 HcmV?d00001 diff --git a/assets/images/outer_city_taxi_option.png b/assets/images/outer_city_taxi_option.png new file mode 100644 index 0000000000000000000000000000000000000000..0af0c0d1744915ebbd2f5b97d561112d9878af0e GIT binary patch literal 129017 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

3d`m}%Umw&nb!=Lzx_VAY<^=`aEwjLt) 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 FV1l#Me+d8p literal 0 HcmV?d00001 diff --git a/assets/images/payme_logo.png b/assets/images/payme_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5e33868e6745309fad9625ee9c9a1247d781e7b8 GIT binary patch literal 7496 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%0Ax#@+2YbdUyL2gx9|6VI`$2W;e5R>N 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 O#{vdvD%B}iMg0#@;=9lQ literal 0 HcmV?d00001 diff --git a/assets/images/taxi_option.png b/assets/images/taxi_option.png new file mode 100644 index 0000000000000000000000000000000000000000..340f726fd468820fd067ea2482f1c6aeaed445f5 GIT binary patch literal 138583 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

xd4%n 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%0A1E)-gZolT4##pF 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 IM6N<$f__@#cK`qY literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index 8e1f5ea..d607b39 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:customer/utils/preferences.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'controllers/global_setting_controller.dart'; import 'controllers/theme_controller.dart'; @@ -13,7 +14,10 @@ import 'firebase_options.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp(name: 'default', options: DefaultFirebaseOptions.currentPlatform); + await Firebase.initializeApp( + name: 'default', + options: DefaultFirebaseOptions.currentPlatform, + ); await Preferences.initPref(); @@ -32,54 +36,79 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { Get.put(ThemeController()); return Obx( - () => GetMaterialApp( - debugShowCheckedModeBanner: false, - builder: (context, child) { - return SafeArea(bottom: true, top: false, child: EasyLoading.init()(context, child)); - }, - translations: LocalizationService(), - locale: LocalizationService.locale, - fallbackLocale: LocalizationService.locale, - themeMode: themeController.themeMode, - theme: ThemeData( - scaffoldBackgroundColor: AppThemeData.surface, - textTheme: TextTheme(bodyLarge: TextStyle(color: AppThemeData.grey900)), - appBarTheme: AppBarTheme( - backgroundColor: AppThemeData.surface, - foregroundColor: AppThemeData.grey900, - iconTheme: IconThemeData(color: AppThemeData.grey900), - ), - bottomNavigationBarTheme: BottomNavigationBarThemeData( - backgroundColor: AppThemeData.surface, - selectedItemColor: AppThemeData.primary300, - unselectedItemColor: AppThemeData.grey600, - selectedLabelStyle: TextStyle(fontFamily: AppThemeData.bold, fontSize: 12), - unselectedLabelStyle: TextStyle(fontFamily: AppThemeData.bold, fontSize: 12), - type: BottomNavigationBarType.fixed, - ), - ), - darkTheme: ThemeData( - scaffoldBackgroundColor: AppThemeData.surfaceDark, - textTheme: TextTheme(bodyLarge: TextStyle(color: AppThemeData.greyDark900)), - appBarTheme: AppBarTheme( - backgroundColor: AppThemeData.surfaceDark, - foregroundColor: AppThemeData.greyDark900, - iconTheme: IconThemeData(color: AppThemeData.greyDark900), - ), - bottomNavigationBarTheme: BottomNavigationBarThemeData( - backgroundColor: AppThemeData.grey900, - selectedItemColor: AppThemeData.primary300, - unselectedItemColor: AppThemeData.grey300, - selectedLabelStyle: TextStyle(fontFamily: AppThemeData.bold, fontSize: 12), - unselectedLabelStyle: TextStyle(fontFamily: AppThemeData.bold, fontSize: 12), - type: BottomNavigationBarType.fixed, - ), - ), - home: GetBuilder( - init: GlobalSettingController(), - builder: (context) { - return const SplashScreen(); + () => ScreenUtilInit( + designSize: Size(375, 812), + minTextAdapt: true, + splitScreenMode: true, + child: GetMaterialApp( + debugShowCheckedModeBanner: false, + builder: (context, child) { + return SafeArea( + bottom: true, + top: false, + child: EasyLoading.init()(context, child), + ); }, + translations: LocalizationService(), + locale: LocalizationService.locale, + fallbackLocale: LocalizationService.locale, + themeMode: themeController.themeMode, + theme: ThemeData( + scaffoldBackgroundColor: AppThemeData.surface, + textTheme: TextTheme( + bodyLarge: TextStyle(color: AppThemeData.grey900), + ), + appBarTheme: AppBarTheme( + backgroundColor: AppThemeData.surface, + foregroundColor: AppThemeData.grey900, + iconTheme: IconThemeData(color: AppThemeData.grey900), + ), + bottomNavigationBarTheme: BottomNavigationBarThemeData( + backgroundColor: AppThemeData.surface, + selectedItemColor: AppThemeData.primary300, + unselectedItemColor: AppThemeData.grey600, + selectedLabelStyle: TextStyle( + fontFamily: AppThemeData.bold, + fontSize: 12, + ), + unselectedLabelStyle: TextStyle( + fontFamily: AppThemeData.bold, + fontSize: 12, + ), + type: BottomNavigationBarType.fixed, + ), + ), + darkTheme: ThemeData( + scaffoldBackgroundColor: AppThemeData.surfaceDark, + textTheme: TextTheme( + bodyLarge: TextStyle(color: AppThemeData.greyDark900), + ), + appBarTheme: AppBarTheme( + backgroundColor: AppThemeData.surfaceDark, + foregroundColor: AppThemeData.greyDark900, + iconTheme: IconThemeData(color: AppThemeData.greyDark900), + ), + bottomNavigationBarTheme: BottomNavigationBarThemeData( + backgroundColor: AppThemeData.grey900, + selectedItemColor: AppThemeData.primary300, + unselectedItemColor: AppThemeData.grey300, + selectedLabelStyle: TextStyle( + fontFamily: AppThemeData.bold, + fontSize: 12, + ), + unselectedLabelStyle: TextStyle( + fontFamily: AppThemeData.bold, + fontSize: 12, + ), + type: BottomNavigationBarType.fixed, + ), + ), + home: GetBuilder( + init: GlobalSettingController(), + builder: (context) { + return const SplashScreen(); + }, + ), ), ), ); diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index b6a5aaf..03584cf 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -1,5 +1,8 @@ +import 'dart:developer'; + import 'package:customer/constant/constant.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../controllers/service_list_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -25,8 +28,8 @@ class ServiceListScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("eMart".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 22, color: themeController.isDark.value ? AppThemeData.grey50 : AppThemeData.grey900)), - Text("All Your Needs in One App!".tr, style: AppThemeData.regularTextStyle(fontSize: 14, color: themeController.isDark.value ? AppThemeData.grey100 : AppThemeData.grey700)), + Image.asset("assets/images/fondex_logo.png", + height: 32.r, width: 124.r, fit: BoxFit.contain), ], ), ), @@ -37,45 +40,140 @@ class ServiceListScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + controller.serviceListBanner.isEmpty + ? SizedBox() + : Padding( + padding: EdgeInsets.symmetric(horizontal: 16.r), + child: BannerView( + bannerList: controller.serviceListBanner, + ), + ), + // Main Cards Section + _mainCardsSection(), + + SizedBox(height: 15.h), + + // Other Services Section Title + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.r), + child: Text( + "Другие услуги", + style: TextStyle( + fontFamily: AppThemeData.bold, + fontWeight: FontWeight.w700, + fontSize: 20.sp, + color: AppThemeData.darkGrey, + ), + ), + ), + + SizedBox(height: 10.h), + + _otherServicesCardMaker( + image: "assets/images/delivery_img.png", + title: "Курьерская доставка", + subtitle: "Доставляем безопасно", + ), + _otherServicesCardMaker( + image: "assets/images/keys_img.png", + title: "Аренда", + subtitle: "Огромный выбор объявлений!", + ), + _otherServicesCardMaker( + image: "assets/images/cosmetics_img.png", + title: "Косметика", + subtitle: "Более 1000 товаров", + ), + _otherServicesCardMaker( + image: "assets/images/products_img.png", + title: "Продукты питания", + subtitle: "Более 1000 товаров", + ), + + SizedBox(height: 45.h), const SizedBox(height: 12), - controller.serviceListBanner.isEmpty ? SizedBox() : BannerView(bannerList: controller.serviceListBanner), + controller.serviceListBanner.isEmpty + ? SizedBox() + : BannerView( + bannerList: controller.serviceListBanner, + ), const SizedBox(height: 12), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Explore Our Services".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 20, color: themeController.isDark.value ? AppThemeData.grey50 : AppThemeData.grey900)), + Text( + "Explore Our Services".tr, + style: AppThemeData.semiBoldTextStyle( + fontSize: 20, + color: + themeController.isDark.value + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 12), GridView.builder( itemCount: controller.sectionList.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, mainAxisSpacing: 12, crossAxisSpacing: 12, mainAxisExtent: 130), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + mainAxisSpacing: 12, + crossAxisSpacing: 12, + mainAxisExtent: 130, + ), itemBuilder: (context, index) { final section = controller.sectionList[index]; return GestureDetector( - onTap: () => controller.onServiceTap(context, section), + onTap: + () => controller.onServiceTap( + context, + section, + ), child: Container( decoration: BoxDecoration( - gradient: LinearGradient(colors: Constant.sectionColor[index % Constant.sectionColor.length], begin: Alignment.topCenter, end: Alignment.bottomCenter), + gradient: LinearGradient( + colors: + Constant.sectionColor[index % + Constant.sectionColor.length], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), borderRadius: BorderRadius.circular(12), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Padding( - padding: const EdgeInsets.only(top: 10, left: 5, right: 5), + padding: const EdgeInsets.only( + top: 10, + left: 5, + right: 5, + ), child: Text( section.name ?? '', textAlign: TextAlign.center, maxLines: 2, overflow: TextOverflow.ellipsis, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: AppThemeData.grey900), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), ), ), const Spacer(), - NetworkImageWidget(imageUrl: section.sectionImage ?? '', width: 80, height: 60, fit: BoxFit.contain), + NetworkImageWidget( + imageUrl: + section.sectionImage ?? '', + width: 80, + height: 60, + fit: BoxFit.contain, + ), ], ), ), @@ -92,6 +190,238 @@ class ServiceListScreen extends StatelessWidget { }, ); } + + Widget _otherServicesCardMaker({ + required String image, + required String title, + required String subtitle, + }) { + return InkWell( + onTap: () { + log("Other Service Card Tapped: $title"); + }, + child: Container( + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 16.r).copyWith(bottom: 10.r), + padding: EdgeInsets.only(left: 6.r, right: 12.r, top: 6.r, bottom: 6.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.r), + color: AppThemeData.grey50, + ), + child: Row( + spacing: 15.r, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + spacing: 10.r, + children: [ + Container( + height: 52.r, + width: 52.r, + decoration: BoxDecoration( + color: AppThemeData.cardColor, + borderRadius: BorderRadius.circular(14.r), + ), + child: Image.asset( + image, + height: 62.r, + width: 62.r, + fit: BoxFit.contain, + ), + ), + Expanded( + child: Column( + spacing: 2.r, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + fontSize: 16.sp, + fontWeight: FontWeight.w700, + color: AppThemeData.darkGrey, + ), + ), + Text( + subtitle, + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + fontSize: 13.sp, + fontWeight: FontWeight.w400, + color: AppThemeData.darkGrey, + ), + ), + ], + ), + ), + ], + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 18.r, + color: AppThemeData.darkGrey, + ), + ], + ), + ), + ); + } + + Widget _mainCardsSection() { + return Container( + padding: EdgeInsets.symmetric(vertical: 16.r, horizontal: 16.r), + decoration: BoxDecoration( + color: AppThemeData.grey50, + borderRadius: BorderRadius.circular(16.r), + ), + child: Row( + spacing: 12.r, + children: [ + // Food & Garderobe Cards + Column( + spacing: 12.r, + children: [ + _mainCardsMaker( + title: "Еда и доставка", + image: "assets/images/food_img.png", + // onTap: () { + // log("Main Card Tapped"); + onTap: () async {}, + // }, + ), + _mainCardsMaker( + title: "Обновить гардероб", + image: "assets/images/garderob_img.png", + onTap: () { + log("Main Card Tapped"); + }, + ), + ], + ), + // Taxi Card + InkWell( + onTap: () { + log("Taxi Card Tapped"); + // push(context, DashBoardCabService(user: null)); + }, + child: Container( + height: 192.h, + width: 166.w, + padding: EdgeInsets.only(top: 12.r, right: 12.r), + decoration: BoxDecoration( + color: AppThemeData.yellow, + borderRadius: BorderRadius.circular(16.r), + ), + child: Column( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 12.r), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text( + maxLines: 2, + "Позвать такси", + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.bold, + fontSize: 18.sp, + fontWeight: FontWeight.w700, + color: AppThemeData.grey50, + ), + ), + ), + Container( + height: 36.r, + width: 36.r, + decoration: BoxDecoration( + color: AppThemeData.grey50.withValues(alpha: 0.3), + borderRadius: BorderRadius.circular(8.r), + ), + child: Icon( + Icons.arrow_outward_rounded, + size: 20.r, + color: AppThemeData.grey50, + ), + ), + ], + ), + ), + ), + Image.asset( + "assets/images/taxi_img.png", + height: 119.r, + width: 156.r, + fit: BoxFit.contain, + ), + ], + ), + ), + ), + ], + ), + ); + } + + Widget _mainCardsMaker({ + required String title, + required String image, + required VoidCallback onTap, + }) { + return InkWell( + onTap: onTap, + child: Container( + height: 93.h, + width: 165.w, + padding: EdgeInsets.only(left: 12.r), + decoration: BoxDecoration( + color: AppThemeData.cardColor, + borderRadius: BorderRadius.circular(16.r), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.only(bottom: 12.r, top: 12.r), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + maxLines: 2, + title, + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.bold, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + color: AppThemeData.darkGrey, + ), + ), + Icon( + Icons.arrow_outward_rounded, + size: 24.r, + color: AppThemeData.darkGrey, + ), + ], + ), + ), + ), + Image.asset(image, height: 71.r, width: 71.r, fit: BoxFit.contain), + ], + ), + ), + ); + } } class BannerView extends StatelessWidget { @@ -132,7 +462,13 @@ class BannerView extends StatelessWidget { itemBuilder: (context, index) { return ClipRRect( borderRadius: BorderRadius.circular(12), - child: SizedBox(width: MediaQuery.of(context).size.width * 0.8, child: NetworkImageWidget(imageUrl: bannerList[index].toString(), fit: BoxFit.fill)), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.8, + child: NetworkImageWidget( + imageUrl: bannerList[index].toString(), + fit: BoxFit.fill, + ), + ), ); }, ), @@ -142,7 +478,18 @@ class BannerView extends StatelessWidget { return Row( children: List.generate(bannerList.length, (index) { final isSelected = currentPage.value == index; - return Expanded(child: Container(height: 4, decoration: BoxDecoration(color: isSelected ? AppThemeData.grey300 : AppThemeData.grey100, borderRadius: BorderRadius.circular(5)))); + return Expanded( + child: Container( + height: 4, + decoration: BoxDecoration( + color: + isSelected + ? AppThemeData.grey300 + : AppThemeData.grey100, + borderRadius: BorderRadius.circular(5), + ), + ), + ); }), ); }), diff --git a/lib/themes/app_them_data.dart b/lib/themes/app_them_data.dart index 47dcaa8..d9485f1 100644 --- a/lib/themes/app_them_data.dart +++ b/lib/themes/app_them_data.dart @@ -199,6 +199,12 @@ class AppThemeData { static const Color warningDark500 = Color(0xFFFFE9AB); static const Color warningDark600 = Color(0xFFFFF8E5); + static const Color yellow = Color(0xFFE5AE3E); + static const Color cardColor = Color(0xFFEEEFF2); + static const Color darkGrey = Color(0xFF1F2937); + static const Color mainColor = Color(0xFFFF6839); + static const lightGrey = Color(0xFF8E8E93); + static const Color primary50 = Color(0xFFFFEBE5); static const Color primary100 = Color(0xFFFFC0AB); static const Color primary200 = Color(0xFFFF9472); diff --git a/pubspec.lock b/pubspec.lock index 8d3bc1b..ad977d0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -678,6 +678,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.1" + flutter_screenutil: + dependency: "direct main" + description: + name: flutter_screenutil + sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" + url: "https://pub.dev" + source: hosted + version: "5.9.3" flutter_spinkit: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a196789..3e74692 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -86,6 +86,7 @@ dependencies: intl: ^0.20.2 uuid: ^4.5.2 flutter_google_places_hoc081098: ^2.0.0 + flutter_screenutil: ^5.9.3 dependency_overrides: webview_flutter: ^4.9.0 -- 2.49.1 From 5c98705bdea14ee1fd4cbad07cddf8119f0f87e2 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Fri, 28 Nov 2025 12:24:40 +0500 Subject: [PATCH 02/30] BASE: Implement Navigation In Services List Screen. --- .../service_list_screen.dart | 169 +++++++----------- 1 file changed, 60 insertions(+), 109 deletions(-) diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index 03584cf..62e1d06 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -1,6 +1,7 @@ import 'dart:developer'; import 'package:customer/constant/constant.dart'; +import 'package:customer/models/section_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -19,17 +20,23 @@ class ServiceListScreen extends StatelessWidget { init: ServiceListController(), builder: (controller) { return Scaffold( + backgroundColor: AppThemeData.cardColor, appBar: AppBar( elevation: 0, automaticallyImplyLeading: false, titleSpacing: 20, centerTitle: false, + backgroundColor: AppThemeData.cardColor, title: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset("assets/images/fondex_logo.png", - height: 32.r, width: 124.r, fit: BoxFit.contain), + Image.asset( + "assets/images/fondex_logo.png", + height: 32.r, + width: 124.r, + fit: BoxFit.contain, + ), ], ), ), @@ -40,16 +47,21 @@ class ServiceListScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - controller.serviceListBanner.isEmpty - ? SizedBox() - : Padding( - padding: EdgeInsets.symmetric(horizontal: 16.r), - child: BannerView( - bannerList: controller.serviceListBanner, - ), - ), + // controller.serviceListBanner.isEmpty + // ? SizedBox() + // : Padding( + // padding: EdgeInsets.symmetric(horizontal: 16.r), + // child: BannerView( + // bannerList: controller.serviceListBanner, + // ), + // ), + SizedBox(height: 10.h), // Main Cards Section - _mainCardsSection(), + _mainCardsSection( + context: context, + controller: controller, + sectionModel: controller.sectionList, + ), SizedBox(height: 15.h), @@ -69,9 +81,10 @@ class ServiceListScreen extends StatelessWidget { SizedBox(height: 10.h), + // Other Services Section _otherServicesCardMaker( - image: "assets/images/delivery_img.png", - title: "Курьерская доставка", + image: "assets/images/garderob_img.png", + title: "Обновить гардероб", subtitle: "Доставляем безопасно", ), _otherServicesCardMaker( @@ -91,98 +104,6 @@ class ServiceListScreen extends StatelessWidget { ), SizedBox(height: 45.h), - const SizedBox(height: 12), - controller.serviceListBanner.isEmpty - ? SizedBox() - : BannerView( - bannerList: controller.serviceListBanner, - ), - const SizedBox(height: 12), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Explore Our Services".tr, - style: AppThemeData.semiBoldTextStyle( - fontSize: 20, - color: - themeController.isDark.value - ? AppThemeData.grey50 - : AppThemeData.grey900, - ), - ), - const SizedBox(height: 12), - GridView.builder( - itemCount: controller.sectionList.length, - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - gridDelegate: - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - mainAxisSpacing: 12, - crossAxisSpacing: 12, - mainAxisExtent: 130, - ), - itemBuilder: (context, index) { - final section = controller.sectionList[index]; - return GestureDetector( - onTap: - () => controller.onServiceTap( - context, - section, - ), - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient( - colors: - Constant.sectionColor[index % - Constant.sectionColor.length], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - borderRadius: BorderRadius.circular(12), - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only( - top: 10, - left: 5, - right: 5, - ), - child: Text( - section.name ?? '', - textAlign: TextAlign.center, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: - AppThemeData.semiBoldTextStyle( - fontSize: 14, - color: AppThemeData.grey900, - ), - ), - ), - const Spacer(), - NetworkImageWidget( - imageUrl: - section.sectionImage ?? '', - width: 80, - height: 60, - fit: BoxFit.contain, - ), - ], - ), - ), - ); - }, - ), - ], - ), - ), ], ), ), @@ -272,7 +193,11 @@ class ServiceListScreen extends StatelessWidget { ); } - Widget _mainCardsSection() { + Widget _mainCardsSection({ + required BuildContext context, + required ServiceListController controller, + required RxList sectionModel, + }) { return Container( padding: EdgeInsets.symmetric(vertical: 16.r, horizontal: 16.r), decoration: BoxDecoration( @@ -291,14 +216,33 @@ class ServiceListScreen extends StatelessWidget { image: "assets/images/food_img.png", // onTap: () { // log("Main Card Tapped"); - onTap: () async {}, + onTap: () async { + SectionModel? innerSectionModel = sectionModel + .firstWhereOrNull( + (element) => + element.serviceTypeFlag == "delivery-service", + ); + + if (innerSectionModel != null) { + controller.onServiceTap(context, innerSectionModel); + } + }, // }, ), _mainCardsMaker( - title: "Обновить гардероб", - image: "assets/images/garderob_img.png", + title: "Курьерская доставка", + image: "assets/images/delivery_img.png", onTap: () { log("Main Card Tapped"); + SectionModel? innerSectionModel = sectionModel + .firstWhereOrNull( + (element) => + element.serviceTypeFlag == "parcel_delivery", + ); + + if (innerSectionModel != null) { + controller.onServiceTap(context, innerSectionModel); + } }, ), ], @@ -308,6 +252,13 @@ class ServiceListScreen extends StatelessWidget { onTap: () { log("Taxi Card Tapped"); // push(context, DashBoardCabService(user: null)); + SectionModel? innerSectionModel = sectionModel.firstWhereOrNull( + (element) => element.serviceTypeFlag == "cab-service", + ); + + if (innerSectionModel != null) { + controller.onServiceTap(context, innerSectionModel); + } }, child: Container( height: 192.h, -- 2.49.1 From 8c120b89847c2fbd41f0b56fe225d5df9b57db4d Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Fri, 28 Nov 2025 15:31:06 +0500 Subject: [PATCH 03/30] BASE: Finish Cam Home Screen UI. --- lib/controllers/cab_dashboard_controller.dart | 1 - .../cab_dashboard_screen.dart | 83 +++- .../cab_service_screens/cab_home_screen.dart | 392 ++++++++++-------- pubspec.lock | 8 + pubspec.yaml | 1 + 5 files changed, 300 insertions(+), 185 deletions(-) diff --git a/lib/controllers/cab_dashboard_controller.dart b/lib/controllers/cab_dashboard_controller.dart index 309907f..2bd4e9b 100644 --- a/lib/controllers/cab_dashboard_controller.dart +++ b/lib/controllers/cab_dashboard_controller.dart @@ -13,7 +13,6 @@ class CabDashboardController extends GetxController { @override void onInit() { - // TODO: implement onInit getTaxList(); if (Constant.walletSetting == false) { pageList.value = [CabHomeScreen(), const MyCabBookingScreen(), const ProfileScreen()]; diff --git a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart index d87addb..3f34429 100644 --- a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/controllers/cab_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -23,13 +24,19 @@ class CabDashboardScreen extends StatelessWidget { type: BottomNavigationBarType.fixed, showUnselectedLabels: true, showSelectedLabels: true, - selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedFontSize: 12.sp, + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: AppThemeData.cardColor, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(CabDashboardController()); @@ -39,15 +46,57 @@ class CabDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr, + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr, + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr, + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr, + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr, + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet_cab.svg", + label: 'Wallet'.tr, + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr, + controller: controller, + ), ], ), ); @@ -56,7 +105,13 @@ class CabDashboardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required CabDashboardController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required CabDashboardController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/cab_service_screens/cab_home_screen.dart b/lib/screen_ui/cab_service_screens/cab_home_screen.dart index fb21871..d002912 100644 --- a/lib/screen_ui/cab_service_screens/cab_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_home_screen.dart @@ -4,16 +4,15 @@ import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/models/banner_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; - import 'Intercity_home_screen.dart'; import 'cab_booking_screen.dart'; -class CabHomeScreen extends StatelessWidget { +class CabHomeScreen extends HookWidget { const CabHomeScreen({super.key}); @override @@ -26,189 +25,246 @@ class CabHomeScreen extends StatelessWidget { return Scaffold( appBar: AppBar( automaticallyImplyLeading: false, - backgroundColor: AppThemeData.primary300, - title: Padding( - padding: const EdgeInsets.only(bottom: 10), - child: Row( - children: [ - GestureDetector( - onTap: () { - Get.back(); - }, - child: Container( - height: 42, - width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center( - child: Padding( - padding: const EdgeInsets.only(left: 5), - child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20), + backgroundColor: AppThemeData.cardColor, + title: Row( + children: [ + SizedBox(width: 5.w), + InkWell( + onTap: () { + Get.back(); + }, + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Constant.userModel == null + ? InkWell( + onTap: () { + Get.offAll(const LoginScreen()); + }, + child: Text( + "Login".tr, + textAlign: TextAlign.center, + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + fontSize: 17.sp, + ), + ), + ) + : Text( + Constant.userModel!.fullName(), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + fontSize: 17.sp, + ), + ), + Text( + Constant.selectedLocation.getFullAddress(), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: AppThemeData.regularTextStyle( + fontSize: 12.sp, + color: AppThemeData.grey900, ), ), - ), + ], ), - const SizedBox(width: 10), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Constant.userModel == null - ? InkWell( - onTap: () { - Get.offAll(const LoginScreen()); - }, - child: Text( - "Login".tr, - textAlign: TextAlign.center, - style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12), - ), - ) - : Text( - Constant.userModel!.fullName(), - textAlign: TextAlign.center, - style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12), - ), - Text( - Constant.selectedLocation.getFullAddress(), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900), - ), - ], - ), - ), - ], - ), + ), + ], ), ), body: controller.isLoading.value ? Constant.loader() - : Padding( - padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - BannerView(bannerList: controller.bannerTopHome), + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + BannerView(bannerList: controller.bannerTopHome), - Column( + Padding( + padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 20), Text( - "Where are you going for?".tr, - style: AppThemeData.mediumTextStyle( - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - fontSize: 18, + "Cab Service Type", + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.darkGrey, + fontSize: 16.sp, ), ), - SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Constant.sectionConstantModel!.rideType == "both" || Constant.sectionConstantModel!.rideType == "ride" - ? GestureDetector( - onTap: () { - Get.to(() => CabBookingScreen()); - }, - child: Container( - width: Responsive.width(40, context), - decoration: BoxDecoration( - color: AppThemeData.warning50, - borderRadius: BorderRadius.circular(15), - border: Border.all(color: AppThemeData.warning200), - ), - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SvgPicture.asset("assets/icons/ic_ride.svg", height: 38, width: 38), - SizedBox(height: 20), - Text( - "Ride".tr, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.taxiBooking500, fontSize: 16), - ), - Text( - "City rides, 24x7 availability".tr, - style: AppThemeData.mediumTextStyle(color: AppThemeData.taxiBooking600, fontSize: 14), - ), - ], - ), - ), - ) - : SizedBox(), - SizedBox(width: 20), - Constant.sectionConstantModel!.rideType == "both" || Constant.sectionConstantModel!.rideType == "intercity" - ? GestureDetector( - onTap: () { - Get.to(() => IntercityHomeScreen()); - }, - child: Container( - width: Responsive.width(44, context), - decoration: BoxDecoration( - color: AppThemeData.carRent50, - borderRadius: BorderRadius.circular(15), - border: Border.all(color: AppThemeData.carRent200), - ), - padding: EdgeInsets.all(15), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SvgPicture.asset("assets/icons/ic_intercity.svg", height: 38, width: 38), - SizedBox(height: 20), - Text( - "Intercity/Outstation".tr, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.carRent500, fontSize: 16), - ), - Text( - "Long trips, prepaid options".tr, - style: AppThemeData.mediumTextStyle(color: AppThemeData.parcelService600, fontSize: 14), - ), - ], - ), - ), - ) - : SizedBox(), - ], - ), - SizedBox(height: 30), + SizedBox(height: 10.h), + // Cab Service Types Section + _buildCabServiceTypesSection(), + + SizedBox(height: 35.h), + Row( children: [ Expanded( flex: 2, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - "Every Ride. Every Driver. Verified.".tr, + "Every Ride. Every Driver. Verified." + .tr, style: AppThemeData.boldTextStyle( - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, fontSize: 22, ), ), Text( - "All drivers go through ID checks and background verification for your safety.".tr, + "All drivers go through ID checks and background verification for your safety." + .tr, style: AppThemeData.mediumTextStyle( - color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, + color: + isDark + ? AppThemeData.greyDark700 + : AppThemeData.grey700, fontSize: 14, ), ), ], ), ), - Expanded(child: Image.asset("assets/images/img_ride_driver.png", height: 118, width: 68)), + Expanded( + child: Image.asset( + "assets/images/img_ride_driver.png", + height: 118, + width: 68, + ), + ), ], ), ], ), - ], - ), + ), + ], ), ); }, ); } + + Row _buildCabServiceTypesSection() { + return Row( + spacing: 10.w, + children: [ + Constant.sectionConstantModel!.rideType == "both" || + Constant.sectionConstantModel!.rideType == "ride" + ? _cabOptionMaker( + title: "По городу", + isMain: false, + image: "assets/images/taxi_option.png", + useGradient: false, + onTap: () { + Get.to(() => CabBookingScreen()); + }, + mainColor: AppThemeData.cardColor, + ) + : Expanded(child: SizedBox()), + _cabOptionMaker( + title: "Межгород", + isMain: false, + useGradient: false, + image: "assets/images/outer_city_taxi_option.png", + onTap: () { + Get.to(() => IntercityHomeScreen()); + }, + mainColor: AppThemeData.cardColor, + ), + ], + ); + } + + Expanded _cabOptionMaker({ + required String title, + required String image, + required VoidCallback onTap, + required Color mainColor, + required useGradient, + required bool isMain, + }) { + return Expanded( + child: InkWell( + onTap: onTap, + child: Container( + height: 100.h, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + color: mainColor, + borderRadius: BorderRadius.circular(16.r), + gradient: + useGradient + ? LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [Color(0xFF2E2E37), Color(0xFF6A6A9E)], + ) + : null, + ), + child: Stack( + children: [ + Padding( + padding: EdgeInsets.only(left: 12.r, top: 12.r), + child: Row( + children: [ + Expanded( + child: Text( + maxLines: 2, + title, + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + fontSize: 14.sp, + fontWeight: FontWeight.w700, + color: + isMain + ? AppThemeData.grey50 + : AppThemeData.darkGrey, + ), + ), + ), + Expanded(child: SizedBox()), + ], + ), + ), + Transform.translate( + offset: Offset(25.w, 0), + child: Align( + alignment: Alignment.bottomRight, + child: Image.asset( + image, + height: 133.h, + width: 133.w, + fit: BoxFit.contain, + ), + ), + ), + ], + ), + ), + ), + ); + } } class BannerView extends StatelessWidget { @@ -242,43 +298,39 @@ class BannerView extends StatelessWidget { ? SizedBox() : Column( children: [ - SizedBox(height: 20), + SizedBox(height: 20.h), SizedBox( - height: 150, - child: ListView.separated( + height: 150.h, + child: ListView.builder( controller: scrollController, scrollDirection: Axis.horizontal, itemCount: bannerList.length, - separatorBuilder: (context, index) => const SizedBox(width: 15), + itemBuilder: (context, index) { final banner = bannerList[index]; - return ClipRRect( - borderRadius: BorderRadius.circular(15), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.8, - child: NetworkImageWidget(imageUrl: banner.photo ?? '', fit: BoxFit.cover), + return Container( + width: MediaQuery.of(context).size.width * 0.8, + margin: + index == 0 + ? EdgeInsets.only(left: 16.r, right: 10.r) + : index == bannerList.length - 1 + ? EdgeInsets.only(right: 16.r) + : EdgeInsets.only(right: 10.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + ), + + child: ClipRRect( + borderRadius: BorderRadius.circular(15), + child: NetworkImageWidget( + imageUrl: banner.photo ?? '', + fit: BoxFit.cover, + ), ), ); }, ), ), - const SizedBox(height: 8), - Obx(() { - return Row( - children: List.generate(bannerList.length, (index) { - bool isSelected = currentPage.value == index; - return Expanded( - child: Container( - height: 4, - decoration: BoxDecoration( - color: isSelected ? AppThemeData.grey300 : AppThemeData.grey100, - borderRadius: BorderRadius.circular(5), - ), - ), - ); - }), - ); - }), ], ); } diff --git a/pubspec.lock b/pubspec.lock index ad977d0..e5c9143 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -558,6 +558,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + flutter_hooks: + dependency: "direct main" + description: + name: flutter_hooks + sha256: "8ae1f090e5f4ef5cfa6670ce1ab5dddadd33f3533a7f9ba19d9f958aa2a89f42" + url: "https://pub.dev" + source: hosted + version: "0.21.3+1" flutter_html: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 3e74692..2365c9a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -87,6 +87,7 @@ dependencies: uuid: ^4.5.2 flutter_google_places_hoc081098: ^2.0.0 flutter_screenutil: ^5.9.3 + flutter_hooks: ^0.21.3+1 dependency_overrides: webview_flutter: ^4.9.0 -- 2.49.1 From 50aae9ce1a1043a48e50af1aee1be135147e48e1 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Fri, 28 Nov 2025 15:50:02 +0500 Subject: [PATCH 04/30] BASE: Finish Location Choosing Screen UI. --- .../cab_booking_screen.dart | 2300 ++++++++++++++--- 1 file changed, 1915 insertions(+), 385 deletions(-) diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index dfb6c7c..7df5709 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -56,22 +56,57 @@ class CabBookingScreen extends StatelessWidget { options: flutterMap.MapOptions( initialCenter: Constant.currentLocation != null - ? latlong.LatLng(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude) + ? latlong.LatLng( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ) : controller.currentOrder.value.id != null ? latlong.LatLng( - double.parse(controller.currentOrder.value.sourceLocation!.latitude.toString()), - double.parse(controller.currentOrder.value.sourceLocation!.longitude.toString()), + double.parse( + controller + .currentOrder + .value + .sourceLocation! + .latitude + .toString(), + ), + double.parse( + controller + .currentOrder + .value + .sourceLocation! + .longitude + .toString(), + ), ) - : latlong.LatLng(41.4219057, -102.0840772), - initialZoom: 10, + : latlong.LatLng( + 41.4219057, + -102.0840772, + ), + initialZoom: 14, ), children: [ flutterMap.TileLayer( - urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - userAgentPackageName: Platform.isAndroid ? "com.emart.customer" : "com.emart.customer.ios", + urlTemplate: + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: + Platform.isAndroid + ? "com.emart.customer" + : "com.emart.customer.ios", ), - flutterMap.MarkerLayer(markers: controller.osmMarker), - if (controller.routePoints.isNotEmpty) flutterMap.PolylineLayer(polylines: [flutterMap.Polyline(points: controller.routePoints, strokeWidth: 5.0, color: Colors.blue)]), + flutterMap.MarkerLayer( + markers: controller.osmMarker, + ), + if (controller.routePoints.isNotEmpty) + flutterMap.PolylineLayer( + polylines: [ + flutterMap.Polyline( + points: controller.routePoints, + strokeWidth: 5.0, + color: Colors.blue, + ), + ], + ), ], ) : GoogleMap( @@ -79,16 +114,26 @@ class CabBookingScreen extends StatelessWidget { controller.mapController = googleMapController; if (Constant.currentLocation != null) { - controller.setDepartureMarker(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude); + controller.setDepartureMarker( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ); controller.searchPlaceNameGoogle(); } }, - initialCameraPosition: CameraPosition(target: controller.currentPosition.value, zoom: 14), + initialCameraPosition: CameraPosition( + target: controller.currentPosition.value, + zoom: 14, + ), myLocationEnabled: true, zoomControlsEnabled: true, zoomGesturesEnabled: true, - polylines: Set.of(controller.polyLines.values), - markers: controller.markers.toSet(), // reactive marker set + polylines: Set.of( + controller.polyLines.values, + ), + markers: + controller.markers + .toSet(), // reactive marker set ), Positioned( @@ -97,36 +142,64 @@ class CabBookingScreen extends StatelessWidget { right: Constant.isRtl ? 20 : null, child: InkWell( onTap: () { - if (controller.bottomSheetType.value == "vehicleSelection") { + if (controller.bottomSheetType.value == + "vehicleSelection") { controller.bottomSheetType.value = "location"; - } else if (controller.bottomSheetType.value == "payment") { - controller.bottomSheetType.value = "vehicleSelection"; - } else if (controller.bottomSheetType.value == "conformRide") { + } else if (controller.bottomSheetType.value == + "payment") { + controller.bottomSheetType.value = + "vehicleSelection"; + } else if (controller.bottomSheetType.value == + "conformRide") { controller.bottomSheetType.value = "payment"; - } else if (controller.bottomSheetType.value == "waitingDriver" || controller.bottomSheetType.value == "driverDetails") { + } else if (controller.bottomSheetType.value == + "waitingDriver" || + controller.bottomSheetType.value == + "driverDetails") { Get.back(result: true); } else { Get.back(); } }, child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + borderRadius: BorderRadius.circular(30), + ), child: Padding( padding: const EdgeInsets.all(10), - child: Center(child: Icon(Icons.arrow_back_ios_new, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50, size: 20)), + child: Center( + child: Icon( + Icons.arrow_back_ios_new, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.greyDark50, + size: 20, + ), + ), ), ), ), ), controller.bottomSheetType.value == "location" - ? searchLocationBottomSheet(context, controller, isDark) - : controller.bottomSheetType.value == "vehicleSelection" + ? searchLocationBottomSheet( + context, + controller, + isDark, + ) + : controller.bottomSheetType.value == + "vehicleSelection" ? vehicleSelection(context, controller, isDark) : controller.bottomSheetType.value == "payment" ? paymentBottomSheet(context, controller, isDark) : controller.bottomSheetType.value == "conformRide" ? conformBottomSheet(context, isDark) - : controller.bottomSheetType.value == "waitingForDriver" + : controller.bottomSheetType.value == + "waitingForDriver" ? waitingDialog(context, controller, isDark) : controller.bottomSheetType.value == "driverDetails" ? driverDialog(context, controller, isDark) @@ -138,7 +211,11 @@ class CabBookingScreen extends StatelessWidget { ); } - Widget searchLocationBottomSheet(BuildContext context, CabBookingController controller, bool isDark) { + Widget searchLocationBottomSheet( + BuildContext context, + CabBookingController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.30, @@ -151,16 +228,29 @@ class CabBookingScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.all(16), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(35))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(35)), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), SizedBox(height: 10), Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -168,40 +258,87 @@ class CabBookingScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.sourceTextEditController.value.text = ''; + controller + .sourceTextEditController + .value + .text = ''; final firstPlace = result; - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.sourceTextEditController.value.text = address.toString(); + controller + .sourceTextEditController + .value + .text = address.toString(); controller.setDepartureMarker(lat, lng); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr, + ); } } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDepartureMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + if (Constant.checkZoneCheck( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ) == + true) { + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.setDepartureMarker( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr, + ); } } }); } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller.sourceTextEditController.value, + // backgroundColor: AppThemeData.cardColor, hintText: "Pickup Location".tr, enable: false, - prefix: Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Image.asset("assets/icons/pickup.png", height: 22, width: 22)), + prefix: Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Image.asset( + "assets/icons/pickup.png", + height: 22, + width: 22, + ), + ), ), ), const SizedBox(height: 10), @@ -209,34 +346,63 @@ class CabBookingScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.destinationTextEditController.value.text = ''; + controller + .destinationTextEditController + .value + .text = ''; final firstPlace = result; final lat = firstPlace.coordinates.latitude; final lng = firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.destinationTextEditController.value.text = address.toString(); + controller + .destinationTextEditController + .value + .text = address.toString(); controller.setDestinationMarker(lat, lng); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.destinationTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDestinationMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .destinationTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.setDestinationMarker( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: "Destination Location".tr, + // backgroundColor: AppThemeData.cardColor, enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -265,16 +431,28 @@ class CabBookingScreen extends StatelessWidget { RoundedButtonFill( title: "Continue".tr, onPress: () { - if (controller.sourceTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast("Please select source location".tr); - } else if (controller.destinationTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast("Please select destination location".tr); + if (controller + .sourceTextEditController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please select source location".tr, + ); + } else if (controller + .destinationTextEditController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please select destination location".tr, + ); } else { controller.bottomSheetType.value = "vehicleSelection"; } }, - color: AppThemeData.primary300, - textColor: AppThemeData.grey900, + color: AppThemeData.mainColor, + textColor: AppThemeData.grey50, ), ], ), @@ -284,7 +462,11 @@ class CabBookingScreen extends StatelessWidget { ); } - Widget vehicleSelection(BuildContext context, CabBookingController controller, bool isDark) { + Widget vehicleSelection( + BuildContext context, + CabBookingController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.40, @@ -293,20 +475,42 @@ class CabBookingScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Align( alignment: Alignment.topLeft, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Text( "Select Your Vehicle Type".tr, - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), textAlign: TextAlign.start, ), ), @@ -319,11 +523,13 @@ class CabBookingScreen extends StatelessWidget { controller: scrollController, scrollDirection: Axis.vertical, itemBuilder: (context, index) { - VehicleType vehicleType = controller.vehicleTypes[index]; + VehicleType vehicleType = + controller.vehicleTypes[index]; return Obx( () => InkWell( onTap: () { - controller.selectedVehicleType.value = controller.vehicleTypes[index]; + controller.selectedVehicleType.value = + controller.vehicleTypes[index]; }, child: Padding( padding: const EdgeInsets.only(bottom: 10), @@ -333,60 +539,130 @@ class CabBookingScreen extends StatelessWidget { border: Border.all( color: isDark - ? controller.selectedVehicleType.value.id == vehicleType.id + ? controller + .selectedVehicleType + .value + .id == + vehicleType.id ? Colors.white : AppThemeData.grey500 - : controller.selectedVehicleType.value.id == vehicleType.id + : controller + .selectedVehicleType + .value + .id == + vehicleType.id ? AppThemeData.grey300 : Colors.transparent, width: 1, ), color: - controller.selectedVehicleType.value.id == vehicleType.id + controller.selectedVehicleType.value.id == + vehicleType.id ? AppThemeData.grey50 : isDark ? AppThemeData.grey300 : Colors.white, ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( children: [ ClipRRect( //borderRadius: BorderRadius.circular(10), child: CachedNetworkImage( - imageUrl: vehicleType.vehicleIcon.toString(), + imageUrl: + vehicleType.vehicleIcon + .toString(), height: 60, width: 60, imageBuilder: (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => ClipRRect(borderRadius: BorderRadius.circular(20), child: Image.network(Constant.placeHolderImage, fit: BoxFit.cover)), + Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + (context, url, error) => + ClipRRect( + borderRadius: + BorderRadius.circular( + 20, + ), + child: Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + ), + ), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${vehicleType.name} | ${controller.distance.toStringAsFixed(2)}${'km'.tr}", - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 1, + ), ), Padding( - padding: const EdgeInsets.only(top: 2.0), - child: Text(controller.duration.value, style: const TextStyle(fontWeight: FontWeight.w400, letterSpacing: 1)), + padding: const EdgeInsets.only( + top: 2.0, + ), + child: Text( + controller.duration.value, + style: const TextStyle( + fontWeight: FontWeight.w400, + letterSpacing: 1, + ), + ), ), ], ), ), ), Text( - Constant.amountShow(amount: controller.getAmount(vehicleType).toString()), - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1), + Constant.amountShow( + amount: + controller + .getAmount(vehicleType) + .toString(), + ), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 1, + ), ), ], ), @@ -404,14 +680,25 @@ class CabBookingScreen extends StatelessWidget { 'amount': controller.selectedVehicleType.value.id == null ? Constant.amountShow(amount: "0.0") - : Constant.amountShow(amount: controller.getAmount(controller.selectedVehicleType.value).toString()), + : Constant.amountShow( + amount: + controller + .getAmount( + controller + .selectedVehicleType + .value, + ) + .toString(), + ), }), onPress: () async { if (controller.selectedVehicleType.value.id != null) { controller.calculateTotalAmount(); controller.bottomSheetType.value = "payment"; } else { - ShowToastDialog.showToast("Please select a vehicle type first.".tr); + ShowToastDialog.showToast( + "Please select a vehicle type first.".tr, + ); } }, color: AppThemeData.primary300, @@ -427,7 +714,11 @@ class CabBookingScreen extends StatelessWidget { ); } - Widget paymentBottomSheet(BuildContext context, CabBookingController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + CabBookingController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.70, @@ -437,19 +728,37 @@ class CabBookingScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Select Payment Method".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); }, - child: Icon(Icons.close, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + child: Icon( + Icons.close, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -459,32 +768,82 @@ class CabBookingScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr, + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -492,7 +851,13 @@ class CabBookingScreen extends StatelessWidget { Text( "Other Payment Options".tr, textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -500,32 +865,136 @@ class CabBookingScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller + .mercadoPagoModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller + .flutterWaveModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -540,13 +1009,19 @@ class CabBookingScreen extends StatelessWidget { textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr); + ShowToastDialog.showToast( + "Please select a payment method".tr, + ); return; } if (controller.selectedPaymentMethod.value == "wallet") { - num walletAmount = controller.userModel.value.walletAmount ?? 0; + num walletAmount = + controller.userModel.value.walletAmount ?? 0; if (walletAmount <= 0) { - ShowToastDialog.showToast("Insufficient wallet balance. Please select another payment method.".tr); + ShowToastDialog.showToast( + "Insufficient wallet balance. Please select another payment method." + .tr, + ); return; } } @@ -577,13 +1052,29 @@ class CabBookingScreen extends StatelessWidget { init: CabBookingController(), builder: (controller) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Expanded( child: ListView( controller: scrollController, @@ -593,75 +1084,175 @@ class CabBookingScreen extends StatelessWidget { Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? Colors.transparent : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: + isDark + ? Colors.transparent + : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ // Pickup Location InkWell( onTap: () async { - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + if (Constant.selectedMapType == + 'osm') { + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.sourceTextEditController.value.text = ''; + controller + .sourceTextEditController + .value + .text = ''; final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; - controller.sourceTextEditController.value.text = address.toString(); - controller.setDepartureMarker(lat, lng); + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace.address; + controller + .sourceTextEditController + .value + .text = address.toString(); + controller.setDepartureMarker( + lat, + lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to( + LocationPickerScreen(), + )!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDepartureMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller.setDepartureMarker( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller + .sourceTextEditController + .value, hintText: "Pickup Location".tr, enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 10), // Destination Location InkWell( onTap: () async { - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + if (Constant.selectedMapType == + 'osm') { + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.destinationTextEditController.value.text = ''; + controller + .destinationTextEditController + .value + .text = ''; final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; - controller.destinationTextEditController.value.text = address.toString(); - controller.setDestinationMarker(lat, lng); + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace.address; + controller + .destinationTextEditController + .value + .text = address.toString(); + controller.setDestinationMarker( + lat, + lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to( + LocationPickerScreen(), + )!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.destinationTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDestinationMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .destinationTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller.setDestinationMarker( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: "Destination Location".tr, enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -679,9 +1270,15 @@ class CabBookingScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 40, ), - child: const SizedBox(width: 20, height: 40), ), ), ], @@ -689,25 +1286,59 @@ class CabBookingScreen extends StatelessWidget { const SizedBox(height: 10), Row( children: [ - Expanded(child: Text("Promo code".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded( + child: Text( + "Promo code".tr, + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { - Get.to(CabCouponCodeScreen())!.then((value) { + Get.to(CabCouponCodeScreen())!.then(( + value, + ) { if (value != null) { - controller.couponCodeTextEditController.value.text = value.code ?? ''; - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: value); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = value; + controller + .couponCodeTextEditController + .value + .text = value.code ?? ''; + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: value, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + value; controller.calculateTotalAmount(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr, + ); } } }); }, child: Text( "View All".tr, - style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.boldTextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], @@ -720,25 +1351,57 @@ class CabBookingScreen extends StatelessWidget { height: Responsive.height(6, context), color: AppThemeData.carRent50, child: DottedBorder( - options: RectDottedBorderOptions(dashPattern: [10, 5], strokeWidth: 1, padding: EdgeInsets.all(0), color: AppThemeData.carRent400), + options: RectDottedBorderOptions( + dashPattern: [10, 5], + strokeWidth: 1, + padding: EdgeInsets.all(0), + color: AppThemeData.carRent400, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_coupon.svg"), + SvgPicture.asset( + "assets/icons/ic_coupon.svg", + ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: TextFormField( - controller: controller.couponCodeTextEditController.value, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + controller: + controller + .couponCodeTextEditController + .value, + style: + AppThemeData.semiBoldTextStyle( + color: + AppThemeData + .parcelService500, + fontSize: 16, + ), decoration: InputDecoration( border: InputBorder.none, - hintText: 'Write coupon Code'.tr, - contentPadding: EdgeInsets.only(bottom: 10), - hintStyle: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + hintText: + 'Write coupon Code'.tr, + contentPadding: EdgeInsets.only( + bottom: 10, + ), + hintStyle: + AppThemeData.semiBoldTextStyle( + color: + AppThemeData + .parcelService500, + fontSize: 16, + ), ), ), ), @@ -749,36 +1412,85 @@ class CabBookingScreen extends StatelessWidget { borderRadius: 10, fontSizes: 14, onPress: () async { - if (controller.couponCodeTextEditController.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter a coupon code".tr); + if (controller + .couponCodeTextEditController + .value + .text + .trim() + .isEmpty) { + ShowToastDialog.showToast( + "Please enter a coupon code".tr, + ); return; } List matchedCoupons = controller.cabCouponList - .where((element) => element.code!.toLowerCase().trim() == controller.couponCodeTextEditController.value.text.toLowerCase().trim()) + .where( + (element) => + element.code! + .toLowerCase() + .trim() == + controller + .couponCodeTextEditController + .value + .text + .toLowerCase() + .trim(), + ) .toList(); if (matchedCoupons.isNotEmpty) { - CouponModel couponModel = matchedCoupons.first; + CouponModel couponModel = + matchedCoupons.first; - if (couponModel.expiresAt != null && couponModel.expiresAt!.toDate().isAfter(DateTime.now())) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); + if (couponModel.expiresAt != + null && + couponModel.expiresAt! + .toDate() + .isAfter( + DateTime.now(), + )) { + double couponAmount = + Constant.calculateDiscount( + amount: + controller + .subTotal + .value + .toString(), + offerModel: couponModel, + ); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; - controller.discount.value = couponAmount; - controller.calculateTotalAmount(); - ShowToastDialog.showToast("Coupon applied successfully".tr); + if (couponAmount < + controller.subTotal.value) { + controller + .selectedCouponModel + .value = couponModel; + controller.discount.value = + couponAmount; + controller + .calculateTotalAmount(); + ShowToastDialog.showToast( + "Coupon applied successfully" + .tr, + ); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr, + ); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr); + ShowToastDialog.showToast( + "This coupon code has been expired" + .tr, + ); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr); + ShowToastDialog.showToast( + "Invalid coupon code".tr, + ); } }, color: AppThemeData.parcelService300, @@ -795,46 +1507,121 @@ class CabBookingScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Order Summary".tr, + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Subtotal".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + "Subtotal".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), + Text( + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Row( children: [ - Text("Discount".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Discount".tr, + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), SizedBox(width: 5), Text( - controller.selectedCouponModel.value.id == null ? "" : "(${controller.selectedCouponModel.value.code})", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.primary300), + controller + .selectedCouponModel + .value + .id == + null + ? "" + : "(${controller.selectedCouponModel.value.code})", + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + AppThemeData.primary300, + ), ), ], ), - Text(Constant.amountShow(amount: controller.discount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.danger300)), + Text( + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: AppThemeData.danger300, + ), + ), ], ), ), @@ -846,24 +1633,57 @@ class CabBookingScreen extends StatelessWidget { physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { - TaxModel taxModel = Constant.taxList[index]; + TaxModel taxModel = + Constant.taxList[index]; return Padding( - padding: const EdgeInsets.only(bottom: 5), + padding: const EdgeInsets.only( + bottom: 5, + ), child: Row( children: [ Expanded( child: Text( - '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})'.tr, + '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})' + .tr, textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark800 + : AppThemeData + .grey800, + ), ), ), Text( Constant.amountShow( - amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), + amount: + Constant.calculateTax( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), ).tr, textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -873,14 +1693,36 @@ class CabBookingScreen extends StatelessWidget { const Divider(), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Order Total".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + "Order Total".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -892,42 +1734,154 @@ class CabBookingScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(10), child: Row( children: [ controller.selectedPaymentMethod.value == '' - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "") - : controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecorationScreen(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecorationScreen(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecorationScreen(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecorationScreen(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecorationScreen(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecorationScreen(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecorationScreen(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecorationScreen(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecorationScreen(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecorationScreen(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name + ? cardDecorationScreen( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.stripe.name + ? cardDecorationScreen( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name + ? cardDecorationScreen( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name + ? cardDecorationScreen( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name + ? cardDecorationScreen( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name + ? cardDecorationScreen( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name + ? cardDecorationScreen( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name + ? cardDecorationScreen( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name + ? cardDecorationScreen( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name + ? cardDecorationScreen( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecorationScreen( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), SizedBox(width: 22), Text( controller.selectedPaymentMethod.value.tr, textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -954,7 +1908,11 @@ class CabBookingScreen extends StatelessWidget { ); } - Widget waitingDialog(BuildContext context, CabBookingController controller, bool isDark) { + Widget waitingDialog( + BuildContext context, + CabBookingController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.4, @@ -963,15 +1921,37 @@ class CabBookingScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), SizedBox(height: 30), - Text("Waiting for driver....".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Waiting for driver....".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( title: "Cancel Ride".tr, @@ -986,7 +1966,9 @@ class CabBookingScreen extends StatelessWidget { }); if (controller.currentOrder.value.id != null) { - await FireStoreUtils.updateCabOrder(controller.currentOrder.value); + await FireStoreUtils.updateCabOrder( + controller.currentOrder.value, + ); } controller.bottomSheetType.value = ""; @@ -996,20 +1978,36 @@ class CabBookingScreen extends StatelessWidget { controller.routePoints.clear(); controller.sourceTextEditController.value.clear(); controller.destinationTextEditController.value.clear(); - controller.departureLatLong.value = const LatLng(0.0, 0.0); - controller.destinationLatLong.value = const LatLng(0.0, 0.0); - controller.departureLatLongOsm.value = latlong.LatLng(0.0, 0.0); - controller.destinationLatLongOsm.value = latlong.LatLng(0.0, 0.0); + controller.departureLatLong.value = const LatLng( + 0.0, + 0.0, + ); + controller.destinationLatLong.value = const LatLng( + 0.0, + 0.0, + ); + controller.departureLatLongOsm.value = latlong.LatLng( + 0.0, + 0.0, + ); + controller.destinationLatLongOsm.value = latlong.LatLng( + 0.0, + 0.0, + ); // 4. Reset user’s in-progress order if (Constant.userModel != null) { Constant.userModel!.inProgressOrderID = null; await FireStoreUtils.updateUser(Constant.userModel!); } - ShowToastDialog.showToast("Ride cancelled successfully".tr); + ShowToastDialog.showToast( + "Ride cancelled successfully".tr, + ); // Get.offAll(const CabDashboardScreen()); Get.back(); - CabDashboardController cabDashboardController = Get.put(CabDashboardController()); + CabDashboardController cabDashboardController = Get.put( + CabDashboardController(), + ); cabDashboardController.selectedIndex.value = 0; } catch (e) { ShowToastDialog.showToast("Failed to cancel ride".tr); @@ -1025,7 +2023,11 @@ class CabBookingScreen extends StatelessWidget { ); } - Widget driverDialog(BuildContext context, CabBookingController controller, bool isDark) { + Widget driverDialog( + BuildContext context, + CabBookingController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.7, @@ -1034,13 +2036,29 @@ class CabBookingScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Expanded( child: ListView( controller: scrollController, @@ -1050,7 +2068,11 @@ class CabBookingScreen extends StatelessWidget { Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? Colors.transparent : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: + isDark ? Colors.transparent : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -1079,11 +2101,23 @@ class CabBookingScreen extends StatelessWidget { // } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller + .sourceTextEditController + .value, hintText: "Pickup Location".tr, enable: false, readOnly: true, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 10), @@ -1112,13 +2146,25 @@ class CabBookingScreen extends StatelessWidget { // } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: "Destination Location".tr, enable: false, readOnly: true, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -1136,7 +2182,10 @@ class CabBookingScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), ), child: const SizedBox(width: 20, height: 40), ), @@ -1149,19 +2198,36 @@ class CabBookingScreen extends StatelessWidget { ? Padding( padding: EdgeInsets.symmetric(horizontal: 16), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Otp :".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Otp :".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), Text( controller.currentOrder.value.otpCode ?? '', - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), ) : SizedBox.shrink(), - if (Constant.isEnableOTPTripStart == true) SizedBox(height: 14), + if (Constant.isEnableOTPTripStart == true) + SizedBox(height: 14), controller.currentOrder.value.driver != null ? Row( @@ -1169,26 +2235,66 @@ class CabBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.currentOrder.value.driver?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + borderRadius: BorderRadiusGeometry.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .currentOrder + .value + .driver + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), SizedBox(width: 10), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.currentOrder.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller.currentOrder.value.driver + ?.fullName() ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 18, + ), ), Text( "${controller.currentOrder.value.driver?.vehicleType ?? ''} | ${controller.currentOrder.value.driver?.carMakes.toString()}", - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.greyDark700 + : AppThemeData.grey700, + fontSize: 14, + ), ), Text( - controller.currentOrder.value.driver?.carNumber ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 16), + controller + .currentOrder + .value + .driver + ?.carNumber ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.greyDark700 + : AppThemeData.grey700, + fontSize: 16, + ), ), ], ), @@ -1196,7 +2302,13 @@ class CabBookingScreen extends StatelessWidget { Column( children: [ RoundedButtonBorder( - title: controller.driverModel.value.averageRating.toStringAsFixed(1) ?? '', + title: + controller + .driverModel + .value + .averageRating + .toStringAsFixed(1) ?? + '', width: 20, height: 3.5, radius: 10, @@ -1205,7 +2317,9 @@ class CabBookingScreen extends StatelessWidget { textColor: AppThemeData.warning400, borderColor: AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), SizedBox(height: 10), @@ -1213,40 +2327,87 @@ class CabBookingScreen extends StatelessWidget { children: [ InkWell( onTap: () { - Constant.makePhoneCall(controller.currentOrder.value.driver!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .currentOrder + .value + .driver! + .phoneNumber + .toString(), + ); }, child: Container( width: 38, height: 38, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey200 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular(120), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader( + "Please wait...".tr, + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.currentOrder.value.authorID ?? ''); - UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.currentOrder.value.driverId ?? ''); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .currentOrder + .value + .authorID ?? + '', + ); + UserModel? driverUser = + await FireStoreUtils.getUserProfile( + controller + .currentOrder + .value + .driverId ?? + '', + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer?.fullName(), - "restaurantName": driverUser?.fullName(), - "orderId": controller.currentOrder.value.id, + "customerName": + customer?.fullName(), + "restaurantName": + driverUser?.fullName(), + "orderId": + controller + .currentOrder + .value + .id, "restaurantId": driverUser?.id, "customerId": customer?.id, - "customerProfileImage": customer?.profilePictureURL, - "restaurantProfileImage": driverUser?.profilePictureURL, + "customerProfileImage": + customer?.profilePictureURL, + "restaurantProfileImage": + driverUser + ?.profilePictureURL, "token": driverUser?.fcmToken, "chatType": "Driver", }, @@ -1257,11 +2418,26 @@ class CabBookingScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey200 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular(120), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -1275,8 +2451,16 @@ class CabBookingScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(10), child: InkWell( @@ -1285,38 +2469,125 @@ class CabBookingScreen extends StatelessWidget { }, child: Row( children: [ - controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecorationScreen(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecorationScreen(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecorationScreen(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecorationScreen(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecorationScreen(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecorationScreen(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecorationScreen(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecorationScreen(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecorationScreen(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecorationScreen(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.cod.name + ? cardDecorationScreen( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name + ? cardDecorationScreen( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name + ? cardDecorationScreen( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name + ? cardDecorationScreen( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name + ? cardDecorationScreen( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name + ? cardDecorationScreen( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name + ? cardDecorationScreen( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name + ? cardDecorationScreen( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name + ? cardDecorationScreen( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name + ? cardDecorationScreen( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecorationScreen( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), SizedBox(width: 22), Expanded( child: Text( controller.selectedPaymentMethod.value.tr, textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), + Text( + "Change".tr, + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, ), ), - Text("Change".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300)), ], ), ), @@ -1325,37 +2596,98 @@ class CabBookingScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Order Summary".tr, + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Subtotal".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + "Subtotal".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), + Text( + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Discount".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(Constant.amountShow(amount: controller.discount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.danger300)), + Text( + "Discount".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: AppThemeData.danger300, + ), + ), ], ), ), @@ -1374,17 +2706,41 @@ class CabBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})'.tr, + '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})' + .tr, textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), ), ), Text( Constant.amountShow( - amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), + amount: + Constant.calculateTax( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), ).tr, textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1394,14 +2750,36 @@ class CabBookingScreen extends StatelessWidget { const Divider(), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Order Total".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + "Order Total".tr, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1415,7 +2793,8 @@ class CabBookingScreen extends StatelessWidget { ), Obx(() { - if (controller.currentOrder.value.status == Constant.orderInTransit) { + if (controller.currentOrder.value.status == + Constant.orderInTransit) { return Column( children: [ RoundedButtonFill( @@ -1427,21 +2806,45 @@ class CabBookingScreen extends StatelessWidget { onPress: () async { ShowToastDialog.showLoader("Please wait...".tr); - LocationData location = await controller.currentLocation.value.getLocation(); + LocationData location = + await controller.currentLocation.value + .getLocation(); - await FireStoreUtils.getSOS(controller.currentOrder.value.id ?? '').then((value) async { + await FireStoreUtils.getSOS( + controller.currentOrder.value.id ?? '', + ).then((value) async { if (value == false) { - await FireStoreUtils.setSos(controller.currentOrder.value.id ?? '', UserLocation(latitude: location.latitude!, longitude: location.longitude!)).then((_) { + await FireStoreUtils.setSos( + controller.currentOrder.value.id ?? '', + UserLocation( + latitude: location.latitude!, + longitude: location.longitude!, + ), + ).then((_) { ShowToastDialog.closeLoader(); - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text("Your SOS request has been submitted to admin".tr), backgroundColor: Colors.green, duration: Duration(seconds: 3))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + "Your SOS request has been submitted to admin" + .tr, + ), + backgroundColor: Colors.green, + duration: Duration(seconds: 3), + ), + ); }); } else { ShowToastDialog.closeLoader(); - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text("Your SOS request is already submitted".tr), backgroundColor: Colors.red, duration: Duration(seconds: 3))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + "Your SOS request is already submitted" + .tr, + ), + backgroundColor: Colors.red, + duration: Duration(seconds: 3), + ), + ); } }); }, @@ -1454,48 +2857,108 @@ class CabBookingScreen extends StatelessWidget { } }), Obx(() { - if (controller.currentOrder.value.status == Constant.orderInTransit && controller.currentOrder.value.paymentStatus == false) { + if (controller.currentOrder.value.status == + Constant.orderInTransit && + controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( title: "Pay Now".tr, onPress: () async { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (Constant.userModel!.walletAmount == null || Constant.userModel!.walletAmount! < controller.totalAmount.value) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { + if (Constant.userModel!.walletAmount == null || + Constant.userModel!.walletAmount! < + controller.totalAmount.value) { + ShowToastDialog.showToast( + "You do not have sufficient wallet balance".tr, + ); } else { controller.completeOrder(); } - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr, + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: + controller.totalAmount.value + .toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast( + "Please select payment method".tr, + ); } }, color: AppThemeData.primary300, @@ -1514,19 +2977,42 @@ class CabBookingScreen extends StatelessWidget { ); } - Padding cardDecorationScreen(CabBookingController controller, PaymentGateway value, isDark, String image) { + Padding cardDecorationScreen( + CabBookingController controller, + PaymentGateway value, + isDark, + String image, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( width: 40, height: 40, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: image == '' ? Container(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100) : Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: + image == '' + ? Container( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + ) + : Image.asset(image), + ), ), ); } - Obx cardDecoration(CabBookingController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + CabBookingController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -1541,8 +3027,21 @@ class CabBookingScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -1553,12 +3052,34 @@ class CabBookingScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == + null + ? '0.0' + : controller + .userModel + .value + .walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -1567,14 +3088,23 @@ class CabBookingScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, -- 2.49.1 From b2cb9b5dc5d0605a982426029c85cabbd959da82 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Fri, 28 Nov 2025 18:41:40 +0500 Subject: [PATCH 05/30] BASE: Finish Cab Type Section UI. --- .../cab_booking_screen.dart | 299 +++++++++--------- lib/widget/osm_map/map_picker_page.dart | 98 ++++-- .../place_picker/location_picker_screen.dart | 92 +++++- 3 files changed, 298 insertions(+), 191 deletions(-) diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 7df5709..04f7cd1 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -14,6 +14,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; @@ -469,9 +470,9 @@ class CabBookingScreen extends StatelessWidget { ) { return Positioned.fill( child: DraggableScrollableSheet( - initialChildSize: 0.40, - minChildSize: 0.40, - maxChildSize: 0.8, + initialChildSize: 0.37, + minChildSize: 0.37, + maxChildSize: 0.37, expand: false, builder: (context, scrollController) { return Container( @@ -483,45 +484,45 @@ class CabBookingScreen extends StatelessWidget { ), ), child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 15.0, - vertical: 10, - ), + padding: EdgeInsets.symmetric(vertical: 10.r), child: Column( - mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppThemeData.grey400, - ), - height: 4, - width: 33, - ), - Align( - alignment: Alignment.topLeft, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: Text( - "Select Your Vehicle Type".tr, - style: AppThemeData.boldTextStyle( - fontSize: 18, - color: - isDark - ? AppThemeData.greyDark900 - : AppThemeData.grey900, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, ), - textAlign: TextAlign.start, + height: 4.h, + width: 33.w, ), + ], + ), + SizedBox(height: 15.h), + Padding( + padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), + child: Text( + "Select Your Vehicle Type".tr, + style: AppThemeData.boldTextStyle( + fontSize: 18.sp, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + textAlign: TextAlign.start, ), ), + SizedBox(height: 10.h), Expanded( child: ListView.builder( itemCount: controller.vehicleTypes.length, - shrinkWrap: true, - padding: EdgeInsets.only(bottom: 20), + physics: AlwaysScrollableScrollPhysics(), controller: scrollController, - scrollDirection: Axis.vertical, + scrollDirection: Axis.horizontal, itemBuilder: (context, index) { VehicleType vehicleType = controller.vehicleTypes[index]; @@ -531,141 +532,128 @@ class CabBookingScreen extends StatelessWidget { controller.selectedVehicleType.value = controller.vehicleTypes[index]; }, - child: Padding( - padding: const EdgeInsets.only(bottom: 10), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - border: Border.all( - color: - isDark - ? controller + child: Container( + width: 130.w, + margin: + index == 0 + ? EdgeInsets.only(left: 16.r, right: 10.r) + : index == + controller.vehicleTypes.length - 1 + ? EdgeInsets.only(right: 10.r) + : EdgeInsets.only(right: 10.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.r), + color: + controller.selectedVehicleType.value.id == + vehicleType.id + ? AppThemeData.mainColor + : AppThemeData.grey300, + ), + child: Padding( + padding: EdgeInsets.fromLTRB(8.r, 8.r, 0, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + // "${vehicleType.name} | ${controller.distance.toStringAsFixed(2)}${'km'.tr}", + "${vehicleType.name}", + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontFamily: "Inter", + fontSize: 15.sp, + overflow: TextOverflow.ellipsis, + color: + controller .selectedVehicleType .value .id == vehicleType.id - ? Colors.white - : AppThemeData.grey500 - : controller - .selectedVehicleType - .value - .id == - vehicleType.id - ? AppThemeData.grey300 - : Colors.transparent, - width: 1, - ), - color: - controller.selectedVehicleType.value.id == - vehicleType.id - ? AppThemeData.grey50 - : isDark - ? AppThemeData.grey300 - : Colors.white, - ), - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 10, - horizontal: 10, - ), - child: Row( - children: [ - ClipRRect( - //borderRadius: BorderRadius.circular(10), - child: CachedNetworkImage( - imageUrl: - vehicleType.vehicleIcon - .toString(), - height: 60, - width: 60, - imageBuilder: - (context, imageProvider) => - Container( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular( - 10, - ), - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - placeholder: - (context, url) => Center( - child: - CircularProgressIndicator.adaptive( - valueColor: - AlwaysStoppedAnimation( - AppThemeData - .primary300, - ), - ), - ), - errorWidget: - (context, url, error) => - ClipRRect( + ? AppThemeData.grey50 + : AppThemeData.darkGrey, + fontWeight: FontWeight.bold, + ), + ), + Text( + Constant.amountShow( + amount: + controller + .getAmount(vehicleType) + .toString(), + ), + + style: TextStyle( + fontSize: 13.sp, + fontWeight: FontWeight.w500, + color: + controller + .selectedVehicleType + .value + .id == + vehicleType.id + ? AppThemeData.grey50 + : AppThemeData.darkGrey + .withValues(alpha: 0.7), + ), + ), + Text( + "(${controller.duration.value})", + style: TextStyle( + fontWeight: FontWeight.w400, + + color: + controller + .selectedVehicleType + .value + .id == + vehicleType.id + ? AppThemeData.grey50 + : AppThemeData.darkGrey + .withValues(alpha: 0.7), + ), + ), + Expanded( + child: CachedNetworkImage( + imageUrl: + vehicleType.vehicleIcon.toString(), + + imageBuilder: + (context, imageProvider) => + Container( + decoration: BoxDecoration( borderRadius: BorderRadius.circular( - 20, + 10, ), - child: Image.network( - Constant.placeHolderImage, + image: DecorationImage( + image: imageProvider, fit: BoxFit.cover, ), ), - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 10, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - "${vehicleType.name} | ${controller.distance.toStringAsFixed(2)}${'km'.tr}", - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 1, ), - ), - Padding( - padding: const EdgeInsets.only( - top: 2.0, - ), - child: Text( - controller.duration.value, - style: const TextStyle( - fontWeight: FontWeight.w400, - letterSpacing: 1, + placeholder: + (context, url) => Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), ), - ), + ), + errorWidget: + (context, url, error) => ClipRRect( + borderRadius: + BorderRadius.circular(20), + child: Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, ), - ], - ), - ), + ), + fit: BoxFit.cover, ), - Text( - Constant.amountShow( - amount: - controller - .getAmount(vehicleType) - .toString(), - ), - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 1, - ), - ), - ], - ), + ), + ], ), ), ), @@ -674,6 +662,7 @@ class CabBookingScreen extends StatelessWidget { }, ), ), + SizedBox(height: 15.h), Obx( () => RoundedButtonFill( title: 'pay_amount'.trParams({ @@ -701,8 +690,8 @@ class CabBookingScreen extends StatelessWidget { ); } }, - color: AppThemeData.primary300, - textColor: AppThemeData.grey900, + color: AppThemeData.mainColor, + textColor: AppThemeData.grey50, ), ), ], diff --git a/lib/widget/osm_map/map_picker_page.dart b/lib/widget/osm_map/map_picker_page.dart index 4e55913..334c7c9 100644 --- a/lib/widget/osm_map/map_picker_page.dart +++ b/lib/widget/osm_map/map_picker_page.dart @@ -1,8 +1,11 @@ +import 'dart:developer'; + import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/widget/osm_map/map_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:latlong2/latlong.dart'; import '../../controllers/theme_controller.dart'; @@ -18,38 +21,68 @@ class MapPickerPage extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Scaffold( - appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - centerTitle: false, - titleSpacing: 0, - title: Text("PickUp Location".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), - ), + // appBar: AppBar( + // backgroundColor: + // isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + // centerTitle: false, + // titleSpacing: 0, + // title: Text( + // "PickUp Location".tr, + // textAlign: TextAlign.start, + // style: TextStyle( + // fontFamily: AppThemeData.medium, + // fontSize: 16, + // color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + // ), + // ), + // ), body: Stack( children: [ Obx( () => FlutterMap( mapController: controller.mapController, options: MapOptions( - initialCenter: controller.pickedPlace.value?.coordinates ?? LatLng(20.5937, 78.9629), // Default India center + initialCenter: + controller.pickedPlace.value?.coordinates ?? + LatLng(20.5937, 78.9629), // Default India center initialZoom: 13, onTap: (tapPos, latlng) { controller.addLatLngOnly(latlng); - controller.mapController.move(latlng, controller.mapController.camera.zoom); + controller.mapController.move( + latlng, + controller.mapController.camera.zoom, + ); }, ), children: [ - TileLayer(urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', subdomains: const ['a', 'b', 'c'], userAgentPackageName: 'com.emart.app'), + TileLayer( + urlTemplate: + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + subdomains: const ['a', 'b', 'c'], + userAgentPackageName: 'com.emart.app', + ), MarkerLayer( markers: controller.pickedPlace.value != null - ? [Marker(point: controller.pickedPlace.value!.coordinates, width: 40, height: 40, child: const Icon(Icons.location_pin, size: 36, color: Colors.red))] + ? [ + Marker( + point: controller.pickedPlace.value!.coordinates, + width: 40, + height: 40, + child: const Icon( + Icons.location_pin, + size: 36, + color: Colors.red, + ), + ), + ] : [], ), ], ), ), Positioned( - top: 16, + top: MediaQuery.of(context).size.height / 9, left: 16, right: 16, child: Column( @@ -59,10 +92,18 @@ class MapPickerPage extends StatelessWidget { borderRadius: BorderRadius.circular(8), child: TextField( controller: searchController, - style: TextStyle(color: isDark ? AppThemeData.grey900 : AppThemeData.grey900), + style: TextStyle( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey900, + ), decoration: InputDecoration( hintText: 'Search location...'.tr, - hintStyle: TextStyle(color: isDark ? AppThemeData.grey900 : AppThemeData.grey900), + hintStyle: TextStyle( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey900, + ), contentPadding: EdgeInsets.all(12), border: InputBorder.none, prefixIcon: Icon(Icons.search), @@ -76,7 +117,10 @@ class MapPickerPage extends StatelessWidget { } return Container( margin: const EdgeInsets.only(top: 4), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), child: ListView.builder( shrinkWrap: true, itemCount: controller.searchResults.length, @@ -111,8 +155,13 @@ class MapPickerPage extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - controller.pickedPlace.value != null ? "Picked Location:".tr : "No Location Picked".tr, - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + controller.pickedPlace.value != null + ? "Picked Location:".tr + : "No Location Picked".tr, + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + fontSize: 17.sp, + ), ), const SizedBox(height: 4), if (controller.pickedPlace.value != null) @@ -129,20 +178,25 @@ class MapPickerPage extends StatelessWidget { Expanded( child: RoundedButtonFill( title: "Confirm Location".tr, - color: AppThemeData.primary300, + color: AppThemeData.mainColor, textColor: AppThemeData.grey50, - height: 5, + height: 4.h, onPress: () async { final selected = controller.pickedPlace.value; if (selected != null) { - Get.back(result: selected); // ✅ Return the selected place - print("Selected location: $selected"); + Get.back( + result: selected, + ); // ✅ Return the selected place + log("Selected location: $selected"); } }, ), ), - const SizedBox(width: 10), - IconButton(icon: const Icon(Icons.delete_forever, color: Colors.red), onPressed: controller.clearAll), + SizedBox(width: 10.w), + IconButton( + icon: const Icon(Icons.delete_forever, color: Colors.red), + onPressed: controller.clearAll, + ), ], ), ], diff --git a/lib/widget/place_picker/location_picker_screen.dart b/lib/widget/place_picker/location_picker_screen.dart index efb1fdc..38d6dc8 100644 --- a/lib/widget/place_picker/location_picker_screen.dart +++ b/lib/widget/place_picker/location_picker_screen.dart @@ -31,7 +31,10 @@ class LocationPickerScreen extends StatelessWidget { onMapCreated: (controllers) { controller.mapController = controllers; }, - initialCameraPosition: CameraPosition(target: controller.selectedLocation.value!, zoom: 15), + initialCameraPosition: CameraPosition( + target: controller.selectedLocation.value!, + zoom: 15, + ), onTap: (LatLng tappedPosition) { controller.selectedLocation.value = tappedPosition; controller.getAddressFromLatLng(tappedPosition); @@ -44,14 +47,18 @@ class LocationPickerScreen extends StatelessWidget { markerId: const MarkerId("selected-location"), position: controller.selectedLocation.value!, onTap: () { - controller.getAddressFromLatLng(controller.selectedLocation.value!); + controller.getAddressFromLatLng( + controller.selectedLocation.value!, + ); }, ), }, onCameraMove: controller.onMapMoved, onCameraIdle: () { if (controller.selectedLocation.value != null) { - controller.getAddressFromLatLng(controller.selectedLocation.value!); + controller.getAddressFromLatLng( + controller.selectedLocation.value!, + ); } }, ), @@ -67,29 +74,65 @@ class LocationPickerScreen extends StatelessWidget { Get.back(); }, child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, borderRadius: BorderRadius.circular(30)), - child: Padding(padding: const EdgeInsets.all(10), child: Icon(Icons.arrow_back_ios_new_outlined, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + borderRadius: BorderRadius.circular(30), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: Icon( + Icons.arrow_back_ios_new_outlined, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), ), SizedBox(height: 20), GestureDetector( onTap: () async { - Prediction? p = await PlacesAutocomplete.show(context: context, apiKey: Constant.mapAPIKey, mode: Mode.overlay, language: "en"); + Prediction? p = await PlacesAutocomplete.show( + context: context, + apiKey: Constant.mapAPIKey, + mode: Mode.overlay, + language: "en", + ); if (p != null) { - final detail = await _places.getDetailsByPlaceId(p.placeId!); + final detail = await _places.getDetailsByPlaceId( + p.placeId!, + ); final lat = detail.result.geometry!.location.lat; final lng = detail.result.geometry!.location.lng; final LatLng pos = LatLng(lat, lng); controller.selectedLocation.value = pos; - controller.mapController?.animateCamera(CameraUpdate.newLatLngZoom(pos, 15)); + controller.mapController?.animateCamera( + CameraUpdate.newLatLngZoom(pos, 15), + ); controller.getAddressFromLatLng(pos); } }, child: Container( width: Responsive.width(100, context), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(60)), - child: Row(children: [Icon(Icons.search), SizedBox(width: 8), Text("Search place...".tr)]), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(60), + ), + child: Row( + children: [ + Icon(Icons.search), + SizedBox(width: 8), + Text("Search place...".tr), + ], + ), ), ), ], @@ -101,13 +144,34 @@ class LocationPickerScreen extends StatelessWidget { right: 20, child: Container( padding: const EdgeInsets.all(10), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10), boxShadow: const [BoxShadow(color: Colors.black26, blurRadius: 5)]), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: const [ + BoxShadow(color: Colors.black26, blurRadius: 5), + ], + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Obx(() => Text(controller.address.value, textAlign: TextAlign.center, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w500))), + Obx( + () => Text( + controller.address.value, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ), const SizedBox(height: 10), - RoundedButtonFill(title: "Confirm Location".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.confirmLocation()), + RoundedButtonFill( + title: "Confirm Location", + height: 5.5, + color: AppThemeData.mainColor, + textColor: AppThemeData.grey50, + onPress: () => controller.confirmLocation(), + ), ], ), ), -- 2.49.1 From d703dadafd4b9dfbf70afb4c54d0d76608b720c3 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Sat, 29 Nov 2025 10:49:25 +0500 Subject: [PATCH 06/30] BASE: Fix Buttons Radiuses. --- lib/controllers/service_list_controller.dart | 40 +- .../auth_screens/forgot_password_screen.dart | 70 +- lib/screen_ui/auth_screens/login_screen.dart | 176 +++- .../auth_screens/mobile_login_screen.dart | 176 +++- .../auth_screens/otp_verification_screen.dart | 117 ++- .../auth_screens/sign_up_screen.dart | 3 + .../Intercity_home_screen.dart | 13 +- .../cab_booking_screen.dart | 76 +- .../cab_order_details.dart | 757 +++++++++++++++--- .../cab_review_screen.dart | 2 + .../cab_service_screens/complain_screen.dart | 3 +- .../my_cab_booking_screen.dart | 4 + .../address_list_screen.dart | 2 + .../enter_manually_location.dart | 2 + .../location_permission_screen.dart | 3 + .../cart_screen/cart_screen.dart | 4 + .../cart_screen/oder_placing_screens.dart | 3 + .../cart_screen/select_payment_screen.dart | 4 +- .../dine_in_screeen/book_table_screen.dart | 3 + .../dine_in_screeen/dine_in_screen.dart | 2 + .../edit_profile_screen.dart | 2 + 21 files changed, 1219 insertions(+), 243 deletions(-) diff --git a/lib/controllers/service_list_controller.dart b/lib/controllers/service_list_controller.dart index 52cf118..5b6d906 100644 --- a/lib/controllers/service_list_controller.dart +++ b/lib/controllers/service_list_controller.dart @@ -14,6 +14,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart'; @@ -38,7 +39,17 @@ class ServiceListController extends GetxController { // fetch currency CurrencyModel? currency = await FireStoreUtils.getCurrency(); - currencyData.value = currency ?? CurrencyModel(id: "", code: "USD", decimal: 2, isactive: true, name: "US Dollar", symbol: "\$", symbolatright: false); + currencyData.value = + currency ?? + CurrencyModel( + id: "", + code: "USD", + decimal: 2, + isactive: true, + name: "US Dollar", + symbol: "\$", + symbolatright: false, + ); // Load sections List sections = await FireStoreUtils.getSections(); @@ -59,11 +70,17 @@ class ServiceListController extends GetxController { }); } - Future onServiceTap(BuildContext context, SectionModel sectionModel) async { + Future onServiceTap( + BuildContext context, + SectionModel sectionModel, + ) async { try { ShowToastDialog.showLoader("Please wait...".tr); Constant.sectionConstantModel = sectionModel; - AppThemeData.primary300 = Color(int.tryParse(sectionModel.color?.replaceFirst("#", "0xff") ?? '') ?? 0xff2196F3); + AppThemeData.primary300 = Color( + int.tryParse(sectionModel.color?.replaceFirst("#", "0xff") ?? '') ?? + 0xff2196F3, + ); if (auth.FirebaseAuth.instance.currentUser != null) { String uid = auth.FirebaseAuth.instance.currentUser!.uid; UserModel? user = await FireStoreUtils.getUserProfile(uid); @@ -93,7 +110,8 @@ class ServiceListController extends GetxController { } }); - if (sectionModel.serviceTypeFlag == "ecommerce-service" || sectionModel.serviceTypeFlag == "delivery-service") { + if (sectionModel.serviceTypeFlag == "ecommerce-service" || + sectionModel.serviceTypeFlag == "delivery-service") { if (cartItem.isNotEmpty) { showAlertDialog(Get.context!, UserModel(), sectionModel); } else { @@ -130,18 +148,27 @@ class ServiceListController extends GetxController { final CartProvider cartProvider = CartProvider(); - void showAlertDialog(BuildContext context, UserModel user, SectionModel sectionModel) { + void showAlertDialog( + BuildContext context, + UserModel user, + SectionModel sectionModel, + ) { Get.defaultDialog( title: "Alert!", content: Column( mainAxisSize: MainAxisSize.min, children: [ - Text("If you select this Section/Service, your previously added items will be removed from the cart.".tr, textAlign: TextAlign.center), + Text( + "If you select this Section/Service, your previously added items will be removed from the cart." + .tr, + textAlign: TextAlign.center, + ), const SizedBox(height: 20), Row( children: [ Expanded( child: RoundedButtonFill( + borderRadius: 10.r, height: 5.5, title: "Cancel".tr, onPress: () { @@ -154,6 +181,7 @@ class ServiceListController extends GetxController { const SizedBox(width: 12), Expanded( child: RoundedButtonFill( + borderRadius: 10.r, title: "OK".tr, height: 5.5, onPress: () async { diff --git a/lib/screen_ui/auth_screens/forgot_password_screen.dart b/lib/screen_ui/auth_screens/forgot_password_screen.dart index dd3e5de..aaa3e0d 100644 --- a/lib/screen_ui/auth_screens/forgot_password_screen.dart +++ b/lib/screen_ui/auth_screens/forgot_password_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../controllers/forgot_password_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -26,12 +27,34 @@ class ForgotPasswordScreen extends StatelessWidget { actions: [ TextButton( onPressed: () {}, - style: TextButton.styleFrom(padding: const EdgeInsets.symmetric(horizontal: 12), minimumSize: const Size(0, 40), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(horizontal: 12), + minimumSize: const Size(0, 40), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text("Skip".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), - Padding(padding: const EdgeInsets.only(top: 2), child: Icon(Icons.arrow_forward_ios, size: 16, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Skip".tr, + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 2), + child: Icon( + Icons.arrow_forward_ios, + size: 16, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), ], ), ), @@ -49,17 +72,35 @@ class ForgotPasswordScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Enter your registered email to receive a reset link.".tr, - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + "Enter your registered email to receive a reset link." + .tr, + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(height: 24), - TextFieldWidget(title: "Email Address*".tr, hintText: "jerome014@gmail.com", controller: controller.emailEditingController.value), + TextFieldWidget( + title: "Email Address*".tr, + hintText: "jerome014@gmail.com", + controller: controller.emailEditingController.value, + ), const SizedBox(height: 30), RoundedButtonFill( + borderRadius: 10.r, title: "Send Link".tr, onPress: controller.forgotPassword, - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - textColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, ), ], ), @@ -71,11 +112,20 @@ class ForgotPasswordScreen extends StatelessWidget { child: Text.rich( TextSpan( text: "Remember Password?".tr, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), children: [ TextSpan( text: "Log in".tr, - style: AppThemeData.mediumTextStyle(color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, decorationColor: AppThemeData.ecommerce300), + style: AppThemeData.mediumTextStyle( + color: AppThemeData.ecommerce300, + decoration: TextDecoration.underline, + decorationColor: AppThemeData.ecommerce300, + ), recognizer: TapGestureRecognizer() ..onTap = () { diff --git a/lib/screen_ui/auth_screens/login_screen.dart b/lib/screen_ui/auth_screens/login_screen.dart index 1b311cc..cd5c7fe 100644 --- a/lib/screen_ui/auth_screens/login_screen.dart +++ b/lib/screen_ui/auth_screens/login_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import '../../controllers/login_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -34,8 +35,23 @@ class LoginScreen extends StatelessWidget { }, child: Row( children: [ - Text("Skip".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Icon(Icons.arrow_forward_ios, size: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Text( + "Skip".tr, + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ], ), ), @@ -54,11 +70,23 @@ class LoginScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Log in to explore your all in one vendor app favourites and shop effortlessly.".tr, - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + "Log in to explore your all in one vendor app favourites and shop effortlessly." + .tr, + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(height: 24), - TextFieldWidget(title: "Email Address*".tr, hintText: "jerome014@gmail.com", controller: controller.emailController.value, focusNode: controller.emailFocusNode), + TextFieldWidget( + title: "Email Address*".tr, + hintText: "jerome014@gmail.com", + controller: controller.emailController.value, + focusNode: controller.emailFocusNode, + ), const SizedBox(height: 15), TextFieldWidget( title: "Password*".tr, @@ -70,60 +98,137 @@ class LoginScreen extends StatelessWidget { padding: const EdgeInsets.all(12), child: InkWell( onTap: () { - controller.passwordVisible.value = !controller.passwordVisible.value; + controller.passwordVisible.value = + !controller.passwordVisible.value; }, child: controller.passwordVisible.value - ? SvgPicture.asset("assets/icons/ic_password_show.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn)) - : SvgPicture.asset("assets/icons/ic_password_close.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn)), + ? SvgPicture.asset( + "assets/icons/ic_password_show.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + BlendMode.srcIn, + ), + ) + : SvgPicture.asset( + "assets/icons/ic_password_close.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), ), ), ), Align( alignment: Alignment.centerRight, child: TextButton( - onPressed: () => Get.to(() => const ForgotPasswordScreen()), - child: Text("Forgot Password".tr, style: AppThemeData.semiBoldTextStyle(color: AppThemeData.info400)), + onPressed: + () => Get.to( + () => const ForgotPasswordScreen(), + ), + child: Text( + "Forgot Password".tr, + style: AppThemeData.semiBoldTextStyle( + color: AppThemeData.info400, + ), + ), ), ), const SizedBox(height: 20), RoundedButtonFill( + borderRadius: 10.r, title: "Log in".tr, onPress: controller.loginWithEmail, - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - textColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, ), const SizedBox(height: 25), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Container(width: 52, height: 1, color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey300), + Container( + width: 52, + height: 1, + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey300, + ), const SizedBox(width: 15), - Text("or continue with".tr, style: AppThemeData.regularTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900.withOpacity(0.6))), + Text( + "or continue with".tr, + style: AppThemeData.regularTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900.withValues( + alpha: 0.6, + ), + ), + ), const SizedBox(width: 15), - Container(width: 52, height: 1, color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey300), + Container( + width: 52, + height: 1, + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey300, + ), ], ), const SizedBox(height: 25), RoundedButtonFill( + borderRadius: 10.r, title: "Mobile number".tr, - onPress: () => Get.to(() => const MobileLoginScreen()), + onPress: + () => Get.to(() => const MobileLoginScreen()), isRight: false, isCenter: true, - icon: Icon(Icons.mobile_friendly_outlined, size: 20, color: isDark ? AppThemeData.greyDark900 : null), + icon: Icon( + Icons.mobile_friendly_outlined, + size: 20, + color: isDark ? AppThemeData.greyDark900 : null, + ), //Image.asset(AppAssets.icMessage, width: 20, height: 18, color: isDark ? AppThemeData.greyDark900 : null), - color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey300, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey300, + textColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, ), const SizedBox(height: 12), Row( children: [ Expanded( child: RoundedButtonFill( + borderRadius: 10.r, title: "with Google".tr, - textColor: isDark ? AppThemeData.grey100 : AppThemeData.grey900, - color: isDark ? AppThemeData.grey900 : AppThemeData.grey100, - icon: SvgPicture.asset("assets/icons/ic_google.svg"), + textColor: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey100, + icon: SvgPicture.asset( + "assets/icons/ic_google.svg", + ), isRight: false, isCenter: true, onPress: () async { @@ -135,11 +240,20 @@ class LoginScreen extends StatelessWidget { Platform.isIOS ? Expanded( child: RoundedButtonFill( + borderRadius: 10.r, title: "with Apple".tr, isCenter: true, - textColor: isDark ? AppThemeData.grey100 : AppThemeData.grey900, - color: isDark ? AppThemeData.grey900 : AppThemeData.grey100, - icon: SvgPicture.asset("assets/icons/ic_apple.svg"), + textColor: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey100, + icon: SvgPicture.asset( + "assets/icons/ic_apple.svg", + ), isRight: false, onPress: () async { controller.loginWithApple(); @@ -159,11 +273,19 @@ class LoginScreen extends StatelessWidget { child: Text.rich( TextSpan( text: "Didn't have an account?".tr, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), children: [ TextSpan( text: "Sign up".tr, - style: AppThemeData.mediumTextStyle(color: AppThemeData.ecommerce300, decoration: TextDecoration.underline), + style: AppThemeData.mediumTextStyle( + color: AppThemeData.ecommerce300, + decoration: TextDecoration.underline, + ), recognizer: TapGestureRecognizer() ..onTap = () { diff --git a/lib/screen_ui/auth_screens/mobile_login_screen.dart b/lib/screen_ui/auth_screens/mobile_login_screen.dart index d5dd719..d7587d0 100644 --- a/lib/screen_ui/auth_screens/mobile_login_screen.dart +++ b/lib/screen_ui/auth_screens/mobile_login_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_s import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../constant/assets.dart'; import '../../constant/constant.dart'; @@ -29,7 +30,11 @@ class MobileLoginScreen extends StatelessWidget { elevation: 0, automaticallyImplyLeading: false, leading: IconButton( - icon: Icon(Icons.arrow_back, size: 20, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + icon: Icon( + Icons.arrow_back, + size: 20, + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + ), onPressed: () { Get.back(); }, @@ -39,12 +44,34 @@ class MobileLoginScreen extends StatelessWidget { onPressed: () { Get.to(() => LocationPermissionScreen()); }, - style: TextButton.styleFrom(padding: const EdgeInsets.symmetric(horizontal: 12), minimumSize: const Size(0, 40), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(horizontal: 12), + minimumSize: const Size(0, 40), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text("Skip".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), - Padding(padding: const EdgeInsets.only(top: 2, left: 4), child: Icon(Icons.arrow_forward_ios, size: 16, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Skip".tr, + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 2, left: 4), + child: Icon( + Icons.arrow_forward_ios, + size: 16, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), ], ), ), @@ -62,67 +89,163 @@ class MobileLoginScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Use your mobile number to Log in easily and securely.".tr, - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + "Use your mobile number to Log in easily and securely." + .tr, + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(height: 25), TextFieldWidget( title: "Mobile Number*".tr, hintText: "Enter Mobile number".tr, controller: controller.mobileController.value, - textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), + textInputType: + const TextInputType.numberWithOptions( + signed: true, + decimal: true, + ), textInputAction: TextInputAction.done, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]')), LengthLimitingTextInputFormatter(10)], + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp('[0-9]'), + ), + LengthLimitingTextInputFormatter(10), + ], prefix: Row( mainAxisSize: MainAxisSize.min, children: [ CountryCodePicker( onChanged: (value) { - controller.countryCodeController.value.text = value.dialCode ?? Constant.defaultCountryCode; + controller + .countryCodeController + .value + .text = value.dialCode ?? + Constant.defaultCountryCode; }, - initialSelection: controller.countryCodeController.value.text.isNotEmpty ? controller.countryCodeController.value.text : Constant.defaultCountryCode, + initialSelection: + controller + .countryCodeController + .value + .text + .isNotEmpty + ? controller + .countryCodeController + .value + .text + : Constant.defaultCountryCode, showCountryOnly: false, showOnlyCountryWhenClosed: false, alignLeft: false, - textStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : Colors.black), - dialogTextStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - searchStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - dialogBackgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + textStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : Colors.black, + ), + dialogTextStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + searchStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + dialogBackgroundColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, padding: EdgeInsets.zero, ), // const Icon(Icons.keyboard_arrow_down_rounded, size: 24, color: AppThemeData.grey400), - Container(height: 24, width: 1, color: AppThemeData.grey400), + Container( + height: 24, + width: 1, + color: AppThemeData.grey400, + ), const SizedBox(width: 4), ], ), ), const SizedBox(height: 30), RoundedButtonFill( + borderRadius: 10.r, title: "Send Code".tr, onPress: controller.sendOtp, - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - textColor: isDark ? AppThemeData.surfaceDark : Colors.white, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.surfaceDark + : Colors.white, ), const SizedBox(height: 25), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Container(width: 52, height: 1, color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300), + Container( + width: 52, + height: 1, + color: + isDark + ? AppThemeData.greyDark300 + : AppThemeData.grey300, + ), const SizedBox(width: 15), - Text("or continue with".tr, style: AppThemeData.regularTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400)), + Text( + "or continue with".tr, + style: AppThemeData.regularTextStyle( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + ), + ), const SizedBox(width: 15), - Container(width: 52, height: 1, color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400), + Container( + width: 52, + height: 1, + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + ), ], ), const SizedBox(height: 25), RoundedButtonFill( + borderRadius: 10.r, title: "Email address".tr, onPress: () => Get.to(() => const SignUpScreen()), isRight: false, isCenter: true, - icon: Image.asset(AppAssets.icMessage, width: 20, height: 18, color: isDark ? AppThemeData.greyDark900 : null), - color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + icon: Image.asset( + AppAssets.icMessage, + width: 20, + height: 18, + color: isDark ? AppThemeData.greyDark900 : null, + ), + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + textColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, ), ], ), @@ -134,7 +257,12 @@ class MobileLoginScreen extends StatelessWidget { child: Text.rich( TextSpan( text: "Didn't have an account?".tr, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), children: [ TextSpan( text: "Sign up".tr, diff --git a/lib/screen_ui/auth_screens/otp_verification_screen.dart b/lib/screen_ui/auth_screens/otp_verification_screen.dart index 07857fc..1fc9c7f 100644 --- a/lib/screen_ui/auth_screens/otp_verification_screen.dart +++ b/lib/screen_ui/auth_screens/otp_verification_screen.dart @@ -1,6 +1,7 @@ import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; import '../../constant/assets.dart'; @@ -25,7 +26,11 @@ class OtpVerificationScreen extends StatelessWidget { elevation: 0, automaticallyImplyLeading: false, leading: IconButton( - icon: Icon(Icons.arrow_back, size: 20, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + icon: Icon( + Icons.arrow_back, + size: 20, + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + ), onPressed: () { Get.back(); }, @@ -35,14 +40,33 @@ class OtpVerificationScreen extends StatelessWidget { onPressed: () { // Handle skip action }, - style: TextButton.styleFrom(padding: const EdgeInsets.symmetric(horizontal: 12), minimumSize: const Size(0, 40), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(horizontal: 12), + minimumSize: const Size(0, 40), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text("Skip".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Skip".tr, + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), Padding( padding: const EdgeInsets.only(top: 2, left: 4), - child: Icon(Icons.arrow_forward_ios, size: 16, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + child: Icon( + Icons.arrow_forward_ios, + size: 16, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), ], ), @@ -62,7 +86,13 @@ class OtpVerificationScreen extends StatelessWidget { children: [ Text( "${"Enter the OTP sent to your mobile".tr} ${controller.countryCode} ${controller.maskPhoneNumber(controller.phoneNumber.value)}", - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(height: 30), @@ -73,20 +103,41 @@ class OtpVerificationScreen extends StatelessWidget { length: 6, controller: controller.otpController.value, keyboardType: TextInputType.number, - cursorColor: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + cursorColor: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, enablePinAutofill: true, hintCharacter: "-", - textStyle: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + textStyle: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), pinTheme: PinTheme( shape: PinCodeFieldShape.box, borderRadius: BorderRadius.circular(12), fieldHeight: 54, fieldWidth: 51, - inactiveColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + inactiveColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, inactiveFillColor: Colors.transparent, - selectedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, - selectedFillColor: isDark ? AppThemeData.surfaceDark : AppThemeData.grey50, - activeColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + selectedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + selectedFillColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.grey50, + activeColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, activeFillColor: Colors.transparent, errorBorderColor: AppThemeData.danger300, disabledColor: Colors.transparent, @@ -101,13 +152,23 @@ class OtpVerificationScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Image.asset(AppAssets.icArrowsClockwise, height: 20, width: 20), + Image.asset( + AppAssets.icArrowsClockwise, + height: 20, + width: 20, + ), TextButton( onPressed: () { controller.otpController.value.clear(); controller.sendOTP(); }, - child: Text("Resend OTP".tr, style: AppThemeData.semiBoldTextStyle(color: AppThemeData.info400, fontSize: 16)), + child: Text( + "Resend OTP".tr, + style: AppThemeData.semiBoldTextStyle( + color: AppThemeData.info400, + fontSize: 16, + ), + ), ), ], ), @@ -116,10 +177,17 @@ class OtpVerificationScreen extends StatelessWidget { /// Verify Button RoundedButtonFill( + borderRadius: 10.r, title: "Verify".tr, onPress: controller.verifyOtp, - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - textColor: isDark ? AppThemeData.surfaceDark : Colors.white, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.surfaceDark + : Colors.white, ), ], ), @@ -131,12 +199,25 @@ class OtpVerificationScreen extends StatelessWidget { child: Text.rich( TextSpan( text: "Didn't have an account?".tr, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), children: [ TextSpan( text: "Sign up".tr, - style: AppThemeData.mediumTextStyle(color: AppThemeData.ecommerce300, decoration: TextDecoration.underline), - recognizer: TapGestureRecognizer()..onTap = () => Get.offAll(() => const SignUpScreen()), + style: AppThemeData.mediumTextStyle( + color: AppThemeData.ecommerce300, + decoration: TextDecoration.underline, + ), + recognizer: + TapGestureRecognizer() + ..onTap = + () => Get.offAll( + () => const SignUpScreen(), + ), ), ], ), diff --git a/lib/screen_ui/auth_screens/sign_up_screen.dart b/lib/screen_ui/auth_screens/sign_up_screen.dart index 69c9645..d26b0ce 100644 --- a/lib/screen_ui/auth_screens/sign_up_screen.dart +++ b/lib/screen_ui/auth_screens/sign_up_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_s import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import '../../constant/constant.dart'; import '../../controllers/sign_up_controller.dart'; @@ -163,6 +164,7 @@ class SignUpScreen extends StatelessWidget { TextFieldWidget(title: "Referral Code".tr, hintText: "Enter referral code".tr, controller: controller.referralController.value), const SizedBox(height: 40), RoundedButtonFill( + borderRadius: 10.r, title: "Sign up".tr, onPress: () => controller.signUp(), color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, @@ -181,6 +183,7 @@ class SignUpScreen extends StatelessWidget { ), const SizedBox(height: 25), RoundedButtonFill( + borderRadius: 10.r, title: "Mobile number".tr, onPress: () => Get.to(() => const MobileLoginScreen()), isRight: false, diff --git a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart index 2095b2f..1f519ac 100644 --- a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart @@ -15,6 +15,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart' as get_cord_address; import 'package:get/get.dart'; @@ -320,6 +321,7 @@ class IntercityHomeScreen extends StatelessWidget { ), SizedBox(height: 10), RoundedButtonFill( + borderRadius: 10.r, title: "Continue".tr, onPress: () { if (controller.sourceTextEditController.value.text.isEmpty) { @@ -457,6 +459,7 @@ class IntercityHomeScreen extends StatelessWidget { ), Obx( () => RoundedButtonFill( + borderRadius: 10.r, title: 'pay_amount'.trParams({ 'amount': controller.selectedVehicleType.value.id == null @@ -594,6 +597,7 @@ class IntercityHomeScreen extends StatelessWidget { ), ), RoundedButtonFill( + borderRadius: 10.r, title: "Continue".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -819,9 +823,10 @@ class IntercityHomeScreen extends StatelessWidget { ), ), RoundedButtonFill( + borderRadius: 10.r, title: "Redeem now".tr, - width: 27, - borderRadius: 10, + width: 27.w, + fontSizes: 14, onPress: () async { if (controller.cabCouponList @@ -1001,6 +1006,7 @@ class IntercityHomeScreen extends StatelessWidget { ), ), RoundedButtonFill( + borderRadius: 10.r, title: "Confirm Booking".tr, onPress: () async { controller.placeOrder(); @@ -1039,6 +1045,7 @@ class IntercityHomeScreen extends StatelessWidget { Text("Waiting for driver....".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: AppThemeData.grey900)), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( + borderRadius: 10.r, title: "Cancel Ride".tr, onPress: () async { try { @@ -1400,6 +1407,7 @@ class IntercityHomeScreen extends StatelessWidget { return Column( children: [ RoundedButtonFill( + borderRadius: 10.r, title: "SOS".tr, color: Colors.red.withOpacity(0.50), textColor: AppThemeData.grey50, @@ -1456,6 +1464,7 @@ class IntercityHomeScreen extends StatelessWidget { Obx(() { if (controller.currentOrder.value.status == Constant.orderInTransit && controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( + borderRadius: 10.r, title: "Pay Now".tr, onPress: () async { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 04f7cd1..882918a 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -430,6 +430,7 @@ class CabBookingScreen extends StatelessWidget { ), SizedBox(height: 15), RoundedButtonFill( + borderRadius: 10.r, title: "Continue".tr, onPress: () { if (controller @@ -501,7 +502,7 @@ class CabBookingScreen extends StatelessWidget { ), ], ), - SizedBox(height: 15.h), + SizedBox(height: 10.h), Padding( padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), child: Text( @@ -663,35 +664,39 @@ class CabBookingScreen extends StatelessWidget { ), ), SizedBox(height: 15.h), - Obx( - () => RoundedButtonFill( - title: 'pay_amount'.trParams({ - 'amount': - controller.selectedVehicleType.value.id == null - ? Constant.amountShow(amount: "0.0") - : Constant.amountShow( - amount: - controller - .getAmount( - controller - .selectedVehicleType - .value, - ) - .toString(), - ), - }), - onPress: () async { - if (controller.selectedVehicleType.value.id != null) { - controller.calculateTotalAmount(); - controller.bottomSheetType.value = "payment"; - } else { - ShowToastDialog.showToast( - "Please select a vehicle type first.".tr, - ); - } - }, - color: AppThemeData.mainColor, - textColor: AppThemeData.grey50, + Padding( + padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), + child: Obx( + () => RoundedButtonFill( + borderRadius: 10.r, + title: 'pay_amount'.trParams({ + 'amount': + controller.selectedVehicleType.value.id == null + ? Constant.amountShow(amount: "0.0") + : Constant.amountShow( + amount: + controller + .getAmount( + controller + .selectedVehicleType + .value, + ) + .toString(), + ), + }), + onPress: () async { + if (controller.selectedVehicleType.value.id != null) { + controller.calculateTotalAmount(); + controller.bottomSheetType.value = "payment"; + } else { + ShowToastDialog.showToast( + "Please select a vehicle type first.".tr, + ); + } + }, + color: AppThemeData.mainColor, + textColor: AppThemeData.grey50, + ), ), ), ], @@ -993,6 +998,7 @@ class CabBookingScreen extends StatelessWidget { ), ), RoundedButtonFill( + borderRadius: 10.r, title: "Continue".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -1396,9 +1402,9 @@ class CabBookingScreen extends StatelessWidget { ), ), RoundedButtonFill( + borderRadius: 10.r, title: "Redeem now".tr, - width: 27, - borderRadius: 10, + width: 27.w, fontSizes: 14, onPress: () async { if (controller @@ -1879,6 +1885,7 @@ class CabBookingScreen extends StatelessWidget { ), ), RoundedButtonFill( + borderRadius: 10.r, title: "Confirm Booking".tr, onPress: () async { controller.placeOrder(); @@ -1943,6 +1950,7 @@ class CabBookingScreen extends StatelessWidget { ), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( + borderRadius: 10.r, title: "Cancel Ride".tr, color: AppThemeData.danger300, textColor: AppThemeData.surface, @@ -2787,8 +2795,9 @@ class CabBookingScreen extends StatelessWidget { return Column( children: [ RoundedButtonFill( + borderRadius: 10.r, title: "SOS".tr, - color: Colors.red.withOpacity(0.50), + color: Colors.red.withValues(alpha: 0.50), textColor: AppThemeData.grey50, isCenter: true, icon: const Icon(Icons.call, color: Colors.white), @@ -2850,6 +2859,7 @@ class CabBookingScreen extends StatelessWidget { Constant.orderInTransit && controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( + borderRadius: 10.r, title: "Pay Now".tr, onPress: () async { if (controller.selectedPaymentMethod.value == diff --git a/lib/screen_ui/cab_service_screens/cab_order_details.dart b/lib/screen_ui/cab_service_screens/cab_order_details.dart index 40bbfbb..2d4f280 100644 --- a/lib/screen_ui/cab_service_screens/cab_order_details.dart +++ b/lib/screen_ui/cab_service_screens/cab_order_details.dart @@ -1,5 +1,6 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; @@ -43,12 +44,30 @@ class CabOrderDetails extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Ride Details".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Ride Details".tr, + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -63,15 +82,31 @@ class CabOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), width: double.infinity, padding: const EdgeInsets.all(16), child: Text( - "${'Order Id:'.tr} ${Constant.orderId(orderId: controller.cabOrder.value.id.toString())}".tr, + "${'Order Id:'.tr} ${Constant.orderId(orderId: controller.cabOrder.value.id.toString())}" + .tr, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const SizedBox(height: 16), @@ -79,24 +114,43 @@ class CabOrderDetails extends StatelessWidget { margin: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, borderRadius: BorderRadius.circular(15), - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Booking Date:'.tr} ${controller.formatDate(controller.cabOrder.value.scheduleDateTime!)}".tr, + "${'Booking Date:'.tr} ${controller.formatDate(controller.cabOrder.value.scheduleDateTime!)}" + .tr, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( children: [ - Icon(Icons.stop_circle_outlined, color: Colors.green), + Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), DottedBorder( options: CustomPathDottedBorderOptions( color: Colors.grey.shade400, @@ -106,25 +160,48 @@ class CabOrderDetails extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 55, ), - child: const SizedBox(width: 20, height: 55), ), - Icon(Icons.radio_button_checked, color: Colors.red), + Icon( + Icons.radio_button_checked, + color: Colors.red, + ), ], ), const SizedBox(width: 12), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ // Source Location Name Expanded( child: Text( - controller.cabOrder.value.sourceLocationName.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .cabOrder + .value + .sourceLocationName + .toString(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), maxLines: 2, overflow: TextOverflow.ellipsis, ), @@ -132,14 +209,30 @@ class CabOrderDetails extends StatelessWidget { const SizedBox(width: 8), Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all(color: AppThemeData.warning300, width: 1), + borderRadius: + BorderRadius.circular(10), + border: Border.all( + color: + AppThemeData.warning300, + width: 1, + ), color: AppThemeData.warning50, ), - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + padding: + const EdgeInsets.symmetric( + vertical: 8, + horizontal: 12, + ), child: Text( - controller.cabOrder.value.status.toString(), - style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.warning500), + controller.cabOrder.value.status + .toString(), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + AppThemeData + .warning500, + ), overflow: TextOverflow.ellipsis, ), ), @@ -154,15 +247,34 @@ class CabOrderDetails extends StatelessWidget { customPath: (size) => Path() - ..moveTo(0, size.height / 2) // start from left center - ..lineTo(size.width, size.height / 2), // draw to right center + ..moveTo( + 0, + size.height / 2, + ) // start from left center + ..lineTo( + size.width, + size.height / 2, + ), // draw to right center + ), + child: const SizedBox( + width: 295, + height: 3, ), - child: const SizedBox(width: 295, height: 3), ), SizedBox(height: 15), Text( - controller.cabOrder.value.destinationLocationName.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .cabOrder + .value + .destinationLocationName + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -177,8 +289,16 @@ class CabOrderDetails extends StatelessWidget { height: 180, decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: ClipRRect( borderRadius: BorderRadius.circular(15), @@ -186,39 +306,107 @@ class CabOrderDetails extends StatelessWidget { Constant.selectedMapType == "osm" ? fm.FlutterMap( options: fm.MapOptions( - initialCenter: osm.LatLng(controller.cabOrder.value.sourceLocation!.latitude!, controller.cabOrder.value.sourceLocation!.longitude!), + initialCenter: osm.LatLng( + controller + .cabOrder + .value + .sourceLocation! + .latitude!, + controller + .cabOrder + .value + .sourceLocation! + .longitude!, + ), initialZoom: 13, ), children: [ - fm.TileLayer(urlTemplate: "https://tile.openstreetmap.org/{z}/{x}/{y}.png"), + fm.TileLayer( + urlTemplate: + "https://tile.openstreetmap.org/{z}/{x}/{y}.png", + ), // Only show polyline if points exist - if (controller.osmPolyline.isNotEmpty) fm.PolylineLayer(polylines: [fm.Polyline(points: controller.osmPolyline.toList(), color: Colors.blue, strokeWidth: 4)]), + if (controller.osmPolyline.isNotEmpty) + fm.PolylineLayer( + polylines: [ + fm.Polyline( + points: + controller.osmPolyline + .toList(), + color: Colors.blue, + strokeWidth: 4, + ), + ], + ), fm.MarkerLayer( markers: [ fm.Marker( - point: osm.LatLng(controller.cabOrder.value.sourceLocation!.latitude!, controller.cabOrder.value.sourceLocation!.longitude!), + point: osm.LatLng( + controller + .cabOrder + .value + .sourceLocation! + .latitude!, + controller + .cabOrder + .value + .sourceLocation! + .longitude!, + ), width: 20, height: 20, - child: Image.asset('assets/icons/ic_cab_pickup.png', width: 10, height: 10), + child: Image.asset( + 'assets/icons/ic_cab_pickup.png', + width: 10, + height: 10, + ), ), fm.Marker( - point: osm.LatLng(controller.cabOrder.value.destinationLocation!.latitude!, controller.cabOrder.value.destinationLocation!.longitude!), + point: osm.LatLng( + controller + .cabOrder + .value + .destinationLocation! + .latitude!, + controller + .cabOrder + .value + .destinationLocation! + .longitude!, + ), width: 20, height: 20, - child: Image.asset('assets/icons/ic_cab_destination.png', width: 10, height: 10), + child: Image.asset( + 'assets/icons/ic_cab_destination.png', + width: 10, + height: 10, + ), ), ], ), ], ) : gmap.GoogleMap( - initialCameraPosition: gmap.CameraPosition( - target: gmap.LatLng(controller.cabOrder.value.sourceLocation!.latitude!, controller.cabOrder.value.sourceLocation!.longitude!), - zoom: 13, - ), - polylines: controller.googlePolylines.toSet(), + initialCameraPosition: + gmap.CameraPosition( + target: gmap.LatLng( + controller + .cabOrder + .value + .sourceLocation! + .latitude!, + controller + .cabOrder + .value + .sourceLocation! + .longitude!, + ), + zoom: 13, + ), + polylines: + controller.googlePolylines.toSet(), markers: controller.googleMarkers.toSet(), ), ), @@ -230,18 +418,38 @@ class CabOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Ride & Fare Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Ride & Fare Summary".tr, + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -249,41 +457,103 @@ class CabOrderDetails extends StatelessWidget { width: 52, height: 52, child: ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.cabOrder.value.driver?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + borderRadius: + BorderRadiusGeometry.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .cabOrder + .value + .driver + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), ), SizedBox(width: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.cabOrder.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller + .cabOrder + .value + .driver + ?.fullName() ?? + '', + style: + AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + fontSize: 18, + ), ), Text( "${controller.cabOrder.value.driver?.vehicleType ?? ''} | ${controller.cabOrder.value.driver?.carMakes.toString()}", - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 14), + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + fontSize: 14, + ), ), Text( - controller.cabOrder.value.driver?.carNumber ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 16), + controller + .cabOrder + .value + .driver + ?.carNumber ?? + '', + style: + AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + fontSize: 16, + ), ), ], ), ], ), RoundedButtonBorder( - title: controller.driverUser.value.averageRating.toStringAsFixed(1) ?? '', + title: + controller + .driverUser + .value + .averageRating + .toStringAsFixed(1) ?? + '', width: 20, height: 3.5, radius: 10, isRight: false, isCenter: true, textColor: AppThemeData.warning400, - borderColor: AppThemeData.warning400, + borderColor: + AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), ], @@ -292,23 +562,61 @@ class CabOrderDetails extends StatelessWidget { children: [ Expanded( child: Visibility( - visible: controller.cabOrder.value.status == Constant.orderCompleted ? true : false, + visible: + controller + .cabOrder + .value + .status == + Constant + .orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( - title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr : 'Add Review'.tr, + borderRadius: 10.r, + title: + controller + .ratingModel + .value + .id != + null && + controller + .ratingModel + .value + .id! + .isNotEmpty + ? 'Update Review'.tr + : 'Add Review'.tr, onPress: () async { - final result = await Get.to(() => CabReviewScreen(), arguments: {'order': controller.cabOrder.value}); + final result = await Get.to( + () => CabReviewScreen(), + arguments: { + 'order': + controller + .cabOrder + .value, + }, + ); // If review was submitted successfully if (result == true) { - await controller.fetchDriverDetails(); + await controller + .fetchDriverDetails(); } }, height: 5, - borderRadius: 15, + color: Colors.orange, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, ), ), ), @@ -316,65 +624,145 @@ class CabOrderDetails extends StatelessWidget { SizedBox(width: 5), Expanded( child: Visibility( - visible: controller.cabOrder.value.status == Constant.orderCompleted ? true : false, + visible: + controller + .cabOrder + .value + .status == + Constant + .orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( + borderRadius: 10.r, title: 'Complain'.tr, onPress: () async { - Get.to(() => ComplainScreen(), arguments: {'order': controller.cabOrder.value}); + Get.to( + () => ComplainScreen(), + arguments: { + 'order': + controller + .cabOrder + .value, + }, + ); }, height: 5, - borderRadius: 15, + color: Colors.orange, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, ), ), ), ), ], ), - if (controller.cabOrder.value.status != Constant.orderCompleted) + if (controller.cabOrder.value.status != + Constant.orderCompleted) Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ InkWell( onTap: () { - Constant.makePhoneCall(controller.cabOrder.value.driver!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .cabOrder + .value + .driver! + .phoneNumber + .toString(), + ); }, child: Container( width: 150, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader( + "Please wait...".tr, + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.cabOrder.value.authorID ?? ''); - UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.cabOrder.value.driverId ?? ''); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .cabOrder + .value + .authorID ?? + '', + ); + UserModel? driverUser = + await FireStoreUtils.getUserProfile( + controller + .cabOrder + .value + .driverId ?? + '', + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer?.fullName(), - "restaurantName": driverUser?.fullName(), - "orderId": controller.cabOrder.value.id, - "restaurantId": driverUser?.id, + "customerName": + customer?.fullName(), + "restaurantName": + driverUser?.fullName(), + "orderId": + controller + .cabOrder + .value + .id, + "restaurantId": + driverUser?.id, "customerId": customer?.id, - "customerProfileImage": customer?.profilePictureURL, - "restaurantProfileImage": driverUser?.profilePictureURL, - "token": driverUser?.fcmToken, + "customerProfileImage": + customer + ?.profilePictureURL, + "restaurantProfileImage": + driverUser + ?.profilePictureURL, + "token": + driverUser?.fcmToken, "chatType": "Driver", }, ); @@ -384,11 +772,29 @@ class CabOrderDetails extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -403,16 +809,41 @@ class CabOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: EdgeInsets.all(16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _iconTile("${double.parse(controller.cabOrder.value.distance.toString()).toStringAsFixed(2)} ${'KM'.tr}", "Distance".tr, "assets/icons/ic_distance_parcel.svg", isDark), - _iconTile(controller.cabOrder.value.duration ?? '--', "Duration".tr, "assets/icons/ic_duration.svg", isDark), - _iconTile(Constant.amountShow(amount: controller.cabOrder.value.subTotal), "${controller.cabOrder.value.paymentMethod}".tr, "assets/icons/ic_rate_parcel.svg", isDark), + _iconTile( + "${double.parse(controller.cabOrder.value.distance.toString()).toStringAsFixed(2)} ${'KM'.tr}", + "Distance".tr, + "assets/icons/ic_distance_parcel.svg", + isDark, + ), + _iconTile( + controller.cabOrder.value.duration ?? '--', + "Duration".tr, + "assets/icons/ic_duration.svg", + isDark, + ), + _iconTile( + Constant.amountShow( + amount: controller.cabOrder.value.subTotal, + ), + "${controller.cabOrder.value.paymentMethod}".tr, + "assets/icons/ic_rate_parcel.svg", + isDark, + ), ], ), ), @@ -420,43 +851,98 @@ class CabOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr, + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal", Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + _summaryTile( + "Subtotal", + Constant.amountShow( + amount: controller.subTotal.value.toString(), + ), + isDark, + ), // Discount - _summaryTile("Discount", Constant.amountShow(amount: controller.discount.value.toString()), isDark), + _summaryTile( + "Discount", + Constant.amountShow( + amount: controller.discount.value.toString(), + ), + isDark, + ), // Tax List - ...List.generate(controller.cabOrder.value.taxSetting!.length, (index) { - return _summaryTile( - "${controller.cabOrder.value.taxSetting![index].title} ${controller.cabOrder.value.taxSetting![index].type == 'fix' ? '' : '(${controller.cabOrder.value.taxSetting![index].tax}%)'}", - Constant.amountShow( - amount: - Constant.getTaxValue( - amount: - ((double.tryParse(controller.cabOrder.value.subTotal.toString()) ?? 0.0) - (double.tryParse(controller.cabOrder.value.discount.toString()) ?? 0.0)) - .toString(), - taxModel: controller.cabOrder.value.taxSetting![index], - ).toString(), - ), - isDark, - ); - }), + ...List.generate( + controller.cabOrder.value.taxSetting!.length, + (index) { + return _summaryTile( + "${controller.cabOrder.value.taxSetting![index].title} ${controller.cabOrder.value.taxSetting![index].type == 'fix' ? '' : '(${controller.cabOrder.value.taxSetting![index].tax}%)'}", + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + ((double.tryParse( + controller + .cabOrder + .value + .subTotal + .toString(), + ) ?? + 0.0) - + (double.tryParse( + controller + .cabOrder + .value + .discount + .toString(), + ) ?? + 0.0)) + .toString(), + taxModel: + controller + .cabOrder + .value + .taxSetting![index], + ).toString(), + ), + isDark, + ); + }, + ), const Divider(), // Total - _summaryTile("Order Total", Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + _summaryTile( + "Order Total", + Constant.amountShow( + amount: + controller.totalAmount.value.toString(), + ), + isDark, + ), ], ), ), @@ -473,11 +959,28 @@ class CabOrderDetails extends StatelessWidget { return Column( children: [ // Icon(icon, color: AppThemeData.primary300), - SvgPicture.asset(icon, height: 28, width: 28, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + SvgPicture.asset( + icon, + height: 28, + width: 28, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), const SizedBox(height: 6), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), const SizedBox(height: 6), - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ); } @@ -488,8 +991,20 @@ class CabOrderDetails extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title.tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total" ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title.tr, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total" ? 18 : 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); diff --git a/lib/screen_ui/cab_service_screens/cab_review_screen.dart b/lib/screen_ui/cab_service_screens/cab_review_screen.dart index 7cdece4..9e0c0e5 100644 --- a/lib/screen_ui/cab_service_screens/cab_review_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_review_screen.dart @@ -1,6 +1,7 @@ import 'package:customer/controllers/cab_review_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; @@ -120,6 +121,7 @@ class CabReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( + borderRadius: 10.r, title: controller.ratingModel.value != null ? "Update Review".tr : "Add Review".tr, color: AppThemeData.primary300, textColor: isDark ? Colors.white : Colors.black, diff --git a/lib/screen_ui/cab_service_screens/complain_screen.dart b/lib/screen_ui/cab_service_screens/complain_screen.dart index 5d12323..b8a6d3d 100644 --- a/lib/screen_ui/cab_service_screens/complain_screen.dart +++ b/lib/screen_ui/cab_service_screens/complain_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../controllers/complain_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -53,7 +54,7 @@ class ComplainScreen extends StatelessWidget { const SizedBox(height: 10), Obx(() => TextFieldWidget(title: "Complain".tr, hintText: 'Type Description....'.tr, controller: controller.comment.value, maxLine: 8)), const SizedBox(height: 20), - RoundedButtonFill(title: "Save".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.submitComplain()), + RoundedButtonFill( borderRadius: 10.r,title: "Save".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.submitComplain()), ], ), ), diff --git a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart index 2df32bc..6d467b5 100644 --- a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_scr import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/my_cab_booking_controller.dart'; @@ -89,6 +90,7 @@ class MyCabBookingScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( + borderRadius: 10.r, title: "Log in".tr, width: 55, height: 5.5, @@ -226,6 +228,7 @@ class MyCabBookingScreen extends StatelessWidget { if (order.status == Constant.orderInTransit && order.paymentStatus == false) SizedBox(height: 14), order.status == Constant.orderInTransit && order.paymentStatus == false ? RoundedButtonFill( + borderRadius: 10.r, title: "Pay Now".tr, onPress: () async { controller.selectedPaymentMethod.value = order.paymentMethod.toString(); @@ -361,6 +364,7 @@ class MyCabBookingScreen extends StatelessWidget { ), ), RoundedButtonFill( + borderRadius: 10.r, title: "Continue".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, diff --git a/lib/screen_ui/location_enable_screens/address_list_screen.dart b/lib/screen_ui/location_enable_screens/address_list_screen.dart index 2584ba2..fcae1e4 100644 --- a/lib/screen_ui/location_enable_screens/address_list_screen.dart +++ b/lib/screen_ui/location_enable_screens/address_list_screen.dart @@ -7,6 +7,7 @@ import 'package:customer/screen_ui/location_enable_screens/enter_manually_locati import 'package:customer/themes/app_them_data.dart' show AppThemeData; import 'package:customer/themes/round_button_fill.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -127,6 +128,7 @@ class AddressListScreen extends StatelessWidget { bottomNavigationBar: Padding( padding: const EdgeInsets.only(bottom: 30, left: 16, right: 16, top: 20), child: RoundedButtonFill( + borderRadius: 10.r, title: "Add New Address", onPress: () { Get.to(EnterManuallyLocationScreen())!.then((value) { diff --git a/lib/screen_ui/location_enable_screens/enter_manually_location.dart b/lib/screen_ui/location_enable_screens/enter_manually_location.dart index f53d8ee..6f8e119 100644 --- a/lib/screen_ui/location_enable_screens/enter_manually_location.dart +++ b/lib/screen_ui/location_enable_screens/enter_manually_location.dart @@ -7,6 +7,7 @@ import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../controllers/enter_manually_location_controller.dart'; @@ -173,6 +174,7 @@ class EnterManuallyLocationScreen extends StatelessWidget { ), const SizedBox(height: 30), RoundedButtonFill( + borderRadius: 10.r, title: "Save Address".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/location_enable_screens/location_permission_screen.dart b/lib/screen_ui/location_enable_screens/location_permission_screen.dart index 0e0f069..547da30 100644 --- a/lib/screen_ui/location_enable_screens/location_permission_screen.dart +++ b/lib/screen_ui/location_enable_screens/location_permission_screen.dart @@ -10,6 +10,7 @@ import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; @@ -54,6 +55,7 @@ class LocationPermissionScreen extends StatelessWidget { ), const SizedBox(height: 30), RoundedButtonFill( + borderRadius: 10.r, title: "Use current location".tr, onPress: () async { Constant.checkPermission( @@ -104,6 +106,7 @@ class LocationPermissionScreen extends StatelessWidget { ), const SizedBox(height: 10), RoundedButtonFill( + borderRadius: 10.r, title: "Set from map".tr, onPress: () async { Constant.checkPermission( diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart index 03a0869..81f9df8 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart @@ -16,6 +16,7 @@ import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -1052,6 +1053,7 @@ class CartScreen extends StatelessWidget { ), Expanded( child: RoundedButtonFill( + borderRadius: 10.r, textColor: controller.selectedPaymentMethod.value != '' ? AppThemeData.surface @@ -1176,6 +1178,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( + borderRadius: 10.r, title: "Cancel".tr, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, textColor: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -1187,6 +1190,7 @@ class CartScreen extends StatelessWidget { const SizedBox(width: 20), Expanded( child: RoundedButtonFill( + borderRadius: 10.r, title: "Add".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart index 5332234..7538ca7 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart @@ -7,6 +7,7 @@ import 'package:customer/screen_ui/ecommarce/dash_board_e_commerce_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -194,6 +195,7 @@ class OrderPlacingScreen extends StatelessWidget { child: controller.isPlacing.value ? RoundedButtonFill( + borderRadius: 10.r, title: "Track Order".tr, height: 5.5, color: AppThemeData.primary300, @@ -212,6 +214,7 @@ class OrderPlacingScreen extends StatelessWidget { }, ) : RoundedButtonFill( + borderRadius: 10.r, title: "Track Order".tr, height: 5.5, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart index 17ac46a..e4b4d2f 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/controllers/cart_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; @@ -178,11 +179,12 @@ class SelectPaymentScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( + borderRadius: 10.r, title: "${'Pay Now'.tr} | ${Constant.amountShow(amount: controller.totalAmount.value.toString())}".tr, height: 5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, - fontSizes: 16, + fontSizes: 16.sp, onPress: () async { Get.back(); }, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart index 2a5105f..fb2102c 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; @@ -183,6 +184,7 @@ class BookTableScreen extends StatelessWidget { right: 0, child: Center( child: RoundedButtonFill( + borderRadius: 10.r, title: "${controller.dateList[index].discountPer}%".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -372,6 +374,7 @@ class BookTableScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( + borderRadius: 10.r, title: "Book Now".tr, height: 5.5, color: AppThemeData.primary300, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index 9393aa7..d364282 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -11,6 +11,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -105,6 +106,7 @@ class DineInScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( + borderRadius: 10.r, title: "Change Zone".tr, width: 55, height: 5.5, diff --git a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart index 06a0df5..860ed95 100644 --- a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart @@ -7,6 +7,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; @@ -95,6 +96,7 @@ class EditProfileScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( + borderRadius: 10.r, title: "Save Details".tr, height: 5.5, color: AppThemeData.primary300, -- 2.49.1 From 6ad0dd11de8a3c7c6ed159a264f8483980cd1e3f Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Sat, 29 Nov 2025 10:57:31 +0500 Subject: [PATCH 07/30] BASE: Finish UI Of Select Your Vehicle Type Section. --- .../cab_service_screens/cab_booking_screen.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 882918a..8e0abf6 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -471,9 +471,9 @@ class CabBookingScreen extends StatelessWidget { ) { return Positioned.fill( child: DraggableScrollableSheet( - initialChildSize: 0.37, - minChildSize: 0.37, - maxChildSize: 0.37, + initialChildSize: 0.36, + minChildSize: 0.36, + maxChildSize: 0.36, expand: false, builder: (context, scrollController) { return Container( @@ -506,7 +506,7 @@ class CabBookingScreen extends StatelessWidget { Padding( padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), child: Text( - "Select Your Vehicle Type".tr, + "Select Your Vehicle Type", style: AppThemeData.boldTextStyle( fontSize: 18.sp, color: @@ -663,7 +663,7 @@ class CabBookingScreen extends StatelessWidget { }, ), ), - SizedBox(height: 15.h), + SizedBox(height: 30.h), Padding( padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), child: Obx( -- 2.49.1 From 241487501e778b5cb759fbcc176903b40f24d6c4 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Sat, 29 Nov 2025 10:59:33 +0500 Subject: [PATCH 08/30] BASE: Remove Unnecessary Codes & Imports. --- .../cab_service_screens/cab_booking_screen.dart | 13 +++++-------- .../service_home_screen/service_list_screen.dart | 5 +---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 8e0abf6..007f5d8 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -600,7 +600,6 @@ class CabBookingScreen extends StatelessWidget { "(${controller.duration.value})", style: TextStyle( fontWeight: FontWeight.w400, - color: controller .selectedVehicleType @@ -2299,13 +2298,11 @@ class CabBookingScreen extends StatelessWidget { Column( children: [ RoundedButtonBorder( - title: - controller - .driverModel - .value - .averageRating - .toStringAsFixed(1) ?? - '', + title: controller + .driverModel + .value + .averageRating + .toStringAsFixed(1), width: 20, height: 3.5, radius: 10, diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index 62e1d06..c9528bb 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -1,12 +1,9 @@ import 'dart:developer'; - -import 'package:customer/constant/constant.dart'; import 'package:customer/models/section_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../controllers/service_list_controller.dart'; -import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; import '../../utils/network_image_widget.dart'; @@ -15,7 +12,7 @@ class ServiceListScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final themeController = Get.find(); + // final themeController = Get.find(); return GetX( init: ServiceListController(), builder: (controller) { -- 2.49.1 From 2736727592f8fde5345453bbbfa8cd150367dc23 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Sat, 29 Nov 2025 11:54:45 +0500 Subject: [PATCH 09/30] BASE: Update The UI Until The Waiting For Driver Section. --- .../cab_booking_screen.dart | 418 +++++++----------- .../wallet_screen/wallet_screen.dart | 2 +- 2 files changed, 167 insertions(+), 253 deletions(-) diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 007f5d8..96c67b7 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -714,9 +714,9 @@ class CabBookingScreen extends StatelessWidget { ) { return Positioned.fill( child: DraggableScrollableSheet( - initialChildSize: 0.70, - minChildSize: 0.30, - maxChildSize: 0.8, + initialChildSize: 0.5, + minChildSize: 0.5, + maxChildSize: 0.5, expand: false, builder: (context, scrollController) { return Container( @@ -732,13 +732,13 @@ class CabBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "Select Payment Method".tr, - style: AppThemeData.mediumTextStyle( - fontSize: 18, + "Select Payment Method", + style: AppThemeData.boldTextStyle( + fontSize: 18.sp, color: isDark ? AppThemeData.greyDark900 - : AppThemeData.grey900, + : AppThemeData.darkGrey, ), ), GestureDetector( @@ -761,235 +761,146 @@ class CabBookingScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text( - "Preferred Payment".tr, - textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle( - fontSize: 15, - color: - isDark - ? AppThemeData.greyDark500 - : AppThemeData.grey500, + // Text( + // "Preferred Payment".tr, + // textAlign: TextAlign.start, + // style: AppThemeData.boldTextStyle( + // fontSize: 15, + // color: + // isDark + // ? AppThemeData.greyDark500 + // : AppThemeData.grey500, + // ), + // ), + // const SizedBox(height: 10), + // if (controller.walletSettingModel.value.isEnabled == + // true || + // controller + // .cashOnDeliverySettingModel + // .value + // .isEnabled == + // true) + // Container( + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(15), + // color: + // isDark + // ? AppThemeData.greyDark100 + // : AppThemeData.grey50, + // border: Border.all( + // color: + // isDark + // ? AppThemeData.greyDark200 + // : AppThemeData.grey200, + // ), + // ), + // child: Padding( + // padding: const EdgeInsets.all(8.0), + // child: Column( + // children: [ + // Visibility( + // visible: + // controller + // .walletSettingModel + // .value + // .isEnabled == + // true, + // child: cardDecoration( + // controller, + // PaymentGateway.wallet, + // isDark, + // "assets/images/ic_wallet.png", + // ), + // ), + // Visibility( + // visible: + // controller + // .cashOnDeliverySettingModel + // .value + // .isEnabled == + // true, + // child: cardDecoration( + // controller, + // PaymentGateway.cod, + // isDark, + // "assets/images/ic_cash.png", + // ), + // ), + // ], + // ), + // ), + // ), + // if (controller.walletSettingModel.value.isEnabled == + // true || + // controller + // .cashOnDeliverySettingModel + // .value + // .isEnabled == + // true) + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const SizedBox(height: 10), + // Text( + // "Other Payment Options".tr, + // textAlign: TextAlign.start, + // style: AppThemeData.boldTextStyle( + // fontSize: 15, + // color: + // isDark + // ? AppThemeData.greyDark500 + // : AppThemeData.grey500, + // ), + // ), + // const SizedBox(height: 10), + // ], + // ), + Visibility( + visible: + controller.walletSettingModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", ), ), - const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == - true || - controller - .cashOnDeliverySettingModel - .value - .isEnabled == - true) - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - color: - isDark - ? AppThemeData.greyDark100 - : AppThemeData.grey50, - border: Border.all( - color: - isDark - ? AppThemeData.greyDark200 - : AppThemeData.grey200, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Visibility( - visible: - controller - .walletSettingModel - .value - .isEnabled == - true, - child: cardDecoration( - controller, - PaymentGateway.wallet, - isDark, - "assets/images/ic_wallet.png", - ), - ), - Visibility( - visible: - controller - .cashOnDeliverySettingModel - .value - .isEnabled == - true, - child: cardDecoration( - controller, - PaymentGateway.cod, - isDark, - "assets/images/ic_cash.png", - ), - ), - ], - ), - ), + Divider(color: AppThemeData.cardColor, thickness: 1.3.r), + Visibility( + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", ), - if (controller.walletSettingModel.value.isEnabled == - true || - controller - .cashOnDeliverySettingModel - .value - .isEnabled == - true) - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 10), - Text( - "Other Payment Options".tr, - textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle( - fontSize: 15, - color: - isDark - ? AppThemeData.greyDark500 - : AppThemeData.grey500, - ), - ), - const SizedBox(height: 10), - ], + ), + Divider(color: AppThemeData.cardColor, thickness: 1.3.r), + Visibility( + visible: true, + child: cardDecoration( + controller, + PaymentGateway.payme, + isDark, + "assets/images/payme_logo.png", ), - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - color: - isDark - ? AppThemeData.greyDark100 - : AppThemeData.grey50, - border: Border.all( - color: - isDark - ? AppThemeData.greyDark200 - : AppThemeData.grey200, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Visibility( - visible: - controller.stripeModel.value.isEnabled == - true, - child: cardDecoration( - controller, - PaymentGateway.stripe, - isDark, - "assets/images/stripe.png", - ), - ), - Visibility( - visible: - controller.payPalModel.value.isEnabled == - true, - child: cardDecoration( - controller, - PaymentGateway.paypal, - isDark, - "assets/images/paypal.png", - ), - ), - Visibility( - visible: - controller.payStackModel.value.isEnable == - true, - child: cardDecoration( - controller, - PaymentGateway.payStack, - isDark, - "assets/images/paystack.png", - ), - ), - Visibility( - visible: - controller - .mercadoPagoModel - .value - .isEnabled == - true, - child: cardDecoration( - controller, - PaymentGateway.mercadoPago, - isDark, - "assets/images/mercado-pago.png", - ), - ), - Visibility( - visible: - controller - .flutterWaveModel - .value - .isEnable == - true, - child: cardDecoration( - controller, - PaymentGateway.flutterWave, - isDark, - "assets/images/flutterwave_logo.png", - ), - ), - Visibility( - visible: - controller.payFastModel.value.isEnable == - true, - child: cardDecoration( - controller, - PaymentGateway.payFast, - isDark, - "assets/images/payfast.png", - ), - ), - Visibility( - visible: - controller.razorPayModel.value.isEnabled == - true, - child: cardDecoration( - controller, - PaymentGateway.razorpay, - isDark, - "assets/images/razorpay.png", - ), - ), - Visibility( - visible: - controller.midTransModel.value.enable == - true, - child: cardDecoration( - controller, - PaymentGateway.midTrans, - isDark, - "assets/images/midtrans.png", - ), - ), - Visibility( - visible: - controller.orangeMoneyModel.value.enable == - true, - child: cardDecoration( - controller, - PaymentGateway.orangeMoney, - isDark, - "assets/images/orange_money.png", - ), - ), - Visibility( - visible: - controller.xenditModel.value.enable == true, - child: cardDecoration( - controller, - PaymentGateway.xendit, - isDark, - "assets/images/xendit.png", - ), - ), - ], - ), + ), + Divider(color: AppThemeData.cardColor, thickness: 1.3.r), + Visibility( + visible: + // controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.click, + isDark, + "assets/images/click_logo.png", ), ), SizedBox(height: 20), @@ -999,8 +910,8 @@ class CabBookingScreen extends StatelessWidget { RoundedButtonFill( borderRadius: 10.r, title: "Continue".tr, - color: AppThemeData.primary300, - textColor: AppThemeData.grey900, + color: AppThemeData.mainColor, + textColor: AppThemeData.grey50, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { ShowToastDialog.showToast( @@ -1865,9 +1776,9 @@ class CabBookingScreen extends StatelessWidget { isDark, "assets/images/razorpay.png", ), - SizedBox(width: 22), + SizedBox(width: 10.w), Text( - controller.selectedPaymentMethod.value.tr, + controller.selectedPaymentMethod.value == "cod" ? "Наличными" : controller.selectedPaymentMethod.value.tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 16, @@ -1889,8 +1800,8 @@ class CabBookingScreen extends StatelessWidget { onPress: () async { controller.placeOrder(); }, - color: AppThemeData.primary300, - textColor: AppThemeData.grey900, + color: AppThemeData.mainColor, + textColor: AppThemeData.grey50, ), ], ), @@ -1942,16 +1853,19 @@ class CabBookingScreen extends StatelessWidget { SizedBox(height: 30), Text( "Waiting for driver....".tr, - style: AppThemeData.mediumTextStyle( - fontSize: 18, - color: AppThemeData.grey900, - ), + style: AppThemeData.boldTextStyle( + fontSize: 18.sp, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.darkGrey, + ), ), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( borderRadius: 10.r, title: "Cancel Ride".tr, - color: AppThemeData.danger300, + color: AppThemeData.mainColor, textColor: AppThemeData.surface, onPress: () async { try { @@ -3021,8 +2935,8 @@ class CabBookingScreen extends StatelessWidget { child: Row( children: [ Container( - width: 50, - height: 50, + width: 42.r, + height: 42.r, decoration: ShapeDecoration( shape: RoundedRectangleBorder( side: const BorderSide( @@ -3032,7 +2946,7 @@ class CabBookingScreen extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), ), - child: Padding( + child: value == PaymentGateway.click || value == PaymentGateway.payme ? Image.asset(image) : Padding( padding: EdgeInsets.all( value.name == "payFast" ? 0 : 8.0, ), @@ -3070,11 +2984,11 @@ class CabBookingScreen extends StatelessWidget { ), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( - fontSize: 14, + fontSize: 12.sp, color: isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, + ? AppThemeData.mainColor + : AppThemeData.mainColor, ), ), ], @@ -3082,7 +2996,7 @@ class CabBookingScreen extends StatelessWidget { ) : Expanded( child: Text( - value.name.capitalizeString(), + value.name == "cod" ? "Наличными" : value.name.capitalizeString(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( fontSize: 16, @@ -3099,8 +3013,8 @@ class CabBookingScreen extends StatelessWidget { groupValue: controller.selectedPaymentMethod.value, activeColor: isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, + ? AppThemeData.mainColor + : AppThemeData.mainColor, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart index be02e11..0c2af9d 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart @@ -266,4 +266,4 @@ class WalletScreen extends StatelessWidget { } } -enum PaymentGateway { payFast, mercadoPago, paypal, stripe, flutterWave, payStack, razorpay, cod, wallet, midTrans, orangeMoney, xendit } +enum PaymentGateway {payme, click, payFast, mercadoPago, paypal, stripe, flutterWave, payStack, razorpay, cod, wallet, midTrans, orangeMoney, xendit } -- 2.49.1 From 3e18352abeef4ad83a9a2007e370aa672ae1b620 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 15:25:19 +0500 Subject: [PATCH 10/30] BASE: Imlement Localization In Auth. --- android/app/build.gradle.kts | 24 +- android/app/google-services.json | 4 +- android/app/src/main/AndroidManifest.xml | 8 +- .../kotlin/com/emart/customer/MainActivity.kt | 2 +- assets/translations/en_En.json | 50 + ios/Runner.xcodeproj/project.pbxproj | 12 +- ios/Runner/GoogleService-Info.plist | 2 +- lib/constant/const_texts.dart | 39 + .../parcel_order_confirmation_controller.dart | 418 ++- lib/firebase_options.dart | 19 +- .../auth_screens/forgot_password_screen.dart | 17 +- lib/screen_ui/auth_screens/login_screen.dart | 32 +- .../auth_screens/mobile_login_screen.dart | 21 +- .../auth_screens/otp_verification_screen.dart | 14 +- .../auth_screens/sign_up_screen.dart | 247 +- .../cab_booking_screen.dart | 48 +- .../dine_in_screeen/dine_in_screen.dart | 794 +++++- .../home_screen/home_screen.dart | 2463 ++++++++++++++--- .../live_tracking_screen.dart | 2 +- lib/service/fire_store_utils.dart | 6 +- lib/themes/text_field_widget.dart | 3 +- lib/widget/osm_map/map_picker_page.dart | 5 +- pubspec.lock | 45 + pubspec.yaml | 4 +- 24 files changed, 3484 insertions(+), 795 deletions(-) create mode 100644 assets/translations/en_En.json create mode 100644 lib/constant/const_texts.dart diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 43024b7..c49ad18 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,3 +1,6 @@ +import java.util.Properties +import java.io.FileInputStream + plugins { id("com.android.application") // START: FlutterFire Configuration @@ -8,8 +11,14 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + android { - namespace = "com.emart.customer" + namespace = "felix.fondex.uz" compileSdk = 36 ndkVersion = flutter.ndkVersion @@ -25,7 +34,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.emart.customer" + applicationId = "felix.fondex.uz" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = 26 @@ -34,11 +43,20 @@ android { versionName = flutter.versionName } + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = keystoreProperties["storeFile"]?.let { file(it) } + storePassword = keystoreProperties["storePassword"] as String + } + } + buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + signingConfig = signingConfigs.getByName("release") isMinifyEnabled = false isShrinkResources = false } diff --git a/android/app/google-services.json b/android/app/google-services.json index 4d10887..869b8c5 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -10,7 +10,7 @@ "client_info": { "mobilesdk_app_id": "1:893074789710:android:05002c15a64cf1e0c4ba1f", "android_client_info": { - "package_name": "com.emart.customer" + "package_name": "felix.fondex.uz" } }, "oauth_client": [ @@ -35,7 +35,7 @@ "client_id": "893074789710-pv12m4nhe82a4ueg9sb2pgt42r0e5da3.apps.googleusercontent.com", "client_type": 2, "ios_info": { - "bundle_id": "com.emart.customer" + "bundle_id": "felix.fondex.uz" } } ] diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 305ac58..8e567a0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ - + @@ -53,7 +53,7 @@ + android:scheme="felix.fondex.uz" /> @@ -102,7 +102,7 @@ + android:scheme="felix.fondex.uz" /> diff --git a/android/app/src/main/kotlin/com/emart/customer/MainActivity.kt b/android/app/src/main/kotlin/com/emart/customer/MainActivity.kt index 21c78d3..af32cc7 100644 --- a/android/app/src/main/kotlin/com/emart/customer/MainActivity.kt +++ b/android/app/src/main/kotlin/com/emart/customer/MainActivity.kt @@ -1,4 +1,4 @@ -package com.emart.customer +package felix.fondex.uz import io.flutter.embedding.android.FlutterFragmentActivity diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json new file mode 100644 index 0000000..0bb5a6f --- /dev/null +++ b/assets/translations/en_En.json @@ -0,0 +1,50 @@ +{ + "loginToExplore" : "Log in to explore your all in one vendor app favourites and shop effortlessly.", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in", + "orContinueWith": "or continue with", + + + "withGoogle": "with Google", + "withApple": "with Apple", + "dontHaveAccount": "Didn't have an account?", + "signUp": "Sign up", + "skip": "Skip", + "signUpToExplore": "Sign up to explore all our services and start shopping, riding, and more.", + "firstName": "First Name*", + "lastName": "Last Name*", + "enterMobileNumber": "Enter Mobile number", + "confirmPassword": "Confirm Password*", + "enterConfirmPassword": "Enter confirm password", + "referralCode": "Referral Code", + "enterReferralCode": "Enter referral code", + "alreadyHaveAccount":"Already have an account?", + "enterYourregisteredEmail": "Enter your registered email to receive a reset link.", + "sendLink": "Send Link", + "rememberPassword": "Remember Password?", + "enterOtpSent": "Enter the OTP sent to your mobile", + "resendOTP": "Resend OTP", + "verify": "Verify", + "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", + "sendCode":"Send Code", + "forgotPassword": "Forgot Password", + "login": "Log in", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in" +} \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 844309b..a4e69a6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -504,7 +504,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.emart.customer; + PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -521,7 +521,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.emart.customer.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -539,7 +539,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.emart.customer.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -555,7 +555,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.emart.customer.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uzRunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -691,7 +691,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.emart.customer; + PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -716,7 +716,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.emart.customer; + PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist index 59544f2..9ddcbab 100644 --- a/ios/Runner/GoogleService-Info.plist +++ b/ios/Runner/GoogleService-Info.plist @@ -13,7 +13,7 @@ PLIST_VERSION 1 BUNDLE_ID - com.emart.customer + felix.fondex.uz PROJECT_ID fondexuzb STORAGE_BUCKET diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart new file mode 100644 index 0000000..13a93fb --- /dev/null +++ b/lib/constant/const_texts.dart @@ -0,0 +1,39 @@ +class ConstTexts { + static String loginToExplore = "logintoExplore"; + static String emailAddress = "emailAddress"; + static String password = "password"; + static String enterPassword = "enterPassword"; + static String forgotPassword = "forgotPassword"; + static String login = "login"; + static String orContinueWith = "orContinueWith"; + static String mobileNumber = "mobileNumber"; + static String withGoogle = "withGoogle"; + static String withApple = "withApple"; + static String dontHaveAccount = "dontHaveAccount"; + static String signUp = "signUp"; + static String skip = "skip"; + static String signUpToExplore = "signUpToExplore"; + static String firstName = "firstName"; + static String lastName = "lastName"; + static String enterMobileNumber = "enterMobileNumber"; + static String confirmPassword = "confirmPassword"; + static String enterConfirmPassword = "enterConfirmPassword"; + static String referralCode = "referralCode"; + static String enterReferralCode = "enterReferralCode"; + static String alreadyHaveAccount = "alreadyHaveAccount"; + static String enterYourregisteredEmail = "enterYourregisteredEmail"; + static String sendLink = "sendLink"; + static String rememberPassword = "rememberPassword"; + static String enterOtpSent = "enterOtpSent"; + static String resendOTP = "resendOTP"; + static String verify = "verify"; + static String useYourMobileNumber = "useYourMobileNumber"; + static String sendCode = "sendCode"; + static String loginToExplore = "logintoExplore"; + static String emailAddress = "emailAddress"; + static String password = "password"; + static String loginToExplore = "logintoExplore"; + static String emailAddress = "emailAddress"; + static String password = "password"; + +} diff --git a/lib/controllers/parcel_order_confirmation_controller.dart b/lib/controllers/parcel_order_confirmation_controller.dart index 7c61e0b..a8d1506 100644 --- a/lib/controllers/parcel_order_confirmation_controller.dart +++ b/lib/controllers/parcel_order_confirmation_controller.dart @@ -96,11 +96,19 @@ class ParcelOrderConfirmationController extends GetxController { subTotal.value = double.tryParse(parcelOrder.value.subTotal ?? '0') ?? 0.0; if (selectedCouponModel.value.id != null) { - discount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + discount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } for (var element in Constant.taxList) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } print("Tax: ${taxAmount.value}"); @@ -133,25 +141,40 @@ class ParcelOrderConfirmationController extends GetxController { List parcelImages = []; if (images.isNotEmpty) { for (var image in images) { - final upload = await FireStoreUtils.uploadChatImageToFireStorage(File(image.path), Get.context!); + final upload = await FireStoreUtils.uploadChatImageToFireStorage( + File(image.path), + Get.context!, + ); parcelImages.add(upload.url); } } parcelOrder.value.parcelImages = parcelImages; parcelOrder.value.discount = discount.value.toString(); - parcelOrder.value.discountType = selectedCouponModel.value.discountType.toString(); - parcelOrder.value.discountLabel = selectedCouponModel.value.code.toString(); - parcelOrder.value.adminCommission = Constant.sectionConstantModel?.adminCommision?.amount?.toString(); - parcelOrder.value.adminCommissionType = Constant.sectionConstantModel?.adminCommision?.commissionType; + parcelOrder.value.discountType = + selectedCouponModel.value.discountType.toString(); + parcelOrder.value.discountLabel = + selectedCouponModel.value.code.toString(); + parcelOrder.value.adminCommission = + Constant.sectionConstantModel?.adminCommision?.amount?.toString(); + parcelOrder.value.adminCommissionType = + Constant.sectionConstantModel?.adminCommision?.commissionType; parcelOrder.value.status = Constant.orderPlaced; parcelOrder.value.createdAt = Timestamp.now(); parcelOrder.value.author = userModel.value; parcelOrder.value.authorID = FireStoreUtils.getCurrentUid(); - parcelOrder.value.paymentMethod = paymentBy.value == "Receiver" ? "cod" : selectedPaymentMethod.value; - parcelOrder.value.paymentCollectByReceiver = paymentBy.value == "Receiver"; - parcelOrder.value.senderZoneId = Constant.getZoneId(parcelOrder.value.senderLatLong!.latitude ?? 0.0, parcelOrder.value.senderLatLong!.longitude ?? 0.0); - parcelOrder.value.receiverZoneId = Constant.getZoneId(parcelOrder.value.receiverLatLong!.latitude ?? 0.0, parcelOrder.value.receiverLatLong!.longitude ?? 0.0); + parcelOrder.value.paymentMethod = + paymentBy.value == "Receiver" ? "cod" : selectedPaymentMethod.value; + parcelOrder.value.paymentCollectByReceiver = + paymentBy.value == "Receiver"; + parcelOrder.value.senderZoneId = Constant.getZoneId( + parcelOrder.value.senderLatLong!.latitude ?? 0.0, + parcelOrder.value.senderLatLong!.longitude ?? 0.0, + ); + parcelOrder.value.receiverZoneId = Constant.getZoneId( + parcelOrder.value.receiverLatLong!.latitude ?? 0.0, + parcelOrder.value.receiverLatLong!.longitude ?? 0.0, + ); if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { WalletTransactionModel transactionModel = WalletTransactionModel( @@ -168,16 +191,26 @@ class ParcelOrderConfirmationController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } - await FireStoreUtils.parcelOrderPlace(parcelOrder.value).then((value) async { + await FireStoreUtils.parcelOrderPlace(parcelOrder.value).then(( + value, + ) async { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Order placed successfully".tr); - Get.offAll(() => OrderSuccessfullyPlaced(), arguments: {'parcelOrder': parcelOrder.value}); + Get.offAll( + () => OrderSuccessfullyPlaced(), + arguments: {'parcelOrder': parcelOrder.value}, + ); await FireStoreUtils.sendParcelBookEmail(orderModel: parcelOrder.value); }); } catch (e) { @@ -203,19 +236,45 @@ class ParcelOrderConfirmationController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -257,20 +316,32 @@ class ParcelOrderConfirmationController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr, + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -316,7 +387,10 @@ class ParcelOrderConfirmationController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -326,8 +400,14 @@ class ParcelOrderConfirmationController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -340,12 +420,20 @@ class ParcelOrderConfirmationController extends GetxController { }, ], "payer": {"email": Constant.userModel?.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -375,8 +463,8 @@ class ParcelOrderConfirmationController extends GetxController { sandboxMode: payPalModel.value.isLive == true ? false : true, clientId: payPalModel.value.paypalClient ?? '', secretKey: payPalModel.value.paypalSecret ?? '', - returnURL: "com.emart.customer://paypalpay", - cancelURL: "com.emart.customer://paypalcancel", + returnURL: "felix.fondex.uz://paypalpay", + cancelURL: "felix.fondex.uz://paypalcancel", transactions: [ { @@ -418,8 +506,8 @@ class ParcelOrderConfirmationController extends GetxController { // secretKey: payPalModel.value.paypalSecret ?? '', // returnURL: "https://success.emart.com/return", // cancelURL: "https://cancel.emart.com/cancel", - // // returnURL: "com.emart.customer://paypalpay", - // // cancelURL: "com.emart.customer://paypalpay", + // // returnURL: "felix.fondex.uz://paypalpay", + // // cancelURL: "felix.fondex.uz://paypalpay", // transactions: [ // { // "amount": { @@ -477,17 +565,25 @@ class ParcelOrderConfirmationController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr, + ); } }); } ///flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { setRef(); // make sure you generate reference final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -495,8 +591,15 @@ class ParcelOrderConfirmationController extends GetxController { "currency": "NGN", "redirect_url": "${Constant.globalUrl}payment/success", "payment_options": "ussd, card, barter, payattitude", - "customer": {"email": Constant.userModel?.email.toString(), "phonenumber": Constant.userModel?.phoneNumber, "name": Constant.userModel?.fullName()}, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customer": { + "email": Constant.userModel?.email.toString(), + "phonenumber": Constant.userModel?.phoneNumber, + "name": Constant.userModel?.fullName(), + }, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); @@ -504,7 +607,9 @@ class ParcelOrderConfirmationController extends GetxController { if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) async { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) async { bool isVerified = await verifyFlutterWavePayment(_ref!); if (isVerified) { @@ -522,13 +627,19 @@ class ParcelOrderConfirmationController extends GetxController { Future verifyFlutterWavePayment(String txRef) async { try { - final url = Uri.parse("https://api.flutterwave.com/v3/transactions/verify_by_reference?tx_ref=$txRef"); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final url = Uri.parse( + "https://api.flutterwave.com/v3/transactions/verify_by_reference?tx_ref=$txRef", + ); + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final response = await http.get(url, headers: headers); if (response.statusCode == 200) { final data = jsonDecode(response.body); - if (data['status'] == 'success' && data['data']['status'] == 'successful') { + if (data['status'] == 'success' && + data['data']['status'] == 'successful') { return true; // ✅ Payment confirmed } } @@ -554,8 +665,14 @@ class ParcelOrderConfirmationController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: Constant.userModel!, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr); @@ -576,26 +693,50 @@ class ParcelOrderConfirmationController extends GetxController { final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString()}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + }, ); final data = jsonDecode(response.body); - await verifyCheckSum(checkSum: data["code"], amount: amount, orderId: orderId).then((value) { + await verifyCheckSum( + checkSum: data["code"], + amount: amount, + orderId: orderId, + ).then((value) { initiatePayment(amount: amount, orderId: orderId).then((value) { String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } GetPaymentTxtTokenModel result = value; - startTransaction(context, txnTokenBy: result.body.txnToken ?? '', orderId: orderId, amount: amount, callBackURL: callback, isStaging: paytmModel.value.isSandboxEnabled); + startTransaction( + context, + txnTokenBy: result.body.txnToken ?? '', + orderId: orderId, + amount: amount, + callBackURL: callback, + isStaging: paytmModel.value.isSandboxEnabled, + ); }); }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -631,28 +772,44 @@ class ParcelOrderConfirmationController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required String orderId}) async { + Future initiatePayment({ + required double amount, + required String orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = - (paytmModel.value.isSandboxEnabled ?? false) ? "https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId" : "https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + (paytmModel.value.isSandboxEnabled ?? false) + ? "https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId" + : "https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; print("INITIATE PAYMENT CALL:"); print("MID: ${paytmModel.value.paytmMID}"); print("OrderId: $orderId"); print("Amount: $amount"); - print("Env: ${(paytmModel.value.isSandboxEnabled ?? false) ? "STAGING" : "LIVE"}"); + print( + "Env: ${(paytmModel.value.isSandboxEnabled ?? false) ? "STAGING" : "LIVE"}", + ); final response = await http.post( Uri.parse(initiateURL), @@ -671,9 +828,12 @@ class ParcelOrderConfirmationController extends GetxController { log("Paytm Initiate Response: ${response.body}"); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr, + ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -723,7 +883,10 @@ class ParcelOrderConfirmationController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': Constant.userModel?.phoneNumber, 'email': Constant.userModel?.email}, + 'prefill': { + 'contact': Constant.userModel?.phoneNumber, + 'email': Constant.userModel?.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -758,7 +921,10 @@ class ParcelOrderConfirmationController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -776,15 +942,30 @@ class ParcelOrderConfirmationController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -792,7 +973,9 @@ class ParcelOrderConfirmationController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr, + ); return ''; } } @@ -809,7 +992,10 @@ class ParcelOrderConfirmationController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); debugPrint('🟩 Starting OrangePay Payment...'); @@ -817,14 +1003,28 @@ class ParcelOrderConfirmationController extends GetxController { ShowToastDialog.showLoader("Initializing payment...".tr); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString().isNotEmpty) { debugPrint('✅ Payment URL fetched successfully: $paymentURL'); - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))?.then((value) async { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )?.then((value) async { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr); debugPrint('🎉 Payment Successful for Order ID: $orderId'); @@ -844,16 +1044,27 @@ class ParcelOrderConfirmationController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { const String apiUrl = 'https://api.orange.com/oauth/v3/token'; - final Map requestBody = {'grant_type': 'client_credentials'}; + final Map requestBody = { + 'grant_type': 'client_credentials', + }; debugPrint('🔐 Fetching access token from Orange API...'); debugPrint('📡 POST $apiUrl'); final response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -865,19 +1076,34 @@ class ParcelOrderConfirmationController extends GetxController { accessToken = responseData['access_token']; debugPrint('✅ Access Token Received: $accessToken'); - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { debugPrint('❌ Failed to fetch access token.'); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr, + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; // ✅ Ensure amount formatted correctly String formattedAmount = double.parse(amountData).toStringAsFixed(2); @@ -900,7 +1126,11 @@ class ParcelOrderConfirmationController extends GetxController { final response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -920,7 +1150,9 @@ class ParcelOrderConfirmationController extends GetxController { } } else { debugPrint('❌ Payment request failed.'); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr, + ); return ''; } } @@ -938,7 +1170,13 @@ class ParcelOrderConfirmationController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); @@ -955,7 +1193,9 @@ class ParcelOrderConfirmationController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -968,7 +1208,11 @@ class ParcelOrderConfirmationController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart index f77a606..4df3f6e 100644 --- a/lib/firebase_options.dart +++ b/lib/firebase_options.dart @@ -1,7 +1,8 @@ // File generated by FlutterFire CLI. // ignore_for_file: type=lint import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; -import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb, TargetPlatform; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; /// Default [FirebaseOptions] for use with your Firebase apps. /// @@ -18,7 +19,7 @@ class DefaultFirebaseOptions { if (kIsWeb) { throw UnsupportedError( 'DefaultFirebaseOptions have not been configured for web - ' - 'you can reconfigure this by running the FlutterFire CLI again.', + 'you can reconfigure this by running the FlutterFire CLI again.', ); } switch (defaultTargetPlatform) { @@ -29,17 +30,17 @@ class DefaultFirebaseOptions { case TargetPlatform.macOS: throw UnsupportedError( 'DefaultFirebaseOptions have not been configured for macos - ' - 'you can reconfigure this by running the FlutterFire CLI again.', + 'you can reconfigure this by running the FlutterFire CLI again.', ); case TargetPlatform.windows: throw UnsupportedError( 'DefaultFirebaseOptions have not been configured for windows - ' - 'you can reconfigure this by running the FlutterFire CLI again.', + 'you can reconfigure this by running the FlutterFire CLI again.', ); case TargetPlatform.linux: throw UnsupportedError( 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', + 'you can reconfigure this by running the FlutterFire CLI again.', ); default: throw UnsupportedError( @@ -64,8 +65,8 @@ class DefaultFirebaseOptions { projectId: 'fondexuzb', databaseURL: 'https://fondexuzb-default-rtdb.firebaseio.com', storageBucket: 'fondexuzb.firebasestorage.app', - iosClientId: '893074789710-pv12m4nhe82a4ueg9sb2pgt42r0e5da3.apps.googleusercontent.com', - iosBundleId: 'com.emart.customer', + iosClientId: + '893074789710-pv12m4nhe82a4ueg9sb2pgt42r0e5da3.apps.googleusercontent.com', + iosBundleId: 'felix.fondex.uz', ); - -} \ No newline at end of file +} diff --git a/lib/screen_ui/auth_screens/forgot_password_screen.dart b/lib/screen_ui/auth_screens/forgot_password_screen.dart index aaa3e0d..894fed1 100644 --- a/lib/screen_ui/auth_screens/forgot_password_screen.dart +++ b/lib/screen_ui/auth_screens/forgot_password_screen.dart @@ -1,3 +1,5 @@ +import 'package:customer/constant/const_texts.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -36,7 +38,7 @@ class ForgotPasswordScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - "Skip".tr, + ConstTexts.skip.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -72,8 +74,7 @@ class ForgotPasswordScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Enter your registered email to receive a reset link." - .tr, + ConstTexts.enterYourregisteredEmail.tr(), style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -84,14 +85,14 @@ class ForgotPasswordScreen extends StatelessWidget { ), const SizedBox(height: 24), TextFieldWidget( - title: "Email Address*".tr, - hintText: "jerome014@gmail.com", + title: ConstTexts.emailAddress.tr(), + hintText: "abdusalom@gmail.com", controller: controller.emailEditingController.value, ), const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: "Send Link".tr, + title: ConstTexts.sendLink.tr(), onPress: controller.forgotPassword, color: isDark @@ -111,7 +112,7 @@ class ForgotPasswordScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "Remember Password?".tr, + text: ConstTexts.rememberPassword.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -120,7 +121,7 @@ class ForgotPasswordScreen extends StatelessWidget { ), children: [ TextSpan( - text: "Log in".tr, + text: ConstTexts.login.tr(), style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, diff --git a/lib/screen_ui/auth_screens/login_screen.dart b/lib/screen_ui/auth_screens/login_screen.dart index cd5c7fe..24e3116 100644 --- a/lib/screen_ui/auth_screens/login_screen.dart +++ b/lib/screen_ui/auth_screens/login_screen.dart @@ -1,7 +1,9 @@ import 'dart:io'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -36,7 +38,7 @@ class LoginScreen extends StatelessWidget { child: Row( children: [ Text( - "Skip".tr, + ConstTexts.skip.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -70,8 +72,8 @@ class LoginScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Log in to explore your all in one vendor app favourites and shop effortlessly." - .tr, + ConstTexts.loginToExplore.tr() + , style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -82,15 +84,15 @@ class LoginScreen extends StatelessWidget { ), const SizedBox(height: 24), TextFieldWidget( - title: "Email Address*".tr, - hintText: "jerome014@gmail.com", + title: ConstTexts.emailAddress.tr(), + hintText: "abdusalom@gmail.com", controller: controller.emailController.value, focusNode: controller.emailFocusNode, ), const SizedBox(height: 15), TextFieldWidget( - title: "Password*".tr, - hintText: "Enter password".tr, + title: ConstTexts.password.tr(), + hintText: ConstTexts.enterPassword.tr(), controller: controller.passwordController.value, obscureText: controller.passwordVisible.value, focusNode: controller.passwordFocusNode, @@ -132,7 +134,7 @@ class LoginScreen extends StatelessWidget { () => const ForgotPasswordScreen(), ), child: Text( - "Forgot Password".tr, + ConstTexts.forgotPassword.tr(), style: AppThemeData.semiBoldTextStyle( color: AppThemeData.info400, ), @@ -142,7 +144,7 @@ class LoginScreen extends StatelessWidget { const SizedBox(height: 20), RoundedButtonFill( borderRadius: 10.r, - title: "Log in".tr, + title: ConstTexts.login.tr(), onPress: controller.loginWithEmail, color: isDark @@ -167,7 +169,7 @@ class LoginScreen extends StatelessWidget { ), const SizedBox(width: 15), Text( - "or continue with".tr, + ConstTexts.orContinueWith.tr(), style: AppThemeData.regularTextStyle( color: isDark @@ -191,7 +193,7 @@ class LoginScreen extends StatelessWidget { const SizedBox(height: 25), RoundedButtonFill( borderRadius: 10.r, - title: "Mobile number".tr, + title: ConstTexts.mobileNumber.tr(), onPress: () => Get.to(() => const MobileLoginScreen()), isRight: false, @@ -217,7 +219,7 @@ class LoginScreen extends StatelessWidget { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "with Google".tr, + title: ConstTexts.withGoogle.tr(), textColor: isDark ? AppThemeData.grey100 @@ -241,7 +243,7 @@ class LoginScreen extends StatelessWidget { ? Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "with Apple".tr, + title: ConstTexts.withApple.tr(), isCenter: true, textColor: isDark @@ -272,7 +274,7 @@ class LoginScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "Didn't have an account?".tr, + text: ConstTexts.dontHaveAccount.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -281,7 +283,7 @@ class LoginScreen extends StatelessWidget { ), children: [ TextSpan( - text: "Sign up".tr, + text: ConstTexts.signUp.tr(), style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, diff --git a/lib/screen_ui/auth_screens/mobile_login_screen.dart b/lib/screen_ui/auth_screens/mobile_login_screen.dart index d7587d0..9d1164c 100644 --- a/lib/screen_ui/auth_screens/mobile_login_screen.dart +++ b/lib/screen_ui/auth_screens/mobile_login_screen.dart @@ -1,6 +1,8 @@ import 'package:country_code_picker/country_code_picker.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -53,7 +55,7 @@ class MobileLoginScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - "Skip".tr, + ConstTexts.skip.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -89,8 +91,7 @@ class MobileLoginScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Use your mobile number to Log in easily and securely." - .tr, + ConstTexts.useYourMobileNumber.tr(), style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -101,8 +102,8 @@ class MobileLoginScreen extends StatelessWidget { ), const SizedBox(height: 25), TextFieldWidget( - title: "Mobile Number*".tr, - hintText: "Enter Mobile number".tr, + title: ConstTexts.mobileNumber.tr(), + hintText: ConstTexts.enterMobileNumber.tr(), controller: controller.mobileController.value, textInputType: const TextInputType.numberWithOptions( @@ -181,7 +182,7 @@ class MobileLoginScreen extends StatelessWidget { const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: "Send Code".tr, + title: ConstTexts.sendCode.tr(), onPress: controller.sendOtp, color: isDark @@ -206,7 +207,7 @@ class MobileLoginScreen extends StatelessWidget { ), const SizedBox(width: 15), Text( - "or continue with".tr, + ConstTexts.orContinueWith.tr(), style: AppThemeData.regularTextStyle( color: isDark @@ -228,7 +229,7 @@ class MobileLoginScreen extends StatelessWidget { const SizedBox(height: 25), RoundedButtonFill( borderRadius: 10.r, - title: "Email address".tr, + title: ConstTexts.emailAddress.tr(), onPress: () => Get.to(() => const SignUpScreen()), isRight: false, isCenter: true, @@ -256,7 +257,7 @@ class MobileLoginScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "Didn't have an account?".tr, + text: ConstTexts.dontHaveAccount.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -265,7 +266,7 @@ class MobileLoginScreen extends StatelessWidget { ), children: [ TextSpan( - text: "Sign up".tr, + text: ConstTexts.signUp.tr(), style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, diff --git a/lib/screen_ui/auth_screens/otp_verification_screen.dart b/lib/screen_ui/auth_screens/otp_verification_screen.dart index 1fc9c7f..7a62a97 100644 --- a/lib/screen_ui/auth_screens/otp_verification_screen.dart +++ b/lib/screen_ui/auth_screens/otp_verification_screen.dart @@ -1,4 +1,6 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -49,7 +51,7 @@ class OtpVerificationScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - "Skip".tr, + ConstTexts.skip.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -85,7 +87,7 @@ class OtpVerificationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${"Enter the OTP sent to your mobile".tr} ${controller.countryCode} ${controller.maskPhoneNumber(controller.phoneNumber.value)}", + "${ConstTexts.enterOtpSent.tr()} ${controller.countryCode} ${controller.maskPhoneNumber(controller.phoneNumber.value)}", style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -163,7 +165,7 @@ class OtpVerificationScreen extends StatelessWidget { controller.sendOTP(); }, child: Text( - "Resend OTP".tr, + ConstTexts.resendOTP.tr(), style: AppThemeData.semiBoldTextStyle( color: AppThemeData.info400, fontSize: 16, @@ -178,7 +180,7 @@ class OtpVerificationScreen extends StatelessWidget { /// Verify Button RoundedButtonFill( borderRadius: 10.r, - title: "Verify".tr, + title: ConstTexts.verify.tr(), onPress: controller.verifyOtp, color: isDark @@ -198,7 +200,7 @@ class OtpVerificationScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "Didn't have an account?".tr, + text: ConstTexts.dontHaveAccount.tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -207,7 +209,7 @@ class OtpVerificationScreen extends StatelessWidget { ), children: [ TextSpan( - text: "Sign up".tr, + text: ConstTexts.signUp.tr(), style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, diff --git a/lib/screen_ui/auth_screens/sign_up_screen.dart b/lib/screen_ui/auth_screens/sign_up_screen.dart index d26b0ce..51fc91c 100644 --- a/lib/screen_ui/auth_screens/sign_up_screen.dart +++ b/lib/screen_ui/auth_screens/sign_up_screen.dart @@ -1,5 +1,7 @@ import 'package:country_code_picker/country_code_picker.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -34,14 +36,33 @@ class SignUpScreen extends StatelessWidget { onPressed: () { Get.to(() => LocationPermissionScreen()); }, - style: TextButton.styleFrom(padding: const EdgeInsets.symmetric(horizontal: 12), minimumSize: const Size(0, 40), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(horizontal: 12), + minimumSize: const Size(0, 40), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text("Skip".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.skip.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), Padding( padding: const EdgeInsets.only(top: 2), - child: Icon(Icons.arrow_forward_ios, size: 16, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + child: Icon( + Icons.arrow_forward_ios, + size: 16, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), ], ), @@ -57,62 +78,125 @@ class SignUpScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Sign up to explore all our services and start shopping, riding, and more.".tr, - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.signUpToExplore.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(height: 24), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded(child: TextFieldWidget(title: "First Name*".tr, hintText: "Jerome".tr, controller: controller.firstNameController.value)), + Expanded( + child: TextFieldWidget( + title: ConstTexts.firstName.tr(), + hintText: "Abdusalom", + controller: controller.firstNameController.value, + ), + ), const SizedBox(width: 10), - Expanded(child: TextFieldWidget(title: "Last Name*".tr, hintText: "Bell".tr, controller: controller.lastNameController.value)), + Expanded( + child: TextFieldWidget( + title: ConstTexts.lastName.tr(), + hintText: "G'ayratov", + controller: controller.lastNameController.value, + ), + ), ], ), const SizedBox(height: 15), TextFieldWidget( - title: "Email Address*".tr, - hintText: "jerome014@gmail.com", + title: ConstTexts.emailAddress.tr(), + hintText: "abdusalom@gmail.com", controller: controller.emailController.value, focusNode: controller.emailFocusNode, ), const SizedBox(height: 15), TextFieldWidget( - title: "Mobile Number*".tr, - hintText: "Enter Mobile number".tr, - enable: controller.type.value == "mobileNumber" ? false : true, + title: ConstTexts.mobileNumber.tr(), + hintText: ConstTexts.enterMobileNumber.tr(), + enable: + controller.type.value == "mobileNumber" + ? false + : true, controller: controller.mobileController.value, - textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), + textInputType: const TextInputType.numberWithOptions( + signed: true, + decimal: true, + ), textInputAction: TextInputAction.done, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]')), LengthLimitingTextInputFormatter(10)], + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + LengthLimitingTextInputFormatter(10), + ], prefix: Row( mainAxisSize: MainAxisSize.min, children: [ CountryCodePicker( onChanged: (value) { - controller.countryCodeController.value.text = value.dialCode ?? Constant.defaultCountryCode; + controller.countryCodeController.value.text = + value.dialCode ?? Constant.defaultCountryCode; }, - initialSelection: controller.countryCodeController.value.text.isNotEmpty ? controller.countryCodeController.value.text : Constant.defaultCountryCode, + initialSelection: + controller + .countryCodeController + .value + .text + .isNotEmpty + ? controller + .countryCodeController + .value + .text + : Constant.defaultCountryCode, showCountryOnly: false, showOnlyCountryWhenClosed: false, alignLeft: false, enabled: controller.type.value != "mobileNumber", - textStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : Colors.black), - dialogTextStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - searchStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - dialogBackgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + textStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : Colors.black, + ), + dialogTextStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + searchStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + dialogBackgroundColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, padding: EdgeInsets.zero, ), // const Icon(Icons.keyboard_arrow_down_rounded, size: 24, color: AppThemeData.grey400), - Container(height: 24, width: 1, color: AppThemeData.grey400), + Container( + height: 24, + width: 1, + color: AppThemeData.grey400, + ), const SizedBox(width: 4), ], ), ), const SizedBox(height: 15), TextFieldWidget( - title: "Password*".tr, - hintText: "Enter password".tr, + title: ConstTexts.password.tr(), + hintText: ConstTexts.enterPassword.tr(), controller: controller.passwordController.value, obscureText: controller.passwordVisible.value, focusNode: controller.passwordFocusNode, @@ -120,78 +204,142 @@ class SignUpScreen extends StatelessWidget { padding: const EdgeInsets.all(12), child: InkWell( onTap: () { - controller.passwordVisible.value = !controller.passwordVisible.value; + controller.passwordVisible.value = + !controller.passwordVisible.value; }, child: controller.passwordVisible.value ? SvgPicture.asset( "assets/icons/ic_password_show.svg", - colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + BlendMode.srcIn, + ), ) : SvgPicture.asset( "assets/icons/ic_password_close.svg", - colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + BlendMode.srcIn, + ), ), ), ), ), const SizedBox(height: 15), TextFieldWidget( - title: "Confirm Password*".tr, - hintText: "Enter confirm password".tr, + title: ConstTexts.confirmPassword.tr(), + hintText: ConstTexts.enterConfirmPassword.tr(), controller: controller.confirmPasswordController.value, obscureText: controller.conformPasswordVisible.value, suffix: Padding( padding: const EdgeInsets.all(12), child: InkWell( onTap: () { - controller.conformPasswordVisible.value = !controller.conformPasswordVisible.value; + controller.conformPasswordVisible.value = + !controller.conformPasswordVisible.value; }, child: controller.conformPasswordVisible.value ? SvgPicture.asset( "assets/icons/ic_password_show.svg", - colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + BlendMode.srcIn, + ), ) : SvgPicture.asset( "assets/icons/ic_password_close.svg", - colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + BlendMode.srcIn, + ), ), ), ), ), const SizedBox(height: 15), - TextFieldWidget(title: "Referral Code".tr, hintText: "Enter referral code".tr, controller: controller.referralController.value), + TextFieldWidget( + title: ConstTexts.referralCode.tr(), + hintText: ConstTexts.enterReferralCode.tr(), + controller: controller.referralController.value, + ), const SizedBox(height: 40), RoundedButtonFill( - borderRadius: 10.r, - title: "Sign up".tr, + borderRadius: 10.r, + title: ConstTexts.signUp.tr(), onPress: () => controller.signUp(), - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - textColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, ), const SizedBox(height: 25), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Container(width: 52, height: 1, color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey300), + Container( + width: 52, + height: 1, + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey300, + ), const SizedBox(width: 15), - Text("or continue with".tr, style: AppThemeData.regularTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400)), + Text( + ConstTexts.orContinueWith.tr(), + style: AppThemeData.regularTextStyle( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + ), + ), const SizedBox(width: 15), - Container(width: 52, height: 1, color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey300), + Container( + width: 52, + height: 1, + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey300, + ), ], ), const SizedBox(height: 25), RoundedButtonFill( - borderRadius: 10.r, - title: "Mobile number".tr, + borderRadius: 10.r, + title: ConstTexts.mobileNumber.tr(), onPress: () => Get.to(() => const MobileLoginScreen()), isRight: false, isCenter: true, - icon: Icon(Icons.mobile_friendly_outlined, size: 20, color: isDark ? AppThemeData.greyDark900 : null), + icon: Icon( + Icons.mobile_friendly_outlined, + size: 20, + color: isDark ? AppThemeData.greyDark900 : null, + ), //Image.asset(AppAssets.icMessage, width: 20, height: 18, color: isDark ? AppThemeData.greyDark900 : null), - color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + textColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, ), const SizedBox(height: 25), Padding( @@ -199,11 +347,16 @@ class SignUpScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "Already have an account?".tr, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + text: ConstTexts.alreadyHaveAccount.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), children: [ TextSpan( - text: "Log in".tr, + text: ConstTexts.login.tr(), style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 96c67b7..5a8f5b1 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -92,8 +92,8 @@ class CabBookingScreen extends StatelessWidget { 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: Platform.isAndroid - ? "com.emart.customer" - : "com.emart.customer.ios", + ? "felix.fondex.uz" + : "felix.fondex.uz.ios", ), flutterMap.MarkerLayer( markers: controller.osmMarker, @@ -1408,7 +1408,6 @@ class CabBookingScreen extends StatelessWidget { ), ), const SizedBox(height: 10), - Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), @@ -1636,6 +1635,7 @@ class CabBookingScreen extends StatelessWidget { ), ), const SizedBox(height: 20), + Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), @@ -1778,7 +1778,13 @@ class CabBookingScreen extends StatelessWidget { ), SizedBox(width: 10.w), Text( - controller.selectedPaymentMethod.value == "cod" ? "Наличными" : controller.selectedPaymentMethod.value.tr, + controller.selectedPaymentMethod.value == + "cod" + ? "Наличными" + : controller + .selectedPaymentMethod + .value + .tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 16, @@ -1853,13 +1859,13 @@ class CabBookingScreen extends StatelessWidget { SizedBox(height: 30), Text( "Waiting for driver....".tr, - style: AppThemeData.boldTextStyle( - fontSize: 18.sp, - color: - isDark - ? AppThemeData.greyDark900 - : AppThemeData.darkGrey, - ), + style: AppThemeData.boldTextStyle( + fontSize: 18.sp, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.darkGrey, + ), ), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( @@ -2946,12 +2952,16 @@ class CabBookingScreen extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), ), - child: value == PaymentGateway.click || value == PaymentGateway.payme ? Image.asset(image) : Padding( - padding: EdgeInsets.all( - value.name == "payFast" ? 0 : 8.0, - ), - child: Image.asset(image), - ), + child: + value == PaymentGateway.click || + value == PaymentGateway.payme + ? Image.asset(image) + : Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -2996,7 +3006,9 @@ class CabBookingScreen extends StatelessWidget { ) : Expanded( child: Text( - value.name == "cod" ? "Наличными" : value.name.capitalizeString(), + value.name == "cod" + ? "Наличными" + : value.name.capitalizeString(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( fontSize: 16, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index d364282..cb30299 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -37,7 +37,10 @@ class DineInScreen extends StatelessWidget { builder: (controller) { return Scaffold( body: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + headerSliverBuilder: ( + BuildContext context, + bool innerBoxIsScrolled, + ) { return [ SliverAppBar( expandedHeight: Responsive.height(38, context), @@ -51,14 +54,24 @@ class DineInScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + child: Icon( + Icons.arrow_back, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ], ), flexibleSpace: FlexibleSpaceBar( background: Stack( children: [ - Image.asset("assets/images/dine_in_bg.png", fit: BoxFit.fill, width: Responsive.width(100, context)), + Image.asset( + "assets/images/dine_in_bg.png", + fit: BoxFit.fill, + width: Responsive.width(100, context), + ), Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -68,12 +81,28 @@ class DineInScreen extends StatelessWidget { children: [ Text( "Dine-In Reservations".tr, - style: TextStyle(fontSize: 24, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, color: isDark ? AppThemeData.grey900 : AppThemeData.grey900), + style: TextStyle( + fontSize: 24, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey900, + ), ), Text( - "Book a table at your favorite restaurant and enjoy a delightful dining experience.".tr, + "Book a table at your favorite restaurant and enjoy a delightful dining experience." + .tr, textAlign: TextAlign.center, - style: TextStyle(fontSize: 14, fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey900 : AppThemeData.grey900), + style: TextStyle( + fontSize: 14, + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey900, + ), ), ], ), @@ -88,25 +117,47 @@ class DineInScreen extends StatelessWidget { body: controller.isLoading.value ? Constant.loader() - : Constant.isZoneAvailable == false || controller.allNearestRestaurant.isEmpty + : Constant.isZoneAvailable == false || + controller.allNearestRestaurant.isEmpty ? Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset("assets/images/location.gif", height: 120), + Image.asset( + "assets/images/location.gif", + height: 120, + ), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "No Store Found in Your Area".tr, + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr, + "Currently, there are no available store in your zone. Try changing your location to find nearby options." + .tr, textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Change Zone".tr, width: 55, height: 5.5, @@ -129,9 +180,13 @@ class DineInScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), - titleView(isDark, "Explore the Categories".tr, () { - Get.to(const ViewAllCategoryDineInScreen()); - }), + titleView( + isDark, + "Explore the Categories".tr, + () { + Get.to(const ViewAllCategoryDineInScreen()); + }, + ), const SizedBox(height: 10), CategoryView(controller: controller), const SizedBox(height: 28), @@ -141,12 +196,23 @@ class DineInScreen extends StatelessWidget { controller.newArrivalRestaurantList.isEmpty ? const SizedBox() : Container( - decoration: const BoxDecoration(image: DecorationImage(image: AssetImage("assets/images/ic_new_arrival_dinein.png"), fit: BoxFit.cover)), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/ic_new_arrival_dinein.png", + ), + fit: BoxFit.cover, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), child: Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -154,17 +220,42 @@ class DineInScreen extends StatelessWidget { child: Text( "New Arrivals".tr, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), InkWell( onTap: () { - Get.to(const DineInRestaurantListScreen(), arguments: {"vendorList": controller.newArrivalRestaurantList, "title": "New Arrival"}); + Get.to( + const DineInRestaurantListScreen(), + arguments: { + "vendorList": + controller + .newArrivalRestaurantList, + "title": "New Arrival", + }, + ); }, child: Text( "View all".tr, textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], @@ -177,11 +268,25 @@ class DineInScreen extends StatelessWidget { ), controller.bannerBottomModel.isEmpty ? const SizedBox() - : Padding(padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), child: BannerBottomView(controller: controller)), + : Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), + child: BannerBottomView(controller: controller), + ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( @@ -193,15 +298,36 @@ class DineInScreen extends StatelessWidget { }, child: Container( decoration: - controller.isPopular.value == false + controller.isPopular.value == + false ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: AppThemeData.grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "Popular Stores".tr, textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ), @@ -216,22 +342,41 @@ class DineInScreen extends StatelessWidget { decoration: controller.isPopular.value == true ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: AppThemeData.grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "All Stores".tr, textAlign: TextAlign.center, style: TextStyle( - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, color: - controller.isPopular.value == true + controller + .isPopular + .value == + true ? isDark - ? AppThemeData.grey400 - : AppThemeData.grey500 + ? AppThemeData + .grey400 + : AppThemeData + .grey500 : isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -244,8 +389,14 @@ class DineInScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - child: controller.isPopular.value ? PopularRestaurant(controller: controller) : AllRestaurant(controller: controller), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), + child: + controller.isPopular.value + ? PopularRestaurant(controller: controller) + : AllRestaurant(controller: controller), ), ], ), @@ -259,12 +410,28 @@ class DineInScreen extends StatelessWidget { Row titleView(isDark, String name, Function()? onPress) { return Row( children: [ - Expanded(child: Text(name, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900))), + Expanded( + child: Text( + name, + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.bold, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { onPress!(); }, - child: Text("View all".tr, textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300)), + child: Text( + "View all".tr, + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: AppThemeData.regular, + color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + ), + ), ), ], ); @@ -290,19 +457,30 @@ class PopularRestaurant extends StatelessWidget { VendorModel vendorModel = controller.popularRestaurantList[index]; return InkWell( onTap: () { - Get.to(const DineInDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const DineInDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ RestaurantImageView(vendorModel: vendorModel), @@ -310,7 +488,14 @@ class PopularRestaurant extends StatelessWidget { height: Responsive.height(20, context), width: Responsive.width(100, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), Positioned( @@ -318,21 +503,55 @@ class PopularRestaurant extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -340,22 +559,49 @@ class PopularRestaurant extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, children: [ Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -364,18 +610,39 @@ class PopularRestaurant extends StatelessWidget { const SizedBox(width: 10), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.ecommerce600 + : AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: ColorFilter.mode( + AppThemeData.ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", - style: TextStyle(color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -396,13 +663,29 @@ class PopularRestaurant extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( vendorModel.location.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, + ), ), ], ), @@ -437,19 +720,30 @@ class AllRestaurant extends StatelessWidget { VendorModel vendorModel = controller.allNearestRestaurant[index]; return InkWell( onTap: () { - Get.to(const DineInDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const DineInDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ RestaurantImageView(vendorModel: vendorModel), @@ -457,7 +751,14 @@ class AllRestaurant extends StatelessWidget { height: Responsive.height(20, context), width: Responsive.width(100, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), Positioned( @@ -465,21 +766,55 @@ class AllRestaurant extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -487,22 +822,49 @@ class AllRestaurant extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, children: [ Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -511,18 +873,39 @@ class AllRestaurant extends StatelessWidget { const SizedBox(width: 10), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.ecommerce600 + : AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: ColorFilter.mode( + AppThemeData.ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", - style: TextStyle(color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -543,13 +926,29 @@ class AllRestaurant extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( vendorModel.location.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, + ), ), ], ), @@ -579,12 +978,18 @@ class NewArrival extends StatelessWidget { child: ListView.builder( physics: const BouncingScrollPhysics(), scrollDirection: Axis.horizontal, - itemCount: controller.newArrivalRestaurantList.length >= 10 ? 10 : controller.newArrivalRestaurantList.length, + itemCount: + controller.newArrivalRestaurantList.length >= 10 + ? 10 + : controller.newArrivalRestaurantList.length, itemBuilder: (BuildContext context, int index) { VendorModel vendorModel = controller.newArrivalRestaurantList[index]; return InkWell( onTap: () { - Get.to(const DineInDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const DineInDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(right: 10), @@ -595,13 +1000,27 @@ class NewArrival extends StatelessWidget { children: [ Expanded( child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, 1.00), end: const Alignment(0, -1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(0.00, 1.00), + end: const Alignment(0, -1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), Positioned( @@ -609,21 +1028,55 @@ class NewArrival extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -636,13 +1089,25 @@ class NewArrival extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 16, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontSize: 16, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey50, + ), ), Row( children: [ Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 10), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", @@ -652,7 +1117,10 @@ class NewArrival extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], @@ -660,7 +1128,9 @@ class NewArrival extends StatelessWidget { const SizedBox(width: 20), Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg"), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + ), const SizedBox(width: 10), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", @@ -670,7 +1140,10 @@ class NewArrival extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], @@ -681,7 +1154,15 @@ class NewArrival extends StatelessWidget { vendorModel.location.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, + ), ), ], ), @@ -710,10 +1191,17 @@ class CategoryView extends StatelessWidget { padding: EdgeInsets.zero, itemCount: controller.vendorCategoryModel.length, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": true}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": true, + }, + ); }, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 4), @@ -723,7 +1211,14 @@ class CategoryView extends StatelessWidget { decoration: ShapeDecoration( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, strokeAlign: BorderSide.strokeAlignOutside, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), + side: BorderSide( + width: 1, + strokeAlign: BorderSide.strokeAlignOutside, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, + ), borderRadius: BorderRadius.circular(100), ), ), @@ -731,14 +1226,32 @@ class CategoryView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox(width: 60, height: 60, child: ClipOval(child: NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), fit: BoxFit.cover))), + SizedBox( + width: 60, + height: 60, + child: ClipOval( + child: NetworkImageWidget( + imageUrl: vendorCategoryModel.photo.toString(), + fit: BoxFit.cover, + ), + ), + ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Text( '${vendorCategoryModel.title}', textAlign: TextAlign.center, maxLines: 1, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + ), ), ), ], @@ -780,17 +1293,32 @@ class BannerBottomView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -802,7 +1330,13 @@ class BannerBottomView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -813,14 +1347,22 @@ class BannerBottomView extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.bannerBottomModel.length, (index) { + children: List.generate(controller.bannerBottomModel.length, ( + index, + ) { return Obx( () => Container( margin: const EdgeInsets.only(right: 5), alignment: Alignment.centerLeft, height: 9, width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentBottomPage.value == index ? AppThemeData.primary300 : Colors.black12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentBottomPage.value == index + ? AppThemeData.primary300 + : Colors.black12, + ), ), ); }), diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index 2d361f6..6292219 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -24,6 +24,7 @@ import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; @@ -67,28 +68,53 @@ class HomeScreen extends StatelessWidget { decoration: BoxDecoration( gradient: LinearGradient( begin: const Alignment(0.00, -3), - colors: [isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce50, isDark ? AppThemeData.surfaceDark : AppThemeData.surface], + colors: [ + isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce50, + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + ], end: const Alignment(0, 1), ), ), child: controller.isLoading.value ? Constant.loader() - : Constant.isZoneAvailable == false || controller.allNearestRestaurant.isEmpty + : Constant.isZoneAvailable == false || + controller.allNearestRestaurant.isEmpty ? Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset("assets/images/location.gif", height: 120), + Image.asset( + "assets/images/location.gif", + height: 120, + ), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "No Store Found in Your Area".tr, + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr, + "Currently, there are no available store in your zone. Try changing your location to find nearby options." + .tr, textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -105,7 +131,9 @@ class HomeScreen extends StatelessWidget { ), ) : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: controller.isListView.value == false ? const MapView() @@ -114,7 +142,9 @@ class HomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( children: [ const SizedBox(height: 10), @@ -124,97 +154,207 @@ class HomeScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, size: 20), + child: Icon( + Icons + .arrow_back_ios_new_rounded, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + size: 20.r, + ), ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Constant.userModel == null ? InkWell( onTap: () { - Get.offAll(const LoginScreen()); + Get.offAll( + const LoginScreen(), + ); }, child: Text( - "Login".tr, - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + "Login", + textAlign: + TextAlign.center, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 12.sp, + ), ), ) : Text( - Constant.userModel!.fullName(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + "Еда и доставка", + style: + AppThemeData.boldTextStyle( + color: + AppThemeData + .darkGrey, + fontSize: 18.sp, + ), ), InkWell( onTap: () async { - if (Constant.userModel != null) { - Get.to(AddressListScreen())!.then((value) { + if (Constant.userModel != + null) { + Get.to( + AddressListScreen(), + )!.then((value) { if (value != null) { - ShippingAddress shippingAddress = value; - Constant.selectedLocation = shippingAddress; - controller.getData(); + ShippingAddress + shippingAddress = + value; + Constant.selectedLocation = + shippingAddress; + controller + .getData(); } }); } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader( + "Please wait..." + .tr, + ); // ✅ declare it once here! - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress + shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); await Geolocator.getCurrentPosition(); ShowToastDialog.closeLoader(); - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); - if (result != null) { - final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; + if (Constant + .selectedMapType == + 'osm') { + final result = + await Get.to( + () => + MapPickerPage(), + ); + if (result != + null) { + final firstPlace = + result; + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace + .address; - shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); - Constant.selectedLocation = shippingAddress; - controller.getData(); + shippingAddress + .addressAs = + "Home"; + shippingAddress + .locality = + address + .toString(); + shippingAddress + .location = + UserLocation( + latitude: + lat, + longitude: + lng, + ); + Constant.selectedLocation = + shippingAddress; + controller + .getData(); Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { - if (value != null) { - SelectedLocationModel selectedLocationModel = value; + Get.to( + LocationPickerScreen(), + )!.then(( + value, + ) async { + if (value != + null) { + SelectedLocationModel + selectedLocationModel = + value; - shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation( - latitude: selectedLocationModel.latLng!.latitude, - longitude: selectedLocationModel.latLng!.longitude, + shippingAddress + .addressAs = + "Home"; + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, ); - shippingAddress.locality = "Picked from Map"; // You can reverse-geocode + shippingAddress + .locality = + "Picked from Map"; // You can reverse-geocode - Constant.selectedLocation = shippingAddress; - controller.getData(); + Constant.selectedLocation = + shippingAddress; + controller + .getData(); } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { - Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); - String currentLocation = + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then(( + valuePlaceMaker, + ) { + Placemark + placeMark = + valuePlaceMaker[0]; + shippingAddress + .location = + UserLocation( + latitude: + 19.228825, + longitude: + 72.854118, + ); + String + currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress + .locality = + currentLocation; }); - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; ShowToastDialog.closeLoader(); - controller.getData(); + controller + .getData(); } }, context: context, @@ -223,19 +363,36 @@ class HomeScreen extends StatelessWidget { }, child: Text.rich( maxLines: 1, - overflow: TextOverflow.ellipsis, + overflow: + TextOverflow.ellipsis, TextSpan( children: [ TextSpan( - text: Constant.selectedLocation.getFullAddress(), + text: + Constant + .selectedLocation + .getFullAddress(), style: TextStyle( - fontFamily: AppThemeData.medium, - overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: + AppThemeData + .medium, + overflow: + TextOverflow + .ellipsis, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, ), ), - WidgetSpan(child: SvgPicture.asset("assets/icons/ic_down.svg")), + WidgetSpan( + child: SvgPicture.asset( + "assets/icons/ic_down.svg", + ), + ), ], ), ), @@ -246,21 +403,38 @@ class HomeScreen extends StatelessWidget { const SizedBox(width: 5), Obx( () => badges.Badge( - showBadge: cartItem.isEmpty ? false : true, + showBadge: + cartItem.isEmpty + ? false + : true, badgeContent: Text( "${cartItem.length}", style: TextStyle( fontSize: 14, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey50, ), ), - badgeStyle: badges.BadgeStyle(shape: badges.BadgeShape.circle, badgeColor: AppThemeData.ecommerce300), + badgeStyle: badges.BadgeStyle( + shape: + badges.BadgeShape.circle, + badgeColor: + AppThemeData.ecommerce300, + ), child: InkWell( onTap: () async { - (await Get.to(const CartScreen())); + (await Get.to( + const CartScreen(), + )); controller.getCartData(); }, child: ClipOval( @@ -269,15 +443,37 @@ class HomeScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), ), ), child: Padding( - padding: const EdgeInsets.all(8.0), + padding: + const EdgeInsets.all( + 8.0, + ), child: SvgPicture.asset( "assets/icons/ic_shoping_cart.svg", - colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey50 : AppThemeData.grey900, BlendMode.srcIn), + colorFilter: + ColorFilter.mode( + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + BlendMode.srcIn, + ), ), ), ), @@ -287,106 +483,287 @@ class HomeScreen extends StatelessWidget { ), ], ), - const SizedBox(height: 10), + SizedBox(height: 25.h), InkWell( onTap: () { - Get.to(const SearchScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); + Get.to( + const SearchScreen(), + arguments: { + "vendorList": + controller + .allNearestRestaurant, + }, + ); }, + // child: Container( + // height: 48.h, + // decoration: BoxDecoration( + // color: AppThemeData.cardColor, + // borderRadius: + // BorderRadius.circular(10.r), + // ), + // ), child: TextFieldWidget( + hintColor: AppThemeData.darkGrey, hintText: - Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true - ? 'Search the restaurant, food and more...'.tr - : 'Search the store, item and more...'.tr, + Constant + .sectionConstantModel + ?.name + ?.toLowerCase() + .contains( + 'restaurants', + ) == + true + ? 'Искать что угодно' + : 'Search the store, item and more...' + .tr, controller: null, enable: false, - prefix: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg")), + backgroundColor: + AppThemeData.cardColor, + prefix: Padding( + padding: EdgeInsets.only( + left: 16.r, + right: 8.r, + ), + child: Icon( + Icons.search, + size: 24.r, + color: AppThemeData.darkGrey, + ), + ), ), ), - const SizedBox(height: 5), + SizedBox(height: 15.h), ], ), ), Expanded( child: SingleChildScrollView( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - controller.storyList.isEmpty || Constant.storyEnable == false - ? const SizedBox() - : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: StoryView(controller: controller)), - SizedBox(height: controller.storyList.isEmpty ? 0 : 20), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - titleView(isDark, "Explore the Categories", () { - Get.to(const ViewAllCategoryScreen()); - }), - const SizedBox(height: 10), - CategoryView(controller: controller), - ], - ), + // controller.storyList.isEmpty || + // Constant.storyEnable == false + // ? const SizedBox() + // : Padding( + // padding: + // const EdgeInsets.symmetric( + // horizontal: 16, + // ), + // child: StoryView( + // controller: controller, + // ), + // ), + // SizedBox( + // height: + // controller.storyList.isEmpty + // ? 0 + // : 25.h, + // ), + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + // titleView(isDark, "Explore the Categories", () { + // Get.to(const ViewAllCategoryScreen()); + // }), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 16.r, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + "Категории", + style: + AppThemeData.boldTextStyle( + color: + AppThemeData + .darkGrey, + fontSize: 18.sp, + ), + ), + InkWell( + onTap: () { + Get.to( + const ViewAllCategoryScreen(), + ); + }, + child: Text( + "Все", + style: + AppThemeData.mediumTextStyle( + fontSize: 14.sp, + color: + AppThemeData + .mainColor, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 10), + CategoryView( + controller: controller, + ), + ], ), const SizedBox(height: 32), - controller.bannerModel.isEmpty ? const SizedBox() : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: BannerView(controller: controller)), - controller.couponRestaurantList.isEmpty + controller.bannerModel.isEmpty ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: BannerView( + controller: controller, + ), + ), + controller + .couponRestaurantList + .isEmpty + ? const SizedBox() + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - titleView(isDark, "Largest Discounts", () { - Get.to( - const DiscountRestaurantListScreen(), - arguments: {"vendorList": controller.couponRestaurantList, "couponList": controller.couponList, "title": "Discounts Restaurants"}, - ); - }), + titleView( + isDark, + "Largest Discounts", + () { + Get.to( + const DiscountRestaurantListScreen(), + arguments: { + "vendorList": + controller + .couponRestaurantList, + "couponList": + controller + .couponList, + "title": + "Discounts Restaurants", + }, + ); + }, + ), const SizedBox(height: 16), - OfferView(controller: controller), + OfferView( + controller: controller, + ), ], ), ), const SizedBox(height: 28), - controller.newArrivalRestaurantList.isEmpty + controller + .newArrivalRestaurantList + .isEmpty ? const SizedBox() : Container( - decoration: const BoxDecoration(image: DecorationImage(image: AssetImage("assets/images/ic_new_arrival_bg.png"), fit: BoxFit.cover)), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/ic_new_arrival_bg.png", + ), + fit: BoxFit.cover, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( children: [ Expanded( child: Text( "New Arrivals".tr, - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey50, + ), ), ), InkWell( onTap: () { - Get.to(const RestaurantListScreen(), arguments: {"vendorList": controller.newArrivalRestaurantList, "title": "New Arrival"})?.then((v) { - controller.getFavouriteRestaurant(); + Get.to( + const RestaurantListScreen(), + arguments: { + "vendorList": + controller + .newArrivalRestaurantList, + "title": + "New Arrival", + }, + )?.then((v) { + controller + .getFavouriteRestaurant(); }); }, child: Text( "View all".tr, - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + textAlign: + TextAlign + .center, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), - const SizedBox(height: 16), - NewArrival(controller: controller), + const SizedBox( + height: 16, + ), + NewArrival( + controller: controller, + ), ], ), ), @@ -394,54 +771,136 @@ class HomeScreen extends StatelessWidget { const SizedBox(height: 20), controller.bannerBottomModel.isEmpty ? const SizedBox() - : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: BannerBottomView(controller: controller)), - Visibility(visible: (Constant.isEnableAdsFeature == true && controller.advertisementList.isNotEmpty), child: const SizedBox(height: 20)), + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: BannerBottomView( + controller: controller, + ), + ), Visibility( - visible: Constant.isEnableAdsFeature == true, + visible: + (Constant.isEnableAdsFeature == + true && + controller + .advertisementList + .isNotEmpty), + child: const SizedBox(height: 20), + ), + Visibility( + visible: + Constant.isEnableAdsFeature == + true, child: - controller.advertisementList.isEmpty + controller + .advertisementList + .isEmpty ? const SizedBox() : Container( - color: AppThemeData.primary300.withAlpha(40), + color: AppThemeData + .primary300 + .withAlpha(40), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( children: [ Expanded( child: Text( - "Highlights for you".tr, - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + "Highlights for you" + .tr, + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: + 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), InkWell( onTap: () { - Get.to(AllAdvertisementScreen())?.then((value) { - controller.getFavouriteRestaurant(); + Get.to( + AllAdvertisementScreen(), + )?.then(( + value, + ) { + controller + .getFavouriteRestaurant(); }); }, child: Text( - "View all".tr, - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + "View all" + .tr, + textAlign: + TextAlign + .center, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], ), - const SizedBox(height: 16), + const SizedBox( + height: 16, + ), SizedBox( height: 220, child: ListView.builder( - physics: const BouncingScrollPhysics(), - scrollDirection: Axis.horizontal, - itemCount: controller.advertisementList.length >= 10 ? 10 : controller.advertisementList.length, - padding: EdgeInsets.all(0), - itemBuilder: (BuildContext context, int index) { - return AdvertisementHomeCard(controller: controller, model: controller.advertisementList[index]); + physics: + const BouncingScrollPhysics(), + scrollDirection: + Axis.horizontal, + itemCount: + controller.advertisementList.length >= + 10 + ? 10 + : controller + .advertisementList + .length, + padding: + EdgeInsets.all( + 0, + ), + itemBuilder: ( + BuildContext + context, + int index, + ) { + return AdvertisementHomeCard( + controller: + controller, + model: + controller + .advertisementList[index], + ); }, ), ), @@ -452,32 +911,77 @@ class HomeScreen extends StatelessWidget { ), const SizedBox(height: 20), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all( + 8.0, + ), child: Row( children: [ Expanded( child: InkWell( onTap: () { - controller.isPopular.value = true; + controller + .isPopular + .value = true; }, child: Container( decoration: - controller.isPopular.value == false + controller + .isPopular + .value == + false ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: + AppThemeData + .grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: 10, + ), child: Text( - "Popular Stores".tr, - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + "Popular Stores" + .tr, + textAlign: + TextAlign + .center, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ), @@ -486,28 +990,55 @@ class HomeScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.isPopular.value = false; + controller + .isPopular + .value = false; }, child: Container( decoration: - controller.isPopular.value == true + controller + .isPopular + .value == + true ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: + AppThemeData + .grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: 10, + ), child: Text( "All Stores".tr, - textAlign: TextAlign.center, + textAlign: + TextAlign + .center, style: TextStyle( - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData + .semiBold, color: - controller.isPopular.value == true + controller.isPopular.value == + true ? isDark ? AppThemeData.grey400 : AppThemeData.grey500 : isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -520,8 +1051,18 @@ class HomeScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - child: controller.isPopular.value ? PopularRestaurant(controller: controller) : AllRestaurant(controller: controller), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), + child: + controller.isPopular.value + ? PopularRestaurant( + controller: controller, + ) + : AllRestaurant( + controller: controller, + ), ), // controller.isPopular.value // ? PopularRestaurant( @@ -538,18 +1079,29 @@ class HomeScreen extends StatelessWidget { ), ), ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, + floatingActionButtonLocation: + FloatingActionButtonLocation.centerFloat, floatingActionButton: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, borderRadius: const BorderRadius.all(Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + borderRadius: const BorderRadius.all(Radius.circular(30)), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), child: Row( mainAxisSize: MainAxisSize.min, children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.all(Radius.circular(30))), + decoration: BoxDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + borderRadius: const BorderRadius.all(Radius.circular(30)), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( children: [ InkWell( @@ -558,12 +1110,22 @@ class HomeScreen extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: controller.isListView.value ? AppThemeData.primary300 : null), + decoration: BoxDecoration( + color: + controller.isListView.value + ? AppThemeData.primary300 + : null, + ), child: Padding( padding: const EdgeInsets.all(8.0), child: SvgPicture.asset( "assets/icons/ic_view_grid_list.svg", - colorFilter: ColorFilter.mode(controller.isListView.value ? AppThemeData.grey50 : AppThemeData.grey500, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + controller.isListView.value + ? AppThemeData.grey50 + : AppThemeData.grey500, + BlendMode.srcIn, + ), ), ), ), @@ -577,12 +1139,22 @@ class HomeScreen extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: controller.isListView.value == false ? AppThemeData.primary300 : null), + decoration: BoxDecoration( + color: + controller.isListView.value == false + ? AppThemeData.primary300 + : null, + ), child: Padding( padding: const EdgeInsets.all(8.0), child: SvgPicture.asset( "assets/icons/ic_map_draw.svg", - colorFilter: ColorFilter.mode(controller.isListView.value == false ? AppThemeData.grey50 : AppThemeData.grey500, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + controller.isListView.value == false + ? AppThemeData.grey50 + : AppThemeData.grey500, + BlendMode.srcIn, + ), ), ), ), @@ -599,10 +1171,23 @@ class HomeScreen extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + ), child: Padding( padding: const EdgeInsets.all(10), - child: SvgPicture.asset("assets/icons/ic_scan_code.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey500, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_scan_code.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + BlendMode.srcIn, + ), + ), ), ), ), @@ -610,24 +1195,46 @@ class HomeScreen extends StatelessWidget { const SizedBox(width: 14), Theme( data: Theme.of(context).copyWith( - canvasColor: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, // background when dropdown opens + canvasColor: + isDark + ? AppThemeData.greyDark100 + : AppThemeData + .grey100, // background when dropdown opens ), child: DropdownButton( isDense: false, underline: const SizedBox(), - dropdownColor: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, + dropdownColor: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey100, value: controller.selectedOrderTypeValue.value.tr, icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr, 'TakeAway'.tr].map((String value) { + ['Delivery'.tr, 'TakeAway'.tr].map(( + String value, + ) { return DropdownMenuItem( value: value, - child: Text(value.tr, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + child: Text( + value.tr, + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), ); }).toList(), onChanged: (value) async { if (cartItem.isEmpty) { - await Preferences.setString(Preferences.foodDeliveryType, value!); + await Preferences.setString( + Preferences.foodDeliveryType, + value!, + ); controller.selectedOrderTypeValue.value = value; controller.getData(); } else { @@ -636,14 +1243,21 @@ class HomeScreen extends StatelessWidget { builder: (BuildContext context) { return CustomDialogBox( title: "Alert".tr, - descriptions: "Do you really want to change the delivery option? Your cart will be empty.".tr, + descriptions: + "Do you really want to change the delivery option? Your cart will be empty." + .tr, positiveString: "Ok".tr, negativeString: "Cancel".tr, positiveClick: () async { - await Preferences.setString(Preferences.foodDeliveryType, value!); - controller.selectedOrderTypeValue.value = value; + await Preferences.setString( + Preferences.foodDeliveryType, + value!, + ); + controller.selectedOrderTypeValue.value = + value; controller.getData(); - DatabaseHelper.instance.deleteAllCartProducts(); + DatabaseHelper.instance + .deleteAllCartProducts(); controller.cartProvider.clearDatabase(); controller.getCartData(); Get.back(); @@ -671,12 +1285,28 @@ class HomeScreen extends StatelessWidget { Row titleView(isDark, String name, Function()? onPress) { return Row( children: [ - Expanded(child: Text(name.tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900))), + Expanded( + child: Text( + name.tr, + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.bold, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { onPress!(); }, - child: Text("View all".tr, textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300)), + child: Text( + "View all".tr, + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: AppThemeData.regular, + color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + ), + ), ), ], ); @@ -702,21 +1332,37 @@ class PopularRestaurant extends StatelessWidget { VendorModel vendorModel = controller.popularRestaurantList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel})?.then((v) { + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + )?.then((v) { controller.getFavouriteRestaurant(); }); }, child: Padding( - padding: EdgeInsets.only(bottom: controller.popularRestaurantList.length - 1 == index ? 60 : 20), + padding: EdgeInsets.only( + bottom: + controller.popularRestaurantList.length - 1 == index + ? 60 + : 20, + ), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ RestaurantImageView(vendorModel: vendorModel), @@ -724,7 +1370,14 @@ class PopularRestaurant extends StatelessWidget { height: Responsive.height(20, context), width: Responsive.width(100, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), @@ -733,21 +1386,55 @@ class PopularRestaurant extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -755,26 +1442,46 @@ class PopularRestaurant extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == true && + Constant.isSelfDeliveryFeature == true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + borderRadius: BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), const SizedBox(width: 5), - Text("Free Delivery".tr, style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600)), + Text( + "Free Delivery".tr, + style: TextStyle( + fontSize: 14, + color: AppThemeData.carRent600, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), + ), ], ), ), @@ -783,35 +1490,77 @@ class PopularRestaurant extends StatelessWidget { ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), ), const SizedBox(width: 6), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.ecommerce600 + : AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: ColorFilter.mode( + AppThemeData.ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, ), @@ -834,13 +1583,29 @@ class PopularRestaurant extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( vendorModel.location.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, + ), ), ], ), @@ -875,21 +1640,35 @@ class AllRestaurant extends StatelessWidget { VendorModel vendorModel = controller.allNearestRestaurant[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel})?.then((v) { + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + )?.then((v) { controller.getFavouriteRestaurant(); }); }, child: Padding( - padding: EdgeInsets.only(bottom: controller.allNearestRestaurant.length - 1 == index ? 60 : 20), + padding: EdgeInsets.only( + bottom: + controller.allNearestRestaurant.length - 1 == index ? 60 : 20, + ), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ RestaurantImageView(vendorModel: vendorModel), @@ -897,7 +1676,14 @@ class AllRestaurant extends StatelessWidget { height: Responsive.height(20, context), width: Responsive.width(100, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), Positioned( @@ -905,21 +1691,55 @@ class AllRestaurant extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -927,26 +1747,46 @@ class AllRestaurant extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == true && + Constant.isSelfDeliveryFeature == true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( color: AppThemeData.carRent300, - borderRadius: BorderRadius.circular(120), // Optional + borderRadius: BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), const SizedBox(width: 5), - Text("Free Delivery".tr, style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600)), + Text( + "Free Delivery".tr, + style: TextStyle( + fontSize: 14, + color: AppThemeData.carRent600, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), + ), ], ), ), @@ -955,35 +1795,77 @@ class AllRestaurant extends StatelessWidget { ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), ), const SizedBox(width: 6), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.ecommerce600 + : AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: ColorFilter.mode( + AppThemeData.ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, ), @@ -1006,13 +1888,29 @@ class AllRestaurant extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( vendorModel.location.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, + ), ), ], ), @@ -1042,12 +1940,18 @@ class NewArrival extends StatelessWidget { child: ListView.builder( physics: const BouncingScrollPhysics(), scrollDirection: Axis.horizontal, - itemCount: controller.newArrivalRestaurantList.length >= 10 ? 10 : controller.newArrivalRestaurantList.length, + itemCount: + controller.newArrivalRestaurantList.length >= 10 + ? 10 + : controller.newArrivalRestaurantList.length, itemBuilder: (BuildContext context, int index) { VendorModel vendorModel = controller.newArrivalRestaurantList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel})?.then((v) { + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + )?.then((v) { controller.getFavouriteRestaurant(); }); }, @@ -1060,13 +1964,27 @@ class NewArrival extends StatelessWidget { children: [ Expanded( child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, 1.00), end: const Alignment(0, -1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(0.00, 1.00), + end: const Alignment(0, -1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), Positioned( @@ -1074,21 +1992,55 @@ class NewArrival extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel favouriteModel = + FavouriteModel( + restaurantId: vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -1101,17 +2053,27 @@ class NewArrival extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 16, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontSize: 16, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey50, + ), ), SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == true && + Constant.isSelfDeliveryFeature == true), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), const SizedBox(width: 4), Text( "Free Delivery".tr, @@ -1121,7 +2083,10 @@ class NewArrival extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), const SizedBox(width: 8), @@ -1130,7 +2095,13 @@ class NewArrival extends StatelessWidget { ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 4), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", @@ -1140,7 +2111,10 @@ class NewArrival extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], @@ -1148,7 +2122,9 @@ class NewArrival extends StatelessWidget { const SizedBox(width: 8), Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg"), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + ), const SizedBox(width: 4), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", @@ -1158,7 +2134,10 @@ class NewArrival extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], @@ -1170,7 +2149,15 @@ class NewArrival extends StatelessWidget { vendorModel.location.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, + ), ), ], ), @@ -1187,7 +2174,11 @@ class AdvertisementHomeCard extends StatelessWidget { final AdvertisementModel model; final FoodHomeController controller; - const AdvertisementHomeCard({super.key, required this.controller, required this.model}); + const AdvertisementHomeCard({ + super.key, + required this.controller, + required this.model, + }); @override Widget build(BuildContext context) { @@ -1196,9 +2187,14 @@ class AdvertisementHomeCard extends StatelessWidget { return InkWell( onTap: () async { ShowToastDialog.showLoader("Please wait...".tr); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(model.vendorId!); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + model.vendorId!, + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Container( margin: EdgeInsets.only(right: 16), @@ -1206,7 +2202,14 @@ class AdvertisementHomeCard extends StatelessWidget { decoration: BoxDecoration( color: isDark ? AppThemeData.info600 : AppThemeData.surface, borderRadius: BorderRadius.circular(16), - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.1), blurRadius: isDark ? 6 : 2, spreadRadius: 0, offset: Offset(0, isDark ? 3 : 1))], + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: isDark ? 6 : 2, + spreadRadius: 0, + offset: Offset(0, isDark ? 3 : 1), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -1215,18 +2218,32 @@ class AdvertisementHomeCard extends StatelessWidget { children: [ model.type == 'restaurant_promotion' ? ClipRRect( - borderRadius: BorderRadius.vertical(top: Radius.circular(16)), - child: NetworkImageWidget(imageUrl: model.coverImage ?? '', height: 135, width: double.infinity, fit: BoxFit.cover), + borderRadius: BorderRadius.vertical( + top: Radius.circular(16), + ), + child: NetworkImageWidget( + imageUrl: model.coverImage ?? '', + height: 135, + width: double.infinity, + fit: BoxFit.cover, + ), ) - : VideoAdvWidget(url: model.video ?? '', height: 135, width: double.infinity), - if (model.type != 'video_promotion' && model.vendorId != null && (model.showRating == true || model.showReview == true)) + : VideoAdvWidget( + url: model.video ?? '', + height: 135, + width: double.infinity, + ), + if (model.type != 'video_promotion' && + model.vendorId != null && + (model.showRating == true || model.showReview == true)) Positioned( bottom: 8, right: 8, child: FutureBuilder( future: FireStoreUtils.getVendorById(model.vendorId!), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); } else { if (snapshot.hasError) { @@ -1236,16 +2253,43 @@ class AdvertisementHomeCard extends StatelessWidget { } else { VendorModel vendorModel = snapshot.data!; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - if (model.showRating == true) SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - if (model.showRating == true) const SizedBox(width: 5), + if (model.showRating == true) + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), + if (model.showRating == true) + const SizedBox(width: 5), Text( "${model.showRating == true ? Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString()) : ''} ${model.showReview == true ? '(${vendorModel.reviewsCount!.toStringAsFixed(0)})' : ''}", - style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -1264,7 +2308,15 @@ class AdvertisementHomeCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (model.type == 'restaurant_promotion') - ClipRRect(borderRadius: BorderRadius.circular(30), child: NetworkImageWidget(imageUrl: model.profileImage ?? '', height: 50, width: 50, fit: BoxFit.cover)), + ClipRRect( + borderRadius: BorderRadius.circular(30), + child: NetworkImageWidget( + imageUrl: model.profileImage ?? '', + height: 50, + width: 50, + fit: BoxFit.cover, + ), + ), SizedBox(width: 8), Expanded( child: Column( @@ -1272,12 +2324,26 @@ class AdvertisementHomeCard extends StatelessWidget { children: [ Text( model.title ?? '', - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 14, fontWeight: FontWeight.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 14, + fontWeight: FontWeight.bold, + ), overflow: TextOverflow.ellipsis, ), Text( model.description ?? '', - style: TextStyle(fontSize: 12, fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey600), + style: TextStyle( + fontSize: 12, + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + ), overflow: TextOverflow.ellipsis, maxLines: 2, ), @@ -1288,26 +2354,73 @@ class AdvertisementHomeCard extends StatelessWidget { ? IconButton( icon: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey600, BlendMode.srcIn)), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == model.vendorId, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), ), onPressed: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == model.vendorId); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where((p0) => p0.restaurantId == model.vendorId) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => item.restaurantId == model.vendorId, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } controller.update(); }, ) : Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))), - child: Padding(padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Icon(Icons.arrow_forward, size: 20, color: AppThemeData.primary300)), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 4, + ), + child: Icon( + Icons.arrow_forward, + size: 20, + color: AppThemeData.primary300, + ), + ), ), ], ), @@ -1333,13 +2446,19 @@ class OfferView extends StatelessWidget { child: ListView.builder( physics: const BouncingScrollPhysics(), scrollDirection: Axis.horizontal, - itemCount: controller.couponRestaurantList.length >= 15 ? 15 : controller.couponRestaurantList.length, + itemCount: + controller.couponRestaurantList.length >= 15 + ? 15 + : controller.couponRestaurantList.length, itemBuilder: (BuildContext context, int index) { VendorModel vendorModel = controller.couponRestaurantList[index]; CouponModel offerModel = controller.couponList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(right: 10), @@ -1350,13 +2469,27 @@ class OfferView extends StatelessWidget { children: [ Expanded( child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), Positioned( @@ -1374,14 +2507,24 @@ class OfferView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w900, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, ), ), Text( "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr : "off".tr}", textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ], ), @@ -1395,19 +2538,29 @@ class OfferView extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 16, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 16, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == true && + Constant.isSelfDeliveryFeature == true), child: Row( children: [ Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), const SizedBox(width: 5), Text( "Free Delivery".tr, @@ -1416,7 +2569,10 @@ class OfferView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, ), ), ], @@ -1427,7 +2583,13 @@ class OfferView extends StatelessWidget { ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 10), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", @@ -1438,7 +2600,10 @@ class OfferView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, ), ), ], @@ -1485,17 +2650,32 @@ class BannerView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -1507,7 +2687,13 @@ class BannerView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -1525,7 +2711,13 @@ class BannerView extends StatelessWidget { alignment: Alignment.centerLeft, height: 9, width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentPage.value == index ? AppThemeData.primary300 : Colors.black12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentPage.value == index + ? AppThemeData.primary300 + : Colors.black12, + ), ), ); }), @@ -1564,17 +2756,32 @@ class BannerBottomView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -1586,7 +2793,13 @@ class BannerBottomView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -1597,14 +2810,22 @@ class BannerBottomView extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.bannerBottomModel.length, (index) { + children: List.generate(controller.bannerBottomModel.length, ( + index, + ) { return Obx( () => Container( margin: const EdgeInsets.only(right: 5), alignment: Alignment.centerLeft, height: 9, width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentBottomPage.value == index ? AppThemeData.primary300 : Colors.black12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentBottomPage.value == index + ? AppThemeData.primary300 + : Colors.black12, + ), ), ); }), @@ -1625,46 +2846,63 @@ class CategoryView extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return SizedBox( - height: 124, + height: 100.h, child: ListView.builder( scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, itemCount: controller.vendorCategoryModel.length, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": false}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": false, + }, + ); }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 2), - child: SizedBox( - width: 78, - child: Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, strokeAlign: BorderSide.strokeAlignOutside, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), - borderRadius: BorderRadius.circular(100), + child: Container( + width: 100.r, + height: 100.r, + margin: + index == 0 + ? EdgeInsets.only(left: 16.r, right: 10.r) + : index == controller.vendorCategoryModel.length - 1 + ? EdgeInsets.only(right: 16.r) + : EdgeInsets.only(right: 10.r), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.cardColor, + borderRadius: BorderRadius.circular(12.r), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.all(10.r), + child: Text( + '${vendorCategoryModel.title}', + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: AppThemeData.boldTextStyle( + color: AppThemeData.darkGrey, + fontSize: 13.3.sp, + ), ), ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(width: 60, height: 60, child: ClipOval(child: NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), fit: BoxFit.cover))), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), - child: Text( - '${vendorCategoryModel.title}', - textAlign: TextAlign.center, - maxLines: 1, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium), - ), + Expanded( + child: ClipOval( + child: NetworkImageWidget( + imageUrl: vendorCategoryModel.photo.toString(), + fit: BoxFit.cover, ), - ], + ), ), - ), + ], ), ), ); @@ -1693,7 +2931,15 @@ class StoryView extends StatelessWidget { padding: const EdgeInsets.only(right: 10), child: InkWell( onTap: () { - Navigator.of(context).push(MaterialPageRoute(builder: (context) => MoreStories(storyList: controller.storyList, index: index))); + Navigator.of(context).push( + MaterialPageRoute( + builder: + (context) => MoreStories( + storyList: controller.storyList, + index: index, + ), + ), + ); }, child: SizedBox( width: 134, @@ -1701,18 +2947,33 @@ class StoryView extends StatelessWidget { borderRadius: const BorderRadius.all(Radius.circular(10)), child: Stack( children: [ - NetworkImageWidget(imageUrl: storyModel.videoThumbnail.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: storyModel.videoThumbnail.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container(color: Colors.black.withOpacity(0.30)), Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 8, + ), child: FutureBuilder( - future: FireStoreUtils.getVendorById(storyModel.vendorID.toString()), + future: FireStoreUtils.getVendorById( + storyModel.vendorID.toString(), + ), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return Constant.loader(); } else { if (snapshot.hasError) { - return Center(child: Text('${"Error".tr}: ${snapshot.error}')); + return Center( + child: Text( + '${"Error".tr}: ${snapshot.error}', + ), + ); } else if (snapshot.data == null) { return const SizedBox(); } else { @@ -1721,28 +2982,51 @@ class StoryView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipOval(child: NetworkImageWidget(imageUrl: vendorModel.photo.toString(), width: 30, height: 30, fit: BoxFit.cover)), + ClipOval( + child: NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + width: 30, + height: 30, + fit: BoxFit.cover, + ), + ), const SizedBox(width: 4), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: Colors.white, fontSize: 12, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: Colors.white, + fontSize: 12, + overflow: TextOverflow.ellipsis, + fontWeight: FontWeight.w700, + ), ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg"), + SvgPicture.asset( + "assets/icons/ic_star.svg", + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum!.toStringAsFixed(0))} reviews", textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: AppThemeData.warning300, fontSize: 10, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: + AppThemeData.warning300, + fontSize: 10, + overflow: + TextOverflow.ellipsis, + fontWeight: FontWeight.w700, + ), ), ], ), @@ -1784,11 +3068,18 @@ class MapView extends StatelessWidget { ? flutterMap.FlutterMap( mapController: controller.osmMapController, options: flutterMap.MapOptions( - initialCenter: location.LatLng(Constant.selectedLocation.location!.latitude ?? 0.0, Constant.selectedLocation.location!.longitude ?? 0.0), + initialCenter: location.LatLng( + Constant.selectedLocation.location!.latitude ?? 0.0, + Constant.selectedLocation.location!.longitude ?? 0.0, + ), initialZoom: 10, ), children: [ - flutterMap.TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'com.emart.app'), + flutterMap.TileLayer( + urlTemplate: + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'com.emart.app', + ), flutterMap.MarkerLayer(markers: controller.osmMarker), ], ) @@ -1806,8 +3097,26 @@ class MapView extends StatelessWidget { zoom: 18, target: controller.homeController.allNearestRestaurant.isEmpty - ? LatLng(Constant.selectedLocation.location!.latitude ?? 45.521563, Constant.selectedLocation.location!.longitude ?? -122.677433) - : LatLng(controller.homeController.allNearestRestaurant.first.latitude ?? 45.521563, controller.homeController.allNearestRestaurant.first.longitude ?? -122.677433), + ? LatLng( + Constant.selectedLocation.location!.latitude ?? + 45.521563, + Constant.selectedLocation.location!.longitude ?? + -122.677433, + ) + : LatLng( + controller + .homeController + .allNearestRestaurant + .first + .latitude ?? + 45.521563, + controller + .homeController + .allNearestRestaurant + .first + .longitude ?? + -122.677433, + ), ), ), controller.homeController.allNearestRestaurant.isEmpty @@ -1824,60 +3133,141 @@ class MapView extends StatelessWidget { Expanded( child: PageView.builder( pageSnapping: true, - controller: PageController(viewportFraction: 0.88), + controller: PageController( + viewportFraction: 0.88, + ), onPageChanged: (value) async { if (Constant.selectedMapType == "osm") { controller.osmMapController.move( - location.LatLng(controller.homeController.allNearestRestaurant[value].latitude!, controller.homeController.allNearestRestaurant[value].longitude!), + location.LatLng( + controller + .homeController + .allNearestRestaurant[value] + .latitude!, + controller + .homeController + .allNearestRestaurant[value] + .longitude!, + ), 16, ); } else { - CameraUpdate cameraUpdate = CameraUpdate.newCameraPosition( - CameraPosition( - zoom: 18, - target: LatLng(controller.homeController.allNearestRestaurant[value].latitude!, controller.homeController.allNearestRestaurant[value].longitude!), - ), + CameraUpdate cameraUpdate = + CameraUpdate.newCameraPosition( + CameraPosition( + zoom: 18, + target: LatLng( + controller + .homeController + .allNearestRestaurant[value] + .latitude!, + controller + .homeController + .allNearestRestaurant[value] + .longitude!, + ), + ), + ); + controller.mapController!.animateCamera( + cameraUpdate, ); - controller.mapController!.animateCamera(cameraUpdate); } }, - itemCount: controller.homeController.allNearestRestaurant.length, + itemCount: + controller + .homeController + .allNearestRestaurant + .length, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { - VendorModel vendorModel = controller.homeController.allNearestRestaurant[index]; + VendorModel vendorModel = + controller + .homeController + .allNearestRestaurant[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel})?.then((v) { - controller.homeController.getFavouriteRestaurant(); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + )?.then((v) { + controller.homeController + .getFavouriteRestaurant(); }); }, child: Padding( - padding: EdgeInsets.symmetric(vertical: 10, horizontal: index == 0 ? 0 : 10), + padding: EdgeInsets.symmetric( + vertical: 10, + horizontal: index == 0 ? 0 : 10, + ), child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.all(Radius.circular(16))), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: + const BorderRadius.only( + topLeft: Radius.circular( + 16, + ), + topRight: Radius.circular( + 16, + ), + ), child: Stack( children: [ NetworkImageWidget( - imageUrl: vendorModel.photo.toString(), + imageUrl: + vendorModel.photo + .toString(), fit: BoxFit.cover, - height: Responsive.height(14, context), - width: Responsive.width(100, context), + height: Responsive.height( + 14, + context, + ), + width: Responsive.width( + 100, + context, + ), ), Container( - height: Responsive.height(14, context), - width: Responsive.width(100, context), + height: Responsive.height( + 14, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: + const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black + .withOpacity(0), + const Color( + 0xFF111827, + ), + ], ), ), ), @@ -1886,21 +3276,75 @@ class MapView extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.homeController.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.homeController.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller + .homeController + .favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel + .id, + ) + .isNotEmpty) { + FavouriteModel + favouriteModel = + FavouriteModel( + restaurantId: + vendorModel + .id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller + .homeController + .favouriteList + .removeWhere( + (item) => + item.restaurantId == + vendorModel + .id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.homeController.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel + favouriteModel = + FavouriteModel( + restaurantId: + vendorModel + .id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller + .homeController + .favouriteList + .add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.homeController.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller + .homeController + .favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -1908,53 +3352,128 @@ class MapView extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(11, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height( + 11, + context, + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: + 10, + vertical: 7, + ), decoration: BoxDecoration( - color: AppThemeData.carRent300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData + .carRent300, + borderRadius: + BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: 5, + ), Text( - "Free Delivery".tr, - style: TextStyle(fontSize: 14, color: AppThemeData.success600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + "Free Delivery" + .tr, + style: TextStyle( + fontSize: + 14, + color: + AppThemeData + .success600, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, + ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: 6, + ), ], ), ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode + .srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], @@ -1964,21 +3483,55 @@ class MapView extends StatelessWidget { const SizedBox(width: 10), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce600 + : AppThemeData + .ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .ecommerce300, + BlendMode + .srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], @@ -1992,9 +3545,12 @@ class MapView extends StatelessWidget { ), const SizedBox(height: 15), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), @@ -2002,20 +3558,35 @@ class MapView extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, ), ), Text( - vendorModel.location.toString(), + vendorModel.location + .toString(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey400, ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart index 0e2a4a8..980aeb0 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart @@ -31,7 +31,7 @@ class LiveTrackingScreen extends StatelessWidget { mapController: controller.osmMapController, options: flutterMap.MapOptions(initialCenter: controller.driverCurrent.value, initialZoom: 14), children: [ - flutterMap.TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'com.emart.customer'), + flutterMap.TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'felix.fondex.uz'), if (controller.routePoints.isNotEmpty) flutterMap.PolylineLayer(polylines: [flutterMap.Polyline(points: controller.routePoints, strokeWidth: 5.0, color: Colors.blue)]), flutterMap.MarkerLayer(markers: controller.orderModel.value.id == null ? [] : controller.osmMarkers), ], diff --git a/lib/service/fire_store_utils.dart b/lib/service/fire_store_utils.dart index 8c56d2f..f054fc3 100644 --- a/lib/service/fire_store_utils.dart +++ b/lib/service/fire_store_utils.dart @@ -83,7 +83,11 @@ class FireStoreUtils { static FirebaseFirestore fireStore = FirebaseFirestore.instance; static String getCurrentUid() { - return auth.FirebaseAuth.instance.currentUser!.uid; + final user = auth.FirebaseAuth.instance.currentUser; + if(user != null){ + return user.uid; + } + return "hello"; } static Future isLogin() async { diff --git a/lib/themes/text_field_widget.dart b/lib/themes/text_field_widget.dart index 8e0b58c..dfc9c06 100644 --- a/lib/themes/text_field_widget.dart +++ b/lib/themes/text_field_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../controllers/theme_controller.dart'; import 'app_them_data.dart'; @@ -121,7 +122,7 @@ class _TextFieldWidgetState extends State { errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: const BorderSide(color: Colors.red)), disabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), hintText: widget.hintText.tr, - hintStyle: AppThemeData.regularTextStyle(fontSize: 14, color: hintColor), + hintStyle: AppThemeData.regularTextStyle(fontSize: 14.sp, color: hintColor), ), ), ], diff --git a/lib/widget/osm_map/map_picker_page.dart b/lib/widget/osm_map/map_picker_page.dart index 334c7c9..7491e77 100644 --- a/lib/widget/osm_map/map_picker_page.dart +++ b/lib/widget/osm_map/map_picker_page.dart @@ -44,7 +44,7 @@ class MapPickerPage extends StatelessWidget { options: MapOptions( initialCenter: controller.pickedPlace.value?.coordinates ?? - LatLng(20.5937, 78.9629), // Default India center + LatLng(41.3775, 64.5853), // Default UZB center initialZoom: 13, onTap: (tapPos, latlng) { controller.addLatLngOnly(latlng); @@ -180,7 +180,8 @@ class MapPickerPage extends StatelessWidget { title: "Confirm Location".tr, color: AppThemeData.mainColor, textColor: AppThemeData.grey50, - height: 4.h, + borderRadius: 12, + height: 6, onPress: () async { final selected = controller.pickedPlace.value; if (selected != null) { diff --git a/pubspec.lock b/pubspec.lock index e5c9143..c69f970 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -321,6 +321,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + easy_localization: + dependency: "direct main" + description: + name: easy_localization + sha256: "2ccdf9db8fe4d9c5a75c122e6275674508fd0f0d49c827354967b8afcc56bbed" + url: "https://pub.dev" + source: hosted + version: "3.0.8" + easy_logger: + dependency: transitive + description: + name: easy_logger + sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7 + url: "https://pub.dev" + source: hosted + version: "0.0.2" equatable: dependency: transitive description: @@ -614,6 +630,19 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.3" + flutter_localization: + dependency: "direct main" + description: + name: flutter_localization + sha256: "578a73455a0deffc4169ef9372ba0562a3e2cff563e5c524ea87bc96daa519c0" + url: "https://pub.dev" + source: hosted + version: "0.3.3" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_map: dependency: "direct main" description: @@ -1829,6 +1858,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.1" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 + url: "https://pub.dev" + source: hosted + version: "2.3.1" url_launcher: dependency: transitive description: @@ -2061,6 +2098,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" zxing_lib: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 2365c9a..6d943bf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: customer description: "A new Flutter project." -version: 1.0.0+1 +version: 1.0.0+2 environment: sdk: ^3.7.2 @@ -88,6 +88,8 @@ dependencies: flutter_google_places_hoc081098: ^2.0.0 flutter_screenutil: ^5.9.3 flutter_hooks: ^0.21.3+1 + easy_localization: ^3.0.8 + flutter_localization: ^0.3.3 dependency_overrides: webview_flutter: ^4.9.0 -- 2.49.1 From 61e9c35b14148072e145d45b1737e0f92fd8622f Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 16:31:32 +0500 Subject: [PATCH 11/30] BASE: Implement Localization In Cab Booking Screen. --- android/app/src/main/AndroidManifest.xml | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 7809 -> 2894 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 1202 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 14793 -> 5269 bytes .../mipmap-hdpi/ic_launcher_monochrome.png | Bin 14793 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4773 bytes .../src/main/res/mipmap-ldpi/ic_launcher.png | Bin 0 -> 1343 bytes .../res/mipmap-ldpi/ic_launcher_round.png | Bin 0 -> 2050 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 4372 -> 1876 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 696 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 7401 -> 3491 bytes .../mipmap-mdpi/ic_launcher_monochrome.png | Bin 7401 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2840 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 12427 -> 4017 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 1803 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 23415 -> 7713 bytes .../mipmap-xhdpi/ic_launcher_monochrome.png | Bin 23415 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6566 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 22823 -> 6219 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 3417 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 46328 -> 12752 bytes .../mipmap-xxhdpi/ic_launcher_monochrome.png | Bin 46328 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10995 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 36592 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 5424 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 78717 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_monochrome.png | Bin 78717 -> 0 bytes assets/translations/en_En.json | 53 ++++--- ios/Runner/Info.plist | 2 +- lib/constant/const_texts.dart | 42 +++++- .../cab_booking_screen.dart | 142 +++++++++--------- pubspec.yaml | 2 +- 32 files changed, 146 insertions(+), 97 deletions(-) delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-ldpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8e567a0..1121885 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -46,7 +46,7 @@ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index c18ca62610132b34615801206955513d078e56a8..4db80572b93cbbf368b4e83fb51b53e4bc1a165c 100644 GIT binary patch delta 2888 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 JF6*2UngFFt0E7Sl diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 0edd7e30c3cceb9daf047d512d03ea609690961a..c4efae6c2dc9f23676e6b484134480eef5c68705 100644 GIT binary patch literal 5269 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 literal 14793 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 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png deleted file mode 100644 index 0edd7e30c3cceb9daf047d512d03ea609690961a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14793 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 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..c514656e48ca06cda6405b9b73e2da29f5725860 GIT binary patch literal 4773 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2c35d1c053c31b8eedf3b9ed6fa2552bde67a93a GIT binary patch literal 1343 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index b4f1709bf0dbb185a26041cf0a546670efff7701..ff032c6a3615a7d2928a123888a4191d10b4bb77 100644 GIT binary patch delta 1862 zcmV-M2f6r^BGe9$BYy`8Nkl>(kuE4xxRJ(b0ZG<3lpyNZ~krk9%ODjvE@+*VU#=R38#|eI3(V zJ~!>}Ql>$uxO*cod{`atu85PtA``2N~F+%7}7zF0CPtbxTs^U@yUpS)Q;f!bOaKan(d zG3kp-i1%JeOgfJk`$l5aI5=%|9u1?w7@_?);xys%pG9Ra(>IkLKx zj|-*}Bgc?)lbRZ^``{}QF4IIzI0sC|54$>{ z>sdYy|4}*{aX(xHyvtm@2ZiVfHq|M#4W^G=R>HwE!f#X z+8`hP;eSoU9rK7K^WaA}6F>Pfv2+34y9kzj6_$Uk5`Nh`-)ytsF6-=Q&G zW3(VySH7%GZ;vecdr4CTKEEA;xNltd9m;I|$&T`T| z16}l%SGXY=2w} zdPD>1@=xhlaRGR<%7SU@Be3ZY#M`GqXD8`Tzk(fGm7TjPwNn3d(F{sS(f+^Z`AV67 zv@#RWy!l~OiL>8ETskMOe0P@)aZ+^6GMI5yPT{n61@V_(gH|Qqsqm}5j2o{=buGD5 ztRJg?c-36bfSL@lc~MX9TBz%pZ+`~6fi`B^`6RL8Tkx(A<|ED0g~Xp_{hac-&EsC+ z{&n@Fnb#8y`bKcu{SUqb&pbiaOIl>@5|tf1`Tjky@;h*7f8KrWyaoRI7`>j4^l{@o zL*qYoz3{|9!1|33{~_V;qDYnoAGNq$o-bh3r6Hi|JptNvw_&Mj@0;3((Et5l{b^FZh~u? zNuORwy8heH^kca7ZbJ3&v7&aEd*_fGrB>e!RYV{UkevX>2&7hhO*y_h{?EFRxa^a; z4IGzV0hfG?kekHR%gE)4iGMmq+vjTvCs{?Ev{zAQ)osKRo1wcbt6Q^vA~S)~QNn(! z&qv4iH2FfpAMrX1VZSax%Gy=DYIYAPja}}b_R8ZMi94H!ts4|>^_+3yf+Ko%xHVt8Zn%9|a{fv?u#fcY_IzHD;@q*= zFWcx@v@Vm)M!+5I0?N1;b_+iwr(9}s+?|s zyS>obwe8GRn?Ivrb>gEU%{L*b{V8#L8E=k949h0)FR}P+0RR8}>Ec@e000I_L_t&o0M2L%j+WalZU6uP07*qoM6N<$g02^( Ap8x;= literal 4372 zcmV+v5$o=WP)g`ObHJ z_#6NIwHz>vgJk*H2O1#AJ`HJ{deMkhJS6$cngsp15@dk*WmKqi#NdKGV@A%a96P+E za{P!A_QiJm@R%JpJXSgO=90=Wgt0f3>=`v|Ug@ww1ymX$h*vTsi_^1jVm@0gDHC7t zozaDbl@mskc#}p&2809adf3Q=xv{$Z+(=D+ZnQSv)|`YOCsLcA!+B19eSQxw^5B4= zf1MpSG_rH#koo&Y51B^;SHafR!p5So z$pj$q;xNV|Bw;j8#sT(-Mquk}f$9_J>Ba89FcJCT|BWb+BXem;h#(#8&a9m&v5XJ6 zh)<&7;b2j2tTrF@H8d&#t5suZtOxikz%dM<-Wt=mE}WG{w{Br#^*}6wuOj{fIZ`%q zkemnuIOA+c9O+Nn3|E62hYu>u&j=N%6i`RQ8D$F#8L3FC7Z}h9hi7jsj9~_t3DD@K zHF8?ON-{W(Fe`MXmlvC9#}2C7H1vi-06G911;?jszEiHG7PKDPIdS;hZ)Rt#F)rds zKv(|U>S7;sK0Ah;41`;iBDw*Ff`i57<9sCVCWnSC-DeN>m;rV+qFAK-k@y! z$&!*O8h;#tCP zIDQWHTH;7!8u*M&!YDiJt&A71eMibx|B#T$Cf=9O$UwmBydfC;H#Gd ziys9_*27dB04fdw#jnFI{0Y#fA8>Vlq~uu`MO$(xPdF>hlIL*DW`h&!3$8DuO{__X zg2SfPmIK0N7UX5D1~->8k^-%Glwyt@j!Iphp0k!Qi4p$Yo3O{eAhmTXX&Q6vFtF*j zz~rfbXx(Zvn%43f))l~lEUbQG@O66m1t{1M8k>x5oN%Cd=+j#YA9W{<6Us<1>WUB= z=W>VmbhM|@eg0CdQrD)N)hC<~+q$7t*+-|13M zI_`%&Nk{A{9neDHqgw|*c9}1JFC>8A3~1JaE}BWK^93t_$GJ%tHo%-Gfe_{2 z`xvljCCuWL?4N_-7>oZCSo|DtAJ@Ve!2DkVONm?hU+hHpfGf4G58_zAL=9b}H{^&l(4$(ow5<;z78L^^VGz$luEQg%mR_$1(>UO@Ltn&A8% zVCaEv7dGK~aJ>;o->rL!=7OF;kKP30dJuYE3XJ+TGt&{EPQ$D)_5k%dkX|o_0a?Bu z0$`M2*t;g9H4wu8(XE4id}UT}8pvP>P6&JGh*K}f%>#UCHnIMdKr-_>QCLc=Y-kOg z6U@TkmRU$!V#pav*42hhtd8!n?ig_}8V(eR^f-qOkhn!l#DSf^Cv1T|c@&<<{MA%( z{ywnl53qG7Q@E-MV8?sF&Mg$nQ>%p#PI5aTb;5Zt%0gOidT%6|g-p{T3(Xw}_G{1R z)0I>WfI)>2NhIaa!coAI@ks98=5UE4dw`#h z02bT~lyDD$@|z?9$}aV&u&wbm=r`;=Se;zPpi{EGKUo^f$j6DA|Ak@s-?DLDu4trA z5lFa^0!BmG(AbbPCzp?AO@_X~4NOw+k^!*ivF^28bp-GjWuE1zWj2Vj-TT3Iy$lkK zmv~dy_rJt8Yq^~{p&$|{18_P$KzdaHvW+*|7jC#}AmA<|bQ5kl&^se=y^~BP1=WpN z`$miusJTR=c?P0&z;B-dbX5ksA@>4|68JNfe1WkSpE+LcM(_uaD4fnQC9zbo{ue+z z%6UV}p##(}9)Yu?VQw01kW;<0WGnPeP_kgi9ymAP{Uc4+!|V&*u7mq3D| z)S%B}h^nFq9FKaa;y#WiSo^I11pAt3l6ZlKx>yRI)EYN<6|YvuqZU=sI3%M%9FWrm z)-aybsYo~1Yp$ZrA>Jmq=6P`vHI(Oz7B4FsfD1-|#YZ;lEIq(I; z2vI4Ck=dmyZ_rc#3u6pAbme=&=LZPwztSC+&Wb4z3?hTHk{ZrE2a+MYgN*htLGn-r zq?^6t3k87uL4dMAoZnhQdVwn;j^R5m%$6BH#V z@`?u65Xu0ggxqR|(aq~S0KG=sg^m@65jeCLS?x1vLkOX)j_7{fC|uZoDA}@*NyD_} z-@6@om6hmCr*kg78pin0_>=5V7>0XL4#*mF!+(nyx{Y6?$%4WuQ^<(L=n`%mUtjJB5<7t9Z^o@l)UzKLdWlW7bnfxm>&kSo{E> z4|`5qG-lW8uH+(5^Dn&unDQ7<&iBWL=V2O-^K#E_P4meM%SqDseb$iCfYWm?fZI@H zf#wZh!Ym(ukmPMNMNOH~(gqs2=QH5`*}#1d0|&~0b)GfP%w3WiILq)9+g0p=xj^0S7L_MU60l+Y%ke#xjI}k4W z8gR!Wz;}NPTt76mCLJz#oT{w&KM~&kA6~I}8?9&19{442Eu;U=tH6&&!|wTngciox zYu$K%#PTxb5Y7Q%6Cc;aH$#R9l$VJ!VY*#}G|tj#6K44^&1mcAlbD8u5#IsY2Y|iX z_{O4f%ccWw@%uo_l!G7@Y~8@@EC5zK3Pkuuzvl^H^xd$#KLQrs1^k+L+0qPTgY5aZ zHo2Li_zxOf2}yH&>c;IQ2|8tUJ@|YF(77uxZ6QpjbDlRascb3oqzB z1yEW9{E>1#=Jj|l(;VUk*GK%ew}8!D`vXrT1{PJk>lBgx#igueZp5+EfjKV$cRU8K z`(;S*AdJQ1NF)*na|8SNUN9^(0T|HM@ZL!uYYhAYi4o-@b4g!74j{JnNc@SUm@4)H zkKX~j$xWz|`KMceyO#jdX~Z{11MNBh`?mAgd;{3P&%!PISntL2TL0L6xCuD48^~-2 zTyrDKf(G9<+Zl|JERCxM0(=41*Vns^IyDuVS6KL129p8&V7$b$W zK#k5pQ$v$l^uRkO%<`|V{**5k$O#glg#$v?79IAMCdCY%NXpXwPk~iD(iYxG2U%8o zxJkDb0k1GnkB$JZOBjNnA6q!Ugw+k{eGm(*z;d+e)VZQ~I-O1>V1b#|m zpSm4by8!r<8#=8%ljU}YI*Of-KFQ{jU6%_5`y#y!7A@8Y> zBQ_tQdGk1_pHaN)jep-0`)*Vf=2A&|_J+|h#=z(EwS>%U;QKsjrmf`lVKp#|Z`6lg z2U-A6vxf)|bHhJE2y>I8jURQ$Xc(?hXN>y(W534}1&jo^iB#8U{Izy~mbwjc;(>P$ ztS_lD%VJIt{i3k+r(+{`^FaxI--onLa+7wbl-3iPl1OR#mWO&%EMeX1U9R_Qayez$=dfuP%Zm;MIj3w}eLg zYT{Ru_H5wg1^g43I_Q9O7FPw97p&bsk4C9sD6R@FFH9NF zx8IjbM@9-x<$%_dF1<^S7QVKB&e9#;l#>V`=2J~E5R4ME$qA_qN1ur^+OW!&!viV> z5RZmA+}OgsX&c6hjqpi|uIIj6x+^(_#?Jw8j8I3AE$qJBPUnEA#i&diomG11wT{mo zxP0T$;4?ASW}M2LVrQ&KQ()CO!#E%fEkzm(@m7-te0r>_d>#BKi-bOSa<~1?tkR0L z0QlbpPHQ}A=&qip2RRWTiK20E$lA~6ZmJCY>dh|#D`Gq$1TLC7ZgoUDhf>+#fe%I2 zIJ|HKWr&V|;4v$8Jg&-TqVt(wx)`oxjyY zRNT1c!0elf4$lAGvB0l391Z-snl-Bk#uyKeh9w#0Bnf4toJbI#q_aulMI)oDZGaIE z({S9`=Y>P#9xAQi`3t_~PzAU{L^?SY^10d19=T%Cc5mv&%Fr`q(a;Bi?UB%jH7tv2?whhm@I%dof2%V1%%bgfDtY?# zd7*qvGs7iQB@?H7OE{x;whl66-qDwatSNuA&#FUX2;=)ce`sR% zii#@)8WYA5KSng7B`>eM(EpE;an^>D-?cx-0msOP98t9N&Zy!1ID!A@I-~gEfPI|v z?*s@m7ET6>MzqyjSDo_%1ZNy^^0a9G4*&rF|9_J>C;$Ke21!IgR09Bu^n5M&qU+ZH O0000IEGX(zPaq3#p1}raxv}Q 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 literal 7401 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 E0EL3`i~s-t diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png deleted file mode 100644 index 13a4c4f0095c2bf495ee4558dee6301cfd4ddf2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7401 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 E0EL3`i~s-t diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b52b03baa2c731730209ac9602f750900171f225 GIT binary patch literal 2840 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 3cb9936cdbbf1186558fefc6ba2943158dba403b..fc6063d76dabf8ea51ab2ad82093530265bb79f8 100644 GIT binary patch literal 4017 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 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png deleted file mode 100644 index e7f70bb9448bd483a8d7fa7c3c96c098ffee535e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1803 zcmaKteN;?o9LMM0xs%(p!<|ua8g!csdR0m7?x?P6YEz0-W>MWk#j2#TO|doekmMy= z#I9H`dv+Dcc*{`fN=a{=6`GccL{?MN3q@Yq$Ju|3b^LMfJ-_F7?s=Z`{eHf`XX}DM zUmn+t%VM#3e&2Zq!>{JUgB!s2R?@DA#WG<0yyu3bBHE_8Nv$q~bYb3b9xwVyi*(LD zzsv43a(OQ#g>{Uv^hi+m`;p^+7A5S&5g;vU$qhx(le^_>GL?+zUfd091ccT~ zAKv8~IDK;SRjvtGLc(Izcu;$f^$Tz88}!>$EN(9RJ9Jm0a65 zcEGOGY(h6ls>UvLzIGP+kTTo;-du{FT(T-F8v3AJ9TVOlx8`7Bg*xpJipEwfXNPg| zqTu$H9u9UdquQXz_{P|x;I5W(iZM!VEyu8u<|_|UW+5QH#G$#>AGUkyVSAOaCT5^m-+>%GAzTFNDN?%GCByS! z4T`>TJUWh0n-ZD}Ifsc?XOv7vz%w>h3?+|$Jbe~cSz)2-^I$#pupw0|)6?CSQS>7P z>$)Ng!Z0$jUae%fqpV4-kre$-9#`p!0Fw^MGO7f#XbZg00UAqbfNIIN@lKU0H#=IOz18%*@+kobtNM8H#c z(L(#iykS0}aW743;z3#;-CmYvj)0zXHmWS{t>H0!hUU#M)x{+c))L~C32N}=T& z<#Aa`#%U<7P6TndDsl0mXq(=aLx00P8?AX~k13h32iqhU_=GG!)GSJhfKzG{`D#m5 zI33@~6X?wj{oU3~U)xoQmj3=!j{h`+RE;}Y=JRl;lIbmYJsCCU;##j6r}=72QYBfP z(G`S@UV%VxcGO@oI3AaEEP+seu5Ku+xw02Vv9l-tT_OV90=3F01c(#bwY!XPZQ}AV zQ;qHz?6XZ6`U1We!yf+8#2FHtU*QC^eM!Ek0)}`0k;!|Y_zmUxBVq)UW93bbz262= z^q_6}RtCZ`MlcRp+%pN#Tp&0k)BM0SDL|xyNu29thYMsp1j8wuCV;1 Lf!@WQ^u~Vy)jj58 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index ac8049926f65fac2cd8269bb54642c0201f12c6c..ccf837daeb71f7f3e4c6473edae01cbabf7c6dcc 100644 GIT binary patch literal 7713 zcmZ{JWmr_*`!x)xGz>$xbPOfkDIqC2G)TxWv~6mZ^Z1s;$c#=IX539KL@m_;QEh5b2Jk%F$JN5lR`fkgfmcg?cq6KXn{dAazOQul9-_NW{1GJ>0x0^lfkqz-Z~h=74>!g)!_d^h&dsN z$^KLSrTQvDaT*9-4DK7uvrlRy7Nv*fB-)NWOv?OZ3@m$Zsf)b&vEQ=!kFGA?N`Eye zrrQ5Pmb$!uqn%b;2CdxamiW#VTk_|OXBEB+1#^ZjIhLnj64-HhX>Lv5bqz#GT5Tk%z-?GIZTS!SZF)g^s|2R34L zX>v`-6&EaoUgCy$Cd27lXuzV2OXSEw8i-H1-tw>7$r*lOk^!*k06(c#4J6tEKf|n~ z!H^c;7tnTD2ZeRAqBLSv!EBli34)8BvQrZ0G0U92cU&MwAL*NQZOKj7LY0ZgzHu(; z8-V0GYhjVV!xpxK>%n;2^=QAV;3=pGdPR-7-HLmzo5Ju`6>^xr4sQ*6{Ebyzul@tu58R3dfS6Otl-)?4?Mr&t z5UxO+z-PY@MTZ@zb65-00Sz5C59Hmu}=Dp8=%fmJxQ+r9$0God|n}6@dd3V>n z-Jx{=`t9P3oUelHwZ8aa%Nx7l?>kHk z@o98v4&l$58Jll)o?Ib&OehAd@|bu!pOPe`7dz^TtHic?=_z1ME3hz`#)|T!xVfgi zwlGMY!)zoVk*aT#%~~S`(nlqiR4t;7t@8ugbbK8r;MyKm9rKP2(L-Hs2RA1~FX_Dv z5TGm6!>%&WYSCR+@j5K^5R~;mDCoDB7@5FSC(Gxw7h0A10l;RF?T{^LTG$x-o`3vq0I_6m9N4z`7Axc)P_Ry02=-Bm)5>n;QO#KXNdoM#u76O) zD|R-HMSGldW6#bvs{}6`v6rNmTa^ar5On=*PafH>O8MdugWM(G>&_35f@A^uk8zc= zY!872=K`FzggEef=vs=TQ(@{>kfcA1)GJf-m-2IMSkUVz@%5sXl7h}o zuBixdlW)*A@d73)dYF~H$Z`9PXuC}hor;-6nzen23wlY5x}vJVlq7`8lI9zk=0&p7 zMq?Mc;gyy6V+K7L*G`<93wE;deSexiwEE{rl_lqKhTf{oZuM!I!?bH}F%y!4{JTp| zM5~S_KIcdQXUfyMd}r~KMeSd|B5GGMkQ23@lTcNg?>HG&=>Y`F#e0uo0Y^FkXJ)+F zO@@{~P1oth#d=r`8W0Qh1Qsd{yK=%ywCegrb5l#KQ-2@PmXE(?BxOYxZawb9Ta@Ho z=dqlq6iW;_u_^6vIz8nHt*W(z+MM&i6|3=0aNnOaH5hDUJyIlY2>G=b<;;vFz2j2k z0Z-gt2__Hmch#ArA>E(!S!>xigW+ymxCapX#?}RK)S16ut~acQ{5(bDlFadgJ{Wl5&pJgV z1K&PC)4Y_9f1FUVW%Yj5%{yc%aIOm$^?K$-g2CaVp_soBvCn9scYA&3 zv3xiOO*=`iKM>`(sUzKO@wPK%d)$RtXj# z6HzYS9sx@sATZC3_(K(QFtnX~t!SATs%p$jNbPGj%DdIpG%9l zLnI`A52Rwb6{yFBnUP?&45_Hrt9VQ1m$L4_S|5_Z3>nbvFWlZZSfokwUf5i_$OU6@ z=+SL(YuY=D=gwNx5?^b*6Cr7pyE9MIsI;gme4GG(@ zs9y#wIvK?bntd+zWdqjfmDz&njl+4$ksNhK8N+SNs~#rsnFnY%fY5h{Z(KFO=Swg0 zOkUOE(4qAFc~a?=!6jFnu>EPTz30Tt4l1*bFvgIMn2O$z+^;{~CcfDcR9WrI%?iE! z;SRF9<;P#VfxHKd=00oQB1imH@@*-aG615RV2>?Ay5yQi z)Xq&sZMn7^k6p$;t1)vQ`)@t8~)#IbA!r!sPN5oTFS*3|&mDwrTD| zG=(_~d}yGMQ@oBX-SlqIZv}bj3bbI z(BO@i(xVoHXL0hL$hSXR_*0|MD6OzZM_uVysq%1_6sc%o&fRdUFY<~Shw1ikC5@@A z0`&XA690s(?YIH3M_>s}mr=Iqgy(EopH+BdW8yNL?for?qJY?tj$E5KwB zTXxs_8ec-wC~Whr--JR`X5 zzPVS(Z?itDWG>RBE*?AT^5GFI&3KEuD9#MP_nijnkTTHvJLF;_HOY7mX^2%NtNB=O zu$3WiYlmyq?Y1~qjHlFhvrfm9{_))6yW`86$i{Qi)KsP0iAaG!RtfjZyi#V(tcS0?JN1F6@bHy(Rf7nM&hhabN zR-2vqM)LCN!gAJ;k+UHS zSeebCKRXuB)RyYGZTC@x@aqvaA^(*B4w&TqGO>h>(X#SN=c|b5%!WF!iGYz{I1ln; z`VERTtcD@yC{rd8@#2Nu)KPoM_7o#VL~q9$6={&0@6 z@qpguJsR!h9^x*7ks5rr1AK!kQD+Ce3(srEsII$wgr&5`>8p)`T=87#2Lf{VqSmQW z_tWh4w_-lnke^zU`JO3eB|>oMP)6AH3~I~RbBIxS(zIV-*0uoWNhnM?5OV}{u+l=9 zxCVW=d%RXkxYk-9yXskJO5hfZC4JYb=f=(Nzrb^xGUh+D4yncE0SI)EzoU5&>N5Re zCp+dgfW+?Vk@%SYr~>o3w7Hgi)B%ShT5Vb$OZkxl-GxUdjPJI_>`ubRw ziqHL6)ZTc+f(SnjTkdVm&<7^EI)>^xCCkn)frzJRb2d?C_2lYqC3tRUWTlQL&JtsV zhd(CQqERt~kU5@MPqmZ)?UN=2xJldhi+FJ@LoO}1%MNAJ)Jd7A{i)kQr`5d>w~S=; z;TZ{HjWHb-S%rtLWVJvSyUD-*$y9)l-2AnHt7Wj@Hv5#KWmaqqwX~bmutqD~yCv>- zHAh?;;R-PM?HIar$c39XQveGJap)FejR~&iu=E7i;&;t%63l|Bgs0nqMAOxB&x{sI ztdj~Pri`ds9aU&k`1vgU!gm~r=)(yc7im-6mk}cL?vkX3*Ij@XBWbY}ltd)uY$3PV zQ-Oq;yD%!tu)1UzukWRXR``MgL$>!&CKDEORz~PvNh?KDmIxHK-8<9n+ApeRlND#X z7XnYQBu=nY|{XvWP3RGU2@_3ohGeu?cI1cULj9|HQ4Zdq6K- z=)d}!FcGK2P@A|$q%8m*lmm~}J^z_~d3#{`WB5MWkd&99zLZ+*o7SsxOEe^#7cyN+ zfUaEBr}H+KyB}nvChJm{qvT)rz_7La7R^PyP^d|Gf_ zR%_a%c-D+38Xgk>hKE#S}EI|ZHx8G3w z`azpe5LZ%#4>>qTOZNuBD#lOBa$39Ls^1wE8_r1avt>zVl13WlEca$zc-Q6V{r$E# zRyT8O&BU?Tw2J$yOmod?)E%?@OrWu<*-O@5j2CO+eODHg*2)FfGn;mGU+vWyC)tRt zb z$9!Hiw7*OjsqHc|!2Es{hja;-d18pYf0P_ptHw`av5%)9Rx~_d;qP4a?(+&0=i0)X zANVbI7Y5a((K) zz_;C~?yalb9kBTGjDNv#K55@Pc-~j~h4sgf`$55;Zv&@3HJ|U;SZVpI6{x>W?n((S zp_Woq_GnQk)kT*CL9&BWt-{-IQj0KBAHD5>=smic>{ZrG&h#27P=j|Lk?ain+-I*p zT0%3jhAxcMUV@?FStw#mY6xnq{)t|mKn;vb zC;&jqvr+RUsk{kuxhdAk*8;;fKBdP_Xjz8Zi`2gt^to@m1n&Da(+av0*k;-QXTQTg zF3)C5&Y~;RSgGDSnVXYR9aMHsjGho@IdNOpIkn|@z>N**vnSAg7xd#?)>Oq@K`(={ zwP%OlGKQ0&*|+Dn^ykln5T2?%2ftzSe@S!OXBjNw(Nrv&+A7*nh7X zr^2{;?(T7RcNsmOOm%XZGsJ(In{vMwxfrlU4*7SBnudrMy{!}|e7j;+3hr{``G)xO z@Srk(Ms|4}>^REJ&jm4OnHfB6CT}Q5^0lPpZ>M)6i7T6=Dm!R<7+{D-vrsn3R{gOJ z{cG(lX{BctDj61eLhfP^KT60z!?XckFJj9s)(d$7nO3z|Y|BUSyoz`pWyhw-j&{;< zD*$FanKK|S{vl}kAzAV@PX5&7D}x%> zUl!T-uTXR#P1evVa1fS-6(&fnx={|f@V)_oiQDVtSzFHxE|3~*(|=Rb=R}A_z&gV^ zbX=_H(>|4^-oR8v(o9Z%Xgww0DsKE7E9bW-f7ySYQR6L=m9NUdeCFY*BURXD=KIda zFaLt!a{9d-;#6sP^P1es`+aVWl-DUo9u~_R1dqEDd0K6#!zSosOt%v^Oq8UIfnc9twt?}CO zCrf3ysUEw>;4j zLTQPZ+a}ah8cHT>3AXW}M7eQuUgv3xp2>;4)WZQ9*o#AP_hKG%*(-5e`Vtp$n8opZ zYDg>1MbBZEh?H7{l_nIMed_RVM0%x}G<~18A71h9PZ$Ba%( zH%D1}G*|2@C@#kyz5udbF5EbevOniONEEr>2v?Lma)u2uXH?TCAMY38sqbT{yOMUT z;3wY6YcG!FitTEG-X@|Nu7)e3Y#h9Vsl%Dwc5a=hFUH0*z9xDWZ;AbG^PF$=Yz}3H zUXFO64?TP3kH6Xgt7Rz@9(#q9HCgL6d<{YXP!btfk z($6VWHAJ;3Lp=7BHx(Q~7hHbL-LgDGjFG>zi3QvPO2>x7D)h|kI=<|fUj(kE7u#qe zs-b?DR-eC{+j+@B4#);^dR*S*f7-`OQ^NQ}4_VIra6kWR5eG5N0l6bF`XiCz;Q^k} zzZTu8Y&F}Y1R%`Ek2YlKJFtuZd(PIl=VvlwMCU(mCgJ_HG{6|+%~TM`zu(6@O~Ax> zge)~V;cc?naY5vF7fM{oFe3Xy?4yNk9E`B=UqocKKC|2rV_u=Ojaym9-eNM)!um(P zJ;69z=B2z=NlvO5P5d2d-O+^>_lmK{{9zz9J2mD{@8@Fz4n>$iF@nGeiT@x?tB;dP zyLHr&o{I`_nXfEv^cpH~^8u(de8vExhZ)L0!zqaE@N(;)D_8ybdvw+RM^>^gTZ}j` zdDF25JY)c7|I8!6Q@uVQH^z*s#1#tr4jcqvLa4Zd=n@t2F~U5@>!HKOPiZeP&A{r= z%#LjgI~S7Lmr4H%q0>UjvK`g^{Fg%D^Fp*M1%`*(whr z4qtK=1&;EqL(YF2OhMZo%E%-F@Tk?(P!YVdL)ZE*tr{->T=}Kll&U znpL&BXS%1R=IXh+CrnO83<(|=9s&Xa2_P=4@Yyc?_k4r-e24v{JBNVy4gnDUqvQ&C z)(M+qtg8I*QNayNl`;ki{k$U)`4gK5`QsZXjzT2i=a;;@@85s_I2QR@o1j-h~tWzB$k&2SIjc#nR-dEXwrAOlm)l3s*^o{!O% zFSbiFSKIrbdVsY{_#H>hvIanZtFORM z|KBH3a-tUg5E=8QEKnrn`mj5#nA+A9rnU}dnKxOh% zr!pfMx^1|p$neu7Hu9*5pAm=^8J{YeoD2w#aemSxpE6bwxLAKManv|JEorjXVMEvM z=koo}GuW#g24t^IlmBMHD;kRwzvn;Kp+}GF`!6!H^$FXp49)f+*K+k3 z&9!;8L&;5+0mD!`-vP}?c}(*mb~$*V)yadX_|#y->LAmydCe`kGCk>Za8T*o30Zl= z;bQE%DyG$_`mOjzi(?z6nVvGk_G-@MxPV=)^?FMC&!OjGC$)RNL~D$oY9O+I!X6vh zSy0o0xa90#NK1ctI>@4!eep1euQ*!Hh zl2U`eH42Or73R>ILDTIJ#a{}D2uDOLTKDi1$a^@J5|Ciy;Y1tv1P&6{R$`z{AB1B) z8ZY?1J8d4A&;;nD9|0!Q?&PvPDFPXHT8=X+7k>%h>NNT z)M+l_w&uExex=m+-42R|Ubm08JC#$SVXVatQI5pqo#qX0rGll2>-@*|YdQftJe)O9 zn7OL3fF$TGKKU*pFI6^qTZ%3Oew_KA@8tJ@iJNi4{vkg`Q|7AkXd^cD97 zOeIM_^^iP`5H&S40DkxHY1c$~Y<|#~s4^9!JUmw<+jzJFd~?!ya)+-T&1h{qZwypq zDH7*5Eh$jr^_yuHjeueWa81umc}06e^2Ry7fkYRBCO6)0%y(%fV&s@jJ-B26G(`h+ zpC*qjxvMoK!S5+y)7+tgeXAjzMK%!4@e8WFO67-Vor2LiD6{kBV))8c7>NyNc)RIh8tBb`@;pO-zTk0V7Sfldk+}vlc6d^V zpd*%dav+F34>FXAp{LLvFoc#-=FZK#-X1rnoXZ&-AdpIWjDN6Y*9*t&S#wu}H6CY! z%GA`6d4RG&Gz)55TXNcQX7o^JRQFSyzd?&ad47@~mt7v2owRs!(?+KOuIjDWAHZqZ zy3vv;I$h^ic5?2algRq>NM50d_p$bw7k7vnU=8psl_t%}wfa)s|1e*q2v^AeX&7}U z#dsKpCar{9qwZ^N7a@6R#SgqswTRZ{?Zb5O{gSsb6?lYujJhnA1kR-1oy6~JD!@_U zo+m|UZ5fbhEVxsp)05y0T4@Z+oBQ=mos?H`+^s+uJrTwdGe=`>2jsCjW$1N~W}rG% zGeD37(T$wFXcNp+%GHTf)S@Y!0hI9XbcKx1*3RJmT_3%i^*xHwE`GUr^ebdBnx9Td z80iZt{acSA4Ud(r3c^=EbN*hTAFvX2h}%YMhD3_OzTs2cf3VRb-_6j2-U+b)sD8Tg zIgWzk#OF3l*4E!$Jj*|PiNBi0nDGxCEd`ClfVra$(u6&ObCHlme@x{nrS6up^$kiT z<*o!^;&8lie9N<4Yp6(M4EYU9Y}^~n&q@+IL&xs#X8uHs5v7kcaM5nAZ{&|xvGxmi zh%O{U6d`9=(p0ck0x3uR;2R{b^@WqB98)h*0EGE%t~SzqZZDA;2A?J*TG!{2NbR^bjjw4$O*&|CP7~Uhk!kMOG>I`@*8?Spw)PkF*5-ILEbX>SYR~9 z`iwLSP1+^^<9@Mcp#EZ2!T5 z|2AA$G^WfnnEhuZ)l_PmkA`W5Dy(GU8t&;DQ%8k`bH*)jS1t zKHYJQ070&)#)4SmcZbR9N7!oQ`~|g@0JYu*#PPGA%mWm&zL6LnY+i9hOpf1KO50dU zm-h@k^PVyQ)bNhkqVvWCr2-jgZgxU4+?1Alw7Cw0#);sfEW$hA-9>j*BAN$4UhR5d zvz&Bkkrr4p#(3&-6CaAn+Q&_ckN+tSJ;m+_G0B|^fEwqzK1@8tYm1(M?OiHaS8fDk ziaxTSj(Cj?Zhg&>Es?PafL>oAzY5$IA*jp*Bf826Ih}@&p3(68G?Y<6zOj>UTe}0zz?e^1%OkgH`h8xI3Psvi>cDosGu}aP!B7 zl4`~4xoKc(o@g;bzuB_T?DIW^X@CeGQP8oXqilt=qJ0$2%6WoP)#kJx&HJq)T#u5I z5Q{g&6b9nV+vB5PtTZ;Y{3c{s(O87^v4=6*${qbCg_Kn5cO;PcH!bSW@8+qeu80(5 zia*4fu?OQ|a8Y#@!(S6ARN9N=7L6K~<18mJ97PQLl}RdbVF0r1TIai>UxH0j$=rfD zeP&|k9J%`Kaua(>LLx`EifIOw6Aq06W>1~Zh570$T~lzj3#0jkEi_BIx=br_iM&Rm znRbltdF!1v3H$oggq%@F;Hm<;`UmxaH*_bka(H{vme#XtwCPzhIIS`|Xak(8*~l9f zY~J1TU)Q4!UloB45Wj7{k`FDjrNp;4Lj#YN@5)98LcO5MoyO|Ub^~<{pJxh2@7UC0 zvt@K#`8QHsw{DpJD&N@RnGdMo_>HgE7tn^UKNR?jJpCBv*&?1<3W??iHs1o^^_mc$$X~%%)aa;ct0EtZ&8AO@%eW1{`Fjj?rhVgL-Omr}w=!qpMHY?Z`J{emyw_IM1CdX#E#f2dr6E818+MSIb*?qhlLR&aujmU4_xC?_$~&RQ2HX%B zf##6vRm2`Il9&G4G$w324hI1c&PI(=9JfpN zpFuhrU)d7+bf|e(l_Q&l!JGVIt7o_VCxHo@>Ba9%-jB`tb=_`#boN@XhTa+B$DiY1 zQ`X4>C3?+3^{h$IStc_*B4OV&R9B_`ZIqsv4`eZy#cQT>KN_bjR?-y@Gjid6gG9U9 z*j#fbBUJkW0CWWe4;GS5?*CbB0u15PXkUbbqP%O59$bLdE?CEhHYD1FXDJaPFLN7l zZ)LQ5Bv?a?>>`0UhUtJOr?NJU+QZ1Qy@i8GFRk0Q#{D0hqGC|Q0$(=3>6$V9P?A5X z%qm|42aUYn4aU3^k{@=LXix}PEB6uum(ohRI5xGCgJ$MCzFAqiRcsylyG1CRW>6CY&WE0+Q* zShpj=uZp71P@F|QP_PcGr1!CskRg$KJpQ}&(MY@~&>NR+kY}S6*XW%I1~1$4UkOM5ag3y|+yCG2X8>>W$Q~_$f>^hL3bVvxtD14EI1<4|wK$Rw zbjm*XuS&q^SOh&8{<4Z$)g)MJZo~Bo2Qb-8Bsh2B{hN}@wI`3U8sqXN+f@75p!A@$ z8Pt)pft;)7Q!Q3<)(a&FZ-bz1wpt?OETJjdCk?QeE82L@qttfGTd>$I={`y%vT#PaNUdk>E+ROnfaN|gyL9%uNv zQ9>n6sFJQquUoecu`Jw2tHa7BA&s{9%eT953)w>Kjkokwi~C$tA3xy%R+Haq$%w%0 z-4tFIJ_S>Pn=de(>roq>)~odETNEJOE~Yz49#LmcwhgJWrm9DQgUqwP%bu)t>vQKx z9#RI{mnlwHhRZpTG}w(E4uRN^!_tZJhlZyV;2u1oG=&IM*JFs3MUv@>Pg>Io4)BT(=PSesn>U z?d!|wK3|Qu_s4?APBHfbDiN2iTE`u$Lhz=xJA`A5ro-YFj{}1Olr4wBM@`D5zhdGj z9vO~kG4V9(Z#>l2N>jZ*IO`$gCGy5C>UZfTNVnp=tx@YV*d|_svVTFMxK_?Ih&LMI z>0y=~u*pf+R1ALiT=Z{^u3VrLpIz0HSrIs7Gi&-E7qB;XW4kRVn<|CNu6{_xn_PTS zIMQqK6@9XbR;tHfD+5O4N#IUA9XF}N_XfJshDa_4vRLS6%4=w7irQp;s4I)osr}!M z6V;khQAmf6O3i{zAMc|D7m%FuWzu`VP$#+#-P?vxq01}KaUr#n0bll!_f+aQ(;(hNcJH9sx;7l|&hQCHq5we4*tf8W(APLQ zig^cU7xO>jhA9(gOK5tK=G`zUsUUHKW$g+1SuE>sY~fgukp8+7QLu6kf0B9aJM^i* zMcVX1gK3-zc=cPb2YhM-LzErt>z_Nf_N_Y%O{RC6<4vbq*tPBPT77T0sF!@n1%K=> zy~7L)_Y=}Wu{G6~4VPXGr!#O3LeO!jNsCILzoU)eDBu9;)K}fd;0h z%;P`PsTAhy+R7mJFx$Unndee*D)Vwdv1t0GvmubwN6a!Lg zLiX8tvYsi}-E>|7YU}$|kMY)?V^y5NrKhBPwXdebnGOqwme$%dKUP(I9~tiQ>w5hi zVM}qzvEtw$4N|Dp;=725_ zrx=G8P2S_bBH162aXD13)BqtW@uuE~5|c+PZh|1 zT4+~1O%~p2)rIP`tVP>lH}tP^@Xv3ydgutHnpA{kB_n=`Wp-0Es++VO3&@#BIQe6f z7zh?PqF?g!{?&(n(dxh%!L$(F`7#dXAdU@AvL@YmZ%7w-phYDPw1=yALF-7Fr) zV4Jn~?B}o9-GqvaYmRG$g&rHa{eHqY1A=(AL$i7a(Rq5zSaqeNU@m^*dAm$sCT?Wn zbbrpOBqHf@DVqS!kktG?H7aUb{sJcxKgk?b6Hv#XYqA1Wnej|YLxI67HF8u-#pnW# z46EvUuZR%zyQP}{X!c?O54G_AGQVGW4t!e~L{BNNzCbaaE_Ttr9s2yLY)Tb|i}eK? zswBgS8yew!wSbQC7eHY?db>>OddJ97k!?{%ui2jeL3XDUkF`^vf=AR{C^!qp*p_^b zUmQb_g6nqH;2P-pXgI1D?xmSsI{;nR35RCc&aPcx;axY{%u~jyE2* z%FGXG=pO}4L71^yO#%|YA78pY(!tFc(+0R+4;dKRJl1EMk!ccmM$Ph<8!1w=B+aTX zw*Gm0M$e(=&~-n98d&9DJu{fIr#vO7w%_xljiHj0s$t7Upf9l@cIk^Ebg(;40)-+lf4ujHY20!&NiQfD!gJht%2{dtxv&HUN5!^vBJ$60zS{^E>1 zyEO)oGinybeV*eRJdT}bLY`}|i^l;dvSF8esV-1S!&1GbnDF==;{1!*XJ_pevZS&v znUBHie$00nea$PjytOGu3EWeslA14Jb)alFqg&~D>>xteS9VG9xHU6ZSN+nMtx0lU zH7|}ESuALP14|t|7xl9t+^-DZ#nS8s=2me?jwX70>p;LGk?6HZk+P+CxOg_TRro^7 zD)&nTkhUE#3F@f~AIQ3=G5uKx%qNxPIaCFG=SHImu=WTY4tul<2u%`^isaKhSAgqj z`sR`QBctTuo`I#x6{ALl{}~k(tJ_$NGA~3(Tct%5J}9uwG&GAMdb= z))`YvS81tBG+F;cqMlcHDcXYkUbe0RtO<}ygpM?491^J+2^{80LmgDft%g}?Ra{|u zvD$`xmlm?Cknr>Iv#hh!F@;ZY>IhG>gOR!uI z#8WCOyp!&Q`l-}jN%0ppml^?ko`jjTuZpbI)eZ=x-f3O6|I!5OWeGrSWeFdQ(qv;` zf#%r)mi>oRQyOMvP5RA7bBwnqA!O5yfaOdhCh)J(cHPrrZrS8PH^2+px;Qf5H1!!xEx zrgmf?O&kn0LQj$&MTsk+qX5wsmrgsTyJeF8oNt4(({O57xkX>?)|kq~nq)q9Pj(}# zS*muF;JtAywb!r!GN#c{lX-9z0qTl!S)?*odv>Kx!chBph8j@oG7NF-8)I5WnD)3s zg>aZMuX&rlH>rExRaoI07Cbvlyl?f9$}ghlUu)?_yA2*=;-Z?Gg%y>KP$UpdHBVA$ zrm?9K=~7N>)Zz&JNt;4h68;1bHHxSr2A-W*fxR@q*D_!V8^X~tw3{m-tPnvPHv4nG zV>i$8u`q!rj1R&E$}@X_H`t|JH}T@hVmfS^_vaqBfJ=iVSM4t&gQtRtI;-gk8;1Rq zvV9eoD#p4g-n@rSSjM#>VWOC1yR;1VJV3k*enuL^1c!Cdttq zr-%eoITBv@N>P^CH-yK-3~JuD>H=7P755&h=}W2}9NAJ*eu7`?<;wHme%yW5T=WJWm&I3YZSe~s64))uyqmj#J z=F31ziyv0d(eqYwRRZ35T2s{gM&8USVSWL3xcM{UztbZ4WkkP;m0GNp> zk}`q^B-S%nEIci0e9(|st4kb53dIQq=Iho9f>;|Pb8GXXxL&_W zO(rkqI^^V11RK-eWZ?7CwB6c_8@7j2_pxO_nHhS0CB|z8a+V1Vw^684wDmH{vN{yB z7EL0UuGMgwdUb@pUJL-LR2x~014Q0=a|8SJIfP4+F7UQmA(`n_TnB@6Z|X)>R~v`& zw6h>T0%Q(N2~pVmhFgr+B7k3wWvnOS%Zibh>pIQu+tdx%N*K9Q%fiJlist|0oZwL6 ze?*ZQpS$O{L8XxH>@O$*wXL8#unps&a0bmqNywcd79yaB?J2kaF1!4u8%@LE*fEWx zQ|ysW+7Ha{D`jpV!wfS+Q6CFmj5pFez>XFmjaFeH58<~2M78Le;qGMC7Ml61RhhTNWtgNC$_*(&t z(q@w-$lkO5xf>iTjVR#M@uEgTFki;y}R={%bEbNkhPrYWU!{YPlLM zMOqsxFi}_@mpzb8^T#elK?v=8mF0;_fbiMm2xDM;XiJ8c9xqO zRdT$V%fHOVG1kq9gBmjnQ6{EbECWafdl(9Ma>UAz_i2mV3E^}$<&D!Q$xSIU4OwqB za3}b+^YLpffV)+v6ilN`MEry1&{T`K+Rq(b!;X(;K+lHaE?$4y8Li}(cJ|=|y8>uT z;phFP7syJ&>5~->bqqQQ{$^My(G>WW+crpC*u1)Ro`*!D^anGEB-wVh%Dw(QM~^La z+VPuifrifX3C>cj;$EU9Qj8DDCWXDUNLk~mBErj0!>;_7`~_BF2w0IGmgqR~xyEr< zKOuj;VdV@3?oU*c;e}J7h&@x7A1OVxf5FC{(SxdACo0;)K^MnC@Ac+HwlD7jiwJAi zG)TUew@!5El^g0U=3)=?)N7?xm(jl=NHIX)^ zL0Bxf3Q_id5|qQ3&vqJ_Ed45-kQrA+Y{uCV7xG{>MNOX6%Vqi70mjg+AX%a9@L$g{ zvjy(N=?LCG-^O$$Y@X{eN;|+9ZCn29<+G1no%-E`)gAZMs+X%f@YxsLus%bQ1@8=5 z412`pL$=8bLf@ED)!FrywHz#d3z;a~D?B*T0?lhp1tWT+mVP2)93b6@ zT0F6oq!BvLzX;wXTR0E!OQ=y1F|AO>Yo>CM#z5lf!1+D*LT{s-!M)~gbV$7Vy%VGK zb&=b#*P3mKx&b^!q+6>SgXIHmZ`(S%tj5WIJsnetxxNvTAbRpZehevj=gqstPJNEA zyk~08G{Ym;5{6P-^*$?Nx3_Bk#3Vr_lH;j|v9pQ4kw0dw27cSu56euzZ)?21*O zS)%(zXM z$$ab?=%=37%5TR#-9rF^Q#vs1dAK_T2qpX@Y|)+C{}n@kyU^!*UbI32YT%NnPbGo90!%6n~>+bt}QYu9FQn@hh#)QQ-@A`f82>m66dA|;x4 zaxiJclc@&ZaIs}8msZGI{TtL#5Np%?I-)vTm`=*ts8;86;|gS~nTb;?U;UY;+5OSy z5`SKs49x7ebyxpN$$<+qW@2@k>Q)_zj__=r_7+zkW7U6E@44d}T*ttd9(6rsXk{oD^u>Gi(9X--P|5+Wa9>1t(iBiG#Ra(utTOfC(xe6=X zPHiyc|1u|>oOB@>PeBc70;^%!2)-w{YS2N#npcZ;Xj{y~8aZ4ENJ;CZ_K3d1xry}N zW~X@hAKuk>*DjT-CXaMaS`AfL$furN|AbcXvI#=WACY|M))y^bB|gsHT?7~IGT3z@ zxz)1Hdg`^}0n~DpGF)xve}WNyH2uK+Wh7iJ#&kwyaLU6T>!irls@hv$F!r=2e*11y z)Y@yVBaT~|o*boIU_4jH2;849p%-q}z|(OhJ9Ux+O`2odB8|L2g0|=-YR{&tM{hhTj?y?i|jV2N<;W*70ljX9d<5 zR&5w-;>rh0KJDrZ*5U}GZ;w$My&F&X#~IAuYMs};GP%V=DnDr6o>o4-hq_Hysmp>- z(hjU?lV1QBI}~(pY8e)P0w+4@!oj* zShaR5X2~{r7q0-b3+HWHGBJ{N6N3yquNZwgYrG*G?;)j=>NSwmiAmdeJahguKXM=+ z2Z`t5R0t4SjL1ZUtGJP!qSOk^fi=JWSwu-?M+!kP-OV`umuHzkN);M5{AZF1)hnEC zx}Pgv*;AfShKHHaSj!@}WkkN_NUi-FS3?8didWo2lkcOAe^#u^p||a>_7-{mv5BCN zd6L6I`(^Zyuim-?|9188w1L6fechGt_ReBmo#<@?^kUb2<>YnCYqPZ4m)v9x$#{s+wavCeDwO;lH>|>>lDoyN8r^)ttG4x zB%u=N)v>|;4#jx{%3!tq_rxZnceZog(TcN8stT62+k^HPt0XTs$1icrK>&&3roX+lmdvRFWY%p+Z(f}=Lkybo{^GB-sX;j571-je~ zy}=j}n#(%R6x83+InBrN+VcXc|Csgb`X+SBVqnMo*PHM0bqe3qRDR#i#i@^ZI=fUb zUYPixGT6PEdy*z9!0KvH-vIJOmdg>JkPkld&&j;u^%?QC;&f`v#HARgg(JU(W6hfp z3EWE@nKmc(-8sJ_SP(@x%q3h6#LJ=ocjB$zOOR?pH$QPrCaoMzg8k}t4{s%q1e{UQ zo{;_F(Oc4#`rRRHyb{*z8erf>1d5S1-8^rOr_A8#H^Is}UCt$)@$vBTaDw!^hb4^^jX0@zU`yy}>qw3`c zWlKlxs4m* zJ5{8m<8Dh(7Y!soGcS3cLsM)v`H`>Wc|f9nb!O zVs5hpb1uWVe5sFslh1U);pN%L=pB5ML0{7&qq!B{u>fU|1svS6aR04U>@;Vz2Q0UY zAn0Y;+4;}5NqVzLZhkG0)GC7W7;@Hb%lvlQVzXYWSZj32wi~C~_QEw&<`yQlOiJ&Q z_?a}Z?sXZ{c}LG67_z=9)*sTAd2UrraDNoEopfNNqdDIejy)$=5k$i;tKNg;S_}hPUSa=6K$Q^+z4x+@))9I|;hn@&J~ewIHcDjoRlhQ~fvPhqNMksZG@B|i zAB0>8@&cAZRo|k9XkMQhCB`ecQDze_-NKu!xW!jr^ZsJ+_dP8C89(KFAYXCrA3&^> z>ey->6#5W{)gAAS)m=6cx#PIds}GF-cBoYWg>R)!w2M(@fp3LGbMR2qebxlxJWN>) z@wQUL0Wc+`1c{ppPOQ*$>QbI~x_!yy4x>%#z=@2alC!Muj-6#sY&syzIx+e4p+rsR zTyJCl{jnKQ`zHJduLQO2fr=sFlA^Z3sEd^H>@U9^-TD>EX1uHLQA&QaniKGx%P^#) z_sla@Gpodc_oTX^!6|*7bEVEJ#QG_N{dBloTQ+cxQH-eTgyQyq`(?PV{^KE^o_@+` z_3wK`2OLt=r53+ickz*ZbLXS)d84fzzlw)dFdC$26y%%~Z1@j9fx6boA?R)S@us@GI9*ItQ6gLstAAL7LaH%nf z;ZzvHcWQAyU&|G8wp`o}IR_0eI42-;TNV%QGc~t_SU-fz9<9W<)zX6{ALlVHUiAn* z?iP=es^2R-Rq?^@K+Y=mqv(Lz<-+l52X0Q;%bl zrD1lD=b?La7av!bRc!u?n~6;~HdfXj(zt#|VGRQr#`}AR;;=;er6Aai+`BV6genQ< zVBz!H@5S=P&At9gFeB<=8FMeR)&SQ@arH0bh64y1(8CZ1zh?OqU;Z3nn|F zL^0pCaZy)B)-NSoJk+vkRNF6sH_S1Yh)pq6BsVh`H9{^Yp?xUxlS0Tk_f^hUGs)A1 zHqI{Er`uDrtb}*4Tn|s0V=*DSuG$-IPLkHN{Ne8T1c8%s>pWML+|I`-7VF}wlp9k# zHw-uawpTMlNDoK|L)UIIP@KsW{B)sbSgk+Erjs1V?zE!zbQBF9I$owE7I}LW$UmN* zylg7FkaA_o)KPHJEyJD6+=2S2H>f#N6-vFfHJoz_n!uGvG}FSinj|RNJ+z65G}$j; zHJPj?kSBr-ad=Ww%c4J9yk8|OV6|yBUnx9E-e)69i~Y)owe5m$_+9YXjv>}{#9!r< z(?oLf$(}e3U|YKiAC*SySjf{qi=xQZcnK;JUCq#=lb+0VNeuXhXKp2`({ho#M!|DE zCC#O`Ma8~agMT!45&?DHbotx&gJO=ko52fw>H&J@Ukcp9L)=DpDs0uVCH_DjlIR21 zD`uUu<|>bC?M|cx8iCFbGz-HKJh{_vuNe}asD*ZK(hdQK894p^_{pqj@0dXI0PRFQ z^fJXYJyu?s;tcUtr3r-tW-LH}vN~cBg!M<6W?9L7UMP+}k3{wWNy= zrQ`6iE--jOwUE8zSEjj8$%*zn)kO(k{a|rxZxZFq)RBzwzz9?Ocpdre@IW|E(F%23 zhXmVZxLzT;RpXevnW)ohFX?{Bk2lpc`Yr4I_P|RGs(c5=&C}tBw~uACh%K)&O+%T8+v>) ziZREGQa6x{wl(y>7ib!Oh&*zMv=Qhc(0bHN!){W&&2CB%xF9M%h#Z}g!&6tzwH7IU zf<{KqI0~iju=Otmq!xhA&t+2ybZMm<666}_t3lz9zqcdM={U|ViuH?As4EE|(Jey- z(M^LDjn)j8s=K)%i7EH^yHr{6T1^dqWc}7Ao65FYht_~jKj782<-b|k**5YR;4Tsm zXEQTFlKf*;)$Rb+vg`LajhMvV5-M(}z7@bK3VquqP{`#~I?QOHCF9-dVhO*U!P7pQ zux~ATg!h|7@`SVidRfI%ps`}H!koeooSd%|6zKO>Z~2~PH$i)w?jtKZ%=yBW6_qT# zUwM+L%57$ds%8BO7v>B$y&lC<*}XqP0qhO=Y5RwWhM+P3u|jfe*2FF-y(OUYxDzzC z`AhrburNTd^}6d7hfjCiFB!7KPLs}7?`RHXo$IP-UOU7t7TG#UUKN*kNeg74i`_QQ zYpZdv6Vb!$lg=KZYyTZ@;@VoYPBgeKMGBlW}mzpCIw4)+Kh3I%U0PCdq)ux7#u|Lgj^VR)$ti$!{ zV5L^tebk{)(e2MQvnT&tH{TVJh!;GA-20Oeny%6z1@~<`h~_z?N#*LAr>!IDL)1zP zU($P|9IXDQ4f)&uxBw=0^@}}S&)4nr0*ketB)6M^eVnx!zBl6POsgQ%JK7{Xb?d-F zddu0xF{=n$`MP7P-wYk-7^pW6&WRQ>0%!2&ONSkJbEwzXt4T4GG1> zcF3T-dyU*=pzgyS0(@?zj-?s?HiitjQI5_?4J&C`oY%P(o2P1Uf3mfK4?LV6j2aB5 z>zHkW_optDhZ#oWY>LSfeMl?^>#$2sGIU%A907R6iSBpkEiqjifVYtkrA|D%`1J?t zVH(;PUEe2!-I!XOkJm>IyJfw@8_XFOp4pHOtHM-Yy9`M5+7LHioE5|yT_}1>+a__9 zMrClAg~Zf0^KRuOTs-=;7Uw1YM&LVr`sqM0FEP-Fn-ok%YCw!9Q)ek*G&%uK(~@0$ z+HmkAgCE^Q$e;knf;#?Vd#CT6jJMILyw?-~VQ@F-=l36F6E$<`XJXjuS^3j(SVMN` z7S?rqFm{IrzI;`>``44{{hvvB6U=ObOCQ)xpX;`F9WA8`AI0PAj&E+K$`E693 ztzMMiflqWu5iv!(4W&p+XM#m)uQ_YyS>Zdr0F{53V)puQ9J#z}xeuO_Z7v%prS4ts z%KYuRBz%W4m@MJ?y~x!Z4qdM6M68ZrWM{9CgELlwUh;YL;=A@z;PTp5a?g)#v2Dt@ z+Y6eK5D6hL65%>Q>m^lSeR0tABI}3QQ`>MGsWg$AnG{bjZ77WijXVVYGeGI*D4+kA z+_Rxogmvq-cl?-4_|HYVdsMr}W`XaO{KkrP z`IYH{F! zyPZ?zr+ao-ey{?~yXD@Fb(8a^sXj35CB8Yh-L-L3KFzn5KkGu=HAm765KZN;Mmf3J zwECdljG%nhW0`hwZ8^PAx+&df4!>28zGmHxP6xaTly5Y4$iE-&gLW^p?&xern~<|2 zM(m`LpwdfED)8p*(d-=|b&LYd=Bcb}_Hj;1Pdip@e!D~3meK%{yXwvjc_)&jRkn1L zF(WMaA-K*xSydWNhc|pSUWCk$mq+|))2jtkcLcYw@OyW&*i%1@?&-XPxWC%K>OK%( zDDj}Zb5TBAH!FE1+&8F()>H4*=9)Gv80!-5o-r4G>~Oc3T&KKHQUZv!>$BLCE;WX< z|Flh^7Xq_~M7CbWJSOjEyNG!odqD_3vRui@oTIGrG*V@NM7l+AZ&mQ34!Q+HJW|uO z!3F1dl%Kx!jeicj_ke|I)$8a;iFb$Zei-om*Mn{oTj`3m=3zh2*>J|G2+CEd<3XD2!y#6=jog!v^6aszvhib42*3JJ{+2Xa%>uJ{ z5N|uXbvMJF`*@0o>hs10H|lV==i{LJKbnH<_Qbu3B8>1$ccPDv0@(MCJE9M@A6XC< z`!P`SnR-VJ$`j577!a~B2P8MIklPl;a=8HarG>^|Z=E1v`!b-7+zkIafRsM&&Q_~COks;?Q z->ncl{O>a+*%}uKi_PXgVd!v3wWS6^nXrI$8eR+V{wR%$;p6OnVj;AO(v*!P;-oF{ za+n7Rt5N8$QhEaVEB3|89%%=O63TvZq)$UfRI}+uApqS4A=4A<_5<@6r<*!+^3iil zOYuH)n}A_=Z~wv`neqmW@=E=Rh292x_V)KZ=kM{1#bkc+&J#`$`X&7vDuXQF+uvh+ zLZtRt<*GjI&?(jKslk`hY+%N%wdUm8%KL}CAIGzCyzb;4jpsqmcz2!atBh4`4=L}L zk@+>U>9edT<3g*29zteEY7j_?f+<~$qNaFMweaf_(E&j+-^aCjGQD>6)Nhwvp>A2F zI9sD*uW{*UgMj@W8Z}J=qio9>o>ZJ@d2F#rRX}+HjRV@|>tX?U(cVzM?3McA-;8mF z?e@IKn^CZkP2$E7+`C3sgV!BWVe-|I^WY*mSm$IEG|{SQ8iYnVUN_-aFRBhexpejC(Mt##Lry7{ToK!ddXarcXzP1(Q+zT$X3r+k{=00lalyUQ-fEHgA*wUX6Ve=^3&zJB zRJ2B#*XN~5ix%8JQNO=yoS4huU6>%S3{a$-zZcFe;Y-gCUX#qef~tfPyUQL$@rG@1h&LNw$ACkh*ci69jJ(lkZ;LEld>eGPjRlO>gCg{< zXb5PjwS0a{`*>+i%o@}_8~G4xo3Q!)z?6+4dNs&(T2XJvwTb6)fF4Sg0;eXJi>Z>+ zuz&swzoaTaJDkY|8t3vL(m&g2Xe`2}7ADa+K)SptyEDSQOD1s$@$){%AL-hC_3+q+WR+X$$Vh<5${8brDTG3A+kN2?>Mb!<|2ZOjQqJchDt!Q%aMlfOx7 zP25S~^Win{Z31JHF{ZoGk*RtqdqDIJNgo_Dya06QHPqs|> zXyzlM;(PF34R`s`|0>9BETAP|#d2<}izf`=g<+5^f{_aPEI)fD%a}qoD?gpv8oqns zPBB@NsspO@7lrnC4(_&7}pkpAs%qEPbcEn7GL17$O=GoXEaEUR}tB!lOMEuKA@ zJ(cL~#D>*`^hNcO{fYdz`P%1#U-HqI^hI(Bi#NwjfUS*vR$5;E8*eTJhh21cw=Rh1OGXyjf|58~P{Q7XZqLkxF*o|#G@cZk zw~muYgMe;?nY|)=pI>5uhpu>$115Nxy{o;|w_NYcL~$E^nakOkSywb5(pE4}^5XG3 z!InoW)N|p$jhM-Y;69UTocFd&M};e7daPKF2d_-q103jKhUiJlK%-0OZ3~uvI@Khr z)M1iS%*(*)FxqLDIOM9<+TuJDi|P<4*21Gg#H=aYwWBUWf;Vyu>^c}@Jf&Ebx`4n+ zQCFQ9GF){u&BL=S{K^?d+EJ)py=S%3-RW(pCUS=&BfGy`NAGC(8iAsoFAK|ug@oI4pWIvkE=~q=^eGm zTt`34nbUm6>C1#LC|0~;)77l3qf+Nyqe?Nx45-&e(n?t__KG+lN~LpBH((s7nHlL+ zOC4BQP(VaxhMl4hSQ#Xp_ZSm3$hRgD9{h3a_LnHU0gLPGJ7trkG7o81ElTyAw;mwa zXT&>DF+jE@{U-Xly*ZiiaqP$?G3%)ur080Ii2m^$v(w0Fv!?S-d;D?bwSeUY-4!54 zF-z>p*maAoqj8nDt=s|W$>fzKtUKhnmRUHoChyJ?W7X|Ib39^MfW&iXZYUATT`f&P)3k~p6<$?h9hQQ)* zGV=z8xe0b2OCcSvkgOAQ-HJ#rOa6agQ=$CLVHBcx{XJLQA6Fz3fHf+Yie#} zW{z%8Z!tPd*mw+$+_;QuQad{pTm9;DD}0PGCAXm-St;hN)IpMMMfeZno!qndAy5_I zvLk;=y_opQq}TY~msAjNfm<4!$IR*5beHxV@=QWKSf5jcWDyh@8JvL)C%MRLK!S zR(wNc!x}KBU$Y|_xF+CH>kN&(VvY`!^)r+_MISC4g~r#t$i7t_MGU6?=V$sp!*3>gQVmm+WLazCgj3!yxk!UHn>oWd6nE) zxVG-Ga>99{ymi@SeR~u!*YXiQio7-l2WmBlrk)9^c%c}we3duBnQWs7vme?dG5}g5j+JhZewY8} z_v1O&oVlJebFP`^+|NC~C#~6Jo^L|CM9Im`gwZXLTYi!g{f(z8M(SsSAzAmLyI%D% z_Yt^HXMbGJY3~3NSo7Yrq&1HxWftGiTD=foCF#ErX~$t zLkE`|*rfAo@yuWWf4K+%tO2)o-Cg_t($CG*w}7CyOg|HYt5*FkFx))uiQ=AjNv83^ zRq5KR`Qk&5*HFZbL=U{3tyS~P#+ztW9QV(T;NzdRMB2f@kod2jr%;U@*qvOysnz*E z=N0R6Zs#3S5|d2=U48}mm9pk4@7Zv2qQxuU|4i zNRtYHEH(p8H)cwV?A9x?TH;j8Ll}6lHPc47)N{gA(J<53(ePn#m*21)Ze)CwPw?C3 zn()U*PX+v2{Ue-a$lV{mx!?F<9X=Lm_rIq48~e4Ef8@G~TwJ%61&v6(_eH(vIkQ{~ zu`HeHXyZ8z%bJxZWt{ykBwxB8LLGA#$6uaR`^9CS^hEjbb@5*<`a8i?>C5EH9Qgv+ zEyiu$-i0vvybA?qB0#uHX@h(p1fMVA`WNS`&fF3`%A?T&y$GcuYe@(A(D@eb_;O?} z!J0?q zJ9woA?eC29!OhR+NWyffRGm|9C|1g>$#WG3SEhSk^4Huk-b{~%tX#}a9G~-V)q6(# z<2G?>-b`E=hQl6bN~Rh^D_@lFo_;+kEQ1QBsLjDq0%=Al(~>N%0Z)<_;s47mklH^pPjJPsg8C2 z#d;sKUF`e$rbBe%$JeTp+2{$;tUJ9&<@HE`kv`z`LsuIhLrF@x`w5;%DPs6 zq&Qk|Dwb->y7(9+^khtmv1znrNpfZbeERjfhq-@>vt-)`wNl+VEKN=B^j>@X>SV(g z?GM6-CoQ0XVKICWuAaU84}EbqK1$dh;UO>CDVqG?Nz2xuz1S>WcXvk!O0WC0Q3b_- zjtQUFHWACVw0g$|Clj(2|SkLfoZNL#X1ef0bY`AS&p zTXp^jQ1<)V^vaY+>Vh)7&9nBxxYZULw7z+;WvSswH$3=6Fd6M7bF{C=GTUv5?ntaq zTQCLk3ngN`?#OH%oKcz!e!cdHqiapbg{WNfx8NozQ4uK!7Zs&JHN!qS^6__=6LO?N zFFXXQ^$sQbrgQig%#K7^S3AT!CsUd+A98{5Z3#jUK(h5+cy>aW7FR!Uh+m=Tj z+p6;I>sH3ED?a)7ZE9kNB@;Jr&gg2IReD4GD8qyiLIBJwC`@fEsOOE>`!#1gMf+(* zfG)@0PFINbLvg^&%OR4c`2oI(>bC#fx`AB4;RE)tp7?aN(6qf`HL#u2iZhO`s7APF zp^{yzfM?hJb(_kucj`q>eExeH-nR#Z`E6bVRqs%?8b`SIRdQRquJ-ic`|szYX^EH3MqUD?v$#ET^nRezP&t%XEBc^N zb~VxOfU|8Rd+19Wesqx@X*e!*eE#^#&qWL&_j-ICyx!JOJoak1@RkI;4d$(+8yQTo zU6B#HB%EkFGhPHpa?v)>LzKl?T?_0^Ku1OkF5r6o6{o!h9Q?m)T|E|4GIbq){)pGS z#%w>a%h*lb&u=u*QO~l-+ex-X6%UOf|BKcJrh3(UahBYuSpb={>J7HuP`zQmpTB&qR=)tk@0ZQbsw~ z+sB>>mG;$Zj{zyjVUfqc=Gl^(YR&%6a&Pm#rDPJKcpTo{T~(O4lp*>BK8vwGcDvrYuy(_F4z;ZK7!0z}%6Hjf!+LkZ_^@DJc@ik4e)?*>rBf^Sg+_c4OqPFt2N9+cOw-UjS&P z7$8>Wan6*~kB^j*l$`wMw-s|$)%H*-cXhZW5ozDjRJN9 z{z3B=Z?{9ON37oIOm%3M(L2cl{332oM zL1*JyI=I7Xd8N{D*9kG*C!LTH|N9$%kL9-(zPS&ds)boGe8M^N{QynYrtSo1QdPM} z58?Mr;cIs^ie8u)vO!uqwQhR+*2o~6tTiw;@2NWh~!T<+)>?T^TjO67JZzb03K z(redL{0;Hrq7Zs*JDE}!jW*Pf=ZpRZUuHB~Sh(!|X-Z%+E8TbfxUCc`2|KkJ>-pvE zZMXF3+RgZCA6YFfgzh{N+Yjv=T};XlI#=%IP^;FcA}m`7&NGr&2ml&t8&W2K`gne- zoCPAgWlfbW=Jh_+TyWEpWc8F>6}BdiT62v}zMIo}2fC(P6c^qwP@%oPq<&muns9xZ zmK0rL_;qYHQh|I{CuNY;)Q~82T`FxIixjfAgWU zjT|h!5rzkMS?x)VoP8HlkK0D|Vz8RWWG2W72?pTkU8z75nqJ?958I6SB0fCXDSqE2 z$>t!>-zbPetGD=GgHb)~$4>Atv z0fNB?r0NBW_55ga=kRo?q3xS4Y^p7}DW&CX?bEwaeVp*iW@ z;2+L?>*uI@)OHRCkA5U7xY0IaFe&~}m93s-NqQ&d^fA(GK6o0c&K=mzY!ttE^gYmT z<1LGyqN9*=#Ez_OyQue_O8%24U08l`{Oojfz!rCKLw~NjOOp?TMF{1{-oYUaJv#uR zv&g)F(Cw#*HgTXmU-olL4Fn;^NrRFoCvF?7O`}afhsM)Hg zF9rkwdR93$&WXw@7TdlOs_9KyX9u|#yI$LTodch2FKT@4bg7S}Rv91G!zLz=wRi2m zo#YfQ7v(+Jdz3DPiO+rh7c=blS6_uwB7YiQ=&g&e`cJLr zXvp_FpQ(R-Y2(_W4#`pqy13@cKNrV9D&g)t1JchhnjN7u2MDqLqlB| z6o7jA7dIrtNp5!f^Li%pxSak$Jh+|o-CGj_yU3qRg!R%gdN140?c*35ne(*;U+p(w z$`o_!Tz^nZJgF~LB0=n+)7{`=RVzsFcP+c|;7s=zlxb9|`!S3rH@mT_pEj3D0&Da$ z=K2tP?a-y$?S2ai&RwNRYY|G@54z)nz#R$JyC@FlVqZ&dA&Oass5{nqeZ@$}@jP90 z3MyI>1>vJj!3r~H44SO)H-If#c}q*^7NsrHPI}aGHaX+HP9nU+OW-@uaya1EOEb&XHe6ZZJP={cM=R3H`B_Zz zp%ht%en`Ru#F9zw7H@0HEK+7PByg;I0#+MW6K9RM+LV#9G)QKNR^WzNWWCx2TGtOF z4+%5vpjhMFy?TGah*J>u60xUzOz1!BM8m|nkl={T=$KMq*iG68OQ>t}N)z$Z>bo&z zjx$Qt+h%F2ER@0F7$XRO&sc_&Fvq_oq=A3PHGV{2N3bKy?do#I3VS%r2&yLhaMx#$ zkg!gk*@2n~ZZ8Dy@@XZRWBh}SCfGJfIN)4DrR;eL@tdzQwLb3K*5=XVnag5y%}&!Q zDae_7{Sh)q*d$@OrdGhbpv%91v(161(o_!NMR2Oqj>KuRWFg5OQa4!kQ@PC9s)8st z^14$te-<{mW6!Mb1~qAB+Jltn%n9>36jjl2R`F7a$xt1&smfH>D8p%*G@Z(n`LF>W zIB8$Z>#=DAp*|ATX6;|TTI`Gw%nQf!{Tl5y{#i>7HoZ8oSq^mndON1WF)G-Q7hM@T z@rqePGV)7b`tR7f4|6k^66;O}DKFHN@KJvRO|Pig59zTP73i=vc7!mCx&;M($ljh# z>2J;OK%`{O0`Et=4;uO6-HET(^MqQ{4=k&*oHGnb*@B#NJ~y97S$3)@Q6?VE{;X=_ zTU1Nxt&LlqbD4ioy*ga_-QU>Yyz^H|_vV!E5QuR9l&Bb=y(;C$Jj)>q5Ms85O;j$C z2WSMvE3^!(XK|{1j*fyfRBYHsFW~zDYYR3H8X|rCL3ZM-6rZAd%x9bsRh2gI=75{l z0IRcN29xGEIh3^Ff`VSFLkCs2Oh=asS3u-EW&Uq+0kZvL4+P>lGWq4#=D%z;Rw-3m z<>#%xrc3s=VHNv$6shNyk+nVmZDdqzCtW1u3@o>|QS+l{PBSe2O^;iC_#|Jr0mp@a z(v7El!i$e@UB;vsPmqz`%YL|2xc;}xlphTz+gR!%C6N26)FZwA@qyV2IdLkM({|*D zIC6ik*yP_Srh6ra%J0_>v@f-zvmPKhwm83iy3)xxR3d@dAC3B3=r@(tAD;)}yudKE6SQ3;4JdQ>a3;wARirob=j)ZA0R0)(znM!@y-piySzsMGd zODNf1=*=7~kIPRC$7x`lt1JA|dFrqY$@{aLRdq;0?~p%$T8UTEXbeSVy_XvtBv0)R zn!3F-k-=fz3bsGII4{#EB6Oy2KnI82oITM5}(Q2%GhRqgW7~nnAE!T zR~=ZJ##=dOMnaRK%`2kZU52zl=t-*J84D{GPN|R^{aq1W{^$RJ0sOu3YvPLRC`_13 z_LqS?NY7(st$v+p?!|$yI1UK>#xUvz&(cZ9Fg2rHK_^7K*~=}G2Y*SO9nwFl@e4*L zpe8}}K}3fi&tChMZ$Xl^NzWsTXAyweE<708Vzc!JLjPgkyA)s$bu$+^@8p6oei-fw z^oft$lYa?3z<^fd7enk(ZYV}FD9y1BFN9MrSjuxWO=Gq|9A+$JgK4MILS&>`?Q%IJ zzWHv0A2RunZ8*_SKGJYa2jXsQ)%;*@)lvX)%r>+$z%)f z`wW%P^;lG+Gc;-l(w$4XsLx!f|3-kfUN0QoP}aCe95^Zzjicu=``KWAJSp>A{?cFZv{Hhc{Toe60S`n*_<6L^chrRObTJYD{lNNG&d5N{GeMRDhymcAB!oJSn{f zkxPWod1bFcI^FIvt*^3R3$E^fqhlb*EoZM12=?&Sy>AUt&BC zAL0|C5gVfCx)G{C&P!rH6pEtjGO1c^lg6NEw9OTAuvyFh0bA_vmAx`8c=j~6z?woM z`T_={dd*vSfqEeMiPImSZN9Y1HPy`5L;$)Wn1@({<)VG5qABQ@-*V?@LU+ z=~y~+OQH`$@PnmkM(`GwyQ{?VS19kkoQ17y_oPB-97TE^e)E&EQs0YMP5S5KD6_V5^QnM1+xuWVJl{!M~T`o}C>TuhoK@IN+C#y_jm$G{@!4 zTzx#jFPjYVjwqp}B|W_Z>_ItL`l*{nYRJN-e}UbR*|#jZk<_jg{U)_S1V1tY?sIFD z(RNs#_g9tO+o8SX#T!Qxi9dGCmPBQQFijgT9vftQVIFSBj!ap{oYS7a#9-QPM>W5% zji_bY$}_k6u>e>BbEexnB4h6ycOpyclZ&p<73X*voOu_fb#T7oM>r;-*kDxyB3K!#0xMHhp8KGQV#MNqIB7JKL$tV zzo?gB`sjqoElJA)e63)|irRyqQ(h@J33rGGX5mZ2v`x*)F!bXva{hmR-)~52M5~iS zL=1igk4z<%0V1{9gd51HGY^>oDQu*?5{FC@%SJ)d>ocP|%h_u}+eO2apQ>{F-IjFq)~7AKAm!zX~rx!#mfSuILK zlp}KH@9Bc2H8ZPjIhK~0S8I4Uiqs4Gk>zZm_!9IKqrSR%q4My%`S%IiV6@_g*TJ1b zNRLox7XIG-vJ?&Peb0MPFs5)kLch{Uzg-?Jp*}q~FlfZZz9S;t^IL<3=*I!a z#Ax~RRl7Rjo&oG+pYwhG##EIKXZ+sHvRiPZo3?-!;XBQ{omEnk*RK2;5U0qB&l+`;iA%t zY6G=r1!ko_#vQn3Stsy`311z9Ho?AEuKz@iXeF-%4tEXVwu@MTWW7FWgZDe$jl;ew zQWiJ!J-5b~jjril3sODjpUX#MIVQINa|!YFDT|CK`_Dk*nZdEn*1mT9SOf<6jv=o8 zFM<#3^$hmCyqQ>d;jhdSPN^Ch*KPhQ@X)L@J=`KGTBB;!@C>``T^( zBMLJ`M35th!g0?;VHQ3p1}`H`-+zo?&r7o2*3thM!4lmO$aq`N%;JFN+X%~5_;UlF z%#Cg&3=sO&F}iq+K%2?E& zee)lxc&Cv!>Xz{t<7_M+W`YAYdxkLM4Y`|AUn(RZI%x_eddL+VvM7fpBd!*kjd&Pe z^H;uqCN4)OaQiEu3-dnr@7Z7^Z(wB>{TwbWhdxpSj+4oA8_NcxuLyMX&*%Fg6R=N+ zk+FP!56HITdP`q>$nz*sDbIF##s)y12U$3&;`=ot3e`Y6t4k#=qzUoBntvZ6IvRq( zW|6*!#OEMPQ%xhkNn5QwAtNC@J!QbB!V&mv^yl0c1qlE^+pi=^Mr6ZCNJ4qtK=1&;EqL(YF2OhMZo%E%-F@Tk?(P!YVdL)ZE*tr{->T=}Kll&U znpL&BXS%1R=IXh+CrnO83<(|=9s&Xa2_P=4@Yyc?_k4r-e24v{JBNVy4gnDUqvQ&C z)(M+qtg8I*QNayNl`;ki{k$U)`4gK5`QsZXjzT2i=a;;@@85s_I2QR@o1j-h~tWzB$k&2SIjc#nR-dEXwrAOlm)l3s*^o{!O% zFSbiFSKIrbdVsY{_#H>hvIanZtFORM z|KBH3a-tUg5E=8QEKnrn`mj5#nA+A9rnU}dnKxOh% zr!pfMx^1|p$neu7Hu9*5pAm=^8J{YeoD2w#aemSxpE6bwxLAKManv|JEorjXVMEvM z=koo}GuW#g24t^IlmBMHD;kRwzvn;Kp+}GF`!6!H^$FXp49)f+*K+k3 z&9!;8L&;5+0mD!`-vP}?c}(*mb~$*V)yadX_|#y->LAmydCe`kGCk>Za8T*o30Zl= z;bQE%DyG$_`mOjzi(?z6nVvGk_G-@MxPV=)^?FMC&!OjGC$)RNL~D$oY9O+I!X6vh zSy0o0xa90#NK1ctI>@4!eep1euQ*!Hh zl2U`eH42Or73R>ILDTIJ#a{}D2uDOLTKDi1$a^@J5|Ciy;Y1tv1P&6{R$`z{AB1B) z8ZY?1J8d4A&;;nD9|0!Q?&PvPDFPXHT8=X+7k>%h>NNT z)M+l_w&uExex=m+-42R|Ubm08JC#$SVXVatQI5pqo#qX0rGll2>-@*|YdQftJe)O9 zn7OL3fF$TGKKU*pFI6^qTZ%3Oew_KA@8tJ@iJNi4{vkg`Q|7AkXd^cD97 zOeIM_^^iP`5H&S40DkxHY1c$~Y<|#~s4^9!JUmw<+jzJFd~?!ya)+-T&1h{qZwypq zDH7*5Eh$jr^_yuHjeueWa81umc}06e^2Ry7fkYRBCO6)0%y(%fV&s@jJ-B26G(`h+ zpC*qjxvMoK!S5+y)7+tgeXAjzMK%!4@e8WFO67-Vor2LiD6{kBV))8c7>NyNc)RIh8tBb`@;pO-zTk0V7Sfldk+}vlc6d^V zpd*%dav+F34>FXAp{LLvFoc#-=FZK#-X1rnoXZ&-AdpIWjDN6Y*9*t&S#wu}H6CY! z%GA`6d4RG&Gz)55TXNcQX7o^JRQFSyzd?&ad47@~mt7v2owRs!(?+KOuIjDWAHZqZ zy3vv;I$h^ic5?2algRq>NM50d_p$bw7k7vnU=8psl_t%}wfa)s|1e*q2v^AeX&7}U z#dsKpCar{9qwZ^N7a@6R#SgqswTRZ{?Zb5O{gSsb6?lYujJhnA1kR-1oy6~JD!@_U zo+m|UZ5fbhEVxsp)05y0T4@Z+oBQ=mos?H`+^s+uJrTwdGe=`>2jsCjW$1N~W}rG% zGeD37(T$wFXcNp+%GHTf)S@Y!0hI9XbcKx1*3RJmT_3%i^*xHwE`GUr^ebdBnx9Td z80iZt{acSA4Ud(r3c^=EbN*hTAFvX2h}%YMhD3_OzTs2cf3VRb-_6j2-U+b)sD8Tg zIgWzk#OF3l*4E!$Jj*|PiNBi0nDGxCEd`ClfVra$(u6&ObCHlme@x{nrS6up^$kiT z<*o!^;&8lie9N<4Yp6(M4EYU9Y}^~n&q@+IL&xs#X8uHs5v7kcaM5nAZ{&|xvGxmi zh%O{U6d`9=(p0ck0x3uR;2R{b^@WqB98)h*0EGE%t~SzqZZDA;2A?J*TG!{2NbR^bjjw4$O*&|CP7~Uhk!kMOG>I`@*8?Spw)PkF*5-ILEbX>SYR~9 z`iwLSP1+^^<9@Mcp#EZ2!T5 z|2AA$G^WfnnEhuZ)l_PmkA`W5Dy(GU8t&;DQ%8k`bH*)jS1t zKHYJQ070&)#)4SmcZbR9N7!oQ`~|g@0JYu*#PPGA%mWm&zL6LnY+i9hOpf1KO50dU zm-h@k^PVyQ)bNhkqVvWCr2-jgZgxU4+?1Alw7Cw0#);sfEW$hA-9>j*BAN$4UhR5d zvz&Bkkrr4p#(3&-6CaAn+Q&_ckN+tSJ;m+_G0B|^fEwqzK1@8tYm1(M?OiHaS8fDk ziaxTSj(Cj?Zhg&>Es?PafL>oAzY5$IA*jp*Bf826Ih}@&p3(68G?Y<6zOj>UTe}0zz?e^1%OkgH`h8xI3Psvi>cDosGu}aP!B7 zl4`~4xoKc(o@g;bzuB_T?DIW^X@CeGQP8oXqilt=qJ0$2%6WoP)#kJx&HJq)T#u5I z5Q{g&6b9nV+vB5PtTZ;Y{3c{s(O87^v4=6*${qbCg_Kn5cO;PcH!bSW@8+qeu80(5 zia*4fu?OQ|a8Y#@!(S6ARN9N=7L6K~<18mJ97PQLl}RdbVF0r1TIai>UxH0j$=rfD zeP&|k9J%`Kaua(>LLx`EifIOw6Aq06W>1~Zh570$T~lzj3#0jkEi_BIx=br_iM&Rm znRbltdF!1v3H$oggq%@F;Hm<;`UmxaH*_bka(H{vme#XtwCPzhIIS`|Xak(8*~l9f zY~J1TU)Q4!UloB45Wj7{k`FDjrNp;4Lj#YN@5)98LcO5MoyO|Ub^~<{pJxh2@7UC0 zvt@K#`8QHsw{DpJD&N@RnGdMo_>HgE7tn^UKNR?jJpCBv*&?1<3W??iHs1o^^_mc$$X~%%)aa;ct0EtZ&8AO@%eW1{`Fjj?rhVgL-Omr}w=!qpMHY?Z`J{emyw_IM1CdX#E#f2dr6E818+MSIb*?qhlLR&aujmU4_xC?_$~&RQ2HX%B zf##6vRm2`Il9&G4G$w324hI1c&PI(=9JfpN zpFuhrU)d7+bf|e(l_Q&l!JGVIt7o_VCxHo@>Ba9%-jB`tb=_`#boN@XhTa+B$DiY1 zQ`X4>C3?+3^{h$IStc_*B4OV&R9B_`ZIqsv4`eZy#cQT>KN_bjR?-y@Gjid6gG9U9 z*j#fbBUJkW0CWWe4;GS5?*CbB0u15PXkUbbqP%O59$bLdE?CEhHYD1FXDJaPFLN7l zZ)LQ5Bv?a?>>`0UhUtJOr?NJU+QZ1Qy@i8GFRk0Q#{D0hqGC|Q0$(=3>6$V9P?A5X z%qm|42aUYn4aU3^k{@=LXix}PEB6uum(ohRI5xGCgJ$MCzFAqiRcsylyG1CRW>6CY&WE0+Q* zShpj=uZp71P@F|QP_PcGr1!CskRg$KJpQ}&(MY@~&>NR+kY}S6*XW%I1~1$4UkOM5ag3y|+yCG2X8>>W$Q~_$f>^hL3bVvxtD14EI1<4|wK$Rw zbjm*XuS&q^SOh&8{<4Z$)g)MJZo~Bo2Qb-8Bsh2B{hN}@wI`3U8sqXN+f@75p!A@$ z8Pt)pft;)7Q!Q3<)(a&FZ-bz1wpt?OETJjdCk?QeE82L@qttfGTd>$I={`y%vT#PaNUdk>E+ROnfaN|gyL9%uNv zQ9>n6sFJQquUoecu`Jw2tHa7BA&s{9%eT953)w>Kjkokwi~C$tA3xy%R+Haq$%w%0 z-4tFIJ_S>Pn=de(>roq>)~odETNEJOE~Yz49#LmcwhgJWrm9DQgUqwP%bu)t>vQKx z9#RI{mnlwHhRZpTG}w(E4uRN^!_tZJhlZyV;2u1oG=&IM*JFs3MUv@>Pg>Io4)BT(=PSesn>U z?d!|wK3|Qu_s4?APBHfbDiN2iTE`u$Lhz=xJA`A5ro-YFj{}1Olr4wBM@`D5zhdGj z9vO~kG4V9(Z#>l2N>jZ*IO`$gCGy5C>UZfTNVnp=tx@YV*d|_svVTFMxK_?Ih&LMI z>0y=~u*pf+R1ALiT=Z{^u3VrLpIz0HSrIs7Gi&-E7qB;XW4kRVn<|CNu6{_xn_PTS zIMQqK6@9XbR;tHfD+5O4N#IUA9XF}N_XfJshDa_4vRLS6%4=w7irQp;s4I)osr}!M z6V;khQAmf6O3i{zAMc|D7m%FuWzu`VP$#+#-P?vxq01}KaUr#n0bll!_f+aQ(;(hNcJH9sx;7l|&hQCHq5we4*tf8W(APLQ zig^cU7xO>jhA9(gOK5tK=G`zUsUUHKW$g+1SuE>sY~fgukp8+7QLu6kf0B9aJM^i* zMcVX1gK3-zc=cPb2YhM-LzErt>z_Nf_N_Y%O{RC6<4vbq*tPBPT77T0sF!@n1%K=> zy~7L)_Y=}Wu{G6~4VPXGr!#O3LeO!jNsCILzoU)eDBu9;)K}fd;0h z%;P`PsTAhy+R7mJFx$Unndee*D)Vwdv1t0GvmubwN6a!Lg zLiX8tvYsi}-E>|7YU}$|kMY)?V^y5NrKhBPwXdebnGOqwme$%dKUP(I9~tiQ>w5hi zVM}qzvEtw$4N|Dp;=725_ zrx=G8P2S_bBH162aXD13)BqtW@uuE~5|c+PZh|1 zT4+~1O%~p2)rIP`tVP>lH}tP^@Xv3ydgutHnpA{kB_n=`Wp-0Es++VO3&@#BIQe6f z7zh?PqF?g!{?&(n(dxh%!L$(F`7#dXAdU@AvL@YmZ%7w-phYDPw1=yALF-7Fr) zV4Jn~?B}o9-GqvaYmRG$g&rHa{eHqY1A=(AL$i7a(Rq5zSaqeNU@m^*dAm$sCT?Wn zbbrpOBqHf@DVqS!kktG?H7aUb{sJcxKgk?b6Hv#XYqA1Wnej|YLxI67HF8u-#pnW# z46EvUuZR%zyQP}{X!c?O54G_AGQVGW4t!e~L{BNNzCbaaE_Ttr9s2yLY)Tb|i}eK? zswBgS8yew!wSbQC7eHY?db>>OddJ97k!?{%ui2jeL3XDUkF`^vf=AR{C^!qp*p_^b zUmQb_g6nqH;2P-pXgI1D?xmSsI{;nR35RCc&aPcx;axY{%u~jyE2* z%FGXG=pO}4L71^yO#%|YA78pY(!tFc(+0R+4;dKRJl1EMk!ccmM$Ph<8!1w=B+aTX zw*Gm0M$e(=&~-n98d&9DJu{fIr#vO7w%_xljiHj0s$t7Upf9l@cIk^Ebg(;40)-+lf4ujHY20!&NiQfD!gJht%2{dtxv&HUN5!^vBJ$60zS{^E>1 zyEO)oGinybeV*eRJdT}bLY`}|i^l;dvSF8esV-1S!&1GbnDF==;{1!*XJ_pevZS&v znUBHie$00nea$PjytOGu3EWeslA14Jb)alFqg&~D>>xteS9VG9xHU6ZSN+nMtx0lU zH7|}ESuALP14|t|7xl9t+^-DZ#nS8s=2me?jwX70>p;LGk?6HZk+P+CxOg_TRro^7 zD)&nTkhUE#3F@f~AIQ3=G5uKx%qNxPIaCFG=SHImu=WTY4tul<2u%`^isaKhSAgqj z`sR`QBctTuo`I#x6{ALl{}~k(tJ_$NGA~3(Tct%5J}9uwG&GAMdb= z))`YvS81tBG+F;cqMlcHDcXYkUbe0RtO<}ygpM?491^J+2^{80LmgDft%g}?Ra{|u zvD$`xmlm?Cknr>Iv#hh!F@;ZY>IhG>gOR!uI z#8WCOyp!&Q`l-}jN%0ppml^?ko`jjTuZpbI)eZ=x-f3O6|I!5OWeGrSWeFdQ(qv;` zf#%r)mi>oRQyOMvP5RA7bBwnqA!O5yfaOdhCh)J(cHPrrZrS8PH^2+px;Qf5H1!!xEx zrgmf?O&kn0LQj$&MTsk+qX5wsmrgsTyJeF8oNt4(({O57xkX>?)|kq~nq)q9Pj(}# zS*muF;JtAywb!r!GN#c{lX-9z0qTl!S)?*odv>Kx!chBph8j@oG7NF-8)I5WnD)3s zg>aZMuX&rlH>rExRaoI07Cbvlyl?f9$}ghlUu)?_yA2*=;-Z?Gg%y>KP$UpdHBVA$ zrm?9K=~7N>)Zz&JNt;4h68;1bHHxSr2A-W*fxR@q*D_!V8^X~tw3{m-tPnvPHv4nG zV>i$8u`q!rj1R&E$}@X_H`t|JH}T@hVmfS^_vaqBfJ=iVSM4t&gQtRtI;-gk8;1Rq zvV9eoD#p4g-n@rSSjM#>VWOC1yR;1VJV3k*enuL^1c!Cdttq zr-%eoITBv@N>P^CH-yK-3~JuD>H=7P755&h=}W2}9NAJ*eu7`?<;wHme%yW5T=WJWm&I3YZSe~s64))uyqmj#J z=F31ziyv0d(eqYwRRZ35T2s{gM&8USVSWL3xcM{UztbZ4WkkP;m0GNp> zk}`q^B-S%nEIci0e9(|st4kb53dIQq=Iho9f>;|Pb8GXXxL&_W zO(rkqI^^V11RK-eWZ?7CwB6c_8@7j2_pxO_nHhS0CB|z8a+V1Vw^684wDmH{vN{yB z7EL0UuGMgwdUb@pUJL-LR2x~014Q0=a|8SJIfP4+F7UQmA(`n_TnB@6Z|X)>R~v`& zw6h>T0%Q(N2~pVmhFgr+B7k3wWvnOS%Zibh>pIQu+tdx%N*K9Q%fiJlist|0oZwL6 ze?*ZQpS$O{L8XxH>@O$*wXL8#unps&a0bmqNywcd79yaB?J2kaF1!4u8%@LE*fEWx zQ|ysW+7Ha{D`jpV!wfS+Q6CFmj5pFez>XFmjaFeH58<~2M78Le;qGMC7Ml61RhhTNWtgNC$_*(&t z(q@w-$lkO5xf>iTjVR#M@uEgTFki;y}R={%bEbNkhPrYWU!{YPlLM zMOqsxFi}_@mpzb8^T#elK?v=8mF0;_fbiMm2xDM;XiJ8c9xqO zRdT$V%fHOVG1kq9gBmjnQ6{EbECWafdl(9Ma>UAz_i2mV3E^}$<&D!Q$xSIU4OwqB za3}b+^YLpffV)+v6ilN`MEry1&{T`K+Rq(b!;X(;K+lHaE?$4y8Li}(cJ|=|y8>uT z;phFP7syJ&>5~->bqqQQ{$^My(G>WW+crpC*u1)Ro`*!D^anGEB-wVh%Dw(QM~^La z+VPuifrifX3C>cj;$EU9Qj8DDCWXDUNLk~mBErj0!>;_7`~_BF2w0IGmgqR~xyEr< zKOuj;VdV@3?oU*c;e}J7h&@x7A1OVxf5FC{(SxdACo0;)K^MnC@Ac+HwlD7jiwJAi zG)TUew@!5El^g0U=3)=?)N7?xm(jl=NHIX)^ zL0Bxf3Q_id5|qQ3&vqJ_Ed45-kQrA+Y{uCV7xG{>MNOX6%Vqi70mjg+AX%a9@L$g{ zvjy(N=?LCG-^O$$Y@X{eN;|+9ZCn29<+G1no%-E`)gAZMs+X%f@YxsLus%bQ1@8=5 z412`pL$=8bLf@ED)!FrywHz#d3z;a~D?B*T0?lhp1tWT+mVP2)93b6@ zT0F6oq!BvLzX;wXTR0E!OQ=y1F|AO>Yo>CM#z5lf!1+D*LT{s-!M)~gbV$7Vy%VGK zb&=b#*P3mKx&b^!q+6>SgXIHmZ`(S%tj5WIJsnetxxNvTAbRpZehevj=gqstPJNEA zyk~08G{Ym;5{6P-^*$?Nx3_Bk#3Vr_lH;j|v9pQ4kw0dw27cSu56euzZ)?21*O zS)%(zXM z$$ab?=%=37%5TR#-9rF^Q#vs1dAK_T2qpX@Y|)+C{}n@kyU^!*UbI32YT%NnPbGo90!%6n~>+bt}QYu9FQn@hh#)QQ-@A`f82>m66dA|;x4 zaxiJclc@&ZaIs}8msZGI{TtL#5Np%?I-)vTm`=*ts8;86;|gS~nTb;?U;UY;+5OSy z5`SKs49x7ebyxpN$$<+qW@2@k>Q)_zj__=r_7+zkW7U6E@44d}T*ttd9(6rsXk{oD^u>Gi(9X--P|5+Wa9>1t(iBiG#Ra(utTOfC(xe6=X zPHiyc|1u|>oOB@>PeBc70;^%!2)-w{YS2N#npcZ;Xj{y~8aZ4ENJ;CZ_K3d1xry}N zW~X@hAKuk>*DjT-CXaMaS`AfL$furN|AbcXvI#=WACY|M))y^bB|gsHT?7~IGT3z@ zxz)1Hdg`^}0n~DpGF)xve}WNyH2uK+Wh7iJ#&kwyaLU6T>!irls@hv$F!r=2e*11y z)Y@yVBaT~|o*boIU_4jH2;849p%-q}z|(OhJ9Ux+O`2odB8|L2g0|=-YR{&tM{hhTj?y?i|jV2N<;W*70ljX9d<5 zR&5w-;>rh0KJDrZ*5U}GZ;w$My&F&X#~IAuYMs};GP%V=DnDr6o>o4-hq_Hysmp>- z(hjU?lV1QBI}~(pY8e)P0w+4@!oj* zShaR5X2~{r7q0-b3+HWHGBJ{N6N3yquNZwgYrG*G?;)j=>NSwmiAmdeJahguKXM=+ z2Z`t5R0t4SjL1ZUtGJP!qSOk^fi=JWSwu-?M+!kP-OV`umuHzkN);M5{AZF1)hnEC zx}Pgv*;AfShKHHaSj!@}WkkN_NUi-FS3?8didWo2lkcOAe^#u^p||a>_7-{mv5BCN zd6L6I`(^Zyuim-?|9188w1L6fechGt_ReBmo#<@?^kUb2<>YnCYqPZ4m)v9x$#{s+wavCeDwO;lH>|>>lDoyN8r^)ttG4x zB%u=N)v>|;4#jx{%3!tq_rxZnceZog(TcN8stT62+k^HPt0XTs$1icrK>&&3roX+lmdvRFWY%p+Z(f}=Lkybo{^GB-sX;j571-je~ zy}=j}n#(%R6x83+InBrN+VcXc|Csgb`X+SBVqnMo*PHM0bqe3qRDR#i#i@^ZI=fUb zUYPixGT6PEdy*z9!0KvH-vIJOmdg>JkPkld&&j;u^%?QC;&f`v#HARgg(JU(W6hfp z3EWE@nKmc(-8sJ_SP(@x%q3h6#LJ=ocjB$zOOR?pH$QPrCaoMzg8k}t4{s%q1e{UQ zo{;_F(Oc4#`rRRHyb{*z8erf>1d5S1-8^rOr_A8#H^Is}UCt$)@$vBTaDw!^hb4^^jX0@zU`yy}>qw3`c zWlKlxs4m* zJ5{8m<8Dh(7Y!soGcS3cLsM)v`H`>Wc|f9nb!O zVs5hpb1uWVe5sFslh1U);pN%L=pB5ML0{7&qq!B{u>fU|1svS6aR04U>@;Vz2Q0UY zAn0Y;+4;}5NqVzLZhkG0)GC7W7;@Hb%lvlQVzXYWSZj32wi~C~_QEw&<`yQlOiJ&Q z_?a}Z?sXZ{c}LG67_z=9)*sTAd2UrraDNoEopfNNqdDIejy)$=5k$i;tKNg;S_}hPUSa=6K$Q^+z4x+@))9I|;hn@&J~ewIHcDjoRlhQ~fvPhqNMksZG@B|i zAB0>8@&cAZRo|k9XkMQhCB`ecQDze_-NKu!xW!jr^ZsJ+_dP8C89(KFAYXCrA3&^> z>ey->6#5W{)gAAS)m=6cx#PIds}GF-cBoYWg>R)!w2M(@fp3LGbMR2qebxlxJWN>) z@wQUL0Wc+`1c{ppPOQ*$>QbI~x_!yy4x>%#z=@2alC!Muj-6#sY&syzIx+e4p+rsR zTyJCl{jnKQ`zHJduLQO2fr=sFlA^Z3sEd^H>@U9^-TD>EX1uHLQA&QaniKGx%P^#) z_sla@Gpodc_oTX^!6|*7bEVEJ#QG_N{dBloTQ+cxQH-eTgyQyq`(?PV{^KE^o_@+` z_3wK`2OLt=r53+ickz*ZbLXS)d84fzzlw)dFdC$26y%%~Z1@j9fx6boA?R)S@us@GI9*ItQ6gLstAAL7LaH%nf z;ZzvHcWQAyU&|G8wp`o}IR_0eI42-;TNV%QGc~t_SU-fz9<9W<)zX6{ALlVHUiAn* z?iP=es^2R-Rq?^@K+Y=mqv(Lz<-+l52X0Q;%bl zrD1lD=b?La7av!bRc!u?n~6;~HdfXj(zt#|VGRQr#`}AR;;=;er6Aai+`BV6genQ< zVBz!H@5S=P&At9gFeB<=8FMeR)&SQ@arH0bh64y1(8CZ1zh?OqU;Z3nn|F zL^0pCaZy)B)-NSoJk+vkRNF6sH_S1Yh)pq6BsVh`H9{^Yp?xUxlS0Tk_f^hUGs)A1 zHqI{Er`uDrtb}*4Tn|s0V=*DSuG$-IPLkHN{Ne8T1c8%s>pWML+|I`-7VF}wlp9k# zHw-uawpTMlNDoK|L)UIIP@KsW{B)sbSgk+Erjs1V?zE!zbQBF9I$owE7I}LW$UmN* zylg7FkaA_o)KPHJEyJD6+=2S2H>f#N6-vFfHJoz_n!uGvG}FSinj|RNJ+z65G}$j; zHJPj?kSBr-ad=Ww%c4J9yk8|OV6|yBUnx9E-e)69i~Y)owe5m$_+9YXjv>}{#9!r< z(?oLf$(}e3U|YKiAC*SySjf{qi=xQZcnK;JUCq#=lb+0VNeuXhXKp2`({ho#M!|DE zCC#O`Ma8~agMT!45&?DHbotx&gJO=ko52fw>H&J@Ukcp9L)=DpDs0uVCH_DjlIR21 zD`uUu<|>bC?M|cx8iCFbGz-HKJh{_vuNe}asD*ZK(hdQK894p^_{pqj@0dXI0PRFQ z^fJXYJyu?s;tcUtr3r-tW-LH}vN~cBg!M<6W?9L7UMP+}k3{wWNy= zrQ`6iE--jOwUE8zSEjj8$%*zn)kO(k{a|rxZxZFq)RBzwzz9?Ocpdre@IW|E(F%23 zhXmVZxLzT;RpXevnW)ohFX?{Bk2lpc`Yr4I_P|RGs(c5=&C}tBw~uACh%K)&O+%T8+v>) ziZREGQa6x{wl(y>7ib!Oh&*zMv=Qhc(0bHN!){W&&2CB%xF9M%h#Z}g!&6tzwH7IU zf<{KqI0~iju=Otmq!xhA&t+2ybZMm<666}_t3lz9zqcdM={U|ViuH?As4EE|(Jey- z(M^LDjn)j8s=K)%i7EH^yHr{6T1^dqWc}7Ao65FYht_~jKj782<-b|k**5YR;4Tsm zXEQTFlKf*;)$Rb+vg`LajhMvV5-M(}z7@bK3VquqP{`#~I?QOHCF9-dVhO*U!P7pQ zux~ATg!h|7@`SVidRfI%ps`}H!koeooSd%|6zKO>Z~2~PH$i)w?jtKZ%=yBW6_qT# zUwM+L%57$ds%8BO7v>B$y&lC<*}XqP0qhO=Y5RwWhM+P3u|jfe*2FF-y(OUYxDzzC z`AhrburNTd^}6d7hfjCiFB!7KPLs}7?`RHXo$IP-UOU7t7TG#UUKN*kNeg74i`_QQ zYpZdv6Vb!$lg=KZYyTZ@;@VoYPBgeKMGBlW}mzpCIw4)+Kh3I%U0PCdq)ux7#u|Lgj^VR)$ti$!{ zV5L^tebk{)(e2MQvnT&tH{TVJh!;GA-20Oeny%6z1@~<`h~_z?N#*LAr>!IDL)1zP zU($P|9IXDQ4f)&uxBw=0^@}}S&)4nr0*ketB)6M^eVnx!zBl6POsgQ%JK7{Xb?d-F zddu0xF{=n$`MP7P-wYk-7^pW6&WRQ>0%!2&ONSkJbEwzXt4T4GG1> zcF3T-dyU*=pzgyS0(@?zj-?s?HiitjQI5_?4J&C`oY%P(o2P1Uf3mfK4?LV6j2aB5 z>zHkW_optDhZ#oWY>LSfeMl?^>#$2sGIU%A907R6iSBpkEiqjifVYtkrA|D%`1J?t zVH(;PUEe2!-I!XOkJm>IyJfw@8_XFOp4pHOtHM-Yy9`M5+7LHioE5|yT_}1>+a__9 zMrClAg~Zf0^KRuOTs-=;7Uw1YM&LVr`sqM0FEP-Fn-ok%YCw!9Q)ek*G&%uK(~@0$ z+HmkAgCE^Q$e;knf;#?Vd#CT6jJMILyw?-~VQ@F-=l36F6E$<`XJXjuS^3j(SVMN` z7S?rqFm{IrzI;`>``44{{hvvB6U=ObOCQ)xpX;`F9WA8`AI0PAj&E+K$`E693 ztzMMiflqWu5iv!(4W&p+XM#m)uQ_YyS>Zdr0F{53V)puQ9J#z}xeuO_Z7v%prS4ts z%KYuRBz%W4m@MJ?y~x!Z4qdM6M68ZrWM{9CgELlwUh;YL;=A@z;PTp5a?g)#v2Dt@ z+Y6eK5D6hL65%>Q>m^lSeR0tABI}3QQ`>MGsWg$AnG{bjZ77WijXVVYGeGI*D4+kA z+_Rxogmvq-cl?-4_|HYVdsMr}W`XaO{KkrP z`IYH{F! zyPZ?zr+ao-ey{?~yXD@Fb(8a^sXj35CB8Yh-L-L3KFzn5KkGu=HAm765KZN;Mmf3J zwECdljG%nhW0`hwZ8^PAx+&df4!>28zGmHxP6xaTly5Y4$iE-&gLW^p?&xern~<|2 zM(m`LpwdfED)8p*(d-=|b&LYd=Bcb}_Hj;1Pdip@e!D~3meK%{yXwvjc_)&jRkn1L zF(WMaA-K*xSydWNhc|pSUWCk$mq+|))2jtkcLcYw@OyW&*i%1@?&-XPxWC%K>OK%( zDDj}Zb5TBAH!FE1+&8F()>H4*=9)Gv80!-5o-r4G>~Oc3T&KKHQUZv!>$BLCE;WX< z|Flh^7Xq_~M7CbWJSOjEyNG!odqD_3vRui@oTIGrG*V@NM7l+AZ&mQ34!Q+HJW|uO z!3F1dl%Kx!jeicj_ke|I)$8a;iFb$Zei-om*Mn{oTj`3m=3zh2*>J|G2+CEd<3XD2!y#6=jog!v^6aszvhib42*3JJ{+2Xa%>uJ{ z5N|uXbvMJF`*@0o>hs10H|lV==i{LJKbnH<_Qbu3B8>1$ccPDv0@(MCJE9M@A6XC< z`!P`SnR-VJ$`j577!a~B2P8MIklPl;a=8HarG>^|Z=E1v`!b-7+zkIafRsM&&Q_~COks;?Q z->ncl{O>a+*%}uKi_PXgVd!v3wWS6^nXrI$8eR+V{wR%$;p6OnVj;AO(v*!P;-oF{ za+n7Rt5N8$QhEaVEB3|89%%=O63TvZq)$UfRI}+uApqS4A=4A<_5<@6r<*!+^3iil zOYuH)n}A_=Z~wv`neqmW@=E=Rh292x_V)KZ=kM{1#bkc+&J#`$`X&7vDuXQF+uvh+ zLZtRt<*GjI&?(jKslk`hY+%N%wdUm8%KL}CAIGzCyzb;4jpsqmcz2!atBh4`4=L}L zk@+>U>9edT<3g*29zteEY7j_?f+<~$qNaFMweaf_(E&j+-^aCjGQD>6)Nhwvp>A2F zI9sD*uW{*UgMj@W8Z}J=qio9>o>ZJ@d2F#rRX}+HjRV@|>tX?U(cVzM?3McA-;8mF z?e@IKn^CZkP2$E7+`C3sgV!BWVe-|I^WY*mSm$IEG|{SQ8iYnVUN_-aFRBhexpejC(Mt##Lry7{ToK!ddXarcXzP1(Q+zT$X3r+k{=00lalyUQ-fEHgA*wUX6Ve=^3&zJB zRJ2B#*XN~5ix%8JQNO=yoS4huU6>%S3{a$-zZcFe;Y-gCUX#qef~tfPyUQL$@rG@1h&LNw$ACkh*ci69jJ(lkZ;LEld>eGPjRlO>gCg{< zXb5PjwS0a{`*>+i%o@}_8~G4xo3Q!)z?6+4dNs&(T2XJvwTb6)fF4Sg0;eXJi>Z>+ zuz&swzoaTaJDkY|8t3vL(m&g2Xe`2}7ADa+K)SptyEDSQOD1s$@$){%AL-hC_3+q+WR+X$$Vh<5${8brDTG3A+kN2?>Mb!<|2ZOjQqJchDt!Q%aMlfOx7 zP25S~^Win{Z31JHF{ZoGk*RtqdqDIJNgo_Dya06QHPqs|> zXyzlM;(PF34R`s`|0>9BETAP|#d2<}izf`=g<+5^f{_aPEI)fD%a}qoD?gpv8oqns zPBB@NsspO@7lrnC4(_&7}pkpAs%qEPbcEn7GL17$O=GoXEaEUR}tB!lOMEuKA@ zJ(cL~#D>*`^hNcO{fYdz`P%1#U-HqI^hI(Bi#NwjfUS*vR$5;E8*eTJhh21cw=Rh1OGXyjf|58~P{Q7XZqLkxF*o|#G@cZk zw~muYgMe;?nY|)=pI>5uhpu>$115Nxy{o;|w_NYcL~$E^nakOkSywb5(pE4}^5XG3 z!InoW)N|p$jhM-Y;69UTocFd&M};e7daPKF2d_-q103jKhUiJlK%-0OZ3~uvI@Khr z)M1iS%*(*)FxqLDIOM9<+TuJDi|P<4*21Gg#H=aYwWBUWf;Vyu>^c}@Jf&Ebx`4n+ zQCFQ9GF){u&BL=S{K^?d+EJ)py=S%3-RW(pCUS=&BfGy`NAGC(8iAsoFAK|ug@oI4pWIvkE=~q=^eGm zTt`34nbUm6>C1#LC|0~;)77l3qf+Nyqe?Nx45-&e(n?t__KG+lN~LpBH((s7nHlL+ zOC4BQP(VaxhMl4hSQ#Xp_ZSm3$hRgD9{h3a_LnHU0gLPGJ7trkG7o81ElTyAw;mwa zXT&>DF+jE@{U-Xly*ZiiaqP$?G3%)ur080Ii2m^$v(w0Fv!?S-d;D?bwSeUY-4!54 zF-z>p*maAoqj8nDt=s|W$>fzKtUKhnmRUHoChyJ?W7X|Ib39^MfW&iXZYUATT`f&P)3k~p6<$?h9hQQ)* zGV=z8xe0b2OCcSvkgOAQ-HJ#rOa6agQ=$CLVHBcx{XJLQA6Fz3fHf+Yie#} zW{z%8Z!tPd*mw+$+_;QuQad{pTm9;DD}0PGCAXm-St;hN)IpMMMfeZno!qndAy5_I zvLk;=y_opQq}TY~msAjNfm<4!$IR*5beHxV@=QWKSf5jcWDyh@8JvL)C%MRLK!S zR(wNc!x}KBU$Y|_xF+CH>kN&(VvY`!^)r+_MISC4g~r#t$i7t_MGU6?=V$sp!*3>gQVmm+WLazCgj3!yxk!UHn>oWd6nE) zxVG-Ga>99{ymi@SeR~u!*YXiQio7-l2WmBlrk)9^c%c}we3duBnQWs7vme?dG5}g5j+JhZewY8} z_v1O&oVlJebFP`^+|NC~C#~6Jo^L|CM9Im`gwZXLTYi!g{f(z8M(SsSAzAmLyI%D% z_Yt^HXMbGJY3~3NSo7Yrq&1HxWftGiTD=foCF#ErX~$t zLkE`|*rfAo@yuWWf4K+%tO2)o-Cg_t($CG*w}7CyOg|HYt5*FkFx))uiQ=AjNv83^ zRq5KR`Qk&5*HFZbL=U{3tyS~P#+ztW9QV(T;NzdRMB2f@kod2jr%;U@*qvOysnz*E z=N0R6Zs#3S5|d2=U48}mm9pk4@7Zv2qQxuU|4i zNRtYHEH(p8H)cwV?A9x?TH;j8Ll}6lHPc47)N{gA(J<53(ePn#m*21)Ze)CwPw?C3 zn()U*PX+v2{Ue-a$lV{mx!?F<9X=Lm_rIq48~e4Ef8@G~TwJ%61&v6(_eH(vIkQ{~ zu`HeHXyZ8z%bJxZWt{ykBwxB8LLGA#$6uaR`^9CS^hEjbb@5*<`a8i?>C5EH9Qgv+ zEyiu$-i0vvybA?qB0#uHX@h(p1fMVA`WNS`&fF3`%A?T&y$GcuYe@(A(D@eb_;O?} z!J0?q zJ9woA?eC29!OhR+NWyffRGm|9C|1g>$#WG3SEhSk^4Huk-b{~%tX#}a9G~-V)q6(# z<2G?>-b`E=hQl6bN~Rh^D_@lFo_;+kEQ1QBsLjDq0%=Al(~>N%0Z)<_;s47mklH^pPjJPsg8C2 z#d;sKUF`e$rbBe%$JeTp+2{$;tUJ9&<@HE`kv`z`LsuIhLrF@x`w5;%DPs6 zq&Qk|Dwb->y7(9+^khtmv1znrNpfZbeERjfhq-@>vt-)`wNl+VEKN=B^j>@X>SV(g z?GM6-CoQ0XVKICWuAaU84}EbqK1$dh;UO>CDVqG?Nz2xuz1S>WcXvk!O0WC0Q3b_- zjtQUFHWACVw0g$|Clj(2|SkLfoZNL#X1ef0bY`AS&p zTXp^jQ1<)V^vaY+>Vh)7&9nBxxYZULw7z+;WvSswH$3=6Fd6M7bF{C=GTUv5?ntaq zTQCLk3ngN`?#OH%oKcz!e!cdHqiapbg{WNfx8NozQ4uK!7Zs&JHN!qS^6__=6LO?N zFFXXQ^$sQbrgQig%#K7^S3AT!CsUd+A98{5Z3#jUK(h5+cy>aW7FR!Uh+m=Tj z+p6;I>sH3ED?a)7ZE9kNB@;Jr&gg2IReD4GD8qyiLIBJwC`@fEsOOE>`!#1gMf+(* zfG)@0PFINbLvg^&%OR4c`2oI(>bC#fx`AB4;RE)tp7?aN(6qf`HL#u2iZhO`s7APF zp^{yzfM?hJb(_kucj`q>eExeH-nR#Z`E6bVRqs%?8b`SIRdQRquJ-ic`|szYX^EH3MqUD?v$#ET^nRezP&t%XEBc^N zb~VxOfU|8Rd+19Wesqx@X*e!*eE#^#&qWL&_j-ICyx!JOJoak1@RkI;4d$(+8yQTo zU6B#HB%EkFGhPHpa?v)>LzKl?T?_0^Ku1OkF5r6o6{o!h9Q?m)T|E|4GIbq){)pGS z#%w>a%h*lb&u=u*QO~l-+ex-X6%UOf|BKcJrh3(UahBYuSpb={>J7HuP`zQmpTB&qR=)tk@0ZQbsw~ z+sB>>mG;$Zj{zyjVUfqc=Gl^(YR&%6a&Pm#rDPJKcpTo{T~(O4lp*>BK8vwGcDvrYuy(_F4z;ZK7!0z}%6Hjf!+LkZ_^@DJc@ik4e)?*>rBf^Sg+_c4OqPFt2N9+cOw-UjS&P z7$8>Wan6*~kB^j*l$`wMw-s|$)%H*-cXhZW5ozDjRJN9 z{z3B=Z?{9ON37oIOm%3M(L2cl{332oM zL1*JyI=I7Xd8N{D*9kG*C!LTH|N9$%kL9-(zPS&ds)boGe8M^N{QynYrtSo1QdPM} z58?Mr;cIs^ie8u)vO!uqwQhR+*2o~6tTiw;@2NWh~!T<+)>?T^TjO67JZzb03K z(redL{0;Hrq7Zs*JDE}!jW*Pf=ZpRZUuHB~Sh(!|X-Z%+E8TbfxUCc`2|KkJ>-pvE zZMXF3+RgZCA6YFfgzh{N+Yjv=T};XlI#=%IP^;FcA}m`7&NGr&2ml&t8&W2K`gne- zoCPAgWlfbW=Jh_+TyWEpWc8F>6}BdiT62v}zMIo}2fC(P6c^qwP@%oPq<&muns9xZ zmK0rL_;qYHQh|I{CuNY;)Q~82T`FxIixjfAgWU zjT|h!5rzkMS?x)VoP8HlkK0D|Vz8RWWG2W72?pTkU8z75nqJ?958I6SB0fCXDSqE2 z$>t!>-zbPetGD=GgHb)~$4>Atv z0fNB?r0NBW_55ga=kRo?q3xS4Y^p7}DW&CX?bEwaeVp*iW@ z;2+L?>*uI@)OHRCkA5U7xY0IaFe&~}m93s-NqQ&d^fA(GK6o0c&K=mzY!ttE^gYmT z<1LGyqN9*=#Ez_OyQue_O8%24U08l`{Oojfz!rCKLw~NjOOp?TMF{1{-oYUaJv#uR zv&g)F(Cw#*HgTXmU-olL4Fn;^NrRFoCvF?7O`}afhsM)Hg zF9rkwdR93$&WXw@7TdlOs_9KyX9u|#yI$LTodch2FKT@4bg7S}Rv91G!zLz=wRi2m zo#YfQ7v(+Jdz3DPiO+rh7c=blS6_uwB7YiQ=&g&e`cJLr zXvp_FpQ(R-Y2(_W4#`pqy13@cKNrV9D&g)t1JchhnjN7u2MDqLqlB| z6o7jA7dIrtNp5!f^Li%pxSak$Jh+|o-CGj_yU3qRg!R%gdN140?c*35ne(*;U+p(w z$`o_!Tz^nZJgF~LB0=n+)7{`=RVzsFcP+c|;7s=zlxb9|`!S3rH@mT_pEj3D0&Da$ z=K2tP?a-y$?S2ai&RwNRYY|G@54z)nz#R$JyC@FlVqZ&dA&Oass5{nqeZ@$}@jP90 z3MyI>1>vJj!3r~H44SO)H-If#c}q*^7NsrHPI}aGHaX+HP9nU+OW-@uaya1EOEb&XHe6ZZJP={cM=R3H`B_Zz zp%ht%en`Ru#F9zw7H@0HEK+7PByg;I0#+MW6K9RM+LV#9G)QKNR^WzNWWCx2TGtOF z4+%5vpjhMFy?TGah*J>u60xUzOz1!BM8m|nkl={T=$KMq*iG68OQ>t}N)z$Z>bo&z zjx$Qt+h%F2ER@0F7$XRO&sc_&Fvq_oq=A3PHGV{2N3bKy?do#I3VS%r2&yLhaMx#$ zkg!gk*@2n~ZZ8Dy@@XZRWBh}SCfGJfIN)4DrR;eL@tdzQwLb3K*5=XVnag5y%}&!Q zDae_7{Sh)q*d$@OrdGhbpv%91v(161(o_!NMR2Oqj>KuRWFg5OQa4!kQ@PC9s)8st z^14$te-<{mW6!Mb1~qAB+Jltn%n9>36jjl2R`F7a$xt1&smfH>D8p%*G@Z(n`LF>W zIB8$Z>#=DAp*|ATX6;|TTI`Gw%nQf!{Tl5y{#i>7HoZ8oSq^mndON1WF)G-Q7hM@T z@rqePGV)7b`tR7f4|6k^66;O}DKFHN@KJvRO|Pig59zTP73i=vc7!mCx&;M($ljh# z>2J;OK%`{O0`Et=4;uO6-HET(^MqQ{4=k&*oHGnb*@B#NJ~y97S$3)@Q6?VE{;X=_ zTU1Nxt&LlqbD4ioy*ga_-QU>Yyz^H|_vV!E5QuR9l&Bb=y(;C$Jj)>q5Ms85O;j$C z2WSMvE3^!(XK|{1j*fyfRBYHsFW~zDYYR3H8X|rCL3ZM-6rZAd%x9bsRh2gI=75{l z0IRcN29xGEIh3^Ff`VSFLkCs2Oh=asS3u-EW&Uq+0kZvL4+P>lGWq4#=D%z;Rw-3m z<>#%xrc3s=VHNv$6shNyk+nVmZDdqzCtW1u3@o>|QS+l{PBSe2O^;iC_#|Jr0mp@a z(v7El!i$e@UB;vsPmqz`%YL|2xc;}xlphTz+gR!%C6N26)FZwA@qyV2IdLkM({|*D zIC6ik*yP_Srh6ra%J0_>v@f-zvmPKhwm83iy3)xxR3d@dAC3B3=r@(tAD;)}yudKE6SQ3;4JdQ>a3;wARirob=j)ZA0R0)(znM!@y-piySzsMGd zODNf1=*=7~kIPRC$7x`lt1JA|dFrqY$@{aLRdq;0?~p%$T8UTEXbeSVy_XvtBv0)R zn!3F-k-=fz3bsGII4{#EB6Oy2KnI82oITM5}(Q2%GhRqgW7~nnAE!T zR~=ZJ##=dOMnaRK%`2kZU52zl=t-*J84D{GPN|R^{aq1W{^$RJ0sOu3YvPLRC`_13 z_LqS?NY7(st$v+p?!|$yI1UK>#xUvz&(cZ9Fg2rHK_^7K*~=}G2Y*SO9nwFl@e4*L zpe8}}K}3fi&tChMZ$Xl^NzWsTXAyweE<708Vzc!JLjPgkyA)s$bu$+^@8p6oei-fw z^oft$lYa?3z<^fd7enk(ZYV}FD9y1BFN9MrSjuxWO=Gq|9A+$JgK4MILS&>`?Q%IJ zzWHv0A2RunZ8*_SKGJYa2jXsQ)%;*@)lvX)%r>+$z%)f z`wW%P^;lG+Gc;-l(w$4XsLx!f|3-kfUN0QoP}aCe95^Zzjicu=``KWAJSp>A{?cFZv{Hhc{Toe60S`n*_<6L^chrRObTJYD{lNNG&d5N{GeMRDhymcAB!oJSn{f zkxPWod1bFcI^FIvt*^3R3$E^fqhlb*EoZM12=?&Sy>AUt&BC zAL0|C5gVfCx)G{C&P!rH6pEtjGO1c^lg6NEw9OTAuvyFh0bA_vmAx`8c=j~6z?woM z`T_={dd*vSfqEeMiPImSZN9Y1HPy`5L;$)Wn1@({<)VG5qABQ@-*V?@LU+ z=~y~+OQH`$@PnmkM(`GwyQ{?VS19kkoQ17y_oPB-97TE^e)E&EQs0YMP5S5KD6_V5^QnM1+xuWVJl{!M~T`o}C>TuhoK@IN+C#y_jm$G{@!4 zTzx#jFPjYVjwqp}B|W_Z>_ItL`l*{nYRJN-e}UbR*|#jZk<_jg{U)_S1V1tY?sIFD z(RNs#_g9tO+o8SX#T!Qxi9dGCmPBQQFijgT9vftQVIFSBj!ap{oYS7a#9-QPM>W5% zji_bY$}_k6u>e>BbEexnB4h6ycOpyclZ&p<73X*voOu_fb#T7oM>r;-*kDxyB3K!#0xMHhp8KGQV#MNqIB7JKL$tV zzo?gB`sjqoElJA)e63)|irRyqQ(h@J33rGGX5mZ2v`x*)F!bXva{hmR-)~52M5~iS zL=1igk4z<%0V1{9gd51HGY^>oDQu*?5{FC@%SJ)d>ocP|%h_u}+eO2apQ>{F-IjFq)~7AKAm!zX~rx!#mfSuILK zlp}KH@9Bc2H8ZPjIhK~0S8I4Uiqs4Gk>zZm_!9IKqrSR%q4My%`S%IiV6@_g*TJ1b zNRLox7XIG-vJ?&Peb0MPFs5)kLch{Uzg-?Jp*}q~FlfZZz9S;t^IL<3=*I!a z#Ax~RRl7Rjo&oG+pYwhG##EIKXZ+sHvRiPZo3?-!;XBQ{omEnk*RK2;5U0qB&l+`;iA%t zY6G=r1!ko_#vQn3Stsy`311z9Ho?AEuKz@iXeF-%4tEXVwu@MTWW7FWgZDe$jl;ew zQWiJ!J-5b~jjril3sODjpUX#MIVQINa|!YFDT|CK`_Dk*nZdEn*1mT9SOf<6jv=o8 zFM<#3^$hmCyqQ>d;jhdSPN^Ch*KPhQ@X)L@J=`KGTBB;!@C>``T^( zBMLJ`M35th!g0?;VHQ3p1}`H`-+zo?&r7o2*3thM!4lmO$aq`N%;JFN+X%~5_;UlF z%#Cg&3=sO&F}iq+K%2?E& zee)lxc&Cv!>Xz{t<7_M+W`YAYdxkLM4Y`|AUn(RZI%x_eddL+VvM7fpBd!*kjd&Pe z^H;uqCN4)OaQiEu3-dnr@7Z7^Z(wB>{TwbWhdxpSj+4oA8_NcxuLyMX&*%Fg6R=N+ zk+FP!56HITdP`q>$nz*sDbIF##s)y12U$3&;`=ot3e`Y6t4k#=qzUoBntvZ6IvRq( zW|6*!#OEMPQ%xhkNn5QwAtNC@J!QbB!V&mv^yl0c1qlE^+pi=^Mr6ZCNJ=5>JMX=Fzx$Q*-G1Lp0N;PM zDgxg-V5`CpeD8qo9grRZ_T&Q!?BL#A?74mSw#9|}J5l#aV_tgPwm$VX+X8HH(LQ!q z(G7NJ(PYN8yx(kx6G86<$*?zxtqVAQ(JkdC`#YOX3PGw&ZudNStat*c_ z2iWrpI|hgJxz!FWEF*9=2-wAd9R*{5#n>6J?UI|2ES0nY+k@p)_Rr!ao}uDCv+dA6 zFH2UkQd=W!t2)2}#sPg;VL4i1T_7(s5(ZreTx;a|V{B^^2=#;sohVthxX(hz8K6XL zz0X#0fK~TWT=X%96^0zpfle(BK_IlR;|%IReLiN~r^R)kz!r6YE$(x+9a^+fT>@hf z7yV2h~F;?U5d&+OpCd$godE#d(6xdi`H1VW=>>@H}cJDg5Nt+C39Xb6~jQNw=+%*EqXl_X}0;z=75^>3cGPiSRM#q1Z#ah zw#SdL$A*fFN@PoOsoyLP(9EWFD=ebYEkC$YXfA^Z*zU5$a{8J}zENJec7U;*-9%N zu(|G^E5)`|KC)4^%H~|?n6(4epHcMV9b4xwHU>N8LZR(}hisM2vOQaUvvR=N0f+o> z=k|6U6>6KUBHLSe*(}?IK{mQ)?0|_!?$xGK+kypBBpU^`=d!Y07zm3@?a0&tfg|?q zI*SUlOt(Wpa3a+;j9gqGkO$-`a*2`0nBNLWjI9cQq>+1lt$f6SHb88Yyac4F)=t8L z$pOZ+Lneg`X9EAxV3f8r*8&DGRHfZ6u=^hhd-zGP#|?o!=|bS-5x{Ae17}w$9^2aV#D@!T7M*m&MeKw=zxGvFrq_tJ9zc1pdnuSctSgNeZYI@6Zl7pf_ysUx6FP!CdqYm{TuQ!efELV}M^C4II`VIP`bGFMbOgqWEjzV8(-v1fuchM*zJJZyI|NNI&ssML=xq z+%<_2;Ur;FKe*4Wd`im+X*po+z{9#z&a=L3802dD4ezOZ)1xYG`K zQn(^n;n7vX94VP%r2c_8f&^+f$cBd7<8;3Quq&Q?yE}q za=`2pd+y4;a(2FCn`vm%7FGl4vF8Hqb|DvE`jKw?3;6+afiUxoyY;oxXARrI6T_Do}Jegw0W_@*K-WoH)tG%wE{nlT=EoTC$b^gRwvU!O6fWCeMw zZ*v%viO4Wbm{p%wIEckPn|go*Ucq!~YsPvJc;>M~vtUX}1?K77f#>do8OL$&h5rX$y6@XK{z1TReC-in z-70^2`lMq0+f5jf+|>zQEg-N*yMoayoLNv`&sD4G@?(GHYpTM)-#h>qOYok7}t~k48m~KFReja-JmJ~}ULw?rB zS>dKMinZRZS_+Kj_5f?L12zaQ(}{8{*XF&K&WbsfA`FEk*(PlT0cIo%=F1^P&nL_9 zm8OlZ-rOqCs@9``CCGO3dYC6}0KWJLP!0E>Z|*FMq!?u_cJ6sa+>lDnJedQeMIOI? znz7`LT>!3jk*Y?mEQPt}5@1;gE4$5DTuus7S7T^(PMF0rDaf~jnUcrYL_kspyxqS? zXHKK`VS)4mjj-A@)4q;Z>FP?D@ecv3zVf1K!8`*?-J3%o*>)7BPL3Y9P=CAqELtSCV-GH9I;szjhSoNH!9O(>9VrtHwi@NT7Ihi#P zkk|r55HQBR0nPQ@DYM9-8HQ1dzEa^9J2n~VdA z4!|eJAILp_6p%QhU{maH+AW)bg)<03M(mRplEZi8>F5!E0*2oKJN)l3Ck}_9BLsS5 zh0uCp$y`?+HhE4?QcVB_!Zwjvq5}d4@7j(N@cc#1xKLfb65lL!#iJ@ zPi^x8JRfx&Agmq1u^KCp&xX~<$;<3ZU65Nz4Zv&ZfJ{L!R8eD$4(YFW5T@u4Kqt;_ zJb-sppI|e=Q(irl%bap>^ZX|QR zF^+@b^06>gnGC+vmm7Pw-xGUss(TSAnw2uCT-Y2BUL@-MG2u)yk4_=U$Up z%8fm?gk;&_G4c zAI{%3uzIjgnnihLBK!VSEsu_7NXjCbXhJD$ixPTVBN!)j0FL=d=T07FePyLw&WE_2 z?1vM(7<jE7L z3fhyVd4oXllt5L~V3e`p8SfIMx9sXszQFAAFjJL{rQmw*oy51M>1SmtpDZMYCXZPOK9&Kb)Kv z5DQ1sLN*62AcC=pa*va^u{z|VtwxKwTv?M`a=epUwTAuEML@TnFs4yI?=o(=TxmOJ z#dS4q6iw6R@PH;LO|zmYCROW=5_(({F^+SImbOEVjSmy2}{a1#8GGPU|`ZKrGCEeAA!UA z!B?MO%UV6-eIQxwR@cLG1~dI#K=-~iq0SoYHSKjP!(PpBO6!*GH$4&KI0wvJUsLCo zksF;gG{z;<$x&Y$%@?g^Jja{^um(nxU9YO$?~Vm@+NSqRV+jTL*9!o>rc#?`LzZGX z!${;A%OCVWGN;GUq<%=mI1p2W5@3TCX)aZx9DH759iUg#Ip~^p+A0?cZak>khBdIy z+ySF4|fDmU|wc)JX ze>;*@>&2Rmuzin*^Ln~xx5d7KLwu&@0KD4B)yx}FFF z>C%hGl~LUy$*~tTFtepHHYx41;PvhWcf0Gn-E)kg04-!pAE~ybkOG zqZ2c)ieR~dS1a@4l_IY`WZ6t1C55$OqXVKvgR86SrbZt!xf)|Ui`jgx^+@CV1gZ1x z?zEOQU#|*|xdq^y-X3uhr>MQ+=|!`Er)%%$l zpBI&P9vx6l3VM>?kq~VGdXz^(;})-bSr5$;4Y_Kd)7uG$_JeEf7qHsFeB>{1b}@JF z2BYpOcAn0fZx>958Ow!RHU~W1-FRqYo+7ZzOE}}%33lK$fU_YdYUWcxz1CvJ z+zjVcMmkJ6X-Bq1{PGxJhj!jY#b0mkc~g1jQssJKOCq%Z8o@h;CJta)J(tToIp_*OO8uX(GA?dkyLI|D>r>BhQO^^jRKDT*=Q&0xKnuG!9) z)51JBFxuWn^PU@JJk!PJlYmFAjhyYu4rXN%B!3TfJ7->nR8vm}^b#KCS65~tsj*B= zLueTvw9Zl&#M^KPgfGrFtDob5`m3idebh;5$uBPR?c`UucmH9yrV%9D|16mH9bnZZ zJ#i!O=(RxUY=E>Gt46+P(-!vlVL*o;z-d`<|5&XnX4CN;bKI#?=M0&&n94&fKn@Vr zPN7%_C_$O^uYO&znj>~5hqvO9epJ^o^L-foN+k;JPCOgh%vr}1qhN01N_iF?!;Un4 z<_RS_b>*0HEzAMjag{R?vg015R~dVb`D~H8kIVG`P*rD_3saVeI)Jy~kmvxVYDcuD zq@tG9QIBaxlZ>SY4;p5dehEBx7n~nqL`gT6!@TkUF#97Q7kh*PyEDP(TEg_|3;58} za_hr9%ZZB)^^yGJCv|guu#|M%#DcKp?YAKjEj0~wt~Cd}IP30j$(rxZa^J?h&K}P( zQsN`B=oqNR>l#VQ=wdkLXa;rUpMlFB2)`}o1AK5x0JA3pU%9+VmxeNXj-7r9$>jiH z8)GEmrlF*9_9)a1)v>KqRa6J(DY4n20Dfx>!1+9~1v*Yi1E+7#YXz(Si@1n&>7)zU z=XVLG!^fw(iU&Ge63G!h$lXYUp|E6rbO82r0O=ejune}`ePZjz000S3NklSiQvc?$cRUj19G+#rMr!#XWLohgp~k+cZ@UVG>8qzvu^h>HWZndkG@D41#FSC!oc* z!THag!8ZZtaVk29jZ%m9r(X$k$|W%R!;jyc3G_J@_*o(F=|0iqTLEv)@ zV%~fl(7MBS!Q_O0ov~sRbF_dEmcle*EK?&PnFEw1LV0XU|2OA7zivx#p%QZwwaK;; z(7?-ChQm`EV%%&qT=^=3SHRg65t@ID%~i|X97&ohirbhu^q#eE(-{XLkc{swH! zVuc-%F3j$nvwRL8)%^%dVamt&K#SrNB2OY#Asxbh{Pu_shRCq&qPDBecGSXT~7z#^a%B1+<<^WNtfCi4L z$z_|qnNv~aYkR_`0MV{ri|`LL#GYbUam`)_!026nKDKDEA=t8|fPSC+0>=(#y%EtX z3q@8`)lU;n3);*#>8Ob_)m+9gX|;Z!p#(;DC3deK zfVvqzwn)$nELiXS=Y+ZYBH+_E5kBO1#mTo?n``aLJ;u%$!2+uN!cG{vGWK!+c{EN* z1^oJESu<~1*%t3#&>Ihy6{~panj97rjXU^19 z*ijLtxC9Th8cS&Uq-Lc4tfKe$+4rugYM?cZ`SCaEQ?-QG8_BUzdpd7F$)?T$FSdk0 zP^*~sE->>0VAe!NZoI{oO?I!%Ink<&-V>U}TCJ``bNESI!M^_-tY%tcZi2n_9GJfs z10QnmuUHK^#OV%W^~myGnC$h;j4R1T>n33(%!D12+=CwnsC1BDLQehKx-Mg<58qG| zO8)AZz<7KV@c8xd@v-Y*1d!9Kky|uqFX(yB`*phY1n2sX-@tN;3FQ;{Md?&#G|TDi zSjUt4o11ZW0WaML^X3yUbgWsm1Yn<^YtW-62n%7tXU$)Qk+2eGO!5wX9iV0;k7`g+ z|5m>5vonf0D64CVm%zmg^rsuiqH23Qb@+*0g)=S)By9t*%W&lpdvULmkO_(=CP0^po?Vn1v%4XS4YxGBR!a|q`8)3v` ze<585h^qvsk5m7z>DHP_t2Qm_I%fKr>uW;XLYN2}Ci@SW zI6&MbNCGwBXxg=AU0rZx$I(-Z%c>emMDSgVvQ0M1R@x`4i)kASvqW zBv=Y)0OAB2tAEJjx6%!@39BuUZ{P8w6_w*<8?A8c2mQ}vh=3k$lDO;$j#y8m}8)d6( zmhH^SJmkUwlCJ(wGk_XCXi!rBD22;@^32SUKY#vI&8$12d0q>Pwv1Uu~ zYo>3Lp{hQ#aqPnK2c@fYrjm~Syvi2YB->=8Y-MuxA(sw_YNKYU)u1+{)K_u~6#BLF ziluaX3sH`uks1B~u-V1zwL|fZnH>>RX%Qub}FY#>q*wk~5dVTK0 zl0{b0+AjIhMLJ10=_p;LvvenE^M#ghKva9xBpD^+RJ&BmRNJCJ=%83pwQ<#}ODpE? zKW^5IdptGcs!n63U0m?Ul!4}w$Gx%e@>Aa{xk^#@N>iR_MBC=k zPtR4^ey`7eRJ^E!`g8G?3`GGi+0sF}NGItg9i=OaG=FGG2SlxraWYcI%4qeoT2-nB zswN5?&6E^%uPERIR@sL7;EJhhD;K`LtYYr-rR!!Z>RxHeqmbydQDszCQM?p&FBy_0 znUXCXq>FTtZe-DNVQV-bYMq+543^;nKtKo(bpx9A2}pqz1yTSmWnsnGdp#@0rs-Z_ ztE_m4mw1Y|WJs1|O15;6E@a*EVQV@dYORbH2pkWc!B@a&=Aph=V5xghZ7pX3br-6= z0#s4milXinl_wg}s*K8thj@vncnfsNl1#}aTldi1IsXL!0RR7svRUu|000I_L_t&o Y084xJ1_@Ts?EnA(07*qoM6N<$f@i6zH~;_u literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 0ad321f7a3a2665dd4a190a95864558cee4df585..8f64f9857235abac2d23a800eaecc16c56dc1736 100644 GIT binary patch literal 6219 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�T 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 KMNUMnLSTZi4;OL( diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png deleted file mode 100644 index e1a9322ba3c644fb297d5d462f470cbcb3a3b903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3417 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 0f79dc8c3899bdfb7b2c30d81a21c7cf8db6376f..f9f903b0a573024a0c54267e74def49aa203b54c 100644 GIT binary patch literal 12752 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 literal 46328 zcmZsCRa9KTwk_`NuED)=5AJS_ySp?NAh^3b!QCAK!QI`1y9S4lJji+Hjq&cdAN?_V z*RD0^tkt!vSJjSCR+K_UAV2^E14EXP7FPuW0~i1Jz`?wKV|Xex1O|o%CL=DQ?g@UL z1N+TfM&BR_x<8^oN6m|j)j{{{9?hc;q%!%ap}=)mY66Q~DkC>+9F zA>?%mD>jHI^z>nLpk4SaPi2&;&i{A07_G_52P*c*?R zO`vcnoyy~SOvJt~g#G@tvb~#*OX+0w-jSF9$D#G?_y>t?)pweqo^(jR3L^gDnSa=7 zV!j{^b{dY+8!${+w}N)$>4F>9@}a28@q^;aknK*_2b{QpW8@m(&D|KxXOc8>q^zq` z`iPiK5*PBXxnAr)g0VDTosa*Cy!&W>as#ybhw}L#Uh{uOAv+5r?H2sUA|c6l1yjQU z%(4FzuAqLzf9xk?uJ~usp(zwfF0!-GkgGG+zb?oHAfk|O&~m>^EaQHd{>J}~o&Uxj z6}0>lghuiq@H4fe%E>=RXk$MNz_PTTJ^FXu|DPdb{T*d){~W~n=U`-``^kgX?3xJ_ zGxrAp7H+jJo|%suK199~;u1xC{nuYR{zw1q8K;8*00_kQamxJ=aB1y^^Pl)GoFDvL zI5(q$^#2Va#|J;9!p1r#$!#N&0EwRuuOFVg2^B>l{8JzX`mi{k&o#=A6}E!KgBOn+uPyqi2*w-!0287F$zRbADmDFWq@wR|3vV7a3CSNtveq4M-nZ%$8YVu z0j2hT8oXOcMfAZN9@YuH``s4pbH?~!!oNICbNUGS3tW%vU(5ry4|w3ViyQWD z+!;yV?{4#v#~Jz8KQHk+Z+rd;xCUdXF#IqHCFdja!>06@ygU90-2T9@p8mLt@0J{(1HZxU!RcLc z4Nyq%zTH(H-05cPIsAP?rEl##$V;1dd{&v)9vVZsaCo_NdDX45$Qm4exy1R&cBh@W zVg+DePutk`;T#b#AJIJPb?7kvdCW#}-r1+@HVr zd+5o=CGKZedaWL8r{&U5&y6~fA&1emzjedsO24wVH@1mx+6%_DJM`?s54s;WzwvMU zlAQBWdKCDfZ@yfK)k#X5Vw>eo8!c+Vq{U=Mw@c#i^))Vzrph=#!S)tNd*nRXpmPuRQ9{V<+x!zNd!O?3oA#TW2 z;=Q0+y*S2Sl4?bYWHZwv8^s72h!znlu@}<(RloLoSjD+tO6M(0CQ1;gocXJ8fSWiTVgD44TCs zE!0xVT`-JENtK=XQ%ihQ>lIo?;rY$#4^3b)7Nh3`8Tq*iPWKGd2i##b@bgb?>_^Mj z2rfH#?jo)CoAqLQ2`JDrRW(x*ci5ytkt`Ww^|{@Zr_)~XwLEC1M_dPwqOZ!_fj`x9 z3D*xy#28yU7H{~3b5FFt#Hu@-M;NGjs*FXY3{FOnyVb7OgxTlIh@ucOTzRUq>@^gn z_TAHtN~|R>4J;-qJc(CmW_N}g?hX)0UG7i4;#GmZ-{@$W@sB8*g#avQEE6U$xod@t zznJB$)(n$>wj+&Qc3!j~ci!1yOWrdxkjIguqHNLPElRf4ttcnP#iI}!!CO6^VUSpg zV%lJ7r~W+~vbE0MT3St@3M6=O?9@1_Q(B1C2E_B$(X@}i{D%dAcg-K#60t^Zb$B3x zGj`)-CZ`rT@_IAbXDa(~LLiLeueJ3SDx2_T%jF9+%f@iJ`{9kt+$aN=q}kp;Y9b=b zWnvUj?-Z1FQ*j43Z?u}FQI9Y*6#?^^OaOZkfvu#x;AlKTt_)UlW^~P;L2#zMoLztN zU~*T>BBWD5mK3ypvxrtK!fdyOMDANldun-feLsp*%c?)Sy}GZS2`jqP!NVmI2?Aw8 zamd&Op(a@X57Ez0qv7C$xVKcH0%`NboQCv5mSd*P2fL+*`l(-7r@d;p2YmjZ9|{%<$x|jtmX6eT$tm;_BaDk+mtuqaz^=BkkJl3TXX}cbKe2_kW09RFr2_G`0dyXc}aNvc$Z0VDM1G4nXzze7S`uH z0wPrxBl3hitufpuk1FafGvV& zEw$`x!4}|dR=aFWlS};eIaUwjHWRQ;jHuhvJ&I@?focPxGxqwVrXw>ep<5Ba5$~+p zg8u5?!QJ@d)dusPz(8DY%D%zZBU92kHe=mlL3v&Sy0&A#SVJ|#^P@7E znwx|@R01r@%zLS@>!7P%kXZ!VU%?cqGJNZwG=((M1@LPQZx#(eG#{GJ>~||Y;<<`EBcA$Knv@*r>ANW zC!qPAxIe`F>}7G}-xyn)ANvlsc=E=k5;Y0v6}oU%9< z93cTK=|11f*RtP0`sHdXsrM+rHhsdfVJ?XSD<^lqAa|EgU+HP-vOR%&j)A7B>dU7!W3?0h#8zq~E zZ?V+v}f%FJIJDYpC zfspKQ${B&Zc>56JFaQY{IK{-D1^ZbL4n^Xe-e+CIm^t^|(DJwn`qkOhx~@;Zk0I4B z#yV&kKu31V&f00T)jZ3+Diq%qxQ)Po6Xm2B<)Deiz>@Im!k7Z-m_D3W#=~*b9p{nu zx{)W(G679l+3&}yIkmJ}?(0IW8|Ora&zopbm*)|PNj?SGYSPRHO2VHUi75^s#Ay2} z;B=!>CL|L6?yH+)i{nli&sNT^$`T}RB@{=GV~E>6I1j~8?V>Qd`~crg8MRV2FpuTDDAi>t11Uo?5e zTya_&z5y*qt1S=re-%+mxzu7XXtc!hHdINZQFbx3e6L#4!L=_q8ckM40#9iE#M1}E zR;?d})dzeGE0oePlS}7NY%3zsUMd)4d!o>gQdIT%9FNcN5`)rB0Q!P*q+EOE_Mk0H zRyjDmYwX{G-?_iUZV3rI;M?JtF>i+2691w>2UC7JZ{EDrVTGBqC%Ht6@!dh0Kou!b zGFKnPw0f%wNl;yF1xMrD+@rZz%*KTyc4}k9y00FfN*#xuIazt=&|2x+C+@yCHGXt9 zgm;wi{!>=hTg4o*%RJ~iaXB*PU_}u~$v^gkoC!|3)|oz!V4LmCq4)ODF4p&^` zdTtY{tMNc-sa4n6mIX;XWB_vJI1wvzbcqi90uS4-j%^~x8i>ZbQ0kaHNMd7gRJ`cL zX5V1G!87a#`YkQpJCsJorsVt1q?A`7@w=?eoL%{>bqH0rwyWyzq%xT2oMeV9PBF#) z$~4G%P@CQv?4<}tsp_d0c>=L}r}YlM;9a>KZQ{O9rDd-pzKNLb zjpknG{Hd12mV4F9aWC4#pwpVtdnZ1$4UWZPy5jbA%Wx@&>k2zPDW1f1;G*tBS#X{X z!D~?5{h_MIQ4PnI?@ms5NM@AwVx6vbYGreuX*)%d3)j|5K8ImQ?Y4ZZMQjo87Mg1+ z&Smn$(Guwa2PHEzMtFDSa zx_S05D&?WV@zIO+iEN5C=pz|Y%*H5@(-MXy8;A4`rGkgkjtkZOA3FIq5SH0<(;@fL za^Wxhv&*awjdCvN-uAT%^pj?=Cf7YAI{@cq(@?^B+Izeg}`^xUK312^L6ktGFU94f+XA+IGm9X3#dy@4l&;{x`m8{~^ zuTtpOf0=Zjc!<;(k@qC0Q3*~^uAYcK=b1H}pu>GNf>Zfg`o?9bF8K9BKTTzNpLl2( z#WI?f_%rn+3}xiE(DD@(>y@zHA zg~@NY4IOoQizzE{W2sBC`S?oYsC*SYF}+r2%e%FflnKdmVTa{#rUbUxPoCZCb-5dC zBqet$sbHyVG7&$rDJrm@)Nu=^Qv0L#D(orYSrY1?bzZO?GokUs(Pz!-WQl~0n#nW} zjPsMJc*zNMC(?#RNtQbIcVe}3k*%^Ci(G>LahGsjD4(EO zRF!NC57EwNE}Op+L=Z_{Widr&K@w=vnOGH$wbTb;W)b6(N^zs(u3HTvsB9UC1V}34 zFtKB3>L`+q&yFy%cQ0aE582S_CCNLLjg5)Ntu!&9?1QD#$?vn3=InNuQQ)9(-O%yM z8+R7x51=BH8#|dJP|7B%r6&_$hzn8_E87(wm_Su#u!m=?Gq*5|MoJqqF@CmKqP3*M zs5Nh0)G4jEk*lIL-8Y*BP#PB>+*$u3YIqk;lcXU~ZiA&N>r&xqXau9fd>F5NNH2wk zsH_L+QV*bJ6`PtBU_`;UQf9A~ak6RcP)7kh4Qv1<+_ozdr$>-3K-_D5Kxh)%Hc3@JWsP20~ z8_?80gRd4wttRBeW|U!X;=k7^WZcLZ!!+i(Hb&b?HdK>vyEnvSE8|$*_1rAwNEmLn zED+dOgHr4)Ee#>oV{6No!5!SZa@n?jOjr+%8>u4y(%OP&dSWaaA_M9MYfJelw zbGHbruRecEuRX}&Ur2bL`LvxtA&W9&62WkA{I2davbZaE-EAo!|(CMkrm*E_@pIg)jhUY+f4b3+W6?;s%HRT_I{R*!~E-%zpbHVjDEpdNB?QU7=mpUD}B z&UIw0I>mBA38_#3N>8vnqZ#(CNw*8u=^Z;Yn(~qULmkBw`Q%k7-j4PeW`;l%Ul<)u z9zp^X9+ptO=fgnc$Sw4QxQ4|;F^4hZVT4%`l`Cr!6(LhwG8099ho5*rej~dZ3N;2; zFi|8N;^0OXJ&qKw!h$j5LDRZ$yU4ReSa*riH*l_ot+(?%I{|q?T=N`F*e2i(-u41~ zm|5I@3uV?X)bv1+&@cK83ZI;44+_Fnh^a&(Wff2tzxs>pbTb}C1^7qey(ceW@NS>! zfV$VcSxtjr-6~_qxKkDQkxd$?87n2u?zvZG){EiDL#&F%Gockq>3!BRXP@>=58+gf zN_|h*35g=2RG`EHc7(iC@C9R^be7JjnAPvkJZT|0F8tuYnj9^?Yi& z+dHyx2b$6foib$mL1@DKM}V%+-1C&@Ey_HK>6OE7E;vN6pc1FgTO%T^IaYo1sM1wM z3CN&e>Qa>5Hz0!u;qM`UaHh+)lRaYX>WQO1FC z=E;Krkz~#*fl(YXVH{PM)9(#rcV(svDVC9h469t7?L;CO5^MguXhC&5^SEGxKFQxa zBVBom38@M~4SJ8csK^^L>gG3B}rvdmy_i(HsZl9AZAgcnefC>ae=mWN;~m5N%lUvPz_<*5yp{3?Avz zTJx6QGq|>ixRQ3E2!8tp!=KzizFMG>c%hA(Fye08L3PA>uV*e>Rw#ta#J6pKR? znC`wCbHSBMIkxJjP$h(UiHx!xPwB(=Mc!PbXw;QKLcM={6^JCWC~{PDvS`q!JVw@9 z57xIMm^k}=mFj7A8u=h;g6~TP#p=q1IC2_4YhOVaG`rxNNz z4quG^Xj`b8!ggqs83(?Ygw^$xkGPno>I^N3+sPmY<(IZ2 z=9tR&m(|7W0V;i4%Exg^f32_}R}1~dy*)rTCZnEE9k*mmnsYB1gchA~L#s)<4UX=>!}(OQ>5+muFwM6wo7F$(borDxq2 zYG_hFGrcdNco8INc>D7p`*{>p@VLMli+nR!b`RqYJ;m;PmZ4`YeFeT0R|f!KDzjvbjGoCRWdC(YKEe00;M92<$!@^ z+6*N&Iq5!~d1FwuG(i?N--xBv=+2=JN{$t1N~$o6B~>-!)+C+X?njMp+P*P)o!D+&Qgm29->N^rFAl8q>Q35$zjq&sU@Dmz#mX= zL4dm`OU=xN5W(*RQ9K(#oG&f>Zv{eS{hoVqD7nrL)jVZ-Ul!-6wQI$Fl|Sv0y#P8I z5EG*Jf{_=YgvdVyjRTx9SsRca7w&_N!);EIG>BUYk6|y#1TRPDlKiy2`&cxe6NITY zAIazRzpA&3{E6ot?ff~M&fPC1VBme8RB@G*hyNlo-rAwx6<9R&vhvxXJ$)bR&{$}+ ziBuAEv^xdM9O-*vb~OL;`cU1ao#6RVp=$LoaJuE-rX5Z#j1oH9#jM;JT3ZZ3SJ^wq z7<$ZR4tFx}wQ}65o5#YV()@97uINXC6xz@s$MjVw5Vx&#(shhjP0<8r$c%Lq3=tI; zhkPD+I9iv6)$ICG_#vl$ucArUC0e)qY@!~Jd#Nq0sex&ryx8#NiC^e|qy4iZ^F1Ci zo+4>fdV!XWZ@l*660Gp4;tw*jIpG)1cm=^BlOYQvSt`BWeoqJW2h^+<`?Sk9u#;65 zgtrO&IsNZ9o5zQ9qgt9<)WamHB&`!0vUx7phALa49qVy2!mmgtyetnXdxD}_T)WZ7|Meua}uQ94o<9skH_Qj;%1H$*b0!yEjbX+qG zN%1c@-~SpjJ4g<Wi!N0=f>i6p>wtZzIrGZ?p*ZJYP`(wSruwZ-e{ytEd$y_fmS{*k z$VC*eeCy!@5qhWbUvZiy*{t#k#b?*Kt)7Yi497_3xnnS1+G-cor?Krc@@`#nxd%q~ z0XYd#pR1D}+f)w(`YSn+;v(*KF`^DD$BNDMGOmNFcvvSklv7>AKha@kVS2ZQslaXK zKXAnJGKLkia_efk>$L=jdobVgXZ^PpV4TswfifnEyF{L0n_OXt7cc==r<5+MHCaiN zO13&ixJ}yLddKsVt zR3{3x34hK}D=tDFdLIvdFubj=pJJP7a?yJ(c_!&DwOsiqJ=?pvuXiCN5pQm?QckVDG* z*W3@D@J_b3DL0{I6J6Xd;8nQoBnQOoXa`LIjwos566Oi)1$#1#Mut=#LX^BAZe${2 z&*6qseNZ;@>qM>#f#3v?9T^xEIGi_)hlYv?d(RZ8EoF_jKoY-P4uUZ zv@7V?mgRgTB7G^(+}rp~n$!_)dzNi1#vhujAhCg^m#m3?J*lIF+)p9HzC~fLF*kG! z8x&U$)mQv~wO=kQpW1)k7X5wYJLxB-eOX#Aj$&cHOtPhuC1DnGiBNbMS}uz7`8M?Z zu2p}SMds=^jrAillblw2$Llutyoak{YS{ou)N|s|deF{|hTM{ikE;$L3Uy&s6l*Ao zmJ%LgSWsQY>UxjQN9j1D&3xdK_grs=kwt0@16tzw%=uFt`X_u8H47X#p~gSQK}>=v z%GJ^U($gLzvzc;K+3y9b!mm8hiB7lDsF~$$LD?s!;w!_EuFb1Cc7iTym62V^DP*5k zMVN|@`;d(?D@xndiAYcGNK;9!M_&30Ghl~qdwzO%++`^x30>C|IDQq|nuw&(3pz{N z#$a5hn*%slEf0<%-}zoKzD%+g9SO-jZ_JjI`z)}{y^%0)9>!w3Uub+|I-Lqd!d`Tr zfz5Jm2pTKH)D%(Bs3_Jr4JxCQVaBuqRo<{Vpks<}I<*p_FUEJgeQELgb{KV-w2`Xo zNLWHh6jXM6?JUfT!3wccV~TS7zOd!h{gTN$&1eB<$P+9O@B1Q($0JEZzOQ)vq$?H7 z2;&TiZ`Fn|?zGb>>RH2r2U&wp}Xa z(0!n;&^)v&1Uqww_Ez?=90hUo#kQLh}QBmQa0|t+u!a7O5lPLppL~E?tgH z`B$n?xa2VNjKHTdOWoF@Lnp?NN$~s{Iq*gv zNE02Lvm9!(b=Uv;q!~v3&b=F)_R_u42phL?)3z-u*040wYFl=0uzlH%JJ<20x(%6@ z{(8#2K*2apTF~mkT zmsv$+T$;1{#SB|Pp7%^4F0#Oq$VRznHeOMH>aGwqfy=SniRH(&_DP(f`dz!yGaXSZ z9uE%pXXMWlumIC2uhcpZq#tZC&g}*rBPqLi-Qooo4q@}HUxa~tf1qqR>@;0(($!@K zHx}0GG#k$(!Ejw}!Q~2!O*Pzkf037{5wjBUTmKI#Bfun#%RTO%YNZ6l=1(wRoU04s ztj{F;xr#X)QvImx2kCFo54!{hcuPMjRiARZt|tzQbW#sKA)FtlW_VKPR3iGY?V#j~ zxsQh=3dNoQU)+glU~fV((ev(|9o97hFn19~gy(Re(jB)^3Dp)JmFDD;YiY8ar-=e{+d zx@(P$V)Ky!_lWK5GPyVy1Q3YQy&9kn) zG5uNkN8qN8I3A1iq3rwi<@+2i7?QhCHb0~%sv#%vT>wImMv!U`<~$6iMOTiIn+j_k zVLzn5ub(Dbj3?BzPAXW%@^u%%8AD20*23LU$i>DlpEVZ6=#t2&#@}1Q&>mq=Oi^rQ z942Ui7`>S!K%_xmk*dAgI!?NL>(#=DGD)Z|-=_}Rn*Hq28 zbHb7_i3YlfM&5A_sxNiD;bx{l+~F{xr*G-erl?ViG{tsthTnfLcNYJ6cC8%PnLk#1 ze9y|&HajP&e*0j1G%Fx?RXFRZ9k(921%04u%lPHwFoioU))2CC1U_$%o&3mKOFCRj z5y!TKX<`4-;>!Jro%FX<(XvvZ+C?XVpimJ_uDE0>j1 zJ#~=!_&`APksK_A{sU<0D)iWv8kMEdy2WM)WfakWHBD`i35nP4LKYal&_B0=t8ZP7 zD9t|V-q~4&2pZz6E?FL7vFSS5mzB&M0+c9TibFZip3+Uucj(X`dIeGdFM0K4U(!Nv zsE#`~Yw0K-sDxR3g19M>x1b(r6-t8}@phIr!{qo3YkiBw4JENlN2+f_f4l73{g_GV zdQi6ZYS`3wT^(|4ABK{tO)y;Wp6^YG=7=$u&)JB8+bvjB%Pa*ot4|1OPWH-k@aNS?QPNNFg`z>$@!`;d=hHLog z?aff`Cutj-x)5UTee_sWefl$?-$QL?yGZnK+#2YwhUhY3G zX!*NC3V6&%1W5L>gZvy8e-!(^zp3}9SCghbwNhb!gs%!7af;K#tkz$+Dhk(Ft4?ZB zZkSp?wW=6WP0f1`shnzGT8_iaD7^&5AtOwmA0`aRTt1B-Hmu6BYa~T=QdekwBkAm? zIN$Dw%^8)W_ur`2@155*e)nxNoy)RBKk1Xj{kJxne>m?b^FEWtBN5n!1*xpjS(TvPrvKzI0v?zvJtiYB+B~? z&Va8qDc!W-*S)K3W#KtWqYthyvYAf{S$$OiVw1Un1&Y)gys012vS0BTBI^`NOmdLI z;*;#;6pe$}Rn4NYkHD;w8{$S&EEQLTM%gm05{0{(FY3g@b_+?Xeo&x;#v^!WL9he} z`vTn@c+Qd&TnQ=@)WwEG=Sgf;7QYj^|D+V4c9B|(hF!$h`06ZnlCF_;dRcxe z0{5VdQ2Q(t+eChJQ?z8l7^KUOcQ~#;ojc;IN&U!Te(U`6gnhyO0eSyUCJ5bf!1!Dx zdeSoYy{xHV8Irck?G9MMF@+R5B}% z9=4GUXm&WJ4x_t-s+o+(=irn;r1eU@&Oq=m>7E#*H5QBCpPL(tJ&Gq^6VT>uN5#1x zt{g0*$l(BkqOv@dGlyM68}qk>{A@de<~9pWfbmuCCbD!vSazH*egknB>7I{O zUCm|v^adzLV>hUBC^2g9OhW^3h!`C;HF%|d)ohAYupUMcEyAW2 z@9b1h3=&|(`zMk?u4vTWnrDm%fBUyaEhs6QM)=ex^-MPgqydq@<)(0;nuKjVO8MQ^>4N8XN4Db$1`L@n2TU$)&bAG*^$r?&3|! zCl^3N*mJ=tZ_&qp6h@_TT#>YisLUGq71smp#!)I>tiX7h0lL~~X6=gNfhYotUPSp% z;!j8+pt4SKOX4A#_Jx=4*PVIM+m-Ut=J9AY#MolB!y&OO>a!8*_d21rwW={^08jMk zohQ;8J_O-g-7(=6GKx*4+<{Q(etR-CcD;x2 zPv$QV+{IUIj^#~(Kc?Fn1^-SsyEqk1Ld1|!_F2LS|D&MhHz>&J6hD#nWmiw$%v+$} zKJwgoR8>3lbOq=3B-*_AIrAYC(Y~8|;9g!u(cAF85~cxIVF}7utQP^+_gY#9dMF(P zF3^JHj?%*k&x{&5S}4T^L^g4&#!a_wraGAh8vB{nI}D!NE#;1U9QCe%H9}*11wwZ5 zIuK_I-#~zZGk5`F&xgm2+Qt&LKb`XzeyPAWTeJJmp)*5oVpkl!ou$9pIAk~Hc&T@X z_*NKWE=JItl^>zcex-YSzjZkCJ|Zqvw5sxGcQqmV{Y{%lcla=I`ZjbV*!|c3RysS* ze`^6ZC-z(^n7YP^?9nFY_CHWSmze!!IgwQCF3z)O3J$*6zJvhH%JXm9hGI!?8Jc8Y z_F%OqHr_O=a8Y;3%rNWY2PXz7-5hvp{Uu*gtLF|UxuSnPAITi$=$_>yOV7}HhJ&{P zYzbZh^D+HK4)?OVt8?i#WY?0v>RUdb3fZkKypr1I%I*z_3`%(Z2-YP!!X94qtM2Mu zoaqG^isiusOgZ~dnd!*H|OW(qoVPN?J_A7qGUjD2O~3oZbx=f%Mj|fyJfoW~}{S*$X#*Wlc6p`Y*o9@XZMn42U>(D}pDyqiz<3i>IUf$#deg*Ek3) z650}-r4$D;+gGFqWmO;>@i-^^Jv3hIAm62{w84q1r@EK4{oLsy3IZ0$8fa$V8Yohw zl_AYAC9S+~V(X8qjK?uPh#N{Swp7hiDxctj^X$(2rc6wP-bCL>K2>K9p`bbU)8tBv zY}|Z_yk6$U?)-SKD5-`b2T8yEhFMp5G?}YTl19IHMflebsDmHS3Y~9rxLdz5T7B;7 zbsh{Moe;;qUULkr*S_YtrM#E(NSck`_U-21T;HC|bq6?nD{^De!;p}>_xw7Em)Fnu zMuoHls0O|UWcDvc79(TqCEGW307^#hXzaU~uO<7P+Z=wYw%XHg@!bg6nk#a(b&a&> zw>+QTraR$;tYX=M^*LOP5=fI46SMX$ndr+-5I9l67VZ_~p05vX99Nab@$$I*V)mSr z+4*Wy&L_ECW$|_$I!XSqvWf^!Z@T6X8=3f0^qE{&px;0lWN!Rk3UoLmdH}e_y181n zAD(Jpp(BXxBr5P^W^3p&muOe5eU2*RKvP98N5Xr9$%p*D-F8o0Tq+>t{hU>#mA=g| zE8C*=oetoz^cTB2cdGMkM=5y)%=WeU`zoq5%kRoHzsE0Lm1$2}9M1>UQ)w*omZpyi zr8!znT-z+(&2Ehu!U`?(Eb1h0xAXUVufL)R;|75>e`?cD9;*z_%DP$p>Q0X~QXPiI z)WVQe6y$fk_fn%G`MM7LZpeqEO` zsLI5U#@6#b=l1m97(|xI>@;AQ-%ACy*rRUV_Rj73sdOBiY?Yxj-X74BPK1rYV!QTj zZ0rThX$pUd$zESO^Y_Z{Az!dIsj2TFZ$6e*#IJxy(NLH~K^-3~lHX}a8jQr%sF67p zvhy6ll&g1?7&;gb(wcj(-xzrADOgO;YtHG>2n=ef>lt8ZFE{XYc6nP#ca=nRWzKX~ zQ_NF6peLR-3DazJ`RVcfN>BJHDo`fr-`@TxR-E*kGGy(lGU!q2@an~G`D!s z$)vxM>$_d2(orKQ`cCiXaqQmQtVtVAlYGt|^xR$@sxuA{Xwir3Wwi_<3o;Iyk?4cb9&(U;GHRKMih&i>T&tfS zqaaZs_VGd4IMCr6>>)l}^YF@cN3~hl_F^hMbbOAYz~CSSsVb$Ds-J%|{6uct z0pB$9e4o0QMk&!N7d{Mn0+DdCqCR)4FR(K8X5_$%w@(Ri(wYUH(%S`U1XQG$-=P}7 z*=pVWP6m@e$?!B+ods5@4!SmUpbGS(MvK(8ZPj6vxg6Mdj0EE))p$6UMJD=IUC!k0 z(LOI~;0T~9`_c&fb_$OZq1KQe3xOfUf>pw*Fih{;L7bI+9TY3D^qw*AJ}ev`XnDF* zeldiB_m#JHN1vorP2~*ddE%&7EP30Aq%<;RawM*}dao+>jKT(tR!{NUs}w6Tkdw#k z3%8d^xXSMV2kTvm8ZMpfKw=8Y9>OCTtql2*+sy6v;}jKT9{8W1dZjo*U)J!An`Y9; zTw=}>iE|hvt%;7n#aOwjoP7v(mIrvvT)&e8^7=(@pimo-8q=qqp0?iCIED-OJX%E=f<-(zsE1xk|u@ST+ZZK&A#7ub&haR}tWe;!oD}_;cezRD*h_n$L8P9j}1AcjZ8%D<@)(@!Txx1Ba3ip zA8Z9&c*Nw*$pJw~p-6VZRoYi9yI+iu7{gUtm?Ytw!#O)r7+LRn8uucb?gIi*wCg171|m?^t;IA@7KwB+agXR8f4+M=Iwz zaw?&92hR{wJ1(dqgA}@in%8aZl&j|x-}KfREg^AA*&yjJjYUS3&q2>Pdsd6;rMt!z&=1c_Gf))K2SFWV9rB zca1bAw^UJLEhq^tS+2vwl60%>wyf?_kcv|FOfx;_{S6diANKXr+Iz|f+=L^=3G#yC zgkl)bq|@-($F}M87UkN(CuT=AwJ<24Y%<<<5p?-`J>F4WTFQ3M@l;w|csuZZa4Z^5 zsr-nZhJ!I(AirHD0};SyhNETjM4k>~cm1oh)OleDEvW;ATSDCSr{){k{?SB5sX!~sWBQ@_%2DW1FxWM>+!@LajWr3u*6XAs>q2XA|}e`V1AePMmB?d;J0 zSTG_)c89A1CghGK*sOeWO(Nrcfs8CKqG=4xxK3Auj&n=>VZC007v0el(zwj{!8UUE zGX$*x8uA&MK=}?8Htumw70T+$wkaAfZl3w_76Boi6^0+&s4g)bWTt9K-Q?)>-DsR*G>T>q@v>9?|vd?05JucTcu3&cSdh#PF1DH$e zi(fQJ&DM>ut%~cZHA1&?;`vwCjH6srQLpjc@ndo3hb>fDUQVPXdN>$|=86gqMpqVw zuqL%2mn%l=8CEFjQ|y}!TX;*?uM_kOQSO);xw*QI?&tCZy(ZO#o-{8yjzurlnr-dx zGEk+z{z0^@{j2e#uI7bB=q!ug@ym1O*|K3Sx$mK{;IGcJaMJL^zuiVJXR7i}p2)rC zHROY2)zsS}M8O+xvX!N-oce|8neuuv{1^*Jqtr)H=ccv+op?)>9fzFnr!7}3qsx;^ zm&UhNG3_!`GX&n+PeNv)LJKGpq?yVqWo7>+vv;2os22GuGX=vh*HJNcvcJC!fhU0= z5v)KR@;5+ZZRbcC_TB7t!{n`Bswd;5N!<@8U8=lC@)tsra_AljHIw35)jwJ8TLt7%_3LC@#+7+mS8y9uYOs&Dli{0bo%s4Ha6*{3sH4VvqeEY+ zXE@evqd?dFR?PW~tVj~|^pFM%s_k1Mrq^n(AKS70O^Nq=I^fDH$FcD(-KaL@st}UY zg#XPLCsGEvU9yVXVf41P1E(mU5eCmNoU>3K#YIw{C?EiE<$W+&&X%*2Z{D4QBa(x?f>*z! zW9YIP?;jgmmn%hQ>MX+Hg#^xP_P-v;ikN9G#b=e-ZaMIE+}6v3bGBa#rf_NhTMLlj zJJbDgyTQ%hIx#^!doRW=(5kWw-k5u)5}|+`lfp``I)*a=Uv6tw^d%>N(E5HX!8ikK zabb;Z#V+(>7vLI+CHSem7CmBo44G#y(MEDo-`RhvF32t01<*wV<>jJHL}4sVJjlTa zffQe#;*zOnR@Lqs*zp=Evte|Y0Kn+9EkcD>rE#;Kw}>#TsJmon_$yn}^Jlkw?o!{j zrtzFd^I)wtm5;=;cGD7>l9&_256!QyDW)|=F2(ajF(m9~wqqMZKTcZT zci#1qUOTeW8}0cw@?w6C!7UCz_|K4=!T;4EHpFbwLOlKcm%Bh!!BZBB%f%g^fF_747)Bzio zPUEjN_`+QNe)RS$_*e;#$U~gl?DPBikdfB0JY6l{gLJi~*Hdm?t>`IXIp<4{W!(N5 zzo^PFP_X?<+2(S`#hPQ*mqh`&-!sDQ_Dnt(LRnqBN`CIEN2&KS2b#;tYuG%&sBHfS zS(49W;~f)HqZH_u$%#% zmt0QavoPT-ic9RBtj^@fs4*B`lf;d&)n$9z*!|&9MO~3?(ze5tSBa_Y$KoUZEdA%- zxfPmRW4*DYa^2IV9iu;dx`xp3%Mq~wufcb4p<8*IJs@im%GGZwt`yhg+@1LP&0Ag~ zeQTZ1IeYw`I3H%)J%`n&&u!IeS+QDHM8moQg;W!R!W#AEa|L>t1}iZYSue>WaSax= zL=3i(+QekNjpW^TZb(JVh0Po6(HSwBg&u$yt0nVDw`;l+Yj%+swHbZnS; z%gCG}1vc}(d9q%rpFtEebf_*!QEL))gLhIUG}&(MHt|VPO$Xu%k=xgQ`*Z0`-^SKf z)>e8$+#T2T{kNn=@x8A}Jm(wNwKsX&PLm%t>^K< znyTmaeOvp(9G+q2+_FxJ!{KJ*j8CUrKlr7C1q`f|uwa$SEP>e7K+V=|aorJ-vW);u z4$D+%4uc$raX`=kuqBv9jY}JbxuZGW5It#a3UgW`!aO{KCfit)mSk9P8!E?UCHzb# zXWxqoUqh)PXN>(y+q{POVzAbd?$tMp@Nl|9#HM7|bT{u!;g2mWKxWzIw(VuVULo$f zs9qU<F<`o4p=`sCt<)-5-deuaRXU)$Xz=WpGIInU?1BuzXaW!dwi= zt>*&rqynWO#vqu{0nV6{(t# z^5QOxR{|>5D$kf=88Xvg5lh{Lvz>@_Qx!|ycmi^S&j@2_Om4~b^_Ynvdo$ z&F_X-=ZYDuQg})|%~`6I=*komG4)!+;8%5=qKi|!qm{=@TnxUJCS9Vsv=~i3DZD^g zdCfO(nYT==mqfbQSBLNLt@7tSutZ7_Kg}lJyn4Pk)5u zO zVCeqH1a%#GOtw3VtHOlwgHqA{xA)UMa6TNKNuH85Ik=md2mgk?XpiMT$ zb;ia;7fNUQh0HqR(tYC=?Y`N)Qe1cO+4tA4B&|Deg#b3ht-NK7Ea4GN=OheP0SldWD(23j3#eif@_8gtXd$CTND z_UCqs+pdK6wQyDc_jjc)ePo|1DA)V}am&0f!NEp+-dXz+>K8HRE57SD&HEOu-8Z_M z$`&@GbymO^)!*`B>2rSbyw1>N?rezsk=QhNKAHO@<{Lf9>%eo=*O#?)uN*_FF2YMC z9B$0nfaNUBJAiK4IoD}ZVPc)q2yMHX#PG9F)uPS|So#}*8z_!Lv}qpm{BDTMxu>yB zE^}8kCKL@jR8b?IY-BJfWy7L|VxuXL)z@9uR8hOIP(mciNSvpEAiUIZ6~-Fwg~eh8 ztL=3hZ~2X%D|FtlQR0F8(gy8wqK!|zSK`aZ`%;PfP_BI&Y5NiT5-qVIp1+S9;_izT zyx>^xS8rNR`CW6l&h47EPDY!rd8V&WFX0Q8jhmEL`TTbRVg=;fhe&~rz#>TQ!t>60 z0fLA9!x*}1VJEUdXV#tYv4CF^^@bGT!ai~Wm*uc8^}xfrO|lnE5tfX(^cu96W!7mD z!Ra-(#lg2B?ysR{9(!FmxmMtwVnzOwOKa>FeWF_sYeG(uRP0wJtClIj;8OY)b2(90 zlXD}qEQS9mQ)D?VB5eVbz6df_vPWTQ>(8vxqt+OsF>!!1h zI9V5*bUj_H4Z8T^UF)U`zjvn2`QG=|-EQ{v!reOeyWi2pXPfq+?OmI9==^KkMrZBb zxNq%$;(a>z?SG-N56@hu=4y+dy>g|P>%x{uV$vZrdA5s5nZi<73Ujlm%rXPO78bgm zi^lqp3+sE(EReBPT1m9IG;f8qjmp`MAfAk~z?{8k9|Ni!_ zb<-!yu{u-RbRadNyJvo9pV~hA{EPMV&By8^=WX4$ z_P=_TKKs76Yu5$mt!3U;_u;Vzo1(lHyl6C?N}|(P*Gdyg`mi#>NTg;#9j`Lwn8HdY zi_XQQAzFJ$HI{PX7;BE6#2g~h{BDTT6Hphy+Oe2+O|4^a>KpTP7!}wc{5m|AI|c`b zkeAbDUs-U=yxg*8~@g#*`b?plCXQQ^%OVroC3w`UOJrHO8!1(LoPhPBuiInJ}5m#+5~~8IKsN# zZEy&jI{eA3T!5NRv;%@~w}YjQVTQ7<84MNNlvjw`02Xv8j{qNP^$M{a1?wTnYc4rB z0^Bqb#X6c=LoEgzvMTH%rGhY_v>8uM#f2zes2a<4TqeFNNjw+ISd5O@i#uM2D9!hV z=&AFh_o=bwoIrBpO!8=QdBEIF!9p3?GLB`GmVruEpzKX^NX0A`LlUtf)zHz$A?NBg;>_BUG5k%I@@2|ogT=>$4@BEummqUUbG#vXa+y0OjY)>H zfhi{y#16=6sXGIkiWdrA&}4BG^>vxJLrb9;kww-^^|LV@nm4i`yLi#6E<9B~nXb!+Js zS}D1%&?_HJ0GAqSq;HKU~^*lyuKW%zF1aW`ifOSkNHkIi<_X zhS(;&u{xPeN#?@2;^T5M{gKNznz8a)5?F@Y-{#O*X}o#n?MTO(X@;>0RtUe)=4~Oa zE-JPt57iOi8DifM>uRWFZcVu^`jORn_h+q5$Q`e|M`5pWEtTt2%hRZeqmQdssW&}c zI(q6q;_7wGhL3{Ngl=D0>T_2t&D{|V2Q;2Eo_U~qE?G#`2L-Z*y@_cbFHqtDyWQ@S z=PCxV6A#`A3>i*c$<>yuW8~Cviw*G!UJ@Lz#8{Ar6 zZ#I|>c}5irhkmK2)@E1dkI(Uj$lUeGL}v23&cr8Wfu#~^`no`du&`(c8KK#+v1pRJ zz+^Utl!^@w5s5xn6?ns@ZpXXLe8Wa*$C1rR`<%iXYFvV!{w;0XtfdW`_PPBfx4p!F z$GML+gk!^X>|?mX@k<*v>}$A>eWRB6mB~KW&;t1*u^T+6sd|3J8j#aiw#w%(EP2{e zs|7k#HJ4VLhYxAi>bPEXFQFrj37v2yskeWv8#t7lu?UUO5j&r%%b>G&Qat97=6FNQ ziHkaSY(k#Cuxi$FI;5O%^T|b6i@p@>(|j8zPku7mUbDHOP zL-cHViL^x(=4JR0t&=!$=ZJ6Rm91iHLs)C;9I>TuXR6`^yX{|CqNQo4YIt~xx5S#FouOXdq3Lcfl^NCLY`%^hNa>mMKCDweE!dPfd z)B0EFp)wHRY3qHBE|?>C@}6n0VzR**T-L&*mcl%mUVQt39LC6DJS_B$61grMgU&J7 zt+b49CD~d@P93wDIQ4My>^KtS5)qr)iMP3zHgbis&YHHLaAh5TliT~z(>5(F#X6(q z3!)|MIOcdAd!y5}>G1U*%a)_Bpc8KSBigdXx9v;oU#=TAEa`}ouB@Z4e`{^r?klu) z9>Lb5PtX-^ap!eLt>VtrK3DzS92UZ}9p=n8tjb8TMaxo*&`4`>XfZlymeVj4yjec& zR+2y525j?|Dn|3p$2Ox~KdRZKFC<)s{ldInRTQLor1h_`LuV9bC(YC84XsY7kD?S$ zv3ZuZA+kdzr7|gs@-`yZi{&X7*JG;}rCMrrC2k0RGcucAjm5_XXYeHYR*k8K`{k2a z`{_&BC*10;I_9(=$g0;`@Z9Y9Ti!)SUHfL*wsng(Bwu| z$Y7Y(mctw1m45i4+If|0XZssBZdhC3$m_7}Tix%?I{63huOqH`Ln-G_Yfh&=_^H}< z{OHPR&5n@2V4LggS}AsL zmM34b0bM;|=(2gPxaO07mSrE9&6%xE@l;$S-W-t;;WlNaee_1W$k-28h*TXLHtMt| zy;#TiN{NjQY)`~hw+BQY}C3-%dB_W`yn60?A^hcU$+lA{VbS^x|6HcVMZNhHMjO@vH}O7ylktS z=MB*#>vfU~%VOmQnDC?~R|6iEu=Rz}<+NB~0p_BxoS5r?g8_9)*o8CZT+qbkO0p9& z28*!SE+poH#XP%^4ex8-a>TK^@zY0iw?iab#=8LdxCEC zl;8Kun90uuH~5P6=p%RfYHh1;h4aLo4QJrQmD~<*ghw2{LlH6f9CqSWb+cdjOPzej z2WacDS5z!5uVZQRR_(mn^>yk4o~-LV{&`yBDoYuT!w<44o9OEoeZFY< zikO?@W743#9*`$o(8O_~c@;QU3n(-IhR3qio(bG^Z`#w=8 z{=hx+`QEWNyq#~W@2_h<vZ-{SUtE1&Ie+afl? zBfJqFwtcJH?@<$e_?55Y`d_H;d)#k%)BkDlD1qmT9RJC8e4wuRuxI%AU!W`d>NIlm zn#5jWX~z-Lh7GM6)&kVjXuMvUO|$`CQNR!C#<46Nwlnl_U*T^%tlKC2(;pf&K3S*} zhc1oXI;QD%2Kdky=66G^Qx>DCD=EhclU8pF%3zsDkuie-fvdsg=oAw6qYk*m%vACxc!&p@n83`&(2Nq$ZOq1duo5xiuY!iyk#yLcaOO*863tTlww&) zT1(0g|6uh6Q1#kc=qPSngn0sALz{!KMa<)p16LaETU^x6p3Y&A3#el(i?+ zf>gwtz%5&KU{Ywq*6rGM+{xN;$~AP@$)}1ps!P6Q)*4ep_=0Ci8#iu9+OV{wh|rpn z{dlgp?YNWN{xx;jNmmzdlrKs9OY3ca+YW8>3zL5QJZD_#s&q}qvlb_}=lgjn{7)@~ zIctMix0soAA+KMQDwmAFcTCu;Zo7rB7X*I2n@e}RpX4z?ouW^FNc!3rV}x1GPK0aF zKpK+kA7q3=F^{w~j|Y{r%wRc8mdBu{MChBYi5cSY&mkFDI6>Fn@-dcCxJmxb02>yW;Q z#b~St^!iz=n5tf~uia04iu{{79e%`xfVI9Zlc)@>Qc zDpf*V1yc9bT&8*65Itecx4dkH0K*)P8c&NvEE#2lER{? zntfJ`Wt$ZK2Om?J!SD$?6cgNRDuY8(ZC}e$jjBFlBlx9x%Y5$H(wqNMdfBh9POtvG zaSsoEnX94Ij^_{BaenAM^6lfLcP!Jtsb-d2+g<{bHDbkZw{~tw;eQ%PPSHrZ`JH^L z{1|EHD!<$Q(x;{OzD?S7ajoBhEl1Yaloi;l{|YYi0nP7*7{dfrX}FL}yyODF(n_qZB$_o1qXHW~K%FClLw-q;9VkP)SZTAQP<>Kt1$e!hXuttxTs@rm4e6_2 zlpnY&IWqJ$WAJZ%^}uw3Urn6rt2wSx_h$MD1eU^W{9TOh}IW_yU;XTwbzy)=Gux3MS(dJQQ|Tw3;pc`YX~o3Y{>Ph(zWf=?)C7m9qqkAA zF3<_#3ss~_r7H7R&hLg;r>x`z*GX)%=hYuZ&AiM?17V4JkAj=o3M%`8glg(rB07X8 zSlEx-n5b@Om{JRCof2>nCK=a|I^sS#)BJwi5QkP)6jb*RkCc~FFv+;h{ zw`_m+M(J5+NcX?H^uxE2?sf<1F1M2&cn|4UjsNporCqx`g!`f0JQnvnk7dmFL*1@! zU70zJocH1~91EA_O3GBSqzGFeDQlV2nqb$s<$sr=LjrT=(y=z?>J zmur<%F?R)dyBsNVUf3|?Kms(SocbW4%@fV?6_(o+~}r&$yodZ0Q}oefy>#@@u#9?SJtG_>HefZ~uSNZ#-T4ac`Ed z{u5uV`Z*t)qxL2B{=;W!U+TMrF+2ugIWV?xdA(3&X&gKhUM!$y^w}b7MV2cMdlWx2 zEcx=}aURQ~_V5Dkd*7Dc_FCzSpD1Eoh3g}S0#>P1miAIS9}t+i!I7t|Vwgvo-wlxs zhXs_gR$Ma4215J;kR@e`EH$m$1-z0=FIYofp~y0?6ppI6b<31)rb;$M0xoDD1#VT< zW2i^2UzzOWIGGO52k;4ACWU)4-LCsI4eVXxittNckY4?#(l0+n`uo>OyzE$VU7Xxg z)HcSBv046^pIg4bC;SKfLWkSFy|=i!$Fk$W)%}27TEv`YKin?7e=sMf6ULc)MAmTP zUNd!}fJUyIO`D_}-8S@)Uy!bJP2*u&ArtzpxA^Mt|2E@P{l=`A?IT~9ZLzB9b0v7YjJD%%gfTp`xYEk?DuW2_?B2o=~A zX-K!aOX$HrFJ1lm(w?r^KJqT<_5M&f|6DoICS-A@tx(i%G3m&5$vpTCg5j}jb$&9- zaej_w`bfr;=E=^927~YfTZw~>sryUY5AQOu(Aclb_?VoRd&Fp|*`bGI-(t`ZHg9!% zJCF`t;#uK~eT)2_f0H;N+2q)SmVBtETuFN1BcxyXKhkqvEIr$s=Cl1A>}Q@P-SqpV z&70)gwo2Smf9?~~E1oBP`eRyGa#QQ_KhVyHA1UAJ_E!2DnDlZY&H7ZGpL1!Lu~z^9 z5CBO;K~&!Bv3{KJROys!NPF50zxYY%WzUqp;YSY2H72Ltro|ywthQat!IVO^PwH67 zCmj#bi?t7~+Va$)b={`5<`+Fj`kxO-yZPIDj%PF6 z=q2~)pOIeZXM+#*iG54IP`Qq;a;|kf>H0U8e&k1`XZmXJ7k@)K`X~*XB3F}N`MmUe zzi_$We62a*hGRnkgOD#pTG}8Tc0~5Xtu~&WwCVw`&#RFuMXnO$lK=bSBYsJG z;Lmz&jt5(vzIUcKL;L>kr&VjnW2FdrGNWJ`?lL-t`1K+MS9-L zrTaWY+HttV)z0ju&u?$}4fn0@DE;nVNLM{oc^l1UD);RRz6F2H%e3b24u-ps4$ zkz`nwO!mSA$;k%%cOEI-lw2Hjg;b+f$+ltpej zeM9yrDb_2YYNk~F#4Dvszlar@TnSsjEuk~NCB5#Is>kFp3m@YZPLv+^6zMuQ(3;cn zj(LKwa@a_zgH4rZjBooJiH&j16&+-b`Slo&iAM9!nn}`h+PF!&(e0$i{+e|2ACmU= zC&|A1P3aAPAic+L>UUopifH8aSd+PaL&goLCUCnMld0sqRV=K_$=oIVLki^ir1{+t znLMdZ9c3VMR>9>|DzOkOwTxHP9m>ekM(GB(iCmCh^PAFKOtbO!b3mewObza>&afq~ zEaXaIzc4OyWukp-skl$JrtRpx+!Ce#{w`?Wlw)U}!)4y}|b$rOh+Ck-ThJ0BY#=C?#;F0U#_v|kk9_E^rlxx|MEKNLf_4# z!S!&Z=h4dgbNmyFG*d#gT^rhmcK}#Tr_NKE>%yySu8(hKCfj7!1=0?D#-*Yxkr1~w zx4W0}3$NUUR2$_u2pRv*u|pl}G8`W`gxx%$CR?pJboB9QsOqIu_FljtnuU)EY)^FY z#nOMj*C(XkYVzC<;tKCZw~)5_ZStOCSF&-txNV!nl_7Pp$zJ4Vh#z~uG(9IPMXPQC za%#gF7TFj(S-sTrQ76!g)@=4GvY!nRo7OdNBt7O={dnQ=(iQxuq1#sDXMaa}<*yaJ z)sGp@`QF%z2Est2JO{uGHD;-0d^(71xT|cCR`;9_dF#Ayh;34bdFr#f65egqnP*wo zzNxQjZmnFP=btS;WP4#g&cu%EM8`hHR?@*%qN1a&FdMs)-~Pk0wchQOs@;=qBr*Ei{k2$(I)6|5mAO70tH4Wm^&dkIPT{jrvXf9CiFZ<<*$wC11RL;gh6yyeV`Z z>ohm7(i~@7=y)@y@7`qWv-N<@9nJfOI6Gl|QdtxxXFOt9mIi!_%g(oHYtaw;;XluC z@UaDEibiTtU7vVV3p#|oahRMsU$z)AKyleUL!|jeY-V&Zxx0-F+Y_DXXIOcK;yQ?9 zg&lp2wA0UGXXAG7lK8SUU&;BxC#5(3vGlA*NSkLltyyefNH~TnQV`?i%PJ93#d!nxje?9aQej##2 ze~5tDv}$Ile#ztZJAP~bfq(UfhOf@6b3alJ&QC+nd8t7DtL9|^tfd6Q z6JWt}AkQw#O*EW3h-w0>QZ3W&!WjS-idq-I{1Hp7AJx3_!W33w!dWE6$C|5xxkXXh zMFKb7`9Yd`qj&5Tqxs+;_B6L2H9#@cYg6+~$!=kiF{1KBNL_@9E=8n8wN&z>uAoal z(J#m?(`Whv&psPlOU@J1Cns@iXuB_z{^xztKm3(9gFo`7_gm8M{=D?;$4am8o6~pv zt@4Y*>F>5X=S9qkes*@+Eu|m)G3maK_tlfHoPOb@5_AV+e0hD3ed_h$WSQgOn36Xg z(}5snbB;TLab)U1tyEO8lK!r_!t+<=%*@|m zjgDw)@;sl+Xn3|OUOdqOlo1t|b{rA9@f{Kxic_vBVV9F5EXP2yq)e_a>sBHmQZ11n zw6K-B0-(4srEHPBaZ}M@JCQCM%EeF9<9=E8p@Hs^_|Ks>ZjgBS0kJ85^1r+hdQ#Zz#d``W7(S!WK@Q7db74Hv8 z{n1SKS&j4T^e>)U^cT-7`r^lxD=D%>o{&gB)_{BB;1dc*q@fn}%ab5^g~Dt?NODZ& zBR9=iTAH)t86A$V-s<#?FpJ@7RZ=gRUPvv4u61K?iZjo=xIK%g(aq6}xZ>JMlfxV` z%iM99$D+AkjY6vMHwQZovl~;~wa+!1~vMK8~&o>sZPL{75VDSA z!hKBK7Jv6!(#QO4^p(D?f7Sz~e|wX}Z>-0Cg6zd3OTCKd(MeRG0cI41;$yl_~wiOm$Z`%!_BPoK?3S48RFX@F*9As^e8&Pem~qyfxvet0OtO2DJ#D@6GghSzUXMk4P5h5< ze3_ct;v5E7w&Mutc)uiB>t-<92*drQPk7_;73F*WPWsmW&U&n(yY1|Q&B?8E9LNx| zO>4^h9mg+xtp07mS3O($18-9AezP~inX5rIcz%n1LvMulf3jbiJWJw>)_eQe-MAC{ z1dmPj`F@$im#r_lz#VrU=D~9I9X z#)?HYIP+ogST^dt5Fso=W{#{9xOKA~Jin}<0qIgJ+;%-llpA5na%%WmyL7$pmrnF8 zAumfheeKiIJO4)Fs>e01JAd(`(qH|C^fGTSFZ(&^Exz?U@2tI7GxV8busb?rG4ohX zV5ac-FE*$5{iF28-ApWJ{kR_m+{7>E_WCw_ zR0&^A;>zAT21aEk|T1#XE z%cVxt#SdN7tfSU`IvZkvDjp~@4B zlMK4pFBksbpGa@^ZS#6IMQ)Kl^?q-Lzb<{)&m8#$%!Ox5pYW~sx4)vjr!wP$4jJay z%vQ{NZRYd78hqm)NH2ee^jbgj6K{APEh{vYmVqqo1W^zdKy8*#rh;Wn8M&=o6R z16zNe*^h$iWxJt`Q{!$6g5>NDVvc8CFyz6!jxo{Yp z9BnIGkW-jS(@K-=Z7~{J{UuJW0kY?%o%6WduRIhu9q1f+4a8N__xVbZ&5&w(hnN5W z5CBO;K~!63t`yJxjyIO)O0WDS`7P<*E8%MCt$!%J^e3f{cr)DPTT|*`)p85I)<+B3 z2l{UcHw)#lS)R@3coX^$-;zK7r=%D8D(`K7DSi6C-QRC&#XmX572%Kg+432$^hWqN z=^8hb4)f!I`r$ZR`|A3C`S^bALDK79RK%kJeyTY3&OVO-bgv#S6CYF_3`nsK$FXzd zS;B^I$HQ^RgzmR=-qim2Po-bEhx7)&Xy8`(EWe;Q+neRtXL{rLhV;qzO0V(l@h^Bo{c~TP zee(-$)h`%&9mkv~-Pw;W4nM~DUh=rl%VZxb-w$LH{D^OX|L9rLGw(0`sh;e+9iR9x|DzAb*D^fYhS_i$hM55f35j(s}EF)PY$o3G?>#reV~7X9WUrO$q( z=)&{u%_23+H31*UL4%CI5q0W196zYb@DXMG#L06E@4mgb9${uSTg5?pDe!67yP_xh+RS8;rQwI^-1{`BtYezks=aD$JJD@8Un{!4&weAZV( zejfKrca)y-gVM9_E&YZ!$un+S`QN?3FHXD>;!hkg8{CPLt|2|xo8|TIU}dd&d@Ppv z9W;NOmS=nKf1C8%zQuj9pH05^trDByO4Z`aS7o>re$Z2;C%;trJ;J=2UnyYESUJld z0B?Gk^jqEt-}%Og&AAtT70EiX1P90Qi(~qF~N=`yi*K2{4EW zfMbJ0$n#0_ydiq#oQD(Ib1oJM3xI_tC+udxqChu&=$+oyc59Dm+hNi@9t#z1+uDo7!Hf>aWuIRC)K4`bE{Lb_n<1c?i`d>evJKI-_#Td4v=DWimJU91-`N-duZgLl` zJ+))t=W=Xn+jdCXeM`IJD1Y#nzWybNUw^Dt;SPT|@sjAy{_uP7FV;84H@lPTaDP^d z*#o}Y&n7Rt@Iqbq)i0?0-#?PR;r8>6h4n#TTL)ew&aLx_Q+PHEAx)@ZJ>CW*F3A%K zE$0uvT$_owu+LPT){PE1`(p>-?B#}v8Kq*#k#62l8kX$?=XHS672 z`R6z}Kcl^-t=<&x^2pFb&IlcMa@ORST1UO&?3m$fvDr`|R0!F9aYwwlN}D$)aH$vc zHpzX0XO}KvFE(wFPP@JI5Wf_;^P?m-Hl73KX6JU0A+7=;WWK}=N8jT38~mU*RbLf8 z;Mb(9-*jyq^2Vd@`1X72Ht8^LYKI-A+z7XOBipiF+OSDtU(gB(8$Z>&(}Ugbr%U&L zQoS3vhMx~kf0=rP;FY1i5uShk`C>!dr6rZ+FI~dX9+VvTP*`J}%$z%J?rdNt+Z)_8 z>|K^whgk=5MnrxnvDQ)@7x*|B|46)KA5zSsqAAX2F~1vP@uKR}2k%tpv6w-1ON^ZM z;xZEFISvogt?V`P_v*NPezc!EUG4g~hwG84a%vYt1_CMQXS*HiL{;gsu2_w>f{^fyZPIYYYg_o-enwktsDXCq`2^_6X|+vEP8a%3HoqJG`#+Rk_(bWi{*ScXn;{z@8#Db-*m0H2 z)g!+qd6aMSALIGFt6!Gz^FeO?Gj^4@J-}T2u>tmtkc|=d@D*z;ZBXk@?G$AU2rIY_ zzcOJ7OVK=}KFJL-0}W5Gl6qOB)GH53|NLs{o4%E^xYx|jvTk@g>B)Z}-RkaAzlvZ+;z1 zMdrVAJs*F+@(PjL_TfNgI**N)Ki9mm#O?62-yl8WnG$n(>=h+8(wUI8s(m9o_uO;y zig4HnJ@s3B)w^xmcEu*oGb?UVY1N_u;f{ypPQ@D^vZ2h#VIP^`A=yLLl&R||$XMO} zl)d8BW2O4b;H{L3<~l9S?a^_?F`4Xon4Cz;X%%b31(_+1hIX#}((UVCsQT6qw>8jl zeu?l?zAAb6vm_q=^VTsNqG30~SrV=XV&&3DtImmJ9}e3g@xb5UWty``?sM|ilSzLY za0%H?Z*wS}hlwt((!lN-<{LXwNL$irA@v`+E(vY7Z8+bg*>f0QI9zXRW-*i;}fqDpEJ` z(3qK*lVO*cdD#B}U&XxtAGNMuSFj1*(a)Zq_9wpO^Yg{4exJ{Ttu$6@ljHW-6|=Qo zggE*6rNZa@ru%z-!N7*ltp}RZ%j{BdOORRDFO3s{W992NU-8DrtuJqY|Mm6Kn|$T{ zXU~y%6Z`_-3jej=Kx6yXSCm(ZbaOT0XLS4zhNs@Z8}D5u{?g1(_*vvnJy*J;H&osn z%U@$z`2j;}|a@lFb_lTgKrW%r<% zGJ~5^b^*@Xg{*q_tZ~Sl@S&Ez?(j|7^`y;?$kQ7 zOMZ~dglm#=VW8qPvY|qT&itD67H@2P4F`9;*GgQ4+|SR6qy*DIel{GRjC6@Z0VWw~D=n1Hr?UCb>V!n{KxJWJ_@U z1!Ku`TK?}9{#GJCi~GmFlwSAZdd&PZ?k{}&{7mkz{Z^S<;*Y*tVgn?0Z!K=vr2K0# zH}%`#yFW&Hz|Tt$`UP{($L)U1b8&5n#~gdBXD@a(!iz4tNNj=-G8kbIq47qD3_cK7 zh&&#d9#jwd;DOv{z#uAQaac3RozjNC1!vY$`e8?h3p!FADR8-4FbW^iRG$IoXSTR${YY1NqRuOJDKT z6kqVI@t2@<)Ab~B9mr-=ddI-mNWOi{=Xjs@)h@rpc$=Tg@)NjM{E}aK_&EOH4C&9F zExp!Pe1HE((!cz*#FZachkQAnTi~^9fOKcm7KvwpcX_y;P*ona&>l3dkMXs7ig%TnL zsxqb0OKV8g8^VboiHXCTHfQ5%ca`FGE}`vWyVVW?YZ~8 zReH5=vG(=qY>S^woqP@H_V<&X@#oSn{blF}?iJ!$S!*g8J>WT)8%~{q-_5c?ay9kE zPe|NOztb-wxN>~?)1}|~3F#N^=I3cX@n7OAA^s=;|B=zV{c?h<%K!BhC%*vUc9i<| zM6n0s*hXF4+J5be62Iv9pr7Bp{cj{*X0XA%*jHk|_T$o1@8W*>wv-ngJoDqPNB^@o zJsw36$A6H-_we{rTIZjmz25$gyT=vQiC2?&!~c`NB|XPu@_0YLy~`t|>)+ZhZ%&o? z#SebtxP6q_@VElx+2DESohNRQxf%rTRc_d@LEIK^-MTfe4kN~crs=f7SFyPv_Qi&I zkb7VS&?Z!|i9323FBwcTRA%(9QfqN+5g&eN)neU37z|r6R&H><^Zagz;fZ5H&4xP% zm~@?6NKf#C{O7+- zdX%qbuID$Y{JALJ!g2!d=|rM6HfAbzwt2Xw;m(?&QI5?wLf~6^tG=@JC2{w;a89jKf!dO z$!}fHy-<3RZ$qi;DQtH4m!9{N5?8L==JIuyfB!p)|NMwQl6uZr68+=$m_KsL?{nEq zCs!XF&FaKe)RyhaU+yqIS3gbqL2s~+@tFPEYyH9E7b5rf8|xd~M*07f@cfpTy^Y`M zElye3?6~^lc9@M2&L%i^iU@7+M#v_}3lpvgwU)#@=Svk=;1!lDjX2gFI*T@phQZ>E z$t-gjmDNY-Ra_$B8Y!oyzL`;HSR+?nY%-;9C;|_3$(ji>n4BsPOLLy*cSEcbSEtZ( zofBL&TYN?aZwWmA$;^#r#s_~dhm1)ui=q$s1B!@xI#1f4i4BjdKW>G&5`?%iWOE$16A@zb8($HQ?R%9sY>@H_(Vkw8-rI`8 z|ExMAg}GOujjT~Nx(aCGs){ zduM&y_&Xk zDo?O8izUf(+6>do6Q6c`yCo;TD~;REEgx^4U;BLNPoGu9bG>HWFN_U?jqh4Fk+?#- ztDlK+RrFxLPBEW?h{vg90$Mt;Ae36^NW;6 z{;H3`^iXel4}6NmvEB2r5_bMym22Nr`G%O^9q+detzHpVgKU5hn;^HyWre9{Biy`s zv)BaT`@9j3yRv1g#7_$=#^Qv~;9hKqE0S%_xn|Rjl7b7zqISv+%$O~cJl1jS7VxGg zbK$H>L)~#+`8;okIg`^9H$VswW_Ty`6$tYP=7iy|DF6H4O26rs2XA<>bnf>?4*OB$ zR+8`0opg1HH`e@$;tuzd?)5n7VZKs*!tG%l3Wm7`J#l<2?FA>5A^lsW+6UpH2IRecS(IzLkCCuSidNiS$fA0-#Sn=W%(| zulcI)$VM9W%<11BXpJ zzhyK&Axx2|Fqg40GE~;%Su_d^)~Kh>PCx#X#mhj8_lsj(ri(h!<^G+|ZvR`pz#=W* z9^4X*v201!i>gLdfm}d|Mgy%M5oT?-7LxXdI)406HA8J$r6<)bP>+&-p|R<8gG}!! z@*24`AGP8X#o=eqJM4f@5lnSjbQoh&Ky68N+EwPsCQs3&&V_1yziqW#P<9%N(4OA+aQ^q%AX&5LE_-zME(&-{aR7(3maPX!#%YMfY zKMG$L|E&Lj%ZzeWnr4&i1ONBwZr=S$Js4L#pEEFEbI?cET&8+SZ~N3ULi;skm@WB@ zrt0bY8G1v@GC*;^m4W7Yu{GR#qcN26ZsoA^Zf*(gT^wA!SOr;wpWS1F@^m`(*qDtc zak5&jQ?~M*ERxS~?BW!u2bl~e31ld^ira0h>s{vE^z_P3NBmh__NViMn`lQ4Dlw7O z4V_K8gTPr@`4qDIsgc$u3VP|Q2Xf07InCkv^XYkD&5v9r;`ABtzV`0}_5-><tjc?bTxq z^`1ykK_BAGaig)71_+0RjM(xi!)B>o@$5l+#hwMhx$Do!4RaY@Haux%Jn(@BJoxbiH8?@KQ?PCj&CtWny4kM#G5n*nt=r$I# zzkVD=k|Yk(z&IawA(2egAXlvPcYyL;j=`;7b7%zyzL1-CGpU!#lOr0~)>NhE$oFm& z4s6;G1BVJdxZR|CS2aG zz*b&9a^5&7vtzB{4xXf*yDG6@9}G>&fO+3)pfDN&=%L2KgG6g^#9G0yf!l zdnU;z8xeV5M$?S-+P{01nWDT1sdbI@B$`Ikw;7ILA|R0yXNy53%HZH<#3N>~%=7h* z>QDyP)Csq8Sd9u2bm0a*4Qc%OS7>0{AvOB2Ps$-zY?Erc;Pf=~8vNoT_}yz!-OI+K za5#rw{`u@hmhnycD9eXFYr;j8zkgKt4`CL1^0V;|*N#4IPgkD~+-9|-Unf6KEGwp9 zOBmAW-loz43Vxs-dpVsm*r*^)HUkx(&XvUlN8J$WE8^xL=lEPG|EzC8>)bBrshEz0 zT*OPTqV7k%ADJiOLIS}K1P@RRUYIYTHTwrHel>;X#Umsy!gM+fThuqVF?-d=eiY0U zd{#Ijd6#m(tCaD%{&BSD&GGX05AFIL?2+~>qjSeIN{nSRKissjL%(-dwN5|iBJIs& z<%FzFx2N5Xx*g?+VgL=Hl2UoOBF<{{Zxz=kAMT(#-$o}XBJ&X*+4(rPO zY$ngX^c~r@FcA4~y1jwoF~f3GNvNLxVol>{UX^l9n6Ov=Nd`&A7G1USc~r53%`d%U zXX~KOTje9Y_f?ydoL$oj@XVLTp=ryUvy`ts+bOE=R9R0+%jHK;1O`7xS-j|&adjHp z(~S2s^(f@$MO@p3+GWegijN^{kNGr3m1pfnN8oMvNVN_Au|?-mp7#H-mosno$z;{Z zc1}eEcOey1Y=9L3`kPXFQ_7{08=?;|zvr~qMorOkpS#bk;Tk!=#cSk3Y(a~OA*dMT ziGBV=4h0`5L@x9QAw!x&3i72F`W$H|LcX*`kFX8BSltdDl@f)4jwz)?7>PwFt08o{ z7zh$pvobv^+h}rGC_7th^~iXy{CkoqFu}*_Qu%P6mB#AT@UHXo{qOP2pBBXlR@Mc> zkVW#* z6TwTcS8x0@PI}34qv`j_{%F(>H*n2{ ze>0b?I6onW=8#aSh9B@S8Et>i-q|}8Zp9%qdVQ+faP2t_J281ByyO?OxQ`Wp?AS)l zcw4h!dExXKJ2l;~x)0MEN@cu)Gshu8T9Cmq#%N1AGWT_fHmBcV?T}L$tP}HBDF8KO&;Mf!t(>;RZWo zKuk5JPwvvUC@S@CnS9^8Xyf(#dvkexNvfZcmrhZ9MEIH}p1`^P1L8B=z{EZA6Qx(r zi_J5AmG}GuiI0@v%Zs+j#yj_hMO+w0&gjcIm`ubV~-nIho zD~h_oQ2PjiWd}c6$j}17q9%i1Q^5!(_u*CE>bW%}w?jOE^WM6RA{p0lDGp2Lxo)Ag zMzZ<_nt48MZf;q6BlG9)8t}yl9O#=uJAU^elpv>aB2jx!-se7|b8G!|nnFB8GL%F%yorDNW^B!>{5CEl=) z>Z7_ZIwtR1aAV&8sK*{T{XBtXLrRtCf36Hii!t>$+zoaozw=`J7SB;y@N1|?{^!TK5}gO9v?VqAGo3qL0W?hw zdJ}qex_lhGp+B&`U(&u*lgkgN!a?>I()FK^QUeUMK^Y9%27!6=#s`2u%F{~|98NoMmNa&A=D6kic*Ip6tf zN&Z>CZSNSH*gW%^*i1n_-m9m*J))+*rEsRVzyBHYKEoXo@DaT!;(${^{_U)}Kulqm zC^$&u5X#tk8-H1tGD|;Re`Sc_Ju=D&DgV;%%3-+0|Gb$n>b8xWD)>GOiR(TXsdNDu zgRXUZDt@03BB>)w*C2Nu^eb-ax69q>7GCENMed3~(+)(j+0KT0~JtPF1l@*uN z#gki?a|S~sq_!>&F365>1Ub`>ZtMB)1E;<3Yp2kHhWFNQCJ%x~nCmO=arFytPPIPQ zv^qU}tP?9_Gc;HRvzC<#0Q%XhZdrm2+fuj2N@p$rlIKFd2fd4y9Ha!P5YB-Ia1(+6)aXs zXv$9$zBrM0U9*b0a6WtrA>KsWW!hERwJi&{_Jbp4y4(yv4c@(^LvtXY2?n4&osBq8 zXy28bll&8|Re%3p>+_T{O6;vk?0Vr@{^a2!C;09Wm%XPdp2>CtJ}}k--4O@vh?J4mWKJ6}_;t-NjWzalSf4So3@aN%Doh z%LXHmUoz}mrqF1;1mGVU{G6kjWs_xjU#+C7?EBdfFHG!sWSJ$enK>ZEkRwr)I&H?3 zFSbGE>`A)M^S~}ED!Y1SNNyO3oTun~HI1i!MY*MB#c6AuQRHbz=xil*qW(emN$0%c))MhC`Gw7P5XyzqrLpPUCwpnZGb@ZK!d!OJwz3{ApQY=k+-^hy z_06O(+VLceJwg)gMSK9GYae;Fq*xgbR~TjG?Y1n=ghpOzFI)jZ{JUx??mJ4Y$9WJp ziLH$Qr36tL)CAxhW#WJL0%9WZ8G_3yT+qp;+-@z^ormUX=fZ5a!s>UR z?ErZk1k=4mnCYa$Tp%UkQ|OjHrB4lk-DE++dk2hL)2_`iwrbJ97i(z{u;Auh!6O6jnnmxc7JyT(%J2bzAoV{3M}t zRceels5+(n{t@v-RME(AI0}xx3Y4&CyryqU#DWRP>>woMW*QBVU2(=KD=|+KIRwh@WJs5&<{(jW4Pl1<*p#SK+M*+`5V@w z2A)fl_?T^vmSg`W_1HYFE@r<@G+!-@ln6Q?DOK9(1&@8jg`tRbi#n`I@x0e#T5hJt zI_v%cA_Q@sZH32`0oJpqGR(eqfl!)Ttta5NTQsa7&Vm(o|6Z$r_K&Rk9rGi0u{y1g zX4Ir`#vGdsam#Gz_UHm+)hT)$lM?^Vvt{Fp@;#FCKAb>$sXXm$7~j)xnD^@e4JtzP z<824Ef2W~qR~;MzUkTi2w}u(uA9^+{?tfLXc?{(+wK}7YK5ZXTgHlyk?*imdkq~YUJohNfzzdN4V)h*@>1O?x|z7RiW0e z11+3SfLyZbDNH7_@1+xXG0cRGvGE;U>s#tf_B8S9ut(E=eS1?GO=9=JIpQV=xZg+5 ze>Y6-aXSW1FHSi7H(tw42#FtN^Ms`l!uOWY(*?v)B6+-f;voGY3#!719z&CSC{SNB z0Klt&3X?KY5J9TP5olh)i~skYjFv`!mguW2$0EyOvNng_QR@0DdQs8hTj#{6O3=DxLa z=(G@=j7)}%>b~RGhEyPO!Y0x`No?hvf4SR))r(|a%vkh`X%krgP4dXu4BCd%5xniZ zUl{Aq>!f^dP)}<=v^*8@WGUMdxPq_lFy^l=En_`RpN_M3Dqoh~FQ^2nME{#@R*di{ z`t@Zkd&;TA|K5v~AtDq*Z(b=-E#e0P2392=eLLb6HkbVjF5s_gD@QoNfOs;)U7`fm zW{zGa2Fp>FdaeMOHL*jjlh%giDV8`r994?|G{;bW`GAe*A6QzMt9)KZyK6vP!wz(u zC>_oZ+2$poETnFrEPSVvO%9QL9gd{fw$2n0wDS zM^B6>md@%`P*?C*mp_eY`-p!CTPRvof;!-H9@ih8wFiJ&pj@)00KaTBz(N@JC-0{C zL(+bsBd%K)cerg^Z0Ad<49Usu+SI-v2J7m=+3jR3>?nCWIIS4!6uigSa2m}o>OYDv zchyilg$%c#w@{}SCtr)0%a`=(5%>lt(A>=K`(V8~H?=vExlY3aP}^_z0vbgbvZ^3x zd&mV_a)0-V8K5q3*^i13;{S)Hwc{UU~5+w zSdwv2kqyvGk7q|Y^xW)*+IClsTI%0VIv9d zi1HPM&1{}hCD)dG-;HIF8TN)b&^3hqcAS{Y5_0s{dx&PNVV4QL&5+zn&fGYxH*o~X z>V4s@4Eu!`)Y+v#Mdtw=BIal%pn;lmj&9}50GV#Y9@A6@@bAQbEQygy zJCjk{To5c9{6R=-CMz+A83#y3e{T?$%H80qGoPlAQZE znW^+x+gT*kM2@{zI#59XeKo}hi~0Ady3_gDUn>Nb`_B`O&9Qm%a=a}hp>}TA?mZXK z&7LcS0OzB|$KKBuFXl7U1G}a^PBdM5_`tKA=j$QU@wYrLT!t7O3Do{EmUDV)4i%A+ z%vF#pFu|?LyrO-?bSut;syw=X@@}ik_w0H3!7nvKqE+;l=IA1!*7fFWiE$|eT4Eapz`vhr z90sGZIvh0k0tr#-F3o5C`Em8TN!j7;HM}e$2i_o3w$ArhO3^6ffeAC>r$Up9#{(0R z_t%{_7DF!3y^Gz3igJfAfZhT8^Ghi+* z)XwLYPQ-^{irKRg>b3QERujQTB9jaE#nTAIuAJzj<~HodS3{Ev&#d|9l`(-!hMDCY z&*W8NFYplfp{Uk@-~`4Fujt1}M5m+8{?XamN>aM*swv^)(%^PkaAH^1H)4F_eQHp> z_^UeO+eOtl@Bmk`t#8?W3r@N&+xUA1@&bYJ5qpKc2jDOk>f!a2Vr>02++^d;Bfb5V z(ixGkUmvnwsUFYRiZY9D#WB$NRuMk-?cSG$ZJB{u~N4psfy-3vdOCL0b;mDQru3~I2BHrW{!{o)~j zpD6%NgLq>scgX9jt~YlZ-&J82fR@TgLK8smj!3*l&sY!v!)eo^^IotN1!+vt9i?b8 zdZ)m%Lwv1+wt`gda-1W! zchk9Fyu8X!iDT`^Kc059iKIuH!fxqJ zBaHyNzLPI)fOS`sYg;TMRz_W(Z$ONi)C5v`>!CM3Bpyx|;hm5|JAjOkd*t^FoQX&% z8e*MLSLyT#Rtk_Dz=OL)Qhe}v3CU+0GMVG;;-E!Ly+OknH*Dq&y4QW4*l^NvA~+5h z1z9ideT4T5XAeSb94HyIIKP&n4f?FL8uC0rcgV$!6l>^VqW?n0Vbh2h&;*q8WP{g` zKl#EIQXpOi`;iavrSk6ggv4cuxGwbu5kDj#5=pT)i8p$i|Fexm=K139(eGPB4jV>3 zq!B6tvY>PAFJbyBK=hmW$D)jg%qL0ej0wprq#e8+jmup+73qiy4?}xKAXiY;6u#g# z7ADK!X((i0NOZ)aH7Nw!HzG~nn3vp8BjQmahppa01+uF$vb?68U7##@#9%QZ7Tmz1 z{#K#wM2k8Ii~9ddBqJul*idiLjjR?teH4o9JN`oE$m0x&LEPM2B>4?4 z%e8(v<0w#y{za4*JnhPCtKx-J*mXV{kAsm#1BgSBdWS{wD6Dg?o`9_9IBd#CTL1dh zb|MbJBl61)d}8IdQOsDq)x{A)0%D~f$Q<@Z4!9v673w&)$hJ;Unm|Q5hj!P67&qMn%l+8L+EIwQe0}OV4E~L6LUM}-^k8~=+SVC zwm}r*BezB*Ahi1BBfXdGN{x-x8KY*R&i+j1-;Xob{Te_73Y(Tn6K&D7ipe8{?P!jE zSxF1fpJY0I4!&n!irM2nczwAWQB%SQ+WOM~B{3^TBhsbQp(Ls}{H2pH@o0HSgCd`^ z2+pX?vb&K!$2*}&?)*|$k|F*R^&{{ZP2Ar}=LyHUc9+F-iLXM4)UKe=l!);clsXFS zRI+mQf<~EW6Oe!K*Zhz=g+FyAgewG*pNdTMLvd;x1w)KEWr>08A^n7z zI~Pp^2yQb@e^-)-C$?>xuBy2=QmUZ#A^PN!+NQ6WRnU1)qUqKpOO}nfRGlDf3aF5(r@!X{F zdT89nTfZXpJ=L3y$1eRnzl}sZ!A_TDb18AK{CcLsl$tDPkw{TO^-JmsKj^`q2mm9 z9GHOE1J7Ms(2G+0zMw`@`{AAyyl#dK_c_*6iSq}cUDGqja%}Br+}`>t$PDaU4^;?- zp-{xyz6-U>J{!J0Q$txiX2f*y%p?DV(3DSW6gA>8=l0hVE%{rFw-TI(V% z^|k~86|Lj&F*|yzyXzI47MCdOoiy_{l-kfSWPy9_JPFel|;U|W=kh}dcyY3pUdE~cozqI{D{iY;G)U`VR zsQ)b;NXIC7TTQ#qP`SVYzL`;j7VQRT{nG0V&YfuKvv62Av@njviyJj8Mk0{If)PO_ zFpz8#pyWWz(1hZC{>54Iks*l+yVhQO$%;s2y%wO3NgE}ZP8{*_vQw+Q5skd{_bH0K z9|xW*;BP(gMmBPy;$u9*Yb?YH|?Rs z|GO7p-RmgkiX=*3I8>A+r6%{V4TU6P2C)%JnlxjKyK3k~h1?@{;BL2GUjI8%xpHQn zHq+x6d?@Z~H8*4Zdj1EiAI8;=-r_2`gQZh9z@J=@5RO}@|3kNH^AN&F+EIv3=%N^H zszfI2K%|Eh(tSeMkrl>U3IbXJg*Xy$M0pi3EDp3m&nXK~$xau~0<>!bcmi8+sIo>f zY>dAK!uZgzl(l|fJFe&dA;i=z@K-)?SB9aF*l_1(xn{Xn-w_&3vJ3N{HC-LtDug&p z;yUh20>M=cCF};pR~hpTb=nrmHayqgwIxaYN`MyE&9mAS_MV7Plo%mI+3C-;liRM6 z4AbqBWT0KCPJc)7aDBsV0;BQgJF87UQZU&@?NlrYDdP*#X2- zwzxE;-Y{cur`&`)61v%gkw4$%AG$jiyEu+Nh)~OpML*8VUJ?h0Co0!G8eZF4S>-PN zyO!mh#%mo2!u=9xSI{fT_l*;9OyN=E4EhE{4#6Yc&@Z?6fD^vKoU70PPWl;sKE#*` zzrmykD4P}wR@sT5rjzY%r*mocDaa-|56-!2`;*j#~@N^lUj^P7;lTV~oOU@^>}NtcgR&=O(&`RR~^JkF%KXZpYJ# zzD6V4}rT6a|J zuNj`o#fB3+##Wt9I@wPo-6Y7LC-;V+5;WY*JTWesRtd+(QehW`_&L3e5#s$BSZ47T z4|6pvysX^`oV*zp*16J=!ofRt@R{W<)s&5i#NZ;Te1U+Bq~Zd6 z;&_0vzRP)i{N!8^!sf=C9%fzRC%x>>j+l`Nv$`V37x|SLf~xp%)F^`?CDJX(y2kf_ z|AkcxKp;k+!xYM;4ZwFR{(A6vyJdUJr8=5w5IQ_on0Nx&=P2h|)0DrTAoA?fB5v7G1X!{=1X|p|-QX5AEA=#p+o^GfvJ4mb^hF z6(KSXfOrex;ba*_9+it4mZ{INV&96=buW|>k~_5vlZ*(Fzh3l6HRkH4v+3{5(Jc-p zS?^G0@Tmtzz}+#GL=+f+y8nJ!N-ZLc7%7BIkQ3C341kwQ4j29*U^$|ZBC3^HaBT>q zbt^kiu49*m7)80X1Ngh8*Y9f%jKxup$W{R0lNm=8Q4>j*1D4XA+{qOzY}jK8yuh`T zAueV)Xa4aX@*-(y4&5>TD8LbiZq1N`c#~_a0~>RLF4s3LB;XpHc?*DpNgCM8x$!}dQ5T7UrYM!yV1;<~zb^EUZ)!MJdg=kce!I*~7f(X?d&ed zfr`GieVu*MJ&8DiHr*E>(yBJIVkBUSyoHy44aWQCFZz zbQ2mxJ`$tDGi?|(siB?1vLGwI$o7{7V-}6jei57ZS(cH+uC?bUH<~3GTuDye9(AGC zWGxPUj?z&=W$0P?^9Y zf2rvE;*t8!h6CuUFi+!Kj3&02K2^pQql}8jPkzWok_i>XN_V{}tC-s&A;?59`Wn$x z_1CePhIZqr3`p?QDt0O<`w{cluZT)0t{AzzOgs7q#M{Hp=P;nT)f-%V0>-9t$Fv=; z-7ddfY&18ZNJRtV!x15TxLsN?!VxQZNue2Ile}c5i+YbaPn(U#GNq@#!{cGl8~98wo5fM0*JAYS*cBe68wp?5c9SgRaYD9N0 z`R^7?#SClV$?;Lu{&K7@T*yk?#IgQ}7M~ZSj_jE0sDhQ#k?cO>l@NYTEw&$)8`+y+ zt{FHu2DHge%Osy)=ivenHplroN6ijbDcx8(BO)};gFnUMha}ssQJ`3H0}@A^rI*$0 zaT7QVS^zk)e-GrwjLp7zaamjsA4XYu!tBfV&U}YGiYF*$#Y3kogcr>?!4AsPt+3!O zG#6CtlmuU1v>p7Z^W;nsj|kdD*1$_F!t>209q%hL)^R9}NLkm;y~vpuYPHjW3x+=*N2L~qA_Ia8+ovw{)b>^B${1ql~Q{FTOfj1Dx7-iW6| zhF8|XSGMUsSmK{*a-OuJ5Cu|JK7`*+7!z3HtGY~z`T^?p%eH%zAly%~*=1Loq`(bq z5w)(9)XDp)H^okFC1OM)iu!?RAx1BwVFFs}7Dv+XY6Vo@m);k2zHBbJ7=jaA&tsUJ zIdD5oHJOYbf)rsXKP=j4$?EN7VZUonJ^!N>X@$Xb4xAK6A!3m3Pwwg=QgLx6!{jfi zDwO0?VRI8Yj*lQxlG_~|@`LWdA@RN%Ag~L0Ahj74t^{mPZ3%(wQSmLB)Iw3;hv{yD z$%)Z0o$<_QV46!LNFJ~U0AZ-SeEe$77R=sKz`YpP&r2*9m+s~u0R{)CRYp?WMi>=C zUCOOcG6631E51m|LBRG^3~BVLFCmBp1tWBM7ef#5h)*)8)LSp&8TE4)F90R9ThA~= zfk6hY!+9pXbM1Vlb#AFW4D5KD=fjlIZ0`^^4<80Cy0)e3yrJV`lux0)9r#t)`|H0F z=!i%%G`!opT}4W9u^OFGE3nc1;07mck7sPQXDuE{jR#!O3pT5ILlq)>wANe0pv;rV zN^sgVBkB2XsgN z2vUj`sI_k^qmx1rnhYLs7zXQE0}tFalSS|Hh-o6yP6SoY#5NN{oiMQD>-|&{SK!KZ zUf?5K5a0h*tw2xJ_uPYaNG72=lt=EHH561QQ13KdUU6{q7*K=NbiZ`964*(18%3Tn zC0B&Gj0cZ5S(Ok-da=c1S4<6E_&c(H{)5?@IbUZa--g)GEQK|Dc_r7xju=QPxm!Rd zFc8cdVLC!&1E@fe5)*~PlbT>F`fS`i1>W=NKK|ouM{yK?Op(oSw;ob#6xnaq`)Hfa zZJ68t=!HdOCEUFgVr_CI7ymnw7HE`TX}14d36yKes7OMi;MIy)?=z$7UCq@YnxH{P z{?bQ5@C#<=vxO_;j(eKV_;NkxBCfy-Vh0w`tE=6t6}r4CHa zs89PkxlEAq86FprfH6G+Z7jkU0rX9z!2NL*&ov!SdykgoC5IH6hY5M+)?#v^=rAx;|jnp zeF%-$^I%gFxNVU(<8=r)w8Gt^SA*YrQ^pwcCy(*hg7v9 z7Z|9fHmL+LP926aTj{wM)>qv> zm<{o6S}|5?>V1jrGBJzks+xNbDlLxUE>2Uf)mxbgLiVP5IYFHgvXuTjg!E+Dd2=Fdi%+`H~?s#Jn+6@gxCko$QqJi4b5{8aY=s@CbSI<6|<06=D zGF22zcNtX&3?4=oF&G6-a=Yjqig&}{^xV;jH0o%sI|YtNz;d{;%=*Vvl*h?`ishQ( zA=#18;ms4mP+tsd~~3yM_m zGp+la=V0Q^f`+TXSJ4c==4|Y?fX?s*e{pw62~nV>L4pI_e?|WLg=(L!fnLqUO{3@W zOpVJ%1;}rZre7UAD#SHQr}atwt~PcdbtR-et?qg&X}3=pjs@NM5#!T^JtVvp>75ww zaKsPRwY8>arYGn@+pY><0s|Ic_E)H&@L|s*w$spFQrO%OXz__G;E|ml`D8PyKAmfm zax#iyR+aFgN^BA>>+GgcVj=-DZxO!EIO93ddYy8ZXiH+g_uh!O6se=#Pa7+=@qqJh zj4ER^IeBvGtGt9P!LaQ9A<-Hbe!yNu>MWeUJnRuKw_Nt+dRr$vP+xMP9nYa@P%Av8 zAaIL4LXlc!_w3PHyu`GR*-hNlZ^uC{n&Dg<&MxQP#wcRL_=4}Qy*n4I9^ICw%k_d5 zW1XU}8TH8TjRhS<`l8jsM!yJFt3syXAgi#@n&l0LtVP&wMO=rD#BizBVa`NqH-FdO zU00C%jUvPyRa96t10zqXo>L8xy6wYMIvW&Bq3WQ(rL@he1TqMSPv51*gny6}0>r-B zh6;Tm%X&%paz809w_~1Q_1OuV7P~)G2-lTQn*rSd$NRg5vuihV5HczxDK^uBrKZWl zM8;FdsCCDh^|Ri5>y>0#`{CUE<<3QnOMk_9ID-NH> z>WkYDYtQ^$#6U}bl7T4I$AQfuSw6P@D0dJ#BFp`j-w5C1&Oc`7{1f6dSzSLnU#ln1 zD?7!fP2t7x6{#l@=#W=^8~d0(;vJgzbPHXc>*cHT2ku`vF&efJZDX&YM8e)c*837} zeBOEHn@xON_(>bcH429TE_*+&r-7FO1`@tQc4^%!gOPW-`IEda6AvLao&kcdkBtMo z=oi83=sOVvHe++$NxW#4C=#s{rY&(Do?-FwWW zzpSgQOW}hri{X^js|=qL3{>^8){?%6;{&wsgGk!}xxX`kFp5xyoeHJKjkpqjqgrpSk} zxb~X+1s@(A&j*{p7xQ<*WBg<7;D102BdnRTNEsgy$p5g3i2i`k>Vua>9n72JcDKL! z5s!1Tk7!7aaKpU}(=xG|!i;}JfbX3>l{NK)m-K@dMl+N<>LVaGm0+zVe318%?$!OC z#8T=$qE&#%`G^0*IR_uk;nkbr-u|$Fvi!q>qnBGaB z+84!Fk4(ZZiG9B`$W@E=L5G@qyGu*zk~Gmhq{q_fgAh=_T!`h4RMBR_x<8^oN6m|j)j{{{9?hc;q%!%ap}=)mY66Q~DkC>+9F zA>?%mD>jHI^z>nLpk4SaPi2&;&i{A07_G_52P*c*?R zO`vcnoyy~SOvJt~g#G@tvb~#*OX+0w-jSF9$D#G?_y>t?)pweqo^(jR3L^gDnSa=7 zV!j{^b{dY+8!${+w}N)$>4F>9@}a28@q^;aknK*_2b{QpW8@m(&D|KxXOc8>q^zq` z`iPiK5*PBXxnAr)g0VDTosa*Cy!&W>as#ybhw}L#Uh{uOAv+5r?H2sUA|c6l1yjQU z%(4FzuAqLzf9xk?uJ~usp(zwfF0!-GkgGG+zb?oHAfk|O&~m>^EaQHd{>J}~o&Uxj z6}0>lghuiq@H4fe%E>=RXk$MNz_PTTJ^FXu|DPdb{T*d){~W~n=U`-``^kgX?3xJ_ zGxrAp7H+jJo|%suK199~;u1xC{nuYR{zw1q8K;8*00_kQamxJ=aB1y^^Pl)GoFDvL zI5(q$^#2Va#|J;9!p1r#$!#N&0EwRuuOFVg2^B>l{8JzX`mi{k&o#=A6}E!KgBOn+uPyqi2*w-!0287F$zRbADmDFWq@wR|3vV7a3CSNtveq4M-nZ%$8YVu z0j2hT8oXOcMfAZN9@YuH``s4pbH?~!!oNICbNUGS3tW%vU(5ry4|w3ViyQWD z+!;yV?{4#v#~Jz8KQHk+Z+rd;xCUdXF#IqHCFdja!>06@ygU90-2T9@p8mLt@0J{(1HZxU!RcLc z4Nyq%zTH(H-05cPIsAP?rEl##$V;1dd{&v)9vVZsaCo_NdDX45$Qm4exy1R&cBh@W zVg+DePutk`;T#b#AJIJPb?7kvdCW#}-r1+@HVr zd+5o=CGKZedaWL8r{&U5&y6~fA&1emzjedsO24wVH@1mx+6%_DJM`?s54s;WzwvMU zlAQBWdKCDfZ@yfK)k#X5Vw>eo8!c+Vq{U=Mw@c#i^))Vzrph=#!S)tNd*nRXpmPuRQ9{V<+x!zNd!O?3oA#TW2 z;=Q0+y*S2Sl4?bYWHZwv8^s72h!znlu@}<(RloLoSjD+tO6M(0CQ1;gocXJ8fSWiTVgD44TCs zE!0xVT`-JENtK=XQ%ihQ>lIo?;rY$#4^3b)7Nh3`8Tq*iPWKGd2i##b@bgb?>_^Mj z2rfH#?jo)CoAqLQ2`JDrRW(x*ci5ytkt`Ww^|{@Zr_)~XwLEC1M_dPwqOZ!_fj`x9 z3D*xy#28yU7H{~3b5FFt#Hu@-M;NGjs*FXY3{FOnyVb7OgxTlIh@ucOTzRUq>@^gn z_TAHtN~|R>4J;-qJc(CmW_N}g?hX)0UG7i4;#GmZ-{@$W@sB8*g#avQEE6U$xod@t zznJB$)(n$>wj+&Qc3!j~ci!1yOWrdxkjIguqHNLPElRf4ttcnP#iI}!!CO6^VUSpg zV%lJ7r~W+~vbE0MT3St@3M6=O?9@1_Q(B1C2E_B$(X@}i{D%dAcg-K#60t^Zb$B3x zGj`)-CZ`rT@_IAbXDa(~LLiLeueJ3SDx2_T%jF9+%f@iJ`{9kt+$aN=q}kp;Y9b=b zWnvUj?-Z1FQ*j43Z?u}FQI9Y*6#?^^OaOZkfvu#x;AlKTt_)UlW^~P;L2#zMoLztN zU~*T>BBWD5mK3ypvxrtK!fdyOMDANldun-feLsp*%c?)Sy}GZS2`jqP!NVmI2?Aw8 zamd&Op(a@X57Ez0qv7C$xVKcH0%`NboQCv5mSd*P2fL+*`l(-7r@d;p2YmjZ9|{%<$x|jtmX6eT$tm;_BaDk+mtuqaz^=BkkJl3TXX}cbKe2_kW09RFr2_G`0dyXc}aNvc$Z0VDM1G4nXzze7S`uH z0wPrxBl3hitufpuk1FafGvV& zEw$`x!4}|dR=aFWlS};eIaUwjHWRQ;jHuhvJ&I@?focPxGxqwVrXw>ep<5Ba5$~+p zg8u5?!QJ@d)dusPz(8DY%D%zZBU92kHe=mlL3v&Sy0&A#SVJ|#^P@7E znwx|@R01r@%zLS@>!7P%kXZ!VU%?cqGJNZwG=((M1@LPQZx#(eG#{GJ>~||Y;<<`EBcA$Knv@*r>ANW zC!qPAxIe`F>}7G}-xyn)ANvlsc=E=k5;Y0v6}oU%9< z93cTK=|11f*RtP0`sHdXsrM+rHhsdfVJ?XSD<^lqAa|EgU+HP-vOR%&j)A7B>dU7!W3?0h#8zq~E zZ?V+v}f%FJIJDYpC zfspKQ${B&Zc>56JFaQY{IK{-D1^ZbL4n^Xe-e+CIm^t^|(DJwn`qkOhx~@;Zk0I4B z#yV&kKu31V&f00T)jZ3+Diq%qxQ)Po6Xm2B<)Deiz>@Im!k7Z-m_D3W#=~*b9p{nu zx{)W(G679l+3&}yIkmJ}?(0IW8|Ora&zopbm*)|PNj?SGYSPRHO2VHUi75^s#Ay2} z;B=!>CL|L6?yH+)i{nli&sNT^$`T}RB@{=GV~E>6I1j~8?V>Qd`~crg8MRV2FpuTDDAi>t11Uo?5e zTya_&z5y*qt1S=re-%+mxzu7XXtc!hHdINZQFbx3e6L#4!L=_q8ckM40#9iE#M1}E zR;?d})dzeGE0oePlS}7NY%3zsUMd)4d!o>gQdIT%9FNcN5`)rB0Q!P*q+EOE_Mk0H zRyjDmYwX{G-?_iUZV3rI;M?JtF>i+2691w>2UC7JZ{EDrVTGBqC%Ht6@!dh0Kou!b zGFKnPw0f%wNl;yF1xMrD+@rZz%*KTyc4}k9y00FfN*#xuIazt=&|2x+C+@yCHGXt9 zgm;wi{!>=hTg4o*%RJ~iaXB*PU_}u~$v^gkoC!|3)|oz!V4LmCq4)ODF4p&^` zdTtY{tMNc-sa4n6mIX;XWB_vJI1wvzbcqi90uS4-j%^~x8i>ZbQ0kaHNMd7gRJ`cL zX5V1G!87a#`YkQpJCsJorsVt1q?A`7@w=?eoL%{>bqH0rwyWyzq%xT2oMeV9PBF#) z$~4G%P@CQv?4<}tsp_d0c>=L}r}YlM;9a>KZQ{O9rDd-pzKNLb zjpknG{Hd12mV4F9aWC4#pwpVtdnZ1$4UWZPy5jbA%Wx@&>k2zPDW1f1;G*tBS#X{X z!D~?5{h_MIQ4PnI?@ms5NM@AwVx6vbYGreuX*)%d3)j|5K8ImQ?Y4ZZMQjo87Mg1+ z&Smn$(Guwa2PHEzMtFDSa zx_S05D&?WV@zIO+iEN5C=pz|Y%*H5@(-MXy8;A4`rGkgkjtkZOA3FIq5SH0<(;@fL za^Wxhv&*awjdCvN-uAT%^pj?=Cf7YAI{@cq(@?^B+Izeg}`^xUK312^L6ktGFU94f+XA+IGm9X3#dy@4l&;{x`m8{~^ zuTtpOf0=Zjc!<;(k@qC0Q3*~^uAYcK=b1H}pu>GNf>Zfg`o?9bF8K9BKTTzNpLl2( z#WI?f_%rn+3}xiE(DD@(>y@zHA zg~@NY4IOoQizzE{W2sBC`S?oYsC*SYF}+r2%e%FflnKdmVTa{#rUbUxPoCZCb-5dC zBqet$sbHyVG7&$rDJrm@)Nu=^Qv0L#D(orYSrY1?bzZO?GokUs(Pz!-WQl~0n#nW} zjPsMJc*zNMC(?#RNtQbIcVe}3k*%^Ci(G>LahGsjD4(EO zRF!NC57EwNE}Op+L=Z_{Widr&K@w=vnOGH$wbTb;W)b6(N^zs(u3HTvsB9UC1V}34 zFtKB3>L`+q&yFy%cQ0aE582S_CCNLLjg5)Ntu!&9?1QD#$?vn3=InNuQQ)9(-O%yM z8+R7x51=BH8#|dJP|7B%r6&_$hzn8_E87(wm_Su#u!m=?Gq*5|MoJqqF@CmKqP3*M zs5Nh0)G4jEk*lIL-8Y*BP#PB>+*$u3YIqk;lcXU~ZiA&N>r&xqXau9fd>F5NNH2wk zsH_L+QV*bJ6`PtBU_`;UQf9A~ak6RcP)7kh4Qv1<+_ozdr$>-3K-_D5Kxh)%Hc3@JWsP20~ z8_?80gRd4wttRBeW|U!X;=k7^WZcLZ!!+i(Hb&b?HdK>vyEnvSE8|$*_1rAwNEmLn zED+dOgHr4)Ee#>oV{6No!5!SZa@n?jOjr+%8>u4y(%OP&dSWaaA_M9MYfJelw zbGHbruRecEuRX}&Ur2bL`LvxtA&W9&62WkA{I2davbZaE-EAo!|(CMkrm*E_@pIg)jhUY+f4b3+W6?;s%HRT_I{R*!~E-%zpbHVjDEpdNB?QU7=mpUD}B z&UIw0I>mBA38_#3N>8vnqZ#(CNw*8u=^Z;Yn(~qULmkBw`Q%k7-j4PeW`;l%Ul<)u z9zp^X9+ptO=fgnc$Sw4QxQ4|;F^4hZVT4%`l`Cr!6(LhwG8099ho5*rej~dZ3N;2; zFi|8N;^0OXJ&qKw!h$j5LDRZ$yU4ReSa*riH*l_ot+(?%I{|q?T=N`F*e2i(-u41~ zm|5I@3uV?X)bv1+&@cK83ZI;44+_Fnh^a&(Wff2tzxs>pbTb}C1^7qey(ceW@NS>! zfV$VcSxtjr-6~_qxKkDQkxd$?87n2u?zvZG){EiDL#&F%Gockq>3!BRXP@>=58+gf zN_|h*35g=2RG`EHc7(iC@C9R^be7JjnAPvkJZT|0F8tuYnj9^?Yi& z+dHyx2b$6foib$mL1@DKM}V%+-1C&@Ey_HK>6OE7E;vN6pc1FgTO%T^IaYo1sM1wM z3CN&e>Qa>5Hz0!u;qM`UaHh+)lRaYX>WQO1FC z=E;Krkz~#*fl(YXVH{PM)9(#rcV(svDVC9h469t7?L;CO5^MguXhC&5^SEGxKFQxa zBVBom38@M~4SJ8csK^^L>gG3B}rvdmy_i(HsZl9AZAgcnefC>ae=mWN;~m5N%lUvPz_<*5yp{3?Avz zTJx6QGq|>ixRQ3E2!8tp!=KzizFMG>c%hA(Fye08L3PA>uV*e>Rw#ta#J6pKR? znC`wCbHSBMIkxJjP$h(UiHx!xPwB(=Mc!PbXw;QKLcM={6^JCWC~{PDvS`q!JVw@9 z57xIMm^k}=mFj7A8u=h;g6~TP#p=q1IC2_4YhOVaG`rxNNz z4quG^Xj`b8!ggqs83(?Ygw^$xkGPno>I^N3+sPmY<(IZ2 z=9tR&m(|7W0V;i4%Exg^f32_}R}1~dy*)rTCZnEE9k*mmnsYB1gchA~L#s)<4UX=>!}(OQ>5+muFwM6wo7F$(borDxq2 zYG_hFGrcdNco8INc>D7p`*{>p@VLMli+nR!b`RqYJ;m;PmZ4`YeFeT0R|f!KDzjvbjGoCRWdC(YKEe00;M92<$!@^ z+6*N&Iq5!~d1FwuG(i?N--xBv=+2=JN{$t1N~$o6B~>-!)+C+X?njMp+P*P)o!D+&Qgm29->N^rFAl8q>Q35$zjq&sU@Dmz#mX= zL4dm`OU=xN5W(*RQ9K(#oG&f>Zv{eS{hoVqD7nrL)jVZ-Ul!-6wQI$Fl|Sv0y#P8I z5EG*Jf{_=YgvdVyjRTx9SsRca7w&_N!);EIG>BUYk6|y#1TRPDlKiy2`&cxe6NITY zAIazRzpA&3{E6ot?ff~M&fPC1VBme8RB@G*hyNlo-rAwx6<9R&vhvxXJ$)bR&{$}+ ziBuAEv^xdM9O-*vb~OL;`cU1ao#6RVp=$LoaJuE-rX5Z#j1oH9#jM;JT3ZZ3SJ^wq z7<$ZR4tFx}wQ}65o5#YV()@97uINXC6xz@s$MjVw5Vx&#(shhjP0<8r$c%Lq3=tI; zhkPD+I9iv6)$ICG_#vl$ucArUC0e)qY@!~Jd#Nq0sex&ryx8#NiC^e|qy4iZ^F1Ci zo+4>fdV!XWZ@l*660Gp4;tw*jIpG)1cm=^BlOYQvSt`BWeoqJW2h^+<`?Sk9u#;65 zgtrO&IsNZ9o5zQ9qgt9<)WamHB&`!0vUx7phALa49qVy2!mmgtyetnXdxD}_T)WZ7|Meua}uQ94o<9skH_Qj;%1H$*b0!yEjbX+qG zN%1c@-~SpjJ4g<Wi!N0=f>i6p>wtZzIrGZ?p*ZJYP`(wSruwZ-e{ytEd$y_fmS{*k z$VC*eeCy!@5qhWbUvZiy*{t#k#b?*Kt)7Yi497_3xnnS1+G-cor?Krc@@`#nxd%q~ z0XYd#pR1D}+f)w(`YSn+;v(*KF`^DD$BNDMGOmNFcvvSklv7>AKha@kVS2ZQslaXK zKXAnJGKLkia_efk>$L=jdobVgXZ^PpV4TswfifnEyF{L0n_OXt7cc==r<5+MHCaiN zO13&ixJ}yLddKsVt zR3{3x34hK}D=tDFdLIvdFubj=pJJP7a?yJ(c_!&DwOsiqJ=?pvuXiCN5pQm?QckVDG* z*W3@D@J_b3DL0{I6J6Xd;8nQoBnQOoXa`LIjwos566Oi)1$#1#Mut=#LX^BAZe${2 z&*6qseNZ;@>qM>#f#3v?9T^xEIGi_)hlYv?d(RZ8EoF_jKoY-P4uUZ zv@7V?mgRgTB7G^(+}rp~n$!_)dzNi1#vhujAhCg^m#m3?J*lIF+)p9HzC~fLF*kG! z8x&U$)mQv~wO=kQpW1)k7X5wYJLxB-eOX#Aj$&cHOtPhuC1DnGiBNbMS}uz7`8M?Z zu2p}SMds=^jrAillblw2$Llutyoak{YS{ou)N|s|deF{|hTM{ikE;$L3Uy&s6l*Ao zmJ%LgSWsQY>UxjQN9j1D&3xdK_grs=kwt0@16tzw%=uFt`X_u8H47X#p~gSQK}>=v z%GJ^U($gLzvzc;K+3y9b!mm8hiB7lDsF~$$LD?s!;w!_EuFb1Cc7iTym62V^DP*5k zMVN|@`;d(?D@xndiAYcGNK;9!M_&30Ghl~qdwzO%++`^x30>C|IDQq|nuw&(3pz{N z#$a5hn*%slEf0<%-}zoKzD%+g9SO-jZ_JjI`z)}{y^%0)9>!w3Uub+|I-Lqd!d`Tr zfz5Jm2pTKH)D%(Bs3_Jr4JxCQVaBuqRo<{Vpks<}I<*p_FUEJgeQELgb{KV-w2`Xo zNLWHh6jXM6?JUfT!3wccV~TS7zOd!h{gTN$&1eB<$P+9O@B1Q($0JEZzOQ)vq$?H7 z2;&TiZ`Fn|?zGb>>RH2r2U&wp}Xa z(0!n;&^)v&1Uqww_Ez?=90hUo#kQLh}QBmQa0|t+u!a7O5lPLppL~E?tgH z`B$n?xa2VNjKHTdOWoF@Lnp?NN$~s{Iq*gv zNE02Lvm9!(b=Uv;q!~v3&b=F)_R_u42phL?)3z-u*040wYFl=0uzlH%JJ<20x(%6@ z{(8#2K*2apTF~mkT zmsv$+T$;1{#SB|Pp7%^4F0#Oq$VRznHeOMH>aGwqfy=SniRH(&_DP(f`dz!yGaXSZ z9uE%pXXMWlumIC2uhcpZq#tZC&g}*rBPqLi-Qooo4q@}HUxa~tf1qqR>@;0(($!@K zHx}0GG#k$(!Ejw}!Q~2!O*Pzkf037{5wjBUTmKI#Bfun#%RTO%YNZ6l=1(wRoU04s ztj{F;xr#X)QvImx2kCFo54!{hcuPMjRiARZt|tzQbW#sKA)FtlW_VKPR3iGY?V#j~ zxsQh=3dNoQU)+glU~fV((ev(|9o97hFn19~gy(Re(jB)^3Dp)JmFDD;YiY8ar-=e{+d zx@(P$V)Ky!_lWK5GPyVy1Q3YQy&9kn) zG5uNkN8qN8I3A1iq3rwi<@+2i7?QhCHb0~%sv#%vT>wImMv!U`<~$6iMOTiIn+j_k zVLzn5ub(Dbj3?BzPAXW%@^u%%8AD20*23LU$i>DlpEVZ6=#t2&#@}1Q&>mq=Oi^rQ z942Ui7`>S!K%_xmk*dAgI!?NL>(#=DGD)Z|-=_}Rn*Hq28 zbHb7_i3YlfM&5A_sxNiD;bx{l+~F{xr*G-erl?ViG{tsthTnfLcNYJ6cC8%PnLk#1 ze9y|&HajP&e*0j1G%Fx?RXFRZ9k(921%04u%lPHwFoioU))2CC1U_$%o&3mKOFCRj z5y!TKX<`4-;>!Jro%FX<(XvvZ+C?XVpimJ_uDE0>j1 zJ#~=!_&`APksK_A{sU<0D)iWv8kMEdy2WM)WfakWHBD`i35nP4LKYal&_B0=t8ZP7 zD9t|V-q~4&2pZz6E?FL7vFSS5mzB&M0+c9TibFZip3+Uucj(X`dIeGdFM0K4U(!Nv zsE#`~Yw0K-sDxR3g19M>x1b(r6-t8}@phIr!{qo3YkiBw4JENlN2+f_f4l73{g_GV zdQi6ZYS`3wT^(|4ABK{tO)y;Wp6^YG=7=$u&)JB8+bvjB%Pa*ot4|1OPWH-k@aNS?QPNNFg`z>$@!`;d=hHLog z?aff`Cutj-x)5UTee_sWefl$?-$QL?yGZnK+#2YwhUhY3G zX!*NC3V6&%1W5L>gZvy8e-!(^zp3}9SCghbwNhb!gs%!7af;K#tkz$+Dhk(Ft4?ZB zZkSp?wW=6WP0f1`shnzGT8_iaD7^&5AtOwmA0`aRTt1B-Hmu6BYa~T=QdekwBkAm? zIN$Dw%^8)W_ur`2@155*e)nxNoy)RBKk1Xj{kJxne>m?b^FEWtBN5n!1*xpjS(TvPrvKzI0v?zvJtiYB+B~? z&Va8qDc!W-*S)K3W#KtWqYthyvYAf{S$$OiVw1Un1&Y)gys012vS0BTBI^`NOmdLI z;*;#;6pe$}Rn4NYkHD;w8{$S&EEQLTM%gm05{0{(FY3g@b_+?Xeo&x;#v^!WL9he} z`vTn@c+Qd&TnQ=@)WwEG=Sgf;7QYj^|D+V4c9B|(hF!$h`06ZnlCF_;dRcxe z0{5VdQ2Q(t+eChJQ?z8l7^KUOcQ~#;ojc;IN&U!Te(U`6gnhyO0eSyUCJ5bf!1!Dx zdeSoYy{xHV8Irck?G9MMF@+R5B}% z9=4GUXm&WJ4x_t-s+o+(=irn;r1eU@&Oq=m>7E#*H5QBCpPL(tJ&Gq^6VT>uN5#1x zt{g0*$l(BkqOv@dGlyM68}qk>{A@de<~9pWfbmuCCbD!vSazH*egknB>7I{O zUCm|v^adzLV>hUBC^2g9OhW^3h!`C;HF%|d)ohAYupUMcEyAW2 z@9b1h3=&|(`zMk?u4vTWnrDm%fBUyaEhs6QM)=ex^-MPgqydq@<)(0;nuKjVO8MQ^>4N8XN4Db$1`L@n2TU$)&bAG*^$r?&3|! zCl^3N*mJ=tZ_&qp6h@_TT#>YisLUGq71smp#!)I>tiX7h0lL~~X6=gNfhYotUPSp% z;!j8+pt4SKOX4A#_Jx=4*PVIM+m-Ut=J9AY#MolB!y&OO>a!8*_d21rwW={^08jMk zohQ;8J_O-g-7(=6GKx*4+<{Q(etR-CcD;x2 zPv$QV+{IUIj^#~(Kc?Fn1^-SsyEqk1Ld1|!_F2LS|D&MhHz>&J6hD#nWmiw$%v+$} zKJwgoR8>3lbOq=3B-*_AIrAYC(Y~8|;9g!u(cAF85~cxIVF}7utQP^+_gY#9dMF(P zF3^JHj?%*k&x{&5S}4T^L^g4&#!a_wraGAh8vB{nI}D!NE#;1U9QCe%H9}*11wwZ5 zIuK_I-#~zZGk5`F&xgm2+Qt&LKb`XzeyPAWTeJJmp)*5oVpkl!ou$9pIAk~Hc&T@X z_*NKWE=JItl^>zcex-YSzjZkCJ|Zqvw5sxGcQqmV{Y{%lcla=I`ZjbV*!|c3RysS* ze`^6ZC-z(^n7YP^?9nFY_CHWSmze!!IgwQCF3z)O3J$*6zJvhH%JXm9hGI!?8Jc8Y z_F%OqHr_O=a8Y;3%rNWY2PXz7-5hvp{Uu*gtLF|UxuSnPAITi$=$_>yOV7}HhJ&{P zYzbZh^D+HK4)?OVt8?i#WY?0v>RUdb3fZkKypr1I%I*z_3`%(Z2-YP!!X94qtM2Mu zoaqG^isiusOgZ~dnd!*H|OW(qoVPN?J_A7qGUjD2O~3oZbx=f%Mj|fyJfoW~}{S*$X#*Wlc6p`Y*o9@XZMn42U>(D}pDyqiz<3i>IUf$#deg*Ek3) z650}-r4$D;+gGFqWmO;>@i-^^Jv3hIAm62{w84q1r@EK4{oLsy3IZ0$8fa$V8Yohw zl_AYAC9S+~V(X8qjK?uPh#N{Swp7hiDxctj^X$(2rc6wP-bCL>K2>K9p`bbU)8tBv zY}|Z_yk6$U?)-SKD5-`b2T8yEhFMp5G?}YTl19IHMflebsDmHS3Y~9rxLdz5T7B;7 zbsh{Moe;;qUULkr*S_YtrM#E(NSck`_U-21T;HC|bq6?nD{^De!;p}>_xw7Em)Fnu zMuoHls0O|UWcDvc79(TqCEGW307^#hXzaU~uO<7P+Z=wYw%XHg@!bg6nk#a(b&a&> zw>+QTraR$;tYX=M^*LOP5=fI46SMX$ndr+-5I9l67VZ_~p05vX99Nab@$$I*V)mSr z+4*Wy&L_ECW$|_$I!XSqvWf^!Z@T6X8=3f0^qE{&px;0lWN!Rk3UoLmdH}e_y181n zAD(Jpp(BXxBr5P^W^3p&muOe5eU2*RKvP98N5Xr9$%p*D-F8o0Tq+>t{hU>#mA=g| zE8C*=oetoz^cTB2cdGMkM=5y)%=WeU`zoq5%kRoHzsE0Lm1$2}9M1>UQ)w*omZpyi zr8!znT-z+(&2Ehu!U`?(Eb1h0xAXUVufL)R;|75>e`?cD9;*z_%DP$p>Q0X~QXPiI z)WVQe6y$fk_fn%G`MM7LZpeqEO` zsLI5U#@6#b=l1m97(|xI>@;AQ-%ACy*rRUV_Rj73sdOBiY?Yxj-X74BPK1rYV!QTj zZ0rThX$pUd$zESO^Y_Z{Az!dIsj2TFZ$6e*#IJxy(NLH~K^-3~lHX}a8jQr%sF67p zvhy6ll&g1?7&;gb(wcj(-xzrADOgO;YtHG>2n=ef>lt8ZFE{XYc6nP#ca=nRWzKX~ zQ_NF6peLR-3DazJ`RVcfN>BJHDo`fr-`@TxR-E*kGGy(lGU!q2@an~G`D!s z$)vxM>$_d2(orKQ`cCiXaqQmQtVtVAlYGt|^xR$@sxuA{Xwir3Wwi_<3o;Iyk?4cb9&(U;GHRKMih&i>T&tfS zqaaZs_VGd4IMCr6>>)l}^YF@cN3~hl_F^hMbbOAYz~CSSsVb$Ds-J%|{6uct z0pB$9e4o0QMk&!N7d{Mn0+DdCqCR)4FR(K8X5_$%w@(Ri(wYUH(%S`U1XQG$-=P}7 z*=pVWP6m@e$?!B+ods5@4!SmUpbGS(MvK(8ZPj6vxg6Mdj0EE))p$6UMJD=IUC!k0 z(LOI~;0T~9`_c&fb_$OZq1KQe3xOfUf>pw*Fih{;L7bI+9TY3D^qw*AJ}ev`XnDF* zeldiB_m#JHN1vorP2~*ddE%&7EP30Aq%<;RawM*}dao+>jKT(tR!{NUs}w6Tkdw#k z3%8d^xXSMV2kTvm8ZMpfKw=8Y9>OCTtql2*+sy6v;}jKT9{8W1dZjo*U)J!An`Y9; zTw=}>iE|hvt%;7n#aOwjoP7v(mIrvvT)&e8^7=(@pimo-8q=qqp0?iCIED-OJX%E=f<-(zsE1xk|u@ST+ZZK&A#7ub&haR}tWe;!oD}_;cezRD*h_n$L8P9j}1AcjZ8%D<@)(@!Txx1Ba3ip zA8Z9&c*Nw*$pJw~p-6VZRoYi9yI+iu7{gUtm?Ytw!#O)r7+LRn8uucb?gIi*wCg171|m?^t;IA@7KwB+agXR8f4+M=Iwz zaw?&92hR{wJ1(dqgA}@in%8aZl&j|x-}KfREg^AA*&yjJjYUS3&q2>Pdsd6;rMt!z&=1c_Gf))K2SFWV9rB zca1bAw^UJLEhq^tS+2vwl60%>wyf?_kcv|FOfx;_{S6diANKXr+Iz|f+=L^=3G#yC zgkl)bq|@-($F}M87UkN(CuT=AwJ<24Y%<<<5p?-`J>F4WTFQ3M@l;w|csuZZa4Z^5 zsr-nZhJ!I(AirHD0};SyhNETjM4k>~cm1oh)OleDEvW;ATSDCSr{){k{?SB5sX!~sWBQ@_%2DW1FxWM>+!@LajWr3u*6XAs>q2XA|}e`V1AePMmB?d;J0 zSTG_)c89A1CghGK*sOeWO(Nrcfs8CKqG=4xxK3Auj&n=>VZC007v0el(zwj{!8UUE zGX$*x8uA&MK=}?8Htumw70T+$wkaAfZl3w_76Boi6^0+&s4g)bWTt9K-Q?)>-DsR*G>T>q@v>9?|vd?05JucTcu3&cSdh#PF1DH$e zi(fQJ&DM>ut%~cZHA1&?;`vwCjH6srQLpjc@ndo3hb>fDUQVPXdN>$|=86gqMpqVw zuqL%2mn%l=8CEFjQ|y}!TX;*?uM_kOQSO);xw*QI?&tCZy(ZO#o-{8yjzurlnr-dx zGEk+z{z0^@{j2e#uI7bB=q!ug@ym1O*|K3Sx$mK{;IGcJaMJL^zuiVJXR7i}p2)rC zHROY2)zsS}M8O+xvX!N-oce|8neuuv{1^*Jqtr)H=ccv+op?)>9fzFnr!7}3qsx;^ zm&UhNG3_!`GX&n+PeNv)LJKGpq?yVqWo7>+vv;2os22GuGX=vh*HJNcvcJC!fhU0= z5v)KR@;5+ZZRbcC_TB7t!{n`Bswd;5N!<@8U8=lC@)tsra_AljHIw35)jwJ8TLt7%_3LC@#+7+mS8y9uYOs&Dli{0bo%s4Ha6*{3sH4VvqeEY+ zXE@evqd?dFR?PW~tVj~|^pFM%s_k1Mrq^n(AKS70O^Nq=I^fDH$FcD(-KaL@st}UY zg#XPLCsGEvU9yVXVf41P1E(mU5eCmNoU>3K#YIw{C?EiE<$W+&&X%*2Z{D4QBa(x?f>*z! zW9YIP?;jgmmn%hQ>MX+Hg#^xP_P-v;ikN9G#b=e-ZaMIE+}6v3bGBa#rf_NhTMLlj zJJbDgyTQ%hIx#^!doRW=(5kWw-k5u)5}|+`lfp``I)*a=Uv6tw^d%>N(E5HX!8ikK zabb;Z#V+(>7vLI+CHSem7CmBo44G#y(MEDo-`RhvF32t01<*wV<>jJHL}4sVJjlTa zffQe#;*zOnR@Lqs*zp=Evte|Y0Kn+9EkcD>rE#;Kw}>#TsJmon_$yn}^Jlkw?o!{j zrtzFd^I)wtm5;=;cGD7>l9&_256!QyDW)|=F2(ajF(m9~wqqMZKTcZT zci#1qUOTeW8}0cw@?w6C!7UCz_|K4=!T;4EHpFbwLOlKcm%Bh!!BZBB%f%g^fF_747)Bzio zPUEjN_`+QNe)RS$_*e;#$U~gl?DPBikdfB0JY6l{gLJi~*Hdm?t>`IXIp<4{W!(N5 zzo^PFP_X?<+2(S`#hPQ*mqh`&-!sDQ_Dnt(LRnqBN`CIEN2&KS2b#;tYuG%&sBHfS zS(49W;~f)HqZH_u$%#% zmt0QavoPT-ic9RBtj^@fs4*B`lf;d&)n$9z*!|&9MO~3?(ze5tSBa_Y$KoUZEdA%- zxfPmRW4*DYa^2IV9iu;dx`xp3%Mq~wufcb4p<8*IJs@im%GGZwt`yhg+@1LP&0Ag~ zeQTZ1IeYw`I3H%)J%`n&&u!IeS+QDHM8moQg;W!R!W#AEa|L>t1}iZYSue>WaSax= zL=3i(+QekNjpW^TZb(JVh0Po6(HSwBg&u$yt0nVDw`;l+Yj%+swHbZnS; z%gCG}1vc}(d9q%rpFtEebf_*!QEL))gLhIUG}&(MHt|VPO$Xu%k=xgQ`*Z0`-^SKf z)>e8$+#T2T{kNn=@x8A}Jm(wNwKsX&PLm%t>^K< znyTmaeOvp(9G+q2+_FxJ!{KJ*j8CUrKlr7C1q`f|uwa$SEP>e7K+V=|aorJ-vW);u z4$D+%4uc$raX`=kuqBv9jY}JbxuZGW5It#a3UgW`!aO{KCfit)mSk9P8!E?UCHzb# zXWxqoUqh)PXN>(y+q{POVzAbd?$tMp@Nl|9#HM7|bT{u!;g2mWKxWzIw(VuVULo$f zs9qU<F<`o4p=`sCt<)-5-deuaRXU)$Xz=WpGIInU?1BuzXaW!dwi= zt>*&rqynWO#vqu{0nV6{(t# z^5QOxR{|>5D$kf=88Xvg5lh{Lvz>@_Qx!|ycmi^S&j@2_Om4~b^_Ynvdo$ z&F_X-=ZYDuQg})|%~`6I=*komG4)!+;8%5=qKi|!qm{=@TnxUJCS9Vsv=~i3DZD^g zdCfO(nYT==mqfbQSBLNLt@7tSutZ7_Kg}lJyn4Pk)5u zO zVCeqH1a%#GOtw3VtHOlwgHqA{xA)UMa6TNKNuH85Ik=md2mgk?XpiMT$ zb;ia;7fNUQh0HqR(tYC=?Y`N)Qe1cO+4tA4B&|Deg#b3ht-NK7Ea4GN=OheP0SldWD(23j3#eif@_8gtXd$CTND z_UCqs+pdK6wQyDc_jjc)ePo|1DA)V}am&0f!NEp+-dXz+>K8HRE57SD&HEOu-8Z_M z$`&@GbymO^)!*`B>2rSbyw1>N?rezsk=QhNKAHO@<{Lf9>%eo=*O#?)uN*_FF2YMC z9B$0nfaNUBJAiK4IoD}ZVPc)q2yMHX#PG9F)uPS|So#}*8z_!Lv}qpm{BDTMxu>yB zE^}8kCKL@jR8b?IY-BJfWy7L|VxuXL)z@9uR8hOIP(mciNSvpEAiUIZ6~-Fwg~eh8 ztL=3hZ~2X%D|FtlQR0F8(gy8wqK!|zSK`aZ`%;PfP_BI&Y5NiT5-qVIp1+S9;_izT zyx>^xS8rNR`CW6l&h47EPDY!rd8V&WFX0Q8jhmEL`TTbRVg=;fhe&~rz#>TQ!t>60 z0fLA9!x*}1VJEUdXV#tYv4CF^^@bGT!ai~Wm*uc8^}xfrO|lnE5tfX(^cu96W!7mD z!Ra-(#lg2B?ysR{9(!FmxmMtwVnzOwOKa>FeWF_sYeG(uRP0wJtClIj;8OY)b2(90 zlXD}qEQS9mQ)D?VB5eVbz6df_vPWTQ>(8vxqt+OsF>!!1h zI9V5*bUj_H4Z8T^UF)U`zjvn2`QG=|-EQ{v!reOeyWi2pXPfq+?OmI9==^KkMrZBb zxNq%$;(a>z?SG-N56@hu=4y+dy>g|P>%x{uV$vZrdA5s5nZi<73Ujlm%rXPO78bgm zi^lqp3+sE(EReBPT1m9IG;f8qjmp`MAfAk~z?{8k9|Ni!_ zb<-!yu{u-RbRadNyJvo9pV~hA{EPMV&By8^=WX4$ z_P=_TKKs76Yu5$mt!3U;_u;Vzo1(lHyl6C?N}|(P*Gdyg`mi#>NTg;#9j`Lwn8HdY zi_XQQAzFJ$HI{PX7;BE6#2g~h{BDTT6Hphy+Oe2+O|4^a>KpTP7!}wc{5m|AI|c`b zkeAbDUs-U=yxg*8~@g#*`b?plCXQQ^%OVroC3w`UOJrHO8!1(LoPhPBuiInJ}5m#+5~~8IKsN# zZEy&jI{eA3T!5NRv;%@~w}YjQVTQ7<84MNNlvjw`02Xv8j{qNP^$M{a1?wTnYc4rB z0^Bqb#X6c=LoEgzvMTH%rGhY_v>8uM#f2zes2a<4TqeFNNjw+ISd5O@i#uM2D9!hV z=&AFh_o=bwoIrBpO!8=QdBEIF!9p3?GLB`GmVruEpzKX^NX0A`LlUtf)zHz$A?NBg;>_BUG5k%I@@2|ogT=>$4@BEummqUUbG#vXa+y0OjY)>H zfhi{y#16=6sXGIkiWdrA&}4BG^>vxJLrb9;kww-^^|LV@nm4i`yLi#6E<9B~nXb!+Js zS}D1%&?_HJ0GAqSq;HKU~^*lyuKW%zF1aW`ifOSkNHkIi<_X zhS(;&u{xPeN#?@2;^T5M{gKNznz8a)5?F@Y-{#O*X}o#n?MTO(X@;>0RtUe)=4~Oa zE-JPt57iOi8DifM>uRWFZcVu^`jORn_h+q5$Q`e|M`5pWEtTt2%hRZeqmQdssW&}c zI(q6q;_7wGhL3{Ngl=D0>T_2t&D{|V2Q;2Eo_U~qE?G#`2L-Z*y@_cbFHqtDyWQ@S z=PCxV6A#`A3>i*c$<>yuW8~Cviw*G!UJ@Lz#8{Ar6 zZ#I|>c}5irhkmK2)@E1dkI(Uj$lUeGL}v23&cr8Wfu#~^`no`du&`(c8KK#+v1pRJ zz+^Utl!^@w5s5xn6?ns@ZpXXLe8Wa*$C1rR`<%iXYFvV!{w;0XtfdW`_PPBfx4p!F z$GML+gk!^X>|?mX@k<*v>}$A>eWRB6mB~KW&;t1*u^T+6sd|3J8j#aiw#w%(EP2{e zs|7k#HJ4VLhYxAi>bPEXFQFrj37v2yskeWv8#t7lu?UUO5j&r%%b>G&Qat97=6FNQ ziHkaSY(k#Cuxi$FI;5O%^T|b6i@p@>(|j8zPku7mUbDHOP zL-cHViL^x(=4JR0t&=!$=ZJ6Rm91iHLs)C;9I>TuXR6`^yX{|CqNQo4YIt~xx5S#FouOXdq3Lcfl^NCLY`%^hNa>mMKCDweE!dPfd z)B0EFp)wHRY3qHBE|?>C@}6n0VzR**T-L&*mcl%mUVQt39LC6DJS_B$61grMgU&J7 zt+b49CD~d@P93wDIQ4My>^KtS5)qr)iMP3zHgbis&YHHLaAh5TliT~z(>5(F#X6(q z3!)|MIOcdAd!y5}>G1U*%a)_Bpc8KSBigdXx9v;oU#=TAEa`}ouB@Z4e`{^r?klu) z9>Lb5PtX-^ap!eLt>VtrK3DzS92UZ}9p=n8tjb8TMaxo*&`4`>XfZlymeVj4yjec& zR+2y525j?|Dn|3p$2Ox~KdRZKFC<)s{ldInRTQLor1h_`LuV9bC(YC84XsY7kD?S$ zv3ZuZA+kdzr7|gs@-`yZi{&X7*JG;}rCMrrC2k0RGcucAjm5_XXYeHYR*k8K`{k2a z`{_&BC*10;I_9(=$g0;`@Z9Y9Ti!)SUHfL*wsng(Bwu| z$Y7Y(mctw1m45i4+If|0XZssBZdhC3$m_7}Tix%?I{63huOqH`Ln-G_Yfh&=_^H}< z{OHPR&5n@2V4LggS}AsL zmM34b0bM;|=(2gPxaO07mSrE9&6%xE@l;$S-W-t;;WlNaee_1W$k-28h*TXLHtMt| zy;#TiN{NjQY)`~hw+BQY}C3-%dB_W`yn60?A^hcU$+lA{VbS^x|6HcVMZNhHMjO@vH}O7ylktS z=MB*#>vfU~%VOmQnDC?~R|6iEu=Rz}<+NB~0p_BxoS5r?g8_9)*o8CZT+qbkO0p9& z28*!SE+poH#XP%^4ex8-a>TK^@zY0iw?iab#=8LdxCEC zl;8Kun90uuH~5P6=p%RfYHh1;h4aLo4QJrQmD~<*ghw2{LlH6f9CqSWb+cdjOPzej z2WacDS5z!5uVZQRR_(mn^>yk4o~-LV{&`yBDoYuT!w<44o9OEoeZFY< zikO?@W743#9*`$o(8O_~c@;QU3n(-IhR3qio(bG^Z`#w=8 z{=hx+`QEWNyq#~W@2_h<vZ-{SUtE1&Ie+afl? zBfJqFwtcJH?@<$e_?55Y`d_H;d)#k%)BkDlD1qmT9RJC8e4wuRuxI%AU!W`d>NIlm zn#5jWX~z-Lh7GM6)&kVjXuMvUO|$`CQNR!C#<46Nwlnl_U*T^%tlKC2(;pf&K3S*} zhc1oXI;QD%2Kdky=66G^Qx>DCD=EhclU8pF%3zsDkuie-fvdsg=oAw6qYk*m%vACxc!&p@n83`&(2Nq$ZOq1duo5xiuY!iyk#yLcaOO*863tTlww&) zT1(0g|6uh6Q1#kc=qPSngn0sALz{!KMa<)p16LaETU^x6p3Y&A3#el(i?+ zf>gwtz%5&KU{Ywq*6rGM+{xN;$~AP@$)}1ps!P6Q)*4ep_=0Ci8#iu9+OV{wh|rpn z{dlgp?YNWN{xx;jNmmzdlrKs9OY3ca+YW8>3zL5QJZD_#s&q}qvlb_}=lgjn{7)@~ zIctMix0soAA+KMQDwmAFcTCu;Zo7rB7X*I2n@e}RpX4z?ouW^FNc!3rV}x1GPK0aF zKpK+kA7q3=F^{w~j|Y{r%wRc8mdBu{MChBYi5cSY&mkFDI6>Fn@-dcCxJmxb02>yW;Q z#b~St^!iz=n5tf~uia04iu{{79e%`xfVI9Zlc)@>Qc zDpf*V1yc9bT&8*65Itecx4dkH0K*)P8c&NvEE#2lER{? zntfJ`Wt$ZK2Om?J!SD$?6cgNRDuY8(ZC}e$jjBFlBlx9x%Y5$H(wqNMdfBh9POtvG zaSsoEnX94Ij^_{BaenAM^6lfLcP!Jtsb-d2+g<{bHDbkZw{~tw;eQ%PPSHrZ`JH^L z{1|EHD!<$Q(x;{OzD?S7ajoBhEl1Yaloi;l{|YYi0nP7*7{dfrX}FL}yyODF(n_qZB$_o1qXHW~K%FClLw-q;9VkP)SZTAQP<>Kt1$e!hXuttxTs@rm4e6_2 zlpnY&IWqJ$WAJZ%^}uw3Urn6rt2wSx_h$MD1eU^W{9TOh}IW_yU;XTwbzy)=Gux3MS(dJQQ|Tw3;pc`YX~o3Y{>Ph(zWf=?)C7m9qqkAA zF3<_#3ss~_r7H7R&hLg;r>x`z*GX)%=hYuZ&AiM?17V4JkAj=o3M%`8glg(rB07X8 zSlEx-n5b@Om{JRCof2>nCK=a|I^sS#)BJwi5QkP)6jb*RkCc~FFv+;h{ zw`_m+M(J5+NcX?H^uxE2?sf<1F1M2&cn|4UjsNporCqx`g!`f0JQnvnk7dmFL*1@! zU70zJocH1~91EA_O3GBSqzGFeDQlV2nqb$s<$sr=LjrT=(y=z?>J zmur<%F?R)dyBsNVUf3|?Kms(SocbW4%@fV?6_(o+~}r&$yodZ0Q}oefy>#@@u#9?SJtG_>HefZ~uSNZ#-T4ac`Ed z{u5uV`Z*t)qxL2B{=;W!U+TMrF+2ugIWV?xdA(3&X&gKhUM!$y^w}b7MV2cMdlWx2 zEcx=}aURQ~_V5Dkd*7Dc_FCzSpD1Eoh3g}S0#>P1miAIS9}t+i!I7t|Vwgvo-wlxs zhXs_gR$Ma4215J;kR@e`EH$m$1-z0=FIYofp~y0?6ppI6b<31)rb;$M0xoDD1#VT< zW2i^2UzzOWIGGO52k;4ACWU)4-LCsI4eVXxittNckY4?#(l0+n`uo>OyzE$VU7Xxg z)HcSBv046^pIg4bC;SKfLWkSFy|=i!$Fk$W)%}27TEv`YKin?7e=sMf6ULc)MAmTP zUNd!}fJUyIO`D_}-8S@)Uy!bJP2*u&ArtzpxA^Mt|2E@P{l=`A?IT~9ZLzB9b0v7YjJD%%gfTp`xYEk?DuW2_?B2o=~A zX-K!aOX$HrFJ1lm(w?r^KJqT<_5M&f|6DoICS-A@tx(i%G3m&5$vpTCg5j}jb$&9- zaej_w`bfr;=E=^927~YfTZw~>sryUY5AQOu(Aclb_?VoRd&Fp|*`bGI-(t`ZHg9!% zJCF`t;#uK~eT)2_f0H;N+2q)SmVBtETuFN1BcxyXKhkqvEIr$s=Cl1A>}Q@P-SqpV z&70)gwo2Smf9?~~E1oBP`eRyGa#QQ_KhVyHA1UAJ_E!2DnDlZY&H7ZGpL1!Lu~z^9 z5CBO;K~&!Bv3{KJROys!NPF50zxYY%WzUqp;YSY2H72Ltro|ywthQat!IVO^PwH67 zCmj#bi?t7~+Va$)b={`5<`+Fj`kxO-yZPIDj%PF6 z=q2~)pOIeZXM+#*iG54IP`Qq;a;|kf>H0U8e&k1`XZmXJ7k@)K`X~*XB3F}N`MmUe zzi_$We62a*hGRnkgOD#pTG}8Tc0~5Xtu~&WwCVw`&#RFuMXnO$lK=bSBYsJG z;Lmz&jt5(vzIUcKL;L>kr&VjnW2FdrGNWJ`?lL-t`1K+MS9-L zrTaWY+HttV)z0ju&u?$}4fn0@DE;nVNLM{oc^l1UD);RRz6F2H%e3b24u-ps4$ zkz`nwO!mSA$;k%%cOEI-lw2Hjg;b+f$+ltpej zeM9yrDb_2YYNk~F#4Dvszlar@TnSsjEuk~NCB5#Is>kFp3m@YZPLv+^6zMuQ(3;cn zj(LKwa@a_zgH4rZjBooJiH&j16&+-b`Slo&iAM9!nn}`h+PF!&(e0$i{+e|2ACmU= zC&|A1P3aAPAic+L>UUopifH8aSd+PaL&goLCUCnMld0sqRV=K_$=oIVLki^ir1{+t znLMdZ9c3VMR>9>|DzOkOwTxHP9m>ekM(GB(iCmCh^PAFKOtbO!b3mewObza>&afq~ zEaXaIzc4OyWukp-skl$JrtRpx+!Ce#{w`?Wlw)U}!)4y}|b$rOh+Ck-ThJ0BY#=C?#;F0U#_v|kk9_E^rlxx|MEKNLf_4# z!S!&Z=h4dgbNmyFG*d#gT^rhmcK}#Tr_NKE>%yySu8(hKCfj7!1=0?D#-*Yxkr1~w zx4W0}3$NUUR2$_u2pRv*u|pl}G8`W`gxx%$CR?pJboB9QsOqIu_FljtnuU)EY)^FY z#nOMj*C(XkYVzC<;tKCZw~)5_ZStOCSF&-txNV!nl_7Pp$zJ4Vh#z~uG(9IPMXPQC za%#gF7TFj(S-sTrQ76!g)@=4GvY!nRo7OdNBt7O={dnQ=(iQxuq1#sDXMaa}<*yaJ z)sGp@`QF%z2Est2JO{uGHD;-0d^(71xT|cCR`;9_dF#Ayh;34bdFr#f65egqnP*wo zzNxQjZmnFP=btS;WP4#g&cu%EM8`hHR?@*%qN1a&FdMs)-~Pk0wchQOs@;=qBr*Ei{k2$(I)6|5mAO70tH4Wm^&dkIPT{jrvXf9CiFZ<<*$wC11RL;gh6yyeV`Z z>ohm7(i~@7=y)@y@7`qWv-N<@9nJfOI6Gl|QdtxxXFOt9mIi!_%g(oHYtaw;;XluC z@UaDEibiTtU7vVV3p#|oahRMsU$z)AKyleUL!|jeY-V&Zxx0-F+Y_DXXIOcK;yQ?9 zg&lp2wA0UGXXAG7lK8SUU&;BxC#5(3vGlA*NSkLltyyefNH~TnQV`?i%PJ93#d!nxje?9aQej##2 ze~5tDv}$Ile#ztZJAP~bfq(UfhOf@6b3alJ&QC+nd8t7DtL9|^tfd6Q z6JWt}AkQw#O*EW3h-w0>QZ3W&!WjS-idq-I{1Hp7AJx3_!W33w!dWE6$C|5xxkXXh zMFKb7`9Yd`qj&5Tqxs+;_B6L2H9#@cYg6+~$!=kiF{1KBNL_@9E=8n8wN&z>uAoal z(J#m?(`Whv&psPlOU@J1Cns@iXuB_z{^xztKm3(9gFo`7_gm8M{=D?;$4am8o6~pv zt@4Y*>F>5X=S9qkes*@+Eu|m)G3maK_tlfHoPOb@5_AV+e0hD3ed_h$WSQgOn36Xg z(}5snbB;TLab)U1tyEO8lK!r_!t+<=%*@|m zjgDw)@;sl+Xn3|OUOdqOlo1t|b{rA9@f{Kxic_vBVV9F5EXP2yq)e_a>sBHmQZ11n zw6K-B0-(4srEHPBaZ}M@JCQCM%EeF9<9=E8p@Hs^_|Ks>ZjgBS0kJ85^1r+hdQ#Zz#d``W7(S!WK@Q7db74Hv8 z{n1SKS&j4T^e>)U^cT-7`r^lxD=D%>o{&gB)_{BB;1dc*q@fn}%ab5^g~Dt?NODZ& zBR9=iTAH)t86A$V-s<#?FpJ@7RZ=gRUPvv4u61K?iZjo=xIK%g(aq6}xZ>JMlfxV` z%iM99$D+AkjY6vMHwQZovl~;~wa+!1~vMK8~&o>sZPL{75VDSA z!hKBK7Jv6!(#QO4^p(D?f7Sz~e|wX}Z>-0Cg6zd3OTCKd(MeRG0cI41;$yl_~wiOm$Z`%!_BPoK?3S48RFX@F*9As^e8&Pem~qyfxvet0OtO2DJ#D@6GghSzUXMk4P5h5< ze3_ct;v5E7w&Mutc)uiB>t-<92*drQPk7_;73F*WPWsmW&U&n(yY1|Q&B?8E9LNx| zO>4^h9mg+xtp07mS3O($18-9AezP~inX5rIcz%n1LvMulf3jbiJWJw>)_eQe-MAC{ z1dmPj`F@$im#r_lz#VrU=D~9I9X z#)?HYIP+ogST^dt5Fso=W{#{9xOKA~Jin}<0qIgJ+;%-llpA5na%%WmyL7$pmrnF8 zAumfheeKiIJO4)Fs>e01JAd(`(qH|C^fGTSFZ(&^Exz?U@2tI7GxV8busb?rG4ohX zV5ac-FE*$5{iF28-ApWJ{kR_m+{7>E_WCw_ zR0&^A;>zAT21aEk|T1#XE z%cVxt#SdN7tfSU`IvZkvDjp~@4B zlMK4pFBksbpGa@^ZS#6IMQ)Kl^?q-Lzb<{)&m8#$%!Ox5pYW~sx4)vjr!wP$4jJay z%vQ{NZRYd78hqm)NH2ee^jbgj6K{APEh{vYmVqqo1W^zdKy8*#rh;Wn8M&=o6R z16zNe*^h$iWxJt`Q{!$6g5>NDVvc8CFyz6!jxo{Yp z9BnIGkW-jS(@K-=Z7~{J{UuJW0kY?%o%6WduRIhu9q1f+4a8N__xVbZ&5&w(hnN5W z5CBO;K~!63t`yJxjyIO)O0WDS`7P<*E8%MCt$!%J^e3f{cr)DPTT|*`)p85I)<+B3 z2l{UcHw)#lS)R@3coX^$-;zK7r=%D8D(`K7DSi6C-QRC&#XmX572%Kg+432$^hWqN z=^8hb4)f!I`r$ZR`|A3C`S^bALDK79RK%kJeyTY3&OVO-bgv#S6CYF_3`nsK$FXzd zS;B^I$HQ^RgzmR=-qim2Po-bEhx7)&Xy8`(EWe;Q+neRtXL{rLhV;qzO0V(l@h^Bo{c~TP zee(-$)h`%&9mkv~-Pw;W4nM~DUh=rl%VZxb-w$LH{D^OX|L9rLGw(0`sh;e+9iR9x|DzAb*D^fYhS_i$hM55f35j(s}EF)PY$o3G?>#reV~7X9WUrO$q( z=)&{u%_23+H31*UL4%CI5q0W196zYb@DXMG#L06E@4mgb9${uSTg5?pDe!67yP_xh+RS8;rQwI^-1{`BtYezks=aD$JJD@8Un{!4&weAZV( zejfKrca)y-gVM9_E&YZ!$un+S`QN?3FHXD>;!hkg8{CPLt|2|xo8|TIU}dd&d@Ppv z9W;NOmS=nKf1C8%zQuj9pH05^trDByO4Z`aS7o>re$Z2;C%;trJ;J=2UnyYESUJld z0B?Gk^jqEt-}%Og&AAtT70EiX1P90Qi(~qF~N=`yi*K2{4EW zfMbJ0$n#0_ydiq#oQD(Ib1oJM3xI_tC+udxqChu&=$+oyc59Dm+hNi@9t#z1+uDo7!Hf>aWuIRC)K4`bE{Lb_n<1c?i`d>evJKI-_#Td4v=DWimJU91-`N-duZgLl` zJ+))t=W=Xn+jdCXeM`IJD1Y#nzWybNUw^Dt;SPT|@sjAy{_uP7FV;84H@lPTaDP^d z*#o}Y&n7Rt@Iqbq)i0?0-#?PR;r8>6h4n#TTL)ew&aLx_Q+PHEAx)@ZJ>CW*F3A%K zE$0uvT$_owu+LPT){PE1`(p>-?B#}v8Kq*#k#62l8kX$?=XHS672 z`R6z}Kcl^-t=<&x^2pFb&IlcMa@ORST1UO&?3m$fvDr`|R0!F9aYwwlN}D$)aH$vc zHpzX0XO}KvFE(wFPP@JI5Wf_;^P?m-Hl73KX6JU0A+7=;WWK}=N8jT38~mU*RbLf8 z;Mb(9-*jyq^2Vd@`1X72Ht8^LYKI-A+z7XOBipiF+OSDtU(gB(8$Z>&(}Ugbr%U&L zQoS3vhMx~kf0=rP;FY1i5uShk`C>!dr6rZ+FI~dX9+VvTP*`J}%$z%J?rdNt+Z)_8 z>|K^whgk=5MnrxnvDQ)@7x*|B|46)KA5zSsqAAX2F~1vP@uKR}2k%tpv6w-1ON^ZM z;xZEFISvogt?V`P_v*NPezc!EUG4g~hwG84a%vYt1_CMQXS*HiL{;gsu2_w>f{^fyZPIYYYg_o-enwktsDXCq`2^_6X|+vEP8a%3HoqJG`#+Rk_(bWi{*ScXn;{z@8#Db-*m0H2 z)g!+qd6aMSALIGFt6!Gz^FeO?Gj^4@J-}T2u>tmtkc|=d@D*z;ZBXk@?G$AU2rIY_ zzcOJ7OVK=}KFJL-0}W5Gl6qOB)GH53|NLs{o4%E^xYx|jvTk@g>B)Z}-RkaAzlvZ+;z1 zMdrVAJs*F+@(PjL_TfNgI**N)Ki9mm#O?62-yl8WnG$n(>=h+8(wUI8s(m9o_uO;y zig4HnJ@s3B)w^xmcEu*oGb?UVY1N_u;f{ypPQ@D^vZ2h#VIP^`A=yLLl&R||$XMO} zl)d8BW2O4b;H{L3<~l9S?a^_?F`4Xon4Cz;X%%b31(_+1hIX#}((UVCsQT6qw>8jl zeu?l?zAAb6vm_q=^VTsNqG30~SrV=XV&&3DtImmJ9}e3g@xb5UWty``?sM|ilSzLY za0%H?Z*wS}hlwt((!lN-<{LXwNL$irA@v`+E(vY7Z8+bg*>f0QI9zXRW-*i;}fqDpEJ` z(3qK*lVO*cdD#B}U&XxtAGNMuSFj1*(a)Zq_9wpO^Yg{4exJ{Ttu$6@ljHW-6|=Qo zggE*6rNZa@ru%z-!N7*ltp}RZ%j{BdOORRDFO3s{W992NU-8DrtuJqY|Mm6Kn|$T{ zXU~y%6Z`_-3jej=Kx6yXSCm(ZbaOT0XLS4zhNs@Z8}D5u{?g1(_*vvnJy*J;H&osn z%U@$z`2j;}|a@lFb_lTgKrW%r<% zGJ~5^b^*@Xg{*q_tZ~Sl@S&Ez?(j|7^`y;?$kQ7 zOMZ~dglm#=VW8qPvY|qT&itD67H@2P4F`9;*GgQ4+|SR6qy*DIel{GRjC6@Z0VWw~D=n1Hr?UCb>V!n{KxJWJ_@U z1!Ku`TK?}9{#GJCi~GmFlwSAZdd&PZ?k{}&{7mkz{Z^S<;*Y*tVgn?0Z!K=vr2K0# zH}%`#yFW&Hz|Tt$`UP{($L)U1b8&5n#~gdBXD@a(!iz4tNNj=-G8kbIq47qD3_cK7 zh&&#d9#jwd;DOv{z#uAQaac3RozjNC1!vY$`e8?h3p!FADR8-4FbW^iRG$IoXSTR${YY1NqRuOJDKT z6kqVI@t2@<)Ab~B9mr-=ddI-mNWOi{=Xjs@)h@rpc$=Tg@)NjM{E}aK_&EOH4C&9F zExp!Pe1HE((!cz*#FZachkQAnTi~^9fOKcm7KvwpcX_y;P*ona&>l3dkMXs7ig%TnL zsxqb0OKV8g8^VboiHXCTHfQ5%ca`FGE}`vWyVVW?YZ~8 zReH5=vG(=qY>S^woqP@H_V<&X@#oSn{blF}?iJ!$S!*g8J>WT)8%~{q-_5c?ay9kE zPe|NOztb-wxN>~?)1}|~3F#N^=I3cX@n7OAA^s=;|B=zV{c?h<%K!BhC%*vUc9i<| zM6n0s*hXF4+J5be62Iv9pr7Bp{cj{*X0XA%*jHk|_T$o1@8W*>wv-ngJoDqPNB^@o zJsw36$A6H-_we{rTIZjmz25$gyT=vQiC2?&!~c`NB|XPu@_0YLy~`t|>)+ZhZ%&o? z#SebtxP6q_@VElx+2DESohNRQxf%rTRc_d@LEIK^-MTfe4kN~crs=f7SFyPv_Qi&I zkb7VS&?Z!|i9323FBwcTRA%(9QfqN+5g&eN)neU37z|r6R&H><^Zagz;fZ5H&4xP% zm~@?6NKf#C{O7+- zdX%qbuID$Y{JALJ!g2!d=|rM6HfAbzwt2Xw;m(?&QI5?wLf~6^tG=@JC2{w;a89jKf!dO z$!}fHy-<3RZ$qi;DQtH4m!9{N5?8L==JIuyfB!p)|NMwQl6uZr68+=$m_KsL?{nEq zCs!XF&FaKe)RyhaU+yqIS3gbqL2s~+@tFPEYyH9E7b5rf8|xd~M*07f@cfpTy^Y`M zElye3?6~^lc9@M2&L%i^iU@7+M#v_}3lpvgwU)#@=Svk=;1!lDjX2gFI*T@phQZ>E z$t-gjmDNY-Ra_$B8Y!oyzL`;HSR+?nY%-;9C;|_3$(ji>n4BsPOLLy*cSEcbSEtZ( zofBL&TYN?aZwWmA$;^#r#s_~dhm1)ui=q$s1B!@xI#1f4i4BjdKW>G&5`?%iWOE$16A@zb8($HQ?R%9sY>@H_(Vkw8-rI`8 z|ExMAg}GOujjT~Nx(aCGs){ zduM&y_&Xk zDo?O8izUf(+6>do6Q6c`yCo;TD~;REEgx^4U;BLNPoGu9bG>HWFN_U?jqh4Fk+?#- ztDlK+RrFxLPBEW?h{vg90$Mt;Ae36^NW;6 z{;H3`^iXel4}6NmvEB2r5_bMym22Nr`G%O^9q+detzHpVgKU5hn;^HyWre9{Biy`s zv)BaT`@9j3yRv1g#7_$=#^Qv~;9hKqE0S%_xn|Rjl7b7zqISv+%$O~cJl1jS7VxGg zbK$H>L)~#+`8;okIg`^9H$VswW_Ty`6$tYP=7iy|DF6H4O26rs2XA<>bnf>?4*OB$ zR+8`0opg1HH`e@$;tuzd?)5n7VZKs*!tG%l3Wm7`J#l<2?FA>5A^lsW+6UpH2IRecS(IzLkCCuSidNiS$fA0-#Sn=W%(| zulcI)$VM9W%<11BXpJ zzhyK&Axx2|Fqg40GE~;%Su_d^)~Kh>PCx#X#mhj8_lsj(ri(h!<^G+|ZvR`pz#=W* z9^4X*v201!i>gLdfm}d|Mgy%M5oT?-7LxXdI)406HA8J$r6<)bP>+&-p|R<8gG}!! z@*24`AGP8X#o=eqJM4f@5lnSjbQoh&Ky68N+EwPsCQs3&&V_1yziqW#P<9%N(4OA+aQ^q%AX&5LE_-zME(&-{aR7(3maPX!#%YMfY zKMG$L|E&Lj%ZzeWnr4&i1ONBwZr=S$Js4L#pEEFEbI?cET&8+SZ~N3ULi;skm@WB@ zrt0bY8G1v@GC*;^m4W7Yu{GR#qcN26ZsoA^Zf*(gT^wA!SOr;wpWS1F@^m`(*qDtc zak5&jQ?~M*ERxS~?BW!u2bl~e31ld^ira0h>s{vE^z_P3NBmh__NViMn`lQ4Dlw7O z4V_K8gTPr@`4qDIsgc$u3VP|Q2Xf07InCkv^XYkD&5v9r;`ABtzV`0}_5-><tjc?bTxq z^`1ykK_BAGaig)71_+0RjM(xi!)B>o@$5l+#hwMhx$Do!4RaY@Haux%Jn(@BJoxbiH8?@KQ?PCj&CtWny4kM#G5n*nt=r$I# zzkVD=k|Yk(z&IawA(2egAXlvPcYyL;j=`;7b7%zyzL1-CGpU!#lOr0~)>NhE$oFm& z4s6;G1BVJdxZR|CS2aG zz*b&9a^5&7vtzB{4xXf*yDG6@9}G>&fO+3)pfDN&=%L2KgG6g^#9G0yf!l zdnU;z8xeV5M$?S-+P{01nWDT1sdbI@B$`Ikw;7ILA|R0yXNy53%HZH<#3N>~%=7h* z>QDyP)Csq8Sd9u2bm0a*4Qc%OS7>0{AvOB2Ps$-zY?Erc;Pf=~8vNoT_}yz!-OI+K za5#rw{`u@hmhnycD9eXFYr;j8zkgKt4`CL1^0V;|*N#4IPgkD~+-9|-Unf6KEGwp9 zOBmAW-loz43Vxs-dpVsm*r*^)HUkx(&XvUlN8J$WE8^xL=lEPG|EzC8>)bBrshEz0 zT*OPTqV7k%ADJiOLIS}K1P@RRUYIYTHTwrHel>;X#Umsy!gM+fThuqVF?-d=eiY0U zd{#Ijd6#m(tCaD%{&BSD&GGX05AFIL?2+~>qjSeIN{nSRKissjL%(-dwN5|iBJIs& z<%FzFx2N5Xx*g?+VgL=Hl2UoOBF<{{Zxz=kAMT(#-$o}XBJ&X*+4(rPO zY$ngX^c~r@FcA4~y1jwoF~f3GNvNLxVol>{UX^l9n6Ov=Nd`&A7G1USc~r53%`d%U zXX~KOTje9Y_f?ydoL$oj@XVLTp=ryUvy`ts+bOE=R9R0+%jHK;1O`7xS-j|&adjHp z(~S2s^(f@$MO@p3+GWegijN^{kNGr3m1pfnN8oMvNVN_Au|?-mp7#H-mosno$z;{Z zc1}eEcOey1Y=9L3`kPXFQ_7{08=?;|zvr~qMorOkpS#bk;Tk!=#cSk3Y(a~OA*dMT ziGBV=4h0`5L@x9QAw!x&3i72F`W$H|LcX*`kFX8BSltdDl@f)4jwz)?7>PwFt08o{ z7zh$pvobv^+h}rGC_7th^~iXy{CkoqFu}*_Qu%P6mB#AT@UHXo{qOP2pBBXlR@Mc> zkVW#* z6TwTcS8x0@PI}34qv`j_{%F(>H*n2{ ze>0b?I6onW=8#aSh9B@S8Et>i-q|}8Zp9%qdVQ+faP2t_J281ByyO?OxQ`Wp?AS)l zcw4h!dExXKJ2l;~x)0MEN@cu)Gshu8T9Cmq#%N1AGWT_fHmBcV?T}L$tP}HBDF8KO&;Mf!t(>;RZWo zKuk5JPwvvUC@S@CnS9^8Xyf(#dvkexNvfZcmrhZ9MEIH}p1`^P1L8B=z{EZA6Qx(r zi_J5AmG}GuiI0@v%Zs+j#yj_hMO+w0&gjcIm`ubV~-nIho zD~h_oQ2PjiWd}c6$j}17q9%i1Q^5!(_u*CE>bW%}w?jOE^WM6RA{p0lDGp2Lxo)Ag zMzZ<_nt48MZf;q6BlG9)8t}yl9O#=uJAU^elpv>aB2jx!-se7|b8G!|nnFB8GL%F%yorDNW^B!>{5CEl=) z>Z7_ZIwtR1aAV&8sK*{T{XBtXLrRtCf36Hii!t>$+zoaozw=`J7SB;y@N1|?{^!TK5}gO9v?VqAGo3qL0W?hw zdJ}qex_lhGp+B&`U(&u*lgkgN!a?>I()FK^QUeUMK^Y9%27!6=#s`2u%F{~|98NoMmNa&A=D6kic*Ip6tf zN&Z>CZSNSH*gW%^*i1n_-m9m*J))+*rEsRVzyBHYKEoXo@DaT!;(${^{_U)}Kulqm zC^$&u5X#tk8-H1tGD|;Re`Sc_Ju=D&DgV;%%3-+0|Gb$n>b8xWD)>GOiR(TXsdNDu zgRXUZDt@03BB>)w*C2Nu^eb-ax69q>7GCENMed3~(+)(j+0KT0~JtPF1l@*uN z#gki?a|S~sq_!>&F365>1Ub`>ZtMB)1E;<3Yp2kHhWFNQCJ%x~nCmO=arFytPPIPQ zv^qU}tP?9_Gc;HRvzC<#0Q%XhZdrm2+fuj2N@p$rlIKFd2fd4y9Ha!P5YB-Ia1(+6)aXs zXv$9$zBrM0U9*b0a6WtrA>KsWW!hERwJi&{_Jbp4y4(yv4c@(^LvtXY2?n4&osBq8 zXy28bll&8|Re%3p>+_T{O6;vk?0Vr@{^a2!C;09Wm%XPdp2>CtJ}}k--4O@vh?J4mWKJ6}_;t-NjWzalSf4So3@aN%Doh z%LXHmUoz}mrqF1;1mGVU{G6kjWs_xjU#+C7?EBdfFHG!sWSJ$enK>ZEkRwr)I&H?3 zFSbGE>`A)M^S~}ED!Y1SNNyO3oTun~HI1i!MY*MB#c6AuQRHbz=xil*qW(emN$0%c))MhC`Gw7P5XyzqrLpPUCwpnZGb@ZK!d!OJwz3{ApQY=k+-^hy z_06O(+VLceJwg)gMSK9GYae;Fq*xgbR~TjG?Y1n=ghpOzFI)jZ{JUx??mJ4Y$9WJp ziLH$Qr36tL)CAxhW#WJL0%9WZ8G_3yT+qp;+-@z^ormUX=fZ5a!s>UR z?ErZk1k=4mnCYa$Tp%UkQ|OjHrB4lk-DE++dk2hL)2_`iwrbJ97i(z{u;Auh!6O6jnnmxc7JyT(%J2bzAoV{3M}t zRceels5+(n{t@v-RME(AI0}xx3Y4&CyryqU#DWRP>>woMW*QBVU2(=KD=|+KIRwh@WJs5&<{(jW4Pl1<*p#SK+M*+`5V@w z2A)fl_?T^vmSg`W_1HYFE@r<@G+!-@ln6Q?DOK9(1&@8jg`tRbi#n`I@x0e#T5hJt zI_v%cA_Q@sZH32`0oJpqGR(eqfl!)Ttta5NTQsa7&Vm(o|6Z$r_K&Rk9rGi0u{y1g zX4Ir`#vGdsam#Gz_UHm+)hT)$lM?^Vvt{Fp@;#FCKAb>$sXXm$7~j)xnD^@e4JtzP z<824Ef2W~qR~;MzUkTi2w}u(uA9^+{?tfLXc?{(+wK}7YK5ZXTgHlyk?*imdkq~YUJohNfzzdN4V)h*@>1O?x|z7RiW0e z11+3SfLyZbDNH7_@1+xXG0cRGvGE;U>s#tf_B8S9ut(E=eS1?GO=9=JIpQV=xZg+5 ze>Y6-aXSW1FHSi7H(tw42#FtN^Ms`l!uOWY(*?v)B6+-f;voGY3#!719z&CSC{SNB z0Klt&3X?KY5J9TP5olh)i~skYjFv`!mguW2$0EyOvNng_QR@0DdQs8hTj#{6O3=DxLa z=(G@=j7)}%>b~RGhEyPO!Y0x`No?hvf4SR))r(|a%vkh`X%krgP4dXu4BCd%5xniZ zUl{Aq>!f^dP)}<=v^*8@WGUMdxPq_lFy^l=En_`RpN_M3Dqoh~FQ^2nME{#@R*di{ z`t@Zkd&;TA|K5v~AtDq*Z(b=-E#e0P2392=eLLb6HkbVjF5s_gD@QoNfOs;)U7`fm zW{zGa2Fp>FdaeMOHL*jjlh%giDV8`r994?|G{;bW`GAe*A6QzMt9)KZyK6vP!wz(u zC>_oZ+2$poETnFrEPSVvO%9QL9gd{fw$2n0wDS zM^B6>md@%`P*?C*mp_eY`-p!CTPRvof;!-H9@ih8wFiJ&pj@)00KaTBz(N@JC-0{C zL(+bsBd%K)cerg^Z0Ad<49Usu+SI-v2J7m=+3jR3>?nCWIIS4!6uigSa2m}o>OYDv zchyilg$%c#w@{}SCtr)0%a`=(5%>lt(A>=K`(V8~H?=vExlY3aP}^_z0vbgbvZ^3x zd&mV_a)0-V8K5q3*^i13;{S)Hwc{UU~5+w zSdwv2kqyvGk7q|Y^xW)*+IClsTI%0VIv9d zi1HPM&1{}hCD)dG-;HIF8TN)b&^3hqcAS{Y5_0s{dx&PNVV4QL&5+zn&fGYxH*o~X z>V4s@4Eu!`)Y+v#Mdtw=BIal%pn;lmj&9}50GV#Y9@A6@@bAQbEQygy zJCjk{To5c9{6R=-CMz+A83#y3e{T?$%H80qGoPlAQZE znW^+x+gT*kM2@{zI#59XeKo}hi~0Ady3_gDUn>Nb`_B`O&9Qm%a=a}hp>}TA?mZXK z&7LcS0OzB|$KKBuFXl7U1G}a^PBdM5_`tKA=j$QU@wYrLT!t7O3Do{EmUDV)4i%A+ z%vF#pFu|?LyrO-?bSut;syw=X@@}ik_w0H3!7nvKqE+;l=IA1!*7fFWiE$|eT4Eapz`vhr z90sGZIvh0k0tr#-F3o5C`Em8TN!j7;HM}e$2i_o3w$ArhO3^6ffeAC>r$Up9#{(0R z_t%{_7DF!3y^Gz3igJfAfZhT8^Ghi+* z)XwLYPQ-^{irKRg>b3QERujQTB9jaE#nTAIuAJzj<~HodS3{Ev&#d|9l`(-!hMDCY z&*W8NFYplfp{Uk@-~`4Fujt1}M5m+8{?XamN>aM*swv^)(%^PkaAH^1H)4F_eQHp> z_^UeO+eOtl@Bmk`t#8?W3r@N&+xUA1@&bYJ5qpKc2jDOk>f!a2Vr>02++^d;Bfb5V z(ixGkUmvnwsUFYRiZY9D#WB$NRuMk-?cSG$ZJB{u~N4psfy-3vdOCL0b;mDQru3~I2BHrW{!{o)~j zpD6%NgLq>scgX9jt~YlZ-&J82fR@TgLK8smj!3*l&sY!v!)eo^^IotN1!+vt9i?b8 zdZ)m%Lwv1+wt`gda-1W! zchk9Fyu8X!iDT`^Kc059iKIuH!fxqJ zBaHyNzLPI)fOS`sYg;TMRz_W(Z$ONi)C5v`>!CM3Bpyx|;hm5|JAjOkd*t^FoQX&% z8e*MLSLyT#Rtk_Dz=OL)Qhe}v3CU+0GMVG;;-E!Ly+OknH*Dq&y4QW4*l^NvA~+5h z1z9ideT4T5XAeSb94HyIIKP&n4f?FL8uC0rcgV$!6l>^VqW?n0Vbh2h&;*q8WP{g` zKl#EIQXpOi`;iavrSk6ggv4cuxGwbu5kDj#5=pT)i8p$i|Fexm=K139(eGPB4jV>3 zq!B6tvY>PAFJbyBK=hmW$D)jg%qL0ej0wprq#e8+jmup+73qiy4?}xKAXiY;6u#g# z7ADK!X((i0NOZ)aH7Nw!HzG~nn3vp8BjQmahppa01+uF$vb?68U7##@#9%QZ7Tmz1 z{#K#wM2k8Ii~9ddBqJul*idiLjjR?teH4o9JN`oE$m0x&LEPM2B>4?4 z%e8(v<0w#y{za4*JnhPCtKx-J*mXV{kAsm#1BgSBdWS{wD6Dg?o`9_9IBd#CTL1dh zb|MbJBl61)d}8IdQOsDq)x{A)0%D~f$Q<@Z4!9v673w&)$hJ;Unm|Q5hj!P67&qMn%l+8L+EIwQe0}OV4E~L6LUM}-^k8~=+SVC zwm}r*BezB*Ahi1BBfXdGN{x-x8KY*R&i+j1-;Xob{Te_73Y(Tn6K&D7ipe8{?P!jE zSxF1fpJY0I4!&n!irM2nczwAWQB%SQ+WOM~B{3^TBhsbQp(Ls}{H2pH@o0HSgCd`^ z2+pX?vb&K!$2*}&?)*|$k|F*R^&{{ZP2Ar}=LyHUc9+F-iLXM4)UKe=l!);clsXFS zRI+mQf<~EW6Oe!K*Zhz=g+FyAgewG*pNdTMLvd;x1w)KEWr>08A^n7z zI~Pp^2yQb@e^-)-C$?>xuBy2=QmUZ#A^PN!+NQ6WRnU1)qUqKpOO}nfRGlDf3aF5(r@!X{F zdT89nTfZXpJ=L3y$1eRnzl}sZ!A_TDb18AK{CcLsl$tDPkw{TO^-JmsKj^`q2mm9 z9GHOE1J7Ms(2G+0zMw`@`{AAyyl#dK_c_*6iSq}cUDGqja%}Br+}`>t$PDaU4^;?- zp-{xyz6-U>J{!J0Q$txiX2f*y%p?DV(3DSW6gA>8=l0hVE%{rFw-TI(V% z^|k~86|Lj&F*|yzyXzI47MCdOoiy_{l-kfSWPy9_JPFel|;U|W=kh}dcyY3pUdE~cozqI{D{iY;G)U`VR zsQ)b;NXIC7TTQ#qP`SVYzL`;j7VQRT{nG0V&YfuKvv62Av@njviyJj8Mk0{If)PO_ zFpz8#pyWWz(1hZC{>54Iks*l+yVhQO$%;s2y%wO3NgE}ZP8{*_vQw+Q5skd{_bH0K z9|xW*;BP(gMmBPy;$u9*Yb?YH|?Rs z|GO7p-RmgkiX=*3I8>A+r6%{V4TU6P2C)%JnlxjKyK3k~h1?@{;BL2GUjI8%xpHQn zHq+x6d?@Z~H8*4Zdj1EiAI8;=-r_2`gQZh9z@J=@5RO}@|3kNH^AN&F+EIv3=%N^H zszfI2K%|Eh(tSeMkrl>U3IbXJg*Xy$M0pi3EDp3m&nXK~$xau~0<>!bcmi8+sIo>f zY>dAK!uZgzl(l|fJFe&dA;i=z@K-)?SB9aF*l_1(xn{Xn-w_&3vJ3N{HC-LtDug&p z;yUh20>M=cCF};pR~hpTb=nrmHayqgwIxaYN`MyE&9mAS_MV7Plo%mI+3C-;liRM6 z4AbqBWT0KCPJc)7aDBsV0;BQgJF87UQZU&@?NlrYDdP*#X2- zwzxE;-Y{cur`&`)61v%gkw4$%AG$jiyEu+Nh)~OpML*8VUJ?h0Co0!G8eZF4S>-PN zyO!mh#%mo2!u=9xSI{fT_l*;9OyN=E4EhE{4#6Yc&@Z?6fD^vKoU70PPWl;sKE#*` zzrmykD4P}wR@sT5rjzY%r*mocDaa-|56-!2`;*j#~@N^lUj^P7;lTV~oOU@^>}NtcgR&=O(&`RR~^JkF%KXZpYJ# zzD6V4}rT6a|J zuNj`o#fB3+##Wt9I@wPo-6Y7LC-;V+5;WY*JTWesRtd+(QehW`_&L3e5#s$BSZ47T z4|6pvysX^`oV*zp*16J=!ofRt@R{W<)s&5i#NZ;Te1U+Bq~Zd6 z;&_0vzRP)i{N!8^!sf=C9%fzRC%x>>j+l`Nv$`V37x|SLf~xp%)F^`?CDJX(y2kf_ z|AkcxKp;k+!xYM;4ZwFR{(A6vyJdUJr8=5w5IQ_on0Nx&=P2h|)0DrTAoA?fB5v7G1X!{=1X|p|-QX5AEA=#p+o^GfvJ4mb^hF z6(KSXfOrex;ba*_9+it4mZ{INV&96=buW|>k~_5vlZ*(Fzh3l6HRkH4v+3{5(Jc-p zS?^G0@Tmtzz}+#GL=+f+y8nJ!N-ZLc7%7BIkQ3C341kwQ4j29*U^$|ZBC3^HaBT>q zbt^kiu49*m7)80X1Ngh8*Y9f%jKxup$W{R0lNm=8Q4>j*1D4XA+{qOzY}jK8yuh`T zAueV)Xa4aX@*-(y4&5>TD8LbiZq1N`c#~_a0~>RLF4s3LB;XpHc?*DpNgCM8x$!}dQ5T7UrYM!yV1;<~zb^EUZ)!MJdg=kce!I*~7f(X?d&ed zfr`GieVu*MJ&8DiHr*E>(yBJIVkBUSyoHy44aWQCFZz zbQ2mxJ`$tDGi?|(siB?1vLGwI$o7{7V-}6jei57ZS(cH+uC?bUH<~3GTuDye9(AGC zWGxPUj?z&=W$0P?^9Y zf2rvE;*t8!h6CuUFi+!Kj3&02K2^pQql}8jPkzWok_i>XN_V{}tC-s&A;?59`Wn$x z_1CePhIZqr3`p?QDt0O<`w{cluZT)0t{AzzOgs7q#M{Hp=P;nT)f-%V0>-9t$Fv=; z-7ddfY&18ZNJRtV!x15TxLsN?!VxQZNue2Ile}c5i+YbaPn(U#GNq@#!{cGl8~98wo5fM0*JAYS*cBe68wp?5c9SgRaYD9N0 z`R^7?#SClV$?;Lu{&K7@T*yk?#IgQ}7M~ZSj_jE0sDhQ#k?cO>l@NYTEw&$)8`+y+ zt{FHu2DHge%Osy)=ivenHplroN6ijbDcx8(BO)};gFnUMha}ssQJ`3H0}@A^rI*$0 zaT7QVS^zk)e-GrwjLp7zaamjsA4XYu!tBfV&U}YGiYF*$#Y3kogcr>?!4AsPt+3!O zG#6CtlmuU1v>p7Z^W;nsj|kdD*1$_F!t>209q%hL)^R9}NLkm;y~vpuYPHjW3x+=*N2L~qA_Ia8+ovw{)b>^B${1ql~Q{FTOfj1Dx7-iW6| zhF8|XSGMUsSmK{*a-OuJ5Cu|JK7`*+7!z3HtGY~z`T^?p%eH%zAly%~*=1Loq`(bq z5w)(9)XDp)H^okFC1OM)iu!?RAx1BwVFFs}7Dv+XY6Vo@m);k2zHBbJ7=jaA&tsUJ zIdD5oHJOYbf)rsXKP=j4$?EN7VZUonJ^!N>X@$Xb4xAK6A!3m3Pwwg=QgLx6!{jfi zDwO0?VRI8Yj*lQxlG_~|@`LWdA@RN%Ag~L0Ahj74t^{mPZ3%(wQSmLB)Iw3;hv{yD z$%)Z0o$<_QV46!LNFJ~U0AZ-SeEe$77R=sKz`YpP&r2*9m+s~u0R{)CRYp?WMi>=C zUCOOcG6631E51m|LBRG^3~BVLFCmBp1tWBM7ef#5h)*)8)LSp&8TE4)F90R9ThA~= zfk6hY!+9pXbM1Vlb#AFW4D5KD=fjlIZ0`^^4<80Cy0)e3yrJV`lux0)9r#t)`|H0F z=!i%%G`!opT}4W9u^OFGE3nc1;07mck7sPQXDuE{jR#!O3pT5ILlq)>wANe0pv;rV zN^sgVBkB2XsgN z2vUj`sI_k^qmx1rnhYLs7zXQE0}tFalSS|Hh-o6yP6SoY#5NN{oiMQD>-|&{SK!KZ zUf?5K5a0h*tw2xJ_uPYaNG72=lt=EHH561QQ13KdUU6{q7*K=NbiZ`964*(18%3Tn zC0B&Gj0cZ5S(Ok-da=c1S4<6E_&c(H{)5?@IbUZa--g)GEQK|Dc_r7xju=QPxm!Rd zFc8cdVLC!&1E@fe5)*~PlbT>F`fS`i1>W=NKK|ouM{yK?Op(oSw;ob#6xnaq`)Hfa zZJ68t=!HdOCEUFgVr_CI7ymnw7HE`TX}14d36yKes7OMi;MIy)?=z$7UCq@YnxH{P z{?bQ5@C#<=vxO_;j(eKV_;NkxBCfy-Vh0w`tE=6t6}r4CHa zs89PkxlEAq86FprfH6G+Z7jkU0rX9z!2NL*&ov!SdykgoC5IH6hY5M+)?#v^=rAx;|jnp zeF%-$^I%gFxNVU(<8=r)w8Gt^SA*YrQ^pwcCy(*hg7v9 z7Z|9fHmL+LP926aTj{wM)>qv> zm<{o6S}|5?>V1jrGBJzks+xNbDlLxUE>2Uf)mxbgLiVP5IYFHgvXuTjg!E+Dd2=Fdi%+`H~?s#Jn+6@gxCko$QqJi4b5{8aY=s@CbSI<6|<06=D zGF22zcNtX&3?4=oF&G6-a=Yjqig&}{^xV;jH0o%sI|YtNz;d{;%=*Vvl*h?`ishQ( zA=#18;ms4mP+tsd~~3yM_m zGp+la=V0Q^f`+TXSJ4c==4|Y?fX?s*e{pw62~nV>L4pI_e?|WLg=(L!fnLqUO{3@W zOpVJ%1;}rZre7UAD#SHQr}atwt~PcdbtR-et?qg&X}3=pjs@NM5#!T^JtVvp>75ww zaKsPRwY8>arYGn@+pY><0s|Ic_E)H&@L|s*w$spFQrO%OXz__G;E|ml`D8PyKAmfm zax#iyR+aFgN^BA>>+GgcVj=-DZxO!EIO93ddYy8ZXiH+g_uh!O6se=#Pa7+=@qqJh zj4ER^IeBvGtGt9P!LaQ9A<-Hbe!yNu>MWeUJnRuKw_Nt+dRr$vP+xMP9nYa@P%Av8 zAaIL4LXlc!_w3PHyu`GR*-hNlZ^uC{n&Dg<&MxQP#wcRL_=4}Qy*n4I9^ICw%k_d5 zW1XU}8TH8TjRhS<`l8jsM!yJFt3syXAgi#@n&l0LtVP&wMO=rD#BizBVa`NqH-FdO zU00C%jUvPyRa96t10zqXo>L8xy6wYMIvW&Bq3WQ(rL@he1TqMSPv51*gny6}0>r-B zh6;Tm%X&%paz809w_~1Q_1OuV7P~)G2-lTQn*rSd$NRg5vuihV5HczxDK^uBrKZWl zM8;FdsCCDh^|Ri5>y>0#`{CUE<<3QnOMk_9ID-NH> z>WkYDYtQ^$#6U}bl7T4I$AQfuSw6P@D0dJ#BFp`j-w5C1&Oc`7{1f6dSzSLnU#ln1 zD?7!fP2t7x6{#l@=#W=^8~d0(;vJgzbPHXc>*cHT2ku`vF&efJZDX&YM8e)c*837} zeBOEHn@xON_(>bcH429TE_*+&r-7FO1`@tQc4^%!gOPW-`IEda6AvLao&kcdkBtMo z=oi83=sOVvHe++$NxW#4C=#s{rY&(Do?-FwWW zzpSgQOW}hri{X^js|=qL3{>^8){?%6;{&wsgGk!}xxX`kFp5xyoeHJKjkpqjqgrpSk} zxb~X+1s@(A&j*{p7xQ<*WBg<7;D102BdnRTNEsgy$p5g3i2i`k>Vua>9n72JcDKL! z5s!1Tk7!7aaKpU}(=xG|!i;}JfbX3>l{NK)m-K@dMl+N<>LVaGm0+zVe318%?$!OC z#8T=$qE&#%`G^0*IR_uk;nkbr-u|$Fvi!q>qnBGaB z+84!Fk4(ZZiG9B`$W@E=L5G@qyGu*zk~Gmhq{q_fgAh=_T!`h4RMcf86^rTg?CfCO}?FT+0jUBm?2^SMA%O08eY) zbQv`92wZU~u?X1DE10F2V(OSB3W#=!STEEHI8wM$us-6!6dkZ}>k#kG6`<_z{=N(8T`&F_q`nK5!V)}Gd zv}N-!*<`qu1wY9ERt24zNSi@@VovkvH3UdL&fIOnAO9~O)O=i1tx=Jn&ngMt=eMNlZ|U!20f z&OPtqIU4A*o+s7T9z^~>xxv+gcNxP*19dyurMDr`F-|E5yqc$)M&Dtd2OQH(DP?3w zDWyB|tpOggcYx0FbNFB0ep}AGH=?Bh?^ovcNtuhM#wqYqu=&wz7xQ;ft-ch7%CyEhvoAfR2rfBKol+ZsJgGZL0q*f}v69U?;nZ zhbv9Cb;y#Q$Vm$ukZYxnl8(&~`KEC7lp6R$f&-23T*@tEGX4v_rEd+?PWwlQkkz~P zG1!|uuA|J9j?yw2 z&WLF-0Yb*nRMAqTry57^gPFKC|MGq^B96>muAL5PEug-K^cqYcyY~4Q7Qh5&=8tfJ zSUQ{~_p=QZHPxK7d)uw)wwT{_S__f(moO_+?WymNRV6$3qv+cJY=y-=aX31 z=OkH^rh%GXVI8wSU#kMIpK>kS9Bx?>(_s?70D0r6E1ocR z-N~~&g7PNonyXeOc1=CAXOacNzvN9s^;VzN?6RB`p3!&(dJp96hMNi$^2|1pevwj> zelK^Mc4l@PM$(At^p3z)4Sg3Q_W!1E6(eLM@XZq5^08A`=IQQW(yckE#cWBnqxxXq*B<LAYj0`xfH8kAfHJyWN#IoDa9%NrCE4FA&TVumKOtJ>A>6Ikd-hT^ zIYzK3Bt}?MV6PniX_AjVlkGx15B1Z?2r0jWz*ar#@D-^wKv@cbxSMzRGc&|IeQ+iz zpr*gG<0RFcZNg>(2ENjIXA`EE^87msvWy%1tAo1Fvr+!J&WPai{cPG&>d&cIuxskt zqM$-LkY&k9vSl57P~v`R2L8d2Ga#KB+IfR=WX5FaK%9w--!HGdL$!E^AI`s8Dt+orRNA&~aA zG1{*i69jomu4gJQt4>=Gw12i41K_rak_ml}M-wg&PnUZ{_ljlpmnL=(X?I@y;%DVl zq8fmtw%c|xg%kh`nJ5>iOgf3xABGq6|2MJyYt2D;BzrspBX;Z?b31y_Ao=?WIj&&q z=Pj6Or1+cbzxe6gQKj`z*&9{nV^O8)cpw?aF2Abpazi#+F0o2(^65_0(a+KSVu?gL z7~cbJ+00grJKQLF>eJy6FyVeV3iy`omtVZV!?y^YQT}$GRPm7q(RY2RlwIo(so?34 zYgS@V8O(m98}{>^-4y3JCdTG+&AtKIEWN(e#DLvUN`{W^Z`QaI4=ooV2#Is2dOTI|UfE1HCR2(fdWc}d!(qZzn|ie=|L_PD zHx6@*XvolXaIQN4rGep}Saq?9r6eh#P1!E|e!WeM@V{%TiFpA2xi*X@5K)Nw;~9b+s9Owr#!X zNuPa|Iqzhd$gGXA?x30QDhR3N@8ng!QesJ{iS5zqFoPWQr0A!aLK}kZmVWjd6@8P3 zno~<#<27KpzS!{i+aal%_S)EYCyHDe8Juck^+vh`cA z+kpJ+Zln5BB+ib%cl;V&qxz5C5*OVp7S9R77W=aN~P_7Sq)iHe-_Lj+3kEWX8+xZEMy+ZfSitBgL3kU={E+k-G<{C=krLWilrNH=mBwA?V6pYFqjSA12@Y%(65S4t|B$7MM35k zq@I0Wn74@rS)?8Mdiu{3R{=X#xuGgi9KY!>4v&-57o$#lKt?p^pXGduz9f(5EEJ)2 zHt%v^yz{PUy;`~%S7w~6Ak!0!N_iAm`k~V_Xu~}i-%hi=#gl zgY-Pb-y5O9jWn=i0+$N#6xc4TU&-$7cBuCI4Y7SrSlQ8$d;eZe_6s^h4>i&T?l4Lj z*f1Q=spgt}WQVxMlv~=lk}BBeMJToy6n^I+R}ANt3&$1)a-24P1g3>28Lkn z0Im)9(ir+HkBRMC(gqO0wqWAUk6X>9%)3wFJY`2TJI4T z_Z7Cm&^R8eA|J>|;TS6sJ1MKQtm{edFX)lKl=niAnPr;4zWLlelhOQM%94FIAbyjy z16K{RtEpJI!9QICmjYIX>=dG(=9COTmXt+rI#It71U;~0Nboo4nI!<4JoCEV1BgfL$JxM)P?7cbSqP*{0jU_Z_E`LX}mQ zr9?;Sj^u0X2dAwYC=?on-cb)&%<$~#mNqBXS}TSOHG7m_S(6Eba{HPLbE%^KD?enz ze_jwZ&iaj~&EA|FNrt@I;R zIK8Va0hZenyQ+OttvZu{9e5x;fmo*s9Pxp0;Tb2*NI+PHW}p;S;gg!)o#@O&urrw| znVvq9(;i)|YSnb-AOkSiHa4R%I0itK469{f!J-hd_UC9V5<1Kq+GXkWGfYg3u;MDv zo}Og0cz4R)G2UYOJfcz_+Q$4e%-{n|5ce+*!G{mq$>CaOXuG^w*+vU$udNFfa z{f#piL|{E5yGZZsBmUM$T+TNcjhdTq?b$w^m5+8fxU>whdGEh!uRfdd!wclEA}vupqx$YVDlm*GZnm( zoefj$=aU66_)H%2Z8GaJCmH)`*{MR7c9Ve#MAZGV1p=Olx`5#ZbLg3Do;V2yn`4!= zFe4ra5MtFixjHiAPRTUvp26T9QQd$9uDWU~d;OivaJ6GP@qDl_^hIYPK{4Sa2Bnyw z@KVhshQDPlB3z~S3$&W8OK#@3|L+BW-~6scK|Jcv3t%TZqNBje7_>xTFsY|+4W4Qu zWtrBBkaai;aL8{|6Z_eu1e>6&0G7d-l_5y6t>kqYuX{lcd=pt#T=+r#ed6LdDTW zLZIeehyTaw_v(JRZkNOROhC?i_KB!}-p9z3R-^})lu3IMB1xcfepIL~=G{`DUd_S!)H zsX?K$5QJJ2W=}I1>8DM$uN(xy@zL?@Q16i?G9B@1|LPvMqv%}2{J`uRq5msWb6j`zwFUkk1JV|q`YocEvV ztOB@^jg6il!0&0~Tf7KucS2dMX5t@I93-flo+EBXlciOL$ADT&a5(!W2{-QmCEh zGb=Q-5!s*?Y-Fo~k+HZ*gkJ%J3j*fTLcYQ66+qsMYj@9CQHylTnb29~6!~ZL^B=Bw z*_SGB2CnlU`qy}kBB?hh!vdALOBTj;P?v>oOw~5qKa0a$@ym{jMgE1i}F%b{@e|- za@dM#;CYl42Z&hYmYws%7??_(3P79>7eyA`=}(sB;5$#Ga1S2pTo}Vpynj>g1<+>F z-l{f)0yV~cmH*hn>=!=Gk8`#tl6LBpWTW*gXs5rx19#7>*pKunx1RY6VZ|Ln24Lts zf-KwyRtuZJ8hDTW_^C!xVDfHeo9>Sj>qk{o|00Dg<|r-W zD0XZU--+91gcWa^Llp2R*xIHNI!?FEVAPdh5%*RnO^qF}awvcq(i}lOHJNiTIyg)v zIAy|S!M`s_UBMw_V9R7Bos}%iVtj?J3XvYn~tM+YVjs{1jJJ1eky1F5}1p17;x`c8s$ZV~B8nlMz^ z@x*;a)+%nknu#Gf1Nd>Dlp=n=>q91%VS_Or0Y^^2-q9aJ3I*GmeZU!6s;h4?W@baq z$l>7@4_EL}O`FjxbCHelnFse9=HVykuw4vWD^G$pX+$ZB=qyn@*6$~ic^(66i=*Z}xZyZ{cE^5agXN(kpn zP5P%a0+~O;Ra}i+E$P{YU<^% zIHOWh&_*s?gW&s9fXKM)V{dLJ)Qy2KVy4i*`myyI zlx>>u;b~v+Gb0&A?tzqIgMLcPdrf~N=xY&m;zZ+3lyaL%R&gWm=jFR>lzQ&`JErng zAc`+grsddkHa|3R#&zN}ji$?`@W}P@Koj=+)ueg4aM&A( zQffRC2a6u_R^`sU69rnt*T=m;jB3}`Yos0J8yS%AKQXe{PDH@9pDu_z7eJ2Ze!?y*sH=Tf|ApQhaPa&oj+@1si< zA?zy2+l_!JlCkfp-})?ISCfH5p5LBr2X)1=5zBjkNe`*{>Ps}t`|N)CY<)S?B4T1h z?ziD}B|)YK!0}iSaf8J?prVv2EY#0h*w_$J3^!RBEWV#Xx3tvHp zuNMC7R8TS9^_JLQ^~Bb&uO8#hf8{zT1tL#+eEYq75W`6i_xouy@5;t3ZAX<;)#!6? zS;Hj&n!q$aT2dA;;24Y9wBWW$&H3&?O0rbr6CzS*LS__K5y^-DDq?8Ov`7dWp)Sm%z9s0tI`3LqC+UaYxnZVZmEKPb-Thblerp-mWW#&t3eg?Z& zuhE(JGshSls9Qn;HPxC~{u#7L$-%A7%U$6RHM%$kre)}0#7U!P7QNr`lytr=SU7LZ z`gDJ|_~sU~=Af$pR86I2kTZ(?$r=#V{*}x`I8RagLUgLtM!8+moR!t8ruLIYwRe*}*?a!35gVPULSSljae#a> zo~%*Z>RN+;Ls^wh+ul;2_0h+{0=3>(mp#E5qkR0CPh`29mDxa7S*!CPXaQ}C*oj8% z5>Q)wM~MYe0>4c%DyKTDZHr*EyKBy07rC6e+V~_fVy1CG#z(Lj2g`5W5+e`!O%$vO ztz-_o1f7=LGMI4B_?6a|H-;@bLYq-hZb(Lg-V@*F{t{iu@sjW~)dLVwL2!sby_?op zM6sGSOA1aUV%3D{UR12TLpI7NxsYjA#SK`|S#`=I1JpB|8g_s`~KF;>d%R&CMFQbk?bg(Whp>6wH zIH@a)=FAuK@;;89SSNYWr=WI9*%6bMaT&Izy%H_w#Hzl{gPI88l>;2@}K z01Z>A-vP3iWj+S*VKJeO>|4|W27bf7+Bl=ZR%D~za5~ms0!4fw6i%jAMlj*RN>_>s zpX#cM4}YUdZ4%0PUwy{N&x#Z4F&6E&)xm>a(Fwi&Ck#OEohbkrHd~JfHD8=!{HTbj zq>a~u`Z#Z_H$$_zLBY7hxqUvxc8xmR(wln6h7DB=Xk!x8_2qm`RH5kg>#DP7fiD+N znA&_o3PBdjIL7$e?RrF4x|dMM&xsmg!s_CF%0#}^-*C>DO5d$+`^fzF7YpSoJr3$% zF)Lr*y5yTZOx6|y2zjVEwAs2(rD%$#s&4(gL;4#>2|VM0X0w8~*xo5?R3DwVoz5HX za3b9@x)pLEZ|*GlCPRXWgwPC|nH2)8p`6MQLt}2cNkx1(P&I!e0!*y5Cwk7Lx&ymq zuX_)yHCshiD^U5Y=*B_1&|9L+^0)oZ=;Lkjt6q|m=FoOX=qPv_U{@8C-+>W#$FKA> zh=si!KbluyHYA7eiShlu4P8WBU`Oh(I-%fSk%DY=qUQ~v_t0PZDfn(cABlTNv`x8T z>!!>hK_kCU2>%w!kYbTB6Ym2eKM9jyJC>MY9kSgQd$yzvi(UV#oU6xiRi$LB+lji9 zHDtWt|I7qH@hEeZgQL($z=FRCX|8Wb!cgg=_cRWpg2vv|@08oBn2w1AkvOrOhg#1w z*w<_WC#=S+^3}T%WmW@^!W8q#zkW_DnhxIw6YkQw41xJ}pZDd4UgbEt4+Jd=oTB4N zL?q7AX~#%!{91B0;z-i=B~=;T*Opjj4ih;8RdtMnq=on+kL7Bfy%J;QE4$ZBE?V$^%W{*oi=XYvUUh=W z%6ewGl^bO?gAhn8?13?-7V_9+%05Wj7IEx1J*b6jCY&cZo{kQ-llv@wAeTGtP?xt&!34U(Y*9IoyjBHF-%2J~FnmfO{gZ@6eAaU4@jbwxMlBX=V8Ku*-yo z7Ou#=IeecBD*;k0gdnLW$<(TbVeXWU#shOfYqGyq1@2(VQ&Ua7`}$KDcAkUO@UzGa zk9OH1AILxAsn%~TYs|XC9Z#u05!?x6E=*Kk`=5Ntg_iM2H2HXj?&w402*lW+GTP+* z4ktWIcC%HC!&DMzH!#qS!85p+ico7fA}Ii%;*ApfJPw5^R{{Pv$?K0Dj_fJ>rybiO zD4+b?y8Sx(pGK94cM|3P_+h*QQSar+?Ja>^);RZ6(5Z{DhQ_buX~#t(GfiM*bPYF8 z)4@C?BFI$k6o6`LR7Zndl6E6s;l5acGBN`BP?0xNxAzd(g|_R^SutqjQ9qCGj?haC-(7M5Gsu;e}Rqe>`#IX}xQxd!HjX#xg)-3Y|<8bYOs}`K( z25j7hI4ui=ir)1kFXMvEEpWIxkZoWnz8Y8HX*NMJ<|gf9kfBaEUN>izMm+(qDbE0n zTp_^|mLX*4T%Q8W&^4i*DZWr%kvHGUn?ct-cbzg!dm&P7P(^jx0L&*~7;}w@F_h)* zqx~U8V&DO*vtL7VPdJJWL?y6(!jw#uzE3NSW8ECx=L-rp$eWNn?S+~(j>dy?WxZx$i1cQ& zE~jX(I>@-~RmS4`Z)y>#-(FOxSSF>v7W$Z%n{k)fh~gZwR50X}>{y)?)Ag?PbiPr* z?dq-4)WH>|`wB@DquyJLt5Uvaw#_2|du#PLl@!UDGTad=Wx)(`^`F*vWIH zZcuQocc|G|*hi}qABV;wysjJ&cghQ6Ks891^qLEn*}`EG;_b^T!+2NxaYI8- z^d5Yn5Rm=t>^fnoTGNJ z61$G+Uqk$e(dNS{yc2z6jk$faui*+7*h~_bmLFnJic5)u0V{|cL`Mj_4Q~;+KzcPi zUYAa7RF0AJwF{*>je3J#Ng5Qap^0VpQaM13;|r!kd%Lun8+fq%5rXinfwhg)L#`Tl zl8Er=K%Znf&=txY<7K`FM}veW2u}w5^`DD^ndGZu=|OZM(9S-EMgh;{|4L6~Zu1AY zv;MwbwMXWvhknOjz=oLpdB<6~3sARQJm<8&5!4!zWrWEaa zCUv42uLmzli|?`Jq5q>P_uXLe=$BbWPB#-A&gDc|fezCUXU!aZLJm+z7Wc~!xG!0` z7ZqXMydjGbPQ*dW_5qrX`}!H0C>}-9?RL#r{rGpF{|9V;&opMBJoH5*I z#U`ny*;{4y2XTJ~p;g22^zbYr8d{-|ZD-9$P(5N}K~ttGo4h!n!ODD3pDTS@E?Vyh zI6)yd8jqq--^*-1;RZR*u($F!I0fV(>Dh zC#4BMLhVCZ1~Eok-5S<4o?V;kQj((mN`_K@oA^2tJbg^VE zPfButgaB*^=3ivBI6XLB184?=>w>mIBj=Ga^7n`#6sAgA*lB=(&t_gy6Po{p1Grj~ z7DCME7IRhu)d*q|X!?(<0_?A1fTk>dl{wz)IQFJ>S(U%fzjTtQERJvTM%P~>kCE(b z0Y*7>=gPkKP>N(E=h>QFW(J==jDJ8z@}c>2tSW$#Igryfs2H;XdP$++QVL}2?)O=v zW8k#PjA$yu>ZfPwr% zDolIKdUOT_` zpy@9H(oF}1Mv}=~T{&uiTzoCW6ooD&Y5jCDta`GTL;nxBO427I-VJtKBtqN@3zRn%wFkMygS{@77XX#Zxb&BvRlSQ(WZvo&S+0-{Z{H>Cq2iO_8 zhHk(S6dYtUif__zlm^It+p<^Y{k z;s6(dpBMp`t@ovbFZcszE?0m79ZrI-@^04dx=3%y<4qoC|7&}3qn%2Wx~I_9uHn)5 z>k}(p16^(R8_hcJhx8{+-6K?}Pcfiyp94gr98Na`yo#p*cuc&a-E7z}eCe@VlcK4j zft>E$WK4-Tx~9GL-^mk?Tcnx+|K1*t!f5xk-#rKZ3`;0#UiCzd8qV!#Q@cL=(v?*Y zonakMvkm0T%yFELYn7NMCCx^03;a*?!08OD35p#$MS1|84jwM_OzpvvI({W_!R*r( z-k7&iO@pim|MmKWW4cQYGt^&^ zp<2EFaChsvtjci6PE#Wf2M`_wjSqMB!UmeVQ^mB#|7y*Har>zTIzu?6pJweI_pZB=#ng8}U zlB-A?j+&pr(hX(MWntL+iAMRFnC#UeSOBdZFb2D=Oq93~@M3R6dNCXoKpn(B5J`bk zOG#Zz<*MW{8NM&#o?khi_CHagwCzGP;M9~9>Chy?>2L}-@Wn>zEfdL{qEf|eXZl^U z+z6}AJ__tHRo}f1SyZhhp!@Uum;>8eoiT5xz-0S^-QsKX>i(Ojzwda$`NwFc1%p-e zzQ9{I^L;e1jB+x3o6Js5k?d-9^Ipk|NYC*nuT|;=d$$@72L%cT6s~13A8qDyexAyF zw19^0krIT`LjOW(XRYN5CpCAC+gKcdFEQs?pJ43 ze9JGw-v1Mk>Snmhqp3&rB;L$h<-95ECB6hWIN-+v0PSw4&<#!X_3)6q?xsA%Kr2_knBY z=O)xZ5FD#yT4FTnaG=uguc%>UN)B6#R(sak?VXc_Ty zcuzK$MLxydlkcRz3h&1VT(to9ZLoHibd%>wonv}wunOlr!R~ymW0Fg+1j1!^GUZpn zUPiz{-HZBrS~Z_g(?HD29J_f~nb50onq<wTC|N9ve^k&1Y{v<>Bwzb}I1b zCFqZNFpvPNUWU zRTtQHNQ;H}HcC(J$8_0(kiQBT0S5{6JzeIL#DSQ2$3~bEODvdhtEVL2e(EDh@J9&m z?2moaCD&ePZ@=#9Rd2iD>Q!$&V&nR!u3oq9u4~R*cjB6}*PXcftaT@@0rKV3ldk~a z_LVOd-JsX3JM%>BPb_>E^qFVe^@vUDpK6@zt;yT2y{f;xpZbVRwOCI6&3A1)X=!oL z@M;&>HVU?V9;SX_a@AsR5CjKE{JjQKGKlTF*s++v1e(CaT4Ta*Jmulf-o|d;A9vCv z*IT{nZ8u!A`mL+aI^(Wu)|uF6o|rF_%-{M}+8N(W&iGbx{&~rkO9r@PV;XedyeZup z3!r)rC8lKGycwH~*lz-FO0dm&=O-5c#O>cYBi7NVXAKMFh>I^~aa{b=>#fe)`l%1U zWc{NaGP_zNnXVL5Kg0{j7n1t^)1WQl3FN=0zybMQ>F_kkV*4x>9D@l=5);05_)7T4 zKH{DIw@%u0-8HM;cEtLNp6X6+5~h;;n=xs##bhPXjYfK#&>gxrPVf;%T1jgpJw)lL zxp-RC+9Kz@0G(r_-^m36Dmyol(yf32`|i&{woi8z&*A-_L1+r-kOCW z;m;g)_Vz7ybrLQn9+7(G3WUi$1Nopq%PMHg8?~1sJ5ZJ|VK8u2@Pyf;vvzl9~BQ9S5)PCy2Hf}rlH+Y^{wixWQeHR=H zfgn}MJg)fPttUJE-P*Tl67Ana+usSC_}b~0l77|OZgkk1x2z#?`Wa`k!(PDc2scz15)@+O}9^^klWF+hR9Z6G{r zTemQ^TPwk$5Z;9`M`UT^&OS&`Qkn^kFQly@BPR+>&ze$5{Uyb+C7%RaE=jxKy!6vg z&zf~-oOs0gi|fj;{t>_Stc{PXD}&=AI7WiwCQySBsWt`qZaVDXcT0bqD8c@S?b`&? z#I7E8`$xRvhKH_s>zcFHotQJZwKcsxa+~+7JdWW!4LBGn`?2oe;rx zi|x|{?qnwa>h-5Q?AeQtKWWpA)~a$6F9~^yn)eGoD#>J%RL}~20Az@~~4$O^q z1|EbB=a^8YW64LE@;(HKh%7}!qNYcaW|AUl@Pl8EHYGPfg-%r3q=-V9Cuqd}n|BNgI!1a+~ko&pacI-998&f;nYK z2@)j3(JF;Xkzm(>jBGrhdv7se`*i=W&8SOD)P)0*vt^{lVO_qGtqE2*f` z`A$8i;rmW&zk@E=Zn0orrd?~z`o}!%SvOqmdwOM^2%hccU1oPMTK2)9 zcdJ;kGl>RHJ@ zBxAAtdJJsGr>Kr8^-daCs_=|l8%f_Lo&LqtLfG|+;5fU%*eSuVVnO;l3hc~xRD)^k zG|*z(FE}B>>aRTP0eA0DIBCOC>o0yv>fWAr^f)aQ-Qa5169aRln*@~-3j>9n$+DF2 zld%bwvZ;vJ^>7perXb=RY}Aa35h0`uF)|(r|xF3m_?ldM|Tsywry%WmB6HAKcft}SP zA<4ATZ*UoGJmXbGvpy)PrE|Njhn18XnRvJ-uQm{~us%X1Z^uZ#PFt}>-pUTK5#T8y zcsvGOhoqgQCnBsiURB_b+J;5qd7qC`i3WJJq8FjYQfbJiJUIP-w(W@^(Frs#}nlOricH9C=#KM4_~c0(0_^yn4s)TiWdFwNv8 zsiuTY$?(7?;Y1M$y~`xhMRCGBof95~YjZ{(j*ekR&>P*y22o&xIBlV)juzOS1|CjH zp!)(R3auRChNE~-LPvnM?Bo;sn%U9fo1o0ujMGt?_vru_8a1NXcK}P{q zCMe9XEt8%)ebiAp=W`+Y?zfrX4%OW z5(HT~km1`AHr~WE61k)7@Ss^yz9j0%i47__+*D>fF{zZqLxUaXDy1(S+7Uw$dN67+ zu8NVTJoJ=ydU8MYH#V$)!~>s&!Tcg{erO5OP*twnhmF0mws3wBZKqI)PlMU@ANls9e6#b_ z)6-{fb(SU$o1u(R)HD;v^ZlTr*+ zmv$lee83!VHF#!HKfZH*gavp(_X!YP`HGFa^0g|Ca6G2Lvz-pC_xg9=^01?3F zQcMlIrvfQ}V71$VTgP_PHE)@qOGmv^{SCWf(OCw&Mho@rL!FaB*P^2n2EFk*;)*k2 z1id#nhM>;DM|%KWJURrW(Z-I}ID>UZi!b_Wi>z?|c{zIHMNeKl>?-iUU z!8yZ$Ab3)wL07I~Bd<&?a*zbuB({AHrkB_?7oGZ>&%Dv0tKV|SIcMFaZ}vAjJ(a*% z_9Ao}po0V_uT*tHh^?f$MgnzsZG>hrTBBy{{3#ubMW-3xQ4Og9kr@!L0mh2McAZKMVc*vwU>YZ?CC%Un7p`~Dq zZZ;LN+5lZ4cKVjjXje(taUFThW^aMy8G#rFx-&4wC{z3!Z<7T1l4D1~qv0|O9^5o3=xGT?Wq-kW zId;>A)B35uzMco<`Gvp?1jA*JZ}(xNzTItbP;7%(uuUdEw>%Gh<_{in$eZh*4YKQN z)VpVPLov|U0pUsrTN5SIYn-8QXh7Xti?Kjj=jN^@187q|+7v7z?FHRfwhV46niMV3 zlg5tQh}y%MWC#ZoP3us=XxGsrm@6H6ypqwLY6qg;S5!!B42d_k3!8!WjQ<$7k;F*#~AZEe*SlZp88s7MvRz5yu0rljCv>C+Hbt~4QBnspM}xauJzMgf+x zesC!|;*Pv$lu~CYidW{4GF#EYq6VIdsD>(YxJe!pj+o_{XTR6v{w zOJCu@$Y0@gP8Cia7uycO~aDZlZ|qc2(i^SAck!R3(wA=ta~CU55}#Q$z{$=o4EKPLx(VsnxWqQ#%0_Jm<+tjQ^xV zGnS6sVnGQyvFKybt+ye;%m*U!w!IL5FC`%B>yvx-MsO%cF}pMLyI|R?08PV6rp=FTHB3N z&=B`uqJ`#oTv+feDpfOG9B!IF9lT``vy6tNUMmXY# zZgMy>Y}{c39xYS!9PbsN;xl3uH%mwL2?zBxE~>Dr!7zq^OubEl z4CVu9hu(fv9O!UVoY8pj>(Qr=`eNcS3T9}q(>82m$8Fqj+69kTwg{|I7(L3;KnD~q zEtn0sG@AphpYO2s3+@bSwmkk}Z!`HFFe~j2JmXjs2zGaJ*C{*-8<%)gnD;am2gF#W zYC1fCt|RJc(M~MXWMkp->5J(4B3w^eGC^b4?ZpJM4p2b01xdQ?gy`DfXM8M>P*$%= zJMQ@8ws%e*`?Ta0|B$@?ZOLE!ZSulbCVvdP?C+Dmdpo*+OdkE@wEuPcG) z&3Dwg1qWjFmM1>!t%sho?k=s~^k7*NFiw&Kk7r{t!XOup0__B*2-Znbtfb-Ngk%yV zP}o)6#7T2<`kY^@_vs3R!M4uUS(yX}O`wPf5)b28ce8!O$0|AGkmSxkmOSRE$sfKf zdBz_k_xzdUTGz?woMndruX*j{Cx1S9_6w31yrO*D?eCH-EZ}0)mQb>g6qcsGp?*Zg z*D2Z zY%GF9&pP8STTXi5TVZS7!M0Fn(3S~HA9S$dgI>v4!PGIa^$IlzmHcO&d6!;qdff5) z=n}?rq&thDJH%iH-E->b#YsvHyE592L>~v=8pQ=QjVQ%!E4mhocXQqEc^Yb&i0P+ z5EkXB6K57*0lag3=vm)n5j@~Zu?S2;+kCLWsk08TbqaIIzwR#C?3dkPkR3QdhhBp# z6^9Q<9R@0blePk6CIfe+fcZ`E$c|8 zG6+kLs1GdEP7!<3MSzk4V1j#rl5pTgkUml1VA5l(j0YUl0_8->bv^f80l%nw`W&J{q} z1mQNNZg(E|u;iFybzKgdHm1Mr4arkaPJZJTlT&{!dE&zdIOV~~Ly7D z>eKAq<%`{U%l{v&-0SGyhC(s%4gc5DZ>4Sxpl^Pfpx_M)=Qi+N`F+@}*` z4AD}Fe^+j)e(%py&l1Qhp=e(>hQ4ScDO3z(8ILY50|>GH z6Clz@FkU1C^`U;>dVv)cbQF{jrvs{H1dja`A=9yWW`odr#(V5zhd|%G`1D z+a!;Ag4O^*Ni4m!XkpPAzuPw@BVZG)>074_(MHuWyRIavZR5bvzHng2nF!MvEmd2K z(9j^E`SbQ@X5-WeJLqcs3#(AO72CK|C#=Vg z)y{t$@A-4#1@x?AGY_zMIG9irbjx@|6!mBZfArEYwH5{)LhQn%NGU7Y$w1IX+(`=9 zvYbxF>ITDCA4&c7X_W+nN7)>3|9puzIgcgr-^%{~u zN=f<6`<8Gx>6?FjQ}Ue0C13l>AoQ&LkKQTmlqaVhdI*vZSbBPMsG(`*&|Y;DAW!2z z`33{V-2TCgrI+6GB=2f47ds9e3q_6(;*mo-j;l5bk%$J<@!Y|^q`fFf-wqwO>0%eb z%G;qSycqifU+DgU4@$(T!D8z$`B$;?Kf|5B-t$*7F<~7O#{#E5(IbzDf(>T}yPyxs zVRBKxN{`|a3=@YUlW&PRQ4sgB9{nmNc1t+SiAD)T?P!Dj6bl^_O{;ms^ApM4eLnac_x!oUH$~XC z+R=Npch()ukZ`8Z=7H`ofN`O;?T&|Z0Xpy$PkrN5HmU%5TZkE&rL&ZR$#%&OClzH7 zS_@BssP>lq1$-x95q$3cKlkHF{Y@fsW&yf}dJaP#xMBqdF4_=jzQNMg;iYZOv70xY z=FZ=%=c6$b<2!4)#vpZfH<+>k2iq18wNMmo1f{4WAOPWS>jo3pXpdjx@9i9BbeG?yk5mout*VA9{tmK@tunvG>INAsxgcRGc z07jq=w6fGLs*p;%mS>-t82gN`D;;1JIr8(rnjFbjWNf;f)Eo5qL~-5Y4AH&WV! zqa{;aRZs9hSFxZi;n1edZl4g03fxm<5yo$+@omIGF^dD8`J=&f06Q&%zVXHQ7Kg8X zW3uc+nU(@#j65GeSU7;O3^m_SV>3gwnpdCum|uHZyXahOI=xtA197lqJ2ZHlsOC;q zQIL~(t?dkRmoWGZ-us-EPK=(V0~%dj{=pRxdyKFgtroF?)Hl$^D&U@(mY_keuXPKs z`deRz?&=^Qu}#{&ADmqGhM65c(7yUlQ~xL*yU>raC04PXq;&wd&b>M@yPbm%bk#TE zYWdJIV?}=5H7mhJ*qrch)y|`67F+@N3 zFVc*jR^!)kq@W9NdMz+`=#(C5>5v%@)YLh?;D)YIA1y(%n81gs3JficpX4yUY+z@6 zBb!gU|C^H`Z@}iz0$6L%fh`6;un|+;v$4h&R-gaaUwhisHg9}lIGpdYKvRRICGw## z6qMB9At}0HUc?~4Pkjw0lBsm88k5=Zg+yFboP-YN+`&LO9Sv-eCZMd4#(!EPM=XUP z#&GWRkj{0lpZuTu$qv9I=3o9g{j(n{+s>{AK`}xfaMN_8ZR3K1Ht68dV9)`}h+9f; zxIo9m{=^59H~s@dFxjB^WxhRJjjzbYfgSpaFMRoBI`HWlB#r*5R^J%6)PcUK2N%yt z7SxezC+HJSTB#PpB7$R}v`rn1qm9A0^qg8%ik$k(5A2xYhDVF^VP}8y&gVbkSDuEz zI|nQbk_JBkNp;^(=bOo5&qwIx)^QulFcL8C z7$EKOv%oR&oHYk1FxYW!<0K9;&z;D_l!0vFXzxO5$U4?#jFGfHLdl5V@flzt z@l_@{i@;A9ax54WHQ?b~f;yEwLh(>nGa9uHUvdXo znGUCx(sRmiAb{|!ZClHmpIiJdBy;6sA4t8rM5LYVg{(49m%x5#1XgEEOw3Y=C6&-Y1oeiQhh0)GZK=@g?Lk3!8~3Kx-v{SN#~$<$6=G@+T)7oSdH7Mu4R1V%rt?SNpFZCA>OH`u?5Wrz+t~Go zP{<*MGxez-QATXPV>^JNwGn&<_|Uthmf(grO7mydNIGDQ`Fdl$%EvmJF-MuPg^p9> z>Sg;owhdd*P!vFQY&uvQ(adHLPGYQ>zi}=VR$J^Bb{%b~Uw?H=xEI;gLmjsM{5x+x z>3+NiuIB-B%G?r+Bw%&vJB3CZ<%D5tJA#egPgtgBAt9}e!prJ+h^{XnY+TND;}$Fuat zLnhyp>sLTq;5%d0{Bp0I^CebK{k8?Gp-alpR}99%w)Lu@s~MpqSq!K6|6V)v>~GCK z513okk_?CRK#k}9MKouBU6$F;H$d733agLby#7hv`nc0{@G1xK000mGNklr$i8`wVh4n}ou+6vZPc=TcN%79a& z9fTk}I{4w7v`Pv%eTAFx6*hCnN8V3fEMnIY&e>@zAPuU{j!t zH0_}=aJ|6x$#;#^FYZXV@}OKQH@$UKFNYreI8hcMJL&-tP&zUZ7?iPXu}zAAj)z7A zUQ8RugbpZ9b4<0L{AphYN^k$58~rI0P87m-tuw_M>=9ubKpTU%%^P?gxbR76)&S;~ zVBTVd1RUCt0T*L}0V#;rd4)CWGzzawej&h8)ZMxs&NFw(MD{$ z{6ArCKKWPtKHzhuIYtyZmWYL1*2CH_tM62?Sg>KMKL4CSwsfPYjd2=R2}M*$ zEdzzMY{3+Nupjh|I)urtx?_U|K9iXD{w+XV!=2z zZ1wS5Hm~xPXSYpg8Uxbkn5=+Ev;?D|d3BH$M(yBdBw-XX98xp0BGBW{IjT!kbt(}u z9@2x>S*ZBBz@HLNDJwJd$r-ofJ>}qvy*p(s^&x6j>U|54Zqc9Br=)wrB}% zaw~MB5BheS!M+=_XnBDcKLY*{Y<~nA+x*BK@kJ&*!r*`V6vnOrDbQB9ee^5+58Yy^ z9a8>-oU$dpv6s>K-3EW<|4aQH(xpe}r5ohNpVfJzo2DImEYUk@*ujiB<1YnMIUUCx zZJ4K^3llQvhjWk*36IBQs~zlMj~zC$+QEe>1ekU0xthRa?fMJu^wFhn1LmB$M{SwF z5c>rN*e?f+tqfE}+88!w_0@RmlZ(zzH77Qi6CJC?05180F34vXyGe(*iY9=AQ9g`@ zCPhmKbN;oU8lL#X-{#!;?rBedVe;EANuK$lW%g3=pp69=E@W0Ew630CZvKSN(XCJ7fWuAhr=)xFLQgY8Q z*h*;^*kETE7g0~k?8;ZVq|_aT60QQbKlZRUB)hy8MReK9!ew)d%@Opk_aC=|~!vMDdc;Xjaz|_2}Os?(mdJ1!+-NMh`kUIr3;lSHXcCfup$%`t?(j z=9DL4{2lY=?FqDe>S$>#DIN3WEOt3$@hGfBM(Cb^5s&%~ZsY_C3Jm9|Tw}{cPvC+0 z$KcI9K?4EN{*|#e`{iUs`iZT4)!C=s|H<|Lnho7$1$Q9c>le_m;>FxQO3wxchZ$`+ z_*(5=5jw-BJuwmMHpJ~EkVm|{T%TKjAG+mo*;U+u8v%a;a;@P{4h8WEUmagPS&hEeI2~{P(b2&XrhD zHE*Y`WY~)vxzeSHJ8vgF*jCgWw*G=UWA6em54F}yK)mlo$9=aBJxbkg=_j!JKk&)9 zkOyCuZjVRDXpt4a2*bd@_39BUr87_hWKdx@*fe&8!EWH~a6EeF42-|EX)K!BZ5m<= z*g-Q^j=P$Y?>)F8dwk4sLv2in<39a$I_IT32_!I+I@oZoD}}h`O`=D$&b$fIGl;X^ zaL0!EhSe)GeM@FE55((!^A~snQ4hrCqA+ifeK~a67drz_cGCK}^4R@1JfRdMb`3)H zYUqfqZzQ&j?&!5^2nG3$LhL}QgH5ngFOG+`fwcpbca(Lx6>tpqsVhWRu?Khrj=y>Z ztSd6q{JaeF=;WZF6mO;=Dm!p$@}_f^AL#Y*_fn)m$`o04cObvkwvE1WHxGrerrjCu zS*FvTwaYbBIct)B?Ec*QUpV|LFH^pN9iU@2Byq0@jYZH%-C|}Zb)D6|SQ_u|wGr12 z@6KN^I5c7yU)&Yh8gY3;XnX8cR{%!h;Fe>KUp76N&CAYlCTe!74N|=`QN7nZx3U=S z3<5pyWeVFNxcUzW?Lf3KK1vEQ3Iz7#&H3l%UH88G-QedJ02PveDafTACi11(%95v<$RJC>PjOC*Ox$`F9e6AafhS@4<)Gve4rrhzD?JxqyflM8>!9qFT z7~SRQL%jp>S-`v$kfPtmqQj+`8gL#={#BoS=r2Cmdw&}!G#WN^O>Qaq?WFQ7J9=^5 zUa>n2OfS@?H%Hcpq-(=~Kvpr9P)wbA*j~~d5WoKBs^g%Jz;u;m*n7>*P+O~=T6!@h zcK(3gJ*AG84(_P2fr9Xi6q};LR1UhHpk4%|LK;mtgRJ+$Yxz3-?)%*Ru1U;G^I2%{ z`&2aECqs-3s=cu4>f0_6XG(l}fyq#8+R)j751!owg)JTo(Ih_fXV4za+qfpgi_0R!%VjB>GWeVoUT1iEy6B*t98 zI;EFa4h&Zch;VGaB*$d?DyRt-pjA!)yZfTy?lsG$Qy}eEUuWBp)md7Q88JJ6ezU-cd#8C$jQ>X!O|OE3Hv+5IB!?av z=Rjci$GW5dO3h`Lm>}5m)+Qdx<}h}~A!Tq=*RkCRbd7ce?4A2o|H4k20ZzR7aXt*M z!oeIRAqW9;X+`5b*%(BfSkP8jwRY$BJ65A7?HnFfCVgQw_i6*KloZ`FJ4!a==>H1A zl4_(zJ#iIu@ffb!a@e7XlcVxLfD86tUzYskV}Zx)6?UBYrR>s{0&mzO^e=rRi^p6mi!^R;(9ii=@^RxB zZ_m*F{qj0C% z^bB*+`+#er&^7MU1!sA%MQDL(7?nLKVy-AQmboA}y`9s{u0nT0jQ~Hh<2LBHwqt=9 z6QIR8Gsx}^jdv%Xml;SqVb%4vZ@g25EQ=l&q>YxSz9XAgU|-Yv3teSi38yg9>(6$|HmJ^Aq8&ly}!(%VeO zy23F2;Km#}r_PVKV3c+H>iA(NDc_hwZ}U6tD<9@I+Q93kX=Vf)UFrHDuJdGwu6T5a z?slzXxy0_@>rkt%5GziED~Wi5RY+E?-LdtKo%)s<$nvem_Eg90+%g`o;zw*W$pU=f z`$S{s-`A`KS}J zc-vo`6YPcD$O5o0^l|FPZmk!0CN7rUD(8eG#m=AO?H}VeCtV6{dkdJK_q--K^YmqA zmzi;l5A|Qg^_aY^-q<9Ke)Xgcm1qM&Oz!Df`lL)tojTx9Y-9U=#$HNoblhu z8=t=v#O?`8k{Px519wdP2O~4do{4txxy%vCm^}oWxze`{=g+vk5&Z}6lz#Q^Uv9EX zcmx|SNM88}u4tDmx4kUf0{dY70WN2F0MD~fR5zoGSf<@oQuZBr5nyT1So9Y9IJd(y z=43PB(Rj*O(e?15bczd708}xpaxsQ5%8VpG|jatW>KN+Fa6CRimHs zJ_?#UsPgU!fbXU2FckO-18(k+;9*x#FOWB7k1eH-^n|swzD&PT#O5*=ci(?|WwLn# zmG%*c2FZDO;dSid&3NWoSiM}nJC1%0w>1V5=8PuRek=BWiFEPVQkM>^56j{YI^UQY zr+^cM#?J{M*Kq~#R%ogR(Pb{j_>+^)Ot7H4H8BIdapzOa7?zzLi$RMWQmh6W=wZ$w zsy+D4t`NxP%A|IlXE3LithfXeUvKr!J0UY)Cus0{EE=s;P7d=}yH#s+Y%%pcSa+ks^5_N`o&>p8%y0G>J&lz!!jCae?{ucL%|VbvRc>BmlNTw-iU zBl)`Z*?AgY;q?&cu9qqMqe-n=WHXHKM3;VE#~_x>xYj<#o9x*>G64Gu^>(1~KDd02 zx|~0S_O|0yJkW02OmHGnY+80XR3tlZaj*2__VFL!cm?noV3$~Pf*MeGaJzVVUVz_S znUgL4z#Y=p9z&Z)A^rnpJB5L(^Ev;M{Qc8u{Ptom^XXWw0OQ=WslKYJPGeZ<0nC}9 zf$-Whzan1>H0E4gGcS-2xr7~q->IYGgDWUbWe=X&;nRRlE-3Ra$-Uu!-^rcHycP7G zhYB^FG??g>c;0E@hKH~5U*OOznoDI?IyelCozZyNnTDm{0Q7=4;xO#$aJp7Jr8C1G_4BFJS>> zJAqn=G8_hwny~a7_$SCXXIB8>^V+ zRa}9X7v?@wf25UbD`KZh_9_RpGz$s?cDB8f#jCCIu6B{U1)h_7APl?}cT7 zHLozcGqFxbLtGGEgR%fzG}*Uf@h47BR`U&{n&@eQ-T3>A;Rn7=7wty5kD{YbVCbzw z)G8-B^VXdg`%+;#X8~k^?C5JphwnXboXTEIEF_r@L>;~{4rL2&UL{K3>+GpxBNiI5 zgzK+foNj{}@_B$=UKW%USwDI<; znD{p4v+n7kGwV!-1N+ir>s-PP@;N*8qcDo)%eIW=ipcz-w2uOD$8mfPFmET=)p7LE zU?gWq;|bI+aQ}aoTzD?sW0m&NZiXRTqD~lO?ac7QuQj!0$1Kl9nkGHSJP)v|%rF?2 z7op0mvHBa5#yx+aqXOvNreflxfcCFY(}&pkzwq7=dJnGHlxD<-9m&J5FB(d?Pp7u- zi+i@~#sw&|Hu%bPUvGiN$cwl7iG*9Tp(6$x6)TbT?c9<4-{&T0?xkHT{pNZ96g!Qz zmhSjNI5!}sjqe!f;vBWnNvsmK^^T2mE)0r6g3_W0f6U}E%rgkC852Bk5ZVH)DLh)l zO=|PTy!NMVH$4ZmCCf}SqM?}J1GVdUGUon&)t$YUui!jz*Z})2o`r0N>O&MfDbYrW zyTqXADO#m*3b$plZZ9-u1hf^n#wINpa4WJmY6q0HqmE40a0`(AJkI}S@;*L#?bXdn zG!QdsSN}e4e{QN^pP`-gr9Imkc7?WW-I%tCclRsgdt>|e|7iLVJPhy6NZo9FNz{M& z{nRU8<@*C`k4O$%8|S7iu(9zV>wJX1bQ8r`(9952A7BB*oR=MBFm5I^GO@9o%ksgu z(kb}bUTv%+EoFngaK@u@Wf52A2N7O5Va-mhtW}Ukvujbgt2DH30QC!NcWi5}L<3Vx z3aC`PB%=W|bZ8h2p-P-mk%A>1=@SD#D-|cW_0++Yr2Oo>BK0E_(g;GE33A-kmF_p3 z|F3_WuYcuB`TC~Ce0?LZ4DTFd8^seW=DeHzOg8Ua$mY#k_ZiOl>KDgY)KT#!Oxz99 zBTV&g*qMvJcKSZYw=I_(bAzlq{08}&{Q!2w)TNx*U#AUUv)+%qE0_GwfA06Vm4jo> z{B$z9Gq25LM$t@E<{olZ)HAK5kP31GP1&0-y%Npg599s+LPg1RMq{PTM9px>4^*(~nT`%u z^yo9=6(SRL7KpfzGKmR~{?;XoEH%qvbo@1R-ETPK?6dQQ3%3J1@`a0l3wPx6;Ll$G zzHnzgFJD-CfU_6Z=90}@_6xpt@wPG6ZsJ}<+^P@VgsJzu^_%vqj!RgOU)^zJ)$=+0 zZTm8O!OncH;){0`28E3U7bRiQX5YOudjj97a=R@{9Y$7Z@35y$cj86VE_{88b&{D5zgJVsYyo z8Y_HQyNj4f*_;k-8L&2T^Uz3B_J3N?3)lumtW`$^KsL7su=-l@o&@T}2#s~xB*?Ke zbj|q3UbZWMVXVRy6fQ#PJWRq7i{{nVU;L!l6D}jWSH$#;G{YsGdMY!-ndxmH;(=!@ z_P}E@l)-&2;2^*g{cwh$^@Ch`zu;Il9b9YtD@tcx%?*F|Kh0CG`nBmDS%=4Vs7HE< zDjOoq=Ygh;E6QM%G_C+kUfJWJ%~5^^ODcacY$Je{7Y*hmli`HbbG_eGHa0R*HJz1Y(plZr^9%z$_-WT;C!(Do!AdXN;(MYj)3KayBz)OcTpbz|wkKTn1z=N+w5(b} zE)})HD48P%$t1WmJX()ttx5D*wQ^caIHRVuLDJehZfUK>qcw4x@yZHXos$WV#KbP) ziOT*RUIFGjrYHmMrRmm5(iQ>_x?u)Aw{bpO&7#&Up6UBJ|_@z+9m*^12;YFsNs zuk%o+^aO*rY>QM5F%#^aA9ik{Y7Z2T3#F=F!cxQ?rDX@b3{U=}T-^kSbfzK@p_D@* zhMApb>QSP_euB>cc&FweMKKvE2nTJf%?`5WTs!9u%f_zWom}|BWy1-6xB{?o;$N}I zhurmNQ_p$mXZFx|#4uy+S;CN;H|4cIdplp(O^X2GU@b9$%86cyt)d;iWBdR{!*%Zs zF-5xBIK4)`NbmI~TZ}q8{M6{OmnTMd?e+5DL;z%%4}E|w8cmhriyBVl2Z_A?I)I<% zVGm3pXa$;ZF|(7+9GFo*6YQODZP2#{9!iCQtgebnP@I&Kmev|fTaJ;n)@Jh7TIpMB z2_+sQZlhocrz9;YJe{+@$JN<%DhQ{cRD^C+_+fe>D2mc0dSV+B5HzK7Le-Rs zP2+pT>@buOQ7;Sy-p*-nV=A+e4ZA@RDfe<1`6P|qAs*}iJv4m>>bZ`V)|v5=dGoM3a7G&L9)yb`M{4mwjktzej3vnP z7!S@eaLXyVeTHMMHkyu+*bF=K{mIxraSu{0v>s%*Q8luY6Y zD=U};d&jK}`r({e%@d#5F-Zp8+U{^mYppz56So-B#i}e~?lc*Q+wq6+FkvEluinQh#mFeNU}+JGMWA!r zCKfs&1?U=>PQ&>40^J6OQQr%Dh8Q(gO*jO#!-G@xV^x(B6I{FD+QSnUfj0XItJk`t z5Ob_`s8OCkBU(}+pd51K_(QN#XonCK+B2YC`9lsr0yRm3joRfPSDu`pvB5Zp9DY>s z)kkFWSX$6dJi%&qNNJl!ZG%4yQ8|yjgQ4K6MavrhArY4QT^3d)Yu6@q#qP{)hNFXk z?oQYxm@DSIYOh6stXhK|rO(;bTszN`J^K9Uk0*yxkMs}R63<3m#x#z?KI5mn>WGEo z`wkz38|*y5E|uLa0JSrRzGZ8phQyWGKr|s7kepNE)M52XN6odBAHdIFxdZc^bgz$Cx^g>K+cy*Bra%a)P0Q~ zp6&?SU_G`gBW`WEe1W!J^EP*l(v>g<7|>*a(JChVYW`2Jk+p^ZXl)6%*3w!FCrT@@ zo~zyR4n>Cp>D)PK$p8?PwAQlb$YXLyJujZ2%Eqaa9B`*ZjJc^hdL4nu@L4@ z9y}FoyE=iX=(Y1FvUU2o2W56#^ZIelJ7-JD0IWb$zX>m1CPScIwk8s|U;qFR07*na zRM*=}Eha#-yinzG0o-IfU_NytqYNGF9kMi?HX!SCYU0@q`bZ;O>M!*5*p%g!m zDLH-}LI9;zMW|{=2uBAjU`k_`=o+%?#mP{$pK$C=Z=1E(@HhQ^$#Wv-u{7BJ}hpbtXYu@1}bJ#VmuW_`Vpadn68l|AC-R5pN;^&zrWd{Lnw4>`N ztuMHjKw$xfyB241lH#(=aO5YGhSG?0gG!}VY=hJoNLnlutql!oBy0oQ%Z_rOA;vPv zjHk%AN7{xC_ol>?R?-75TmMGQWxN6$eytnk+IRkW11^Ep$gRMuxmEc7UwRZtxsbJo z9)iURgY3$;)^fz*hh@zX$K?7y#ZCs_<~$)ONPk1nfh)ra zYdxcBuKX^bfx>p=8p#eV@Bjj9gXJJgKG2KM7CEs1O&KVySv<5}|BUk3XlWa}3>NDu z;LbO6Y|$|EL|hK=;KPng7FI#;e`#$YKk%T_a{ZrpKo-`FKc*vOwXNDhOz{;_&2En%Ir7NEv-Yq<(;7WNU&0aFUisEqjyiH}4t23Wf8Q@WJlDO~{nMz&DpHkT zS$;?;hp>C!{E^SgHE#D)D3ZeuKdkDJskqpRCkT9_4@Vt&L=Lka46jRHZuoN#OvjXcGDj{NRe9qNkn!7q8OW8`; zc8$TQ99Tpu&}POf+y>@uY);Z>s$6hxX8!m#0P9kT`^>hN-I2qe$!Vj(gqHDpS^yer z*p6JiidpaQLI^DGGb}YUBpe;EDImQ;7;^3)lAm*9U=W0nOIg}zWFpilNG6o!M_N)a=`Ff7d%^&`|`O&ApE^Dv#eQ5+L z;6%x>+)~``xBo8J|4FV$=q__{EPMuF?kWbsD-Viyo)Aom!pekVV#7KopXEY-`gree zPE?$qe@OCu%YSv-&-|ZwlwP71fJFCXm}IQBLmat!f!vLUQbBqdFsjRVnPrA;%SL5X zwM<+xPfLxF8=z#aY}xLKZuP-`5)*Jzpp?Xrk}@cwOe&V@c^E{tK z858yDCmfR#jz2nU)~w#8Ena1=bGKj0-Cz5e-1&uXXEFRme&i{y%H3Z2q1^ceZ_Tkh zlZ3eQj;#&#T>XUOs-9!42e|qP$L4CsACp6NSI;4b=9+i<+5Gq`KAJoIG4(v@<+=4~ zFQ-2r&WV5e?i_d1+ht{c=Ih)i+J(#G@93!nv)hJ9FN=icIr* z<69*6Jte!0#eaVSS#~*kMn~cd`4c2aH&^bC%6QDv@>xEsC90E#BlHk0tyXrDQCc`d z?sk~oRCFX1Nf6>pHR#_MEw0#6-kZLhWJC(6qfb0CeR?>cIY(8ep575qx&jx#!nh0P z@*RzZbo?#ukn7#^zPa{~{Zfv+{tqS9;Oy~et>qAQ;LJdhxb2&o zu?nwuYkrxF2|G8=bC{z}BLdTb9xy_6){SSpPd$F)Eb600t$5mof5&OV;<{LZasE*CgTA!R~_G;5jgT_rvzZ8oDiTnpKfH# zW6`z@y0ai8Ylp@hCs>Kj6#IP$*3IS~_epMh516^qd-Ar|r~B`jSumvmcRYtUNT`Ez zrfO6*+JS7;K<%bn>H-*oP*nx%F>pARDk455G^lLBgH9m{AF<7BBh}K2>P7)9&~3oY zMFH8$s$&UM-DMC2Xh6uc$x+AVs^i-<0{$Ta=Ak?1PE0jpn5Q<*qcdNC-GDi3B9wiv zGt%V5pG|)4Ny&=a&76Bi^3ivWH4Hgrd|_}NVt8(q9a0kv7JE8h>H^rXjW<8NRr@+k zX!XP%s9v&+yx4`RuoZzm!Ooq%&v5BygEMeyvzueNybl%?8*;+Do`gH_<;<@ofBwwm z1y9@+UiRDrU*F}4c;33?4OhEW9a(X79Fmr{()_1dJP5yook4P20;u3Q4Ium5Cqd+km*1-NLs9S63_5d z--Hj=6=1_f$tT{+&hu}{N9N$8(4RR#e{%1nq1VGeQu7=RH9F2k{7d-642<-O`<$s>L(`FZYjf8n0VFWxKptw$#R@1K$_?AH6cAQ+aR ztwjuEHBVkB=D?qL2B>)=AHtYaO^y|O(bfpzeAa|9rj!W!HHBBZR`R5mBtD>PKMxxI z_4AW&jek^txB>Jlu&#M~bX13=r|MjL2=v~|r7wV)KhY^2s2e^1n$Pt@x(KNAm@WCjvt1n~1_?UDxFVqE_8YbF?Hl2R9g`To$Y?m5b>judw zf0*3xhqBw_)9*{(^$+$WAx@^F=ss{$EHOsLkFiTzhDGh^M6>p!DtS-EpuyFQku6#2 zIU%ERI}U|a!=)o%Dh(;KjX=2|H`*1;iOkl{#neo0h=xaFXQ>4TALYuxomyhtgLMU< zo{DcB^sg2*_0DkV_u+KOrsTJulDz2mlh1NR-bu3a`9BrQtBQ+2Ji_`5lQ;iEa`OF> zZ?H)Ap^7r8@#(3ts)18F@{$Jwd@Lj9xet+_uze;X( z=VX?!Svt0FOaAUf>1-Z$hmN7sa{^fE?P>hS*l})-sbb_y_QjNRcc94HyGf?pD!}?WnT6q3mh$&q^uc@$YFh;Q zTLW4&EtxRnUdzQ7CC_^X&k`R_{C5@haTP;;gBvD4&TY?q9+2Gs*OQ-R*T2QB5--{8 zlJS2xddbB+)IN>NKM&)3tz=XZwy0`bhXkZ2Ig$fjjyyJfVNHdlw!&eo8Za`M%`fd} zB!AjM+Rbm5Jn_$yYg{k8JvOaR{_F|qU;X^3UWz^nGR0l0Yq04kgm7Fk-YG-&Ie=U$ z3rpl~ss4?PTiLb-T~%hNfu)wTq==2fVFto<()T$`QoRF-1WmbvC$HjbVT%1b%F?2nVrd^Bn7@;*PT zZd~$ttMmsiPM+}0lesl|HnykzUUKYF*i)DG-{8Z~3t0s2hS|%3xtql> zEX9n*(AD0NJzcFbGQGKJmuwyd4Xt`;sg7?yfpd9 z+e&5JZoJ~g6LBWlgiC|GF<<(~pSNYFx!a}p1bbQlIu(53lEse=^%t9>smOFJnCQZd z1&&=q(>SeScevBfB-^~~C*{jq02>+gm<&RQ8Lxy_ui;?wsxzqJa3MBD87R4|Kjk&p zrGk}O3m`dxBPP99e|+Bk*5m{4#LDD{zXA8VFM4(I)9m*C8)lLRJ$?i?ZGQ^KPRtwr9S7!XSr1UoS56@ zH-lehu|M*6lRe$G+Q)ajK6&fw;{PhkINczG$kaD+4^qYkTAP`Ue2EA4nB)@kPreK= z9_VFfnmgn55hg*=3x}=(QxqLBg)(uMGzg4ZQoklWSg&&X5E)t^j#i zo8;^atk{fx)y~G*0V}yQU_g8djdJVE3D>Yy2MMfAFg%z-ODIJs+%s(Cwd6bhCGlS0 zL_TCy@*AfnH|A=%XRkqXwQD2~d2F%tAG{7GjKK6y&?ma&7=j+N>g3o&I_?zT)&tt>f!t~;29Kl#){E!<_ z2H(R8y0G!okta-2T#WyH(H1Vhqd@%teL%x`VL;2y8q8qpc4|;fT|F($WKGM|h{8#l zW<7yOt;%b0pZlQG5+3TBohvDRU>lh6C|hY%9bK26gVLi5y3CFa*SP{*cP2UTL{&;y z>fsy{S&<`VUzP0%&OVa|SZ-e!s|dHeHJ|tIjI{wkmsW0h+vEiQClu7J%NfM_#`r35 zcfQ&<&nCb`Ygg?ghC2C!0bT*B&N28zi`T44ew0_efAq%WNA8w*rOR#(9(40QHjKYx zk@!YT6Z|`~?EF`5A(LO0JJr8r(D%&iV6t_UoA<2qD-Go9LZ$6WDEqhpW&i*X07*na zR3*axg!g{oqr=zWq_Gkyg{v~H5Kv%?LB|&0kJEnoL5Y|7t(VXOc7`O)`}*SOT>`I9 z>S)L%#Da7ICdIRe28=+3mHO8Lqz?v|xMQ0tyww(XD#@NtU;Xc7GY@ig1z-pN6<&Qh zCVTcs-Qs-fE6LmcKKV25`!75@(ckBX&Kr@B^8s#8{x+$pWbA!_HZcU-UvhN^2U`9A z!iepBfU4LYZ+Ra2Y(8-DY~vN66uUY3eDlvd5WnJ?2_N)2Sut5T-xDvM=e1EbkEQ3~ z2_N|K?ydlubWg&9rxh?M#g6FW#XEO?Vj4$rr;*(US#W@+5L|Ncu~%c|-#vAZxMCY0 zCj>@XfSeV5CuX4gz*cO?p_2FwfGQIC`dxhv(m}-(R&P247(Pm=!!Z-`#W!|%yIl{}6I#8+{T{O@nc?5&Yk9ygMV(H?X3J=_5-TfcYu5JK z!<|r|xyw|yy^o*V7HP-`x8ZVk+%;7shaDbs)j$fw6T|@{PJm{@Xizj3qt0gv^`QmY zH@*T7{9+F5-vg@3=T5X?jvGj1b!8a1J)TVtcW=QrKbLGwwr)wj^dIc-JmkInImz#z zl$>^-v#3y4jB;KhJB@lUNk@IeCxOWgHvFC$_I?%J_%{*#iZ> zqI{QEsmCS%#D_b-ZZl`Lpxts^_e3SQK-fTVlzRADv z8rSC%-`cENm8@a0-u+k8o=3laoJGBsH(GnDk-4iMwmpyA!jBM-7(;Fi4nw9>AMNi< z`~;;%hKMQYsd2M^%ECb&RU9zdoZHuY0x7$|n4mCYQ9Y8$!i-uXG?<6Q51h5}CB151 zG9uNZs1h;BP&xQ|H%_j7qs)%$@Ws#j-IKIV^-|8@7&^V43cSf+AJglZSDr9ow58;ZD$r}NKB-bveD z$QA2v`I_w&z);5bmzzI&&$Oq%HaQ91-V$G*ojWR4fBa9UpZQf<+hX4Iv{+^k@&HEN zJRmL~R0CE}&^ePcDoWF{dG(q>XsG3Y?NV7-B9~EA@LV+z&rG@oJNUbx_wVdHPrh zGR9$K_Ka?Hlf)MgUIC0zz)&80Z1U3&OrFDg{g=EudFm_K;h(}+;a}nv=`E8(58rdl zy=huYZDkE3>+?`6q1znFSZpTeDRt>n?XwfW88PHw?H zzirrC9WIuF!!#Ol_&~>O~yMH(wm|uA;nm+isJ1KT&FO0m0&2@1E zzF%Wg_x_`eH4ZSHvGVJ1&2CGwa|QF^_R{*`t~nbA;_R+e^XfEc=g56-v!1-M%jb9~|N9rPNbi@t=bsaQ zj?8?hj$hqxbgSfn^yS$+xBTF360h#1+{4M&njd+4@~mG;|0Ii^7XVYD&SRUrGQy;v zmrr)P)1~I9XWf<^IqhR-ObcKUf88d4Ekkkb8%3-*X*@ZK7uRjx#+#tU@@$m|nk2^O^c&xbMSy=zIDSo|0ehM2Xq5=9YFVNtU8CNHu7Ts*g^H!!!GfMyv)ow= z5>{&VdiZQ|-S5lrP)iKkyK{SHv9gcHm$;36_Rl9T;z8N}ao*nC-0`b@)Hjd!rBdI< zy!W4YbMx@zRnJV`|Nq#fFJ4~THE)><`(VFKbNdIbh&fd@i+?Nq z8>f#gv3(kYnae3@+eEifH{nq}SmZ4jXStxIp{O!h^I17FIxbULOekw zKc0(U-?oaUvQWj4#2Ub4Xn?3Bi4R4v%Zj_i&-^-rb_ls+NNoqG&4rU4>y2n6bsqu~ zLJDv~;WDrDeiL5tK>_QeJ+z4MeLzsdvxt3=*#r11Nq+)TR{(4q_r7m`4G+GbBo49m z;5HNUV3@CdmfMA=a_jNAQyC!U!9pS;^k#wIlBv|W5K63 zY_H!0`5wLzle)@So;nlW&RA=`?kmlTlMi;c`-zlomJWA+Wj%w;*zyx}hzT5=$-aJ1 z(k`v}L(I!|ZdMnn2l@y}_O;4;+&8(=&9P_rTnOuVnEca6CGY)*#M>G|?Y8XTqt}~A z$`}1wvhKeI|5aG7-OKxQ8(GOPwR6JwDF@ApuOI*U&yqiRZ1Rey(H?ewzShSW@o0(T zdYd0l9z#1$`h(;y?)ZmfpN=nmI(Y&2`hW4HSQx=Hk5UNGwl!Bc5&_?Ud={Mr3KgRjtvXE2!;-qUn;v^r0C@u~m*wU2Drj)ccXIBx5bmb9n>?IXfH&czP<3RvjiOd<4Bawd>Tn>Gixu$1fE6{>Loit3 zK>^xe^3boP@W|x%rCJ|oPvRlbhehMi>TEnWc^$jyA3Z4fAc^-iz6*Sdk7nN_(f^C* zgMa+p`7_3`TQ*ZA<7wDTO%z4yn57I0oF zo!Ol@=XIX$69ev}-DJ~|Nmrh@p^Q9euJml&u`^HJ{r&%(-4eOC1)!Dn3XEbF&)mG7 z=Kxt%fXPq;s7%1@>r5u9-4^c~AMyL?H~Qi7Vik>M`bvsT@z8x@m6fuLM@Jr@Cx;&i z(Q;4^`)2~$j@do-e$;p^UI{;hSDfAwt)f4^0`+$2iyus0&AsvO-#hukUrC<-%gGDw zm%RO@$wgK}DrQVFh@|!OP^zhc{T?o zX*H`(S>fN|!_fh_1X54HO<@D5CY4&BoP4)H`!crws&0)y@R z`gWfKI@KYzp$@iQV5O4z!bcL{CKR)q6Ax4E2`^2%;Z4#PR%6f;m-W~_b1ohbJyZgY z{oqYVpUEMdT=kF#tx)|ewv`LEWo+wAwG(1zt56>7V;W;O?Sev>6XmGH>LAE_Jpuz_1Pq_wfP#*i2B=hr= zAN{GsSGZnLydsFLL)xUj9rxQ0#O~?5I=t5-693iP?&|VE^NVbDZ+~6#mRFPTS5J;1 z@ekw5xIogk(MddkN$)MrgPxW=krySu@oaYc9~cey4Vn1cwr$Ji&6~4z>sFG!r}>9$ zaj$s;lMJ3gW6~CvRIW^I=?Tt^s$MOgK`ZGBH%p4pjtXpgMqBo>PAL=9eH1DNNM(-{!ztVs@!iC_04>w3up^1n928* zIQnYIi98se!jAi5J}N!)9mykKkv!}r$*CmqACSy1;LXpYUX|SKLCNvg9U{~3c#plE zhvSRSPyYSQ$xEJ?JnjD^fA(9+o4D=pZBAWXXd9&*#qJcV4@vyfizfYZd9VL#&q!|n z6RCep#BN%)`*1SxXFEO%V3Av^)>;ld^w1o-c5Q0jGaS7bk{|tiBC8#AQi-|=Qe&Ip zknRKNxvNwr157^MgitOZKl73uyk^@a`OV>udbed^x6)y?=p-0G;F_JC@40yKrKX^D zPrmYk?JSu;<^3SN)9rsIc`6C;W4wyv!Lc)GR$B4tSYZg<#Uoh z_|4>*_euVitHT%g#>4H0rm;PlJG||>+VzM{lHd0U$&*=7?)G>3*~I69In#Y1ckbL- zJN>d9zqPDcvnFdvd~uFACP9{#2XN3+u0p#+su$Pfw!+(ySU!BL6~-W>CT`L>`*$UzUKRv zKTrMWX^`&uOpMy0yc#_7Z_>W+=EJuFf;MA;Yo&JxhR{H5k&jCMm-_s9%K!in07*na zR4d(^x%8j$RYpUdngb2Sr9al|!t-k68;EMl0j$fbN zq!--z<@NTD{~mt$;kENGxY!i38M$#uHpi&i*vZwdXv7`7SipppT-=N5E97cYGUEwK zdOUNYH0qF7(x}s0^ZUH_8!tg+o-WSe!3+Uqo`z*;>b(3k8Hojh2?pNrv=4siBVXb+ zNS8`b61dSA8&UwTF79G~_|ReEN^mJB2lIwEPoDdR`0|cgH{Mu*1?? zQ@jM;j+Shgo1S@npV{?MKHy&R`MK?-H%6d(<`3=Wp<^LmHq?E_B|E+S;Z4FWw?G{m z0kmtmv@3ufI!_Cr7QuTi*fHD&RU=ek=1ye4#iXcC-9Kmj*T0k0Z^p6N*W$!Jf)6my z{)e>tKPkD!4VFBuqqwo@i_~=S1<8ML^?Ua}B>s-YTZWf#`F{b)@!SU|f6l$~KfEaU z*S}*oeGjh#NyhWnCF8s53b(sc)kS>zQ;T~U#=#_A&waUnx$M6_miP}@-pUu#zhURL z&fk4d^83G$yy)cAefw*koxGk~m^X7<^5M57U;0eq?V<~1z8XUBQVu&jxy7B5`#&*x zIt%Ere9U^tGn1eGwZ#9~-}oT9i{Cy7cJADnEnBwC9&F_&w^ck_Oo=Z&$(LcS0FCMB zl@A@20HSncpop5|$Cyr7nfkhukjZeAejqa^j)(T*jIrcRxzBG|O#;l4-#j%jg+AEt z{!FuXuRyA!V2}w6ymR{@M=WmGzBA3+fmDwY-qP5nuo}~1N%OVde|{kOJrcnWFSa!M zc=+(ez&dsrpuiv&H^)-G6a)5y@$y``h~u@=W5d z8eJTJOhP_~Sdah75j=m0X-DKzL z*Xe&BkBKzyv z8{aay9qs$&M^o2JSxCG}J(+j;Cvsck>&hb;1Fr-t-1mj`w$&tew|A#^$KSDI2k#vm zyfAOWj_+=7^3QH{vWLSfKo;=BpZ>J*%GuL0(dF4p+eWV;6!avJg9Pi*PZ?b1@kAR> zox|6Ai~LzzcH}n-uxZPL%5nek=^rYf5R)qXD7b9_J?Q9 zh*q>GP`?M@jYc+b1-antd<8CX3u*8+k$!; zmw7B*fc^*)`6fS_{KNy3hw~-ack-ulwL0mK67S<(^nQ``wg&UdQ@oG&6{fqr;A>1} z^D%v>HR(-$Z+qr-d!!FNBB_6yVV}K)X_$7BliYwxkuN2M?%|Z-XtlX2 z=_T+yld(|b12*>Qn|AU#%?~NNTmdu_D#q?kds+Z1Z4F}bPq5=1=j{B8`e_7~Ds9LB z2xc9gqtEe`p;c@4UduG*GYmnAb&2Ci*n5~=wAOnViQymbI)SUkb@?jnPlSDoAZSmOVc<^--b`|_i+T`JwZz}?+l-re2>;O_5LV6t|H zH}Q`+;)vxBx0Au8VaLigW7iq4#{7#1K)9^*krNBSL)^hGm>%<}!wJ#_9WkXNm$wc9 zQO;X^gpSkhZ;r|fUH#tR(iVUL1cM0%uZo`ji8DWX`UbuURD+gR(Py&0Owo4oF8d9< z>Gp%Gg$z#~jA4k812lElie=L5>J0-lShyhxhdE^unRM z&u@*stu)$Ke*7b4Q&Ng2=(Bv-eK7Tc+6k}pZMEBLu>{(#+q^UPdB<0ICAiz&U*pb6 z0PR}#wg4t4@dWdWV8>g|T73D`(D~5H=J|QL{sHutdH8$rW0F5RB{}0u+#6ro?ZkY9 zOQC%>@K191x8{8#a`QVRcVuz=6c3B{dpx%pzsJ2h$@mN&B!7=LPA}wL`=9Ze@dbQ& z^+S=n@-zOLw=)7Z&w73GyL>?UJ>IhX5sUW4?@RvpoyqUgejssoDOgcy8wjAy|q?vbbOWRt&X=jUI8Zk zWyU95CsUqxiE%9zo$)|6C9-lsjrk%JZK7i*y%Mz7POMJ)L+5X00_yh1jae{9JNgMA z_gwaMMhs?PVY&+Jc=o5(ePrEc>r_o8HhdT0o=}-PDY%XIc5%Ue`rp!@b06N2JTCdr z|2O=Mf-qNjAt~Zp7JrH$_-DKQ!(M_9oc^}PTN!^_bA>nV@>kf}ko4~ICcQiU0ZID# zrg59sXNlj@2%vG!d0vGXigY6%+LY|rXkDOE0-0Cdc^mKfJAG;6bHh3wet+dd7jREq z3&6Y-%u&H8RybklUEtCdfX?$^U@H;K{Oun+Z_6v}cOM&UqlK=JPFiEBICU8TI%%bC z{$p_#LSD{m%P0R-;xoc}9!l%>Xy&2URj@xJ;P;OW=V#%gZ_MFqR>!3GKL3Cxe#YZ! z*Jj3t`Eq7EZ-vZ>MzW3;AoYE)Gx?DW1sS}_E?|JzjdP)Lq{Eq0BI9)p$e|COyX_Uo z%)<%H%SB`zuuNEbw{U3-VBX1K2Dg%_!X3Z*zO!HA!*HvnYOYym;!Y&AlJn5`j;u%8 zv$%Y`*LINn>U%M7V*crc>8J5}@kNhJ-t@BM3w%8C2X=T~RW4-&9K)}FE_nxU%3jPj zkSE_Q`N!W&tIgz6d@rxsTcByKnfAt-En{KF!;!`Ugl14&z_r2U&wB z7K%B@CqGv5rmN<%>SW%kO0Yc8oL6M#LGxt@va(0s$PFx^Gzi@w#gvszNb51Du=wEl zb??8sb4(X;?;$oBj4EO7dI-t(79=zuN&yLtS*&WJ^$ zNrIJw(pb1yrrNCmoesDLhe1GrrPVPAe%w+p2k!h6%r6e#e@_cz)22M2F z26^HytGzL{s?=ng01~U2xlPyu=(d-L0uJ3hQcIH<< zSoi*wcj(=OO%5v-I(8fCd+=$V#nTurWJc|CLRT@_|_69$MVPxo7B95=7OR zOh=EhaLnY`z()BXQ-GaNw}AD&mHk-&Q(&=`307e-^-e z6f3YoE4L9gsNgN@cD{Ue6_{P-G@smSCSkTHo$u5kEYeZPv14I} zD!Y=Z2WnRXD;uwgBbV?swzWp=0gUu*0o&!j2iUTa+Y??lUUXJ+&ez!0-=Dng#mUQ0 zN}hV>Q>3hwdFa~|fyiu{KPp#T6707*na zR0cz*Q~gLySc?hI31O0E*Fg+~_I2MH4&`I#;i8Xl$RUSh`W=g3Hw8cO`<2t*wfF-s zzjn6P@M*eUHt?;>hVzD7k*|F=`P_SwkG>)KS6)53YrpP^$tzDz{`?`yAKi!d??0V9 z^KQute`(#L5Kqy90HCw)(6+@2hFg zI5BzZ9g^q%Wb&f>4!ip6pO(D&kCPAlP4bC1alg)v|1G}0Uc4^Z!8>@nVPZ~T-#f!( zpX;h8EjVnkbDSu?DVuD?+8U#?ag1mij@veqN$C%CW{R?SQfDlzvA5XWJz zvihzw@pHP)T+Z9}c?SD+TNd+ybGN+`(!3JPF_T|#V1$nTGL_4+0H%tpRImZAL>pw| zgl+eI-#IV&*#&R8aOK~h({iieMQ z9?B_+K0%>RIK;5^fn8j@{u3aa`C$J;cS;Uf3vmUM!;VZAR?RBvv|DgqooDHpawOD^ zWFh%^yZ4{7^;P%%;DytJuel|dYv!HMahw2h|H@@u09I&CV!;I<*f1ODO5Mh-(8K@x z;+>z?z#YFFx?ODKkJ3&K49^5gdl{%2^$KdILji6MuK#2Z_Mn#|j!S;(QK5kYxSJMK zqe3f}U|A9(rulKV7MIU7Phk3i#ZZbSp8n$|5bbAvn&C6A*Qa=NWd~MPyFRhXA0M&* zWb#*@g~1h6{6{>iR}Ym{+d50Ywun1&0YvF&1Q491a~hrvnr&x1PT#OS-1@u}MdcIN z+!D++VQ@lmS<7Wz08@Q7z#a-VXj%X^QrPyUv$wy(d$?Y^Qcoi>>|kd{go|H_8=Xx7 zVHvnq0{}hAz}kkLJ8O?pamB#hcw_SuECT-l4DHGU);`f<`5AO5VN_JV5jA9rYQ&-G z(=PE!rV)Dm7^|`=IWcA!+IS|uSQqUPXTtvBv4?ZpeC)N9UNLak5lQ_Vg7(w4W_!n) zk<3v&%{jL1*hM^Q8$N2!;;ql${LdENBxGgsn`7o$$Hlx83$XiNYC87ctvu!{m9|kf zPN?L^YTI)^dESRVaL(peZQO2KkxXS|o4*xeIBFd1{6M4zr6mLIapBYgIOOnLVTY6X z%TG@p^LNS3e?0LLPa9*q#5SaM-Xb{lB`7&VVt=%qsYYTJW8_T;?Fu_M$_*z5ra0Qb zX5tHLFQ7Q?n#qr`aG&y)z~;j9$cC>uF7xK{7|-gm)Y zeBy#_yc(Tc5(mRUfl6TpEFKd^Dx1RN=y-X(49@_$Jja?tlbhZpdHg>mFXrRat9Uc? zDqdku_|@kpGhW>YB}eyachdLl@>%>I_dby4Oep^Y}HRTv-8MiC-gN_rfnE zzs|?BYyCjtE#u|s`~Ld6LAU_QuV-nF5j3vxof8EOg54B!O1bZU_5D6jZ+$9%kcrJH zbITm-$OKU3o%k}rtjj&;YE7XSCU>ja=k9VB&$kW#=)%sG~M_6 zx7N)cbIIf}w@ehF<0ODCd%3&|z?$b9VZ&^sjkVFj)QPQs^FNoIbmnGF9D)UgMtTV0 z5I7VL!XO#WS`HPU^)D@~JzB+8aAh0;Z-Ew8k1ZQ!ZJ5ttc2#s{eUNoomco*5-R90K z&+YTCJg4M0kIXB{qD1gin2l|uyV!P*a@jN4 z`QLZW_WApMH%#+Jn3CU|5<2bz=<*j@eEEZn5vE3o1sm%kumg5vS_E6~|Naa9;=N~W zdyRk6PQ%fE3Dw|?8d346xACR*{4*iG!^-zcbNzP;+r}UDRiB+a2n|S--|4a_{s&XY9fiHY8EB_s`Gdav|XDSynECk!$;yaP| zp1u7w_y6Fz8xHgWm>Ogw1siS$?1&wjI>}a^tq*wr zMKArt`P)9detYM3u@An!*OnA}FU0$F{}D^XI|$?N=lzExr5{|bI)9r-z`6Lshtl8p zr>Q@D=DdyIEv;Y+d)&pkWc{W{D8W(Teuj0Iq0 zZK2o&Aj~fUJ2-=TzT><{I1tm7Aj|F{3Bx_VqNMR(l5@V1yx;-JKm2a$|3QH0s`70d zfsK5B_}gcuGbim_|Df>lw)A1vWG|Y0cZ7~k03Fz} zaA3pDqD_qz+kyE7;8j4FI==0m?>PUFALmNoz_^(Vn+L9x__y;F%-tUK?c37d_OkRx z-#j_x7U`$lvaoc)qi>N2=z>juwECN44?bBR0C`Rsu{83I&jk7fS>aJ%w6cPm5s$jj zbs#6-j5>D%%7Kng!AaJM-AMrQoOIJD7YA7vl%IUl1YN`{0eRO3T>1%XH&4q0#+=2P z^x_GysW@U}#@0uye8SQN*i=0K8U=mt?|4<(jxEfRn-r7Q$OEC!$U|E;aJB#V`8z&+ z&v#w)NcbrSCT#Kx)9!EX5CF@AR1Vexu(?yi#e$ug7Q(auyz~iMYZ0(3oV5j$S+e6Y z4x|BVGeOt*pwh%0TX!H~!v*OZFXA4Q9m&6kv+2U(m9qKeWVvLt*(3&#b^R~V z4}dRwaNWl^H7=jb!_r($WV9d$;S@x)QiST*X`$2y`+AXfQHkA8jA z#oU=L#<_?)mvbes6sGwKyehE|yq{o>@ASBd)C(1tmB<Q7_(E=&Mto%j)s|i%l@~?ehVP(PGC(Iv1oWjF zZ5sWX@x~kVgMBz0sS=jQWLtjNw^15sjMI#Vd57u9iiZvweU*z*)!Ux;oxANd_k7nZ z`D@OTm;>g5Ibm)vNd_)JJyj}s;Nf5|fT_ifg|LXg4%$&WY{wk{p$3Epy%WrYyCJk$Dc)7qF%dv>rH^&kCTZB2R@ubN)01o-`^!!~ za+&=8zNh9Fz1TV5Q}TCg1kk}PSHuFa2UBOnf?2R~5jZG<15>X^YY}YG)DXZd5jykH z5dduMH3@FB=-pvagiK2v)51Vk{K_5^f?%auI(0C8| z|yb222eQcQv%$)iF8CR}Y*xtBl?bH<0*XuU;@cxVa!dvr+ zPV5{z*Uq_f?}RxC9sLB5S4>$rc-8DSvK>?*7VNkK;6OMa4vYgd4b;~AzyG4Yxb2(H zztg+dZGElxlKu;_jDz2p2*E&Y!870_6hJe5&B=*^&Y1;c?Z{!EdSa{$N7=T8coiAM z_)$VVCR>a4facWKNNBmH9=q<3^#o{5CZ8S!EuEkp#e^X#NK^+rLNEKI;*PRRHex|J zSQ|lo4+pZUcfb7AP$U!BsggP zzmvpUAM}CsFMIEqTmSM)7i)ssxW)C(Ou{mU!~D$gJx(=xYLk)|!_Ji+%rZC!aD^n|4y2nWQ0F~c3CY2aq~fgiZ|rLX())>A&k<@L-h z!vX&d0P?Qpd^m9i8^CY_rF?>}A>s)`j)g>?OWJw8z8Z-I=`l>2yS@V4Cp7pf=!%xX zMbP=KxMu zf-TSc&y63s?VB#R^Lx+S_LpZ}vUAvV$DP(-rVe=lX~^PA+qhkkYjw$1XLSI{F9*Vo zq=V@MsQY=Mu+@8>!SK5zSnu^gjgN6I#fm*XKOi0o;RXV&w-&`1eUTalFGWgbSRaAb z3^LBegO!bRhi&p;i@ZSK6l6TK2U_)ikPUQMBUr*xy_`J{ZERIXpR9BM6-@VVX1N(7AL@o!gz*ECN$dG3>Xed^;C_J)Sx*791D{$boXe95@GX z8qjG_w{SIhnZG3b#Q8gTK-O(O9JG@p6lrJ(O6L}-O}jTdD<}fD{vl1%78cW3B)Ww5eMe;Jv}v@E1>^)itnXONCokAB z-15BhB5!$|Bf&Wmq@6qG(7AL@om&GeE(-?p?JC3UeYUBV*#14$$KsjIzoCD}U zI-r7sD{Ohd`!0Uz?cRLBo!`A~`)k*2*%{wCcP7#apP(j`iB~?OD;cP=Y$F$PZX_}s zwx;yMPTfeHPLNi=O|ppt3^8%RmV60+hpRr=KPbSsRnLL8~jj;RK6c8B!zlBghO!8|#e66q~D@vATw%%%3oy&go<4 z?fA@X-+a-Xx#gMO@;E1gb0j!t&Yg4UTso)2pjija7|^%(d}UYwjzH%mfND0TfpXv+ zKnKzRbzmK2LAszGkk8urns=YI{k3QD)zKhv(kfKyXnhFZ=44$PCl;9#T{`$lKKL}O zIxz<98zPu0We+75oYMg#+-)&VDxS&Kp)z;ahKXGkr%loU&-+Oa?HqK2-{>%+(#+E( z*!48{BJV>_Y+m;?`ku~v{g3m8=QUs2`j~sYbG^I%{G8NW;4N0}oH=*S;gtLxy=B7E z-&VM?EP!bcrhySpi@?Ei5FJbh)xmX;T?9hWUJV}fzV$DE56=d^gI?$FiHvF_aCaiX zu_I|J>&3^`_%L56*>i z=wr{%VF7G~b z`)fbx^TGHfxz+6fw=+yGIS|3%-s=}AkH z4x-?Ix(EaZ*#URp=O;p1*_H?KI*x^K;=9k>`r7)EdHTtB zTRzp*LeW+lz+PJ)lncvOvZ_NeCRW8#Hv^ilZnSO2l}D^+r!9D=kT%v2ZZ3?nGm(qP zaC8t*A~0Ml`%Z`sM=9MrMu5$%?XtEHj8(i16MNMwo09jO$(tP?a6fkbj?cXI%Ue%n zEMJCQjVstO7A_fS<<5n3;@k+%m2)Q8I05r3U%9d_07uF}6Xt0L)B$#|1$P_=-$`&% zg!zft{GbnPdf9E?c=3tvUbpSFpSoasO>QS;44Te)_CUz&n=FV_n_Rsk8+lRJRsxvl z)(JA2l^;P%rwkRQDIP-8vY{U1BU&m`Z2gpim)XGUJH?RJtnj3h8RHDTV*|>N<<>Ez zjI7q_b>^+k_MX%Eko8I4?7WAuy6v0RpLnl#tbf!W{Abhj>VAIjbiwm?F z<0zkENH4)~wICv*@&Yd}N)0U*20Gcu>&(+P?99h_xPA5MTOVuUyJ_IJ{Y zJNC|jbFsT!zZ2(5UA_|*fCK123KKmo0tel}cM_ZoC&kH`pD-7KP%rMG+2#dq;T z+P|H-{dM)6z+&*9>J3RTmu;2SLvoq6L*;{hWg<3jT`&+&4TYVRZt&td=MFaj%v@QL zHR@I|Ve3~b9zg9xwTd_BkvCvPX|%5qvw{6`dpfT&Pv`#rW9RMs%&Sk|^4NR5W8Fr{il;$$0t6?+NpW(V zBqz&Bo4|>jXdad~z4XB!*!1$-zG?kk-+kux*SZ6K^1K~6Yx52s{tVy8q_XPnslWs( zVm$S-YL!~1qrBXx9uNuHNIZ248rFlYT=xVF3vJ*$cOv^Nq9p;~+7!d9LU{zKe%gei z0~GF)25LAX$p%Kp2ih;L=gTd-{cA}2zdU{OW4O&Z`42z0)wep+*oYmg3FIA1!LfCW ziB_Mz9rtM-tZV|S{EmR{v<2Xx&JXfLI|)vP6XOIqQPU!D;+#amNu9^ib$jFvI4p)8 z!(zB#XFV^tTh?x0IcRlrO;AQMHy&^sxRZ{9R>hE*Lu&S@Y9w&Rqa$cDpB~sWpAD4p zl{p+ejsH9k3jtBInPTcc$)qQp9@1Xbyv;kE?El!g+ui9OHzd8g{nn2@|8raa9e>Bb zahV5Yf@3E*mX5377(3QN$6o-^aL?ai@SV5-rXijmco)C~PK=Y}WbJMt%un<@T@%hN z(#vWwym9^A-cwhG9iRE+c{_9Z#XGZ(H%b1(?w&Tb0g9xR@may76Xb#KP{{I_*GUMGBtHznRb*MeYCn0O{AcOJGQQ*sYX zo$FNcqReAG1{g#(KZ9>F!^Ui0IV#by0sDuL zr+p^;-X3PBK23N^eiMI6ddEv}>=qf+2|Bc8!qVT-@ZGWirb%#O1bOi^abhRaNp(ka zq6K$4CtffSgefuhgtc)&eAwOf!SBE1?Hf1T&15tw|E;bT+h6ywb9a8` z2wH7{_?V6>j^+^>?GbM~`r_ zw>2!z>9(fYM(3xtZ-N#kUOd^@XTdRWEF2fXF>|C%qzTXKCLb5ZM@&i<23Lz=ag512CG9CB@m+8G z#tnBJ7fsRf*qs7QcH)zbV?2`lBfy>#eZDQWPneg@+Q)#{N5MYZ{|Ouu$3}3R1ji1S z@4m#hQ^I%a0|NGIP=LQy)wb(Wh-^_F(!IX*f{DY zEIom;d01JGyr7Lf6Sf}{*f+tx+GoN3I~IatwL5V9zANFoeF039HchJhL_6Vv2{3^P zVR8s2iZCUQ*u8)f3X!T--r9poq!!$1(d|E)()qNG-4 z7&fd3i&EPr`mvJ^t)Zx|)IWTf!%Q$^^HOJk&LwqLAI~ihpo{EssTu_XfFXiW7$%q~ zL!FO->6q|8nAz{E;*-{>i~quYCwi(sy+ZHiKyy*E!tB_y5MRS>4`46W#fN$^V=N5A zK*3mGE{4l^bXkKkv3ym0vTMZ4e!JNIdI>$%XR3cRQ*-XjYVzy2`2p-@GeD>pXBx^x z%bJY=R?CWKTnr3mMFzs~vn&hJy_kNx?qwb%FieQ(e6zRy}4Ck1$$ zcJ13$p-`AkoG^ZhLc!_ir!vAnR|AF(Rw&epiQ~skUB=awn#5b3?!A6;+Us4Wa~|FE zoN;R4re3a@PcQ#|K@o6h=ETCM1@hVKH}6{;R=t0{>O+)1QErg#a~BK_zw6fi^6@IA zO05yZu^bl`H?P9#o+oZ^YBZwhvd;zzl0us)NssFMtp$yZ*kr`>r+)4ku2pcnO;=U< z#<0XFUa5-K=%QsOU7{hb)pONqoss*to*F?C0t7j}#d@fnUawS5#s6Ky;*4m`8GDVG zUgZAq^r8z&WnKEZ3q7zy_JDz#xmLSiK$&8!Dj&MZb(P~fx;v**g<5zG{em{#<9VmB zN_XCs+hH6%P$PyNxjhG7$8D9Qtm6xu;kFPU%Ck93>DexdZdimMU$)G^R*pANDx($8 z_8whg2T$(wRO`Ne8`qbdS~gjbBi1&J;Fa;bwOOl=AQwz|`6(=`c3P-)O?L4Dt!niV z1LT4|b&hn?NuKr&5W8}G29opBrlmu$sLnwn=Eau3Q>m{S?{=Rm$m^SuUFp=#usu1q z+LxRfXQ-?Tix~4I1$T(&gO@s%c+&s(an5P?lnKcFSGY4#mA@XH;zLh74VBroGp#n^ z(p5Xc+N8Yi@^~NSpuZre7`zOm>(Ft6TvmR&H0aG}SUiO=UWC-G#)I-8L2ju$9M%Iq z`H9;l$$z!edK{&E(^VB385lc&9GS>RDx+`Bo`pD(&^3}YLZ7sg7RB>?+HvPL6Yg`= zOh1j|mQVZjHLcpeQ<8Rly`fO8Ni`dmGy;fZ?>{b2omZWTu*_b(#4^ZpLR!IR3VwGJ51$ElV<@NVZMx!Yp42FxSlrX?RG{g(14? zeYefvL@3AE>5{$Ss6zXk=M$=~o6*)uf*^Ob|G9^%M(Jm*%aNobd2Ti~z}Y{r=8rew zd*OnswycOR8(f=28T$?>TU#}WF6Z`E>w6vIzO(Ngu?9%`NWs2hw7eu6yn52Gh=L=d}hT*Wt=>d9LJ zlwLlNhw=i=Z;e%^|jL9RxqmrCVDwnHv^$x>q{S>Q>w0$oMv3S6JmZ;T0THK&nTWgNMM!7E_ z@!Q`jP)2cXxmwW=qnR=H>)!RrmQ)Bd!ti(_p|=>j)xzx;()b52E2l#gRMf zfP%R7l2lrGJcxA|Gr*Ovxq_XVNnpYJ`b&TRh>q_hX-KZ^6~@7BJm2zaxQvXgQxkVsfC;EJ{O$%8US<0u7|eyjBL38aDdEHh8=Pqzmf(#w(Y6}#ntkb5La;tx zlJf6167SWaUV@x9eb<_vEXcn|(zMF&9T|{<03@Fp6Rbh!TIN1o{;Z#Tq^ckWNe_WTpj|OZ}7+6{Me5orQ)Y)moxAkSk zI97L3cqzriG{lpQjw9K@LB9+m4Ay>oyJ#e{hOymUT;WH>l!}fbIy;{N)^i^rla)SJ z-%%zbfWnZSIjgR)7C9_bkc|wMvwpQ1PyUos{gLth}5D#IBJjxk!-54p5u zqwz9BdWIyOY)jfhkwQ(hw6vJ#I#YM(WYj3DtE)Az4L;QWnzWS`{e|bvA30~@(p6h( zV^aRia!Cq&wHmAuH#k(EB*W(r+xf9k#QC2wMjD&KiFRmxSb2)CX9<^+a*adyt#!< zo2Jnq#|?)n;)6HD(d6d|(+M#HbP;mPu|zY#vc!{WVYRV(}7Yo$IPH=3JhILY&qE#SAx4{(@w$LOPY@Wv=x zbhv&zFb8Q>Ck@Q&k2Uf9?`Xv?VX@Z4do4zY`tD)kmIyhy<#^Sj;`*_80JaCm59!9V z&JFDTA$6Y_X@?(VXOzx#D+vrq2w(>@J0{Gj^^&ymNL>(xZ4142$)X0#LRC)U z{}&H~SWVT-(C;H=HVvdz2dy2W>F3IE*Y0JsN67c#dmL1&!|Jw?*sQt(iQRX3Tvw)GhXS#i97>MS8Xz|7 zy`}y=jtZSBZjy$~Zz!i@JNA@n4|$+UJppd`RL`J5=K?p@qq}2NU=Y5U&AGjEmfzt_ z-9e1Yb1qjEeeY@$f42obOXb>}!nz|%R5#;S}zGdSCuxRi#I}Ae9K~3P7%k_1_64#2EA2j@B(sz*c=B5oOL25aUg3ZiI|lE z&(_hY!@$dLZ8LyXj<15>bEZVHp5_DK&a*7>p#O&=RjGli-mJ~+`iz>Bur2hW^cK7x2DlzjcdhkT6I#-l>T~>I<0sUE4clVy|mb3z|0Bx zU1Wra0Iq_|w>vWE+5o!a9~#h6p<~6n(h;#?bLYoaPm}X8R?)wMcAGM^R)bApcizH@ zR5O?Pxl+HA3)4{w`Tw`9&|^#8m_j-a{v35}GpCaFLOYphvdD_DEE}(L3tn8CN0rl~ z#lMppN%*5t)%%(2+~)6P)}TW#h3FOJT%0$W_ravc$0f@7Fvt+=HJ09#213v|6puPQ&`rVpnHckH%cM ziktCqYR4ev$4}-_zEoh0sydV|=OP^QG5@Lgsc6C`jHTM7G*-+jK+MYvyaEpEe!?_4 z>-;zHNC?<}bv9?0tGa^q3he^SjpA#kDG~dj8+uQ_SUGDq(4%dJKkxdTBRXvDwPpBt zCxt?JkG=({bp!6!-(nK47HQ1?GJgZop!^Ae$9qy5&!T(p3fpMF1dtub_x<(;93%;@+BJM|NwxOB9GfZ~ z?y0#MDada!k_W&gl^4g;A5ybYq`5e6!w4ian$y@3{PPBRe zzrxENwDk^Z@Ww6PgTbW}t;N)0JRgYR9n?RPrSf~Qb&*{On;C)N=b--?TG_jijCdh8 z6T%zVl==o!YIE5pW2UcHqao<#B!cYndhqan1>;oHa^seIFq-2{QGV&kWb*GS%3o4l zbBM=lyA1hz>f#=&?UefzID6l-o$!U%yP=@{|7lo0ILab`br1`TKEBK@vbi4}wtIj^ zT%768fL;O{pWb;+bJ{vC4L+TWJx#Q7f{o(A;S{T@_Tp^L_h80E@~If>{b~(yiY65) zUYmUB2MSwz312;qt#fst1h(V+4=$~EA))Ul9fbbB^?z+oUD%FM|835OE6=Z0XoHZ< zJH>fK4Rb_#$)dKEwUrWlMku?#grYfv7eMC+?yT)i*B&=WJNfZdr6b#-OwK@sZb1a9 z+C?m@c&WTxH5HdNN~a&}#SHsfBM?{|BxKg9MXxCj*2qIm|9(vEDX%wB%2oET=$ljg zXJbm*Bu_y;6#a`U0aK4I|L+&MtHvub?ZwYWwbK_Ar8#D^r}?AZl($Aq)X~YUcSE^Y zNIbzA!@%pQCp{Sk4fO5&3{Uo2_W~Ks+jUNj-6hDhV@q8c)|3Z`f0kmR8a!xy$MG65 zL7r@^J_r@tobYfwvj(8$OEq@5h8Spvj{U5tmE@<=r^5^KyV0+$DKC8>^9?5DGk{%2 zD_J(ni~&S<48!C6j1UMV8NfO9Dxr#0g{$_#4#Q}dV;tEV1}1qOOtzs!eS(rbxcIzV zTs&^3;yvQmibYOjU>RP9y3cC|Ztxn>$tQ!Y3>7yFy$tKxX0vYzov~pukB?h2J|84p z+!IdD;_F6virdlwOrHeyQtLLBdoh7G204y;>d*W`_EQR5{`L7vAE;0$K73f7zCpr; d5j8mjMNv%9sNrQdE%1+GqG!PP91n5zKLLtjG$sH5 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index d3a6e5bd80ba81a7111675a70d5a4377894e3abe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78717 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 bvd~dl1~2cJ-s#NUm!Q0rQ<1HdHVyedd#E1) diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png deleted file mode 100644 index d3a6e5bd80ba81a7111675a70d5a4377894e3abe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78717 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 bvd~dl1~2cJ-s#NUm!Q0rQ<1HdHVyedd#E1) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index 0bb5a6f..d662fc6 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -30,21 +30,40 @@ "verify": "Verify", "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", "sendCode":"Send Code", - "forgotPassword": "Forgot Password", - "login": "Log in", - "emailAddress": "Email Address*", - "password": "Password*", - "enterPassword": "Enter password", - "forgotPassword": "Forgot Password", - "login": "Log in", - "emailAddress": "Email Address*", - "password": "Password*", - "enterPassword": "Enter password", - "forgotPassword": "Forgot Password", - "login": "Log in", - "emailAddress": "Email Address*", - "password": "Password*", - "enterPassword": "Enter password", - "forgotPassword": "Forgot Password", - "login": "Log in" + "serviceIsUnavailable": "Service is unavailable at the selected address.", + "pickUpLocation": "Pickup Location", + "destinationLocation": "Destination Location", + "continueT":"Continue", + "plsSelectSourceLocation": "Please select source location", + "plsSelectDestinationLocations": "Please select destination location", + "selectVehicleType": "Select Your Vehicle Type", + "plsSelectVehicleTypeFirst": "Please select a vehicle type first.", + "plsSelectPaymentMethod": "Please select a payment method", + "insufficientWallet": "Insufficient wallet balance. Please select another payment method.", + "promoCode": "Promo code", + "thisOfferNotEligible": "This offer not eligible for this booking", + "viewAll": "View All", + "writeCoupon": "Write coupon Code", + "redeemNow": "Redeem now", + "plsEnterCouponCode":"Please enter a coupon code", + "couponApplied": "Coupon applied successfully", + "couponExpired": "This coupon code has been expired", + "invalidCouponCode": "Invalid coupon code", + "orderSummary": "Order Summary", + "subtotal": "Subtotal", + "discount": "Discount", + "orderTotal": "Order Total", + "confirmBooking": "Confirm Booking", + "waitingForDriver": "Waiting for driver....", + "cancelRide": "Cancel Ride", + "riderCancelledSucces": "Ride cancelled successfully", + "failedToCancel": "Failed to cancel ride", + "pleaseWait": "Please wait...", + "change": "Change", + "yourSosRequest": "Your SOS request has been submitted to admin", + "yourSosrequestAlreadySubmitted": "Your SOS request is already submitted", + "payNow": "Pay Now", + "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", + "somethingWentWrong": "Something went wrong, please contact admin.", + "cash": "Cash" } \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index b6fcdcb..566a602 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -40,7 +40,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Customer + Fondex CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 13a93fb..2693203 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -29,11 +29,41 @@ class ConstTexts { static String verify = "verify"; static String useYourMobileNumber = "useYourMobileNumber"; static String sendCode = "sendCode"; - static String loginToExplore = "logintoExplore"; - static String emailAddress = "emailAddress"; - static String password = "password"; - static String loginToExplore = "logintoExplore"; - static String emailAddress = "emailAddress"; - static String password = "password"; + static String serviceIsUnavailable = "serviceIsUnavailable"; + static String pickUpLocation = "pickUpLocation"; + static String destinationLocation = "destinationLocation"; + static String continueT = "continue"; + static String plsSelectSourceLocation = "plsSelectSourceLocation"; + static String plsSelectDestinationLocations = "plsSelectDestinationLocations"; + static String selectVehicleType = "selectVehicleType"; + static String plsSelectVehicleTypeFirst = "plsSelectVehicleTypeFirst"; + static String plsSelectPaymentMethod = "plsSelectPaymentMethod"; + static String insufficientWallet = "insufficientWallet"; + static String promoCode = "promoCode"; + static String thisOfferNotEligible = "thisOfferNotEligible"; + static String viewAll = "viewAll"; + static String writeCoupon = "writeCoupon"; + static String redeemNow = "redeemNow"; + static String plsEnterCouponCode = "plsEnterCouponCode"; + static String couponApplied = "couponApplied"; + static String couponExpired = "couponExpired"; + static String invalidCouponCode = "invalidCouponCode"; + static String orderSummary = "orderSummary"; + static String subtotal = "subtotal"; + static String discount = "discount"; + static String orderTotal = "orderTotal"; + static String confirmBooking = "confirmBooking"; + static String waitingForDriver = "waitingForDriver"; + static String cancelRide = "cancelRide"; + static String riderCancelledSucces = "riderCancelledSucces"; + static String failedToCancel = "failedToCancel"; + static String pleaseWait = "pleaseWait"; + static String change = "change"; + static String yourSosRequest = "yourSosRequest"; + static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; + static String payNow = "payNow"; + static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + static String somethingWentWrong = "somethingWentWrong"; + static String cash = "cash"; } diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 5a8f5b1..0df9bdd 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/tax_model.dart'; import 'package:customer/models/vehicle_type.dart'; @@ -13,6 +14,7 @@ import 'package:customer/themes/round_button_border.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -284,8 +286,7 @@ class CabBookingScreen extends StatelessWidget { controller.setDepartureMarker(lat, lng); } else { ShowToastDialog.showToast( - "Service is unavailable at the selected address." - .tr, + ConstTexts.serviceIsUnavailable.tr(), ); } } @@ -318,8 +319,7 @@ class CabBookingScreen extends StatelessWidget { ); } else { ShowToastDialog.showToast( - "Service is unavailable at the selected address." - .tr, + ConstTexts.serviceIsUnavailable.tr(), ); } } @@ -330,7 +330,7 @@ class CabBookingScreen extends StatelessWidget { controller: controller.sourceTextEditController.value, // backgroundColor: AppThemeData.cardColor, - hintText: "Pickup Location".tr, + hintText: ConstTexts.pickUpLocation.tr(), enable: false, prefix: Padding( padding: EdgeInsets.only(left: 10, right: 10), @@ -394,7 +394,7 @@ class CabBookingScreen extends StatelessWidget { .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: "Destination Location".tr, + hintText: ConstTexts.destinationLocation.tr(), // backgroundColor: AppThemeData.cardColor, enable: false, prefix: const Padding( @@ -431,7 +431,7 @@ class CabBookingScreen extends StatelessWidget { SizedBox(height: 15), RoundedButtonFill( borderRadius: 10.r, - title: "Continue".tr, + title: ConstTexts.continueT.tr(), onPress: () { if (controller .sourceTextEditController @@ -439,7 +439,7 @@ class CabBookingScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - "Please select source location".tr, + ConstTexts.plsSelectSourceLocation.tr(), ); } else if (controller .destinationTextEditController @@ -447,7 +447,7 @@ class CabBookingScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - "Please select destination location".tr, + ConstTexts.plsSelectDestinationLocations.tr(), ); } else { controller.bottomSheetType.value = "vehicleSelection"; @@ -506,7 +506,7 @@ class CabBookingScreen extends StatelessWidget { Padding( padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), child: Text( - "Select Your Vehicle Type", + ConstTexts.selectVehicleType.tr(), style: AppThemeData.boldTextStyle( fontSize: 18.sp, color: @@ -689,7 +689,7 @@ class CabBookingScreen extends StatelessWidget { controller.bottomSheetType.value = "payment"; } else { ShowToastDialog.showToast( - "Please select a vehicle type first.".tr, + ConstTexts.plsSelectVehicleTypeFirst.tr(), ); } }, @@ -909,13 +909,13 @@ class CabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: "Continue".tr, + title: ConstTexts.continueT.tr(), color: AppThemeData.mainColor, textColor: AppThemeData.grey50, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { ShowToastDialog.showToast( - "Please select a payment method".tr, + ConstTexts.plsSelectPaymentMethod.tr(), ); return; } @@ -924,8 +924,7 @@ class CabBookingScreen extends StatelessWidget { controller.userModel.value.walletAmount ?? 0; if (walletAmount <= 0) { ShowToastDialog.showToast( - "Insufficient wallet balance. Please select another payment method." - .tr, + ConstTexts.insufficientWallet.tr(), ); return; } @@ -1064,7 +1063,8 @@ class CabBookingScreen extends StatelessWidget { controller .sourceTextEditController .value, - hintText: "Pickup Location".tr, + hintText: + ConstTexts.pickUpLocation.tr(), enable: false, prefix: const Padding( padding: EdgeInsets.only( @@ -1146,7 +1146,9 @@ class CabBookingScreen extends StatelessWidget { .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: "Destination Location".tr, + hintText: + ConstTexts.destinationLocation + .tr(), enable: false, prefix: const Padding( padding: EdgeInsets.only( @@ -1193,7 +1195,7 @@ class CabBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Promo code".tr, + ConstTexts.promoCode.tr(), style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -1227,15 +1229,15 @@ class CabBookingScreen extends StatelessWidget { controller.calculateTotalAmount(); } else { ShowToastDialog.showToast( - "This offer not eligible for this booking" - .tr, + ConstTexts.thisOfferNotEligible + .tr(), ); } } }); }, child: Text( - "View All".tr, + ConstTexts.viewAll.tr(), style: AppThemeData.boldTextStyle( decoration: TextDecoration.underline, fontSize: 14, @@ -1296,7 +1298,7 @@ class CabBookingScreen extends StatelessWidget { decoration: InputDecoration( border: InputBorder.none, hintText: - 'Write coupon Code'.tr, + ConstTexts.writeCoupon.tr(), contentPadding: EdgeInsets.only( bottom: 10, ), @@ -1313,7 +1315,7 @@ class CabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: "Redeem now".tr, + title: ConstTexts.redeemNow.tr(), width: 27.w, fontSizes: 14, onPress: () async { @@ -1324,7 +1326,8 @@ class CabBookingScreen extends StatelessWidget { .trim() .isEmpty) { ShowToastDialog.showToast( - "Please enter a coupon code".tr, + ConstTexts.plsEnterCouponCode + .tr(), ); return; } @@ -1376,25 +1379,26 @@ class CabBookingScreen extends StatelessWidget { controller .calculateTotalAmount(); ShowToastDialog.showToast( - "Coupon applied successfully" - .tr, + ConstTexts.couponApplied + .tr(), ); controller.update(); } else { ShowToastDialog.showToast( - "This offer not eligible for this booking" - .tr, + ConstTexts + .thisOfferNotEligible + .tr(), ); } } else { ShowToastDialog.showToast( - "This coupon code has been expired" - .tr, + ConstTexts.couponExpired.tr(), ); } } else { ShowToastDialog.showToast( - "Invalid coupon code".tr, + ConstTexts.invalidCouponCode + .tr(), ); } }, @@ -1427,7 +1431,7 @@ class CabBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Summary".tr, + ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -1447,7 +1451,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Subtotal".tr, + ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -1485,7 +1489,7 @@ class CabBookingScreen extends StatelessWidget { Row( children: [ Text( - "Discount".tr, + ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle( fontSize: 16, @@ -1547,8 +1551,7 @@ class CabBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})' - .tr, + '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( @@ -1576,7 +1579,7 @@ class CabBookingScreen extends StatelessWidget { .toString(), taxModel: taxModel, ).toString(), - ).tr, + ), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( @@ -1605,7 +1608,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Order Total".tr, + ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -1781,10 +1784,8 @@ class CabBookingScreen extends StatelessWidget { controller.selectedPaymentMethod.value == "cod" ? "Наличными" - : controller - .selectedPaymentMethod - .value - .tr, + : controller.selectedPaymentMethod.value + .tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 16, @@ -1802,7 +1803,7 @@ class CabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: "Confirm Booking".tr, + title: ConstTexts.confirmBooking.tr(), onPress: () async { controller.placeOrder(); }, @@ -1858,7 +1859,7 @@ class CabBookingScreen extends StatelessWidget { ), SizedBox(height: 30), Text( - "Waiting for driver....".tr, + ConstTexts.waitingForDriver.tr(), style: AppThemeData.boldTextStyle( fontSize: 18.sp, color: @@ -1870,7 +1871,7 @@ class CabBookingScreen extends StatelessWidget { Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( borderRadius: 10.r, - title: "Cancel Ride".tr, + title: ConstTexts.cancelRide.tr(), color: AppThemeData.mainColor, textColor: AppThemeData.surface, onPress: () async { @@ -1917,7 +1918,7 @@ class CabBookingScreen extends StatelessWidget { await FireStoreUtils.updateUser(Constant.userModel!); } ShowToastDialog.showToast( - "Ride cancelled successfully".tr, + ConstTexts.riderCancelledSucces.tr(), ); // Get.offAll(const CabDashboardScreen()); Get.back(); @@ -1926,7 +1927,7 @@ class CabBookingScreen extends StatelessWidget { ); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast("Failed to cancel ride".tr); + ShowToastDialog.showToast(ConstTexts.failedToCancel.tr()); } }, ), @@ -2021,7 +2022,7 @@ class CabBookingScreen extends StatelessWidget { controller .sourceTextEditController .value, - hintText: "Pickup Location".tr, + hintText: ConstTexts.pickUpLocation.tr(), enable: false, readOnly: true, prefix: const Padding( @@ -2068,7 +2069,7 @@ class CabBookingScreen extends StatelessWidget { .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: "Destination Location".tr, + hintText: ConstTexts.destinationLocation.tr(), enable: false, readOnly: true, prefix: const Padding( @@ -2118,7 +2119,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Otp :".tr, + "Otp :", style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2281,7 +2282,7 @@ class CabBookingScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr(), ); UserModel? customer = @@ -2480,7 +2481,7 @@ class CabBookingScreen extends StatelessWidget { SizedBox(width: 22), Expanded( child: Text( - controller.selectedPaymentMethod.value.tr, + controller.selectedPaymentMethod.value, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 16, @@ -2492,7 +2493,7 @@ class CabBookingScreen extends StatelessWidget { ), ), Text( - "Change".tr, + ConstTexts.change.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 16, @@ -2526,7 +2527,7 @@ class CabBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Summary".tr, + ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -2546,7 +2547,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Subtotal".tr, + ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2582,7 +2583,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Discount".tr, + ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2621,7 +2622,7 @@ class CabBookingScreen extends StatelessWidget { Expanded( child: Text( '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})' - .tr, + , textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( fontSize: 14, @@ -2646,7 +2647,7 @@ class CabBookingScreen extends StatelessWidget { .toString(), taxModel: taxModel, ).toString(), - ).tr, + ), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( fontSize: 16, @@ -2672,7 +2673,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Order Total".tr, + ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2713,13 +2714,13 @@ class CabBookingScreen extends StatelessWidget { children: [ RoundedButtonFill( borderRadius: 10.r, - title: "SOS".tr, + title: "SOS", color: Colors.red.withValues(alpha: 0.50), textColor: AppThemeData.grey50, isCenter: true, icon: const Icon(Icons.call, color: Colors.white), onPress: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr()); LocationData location = await controller.currentLocation.value @@ -2740,8 +2741,8 @@ class CabBookingScreen extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "Your SOS request has been submitted to admin" - .tr, + ConstTexts.yourSosRequest.tr() + ), backgroundColor: Colors.green, duration: Duration(seconds: 3), @@ -2753,8 +2754,7 @@ class CabBookingScreen extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - "Your SOS request is already submitted" - .tr, + ConstTexts.yourSosrequestAlreadySubmitted.tr() ), backgroundColor: Colors.red, duration: Duration(seconds: 3), @@ -2777,7 +2777,7 @@ class CabBookingScreen extends StatelessWidget { controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( borderRadius: 10.r, - title: "Pay Now".tr, + title: ConstTexts.payNow.tr(), onPress: () async { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { @@ -2822,7 +2822,7 @@ class CabBookingScreen extends StatelessWidget { Constant.userModel!.walletAmount! < controller.totalAmount.value) { ShowToastDialog.showToast( - "You do not have sufficient wallet balance".tr, + ConstTexts.youDoNothaveSufficientwalletBalance.tr() ); } else { controller.completeOrder(); @@ -2858,8 +2858,8 @@ class CabBookingScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin." - .tr, + + ConstTexts.somethingWentWrong.tr() ); } else { CreateRazorPayOrderModel result = value; @@ -2873,7 +2873,7 @@ class CabBookingScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - "Please select payment method".tr, + ConstTexts.plsSelectPaymentMethod.tr(), ); } }, @@ -3007,7 +3007,7 @@ class CabBookingScreen extends StatelessWidget { : Expanded( child: Text( value.name == "cod" - ? "Наличными" + ? ConstTexts.cash.tr() : value.name.capitalizeString(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( diff --git a/pubspec.yaml b/pubspec.yaml index 6d943bf..16a2b21 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: customer description: "A new Flutter project." -version: 1.0.0+2 +version: 1.0.0+3 environment: sdk: ^3.7.2 -- 2.49.1 From 38c3394ef8a4aee5275c055d9750f65b802823f4 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 16:41:57 +0500 Subject: [PATCH 12/30] BASE: Implement Localization In Cab Dashboard Screen. --- assets/translations/en_En.json | 9 ++++++++- lib/constant/const_texts.dart | 17 ++++++++++++++++- .../cab_coupon_code_screen.dart | 8 +++++--- .../cab_dashboard_screen.dart | 16 +++++++++------- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index d662fc6..593f656 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -65,5 +65,12 @@ "payNow": "Pay Now", "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", "somethingWentWrong": "Something went wrong, please contact admin.", - "cash": "Cash" + "cash": "Cash", + "coupon": "Coupon", + "couponNotFound": "Coupon not found.", + "tapToApply": "Tap To Apply", + "home": "Home", + "myBookings": "My Bookings", + "profile": "profile", + "wallet": "Wallet" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 2693203..ad7a841 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -65,5 +65,20 @@ class ConstTexts { static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; static String somethingWentWrong = "somethingWentWrong"; static String cash = "cash"; - + static String coupon = "coupon"; + static String couponNotFound = "couponNotFound"; + static String tapToApply = "tapToApply"; + static String home = "home"; + static String myBookings = "myBookings"; + static String profile = "profile"; + static String wallet = "wallet"; + static String failedToCancel = "failedToCancel"; + static String pleaseWait = "pleaseWait"; + static String change = "change"; + static String yourSosRequest = "yourSosRequest"; + static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; + static String payNow = "payNow"; + static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + static String somethingWentWrong = "somethingWentWrong"; + static String cash = "cash"; } diff --git a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart index e69a795..251c102 100644 --- a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_coupon_code_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; @@ -6,6 +7,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -37,7 +39,7 @@ class CabCouponCodeScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Coupon".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text(ConstTexts.coupon.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -46,7 +48,7 @@ class CabCouponCodeScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.cabCouponList.isEmpty - ? Constant.showEmptyView(message: "Coupon not found".tr) + ? Constant.showEmptyView(message: ConstTexts.couponNotFound.tr()) : ListView.builder( shrinkWrap: true, itemCount: controller.cabCouponList.length, @@ -106,7 +108,7 @@ class CabCouponCodeScreen extends StatelessWidget { Get.back(result: couponModel); }, child: Text( - "Tap To Apply".tr, + ConstTexts.tapToApply.tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), diff --git a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart index 3f34429..9f322af 100644 --- a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart @@ -1,7 +1,9 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -50,21 +52,21 @@ class CabDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: 'Home'.tr, + label: ConstTexts.home.tr(), controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", - label: 'My Bookings'.tr, + label: ConstTexts.myBookings.tr(), controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr, + label: ConstTexts.profile.tr(), controller: controller, ), ] @@ -73,28 +75,28 @@ class CabDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: 'Home'.tr, + label: ConstTexts.home.tr(), controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", - label: 'My Bookings'.tr, + label: ConstTexts.myBookings.tr(), controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", - label: 'Wallet'.tr, + label: ConstTexts.wallet.tr(), controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr, + label: ConstTexts.profile.tr(), controller: controller, ), ], -- 2.49.1 From 171d27de12a4c1b258fc880dae44e46fa22d5218 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 16:48:01 +0500 Subject: [PATCH 13/30] BASE: Implement Localization In Cab Home Screen. --- assets/translations/en_En.json | 7 ++++++- lib/constant/const_texts.dart | 10 +++++----- .../cab_service_screens/cab_home_screen.dart | 17 +++++++++-------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index 593f656..573c497 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -72,5 +72,10 @@ "home": "Home", "myBookings": "My Bookings", "profile": "profile", - "wallet": "Wallet" + "wallet": "Wallet", + "cabServiceType": "Cab Service Type", + "everyRideVerified": "Every Ride. Every Driver. Verified.", + "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", + "intercity": "Intercity", + "aroundTheCity": "Around the city" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index ad7a841..347d14f 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -72,11 +72,11 @@ class ConstTexts { static String myBookings = "myBookings"; static String profile = "profile"; static String wallet = "wallet"; - static String failedToCancel = "failedToCancel"; - static String pleaseWait = "pleaseWait"; - static String change = "change"; - static String yourSosRequest = "yourSosRequest"; - static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; + static String cabServiceType = "cabServiceType"; + static String everyRideVerified = "everyRideVerified"; + static String allDriversIDCheck = "allDriversIDCheck"; + static String intercity = "intercity"; + static String aroundTheCity = "aroundTheCity"; static String payNow = "payNow"; static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; static String somethingWentWrong = "somethingWentWrong"; diff --git a/lib/screen_ui/cab_service_screens/cab_home_screen.dart b/lib/screen_ui/cab_service_screens/cab_home_screen.dart index d002912..c5e981b 100644 --- a/lib/screen_ui/cab_service_screens/cab_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_home_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_home_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; @@ -5,6 +6,7 @@ import 'package:customer/models/banner_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -50,7 +52,7 @@ class CabHomeScreen extends HookWidget { Get.offAll(const LoginScreen()); }, child: Text( - "Login".tr, + ConstTexts.login.tr(), textAlign: TextAlign.center, style: AppThemeData.boldTextStyle( color: AppThemeData.grey900, @@ -97,7 +99,7 @@ class CabHomeScreen extends HookWidget { children: [ SizedBox(height: 20), Text( - "Cab Service Type", + ConstTexts.cabServiceType.tr(), style: AppThemeData.boldTextStyle( color: isDark @@ -121,8 +123,7 @@ class CabHomeScreen extends HookWidget { CrossAxisAlignment.start, children: [ Text( - "Every Ride. Every Driver. Verified." - .tr, + ConstTexts.everyRideVerified.tr(), style: AppThemeData.boldTextStyle( color: isDark @@ -132,8 +133,8 @@ class CabHomeScreen extends HookWidget { ), ), Text( - "All drivers go through ID checks and background verification for your safety." - .tr, + ConstTexts.allDriversIDCheck + .tr(), style: AppThemeData.mediumTextStyle( color: isDark @@ -171,7 +172,7 @@ class CabHomeScreen extends HookWidget { Constant.sectionConstantModel!.rideType == "both" || Constant.sectionConstantModel!.rideType == "ride" ? _cabOptionMaker( - title: "По городу", + title: ConstTexts.aroundTheCity.tr(), isMain: false, image: "assets/images/taxi_option.png", useGradient: false, @@ -182,7 +183,7 @@ class CabHomeScreen extends HookWidget { ) : Expanded(child: SizedBox()), _cabOptionMaker( - title: "Межгород", + title: ConstTexts.intercity.tr(), isMain: false, useGradient: false, image: "assets/images/outer_city_taxi_option.png", -- 2.49.1 From e49131b40d3ea24a30b99c7e070d849f80231834 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 16:59:23 +0500 Subject: [PATCH 14/30] BASE: Implement Localization In Cab Order Details Screen. --- assets/translations/en_En.json | 12 ++++- lib/constant/const_texts.dart | 42 +++++++++++++++ .../cab_order_details.dart | 53 ++++++++++--------- 3 files changed, 81 insertions(+), 26 deletions(-) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index 573c497..ee5e9b2 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -77,5 +77,15 @@ "everyRideVerified": "Every Ride. Every Driver. Verified.", "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", "intercity": "Intercity", - "aroundTheCity": "Around the city" + "aroundTheCity": "Around the city", + "rideDetails": "Ride Details", + "orderId": "Order Id:", + "bookingData": "Booking Date:", + "rideAndFareSummary": "Ride & Fare Summary", + "updateReview": "Update Review", + "addReview": "Add Review", + "complain": "Complain", + "distance": "Distance", + "km": "KM", + "duration": "Duration" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 347d14f..fed1360 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -77,8 +77,50 @@ class ConstTexts { static String allDriversIDCheck = "allDriversIDCheck"; static String intercity = "intercity"; static String aroundTheCity = "aroundTheCity"; + static String rideDetails = "rideDetails"; + static String orderId = "orderId"; + static String bookingData = "bookingData"; + static String rideAndFareSummary = "rideAndFareSummary"; + static String updateReview = "updateReview"; + static String addReview = "addReview"; + static String complain = "complain"; + static String distance = "distance"; + static String km = "km"; + static String duration = "duration"; + static String couponNotFound = "couponNotFound"; + static String tapToApply = "tapToApply"; + static String home = "home"; + static String myBookings = "myBookings"; + static String profile = "profile"; + static String wallet = "wallet"; + static String cabServiceType = "cabServiceType"; + static String everyRideVerified = "everyRideVerified"; + static String allDriversIDCheck = "allDriversIDCheck"; + static String intercity = "intercity"; + static String aroundTheCity = "aroundTheCity"; + static String rideDetails = "rideDetails"; + static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + static String somethingWentWrong = "somethingWentWrong"; + static String cash = "cash"; + static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; static String payNow = "payNow"; static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; static String somethingWentWrong = "somethingWentWrong"; static String cash = "cash"; + static String coupon = "coupon"; + static String couponNotFound = "couponNotFound"; + static String tapToApply = "tapToApply"; + static String home = "home"; + static String myBookings = "myBookings"; + static String profile = "profile"; + static String wallet = "wallet"; + static String cabServiceType = "cabServiceType"; + static String everyRideVerified = "everyRideVerified"; + static String allDriversIDCheck = "allDriversIDCheck"; + static String intercity = "intercity"; + static String aroundTheCity = "aroundTheCity"; + static String rideDetails = "rideDetails"; + static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + static String somethingWentWrong = "somethingWentWrong"; + static String cash = "cash"; } diff --git a/lib/screen_ui/cab_service_screens/cab_order_details.dart b/lib/screen_ui/cab_service_screens/cab_order_details.dart index 2d4f280..4bce7a6 100644 --- a/lib/screen_ui/cab_service_screens/cab_order_details.dart +++ b/lib/screen_ui/cab_service_screens/cab_order_details.dart @@ -1,4 +1,6 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; @@ -62,7 +64,7 @@ class CabOrderDetails extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Ride Details".tr, + ConstTexts.rideDetails.tr(), style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -96,8 +98,7 @@ class CabOrderDetails extends StatelessWidget { width: double.infinity, padding: const EdgeInsets.all(16), child: Text( - "${'Order Id:'.tr} ${Constant.orderId(orderId: controller.cabOrder.value.id.toString())}" - .tr, + "${ConstTexts.orderId.tr()} ${Constant.orderId(orderId: controller.cabOrder.value.id.toString())}", textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -130,8 +131,8 @@ class CabOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Booking Date:'.tr} ${controller.formatDate(controller.cabOrder.value.scheduleDateTime!)}" - .tr, + "${ConstTexts.bookingData.tr()} ${controller.formatDate(controller.cabOrder.value.scheduleDateTime!)}", + textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -435,7 +436,7 @@ class CabOrderDetails extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Ride & Fare Summary".tr, + ConstTexts.rideAndFareSummary.tr(), style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -535,13 +536,11 @@ class CabOrderDetails extends StatelessWidget { ], ), RoundedButtonBorder( - title: - controller - .driverUser - .value - .averageRating - .toStringAsFixed(1) ?? - '', + title: controller + .driverUser + .value + .averageRating + .toStringAsFixed(1), width: 20, height: 3.5, radius: 10, @@ -589,8 +588,11 @@ class CabOrderDetails extends StatelessWidget { .value .id! .isNotEmpty - ? 'Update Review'.tr - : 'Add Review'.tr, + ? ConstTexts + .updateReview + .tr() + : ConstTexts.addReview + .tr(), onPress: () async { final result = await Get.to( () => CabReviewScreen(), @@ -640,7 +642,8 @@ class CabOrderDetails extends StatelessWidget { ), child: RoundedButtonFill( borderRadius: 10.r, - title: 'Complain'.tr, + title: + ConstTexts.complain.tr(), onPress: () async { Get.to( () => ComplainScreen(), @@ -718,7 +721,7 @@ class CabOrderDetails extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr(), ); UserModel? customer = @@ -825,14 +828,14 @@ class CabOrderDetails extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _iconTile( - "${double.parse(controller.cabOrder.value.distance.toString()).toStringAsFixed(2)} ${'KM'.tr}", - "Distance".tr, + "${double.parse(controller.cabOrder.value.distance.toString()).toStringAsFixed(2)} ${ConstTexts.km.tr()}", + ConstTexts.distance.tr(), "assets/icons/ic_distance_parcel.svg", isDark, ), _iconTile( controller.cabOrder.value.duration ?? '--', - "Duration".tr, + ConstTexts.duration.tr(), "assets/icons/ic_duration.svg", isDark, ), @@ -867,7 +870,7 @@ class CabOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Summary".tr, + ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey500, @@ -877,7 +880,7 @@ class CabOrderDetails extends StatelessWidget { // Subtotal _summaryTile( - "Subtotal", + ConstTexts.subtotal.tr(), Constant.amountShow( amount: controller.subTotal.value.toString(), ), @@ -886,7 +889,7 @@ class CabOrderDetails extends StatelessWidget { // Discount _summaryTile( - "Discount", + ConstTexts.discount.tr(), Constant.amountShow( amount: controller.discount.value.toString(), ), @@ -936,7 +939,7 @@ class CabOrderDetails extends StatelessWidget { // Total _summaryTile( - "Order Total", + ConstTexts.orderTotal.tr(), Constant.amountShow( amount: controller.totalAmount.value.toString(), @@ -992,7 +995,7 @@ class CabOrderDetails extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - title.tr, + title, style: AppThemeData.mediumTextStyle( fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, -- 2.49.1 From 3a908268140787ae723eef11924cec933377fc28 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 17:09:29 +0500 Subject: [PATCH 15/30] BASE: Implement Localization In Cab Review Screen. --- assets/translations/en_En.json | 6 +- lib/constant/const_texts.dart | 8 +- .../cab_order_details.dart | 4 +- .../cab_review_screen.dart | 201 +++++++++++++++--- 4 files changed, 183 insertions(+), 36 deletions(-) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index ee5e9b2..aa48f32 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -87,5 +87,9 @@ "complain": "Complain", "distance": "Distance", "km": "KM", - "duration": "Duration" + "duration": "Duration", + "howWasTrip": "How was your trip?", + "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", + "rateFor": "Rate for", + "typeComment": "Type comment...." } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index fed1360..12e945a 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -87,10 +87,10 @@ class ConstTexts { static String distance = "distance"; static String km = "km"; static String duration = "duration"; - static String couponNotFound = "couponNotFound"; - static String tapToApply = "tapToApply"; - static String home = "home"; - static String myBookings = "myBookings"; + static String howWasTrip = "howWasTrip"; + static String yourFeedbackWillHelp = "yourFeedbackWillHelp"; + static String rateFor = "rateFor"; + static String typeComment = "typeComment"; static String profile = "profile"; static String wallet = "wallet"; static String cabServiceType = "cabServiceType"; diff --git a/lib/screen_ui/cab_service_screens/cab_order_details.dart b/lib/screen_ui/cab_service_screens/cab_order_details.dart index 4bce7a6..1c2a5c2 100644 --- a/lib/screen_ui/cab_service_screens/cab_order_details.dart +++ b/lib/screen_ui/cab_service_screens/cab_order_details.dart @@ -880,7 +880,7 @@ class CabOrderDetails extends StatelessWidget { // Subtotal _summaryTile( - ConstTexts.subtotal.tr(), + ConstTexts.subtotal.tr(), Constant.amountShow( amount: controller.subTotal.value.toString(), ), @@ -1004,7 +1004,7 @@ class CabOrderDetails extends StatelessWidget { Text( value, style: AppThemeData.semiBoldTextStyle( - fontSize: title == "Order Total" ? 18 : 16, + fontSize: title == ConstTexts.orderTotal.tr() ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, ), ), diff --git a/lib/screen_ui/cab_service_screens/cab_review_screen.dart b/lib/screen_ui/cab_service_screens/cab_review_screen.dart index 9e0c0e5..e39a593 100644 --- a/lib/screen_ui/cab_service_screens/cab_review_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_review_screen.dart @@ -1,4 +1,6 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/controllers/cab_review_controller.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -26,8 +28,22 @@ class CabReviewScreen extends StatelessWidget { centerTitle: true, elevation: 0, backgroundColor: AppThemeData.primary300, - leading: GestureDetector(onTap: () => Get.back(), child: Icon(Icons.arrow_back_ios, color: isDark ? Colors.white : Colors.black)), - title: Text(controller.ratingModel.value != null ? "Update Review".tr : "Add Review".tr, style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16)), + leading: GestureDetector( + onTap: () => Get.back(), + child: Icon( + Icons.arrow_back_ios, + color: isDark ? Colors.white : Colors.black, + ), + ), + title: Text( + controller.ratingModel.value != null + ? ConstTexts.updateReview.tr() + : ConstTexts.addReview.tr(), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontSize: 16, + ), + ), ), body: Obx( () => @@ -38,11 +54,21 @@ class CabReviewScreen extends StatelessWidget { child: Stack( children: [ Padding( - padding: const EdgeInsets.only(left: 20, right: 20, top: 50, bottom: 20), + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 50, + bottom: 20, + ), child: Card( elevation: 2, - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 65), @@ -50,81 +76,181 @@ class CabReviewScreen extends StatelessWidget { children: [ // Driver Name Padding( - padding: const EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.only( + top: 8.0, + ), child: Text( - controller.order.value!.driver?.fullName() ?? "", - style: TextStyle(color: isDark ? Colors.white : Colors.black87, fontFamily: AppThemeData.medium, fontSize: 18), + controller.order.value!.driver + ?.fullName() ?? + "", + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black87, + fontFamily: AppThemeData.medium, + fontSize: 18, + ), ), ), // Car info Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ Text( - controller.driverUser.value?.carNumber?.toUpperCase() ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black87, fontFamily: AppThemeData.medium), + controller + .driverUser + .value + ?.carNumber + ?.toUpperCase() ?? + '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black87, + fontFamily: AppThemeData.medium, + ), ), const SizedBox(width: 8), Text( "${controller.driverUser.value?.carName} ${controller.driverUser.value?.carMakes}", - style: TextStyle(color: isDark ? Colors.white : Colors.black38, fontFamily: AppThemeData.medium), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black38, + fontFamily: AppThemeData.medium, + ), ), ], ), - const Padding(padding: EdgeInsets.symmetric(vertical: 12), child: Divider(color: Colors.grey)), + const Padding( + padding: EdgeInsets.symmetric( + vertical: 12, + ), + child: Divider(color: Colors.grey), + ), // Title Padding( padding: const EdgeInsets.only(top: 16), - child: Text('How is your trip?'.tr, style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2)), + child: Text( + ConstTexts.howWasTrip.tr(), + style: TextStyle( + fontSize: 18, + color: + isDark + ? Colors.white + : Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 2, + ), + ), ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( - 'Your feedback will help us improve \n driving experience better'.tr, + ConstTexts.yourFeedbackWillHelp.tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), + letterSpacing: 0.8, + ), ), ), // Rating Padding( padding: const EdgeInsets.only(top: 20), - child: Text('Rate for'.tr, style: TextStyle(fontSize: 16, color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8)), + child: Text( + ConstTexts.rateFor.tr(), + style: TextStyle( + fontSize: 16, + color: + isDark + ? Colors.white + : Colors.black.withValues( + alpha: 0.60, + ), + letterSpacing: 0.8, + ), + ), ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( - controller.order.value!.driver?.fullName() ?? "", - style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2), + controller.order.value!.driver + ?.fullName() ?? + "", + style: TextStyle( + fontSize: 18, + color: + isDark + ? Colors.white + : Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 2, + ), ), ), Padding( padding: const EdgeInsets.only(top: 10), child: RatingBar.builder( - initialRating: controller.ratings.value, + initialRating: + controller.ratings.value, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, - itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), - unratedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, - onRatingUpdate: (rating) => controller.ratings.value = rating, + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + onRatingUpdate: + (rating) => + controller.ratings.value = + rating, ), ), // Comment - Padding(padding: const EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr, controller: controller.comment.value, maxLine: 5)), + Padding( + padding: const EdgeInsets.all(20.0), + child: TextFieldWidget( + hintText: ConstTexts.typeComment.tr(), + controller: controller.comment.value, + maxLine: 5, + ), + ), // Submit Button Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - borderRadius: 10.r, - title: controller.ratingModel.value != null ? "Update Review".tr : "Add Review".tr, + borderRadius: 10.r, + title: + controller.ratingModel.value != + null + ? ConstTexts.updateReview.tr() + : ConstTexts.addReview.tr(), color: AppThemeData.primary300, - textColor: isDark ? Colors.white : Colors.black, + textColor: + isDark + ? Colors.white + : Colors.black, onPress: controller.submitReview, ), ), @@ -140,11 +266,28 @@ class CabReviewScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(60), color: Colors.white, - boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.15), blurRadius: 8, spreadRadius: 6)], + boxShadow: [ + BoxShadow( + color: Colors.grey.withValues(alpha: 0.15), + blurRadius: 8, + spreadRadius: 6, + ), + ], ), child: ClipRRect( borderRadius: BorderRadius.circular(60), - child: NetworkImageWidget(imageUrl: controller.order.value?.driver?.profilePictureURL ?? '', fit: BoxFit.cover, height: 110, width: 110), + child: NetworkImageWidget( + imageUrl: + controller + .order + .value + ?.driver + ?.profilePictureURL ?? + '', + fit: BoxFit.cover, + height: 110, + width: 110, + ), ), ), ), -- 2.49.1 From 452722faaa29c0d49a56fef7b8a0646b3ae31748 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 17:13:13 +0500 Subject: [PATCH 16/30] BASE: Implement Localization In Complain Screen. --- assets/translations/en_En.json | 5 ++++- lib/constant/const_texts.dart | 6 +++--- lib/screen_ui/cab_service_screens/complain_screen.dart | 10 ++++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index aa48f32..5235b29 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -91,5 +91,8 @@ "howWasTrip": "How was your trip?", "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", "rateFor": "Rate for", - "typeComment": "Type comment...." + "typeComment": "Type comment....", + "title": "Title", + "typeDescription": "Type Description...", + "save": "Save" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 12e945a..f8c20ec 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -91,9 +91,9 @@ class ConstTexts { static String yourFeedbackWillHelp = "yourFeedbackWillHelp"; static String rateFor = "rateFor"; static String typeComment = "typeComment"; - static String profile = "profile"; - static String wallet = "wallet"; - static String cabServiceType = "cabServiceType"; + static String title = "title"; + static String typeDescription = "typeDescription"; + static String save = "save"; static String everyRideVerified = "everyRideVerified"; static String allDriversIDCheck = "allDriversIDCheck"; static String intercity = "intercity"; diff --git a/lib/screen_ui/cab_service_screens/complain_screen.dart b/lib/screen_ui/cab_service_screens/complain_screen.dart index b8a6d3d..94402a8 100644 --- a/lib/screen_ui/cab_service_screens/complain_screen.dart +++ b/lib/screen_ui/cab_service_screens/complain_screen.dart @@ -1,3 +1,5 @@ +import 'package:customer/constant/const_texts.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -38,7 +40,7 @@ class ComplainScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Complain".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text(ConstTexts.complain.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -50,11 +52,11 @@ class ComplainScreen extends StatelessWidget { padding: const EdgeInsets.all(16), child: Column( children: [ - Obx(() => TextFieldWidget(title: "Title".tr, hintText: "Title".tr, controller: controller.title.value)), + Obx(() => TextFieldWidget(title: ConstTexts.title.tr(), hintText: ConstTexts.title.tr(), controller: controller.title.value)), const SizedBox(height: 10), - Obx(() => TextFieldWidget(title: "Complain".tr, hintText: 'Type Description....'.tr, controller: controller.comment.value, maxLine: 8)), + Obx(() => TextFieldWidget(title:ConstTexts.complain.tr(), hintText: ConstTexts.typeDescription.tr(), controller: controller.comment.value, maxLine: 8)), const SizedBox(height: 20), - RoundedButtonFill( borderRadius: 10.r,title: "Save".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.submitComplain()), + RoundedButtonFill( borderRadius: 10.r,title: ConstTexts.save.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.submitComplain()), ], ), ), -- 2.49.1 From f2a7679d4bcaec2565e96269145231251c14f8e8 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 17:30:54 +0500 Subject: [PATCH 17/30] BASE: Implement Localization In Intercity Home Screen. --- assets/translations/en_En.json | 6 +- lib/constant/const_texts.dart | 8 +- .../Intercity_home_screen.dart | 114 +++++++++--------- 3 files changed, 66 insertions(+), 62 deletions(-) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index 5235b29..a98e7ea 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -94,5 +94,9 @@ "typeComment": "Type comment....", "title": "Title", "typeDescription": "Type Description...", - "save": "Save" + "save": "Save", + "popularDestinations": "Popular Destinations", + "selectPaymentMethod": "Select Payment Method", + "prefferedPayment": "Preferred Payment", + "otherPaymentOptions": "Other Payment Options" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index f8c20ec..2ba2c88 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -94,10 +94,10 @@ class ConstTexts { static String title = "title"; static String typeDescription = "typeDescription"; static String save = "save"; - static String everyRideVerified = "everyRideVerified"; - static String allDriversIDCheck = "allDriversIDCheck"; - static String intercity = "intercity"; - static String aroundTheCity = "aroundTheCity"; + static String popularDestinations = "popularDestinations"; + static String selectPaymentMethod = "selectPaymentMethod"; + static String prefferedPayment = "prefferedPayment"; + static String otherPaymentOptions = "otherPaymentOptions"; static String rideDetails = "rideDetails"; static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; static String somethingWentWrong = "somethingWentWrong"; diff --git a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart index 1f519ac..9b5f0a2 100644 --- a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart @@ -1,6 +1,5 @@ -import 'dart:io'; - import 'package:cached_network_image/cached_network_image.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/controllers/Intercity_home_controller.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/tax_model.dart'; @@ -14,6 +13,7 @@ import 'package:customer/themes/round_button_border.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -174,7 +174,7 @@ class IntercityHomeScreen extends StatelessWidget { controller.sourceTextEditController.value.text = address.toString(); controller.setDepartureMarker(lat, lng); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast(ConstTexts.serviceIsUnavailable.tr()); } } } else { @@ -186,7 +186,7 @@ class IntercityHomeScreen extends StatelessWidget { controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); controller.setDepartureMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast(ConstTexts.serviceIsUnavailable.tr()); } } }); @@ -194,7 +194,7 @@ class IntercityHomeScreen extends StatelessWidget { }, child: TextFieldWidget( controller: controller.sourceTextEditController.value, - hintText: "Pickup Location".tr, + hintText: ConstTexts.pickUpLocation.tr(), enable: false, prefix: Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Image.asset("assets/icons/pickup.png", height: 22, width: 22)), ), @@ -229,7 +229,7 @@ class IntercityHomeScreen extends StatelessWidget { controller: controller.destinationTextEditController.value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: "Destination Location".tr, + hintText: ConstTexts.destinationLocation.tr(), enable: false, prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), ), @@ -257,7 +257,7 @@ class IntercityHomeScreen extends StatelessWidget { ], ), SizedBox(height: 15), - Align(alignment: Alignment.centerLeft, child: Text("Popular Destinations".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: AppThemeData.grey900))), + Align(alignment: Alignment.centerLeft, child: Text(ConstTexts.popularDestinations.tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: AppThemeData.grey900))), SizedBox( height: 120, child: Padding( @@ -322,12 +322,12 @@ class IntercityHomeScreen extends StatelessWidget { SizedBox(height: 10), RoundedButtonFill( borderRadius: 10.r, - title: "Continue".tr, + title: ConstTexts.continueT.tr(), onPress: () { if (controller.sourceTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast("Please select source location".tr); + ShowToastDialog.showToast(ConstTexts.plsSelectSourceLocation.tr()); } else if (controller.destinationTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast("Please select destination location".tr); + ShowToastDialog.showToast(ConstTexts.plsSelectDestinationLocations.tr()); } else { controller.bottomSheetType.value = "vehicleSelection"; } @@ -364,7 +364,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Text( - "Select Your Vehicle Type".tr, + ConstTexts.selectVehicleType.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), textAlign: TextAlign.start, ), @@ -473,7 +473,7 @@ class IntercityHomeScreen extends StatelessWidget { controller.calculateTotalAmount(); controller.bottomSheetType.value = "payment"; } else { - ShowToastDialog.showToast("Please select a vehicle type first.".tr); + ShowToastDialog.showToast(ConstTexts.plsSelectVehicleTypeFirst.tr()); } }, color: AppThemeData.primary300, @@ -506,7 +506,7 @@ class IntercityHomeScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.selectPaymentMethod.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), GestureDetector( onTap: () { Get.back(); @@ -521,7 +521,7 @@ class IntercityHomeScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text(ConstTexts.prefferedPayment.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) Container( @@ -552,7 +552,7 @@ class IntercityHomeScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - "Other Payment Options".tr, + ConstTexts.otherPaymentOptions.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), ), @@ -598,18 +598,18 @@ class IntercityHomeScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: "Continue".tr, + title: ConstTexts.continueT.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr); + ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); return; } if (controller.selectedPaymentMethod.value == "wallet") { num walletAmount = controller.userModel.value.walletAmount ?? 0; if (walletAmount <= 0) { - ShowToastDialog.showToast("Insufficient wallet balance. Please select another payment method.".tr); + ShowToastDialog.showToast(ConstTexts.insufficientWallet.tr()); return; } } @@ -703,7 +703,7 @@ class IntercityHomeScreen extends StatelessWidget { }, child: TextFieldWidget( controller: controller.sourceTextEditController.value, - hintText: "Pickup Location".tr, + hintText: ConstTexts.pickUpLocation.tr(), enable: false, prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), ), @@ -738,7 +738,7 @@ class IntercityHomeScreen extends StatelessWidget { controller: controller.destinationTextEditController.value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: "Destination Location".tr, + hintText: ConstTexts.destinationLocation.tr(), enable: false, prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), ), @@ -769,7 +769,7 @@ class IntercityHomeScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text("Promo code".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded(child: Text(ConstTexts.promoCode.tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), InkWell( onTap: () { Get.to(CabCouponCodeScreen())!.then((value) { @@ -779,13 +779,13 @@ class IntercityHomeScreen extends StatelessWidget { controller.selectedCouponModel.value = value; controller.calculateTotalAmount(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast(ConstTexts.thisOfferNotEligible.tr()); } } }); }, child: Text( - "View All".tr, + ConstTexts.viewAll.tr(), style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), ), @@ -815,7 +815,7 @@ class IntercityHomeScreen extends StatelessWidget { style: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), decoration: InputDecoration( border: InputBorder.none, - hintText: 'Write coupon Code'.tr, + hintText: ConstTexts.writeCoupon.tr(), contentPadding: EdgeInsets.only(bottom: 10), hintStyle: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), ), @@ -824,7 +824,7 @@ class IntercityHomeScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: "Redeem now".tr, + title: ConstTexts.redeemNow.tr(), width: 27.w, fontSizes: 14, @@ -842,13 +842,13 @@ class IntercityHomeScreen extends StatelessWidget { controller.calculateTotalAmount(); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast(ConstTexts.thisOfferNotEligible.tr()); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr); + ShowToastDialog.showToast(ConstTexts.couponExpired.tr()); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr); + ShowToastDialog.showToast(ConstTexts.invalidCouponCode.tr()); } }, color: AppThemeData.parcelService300, @@ -872,7 +872,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text(ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 8), Padding( @@ -880,7 +880,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Subtotal".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( Constant.amountShow(amount: controller.subTotal.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), @@ -896,7 +896,7 @@ class IntercityHomeScreen extends StatelessWidget { children: [ Row( children: [ - Text("Discount".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), SizedBox(width: 5), Text( controller.selectedCouponModel.value.id == null ? "" : "(${controller.selectedCouponModel.value.code})", @@ -923,7 +923,7 @@ class IntercityHomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})'.tr, + '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -931,7 +931,7 @@ class IntercityHomeScreen extends StatelessWidget { Text( Constant.amountShow( amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), - ).tr, + ), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -947,7 +947,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Order Total".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( Constant.amountShow(amount: controller.totalAmount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), @@ -995,7 +995,7 @@ class IntercityHomeScreen extends StatelessWidget { : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), SizedBox(width: 22), Text( - controller.selectedPaymentMethod.value.tr, + controller.selectedPaymentMethod.value, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -1007,7 +1007,7 @@ class IntercityHomeScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: "Confirm Booking".tr, + title: ConstTexts.confirmBooking.tr(), onPress: () async { controller.placeOrder(); }, @@ -1042,11 +1042,11 @@ class IntercityHomeScreen extends StatelessWidget { children: [ Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), SizedBox(height: 30), - Text("Waiting for driver....".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text(ConstTexts.waitingForDriver.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: AppThemeData.grey900)), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( borderRadius: 10.r, - title: "Cancel Ride".tr, + title: ConstTexts.cancelRide.tr(), onPress: () async { try { // 1. Update current order status @@ -1081,12 +1081,12 @@ class IntercityHomeScreen extends StatelessWidget { } // 5. Optional feedback - ShowToastDialog.showToast("Ride cancelled successfully".tr); + ShowToastDialog.showToast(ConstTexts.riderCancelledSucces.tr()); Get.back(); CabDashboardController cabDashboardController = Get.put(CabDashboardController()); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast("Failed to cancel ride".tr); + ShowToastDialog.showToast(ConstTexts.failedToCancel.tr()); } }, color: AppThemeData.danger300, @@ -1157,7 +1157,7 @@ class IntercityHomeScreen extends StatelessWidget { }, child: TextFieldWidget( controller: controller.sourceTextEditController.value, - hintText: "Pickup Location".tr, + hintText: ConstTexts.pickUpLocation.tr(), enable: false, readOnly: true, prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), @@ -1193,7 +1193,7 @@ class IntercityHomeScreen extends StatelessWidget { controller: controller.destinationTextEditController.value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: "Destination Location".tr, + hintText: ConstTexts.destinationLocation.tr(), enable: false, readOnly: true, prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), @@ -1277,7 +1277,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text(ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 8), Padding( @@ -1285,7 +1285,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Subtotal".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( Constant.amountShow(amount: controller.subTotal.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), @@ -1299,7 +1299,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Discount".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text(Constant.amountShow(amount: controller.discount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.danger300)), ], ), @@ -1319,7 +1319,7 @@ class IntercityHomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})'.tr, + '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -1327,7 +1327,7 @@ class IntercityHomeScreen extends StatelessWidget { Text( Constant.amountShow( amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), - ).tr, + ), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -1343,7 +1343,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Order Total".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( Constant.amountShow(amount: controller.totalAmount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), @@ -1393,7 +1393,7 @@ class IntercityHomeScreen extends StatelessWidget { : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), SizedBox(width: 22), Text( - controller.selectedPaymentMethod.value.tr, + controller.selectedPaymentMethod.value, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -1408,13 +1408,13 @@ class IntercityHomeScreen extends StatelessWidget { children: [ RoundedButtonFill( borderRadius: 10.r, - title: "SOS".tr, - color: Colors.red.withOpacity(0.50), + title: "SOS", + color: Colors.red.withValues(alpha: 0.50), textColor: AppThemeData.grey50, isCenter: true, icon: Icon(Icons.call, color: Colors.white), onPress: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr()); LocationData location = await controller.currentLocation.value.getLocation(); @@ -1426,7 +1426,7 @@ class IntercityHomeScreen extends StatelessWidget { SnackBar( content: Builder( builder: (context) { - return Text("Your SOS request has been submitted to admin".tr); + return Text(ConstTexts.yourSosRequest.tr()); }, ), backgroundColor: Colors.green, @@ -1440,7 +1440,7 @@ class IntercityHomeScreen extends StatelessWidget { SnackBar( content: Builder( builder: (context) { - return Text("Your SOS request is already submitted".tr); + return Text(ConstTexts.yourSosrequestAlreadySubmitted.tr()); }, ), backgroundColor: Colors.red, @@ -1465,7 +1465,7 @@ class IntercityHomeScreen extends StatelessWidget { if (controller.currentOrder.value.status == Constant.orderInTransit && controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( borderRadius: 10.r, - title: "Pay Now".tr, + title: ConstTexts.payNow.tr(), onPress: () async { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); @@ -1493,14 +1493,14 @@ class IntercityHomeScreen extends StatelessWidget { RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast(ConstTexts.somethingWentWrong.tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); } }); } else { - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); } }, color: AppThemeData.primary300, -- 2.49.1 From cf58d069ab1c1d2a4bb870b34eee0240139f0892 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 17:50:09 +0500 Subject: [PATCH 18/30] BASE: Implement Localization In My Cab Booking Screen. --- assets/translations/en_En.json | 6 +++- lib/constant/const_texts.dart | 8 ++--- .../Intercity_home_screen.dart | 1 + .../my_cab_booking_screen.dart | 34 ++++++++++--------- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/assets/translations/en_En.json b/assets/translations/en_En.json index a98e7ea..3552d0d 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en_En.json @@ -98,5 +98,9 @@ "popularDestinations": "Popular Destinations", "selectPaymentMethod": "Select Payment Method", "prefferedPayment": "Preferred Payment", - "otherPaymentOptions": "Other Payment Options" + "otherPaymentOptions": "Other Payment Options", + "rideHistory": "Ride History", + "plsLoginToAcc": "Please Log In to Continue", + "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", + "noOrderfound": "No order found" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 2ba2c88..0d701ac 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -98,10 +98,10 @@ class ConstTexts { static String selectPaymentMethod = "selectPaymentMethod"; static String prefferedPayment = "prefferedPayment"; static String otherPaymentOptions = "otherPaymentOptions"; - static String rideDetails = "rideDetails"; - static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; - static String somethingWentWrong = "somethingWentWrong"; - static String cash = "cash"; + static String rideHistory = "rideHistory"; + static String plsLoginToAcc = "plsLoginToAcc"; + static String youAreNotLoggedIn = "youAreNotLoggedIn"; + static String noOrderfound = "noOrderfound"; static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; static String payNow = "payNow"; static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; diff --git a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart index 9b5f0a2..45d7169 100644 --- a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart @@ -1,3 +1,4 @@ +import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/constant/const_texts.dart'; import 'package:customer/controllers/Intercity_home_controller.dart'; diff --git a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart index 6d467b5..5a85e86 100644 --- a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/models/cab_order_model.dart'; import 'package:customer/payment/createRazorPayOrderModel.dart'; import 'package:customer/payment/rozorpayConroller.dart'; @@ -5,6 +6,7 @@ import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -38,7 +40,7 @@ class MyCabBookingScreen extends StatelessWidget { backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text("Ride History".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row(children: [const SizedBox(width: 10), Text(ConstTexts.rideHistory.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), ), bottom: PreferredSize( preferredSize: const Size.fromHeight(48), @@ -81,17 +83,17 @@ class MyCabBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Please Log In to Continue".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text(ConstTexts.plsLoginToAcc.tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr, + ConstTexts.youAreNotLoggedIn.tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( borderRadius: 10.r, - title: "Log in".tr, + title: ConstTexts.login.tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -109,7 +111,7 @@ class MyCabBookingScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No order found".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center(child: Text(ConstTexts.noOrderfound.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); } return ListView.builder( @@ -133,7 +135,7 @@ class MyCabBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Booking Date:'.tr} ${controller.formatDate(order.scheduleDateTime!)}".tr, + "${'Booking Date:'.tr} ${controller.formatDate(order.scheduleDateTime!)}", textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -220,7 +222,7 @@ class MyCabBookingScreen extends StatelessWidget { //mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Otp :".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text("Otp :", style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), SizedBox(width: 5), Text(order.otpCode ?? '', style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], @@ -229,7 +231,7 @@ class MyCabBookingScreen extends StatelessWidget { order.status == Constant.orderInTransit && order.paymentStatus == false ? RoundedButtonFill( borderRadius: 10.r, - title: "Pay Now".tr, + title: ConstTexts.payNow.tr(), onPress: () async { controller.selectedPaymentMethod.value = order.paymentMethod.toString(); controller.calculateTotalAmount(order); @@ -273,7 +275,7 @@ class MyCabBookingScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(ConstTexts.selectPaymentMethod.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), GestureDetector( onTap: () { Get.back(); @@ -288,7 +290,7 @@ class MyCabBookingScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text(ConstTexts.prefferedPayment.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) Container( @@ -319,7 +321,7 @@ class MyCabBookingScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - "Other Payment Options".tr, + ConstTexts.otherPaymentOptions.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), ), @@ -365,12 +367,12 @@ class MyCabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: "Continue".tr, + title: ConstTexts.continueT.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr); + ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); } else { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); @@ -388,7 +390,7 @@ class MyCabBookingScreen extends StatelessWidget { controller.completeOrder(); } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { if (Constant.userModel!.walletAmount == null || Constant.userModel!.walletAmount! < controller.totalAmount.value) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr); + ShowToastDialog.showToast(ConstTexts.youDoNothaveSufficientwalletBalance.tr()); } else { controller.completeOrder(); } @@ -402,14 +404,14 @@ class MyCabBookingScreen extends StatelessWidget { RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast(ConstTexts.somethingWentWrong.tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); } }); } else { - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); } } }, -- 2.49.1 From b04050384df5d9dfd4942310b838949504e3730d Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Wed, 3 Dec 2025 18:21:19 +0500 Subject: [PATCH 19/30] BASE: Initialize Localization. --- assets/translations/ru_RU.json | 0 assets/translations/uz_UZ.json | 0 ios/Runner/Info.plist | 6 ++ lib/constant/const_texts.dart | 42 ++++----- .../0n_demand_payment_controller.dart | 77 +++++++-------- .../Intercity_home_controller.dart | 73 ++++++++------- lib/controllers/book_parcel_controller.dart | 33 +++---- lib/controllers/cab_booking_controller.dart | 71 +++++++------- lib/controllers/cab_review_controller.dart | 5 +- lib/controllers/cart_controller.dart | 65 ++++++------- lib/controllers/chat_controller.dart | 9 +- lib/controllers/complain_controller.dart | 15 +-- ...dine_in_restaurant_details_controller.dart | 9 +- lib/controllers/edit_profile_controller.dart | 5 +- .../enter_manually_location_controller.dart | 9 +- lib/controllers/food_home_controller.dart | 3 +- .../forgot_password_controller.dart | 11 ++- lib/controllers/gift_card_controller.dart | 63 ++++++------- .../history_gift_card_controller.dart | 3 +- lib/controllers/login_controller.dart | 31 ++++--- lib/controllers/mobile_login_controller.dart | 13 +-- .../my_cab_booking_controller.dart | 71 +++++++------- .../my_rental_booking_controller.dart | 17 ++-- .../on_demand_booking_controller.dart | 9 +- .../on_demand_order_details_controller.dart | 13 +-- .../on_demand_review_controller.dart | 5 +- .../otp_verification_controller.dart | 11 ++- .../parcel_my_booking_controller.dart | 7 +- .../parcel_order_confirmation_controller.dart | 73 ++++++++------- .../parcel_order_details_controller.dart | 5 +- lib/controllers/parcel_review_controller.dart | 5 +- lib/controllers/rate_product_controller.dart | 7 +- .../rental_conformation_controller.dart | 5 +- lib/controllers/rental_home_controller.dart | 3 +- .../rental_order_details_controller.dart | 65 ++++++------- lib/controllers/rental_review_controller.dart | 5 +- lib/controllers/service_list_controller.dart | 9 +- lib/controllers/sign_up_controller.dart | 29 +++--- lib/controllers/wallet_controller.dart | 57 ++++++------ lib/main.dart | 19 +++- lib/payment/MercadoPagoScreen.dart | 11 ++- lib/payment/PayFastScreen.dart | 7 +- lib/payment/midtrans_screen.dart | 9 +- lib/payment/orangePayScreen.dart | 17 ++-- lib/payment/paystack/pay_stack_screen.dart | 3 +- lib/payment/xenditScreen.dart | 9 +- .../dash_board_e_commerce_screen.dart | 19 ++-- .../ecommarce/home_e_commerce_screen.dart | 47 +++++----- .../address_list_screen.dart | 9 +- .../enter_manually_location.dart | 29 +++--- .../location_permission_screen.dart | 15 +-- .../maintenance_mode_screen.dart | 5 +- .../all_advertisement_screen.dart | 7 +- .../cart_screen/cart_screen.dart | 93 ++++++++++--------- .../cart_screen/coupon_list_screen.dart | 19 ++-- .../cart_screen/oder_placing_screens.dart | 23 ++--- .../cart_screen/select_payment_screen.dart | 9 +- .../cashback_screen/cashback_offers_list.dart | 7 +- .../change_language_screen.dart | 5 +- .../chat_screens/chat_screen.dart | 17 ++-- .../chat_screens/driver_inbox_screen.dart | 7 +- .../chat_screens/restaurant_inbox_screen.dart | 7 +- .../dash_board_screens/dash_board_screen.dart | 19 ++-- .../dine_in_booking_details.dart | 23 ++--- .../dine_in_booking_screen.dart | 15 +-- .../dine_in_screeen/book_table_screen.dart | 31 ++++--- .../dine_in_details_screen.dart | 37 ++++---- .../dine_in_screeen/dine_in_screen.dart | 29 +++--- .../view_all_category_dine_in_screen.dart | 3 +- .../edit_profile_screen.dart | 21 +++-- .../favourite_screens/favourite_screen.dart | 23 ++--- .../forgot_password_screen.dart | 13 +-- .../gift_card/gift_card_screen.dart | 29 +++--- .../gift_card/history_gift_card.dart | 11 ++- .../gift_card/redeem_gift_card_screen.dart | 31 ++++--- .../gift_card/select_gift_payment_screen.dart | 13 +-- .../category_restaurant_screen.dart | 5 +- .../discount_restaurant_list_screen.dart | 3 +- .../home_screen/home_screen.dart | 71 +++++++------- .../home_screen/home_screen_two.dart | 71 +++++++------- .../home_screen/restaurant_list_screen.dart | 3 +- .../home_screen/story_view.dart | 5 +- .../home_screen/view_all_category_screen.dart | 3 +- .../live_tracking_screen.dart | 3 +- .../order_details_screen.dart | 69 +++++++------- .../order_list_screen/order_screen.dart | 39 ++++---- .../profile_screen/profile_screen.dart | 91 +++++++++--------- .../rate_us_screen/rate_product_screen.dart | 23 ++--- .../refer_friend_screen.dart | 19 ++-- .../restaurant_details_screen.dart | 71 +++++++------- .../review_list_screen.dart | 7 +- .../scan_qr_code_screen.dart | 9 +- .../search_screen/search_screen.dart | 13 +-- .../terms_and_condition_screen.dart | 3 +- .../wallet_screen/payment_list_screen.dart | 19 ++-- .../wallet_screen/wallet_screen.dart | 19 ++-- .../on_boarding_screen.dart | 7 +- .../favourite_ondemand_screen.dart | 17 ++-- .../my_booking_on_demand_screen.dart | 13 +-- .../on_demand_booking_screen.dart | 49 +++++----- .../on_demand_category_screen.dart | 7 +- .../on_demand_dashboard_screen.dart | 19 ++-- .../on_demand_details_screen.dart | 31 ++++--- .../on_demand_home_screen.dart | 25 ++--- .../on_demand_order_details_screen.dart | 87 ++++++++--------- .../on_demand_payment_screen.dart | 17 ++-- .../on_demand_review_screen.dart | 9 +- .../provider_inbox_screen.dart | 7 +- .../on_demand_service/provider_screen.dart | 3 +- .../view_all_popular_service_screen.dart | 7 +- .../view_category_service_screen.dart | 3 +- .../worker_inbox_screen.dart | 7 +- .../parcel_service/book_parcel_screen.dart | 53 +++++------ .../parcel_service/home_parcel_screen.dart | 7 +- .../parcel_service/my_booking_screen.dart | 17 ++-- .../order_successfully_placed.dart | 7 +- .../parcel_service/parcel_coupon_screen.dart | 9 +- .../parcel_dashboard_screen.dart | 19 ++-- .../parcel_order_confirmation.dart | 59 ++++++------ .../parcel_service/parcel_order_details.dart | 45 ++++----- .../parcel_service/parcel_review_screen.dart | 13 +-- .../my_rental_booking_screen.dart | 17 ++-- .../rental_conformation_screen.dart | 33 +++---- .../rental_service/rental_coupon_screen.dart | 9 +- .../rental_dashboard_screen.dart | 15 +-- .../rental_service/rental_home_screen.dart | 39 ++++---- .../rental_order_details_screen.dart | 68 +++++++------- .../rental_service/rental_review_screen.dart | 11 ++- lib/service/cart_provider.dart | 9 +- lib/service/fire_store_utils.dart | 17 ++-- lib/themes/custom_dialog_box.dart | 9 +- lib/themes/round_button_border.dart | 5 +- lib/themes/round_button_fill.dart | 5 +- lib/themes/text_field_widget.dart | 5 +- lib/utils/utils.dart | 13 +-- .../src/widgets/defaults/empty_screen.dart | 3 +- lib/widget/osm_map/map_picker_page.dart | 11 ++- lib/widget/permission_dialog.dart | 7 +- .../place_picker/location_picker_screen.dart | 3 +- .../story_view/widgets/story_image.dart | 3 +- pubspec.yaml | 1 + 141 files changed, 1577 insertions(+), 1419 deletions(-) create mode 100644 assets/translations/ru_RU.json create mode 100644 assets/translations/uz_UZ.json diff --git a/assets/translations/ru_RU.json b/assets/translations/ru_RU.json new file mode 100644 index 0000000..e69de29 diff --git a/assets/translations/uz_UZ.json b/assets/translations/uz_UZ.json new file mode 100644 index 0000000..e69de29 diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 566a602..49a56e2 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -80,5 +80,11 @@ UIApplicationSupportsIndirectInputEvents + CFBundleLocalizations + + en + ru + uz + diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 0d701ac..2649715 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -102,25 +102,25 @@ class ConstTexts { static String plsLoginToAcc = "plsLoginToAcc"; static String youAreNotLoggedIn = "youAreNotLoggedIn"; static String noOrderfound = "noOrderfound"; - static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; - static String payNow = "payNow"; - static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; - static String somethingWentWrong = "somethingWentWrong"; - static String cash = "cash"; - static String coupon = "coupon"; - static String couponNotFound = "couponNotFound"; - static String tapToApply = "tapToApply"; - static String home = "home"; - static String myBookings = "myBookings"; - static String profile = "profile"; - static String wallet = "wallet"; - static String cabServiceType = "cabServiceType"; - static String everyRideVerified = "everyRideVerified"; - static String allDriversIDCheck = "allDriversIDCheck"; - static String intercity = "intercity"; - static String aroundTheCity = "aroundTheCity"; - static String rideDetails = "rideDetails"; - static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; - static String somethingWentWrong = "somethingWentWrong"; - static String cash = "cash"; + // static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; + // static String payNow = "payNow"; + // static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + // static String somethingWentWrong = "somethingWentWrong"; + // static String cash = "cash"; + // static String coupon = "coupon"; + // static String couponNotFound = "couponNotFound"; + // static String tapToApply = "tapToApply"; + // static String home = "home"; + // static String myBookings = "myBookings"; + // static String profile = "profile"; + // static String wallet = "wallet"; + // static String cabServiceType = "cabServiceType"; + // static String everyRideVerified = "everyRideVerified"; + // static String allDriversIDCheck = "allDriversIDCheck"; + // static String intercity = "intercity"; + // static String aroundTheCity = "aroundTheCity"; + // static String rideDetails = "rideDetails"; + // static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + // static String somethingWentWrong = "somethingWentWrong"; + // static String cash = "cash"; } diff --git a/lib/controllers/0n_demand_payment_controller.dart b/lib/controllers/0n_demand_payment_controller.dart index 9c496e6..6a8e3cd 100644 --- a/lib/controllers/0n_demand_payment_controller.dart +++ b/lib/controllers/0n_demand_payment_controller.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import '../../models/onprovider_order_model.dart'; @@ -72,7 +73,7 @@ class OnDemandPaymentController extends GetxController { Future placeOrder() async { if (!isExtra) { // Normal Order - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); onDemandOrderModel.value?.payment_method = selectedPaymentMethod.value; onDemandOrderModel.value?.paymentStatus = onDemandOrderModel.value?.provider.priceUnit == "Fixed" && selectedPaymentMethod.value == "cod" ? false : true; @@ -90,7 +91,7 @@ class OnDemandPaymentController extends GetxController { await SendNotification.sendFcmMessage(Constant.bookingPlaced, providerUser.fcmToken ?? '', payLoad); } - ShowToastDialog.showToast("OnDemand Service successfully booked".tr); + ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); } if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { WalletTransactionModel transactionModel = WalletTransactionModel( @@ -102,8 +103,8 @@ class OnDemandPaymentController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: onDemandOrderModel.value!.id, - note: "Booking Amount debited".tr, - paymentStatus: "success".tr, + note: "Booking Amount debited".tr(), + paymentStatus: "success".tr(), ); await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { @@ -133,7 +134,7 @@ class OnDemandPaymentController extends GetxController { isTopup: false, orderId: onDemandOrderModel.value!.id, note: "Booking Extra charge debited", - paymentStatus: "success".tr, + paymentStatus: "success".tr(), ); await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { @@ -156,7 +157,7 @@ class OnDemandPaymentController extends GetxController { isTopup: true, orderId: onDemandOrderModel.value?.id, note: 'Extra Charge Amount Credited', - paymentStatus: "success".tr, + paymentStatus: "success".tr(), ); await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { @@ -252,7 +253,7 @@ class OnDemandPaymentController extends GetxController { log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( @@ -276,7 +277,7 @@ class OnDemandPaymentController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); }); } on StripeException catch (e) { @@ -342,10 +343,10 @@ class OnDemandPaymentController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -377,15 +378,15 @@ class OnDemandPaymentController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -412,14 +413,14 @@ class OnDemandPaymentController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -445,10 +446,10 @@ class OnDemandPaymentController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -476,11 +477,11 @@ class OnDemandPaymentController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -585,7 +586,7 @@ class OnDemandPaymentController extends GetxController { final data = jsonDecode(response.body); if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -618,18 +619,18 @@ class OnDemandPaymentController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -644,10 +645,10 @@ class OnDemandPaymentController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -672,7 +673,7 @@ class OnDemandPaymentController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -702,12 +703,12 @@ class OnDemandPaymentController extends GetxController { if (paymentURL.toString().isNotEmpty) { Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -726,13 +727,13 @@ class OnDemandPaymentController extends GetxController { accessToken = responseData['access_token'] ?? ''; if (accessToken.isEmpty) { - ShowToastDialog.showToast("Failed to get access token".tr); + ShowToastDialog.showToast("Failed to get access token".tr()); return ''; } return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -773,7 +774,7 @@ class OnDemandPaymentController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -800,13 +801,13 @@ class OnDemandPaymentController extends GetxController { // () => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken), // )!.then((value) { // if (value == true) { - // ShowToastDialog.showToast("Payment Successful!!".tr); + // ShowToastDialog.showToast("Payment Successful!!".tr()); // placeOrder(); // (); // } // }); // } else { - // ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + // ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); // } // } // @@ -829,7 +830,7 @@ class OnDemandPaymentController extends GetxController { // // ignore: use_build_context_synchronously // return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); // } else { - // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); // return ''; // } // } @@ -870,7 +871,7 @@ class OnDemandPaymentController extends GetxController { // return ''; // } // } else { - // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); // return ''; // } // } @@ -889,11 +890,11 @@ class OnDemandPaymentController extends GetxController { if (model.id != null) { Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/Intercity_home_controller.dart b/lib/controllers/Intercity_home_controller.dart index 2322405..20fef19 100644 --- a/lib/controllers/Intercity_home_controller.dart +++ b/lib/controllers/Intercity_home_controller.dart @@ -42,6 +42,7 @@ import 'package:customer/payment/xenditScreen.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; @@ -313,20 +314,20 @@ class IntercityHomeController extends GetxController { Marker( markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), - infoWindow: InfoWindow(title: "Pickup Location".tr), + infoWindow: InfoWindow(title: "Pickup Location".tr()), icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), + Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } else if (order.status == Constant.orderInTransit) { markers.addAll([ Marker( markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), - infoWindow: InfoWindow(title: "Destination Location".tr), + infoWindow: InfoWindow(title: "Destination Location".tr()), icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), + Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } } @@ -412,7 +413,7 @@ class IntercityHomeController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { currentOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr); + ShowToastDialog.showToast("Payment method changed".tr()); Get.back(); Get.back(); }); @@ -433,8 +434,8 @@ class IntercityHomeController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: currentOrder.value.id, - note: "Cab Amount debited".tr, - paymentStatus: "success".tr, + note: "Cab Amount debited".tr(), + paymentStatus: "success".tr(), serviceType: Constant.parcelServiceType, ); @@ -446,7 +447,7 @@ class IntercityHomeController extends GetxController { } await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); Get.back(); }); } @@ -572,7 +573,7 @@ class IntercityHomeController extends GetxController { final LatLng pos = LatLng(lat, lng); final markerId = MarkerId(isDeparture ? 'Departure' : 'Destination'); final icon = isDeparture ? departureIcon! : destinationIcon!; - final title = isDeparture ? 'Departure'.tr : 'Destination'.tr; + final title = isDeparture ? 'Departure'.tr() : 'Destination'.tr(); if (isDeparture) { departureLatLong.value = pos; @@ -1031,7 +1032,7 @@ class IntercityHomeController extends GetxController { log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( @@ -1055,7 +1056,7 @@ class IntercityHomeController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); }); } on StripeException catch (e) { @@ -1121,10 +1122,10 @@ class IntercityHomeController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -1156,15 +1157,15 @@ class IntercityHomeController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -1188,14 +1189,14 @@ class IntercityHomeController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -1225,10 +1226,10 @@ class IntercityHomeController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -1256,11 +1257,11 @@ class IntercityHomeController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -1365,7 +1366,7 @@ class IntercityHomeController extends GetxController { final data = jsonDecode(response.body); if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -1398,18 +1399,18 @@ class IntercityHomeController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -1424,10 +1425,10 @@ class IntercityHomeController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -1452,7 +1453,7 @@ class IntercityHomeController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -1477,13 +1478,13 @@ class IntercityHomeController extends GetxController { if (paymentURL.toString() != '') { Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -1506,7 +1507,7 @@ class IntercityHomeController extends GetxController { // ignore: use_build_context_synchronously return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -1543,7 +1544,7 @@ class IntercityHomeController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -1562,11 +1563,11 @@ class IntercityHomeController extends GetxController { if (model.id != null) { Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/book_parcel_controller.dart b/lib/controllers/book_parcel_controller.dart index 7edc29d..825b239 100644 --- a/lib/controllers/book_parcel_controller.dart +++ b/lib/controllers/book_parcel_controller.dart @@ -3,6 +3,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart'; import 'package:dropdown_textfield/dropdown_textfield.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; @@ -101,10 +102,10 @@ class BookParcelController extends GetxController { void onCameraClick(BuildContext context) { final action = CupertinoActionSheet( - message: Text('Add your parcel image.'.tr, style: const TextStyle(fontSize: 15.0)), + message: Text('Add your parcel image.'.tr(), style: const TextStyle(fontSize: 15.0)), actions: [ CupertinoActionSheetAction( - child: Text('Choose image from gallery'.tr), + child: Text('Choose image from gallery'.tr()), onPressed: () async { Navigator.pop(context); final imageList = await _picker.pickMultiImage(); @@ -114,7 +115,7 @@ class BookParcelController extends GetxController { }, ), CupertinoActionSheetAction( - child: Text('Take a picture'.tr), + child: Text('Take a picture'.tr()), onPressed: () async { Navigator.pop(context); final XFile? photo = await _picker.pickImage(source: ImageSource.camera); @@ -124,7 +125,7 @@ class BookParcelController extends GetxController { }, ), ], - cancelButton: CupertinoActionSheetAction(child: Text('Cancel'.tr), onPressed: () => Navigator.pop(context)), + cancelButton: CupertinoActionSheetAction(child: Text('Cancel'.tr()), onPressed: () => Navigator.pop(context)), ); showCupertinoModalPopup(context: context, builder: (context) => action); } @@ -147,38 +148,38 @@ class BookParcelController extends GetxController { bool validateFields() { if (senderNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter sender name".tr); + ShowToastDialog.showToast("Please enter sender name".tr()); return false; } else if (senderMobileController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter sender mobile".tr); + ShowToastDialog.showToast("Please enter sender mobile".tr()); return false; } else if (senderLocationController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter sender address".tr); + ShowToastDialog.showToast("Please enter sender address".tr()); return false; } else if (receiverNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter receiver name".tr); + ShowToastDialog.showToast("Please enter receiver name".tr()); return false; } else if (receiverMobileController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter receiver mobile".tr); + ShowToastDialog.showToast("Please enter receiver mobile".tr()); return false; } else if (receiverLocationController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter receiver address".tr); + ShowToastDialog.showToast("Please enter receiver address".tr()); return false; } else if (isScheduled.value) { if (scheduledDate.value.isEmpty) { - ShowToastDialog.showToast("Please select scheduled date".tr); + ShowToastDialog.showToast("Please select scheduled date".tr()); return false; } else if (scheduledTime.value.isEmpty) { - ShowToastDialog.showToast("Please select scheduled time".tr); + ShowToastDialog.showToast("Please select scheduled time".tr()); return false; } } if (selectedWeight == null) { - ShowToastDialog.showToast("Please select parcel weight".tr); + ShowToastDialog.showToast("Please select parcel weight".tr()); return false; } else if (senderLocation.value == null || receiverLocation.value == null) { - ShowToastDialog.showToast("Please select both sender and receiver locations".tr); + ShowToastDialog.showToast("Please select both sender and receiver locations".tr()); return false; } return true; @@ -203,14 +204,14 @@ class BookParcelController extends GetxController { } if (distance.value < 0.5) { - ShowToastDialog.showToast("Sender's location to receiver's location should be more than 1 km.".tr); + ShowToastDialog.showToast("Sender's location to receiver's location should be more than 1 km.".tr()); return; } subTotal.value = (distance.value * double.parse(selectedWeight!.deliveryCharge.toString())); goToCart(); } catch (e) { - ShowToastDialog.showToast("Something went wrong while booking.".tr); + ShowToastDialog.showToast("Something went wrong while booking.".tr()); debugPrint("bookNow error: $e"); } } diff --git a/lib/controllers/cab_booking_controller.dart b/lib/controllers/cab_booking_controller.dart index 9b80a10..ce05319 100644 --- a/lib/controllers/cab_booking_controller.dart +++ b/lib/controllers/cab_booking_controller.dart @@ -40,6 +40,7 @@ import 'package:customer/payment/xenditScreen.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; @@ -304,20 +305,20 @@ class CabBookingController extends GetxController { Marker( markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), - infoWindow: InfoWindow(title: "Pickup Location".tr), + infoWindow: InfoWindow(title: "Pickup Location".tr()), icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), + Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } else if (order.status == Constant.orderInTransit) { markers.addAll([ Marker( markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), - infoWindow: InfoWindow(title: "Destination Location".tr), + infoWindow: InfoWindow(title: "Destination Location".tr()), icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), + Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } } @@ -403,7 +404,7 @@ class CabBookingController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { currentOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr); + ShowToastDialog.showToast("Payment method changed".tr()); Get.back(); Get.back(); }); @@ -437,7 +438,7 @@ class CabBookingController extends GetxController { } await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); Get.back(); }); } @@ -539,7 +540,7 @@ class CabBookingController extends GetxController { final markerId = MarkerId('Stop $index'); markers.removeWhere((marker) => marker.markerId == markerId); - markers.add(Marker(markerId: markerId, infoWindow: InfoWindow(title: '${'Stop'.tr} ${String.fromCharCode(index + 65)}'), position: LatLng(lat, lng), icon: stopIcon!)); + markers.add(Marker(markerId: markerId, infoWindow: InfoWindow(title: '${'Stop'.tr()} ${String.fromCharCode(index + 65)}'), position: LatLng(lat, lng), icon: stopIcon!)); getDirections(); } @@ -563,7 +564,7 @@ class CabBookingController extends GetxController { final LatLng pos = LatLng(lat, lng); final markerId = MarkerId(isDeparture ? 'Departure' : 'Destination'); final icon = isDeparture ? departureIcon! : destinationIcon!; - final title = isDeparture ? 'Departure'.tr : 'Destination'.tr; + final title = isDeparture ? 'Departure'.tr() : 'Destination'.tr(); if (isDeparture) { departureLatLong.value = pos; @@ -1022,7 +1023,7 @@ class CabBookingController extends GetxController { log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( @@ -1046,7 +1047,7 @@ class CabBookingController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); }); } on StripeException catch (e) { @@ -1112,10 +1113,10 @@ class CabBookingController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -1147,15 +1148,15 @@ class CabBookingController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -1179,14 +1180,14 @@ class CabBookingController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -1216,10 +1217,10 @@ class CabBookingController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -1247,11 +1248,11 @@ class CabBookingController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -1356,7 +1357,7 @@ class CabBookingController extends GetxController { final data = jsonDecode(response.body); if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -1389,18 +1390,18 @@ class CabBookingController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -1415,10 +1416,10 @@ class CabBookingController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -1443,7 +1444,7 @@ class CabBookingController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -1468,13 +1469,13 @@ class CabBookingController extends GetxController { if (paymentURL.toString() != '') { Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -1497,7 +1498,7 @@ class CabBookingController extends GetxController { // ignore: use_build_context_synchronously return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -1534,7 +1535,7 @@ class CabBookingController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -1553,11 +1554,11 @@ class CabBookingController extends GetxController { if (model.id != null) { Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/cab_review_controller.dart b/lib/controllers/cab_review_controller.dart index 8815b61..bbd1b20 100644 --- a/lib/controllers/cab_review_controller.dart +++ b/lib/controllers/cab_review_controller.dart @@ -1,5 +1,6 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/cab_order_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../constant/collection_name.dart'; @@ -67,11 +68,11 @@ class CabReviewController extends GetxController { /// Save / update review Future submitReview() async { if (comment.value.text.trim().isEmpty || ratings.value == 0) { - ShowToastDialog.showToast("Please provide rating and comment".tr); + ShowToastDialog.showToast("Please provide rating and comment".tr()); return; } - ShowToastDialog.showLoader("Submit in...".tr); + ShowToastDialog.showLoader("Submit in...".tr()); final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); diff --git a/lib/controllers/cart_controller.dart b/lib/controllers/cart_controller.dart index 4335f0f..8998fa7 100644 --- a/lib/controllers/cart_controller.dart +++ b/lib/controllers/cart_controller.dart @@ -13,6 +13,7 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; @@ -327,7 +328,7 @@ class CartController extends GetxController { if (double.parse(userModel.value.walletAmount.toString()) >= totalAmount.value) { setOrder(); } else { - ShowToastDialog.showToast("You don't have sufficient wallet balance to place order".tr); + ShowToastDialog.showToast("You don't have sufficient wallet balance to place order".tr()); } } else { setOrder(); @@ -335,13 +336,13 @@ class CartController extends GetxController { } Future setOrder() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) { await FireStoreUtils.getVendorById(vendorModel.value.id!).then((vender) async { if (vender?.subscriptionTotalOrders == '0' || vender?.subscriptionTotalOrders == null) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("This vendor has reached their maximum order capacity. Please select a different vendor or try again later.".tr); + ShowToastDialog.showToast("This vendor has reached their maximum order capacity. Please select a different vendor or try again later.".tr()); return; } }); @@ -402,8 +403,8 @@ class CartController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: orderModel.id, - note: "Order Amount debited".tr, - paymentStatus: "success".tr, + note: "Order Amount debited".tr(), + paymentStatus: "success".tr(), ); await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { @@ -540,7 +541,7 @@ class CartController extends GetxController { log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( @@ -564,7 +565,7 @@ class CartController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); }); } on StripeException catch (e) { @@ -630,10 +631,10 @@ class CartController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -665,15 +666,15 @@ class CartController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -697,14 +698,14 @@ class CartController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -734,10 +735,10 @@ class CartController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -765,11 +766,11 @@ class CartController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -874,7 +875,7 @@ class CartController extends GetxController { final data = jsonDecode(response.body); if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -906,18 +907,18 @@ class CartController extends GetxController { } void handlePaymentSuccess(PaymentSuccessResponse response) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -932,10 +933,10 @@ class CartController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -960,7 +961,7 @@ class CartController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -985,13 +986,13 @@ class CartController extends GetxController { if (paymentURL.toString() != '') { Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -1014,7 +1015,7 @@ class CartController extends GetxController { // ignore: use_build_context_synchronously return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -1051,7 +1052,7 @@ class CartController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -1070,11 +1071,11 @@ class CartController extends GetxController { if (model.id != null) { Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/chat_controller.dart b/lib/controllers/chat_controller.dart index bf091d8..bce8cf5 100644 --- a/lib/controllers/chat_controller.dart +++ b/lib/controllers/chat_controller.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:image_picker/image_picker.dart'; import '../models/conversation_model.dart'; @@ -93,11 +94,11 @@ class ChatController extends GetxController { if (url != null) { if (url.mime.contains('image')) { - conversationModel.message = "sent a message".tr; + conversationModel.message = "sent a message".tr(); } else if (url.mime.contains('video')) { - conversationModel.message = "Sent a video".tr; + conversationModel.message = "Sent a video".tr(); } else if (url.mime.contains('audio')) { - conversationModel.message = "Sent a audio".tr; + conversationModel.message = "Sent a audio".tr(); } } @@ -136,7 +137,7 @@ class ChatController extends GetxController { // sendMessage('', url, '', 'image'); // Get.back(); // } on PlatformException catch (e) { - // ShowToastDialog.showToast("${"failed_to_pick".tr} : \n $e"); + // ShowToastDialog.showToast("${"failed_to_pick".tr()} : \n $e"); // } // } } diff --git a/lib/controllers/complain_controller.dart b/lib/controllers/complain_controller.dart index 4d22e89..a76d011 100644 --- a/lib/controllers/complain_controller.dart +++ b/lib/controllers/complain_controller.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../models/cab_order_model.dart'; @@ -21,7 +22,7 @@ class ComplainController extends GetxController { order.value = args['order'] as CabOrderModel; getComplain(); } else { - ShowToastDialog.showToast("Order data not found".tr); + ShowToastDialog.showToast("Order data not found".tr()); Get.back(); } } @@ -35,7 +36,7 @@ class ComplainController extends GetxController { comment.value.text = data['description'] ?? ''; } } catch (e) { - ShowToastDialog.showToast("Failed to load complaint".tr); + ShowToastDialog.showToast("Failed to load complaint".tr()); } finally { isLoading.value = false; } @@ -44,12 +45,12 @@ class ComplainController extends GetxController { Future submitComplain() async { // Validation if (title.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter complaint title".tr); + ShowToastDialog.showToast("Please enter complaint title".tr()); return; } if (comment.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter complaint description".tr); + ShowToastDialog.showToast("Please enter complaint description".tr()); return; } @@ -72,15 +73,15 @@ class ComplainController extends GetxController { ); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Your complaint has been submitted to admin".tr); + ShowToastDialog.showToast("Your complaint has been submitted to admin".tr()); Get.back(); } else { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Your complaint is already submitted".tr); + ShowToastDialog.showToast("Your complaint is already submitted".tr()); } } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong, please try again".tr); + ShowToastDialog.showToast("Something went wrong, please try again".tr()); } finally { isLoading.value = false; } diff --git a/lib/controllers/dine_in_restaurant_details_controller.dart b/lib/controllers/dine_in_restaurant_details_controller.dart index 478b3f8..8d2105c 100644 --- a/lib/controllers/dine_in_restaurant_details_controller.dart +++ b/lib/controllers/dine_in_restaurant_details_controller.dart @@ -4,6 +4,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/dine_in_booking_model.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; @@ -34,9 +35,9 @@ class DineInRestaurantDetailsController extends GetxController { String getLocalizedOccasion(String key) { switch (key) { case "Birthday": - return "Birthday".tr; + return "Birthday".tr(); case "Anniversary": - return "Anniversary".tr; + return "Anniversary".tr(); default: return key; } @@ -61,7 +62,7 @@ class DineInRestaurantDetailsController extends GetxController { } Future orderBook() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); DateTime dt = selectedDate.value.toDate(); String hour = DateFormat("kk:mm").format(DateFormat('hh:mm a').parse((Intl.getCurrentLocale() == "en_US") ? selectedTimeSlot.value : selectedTimeSlot.value.toLowerCase())); @@ -91,7 +92,7 @@ class DineInRestaurantDetailsController extends GetxController { ShowToastDialog.closeLoader(); Get.back(); Get.to(const DineInBookingScreen()); - ShowToastDialog.showToast('Dine-In Request submitted successfully.'.tr); + ShowToastDialog.showToast('Dine-In Request submitted successfully.'.tr()); } void getRecord() { diff --git a/lib/controllers/edit_profile_controller.dart b/lib/controllers/edit_profile_controller.dart index 1208699..47537b4 100644 --- a/lib/controllers/edit_profile_controller.dart +++ b/lib/controllers/edit_profile_controller.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -42,7 +43,7 @@ class EditProfileController extends GetxController { } Future saveData() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); if (Constant().hasValidUrl(profileImage.value) == false && profileImage.value.isNotEmpty) { profileImage.value = await Constant.uploadUserImageToFireStorage( File(profileImage.value), @@ -71,7 +72,7 @@ class EditProfileController extends GetxController { Get.back(); profileImage.value = image.path; } on PlatformException catch (e) { - ShowToastDialog.showToast("${"failed_to_pick".tr} : \n $e"); + ShowToastDialog.showToast("${"failed_to_pick".tr()} : \n $e"); } } } diff --git a/lib/controllers/enter_manually_location_controller.dart b/lib/controllers/enter_manually_location_controller.dart index 281b2e2..a3962f1 100644 --- a/lib/controllers/enter_manually_location_controller.dart +++ b/lib/controllers/enter_manually_location_controller.dart @@ -1,4 +1,5 @@ import 'package:customer/service/fire_store_utils.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -69,13 +70,13 @@ class EnterManuallyLocationController extends GetxController { String getLocalizedSaveAs(String key) { switch (key) { case 'Home': - return 'Home'.tr; + return 'Home'.tr(); case 'Work': - return 'Work'.tr; + return 'Work'.tr(); case 'Hotel': - return 'Hotel'.tr; + return 'Hotel'.tr(); case 'Other': - return 'Other'.tr; + return 'Other'.tr(); default: return key; } diff --git a/lib/controllers/food_home_controller.dart b/lib/controllers/food_home_controller.dart index 74f4b97..3e1a300 100644 --- a/lib/controllers/food_home_controller.dart +++ b/lib/controllers/food_home_controller.dart @@ -9,6 +9,7 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; @@ -32,7 +33,7 @@ class FoodHomeController extends GetxController { RxBool isLoading = true.obs; RxBool isListView = true.obs; RxBool isPopular = true.obs; - RxString selectedOrderTypeValue = "Delivery".tr.obs; + RxString selectedOrderTypeValue = "Delivery".tr().obs; Rx pageController = PageController(viewportFraction: 0.877).obs; Rx pageBottomController = PageController(viewportFraction: 0.877).obs; diff --git a/lib/controllers/forgot_password_controller.dart b/lib/controllers/forgot_password_controller.dart index 3936731..0ea2da8 100644 --- a/lib/controllers/forgot_password_controller.dart +++ b/lib/controllers/forgot_password_controller.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -11,17 +12,17 @@ class ForgotPasswordController extends GetxController { final email = emailEditingController.value.text.trim(); if (email.isEmpty) { - ShowToastDialog.showToast("Please enter your email address.".tr); + ShowToastDialog.showToast("Please enter your email address.".tr()); return; } if (!GetUtils.isEmail(email)) { - ShowToastDialog.showToast("Please enter a valid email address.".tr); + ShowToastDialog.showToast("Please enter a valid email address.".tr()); return; } try { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); await FirebaseAuth.instance.sendPasswordResetEmail(email: email); ShowToastDialog.closeLoader(); ShowToastDialog.showToast( @@ -31,9 +32,9 @@ class ForgotPasswordController extends GetxController { } on FirebaseAuthException catch (e) { ShowToastDialog.closeLoader(); if (e.code == 'user-not-found') { - ShowToastDialog.showToast('No user found for that email.'.tr); + ShowToastDialog.showToast('No user found for that email.'.tr()); } else { - ShowToastDialog.showToast(e.message?.tr ?? "something_went_wrong".tr); + ShowToastDialog.showToast(e.message?.tr() ?? "something_went_wrong".tr()); } } } diff --git a/lib/controllers/gift_card_controller.dart b/lib/controllers/gift_card_controller.dart index 3dd7565..3476e93 100644 --- a/lib/controllers/gift_card_controller.dart +++ b/lib/controllers/gift_card_controller.dart @@ -6,6 +6,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/gift_cards_model.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -95,7 +96,7 @@ class GiftCardController extends GetxController { if (double.parse(userModel.value.walletAmount.toString()) >= double.parse(amountController.value.text)) { setOrder(); } else { - ShowToastDialog.showToast("You don't have sufficient wallet balance to purchase gift card".tr); + ShowToastDialog.showToast("You don't have sufficient wallet balance to purchase gift card".tr()); } } else { setOrder(); @@ -103,7 +104,7 @@ class GiftCardController extends GetxController { } Future setOrder() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); GiftCardsOrderModel giftCardsOrderModel = GiftCardsOrderModel(); giftCardsOrderModel.id = const Uuid().v4(); giftCardsOrderModel.giftId = selectedGiftCard.value.id.toString(); @@ -129,8 +130,8 @@ class GiftCardController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: giftCardsOrderModel.id, - note: "Gift card purchase amount debited".tr, - paymentStatus: "success".tr); + note: "Gift card purchase amount debited".tr(), + paymentStatus: "success".tr()); await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { if (value == true) { @@ -141,7 +142,7 @@ class GiftCardController extends GetxController { await FireStoreUtils.placeGiftCardOrder(giftCardsOrderModel); ShowToastDialog.closeLoader(); Get.off(const HistoryGiftCard()); - ShowToastDialog.showToast("Gift card Purchases successfully".tr); + ShowToastDialog.showToast("Gift card Purchases successfully".tr()); } String generateGiftCode() { @@ -328,7 +329,7 @@ class GiftCardController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); }); } on StripeException catch (e) { @@ -401,10 +402,10 @@ class GiftCardController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -429,14 +430,14 @@ class GiftCardController extends GetxController { ))! .then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -472,10 +473,10 @@ class GiftCardController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -503,11 +504,11 @@ class GiftCardController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -534,15 +535,15 @@ class GiftCardController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }), ), ); @@ -654,7 +655,7 @@ class GiftCardController extends GetxController { final data = jsonDecode(response.body); if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -690,18 +691,18 @@ class GiftCardController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } //Midtrans payment @@ -714,10 +715,10 @@ class GiftCardController extends GetxController { ))! .then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -749,7 +750,7 @@ class GiftCardController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -782,13 +783,13 @@ class GiftCardController extends GetxController { ))! .then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -815,7 +816,7 @@ class GiftCardController extends GetxController { // ignore: use_build_context_synchronously return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -853,7 +854,7 @@ class GiftCardController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -877,11 +878,11 @@ class GiftCardController extends GetxController { ))! .then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/history_gift_card_controller.dart b/lib/controllers/history_gift_card_controller.dart index aae9f46..138b313 100644 --- a/lib/controllers/history_gift_card_controller.dart +++ b/lib/controllers/history_gift_card_controller.dart @@ -1,6 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/gift_cards_order_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:share_plus/share_plus.dart'; import '../service/fire_store_utils.dart'; import 'package:get/get.dart'; @@ -32,7 +33,7 @@ class HistoryGiftCardController extends GetxController { Future share(String giftCode, String giftPin, String msg, String amount, Timestamp date) async { await Share.share( - "${'Gift Code :'.tr} $giftCode\n${'Gift Pin :'.tr} $giftPin\n${'Price :'.tr} ${Constant.amountShow(amount: amount)}\n${'Expire Date :'.tr} ${date.toDate()}\n\n${'Message'.tr} : $msg", + "${'Gift Code :'.tr()} $giftCode\n${'Gift Pin :'.tr()} $giftPin\n${'Price :'.tr()} ${Constant.amountShow(amount: amount)}\n${'Expire Date :'.tr()} ${date.toDate()}\n\n${'Message'.tr()} : $msg", ); } } diff --git a/lib/controllers/login_controller.dart b/lib/controllers/login_controller.dart index fd729ad..132c7ad 100644 --- a/lib/controllers/login_controller.dart +++ b/lib/controllers/login_controller.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -32,18 +33,18 @@ class LoginController extends GetxController { final email = emailController.value.text.trim(); final password = passwordController.value.text.trim(); if (email.isEmpty || !email.contains('@')) { - ShowToastDialog.showToast("Please enter a valid email address".tr); + ShowToastDialog.showToast("Please enter a valid email address".tr()); return; } if (password.isEmpty) { - ShowToastDialog.showToast("Please enter your password".tr); + ShowToastDialog.showToast("Please enter your password".tr()); return; } try { isLoading.value = true; - ShowToastDialog.showLoader("Logging in...".tr); + ShowToastDialog.showLoader("Logging in...".tr()); final credential = await FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password); @@ -68,23 +69,23 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr); + ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr); + ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); Get.offAll(() => const LoginScreen()); } } on FirebaseAuthException catch (e) { if (e.code == 'user-not-found') { - ShowToastDialog.showToast("No user found for that email.".tr); + ShowToastDialog.showToast("No user found for that email.".tr()); } else if (e.code == 'wrong-password') { - ShowToastDialog.showToast("Wrong password provided.".tr); + ShowToastDialog.showToast("Wrong password provided.".tr()); } else if (e.code == 'invalid-email') { - ShowToastDialog.showToast("Invalid email.".tr); + ShowToastDialog.showToast("Invalid email.".tr()); } else { - ShowToastDialog.showToast(e.message?.tr ?? "Login failed. Please try again.".tr); + ShowToastDialog.showToast(e.message?.tr() ?? "Login failed. Please try again.".tr()); } } finally { isLoading.value = false; @@ -93,7 +94,7 @@ class LoginController extends GetxController { } Future loginWithGoogle() async { - ShowToastDialog.showLoader("please wait...".tr); + ShowToastDialog.showLoader("please wait...".tr()); await signInWithGoogle().then((value) async { ShowToastDialog.closeLoader(); if (value != null) { @@ -131,12 +132,12 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr); + ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr); + ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); Get.offAll(() => const LoginScreen()); } } else { @@ -156,7 +157,7 @@ class LoginController extends GetxController { } Future loginWithApple() async { - ShowToastDialog.showLoader("please wait...".tr); + ShowToastDialog.showLoader("please wait...".tr()); await signInWithApple().then((value) async { ShowToastDialog.closeLoader(); if (value != null) { @@ -197,12 +198,12 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr); + ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr); + ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); Get.offAll(() => const LoginScreen()); } } else { diff --git a/lib/controllers/mobile_login_controller.dart b/lib/controllers/mobile_login_controller.dart index d3fe4d6..ddca48c 100644 --- a/lib/controllers/mobile_login_controller.dart +++ b/lib/controllers/mobile_login_controller.dart @@ -1,4 +1,5 @@ import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -18,12 +19,12 @@ class MobileLoginController extends GetxController { final countryCode = countryCodeController.value.text.trim(); if (mobile.isEmpty || mobile.length != 10) { - ShowToastDialog.showToast("Please enter a valid 10-digit mobile number".tr); + ShowToastDialog.showToast("Please enter a valid 10-digit mobile number".tr()); return; } try { - ShowToastDialog.showLoader("Sending OTP...".tr); + ShowToastDialog.showLoader("Sending OTP...".tr()); await _auth.verifyPhoneNumber( phoneNumber: '$countryCode$mobile', @@ -33,9 +34,9 @@ class MobileLoginController extends GetxController { verificationFailed: (FirebaseAuthException e) { ShowToastDialog.closeLoader(); if (e.code == 'invalid-phone-number') { - ShowToastDialog.showToast("Invalid phone number".tr); + ShowToastDialog.showToast("Invalid phone number".tr()); } else { - ShowToastDialog.showToast(e.message ?? "OTP verification failed".tr); + ShowToastDialog.showToast(e.message ?? "OTP verification failed".tr()); } }, codeSent: (String verificationId, int? resendToken) { @@ -44,13 +45,13 @@ class MobileLoginController extends GetxController { }, codeAutoRetrievalTimeout: (String verificationId) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("OTP timed out. Please try again.".tr); + ShowToastDialog.showToast("OTP timed out. Please try again.".tr()); // Optional: Handle timeout }, ); } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong. Please try again.".tr); + ShowToastDialog.showToast("Something went wrong. Please try again.".tr()); } } diff --git a/lib/controllers/my_cab_booking_controller.dart b/lib/controllers/my_cab_booking_controller.dart index f2d6359..d563f7c 100644 --- a/lib/controllers/my_cab_booking_controller.dart +++ b/lib/controllers/my_cab_booking_controller.dart @@ -34,6 +34,7 @@ import 'package:customer/payment/xenditScreen.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; @@ -112,13 +113,13 @@ class MyCabBookingController extends GetxController { String getLocalizedTabTitle(String tabKey) { switch (tabKey) { case "New": - return "New".tr; + return "New".tr(); case "On Going": - return "On Going".tr; + return "On Going".tr(); case "Completed": - return "Completed".tr; + return "Completed".tr(); case "Cancelled": - return "Cancelled".tr; + return "Cancelled".tr(); default: return tabKey; } @@ -185,7 +186,7 @@ class MyCabBookingController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { selectedOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.cabOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr); + ShowToastDialog.showToast("Payment method changed".tr()); Get.back(); }); } else { @@ -203,8 +204,8 @@ class MyCabBookingController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: selectedOrder.value.id, - note: "Cab Amount debited".tr, - paymentStatus: "success".tr, + note: "Cab Amount debited".tr(), + paymentStatus: "success".tr(), serviceType: Constant.parcelServiceType, ); @@ -214,7 +215,7 @@ class MyCabBookingController extends GetxController { } selectedOrder.value.paymentStatus = true; await FireStoreUtils.cabOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); Get.back(); }); } @@ -280,7 +281,7 @@ class MyCabBookingController extends GetxController { log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( @@ -304,7 +305,7 @@ class MyCabBookingController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); }); } on StripeException catch (e) { @@ -374,10 +375,10 @@ class MyCabBookingController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -409,15 +410,15 @@ class MyCabBookingController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -444,14 +445,14 @@ class MyCabBookingController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -481,10 +482,10 @@ class MyCabBookingController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -514,11 +515,11 @@ class MyCabBookingController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -635,7 +636,7 @@ class MyCabBookingController extends GetxController { final data = jsonDecode(response.body); if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -668,18 +669,18 @@ class MyCabBookingController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -694,10 +695,10 @@ class MyCabBookingController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -728,7 +729,7 @@ class MyCabBookingController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -762,13 +763,13 @@ class MyCabBookingController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -795,7 +796,7 @@ class MyCabBookingController extends GetxController { // ignore: use_build_context_synchronously return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -840,7 +841,7 @@ class MyCabBookingController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -861,11 +862,11 @@ class MyCabBookingController extends GetxController { () => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/my_rental_booking_controller.dart b/lib/controllers/my_rental_booking_controller.dart index 1876d9b..672ef22 100644 --- a/lib/controllers/my_rental_booking_controller.dart +++ b/lib/controllers/my_rental_booking_controller.dart @@ -4,6 +4,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:get/get.dart'; import '../models/rental_order_model.dart'; import '../models/tax_model.dart'; @@ -111,7 +112,7 @@ class MyRentalBookingController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { selectedOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.rentalOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr); + ShowToastDialog.showToast("Payment method changed".tr()); Get.back(); Get.back(); }); @@ -128,8 +129,8 @@ class MyRentalBookingController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: selectedOrder.value.id, - note: "Rental Amount debited".tr, - paymentStatus: "success".tr, + note: "Rental Amount debited".tr(), + paymentStatus: "success".tr(), serviceType: Constant.parcelServiceType, ); @@ -141,7 +142,7 @@ class MyRentalBookingController extends GetxController { } await FireStoreUtils.rentalOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); Get.back(); Get.back(); }); @@ -204,17 +205,17 @@ class MyRentalBookingController extends GetxController { isTopup: true, // refund orderId: order.id, - note: "Refund for cancelled booking".tr, - paymentStatus: "success".tr, + note: "Refund for cancelled booking".tr(), + paymentStatus: "success".tr(), serviceType: Constant.parcelServiceType, ); await FireStoreUtils.setWalletTransaction(walletTransaction); await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); } - ShowToastDialog.showToast("Booking cancelled successfully".tr); + ShowToastDialog.showToast("Booking cancelled successfully".tr()); } catch (e) { - ShowToastDialog.showToast("Failed to cancel booking: $e".tr); + ShowToastDialog.showToast("Failed to cancel booking: $e".tr()); } finally { isLoading.value = false; } diff --git a/lib/controllers/on_demand_booking_controller.dart b/lib/controllers/on_demand_booking_controller.dart index ab33fbd..ebc84d3 100644 --- a/lib/controllers/on_demand_booking_controller.dart +++ b/lib/controllers/on_demand_booking_controller.dart @@ -2,6 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; @@ -132,9 +133,9 @@ class OnDemandBookingController extends GetxController { Future confirmBooking(BuildContext context) async { if (selectedAddress.value.getFullAddress().isEmpty) { - ShowToastDialog.showToast("Please enter address".tr); + ShowToastDialog.showToast("Please enter address".tr()); } else if (dateTimeController.value.text.isEmpty) { - ShowToastDialog.showToast("Please select time slot.".tr); + ShowToastDialog.showToast("Please select time slot.".tr()); } else { UserModel? providerUser = await FireStoreUtils.getUserProfile(provider.value!.author!); @@ -169,7 +170,7 @@ class OnDemandBookingController extends GetxController { Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': Rxn(onDemandOrderModel), 'totalAmount': totalAmount.value, 'isExtra': false}); } else { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); OnProviderOrderModel onDemandOrder = OnProviderOrderModel( otp: Constant.getReferralCode(), authorID: FireStoreUtils.getCurrentUid(), @@ -207,7 +208,7 @@ class OnDemandBookingController extends GetxController { Get.offAll(const OnDemandDashboardScreen()); OnDemandDashboardController controller = Get.put(OnDemandDashboardController()); controller.selectedIndex.value = 2; - ShowToastDialog.showToast("OnDemand Service successfully booked".tr); + ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); } } } diff --git a/lib/controllers/on_demand_order_details_controller.dart b/lib/controllers/on_demand_order_details_controller.dart index 2fb2d76..3860ac7 100644 --- a/lib/controllers/on_demand_order_details_controller.dart +++ b/lib/controllers/on_demand_order_details_controller.dart @@ -2,6 +2,7 @@ import 'dart:developer'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import '../constant/constant.dart'; @@ -144,7 +145,7 @@ class OnDemandOrderDetailsController extends GetxController { final order = onProviderOrder.value; if (order == null) return; - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); try { double total = 0.0; @@ -186,7 +187,7 @@ class OnDemandOrderDetailsController extends GetxController { isTopup: true, orderId: order.id, note: 'Booking Amount Refund', - paymentStatus: "success".tr, + paymentStatus: "success".tr(), ), ); @@ -204,7 +205,7 @@ class OnDemandOrderDetailsController extends GetxController { isTopup: false, orderId: order.id, note: 'Booking Amount Refund', - paymentStatus: "success".tr, + paymentStatus: "success".tr(), ), ); } @@ -224,7 +225,7 @@ class OnDemandOrderDetailsController extends GetxController { isTopup: true, orderId: order.id, note: 'Admin commission refund', - paymentStatus: "success".tr, + paymentStatus: "success".tr(), ), ); } @@ -244,11 +245,11 @@ class OnDemandOrderDetailsController extends GetxController { ShowToastDialog.closeLoader(); Get.back(); - ShowToastDialog.showToast("Booking cancelled successfully".tr); + ShowToastDialog.showToast("Booking cancelled successfully".tr()); } catch (e, st) { log("Cancel error: $e\n$st"); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong".tr); + ShowToastDialog.showToast("Something went wrong".tr()); } } } diff --git a/lib/controllers/on_demand_review_controller.dart b/lib/controllers/on_demand_review_controller.dart index 4ccccd2..4d82f52 100644 --- a/lib/controllers/on_demand_review_controller.dart +++ b/lib/controllers/on_demand_review_controller.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../constant/collection_name.dart'; @@ -111,7 +112,7 @@ class OnDemandReviewController extends GetxController { } Future _providerReviewSubmit() async { - ShowToastDialog.showLoader("Submit in...".tr); + ShowToastDialog.showLoader("Submit in...".tr()); providerServiceModel.value!.reviewsCount = serviceReviewCount.value + 1; providerServiceModel.value!.reviewsSum = serviceReviewSum.value + ratings.value; @@ -142,7 +143,7 @@ class OnDemandReviewController extends GetxController { } Future _workerReviewSubmit() async { - ShowToastDialog.showLoader("Submit in...".tr); + ShowToastDialog.showLoader("Submit in...".tr()); workerModel.value!.reviewsCount = workerReviewCount.value + 1; workerModel.value!.reviewsSum = workerReviewSum.value + ratings.value; diff --git a/lib/controllers/otp_verification_controller.dart b/lib/controllers/otp_verification_controller.dart index d9309f5..f33f250 100644 --- a/lib/controllers/otp_verification_controller.dart +++ b/lib/controllers/otp_verification_controller.dart @@ -1,5 +1,6 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -42,7 +43,7 @@ class OtpVerifyController extends GetxController { codeSent: (String verificationId0, int? resendToken0) async { verificationId.value = verificationId0; resendToken.value = resendToken0!; - ShowToastDialog.showToast("OTP sent".tr); + ShowToastDialog.showToast("OTP sent".tr()); }, timeout: const Duration(seconds: 25), forceResendingToken: resendToken.value, @@ -55,12 +56,12 @@ class OtpVerifyController extends GetxController { void verifyOtp() async { if (otpController.value.text.length != 6) { - ShowToastDialog.showToast("Enter valid 6-digit OTP".tr); + ShowToastDialog.showToast("Enter valid 6-digit OTP".tr()); return; } try { - ShowToastDialog.showLoader("Verifying OTP...".tr); + ShowToastDialog.showLoader("Verifying OTP...".tr()); final credential = PhoneAuthProvider.credential(verificationId: verificationId.value, smsCode: otpController.value.text.trim()); @@ -91,7 +92,7 @@ class OtpVerifyController extends GetxController { } if (userModel.active == false) { - ShowToastDialog.showToast("This user is disabled".tr); + ShowToastDialog.showToast("This user is disabled".tr()); await _auth.signOut(); Get.offAll(() => const LoginScreen()); return; @@ -110,7 +111,7 @@ class OtpVerifyController extends GetxController { } } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Invalid OTP or Verification Failed".tr); + ShowToastDialog.showToast("Invalid OTP or Verification Failed".tr()); } } diff --git a/lib/controllers/parcel_my_booking_controller.dart b/lib/controllers/parcel_my_booking_controller.dart index 3e2addd..745472f 100644 --- a/lib/controllers/parcel_my_booking_controller.dart +++ b/lib/controllers/parcel_my_booking_controller.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../constant/constant.dart'; @@ -81,7 +82,7 @@ class ParcelMyBookingController extends GetxController { isLoading.value = true; if (order.status != Constant.orderPlaced) { - ShowToastDialog.showToast("You can only cancel before pickup.".tr); + ShowToastDialog.showToast("You can only cancel before pickup.".tr()); return; } @@ -124,9 +125,9 @@ class ParcelMyBookingController extends GetxController { await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); } - ShowToastDialog.showToast("Order cancelled successfully".tr); + ShowToastDialog.showToast("Order cancelled successfully".tr()); } catch (e) { - ShowToastDialog.showToast("${'Failed to cancel order:'.tr} $e".tr); + ShowToastDialog.showToast("${'Failed to cancel order:'.tr()} $e".tr()); } finally { isLoading.value = false; } diff --git a/lib/controllers/parcel_order_confirmation_controller.dart b/lib/controllers/parcel_order_confirmation_controller.dart index a8d1506..85f2e1d 100644 --- a/lib/controllers/parcel_order_confirmation_controller.dart +++ b/lib/controllers/parcel_order_confirmation_controller.dart @@ -5,6 +5,7 @@ import 'dart:math' as maths; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/wallet_transaction_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; @@ -135,7 +136,7 @@ class ParcelOrderConfirmationController extends GetxController { } Future placeOrder() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); try { List parcelImages = []; @@ -206,7 +207,7 @@ class ParcelOrderConfirmationController extends GetxController { value, ) async { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Order placed successfully".tr); + ShowToastDialog.showToast("Order placed successfully".tr()); Get.offAll( () => OrderSuccessfullyPlaced(), arguments: {'parcelOrder': parcelOrder.value}, @@ -215,7 +216,7 @@ class ParcelOrderConfirmationController extends GetxController { }); } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong. Please try again.".tr); + ShowToastDialog.showToast("Something went wrong. Please try again.".tr()); } } @@ -323,7 +324,7 @@ class ParcelOrderConfirmationController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr, + "Something went wrong, please contact admin.".tr(), ); } else { await Stripe.instance.initPaymentSheet( @@ -356,7 +357,7 @@ class ParcelOrderConfirmationController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); }); } on StripeException catch (e) { @@ -439,10 +440,10 @@ class ParcelOrderConfirmationController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -479,17 +480,17 @@ class ParcelOrderConfirmationController extends GetxController { onSuccess: (Map params) async { debugPrint("✅ PayPal Payment Success: $params"); placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { debugPrint("❌ PayPal Payment Error: $error"); Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { debugPrint("⚠️ PayPal Payment Canceled: $params"); Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -520,15 +521,15 @@ class ParcelOrderConfirmationController extends GetxController { // note: "Contact us for any questions on your order.", // onSuccess: (Map params) async { // placeOrder(); - // ShowToastDialog.showToast("Payment Successful!!".tr); + // ShowToastDialog.showToast("Payment Successful!!".tr()); // }, // onError: (error) { // Get.back(); - // ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + // ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); // }, // onCancel: (params) { // Get.back(); - // ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + // ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); // }, // ), // ), @@ -558,15 +559,15 @@ class ParcelOrderConfirmationController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr, + "Something went wrong, please contact admin.".tr(), ); } }); @@ -613,10 +614,10 @@ class ParcelOrderConfirmationController extends GetxController { bool isVerified = await verifyFlutterWavePayment(_ref!); if (isVerified) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); Get.back(); } }); @@ -675,11 +676,11 @@ class ParcelOrderConfirmationController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -832,7 +833,7 @@ class ParcelOrderConfirmationController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr, + "Something went wrong, please contact admin.".tr(), ); } @@ -865,7 +866,7 @@ class ParcelOrderConfirmationController extends GetxController { // final data = jsonDecode(response.body); // if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { // Get.back(); - // ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + // ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); // } // return GetPaymentTxtTokenModel.fromJson(data); // } @@ -901,18 +902,18 @@ class ParcelOrderConfirmationController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -930,10 +931,10 @@ class ParcelOrderConfirmationController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -974,7 +975,7 @@ class ParcelOrderConfirmationController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr, + "something went wrong, please contact admin.".tr(), ); return ''; } @@ -1001,7 +1002,7 @@ class ParcelOrderConfirmationController extends GetxController { debugPrint('🟩 Starting OrangePay Payment...'); debugPrint('💰 Amount: $amount | 🆔 Order ID: $id'); - ShowToastDialog.showLoader("Initializing payment...".tr); + ShowToastDialog.showLoader("Initializing payment...".tr()); var paymentURL = await fetchToken( context: context, @@ -1026,20 +1027,20 @@ class ParcelOrderConfirmationController extends GetxController { ), )?.then((value) async { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); debugPrint('🎉 Payment Successful for Order ID: $orderId'); if (Get.isBottomSheetOpen ?? false) Get.back(); await placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); debugPrint('⚠️ Payment flow closed without success.'); if (Get.isBottomSheetOpen ?? false) Get.back(); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); if (Get.isBottomSheetOpen ?? false) Get.back(); } } @@ -1085,7 +1086,7 @@ class ParcelOrderConfirmationController extends GetxController { } else { debugPrint('❌ Failed to fetch access token.'); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr, + "Something went wrong, please contact admin.".tr(), ); return ''; } @@ -1151,7 +1152,7 @@ class ParcelOrderConfirmationController extends GetxController { } else { debugPrint('❌ Payment request failed.'); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr, + "Something went wrong, please contact admin.".tr(), ); return ''; } @@ -1178,11 +1179,11 @@ class ParcelOrderConfirmationController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/parcel_order_details_controller.dart b/lib/controllers/parcel_order_details_controller.dart index e82d9b8..334b4f9 100644 --- a/lib/controllers/parcel_order_details_controller.dart +++ b/lib/controllers/parcel_order_details_controller.dart @@ -3,6 +3,7 @@ import 'package:customer/models/rating_model.dart'; import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../constant/constant.dart'; @@ -87,7 +88,7 @@ class ParcelOrderDetailsController extends GetxController { } Future cancelParcelOrder() async { - ShowToastDialog.showLoader("Cancelling order...".tr); + ShowToastDialog.showLoader("Cancelling order...".tr()); parcelOrder.value.status = Constant.orderCancelled; if (parcelOrder.value.paymentMethod?.toLowerCase() != "cod") { WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -113,7 +114,7 @@ class ParcelOrderDetailsController extends GetxController { await FireStoreUtils.parcelOrderPlace(parcelOrder.value); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Order cancelled successfully".tr); + ShowToastDialog.showToast("Order cancelled successfully".tr()); Get.back(result: true); } diff --git a/lib/controllers/parcel_review_controller.dart b/lib/controllers/parcel_review_controller.dart index becae1f..58691f8 100644 --- a/lib/controllers/parcel_review_controller.dart +++ b/lib/controllers/parcel_review_controller.dart @@ -1,5 +1,6 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/parcel_order_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../models/rating_model.dart'; @@ -70,11 +71,11 @@ class ParcelReviewController extends GetxController { /// Save / update review Future submitReview() async { if (comment.value.text.trim().isEmpty || ratings.value == 0) { - ShowToastDialog.showToast("Please provide rating and comment".tr); + ShowToastDialog.showToast("Please provide rating and comment".tr()); return; } - ShowToastDialog.showLoader("Submit in...".tr); + ShowToastDialog.showLoader("Submit in...".tr()); final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); diff --git a/lib/controllers/rate_product_controller.dart b/lib/controllers/rate_product_controller.dart index a31cbc6..61086a1 100644 --- a/lib/controllers/rate_product_controller.dart +++ b/lib/controllers/rate_product_controller.dart @@ -6,6 +6,7 @@ import 'package:customer/models/order_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/models/vendor_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../models/rating_model.dart'; import '../models/review_attribute_model.dart'; import '../service/fire_store_utils.dart'; @@ -118,7 +119,7 @@ class RateProductController extends GetxController { Future saveRating() async { if (ratings.value != 0.0) { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); productModel.value.reviewsCount = productReviewCount.value + 1; productModel.value.reviewsSum = productReviewSum.value + ratings.value; productModel.value.reviewAttributes = reviewProductAttributes; @@ -171,10 +172,10 @@ class RateProductController extends GetxController { await FireStoreUtils.updateVendor(vendorModel.value); await FireStoreUtils.setProduct(productModel.value); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Rating saved successfully.".tr); + ShowToastDialog.showToast("Rating saved successfully.".tr()); Get.back(); } else { - ShowToastDialog.showToast("Please add rate for food item.".tr); + ShowToastDialog.showToast("Please add rate for food item.".tr()); } } diff --git a/lib/controllers/rental_conformation_controller.dart b/lib/controllers/rental_conformation_controller.dart index a272942..a0bf823 100644 --- a/lib/controllers/rental_conformation_controller.dart +++ b/lib/controllers/rental_conformation_controller.dart @@ -5,6 +5,7 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/rental_order_model.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -71,7 +72,7 @@ class RentalConformationController extends GetxController { } Future placeOrder() async { - ShowToastDialog.showLoader("Placing booking...".tr); + ShowToastDialog.showLoader("Placing booking...".tr()); rentalOrderModel.value.discount = discount.value.toString(); rentalOrderModel.value.couponCode = selectedCouponModel.value.code; rentalOrderModel.value.couponId = selectedCouponModel.value.id; @@ -79,7 +80,7 @@ class RentalConformationController extends GetxController { rentalOrderModel.value.otpCode = (maths.Random().nextInt(9000) + 1000).toString(); await FireStoreUtils.rentalOrderPlace(rentalOrderModel.value).then((value) async { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Order placed successfully".tr); + ShowToastDialog.showToast("Order placed successfully".tr()); Get.offAll(const RentalDashboardScreen()); CabRentalDashboardControllers controller = Get.put(CabRentalDashboardControllers()); controller.selectedIndex.value = 1; diff --git a/lib/controllers/rental_home_controller.dart b/lib/controllers/rental_home_controller.dart index 779eea6..c7a3a36 100644 --- a/lib/controllers/rental_home_controller.dart +++ b/lib/controllers/rental_home_controller.dart @@ -7,6 +7,7 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/screen_ui/rental_service/rental_conformation_screen.dart'; import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; @@ -81,7 +82,7 @@ class RentalHomeController extends GetxController { sourceTextEditController.value.text = address; } } catch (e) { - ShowToastDialog.showToast("Unable to fetch current location".tr); + ShowToastDialog.showToast("Unable to fetch current location".tr()); } } diff --git a/lib/controllers/rental_order_details_controller.dart b/lib/controllers/rental_order_details_controller.dart index 59bd3e6..e51f7af 100644 --- a/lib/controllers/rental_order_details_controller.dart +++ b/lib/controllers/rental_order_details_controller.dart @@ -35,6 +35,7 @@ import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_scr import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; @@ -163,7 +164,7 @@ class RentalOrderDetailsController extends GetxController { totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; } catch (e) { - ShowToastDialog.showToast("${'Failed to calculate total:'.tr} $e"); + ShowToastDialog.showToast("${'Failed to calculate total:'.tr()} $e"); } } @@ -171,7 +172,7 @@ class RentalOrderDetailsController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { order.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.rentalOrderPlace(order.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr); + ShowToastDialog.showToast("Payment method changed".tr()); Get.back(); Get.back(); }); @@ -201,7 +202,7 @@ class RentalOrderDetailsController extends GetxController { } await FireStoreUtils.rentalOrderPlace(order.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); Get.back(); Get.back(); }); @@ -245,10 +246,10 @@ class RentalOrderDetailsController extends GetxController { await FireStoreUtils.setWalletTransaction(walletTransaction); await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); } - ShowToastDialog.showToast("Booking cancelled successfully".tr); + ShowToastDialog.showToast("Booking cancelled successfully".tr()); Get.back(); } catch (e) { - ShowToastDialog.showToast("${'Failed to cancel booking:'.tr} $e".tr); + ShowToastDialog.showToast("${'Failed to cancel booking:'.tr()} $e".tr()); } finally { isLoading.value = false; } @@ -329,7 +330,7 @@ class RentalOrderDetailsController extends GetxController { log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( @@ -353,7 +354,7 @@ class RentalOrderDetailsController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); }); } on StripeException catch (e) { @@ -419,10 +420,10 @@ class RentalOrderDetailsController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -454,15 +455,15 @@ class RentalOrderDetailsController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -489,14 +490,14 @@ class RentalOrderDetailsController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -526,10 +527,10 @@ class RentalOrderDetailsController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -557,11 +558,11 @@ class RentalOrderDetailsController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -666,7 +667,7 @@ class RentalOrderDetailsController extends GetxController { final data = jsonDecode(response.body); if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -699,18 +700,18 @@ class RentalOrderDetailsController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -725,10 +726,10 @@ class RentalOrderDetailsController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -753,7 +754,7 @@ class RentalOrderDetailsController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -778,13 +779,13 @@ class RentalOrderDetailsController extends GetxController { if (paymentURL.toString() != '') { Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -807,7 +808,7 @@ class RentalOrderDetailsController extends GetxController { // ignore: use_build_context_synchronously return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -844,7 +845,7 @@ class RentalOrderDetailsController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -862,10 +863,10 @@ class RentalOrderDetailsController extends GetxController { if (model.id != null) { Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/controllers/rental_review_controller.dart b/lib/controllers/rental_review_controller.dart index cc40f11..1314702 100644 --- a/lib/controllers/rental_review_controller.dart +++ b/lib/controllers/rental_review_controller.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../constant/collection_name.dart'; @@ -71,11 +72,11 @@ class RentalReviewController extends GetxController { /// Save / update review Future submitReview() async { if (comment.value.text.trim().isEmpty || ratings.value == 0) { - ShowToastDialog.showToast("Please provide rating and comment".tr); + ShowToastDialog.showToast("Please provide rating and comment".tr()); return; } - ShowToastDialog.showLoader("Submit in...".tr); + ShowToastDialog.showLoader("Submit in...".tr()); final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); diff --git a/lib/controllers/service_list_controller.dart b/lib/controllers/service_list_controller.dart index 5b6d906..b12354b 100644 --- a/lib/controllers/service_list_controller.dart +++ b/lib/controllers/service_list_controller.dart @@ -12,6 +12,7 @@ import 'package:customer/models/currency_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -75,7 +76,7 @@ class ServiceListController extends GetxController { SectionModel sectionModel, ) async { try { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); Constant.sectionConstantModel = sectionModel; AppThemeData.primary300 = Color( int.tryParse(sectionModel.color?.replaceFirst("#", "0xff") ?? '') ?? @@ -160,7 +161,7 @@ class ServiceListController extends GetxController { children: [ Text( "If you select this Section/Service, your previously added items will be removed from the cart." - .tr, + .tr(), textAlign: TextAlign.center, ), const SizedBox(height: 20), @@ -170,7 +171,7 @@ class ServiceListController extends GetxController { child: RoundedButtonFill( borderRadius: 10.r, height: 5.5, - title: "Cancel".tr, + title: "Cancel".tr(), onPress: () { Get.back(); }, @@ -182,7 +183,7 @@ class ServiceListController extends GetxController { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "OK".tr, + title: "OK".tr(), height: 5.5, onPress: () async { DatabaseHelper.instance.deleteAllCartProducts(); diff --git a/lib/controllers/sign_up_controller.dart b/lib/controllers/sign_up_controller.dart index 5817e97..04f9de4 100644 --- a/lib/controllers/sign_up_controller.dart +++ b/lib/controllers/sign_up_controller.dart @@ -1,6 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:firebase_auth/firebase_auth.dart' as auth; @@ -65,7 +66,7 @@ class SignUpController extends GetxController { try { if (!_validateInputs()) return; - ShowToastDialog.showLoader("Creating account...".tr); + ShowToastDialog.showLoader("Creating account...".tr()); if (type.value == "mobileNumber") { await _signUpWithMobile(); @@ -77,29 +78,29 @@ class SignUpController extends GetxController { } catch (e, st) { ShowToastDialog.closeLoader(); debugPrint("SIGNUP OUTER EXCEPTION: $e\n$st"); - ShowToastDialog.showToast("${'signup_failed'.tr}: $e"); + ShowToastDialog.showToast("${'signup_failed'.tr()}: $e"); } } /// Validation Logic bool _validateInputs() { if (firstNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter first name".tr); + ShowToastDialog.showToast("Please enter first name".tr()); return false; } else if (lastNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter last name".tr); + ShowToastDialog.showToast("Please enter last name".tr()); return false; } else if (emailController.value.text.isEmpty || !emailController.value.text.isEmail) { - ShowToastDialog.showToast("Please enter a valid email address".tr); + ShowToastDialog.showToast("Please enter a valid email address".tr()); return false; } else if (mobileController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter a valid phone number".tr); + ShowToastDialog.showToast("Please enter a valid phone number".tr()); return false; } else if (passwordController.value.text.length < 6) { - ShowToastDialog.showToast("Password must be at least 6 characters".tr); + ShowToastDialog.showToast("Password must be at least 6 characters".tr()); return false; } else if (passwordController.value.text != confirmPasswordController.value.text) { - ShowToastDialog.showToast("Password and Confirm password do not match".tr); + ShowToastDialog.showToast("Password and Confirm password do not match".tr()); return false; } return true; @@ -120,17 +121,17 @@ class SignUpController extends GetxController { } on auth.FirebaseAuthException catch (e) { debugPrint("FirebaseAuthException caught: code=${e.code}, message=${e.message}"); if (e.code == 'email-already-in-use') { - ShowToastDialog.showToast("Email already in use".tr); + ShowToastDialog.showToast("Email already in use".tr()); } else if (e.code == 'weak-password') { - ShowToastDialog.showToast("Password is too weak".tr); + ShowToastDialog.showToast("Password is too weak".tr()); } else if (e.code == 'invalid-email') { - ShowToastDialog.showToast("Invalid email address".tr); + ShowToastDialog.showToast("Invalid email address".tr()); } else { - ShowToastDialog.showToast(e.message ?? "signup_failed".tr); + ShowToastDialog.showToast(e.message ?? "signup_failed".tr()); } } catch (e) { debugPrint("Something went wrong: ${e.toString()}"); - ShowToastDialog.showToast("${'something_went_wrong'.tr}: ${e.toString()}"); + ShowToastDialog.showToast("${'something_went_wrong'.tr()}: ${e.toString()}"); } } @@ -147,7 +148,7 @@ class SignUpController extends GetxController { _navigateBasedOnAddress(userModel.value); } catch (e) { - ShowToastDialog.showToast("${'signup_failed'.tr}: $e"); + ShowToastDialog.showToast("${'signup_failed'.tr()}: $e"); } } diff --git a/lib/controllers/wallet_controller.dart b/lib/controllers/wallet_controller.dart index a955701..638eddc 100644 --- a/lib/controllers/wallet_controller.dart +++ b/lib/controllers/wallet_controller.dart @@ -17,6 +17,7 @@ import 'package:customer/models/payment_model/xendit.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -131,7 +132,7 @@ class WalletController extends GetxController { } }); - ShowToastDialog.showToast("Amount Top-up successfully".tr); + ShowToastDialog.showToast("Amount Top-up successfully".tr()); } // Strip @@ -142,7 +143,7 @@ class WalletController extends GetxController { log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( @@ -166,7 +167,7 @@ class WalletController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); walletTopUp(); }); } on StripeException catch (e) { @@ -231,14 +232,14 @@ class WalletController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something want wrong please contact administrator".tr); + ShowToastDialog.showToast("Something want wrong please contact administrator".tr()); print('Error creating preference: ${response.body}'); return null; } @@ -266,15 +267,15 @@ class WalletController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { walletTopUp(); - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); }, ), ), @@ -298,14 +299,14 @@ class WalletController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } }); } @@ -335,10 +336,10 @@ class WalletController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); } }); } else { @@ -366,11 +367,11 @@ class WalletController extends GetxController { bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr); + ShowToastDialog.showToast("Payment successfully".tr()); walletTopUp(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr); + ShowToastDialog.showToast("Payment Failed".tr()); } }); } @@ -402,18 +403,18 @@ class WalletController extends GetxController { } void handlePaymentSuccess(PaymentSuccessResponse response) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr); + ShowToastDialog.showToast("Payment Processing!! via".tr()); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr); + ShowToastDialog.showToast("Payment Failed!!".tr()); } //Midtrans payment @@ -423,10 +424,10 @@ class WalletController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } @@ -451,7 +452,7 @@ class WalletController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); return ''; } } @@ -476,12 +477,12 @@ class WalletController extends GetxController { if (paymentURL.toString() != '') { Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } } @@ -501,7 +502,7 @@ class WalletController extends GetxController { accessToken = responseData['access_token']; return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -540,7 +541,7 @@ class WalletController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); return ''; } } @@ -559,10 +560,10 @@ class WalletController extends GetxController { if (model.id != null) { Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr); + ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); } }); } diff --git a/lib/main.dart b/lib/main.dart index d607b39..bc48340 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:customer/service/localization_service.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/easy_loading_config.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -14,6 +15,7 @@ import 'firebase_options.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); + await EasyLocalization.ensureInitialized(); await Firebase.initializeApp( name: 'default', options: DefaultFirebaseOptions.currentPlatform, @@ -24,7 +26,18 @@ void main() async { Get.put(ThemeController()); await configEasyLoading(); - runApp(MyApp()); + runApp( + EasyLocalization( + supportedLocales: [ + Locale('en', 'US'), + Locale('uz', 'UZ'), + Locale('ru', 'RU'), + ], + path: 'assets/translations', + fallbackLocale: Locale('en', 'US'), + child: MyApp(), + ), + ); } class MyApp extends StatelessWidget { @@ -41,6 +54,9 @@ class MyApp extends StatelessWidget { minTextAdapt: true, splitScreenMode: true, child: GetMaterialApp( + localizationsDelegates: context.localizationDelegates, + supportedLocales: context.supportedLocales, + locale: context.locale, debugShowCheckedModeBanner: false, builder: (context, child) { return SafeArea( @@ -50,7 +66,6 @@ class MyApp extends StatelessWidget { ); }, translations: LocalizationService(), - locale: LocalizationService.locale, fallbackLocale: LocalizationService.locale, themeMode: themeController.themeMode, theme: ThemeData( diff --git a/lib/payment/MercadoPagoScreen.dart b/lib/payment/MercadoPagoScreen.dart index ceb4282..f296a79 100644 --- a/lib/payment/MercadoPagoScreen.dart +++ b/lib/payment/MercadoPagoScreen.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:customer/constant/constant.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -57,7 +58,7 @@ class _MercadoPagoScreenState extends State { }, child: Scaffold( appBar: AppBar( - title: Text("Payment".tr), + title: Text("Payment".tr()), centerTitle: false, leading: GestureDetector( onTap: () { @@ -77,18 +78,18 @@ class _MercadoPagoScreenState extends State { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), + title: Text('Cancel Payment'.tr()), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr, style: const TextStyle(color: Colors.red)), + child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), onPressed: () { Navigator.of(context).pop(); Get.back(result: false); }, ), TextButton( - child: Text('Continue'.tr, style: const TextStyle(color: Colors.green)), + child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), onPressed: () { Navigator.of(context).pop(); }, diff --git a/lib/payment/PayFastScreen.dart b/lib/payment/PayFastScreen.dart index e4b570c..5b24b4e 100644 --- a/lib/payment/PayFastScreen.dart +++ b/lib/payment/PayFastScreen.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:customer/models/payment_model/pay_fast_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -84,17 +85,17 @@ class _PayFastScreenState extends State { builder: (BuildContext context) { return AlertDialog( title: const Text('Cancel Payment'), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Exit'.tr, style: TextStyle(color: Colors.red)), + child: Text('Exit'.tr(), style: TextStyle(color: Colors.red)), onPressed: () { Get.back(); Get.back(result: false); }, ), TextButton( - child: Text('Continue Payment'.tr, style: TextStyle(color: Colors.green)), + child: Text('Continue Payment'.tr(), style: TextStyle(color: Colors.green)), onPressed: () { Get.back(); }, diff --git a/lib/payment/midtrans_screen.dart b/lib/payment/midtrans_screen.dart index 9660953..7336b51 100644 --- a/lib/payment/midtrans_screen.dart +++ b/lib/payment/midtrans_screen.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:developer'; import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -91,18 +92,18 @@ class _MidtransScreenState extends State { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), + title: Text('Cancel Payment'.tr()), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr, style: const TextStyle(color: Colors.red)), + child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), onPressed: () { Get.back(result: false); Get.back(result: false); }, ), TextButton( - child: Text('Continue'.tr, style: const TextStyle(color: Colors.green)), + child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), onPressed: () { Get.back(result: false); }, diff --git a/lib/payment/orangePayScreen.dart b/lib/payment/orangePayScreen.dart index d187080..47e0f6b 100644 --- a/lib/payment/orangePayScreen.dart +++ b/lib/payment/orangePayScreen.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:customer/models/payment_model/orange_money.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; @@ -107,7 +108,7 @@ class _OrangeMoneyScreenState extends State { appBar: AppBar( backgroundColor: Colors.black, leading: IconButton(icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: _showCancelDialog), - title: Text('Orange Money Payment'.tr), + title: Text('Orange Money Payment'.tr()), ), body: isLoading ? const Center(child: CircularProgressIndicator()) : WebViewWidget(controller: controller), ), @@ -120,12 +121,12 @@ class _OrangeMoneyScreenState extends State { barrierDismissible: true, builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr), - content: Text('Are you sure you want to cancel this payment?'.tr), + title: Text('Cancel Payment'.tr()), + content: Text('Are you sure you want to cancel this payment?'.tr()), actions: [ TextButton(child: Text('No', style: TextStyle(color: Colors.green)), onPressed: () => Get.back()), TextButton( - child: Text('Yes'.tr, style: TextStyle(color: Colors.red)), + child: Text('Yes'.tr(), style: TextStyle(color: Colors.red)), onPressed: () { timer?.cancel(); Get.back(); // close dialog @@ -298,14 +299,14 @@ class _OrangeMoneyScreenState extends State { // barrierDismissible: true, // user must tap button! // builder: (BuildContext context) { // return AlertDialog( -// title: Text('Cancel Payment'.tr), +// title: Text('Cancel Payment'.tr()), // content: SingleChildScrollView( -// child: Text("cancelPayment?".tr), +// child: Text("cancelPayment?".tr()), // ), // actions: [ // TextButton( // child: Text( -// 'Cancel'.tr, +// 'Cancel'.tr(), // style: const TextStyle(color: Colors.red), // ), // onPressed: () { @@ -315,7 +316,7 @@ class _OrangeMoneyScreenState extends State { // ), // TextButton( // child: Text( -// 'Continue'.tr, +// 'Continue'.tr(), // style: const TextStyle(color: Colors.green), // ), // onPressed: () { diff --git a/lib/payment/paystack/pay_stack_screen.dart b/lib/payment/paystack/pay_stack_screen.dart index 3ade273..d33d2b4 100644 --- a/lib/payment/paystack/pay_stack_screen.dart +++ b/lib/payment/paystack/pay_stack_screen.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:customer/payment/paystack/paystack_url_genrater.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -72,7 +73,7 @@ class _PayStackScreenState extends State { child: Scaffold( appBar: AppBar( backgroundColor: AppThemeData.grey50, - title: Text("Payment".tr), + title: Text("Payment".tr()), centerTitle: false, leading: GestureDetector( onTap: () { diff --git a/lib/payment/xenditScreen.dart b/lib/payment/xenditScreen.dart index a494ab7..b3ace2b 100644 --- a/lib/payment/xenditScreen.dart +++ b/lib/payment/xenditScreen.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'dart:developer'; import 'package:customer/payment/xenditModel.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; @@ -112,18 +113,18 @@ class _XenditScreenState extends State { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), + title: Text('Cancel Payment'.tr()), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr, style: const TextStyle(color: Colors.red)), + child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), onPressed: () { Navigator.of(context).pop(false); Navigator.of(context).pop(false); }, ), TextButton( - child: Text('Continue'.tr, style: const TextStyle(color: Colors.green)), + child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), onPressed: () { Navigator.of(context).pop(false); }, diff --git a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart index cc530cb..9f7b0bd 100644 --- a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart @@ -2,6 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dash_board_controller.dart'; import 'package:customer/controllers/dash_board_ecommarce_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -41,17 +42,17 @@ class DashBoardEcommerceScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr, controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), + navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ], ), ); diff --git a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart index 914beb2..cae6b77 100644 --- a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart @@ -32,6 +32,7 @@ import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:customer/widget/video_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; @@ -68,7 +69,7 @@ class HomeECommerceScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 12)), + child: Text("Login".tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 12)), ) : Text(Constant.userModel!.fullName(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 12)), InkWell( @@ -84,7 +85,7 @@ class HomeECommerceScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); // ✅ declare it once here! ShippingAddress shippingAddress = ShippingAddress(); @@ -203,7 +204,7 @@ class HomeECommerceScreen extends StatelessWidget { Get.to(const SearchScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); }, child: TextFieldWidget( - hintText: 'Search the store, item and more...'.tr, + hintText: 'Search the store, item and more...'.tr(), controller: null, enable: false, backgroundColor: AppThemeData.grey50, @@ -233,7 +234,7 @@ class HomeECommerceScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Category".tr, + "Category".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16), ), @@ -243,7 +244,7 @@ class HomeECommerceScreen extends StatelessWidget { Get.to(const ViewAllCategoryScreen()); }, child: Text( - "View all".tr, + "View all".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( decoration: TextDecoration.underline, @@ -312,7 +313,7 @@ class HomeECommerceScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Highlights for you".tr, + "Highlights for you".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -324,7 +325,7 @@ class HomeECommerceScreen extends StatelessWidget { }); }, child: Text( - "View all".tr, + "View all".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), @@ -353,7 +354,7 @@ class HomeECommerceScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( - "New Arrivals".tr, + "New Arrivals".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16), ), @@ -382,9 +383,9 @@ class HomeECommerceScreen extends StatelessWidget { radius: 10, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - title: 'View All Arrivals'.tr, + title: 'View All Arrivals'.tr(), onPress: () { - Get.to(RestaurantListScreen(), arguments: {"vendorList": controller.newArrivalRestaurantList, "title": "New Arrivals".tr}); + Get.to(RestaurantListScreen(), arguments: {"vendorList": controller.newArrivalRestaurantList, "title": "New Arrivals".tr()}); }, ), ), @@ -394,7 +395,7 @@ class HomeECommerceScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Top Brands".tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text("Top Brands".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), SizedBox(height: 10), GridView.builder( padding: EdgeInsets.zero, @@ -466,7 +467,7 @@ class HomeECommerceScreen extends StatelessWidget { children: [ Text(item.title.toString(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 18)), Text( - "Style up with the latest fits, now at unbeatable prices.".tr, + "Style up with the latest fits, now at unbeatable prices.".tr(), textAlign: TextAlign.start, style: AppThemeData.regularTextStyle(color: AppThemeData.grey900, fontSize: 12), ), @@ -630,7 +631,7 @@ class HomeECommerceScreen extends StatelessWidget { // children: [ // Expanded( // child: Text( - // "Highlights for you".tr, + // "Highlights for you".tr(), // textAlign: TextAlign.start, // style: TextStyle( // fontFamily: AppThemeData.semiBold, @@ -646,7 +647,7 @@ class HomeECommerceScreen extends StatelessWidget { // }); // }, // child: Text( - // "View all".tr, + // "View all".tr(), // textAlign: TextAlign.center, // style: TextStyle( // fontFamily: AppThemeData.regular, @@ -686,7 +687,7 @@ class HomeECommerceScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("All Store".tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text("All Store".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), SizedBox(height: 10), ListView.builder( padding: EdgeInsets.zero, @@ -754,7 +755,7 @@ class HomeECommerceScreen extends StatelessWidget { radius: 10, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - title: 'View All Stores'.tr, + title: 'View All Stores'.tr(), onPress: () { Get.to(const RestaurantListScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); }, @@ -863,13 +864,13 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); ShowToastDialog.closeLoader(); Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); @@ -880,7 +881,7 @@ class BannerView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr); + ShowToastDialog.showToast("Could not launch".tr()); } } }, @@ -942,13 +943,13 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); ShowToastDialog.closeLoader(); Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); @@ -959,7 +960,7 @@ class BannerBottomView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr); + ShowToastDialog.showToast("Could not launch".tr()); } } }, @@ -1006,7 +1007,7 @@ class AdvertisementHomeCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(model.vendorId!); ShowToastDialog.closeLoader(); Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); diff --git a/lib/screen_ui/location_enable_screens/address_list_screen.dart b/lib/screen_ui/location_enable_screens/address_list_screen.dart index fcae1e4..474620a 100644 --- a/lib/screen_ui/location_enable_screens/address_list_screen.dart +++ b/lib/screen_ui/location_enable_screens/address_list_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/screen_ui/location_enable_screens/enter_manually_location.dart'; import 'package:customer/themes/app_them_data.dart' show AppThemeData; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -38,14 +39,14 @@ class AddressListScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("My Addresses".tr, style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("My Addresses".tr(), style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), const SizedBox(height: 5), - Text("Allows users to view, manage, add, or edit delivery addresses.".tr, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), + Text("Allows users to view, manage, add, or edit delivery addresses.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), const SizedBox(height: 24), Expanded( child: controller.shippingAddressList.isEmpty - ? Constant.showEmptyView(message: "Address not found".tr) + ? Constant.showEmptyView(message: "Address not found".tr()) : ListView.separated( itemCount: controller.shippingAddressList.length, itemBuilder: (context, index) { @@ -80,7 +81,7 @@ class AddressListScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), child: Text( - "Default".tr, + "Default".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), ), ), diff --git a/lib/screen_ui/location_enable_screens/enter_manually_location.dart b/lib/screen_ui/location_enable_screens/enter_manually_location.dart index 6f8e119..83046f1 100644 --- a/lib/screen_ui/location_enable_screens/enter_manually_location.dart +++ b/lib/screen_ui/location_enable_screens/enter_manually_location.dart @@ -6,6 +6,7 @@ import 'package:customer/utils/utils.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -45,15 +46,15 @@ class EnterManuallyLocationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - controller.mode == "Edit" ? "Edit Address".tr : "Add a New Address".tr, + controller.mode == "Edit" ? "Edit Address".tr() : "Add a New Address".tr(), style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), const SizedBox(height: 10), - Text("Enter your location details so we can deliver your orders quickly and accurately.".tr, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), + Text("Enter your location details so we can deliver your orders quickly and accurately.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), const SizedBox(height: 24), Row( children: [ - Expanded(child: Text("Set as Default Address".tr, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600))), + Expanded(child: Text("Set as Default Address".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600))), Transform.scale( scale: 0.7, // Decrease the size (try 0.5, 0.6, etc.) child: Switch( @@ -97,8 +98,8 @@ class EnterManuallyLocationScreen extends StatelessWidget { ); }, child: TextFieldWidget( - title: "Choose Location".tr, - hintText: "Choose Location".tr, + title: "Choose Location".tr(), + hintText: "Choose Location".tr(), readOnly: true, enable: false, controller: null, @@ -137,15 +138,15 @@ class EnterManuallyLocationScreen extends StatelessWidget { ), ), const SizedBox(height: 15), - TextFieldWidget(title: "Flat/House/Floor/Building*".tr, hintText: "Enter address details".tr, controller: controller.houseBuildingTextEditingController.value), + TextFieldWidget(title: "Flat/House/Floor/Building*".tr(), hintText: "Enter address details".tr(), controller: controller.houseBuildingTextEditingController.value), const SizedBox(height: 15), - TextFieldWidget(title: "Area/Sector/Locality*".tr, hintText: "Enter area/locality".tr, controller: controller.localityEditingController.value), + TextFieldWidget(title: "Area/Sector/Locality*".tr(), hintText: "Enter area/locality".tr(), controller: controller.localityEditingController.value), const SizedBox(height: 15), - TextFieldWidget(title: "Nearby Landmark".tr, hintText: "Add a landmark".tr, controller: controller.landmarkEditingController.value), + TextFieldWidget(title: "Nearby Landmark".tr(), hintText: "Add a landmark".tr(), controller: controller.landmarkEditingController.value), const SizedBox(height: 30), Container(height: 1, color: AppThemeData.grey200), const SizedBox(height: 25), - Text("Save Address As".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + Text("Save Address As".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), const SizedBox(height: 10), Wrap( spacing: 10, @@ -175,18 +176,18 @@ class EnterManuallyLocationScreen extends StatelessWidget { const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: "Save Address".tr, + title: "Save Address".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.location.value.latitude == null || controller.location.value.longitude == null) { - ShowToastDialog.showToast("Please select Location".tr); + ShowToastDialog.showToast("Please select Location".tr()); } else if (controller.houseBuildingTextEditingController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Flat / House / Floor / Building".tr); + ShowToastDialog.showToast("Please Enter Flat / House / Floor / Building".tr()); } else if (controller.localityEditingController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Area / Sector / Locality".tr); + ShowToastDialog.showToast("Please Enter Area / Sector / Locality".tr()); } else { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); //Common values controller.shippingModel.value.location = controller.location.value; diff --git a/lib/screen_ui/location_enable_screens/location_permission_screen.dart b/lib/screen_ui/location_enable_screens/location_permission_screen.dart index 547da30..b3903e1 100644 --- a/lib/screen_ui/location_enable_screens/location_permission_screen.dart +++ b/lib/screen_ui/location_enable_screens/location_permission_screen.dart @@ -9,6 +9,7 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:geocoding/geocoding.dart'; @@ -39,7 +40,7 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( - "Enable Location for a Personalized Experience".tr, + "Enable Location for a Personalized Experience".tr(), style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), textAlign: TextAlign.center, ), @@ -48,7 +49,7 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - "Allow location access to discover beauty stores and services near you.".tr, + "Allow location access to discover beauty stores and services near you.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), textAlign: TextAlign.center, ), @@ -56,12 +57,12 @@ class LocationPermissionScreen extends StatelessWidget { const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: "Use current location".tr, + title: "Use current location".tr(), onPress: () async { Constant.checkPermission( context: context, onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); @@ -107,12 +108,12 @@ class LocationPermissionScreen extends StatelessWidget { const SizedBox(height: 10), RoundedButtonFill( borderRadius: 10.r, - title: "Set from map".tr, + title: "Set from map".tr(), onPress: () async { Constant.checkPermission( context: context, onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); @@ -180,7 +181,7 @@ class LocationPermissionScreen extends StatelessWidget { } }); }, - child: Text("Enter Manually location".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text("Enter Manually location".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), ], ), diff --git a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart index e95bc4f..38ae3cc 100644 --- a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart +++ b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart @@ -1,4 +1,5 @@ import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -15,12 +16,12 @@ class MaintenanceModeScreen extends StatelessWidget { children: [ Center(child: Image.asset('assets/images/maintenance.png', height: 200, width: 200)), const SizedBox(height: 20), - Text("We'll be back soon!".tr, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), + Text("We'll be back soon!".tr(), style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), const SizedBox(height: 10), Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Text( - "Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!".tr, + "Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!".tr(), textAlign: TextAlign.center, style: const TextStyle(fontSize: 16), ), diff --git a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart index ce39b54..87b1649 100644 --- a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart +++ b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; @@ -33,7 +34,7 @@ class AllAdvertisementScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Highlights for you".tr, + "Highlights for you".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -42,7 +43,7 @@ class AllAdvertisementScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.advertisementList.isEmpty - ? Constant.showEmptyView(message: "Highlights for you not found.".tr) + ? Constant.showEmptyView(message: "Highlights for you not found.".tr()) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: ListView.builder( @@ -72,7 +73,7 @@ class AdvertisementCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(model.vendorId!); ShowToastDialog.closeLoader(); Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart index 81f9df8..acf9906 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart @@ -14,6 +14,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -44,7 +45,7 @@ class CartScreen extends StatelessWidget { appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface), body: cartItem.isEmpty - ? Constant.showEmptyView(message: "Item Not available".tr) + ? Constant.showEmptyView(message: "Item Not available".tr()) : SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -62,7 +63,7 @@ class CartScreen extends StatelessWidget { controller.selectedAddress.value = shippingAddress; controller.calculatePrice(); } else { - ShowToastDialog.showToast("Service not available in this area".tr); + ShowToastDialog.showToast("Service not available in this area".tr()); } } }); @@ -252,20 +253,20 @@ class CartScreen extends StatelessWidget { -1) { controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); } else { - ShowToastDialog.showToast("Out of stock".tr); + ShowToastDialog.showToast("Out of stock".tr()); } } else { if ((productModel!.quantity ?? 0) > (cartProductModel.quantity ?? 0) || productModel!.quantity == -1) { controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); } else { - ShowToastDialog.showToast("Out of stock".tr); + ShowToastDialog.showToast("Out of stock".tr()); } } } else { if ((productModel!.quantity ?? 0) > (cartProductModel.quantity ?? 0) || productModel!.quantity == -1) { controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); } else { - ShowToastDialog.showToast("Out of stock".tr); + ShowToastDialog.showToast("Out of stock".tr()); } } }, @@ -285,7 +286,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Variants".tr, + "Variants".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -324,7 +325,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Addons".tr, + "Addons".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -381,7 +382,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Delivery Type'.tr} (${controller.selectedFoodType.value})".tr, + "${'Delivery Type'.tr()} (${controller.selectedFoodType.value})".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -400,13 +401,13 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Instant Delivery".tr, + "Instant Delivery".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), ), const SizedBox(height: 5), Text( - "Standard".tr, + "Standard".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), ), @@ -415,7 +416,7 @@ class CartScreen extends StatelessWidget { ), Radio( value: controller.deliveryType.value, - groupValue: "instant".tr, + groupValue: "instant".tr(), activeColor: AppThemeData.primary300, onChanged: (value) { controller.deliveryType.value = "instant"; @@ -438,7 +439,7 @@ class CartScreen extends StatelessWidget { }, minDateTime: DateTime.now(), displaySubmitButton: true, - pickerTitle: Text('Schedule Time'.tr), + pickerTitle: Text('Schedule Time'.tr()), buttonSingleColor: AppThemeData.primary300, ).show(context); }, @@ -451,13 +452,13 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Schedule Time".tr, + "Schedule Time".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), ), const SizedBox(height: 5), Text( - "${'Your preferred time'.tr} ${controller.deliveryType.value == "schedule" ? Constant.timestampToDateTime(Timestamp.fromDate(controller.scheduleDateTime.value)) : ""}", + "${'Your preferred time'.tr()} ${controller.deliveryType.value == "schedule" ? Constant.timestampToDateTime(Timestamp.fromDate(controller.scheduleDateTime.value)) : ""}", textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), ), @@ -466,7 +467,7 @@ class CartScreen extends StatelessWidget { ), Radio( value: controller.deliveryType.value, - groupValue: "schedule".tr, + groupValue: "schedule".tr(), activeColor: AppThemeData.primary300, onChanged: (value) { controller.deliveryType.value = "schedule"; @@ -477,7 +478,7 @@ class CartScreen extends StatelessWidget { }, minDateTime: controller.scheduleDateTime.value, displaySubmitButton: true, - pickerTitle: Text('Schedule Time'.tr), + pickerTitle: Text('Schedule Time'.tr()), buttonSingleColor: AppThemeData.primary300, ).show(context); }, @@ -497,7 +498,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Offers & Benefits".tr, + "Offers & Benefits".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -520,7 +521,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Apply Coupons".tr, + "Apply Coupons".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -542,7 +543,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Bill Details".tr, + "Bill Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -563,7 +564,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Item totals".tr, + "Item totals".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -583,14 +584,14 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Delivery Fee".tr, + "Delivery Fee".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), ), (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) ? Text( - 'Free Delivery'.tr, + 'Free Delivery'.tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: AppThemeData.success400, fontSize: 16), ) @@ -609,7 +610,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Coupon Discount".tr, + "Coupon Discount".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -630,7 +631,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Special Discount".tr, + "Special Discount".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -656,7 +657,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Delivery Tips".tr, + "Delivery Tips".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -668,7 +669,7 @@ class CartScreen extends StatelessWidget { controller.calculatePrice(); }, child: Text( - "Remove".tr, + "Remove".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), @@ -728,7 +729,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "To Pay".tr, + "To Pay".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -756,7 +757,7 @@ class CartScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Thanks with a tip!".tr, + "Thanks with a tip!".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -777,7 +778,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Around the clock, our delivery partners make it happen. Show gratitude with a tip..".tr, + "Around the clock, our delivery partners make it happen. Show gratitude with a tip..".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), ), @@ -927,7 +928,7 @@ class CartScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 10), child: Center( child: Text( - 'Other'.tr, + 'Other'.tr(), style: TextStyle( color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 14, @@ -952,7 +953,7 @@ class CartScreen extends StatelessWidget { const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column(children: [TextFieldWidget(title: 'Remarks'.tr, controller: controller.reMarkController.value, hintText: 'Write remarks for the store'.tr, maxLine: 4)]), + child: Column(children: [TextFieldWidget(title: 'Remarks'.tr(), controller: controller.reMarkController.value, hintText: 'Write remarks for the store'.tr(), maxLine: 4)]), ), ], ), @@ -973,14 +974,14 @@ class CartScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 8), - child: Text("Cashback Offer".tr, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 13)), + child: Text("Cashback Offer".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 13)), ), Text( - "${"Cashback Name :".tr} ${controller.bestCashback.value.title ?? ''}", + "${"Cashback Name :".tr()} ${controller.bestCashback.value.title ?? ''}", style: TextStyle(color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontSize: 13), ), Text( - "${"You will get".tr} ${Constant.amountShow(amount: controller.bestCashback.value.cashbackValue?.toStringAsFixed(2))} ${"cashback after completing the order.".tr}", + "${"You will get".tr()} ${Constant.amountShow(amount: controller.bestCashback.value.cashbackValue?.toStringAsFixed(2))} ${"cashback after completing the order.".tr()}", style: TextStyle(color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontSize: 13), ), ], @@ -1034,7 +1035,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Pay Via".tr, + "Pay Via".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontSize: 12), ), @@ -1060,7 +1061,7 @@ class CartScreen extends StatelessWidget { : isDark ? AppThemeData.grey800 : AppThemeData.grey100, - title: "Pay Now".tr, + title: "Pay Now".tr(), height: 5, color: controller.selectedPaymentMethod.value != '' @@ -1071,11 +1072,11 @@ class CartScreen extends StatelessWidget { fontSizes: 16, onPress: () async { if ((controller.couponAmount.value >= 1) && (controller.couponAmount.value > controller.totalAmount.value)) { - ShowToastDialog.showToast("The total price must be greater than or equal to the coupon discount value for the code to apply. Please review your cart total.".tr); + ShowToastDialog.showToast("The total price must be greater than or equal to the coupon discount value for the code to apply. Please review your cart total.".tr()); return; } if ((controller.specialDiscountAmount.value >= 1) && (controller.specialDiscountAmount.value > controller.totalAmount.value)) { - ShowToastDialog.showToast("The total price must be greater than or equal to the special discount value for the code to apply. Please review your cart total.".tr); + ShowToastDialog.showToast("The total price must be greater than or equal to the special discount value for the code to apply. Please review your cart total.".tr()); return; } if (controller.isOrderPlaced.value == false) { @@ -1109,7 +1110,7 @@ class CartScreen extends StatelessWidget { ) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); @@ -1117,7 +1118,7 @@ class CartScreen extends StatelessWidget { }); } else { controller.isOrderPlaced.value = false; - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast("Please select payment method".tr()); } controller.isOrderPlaced.value = false; } @@ -1162,16 +1163,16 @@ class CartScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ TextFieldWidget( - title: 'Tips Amount'.tr, + title: 'Tips Amount'.tr(), controller: controller.tipsController.value, textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), textInputAction: TextInputAction.done, inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], prefix: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - child: Text(Constant.currencyModel!.symbol.tr, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 18)), + child: Text(Constant.currencyModel!.symbol.tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 18)), ), - hintText: 'Enter Tips Amount'.tr, + hintText: 'Enter Tips Amount'.tr(), ), SizedBox(height: 10), Row( @@ -1179,7 +1180,7 @@ class CartScreen extends StatelessWidget { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "Cancel".tr, + title: "Cancel".tr(), color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, textColor: isDark ? AppThemeData.grey50 : AppThemeData.grey900, onPress: () async { @@ -1191,12 +1192,12 @@ class CartScreen extends StatelessWidget { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "Add".tr, + title: "Add".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.tipsController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter tips Amount".tr); + ShowToastDialog.showToast("Please enter tips Amount".tr()); } else { controller.deliveryTips.value = double.parse(controller.tipsController.value.text); controller.calculatePrice(); diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart index fec098c..812e5df 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; @@ -27,20 +28,20 @@ class CouponListScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Coupon Code".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Coupon Code".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), bottom: PreferredSize( preferredSize: const Size.fromHeight(55), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: TextFieldWidget( - hintText: 'Enter coupon code'.tr, + hintText: 'Enter coupon code'.tr(), controller: controller.couponCodeController.value, suffix: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), child: InkWell( onTap: () { if (controller.couponCodeController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter coupon code".tr); + ShowToastDialog.showToast("Please enter coupon code".tr()); return; } CouponModel? matchedCoupon = controller.couponList.firstWhereOrNull((coupon) => coupon.code!.toLowerCase() == controller.couponCodeController.value.text.toLowerCase()); @@ -52,14 +53,14 @@ class CouponListScreen extends StatelessWidget { controller.calculatePrice(); Get.back(); } else { - ShowToastDialog.showToast("Coupon code not applied".tr); + ShowToastDialog.showToast("Coupon code not applied".tr()); } } else { - ShowToastDialog.showToast("Invalid Coupon".tr); + ShowToastDialog.showToast("Invalid Coupon".tr()); } }, child: Text( - "Apply".tr, + "Apply".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), @@ -93,7 +94,7 @@ class CouponListScreen extends StatelessWidget { child: RotatedBox( quarterTurns: -1, child: Text( - "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", + "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), ), @@ -132,11 +133,11 @@ class CouponListScreen extends StatelessWidget { controller.calculatePrice(); Get.back(); } else { - ShowToastDialog.showToast("Coupon code not applied".tr); + ShowToastDialog.showToast("Coupon code not applied".tr()); } }, child: Text( - "Tap To Apply".tr, + "Tap To Apply".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart index 7538ca7..07796a8 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart @@ -6,6 +6,7 @@ import 'package:customer/models/cart_product_model.dart'; import 'package:customer/screen_ui/ecommarce/dash_board_e_commerce_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -38,12 +39,12 @@ class OrderPlacingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Placed".tr, + "Order Placed".tr(), textAlign: TextAlign.start, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 34, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), ), Text( - "Hang tight — your items are being delivered quickly and safely!".tr, + "Hang tight — your items are being delivered quickly and safely!".tr(), textAlign: TextAlign.start, style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), @@ -63,7 +64,7 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - "Order ID".tr, + "Order ID".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), ), @@ -92,12 +93,12 @@ class OrderPlacingScreen extends StatelessWidget { Center(child: Image.asset("assets/images/ic_timer.gif", height: 140)), const SizedBox(height: 20), Text( - "Placing your order".tr, + "Placing your order".tr(), textAlign: TextAlign.start, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 34, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), ), Text( - "Take a moment to review your order before proceeding to checkout.".tr, + "Take a moment to review your order before proceeding to checkout.".tr(), textAlign: TextAlign.start, style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), @@ -117,7 +118,7 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - "Delivery Address".tr, + "Delivery Address".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), ), @@ -150,7 +151,7 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - "Order Summary".tr, + "Order Summary".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), ), @@ -167,12 +168,12 @@ class OrderPlacingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${cartProductModel.quantity} x".tr, + "${cartProductModel.quantity} x".tr(), textAlign: TextAlign.start, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), Text( - "${cartProductModel.name}".tr, + "${cartProductModel.name}".tr(), textAlign: TextAlign.start, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), @@ -196,7 +197,7 @@ class OrderPlacingScreen extends StatelessWidget { controller.isPlacing.value ? RoundedButtonFill( borderRadius: 10.r, - title: "Track Order".tr, + title: "Track Order".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -215,7 +216,7 @@ class OrderPlacingScreen extends StatelessWidget { ) : RoundedButtonFill( borderRadius: 10.r, - title: "Track Order".tr, + title: "Track Order".tr(), height: 5.5, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, textColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart index e4b4d2f..ed41845 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart @@ -2,6 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cart_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -26,7 +27,7 @@ class SelectPaymentScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Payment Option".tr, + "Payment Option".tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -42,7 +43,7 @@ class SelectPaymentScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Preferred Payment".tr, + "Preferred Payment".tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -92,7 +93,7 @@ class SelectPaymentScreen extends StatelessWidget { height: 10, ), Text( - "Other Payment Options".tr, + "Other Payment Options".tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -180,7 +181,7 @@ class SelectPaymentScreen extends StatelessWidget { padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( borderRadius: 10.r, - title: "${'Pay Now'.tr} | ${Constant.amountShow(amount: controller.totalAmount.value.toString())}".tr, + title: "${'Pay Now'.tr()} | ${Constant.amountShow(amount: controller.totalAmount.value.toString())}".tr(), height: 5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart index 33d9863..92801a3 100644 --- a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart +++ b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart @@ -1,6 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cashback_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -20,7 +21,7 @@ class CashbackOffersListScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - title: Text("Cashback Offers".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Cashback Offers".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, ), body: @@ -59,11 +60,11 @@ class CashbackOffersListScreen extends StatelessWidget { ), const SizedBox(height: 6), Text( - "${"Min spent".tr} ${Constant.amountShow(amount: "${controller.cashbackList[index].minimumPurchaseAmount ?? 0.0}")} | ${"Valid till".tr} ${Constant.timestampToDateTime2(controller.cashbackList[index].endDate!)}", + "${"Min spent".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].minimumPurchaseAmount ?? 0.0}")} | ${"Valid till".tr()} ${Constant.timestampToDateTime2(controller.cashbackList[index].endDate!)}", style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontSize: 14), ), Text( - "${"Maximum cashback up to".tr} ${Constant.amountShow(amount: "${controller.cashbackList[index].maximumDiscount ?? 0.0}")}", + "${"Maximum cashback up to".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].maximumDiscount ?? 0.0}")}", style: TextStyle(color: isDark ? AppThemeData.primary200 : AppThemeData.primary300, fontFamily: AppThemeData.regular, fontSize: 14), ), ], diff --git a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart index 495b9a5..bdbd0b0 100644 --- a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart +++ b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/controllers/change_language_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/preferences.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; @@ -30,11 +31,11 @@ class ChangeLanguageScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Change Language".tr, + "Change Language".tr(), style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), Text( - "Select your preferred language for a personalized app experience.".tr, + "Select your preferred language for a personalized app experience.".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), const SizedBox(height: 20), diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart index d16d944..0a9f324 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart @@ -5,6 +5,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/chat_controller.dart'; import 'package:customer/models/conversation_model.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -55,7 +56,7 @@ class ChatScreen extends StatelessWidget { ConversationModel inboxModel = ConversationModel.fromJson(documentSnapshots[index].data() as Map); return chatItemView(isDark, inboxModel.senderId == FireStoreUtils.getCurrentUid(), inboxModel); }, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance .collection( @@ -103,7 +104,7 @@ class ChatScreen extends StatelessWidget { contentPadding: const EdgeInsets.only(top: 3, left: 10), focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, - hintText: 'Type message here....'.tr, + hintText: 'Type message here....'.tr(), ), onSubmitted: (value) async { if (controller.messageController.value.text.isNotEmpty) { @@ -245,7 +246,7 @@ class ChatScreen extends StatelessWidget { void onCameraClick(BuildContext context, ChatController controller) { final action = CupertinoActionSheet( - message: Text('Send Media'.tr, style: const TextStyle(fontSize: 15.0)), + message: Text('Send Media'.tr(), style: const TextStyle(fontSize: 15.0)), actions: [ CupertinoActionSheetAction( isDefaultAction: false, @@ -257,7 +258,7 @@ class ChatScreen extends StatelessWidget { controller.sendMessage('', url, '', 'image'); } }, - child: Text("Choose image from gallery".tr), + child: Text("Choose image from gallery".tr()), ), CupertinoActionSheetAction( isDefaultAction: false, @@ -271,7 +272,7 @@ class ChatScreen extends StatelessWidget { } } }, - child: Text("Choose video from gallery".tr), + child: Text("Choose video from gallery".tr()), ), CupertinoActionSheetAction( isDestructiveAction: false, @@ -283,7 +284,7 @@ class ChatScreen extends StatelessWidget { controller.sendMessage('', url, '', 'image'); } }, - child: Text("Take a picture".tr), + child: Text("Take a picture".tr()), ), // CupertinoActionSheetAction( // isDestructiveAction: false, @@ -295,11 +296,11 @@ class ChatScreen extends StatelessWidget { // controller.sendMessage('', videoContainer.videoUrl, videoContainer.thumbnailUrl, 'video'); // } // }, - // child: Text("Record video".tr), + // child: Text("Record video".tr()), // ) ], cancelButton: CupertinoActionSheetAction( - child: Text('Cancel'.tr), + child: Text('Cancel'.tr()), onPressed: () { Get.back(); }, diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart index 9572a40..4427f8d 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart @@ -5,6 +5,7 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -27,7 +28,7 @@ class DriverInboxScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Driver Inbox".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Driver Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: FirestorePagination( //item builder type is compulsory. @@ -37,7 +38,7 @@ class DriverInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); @@ -113,7 +114,7 @@ class DriverInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance.collection('chat_driver').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), //Change types customerId diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart index f7d6948..9f99581 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart @@ -8,6 +8,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dart'; import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -28,7 +29,7 @@ class RestaurantInboxScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Store Inbox".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Store Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: FirestorePagination( //item builder type is compulsory. @@ -38,7 +39,7 @@ class RestaurantInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); @@ -115,7 +116,7 @@ class RestaurantInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance.collection('chat_store').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), //Change types customerId diff --git a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart index 485f304..90c1480 100644 --- a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart @@ -1,6 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dash_board_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -40,17 +41,17 @@ class DashBoardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr, controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), + navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ], ), ); diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart index b08e3e9..8bb2ec2 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart @@ -1,6 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dine_in_booking_details_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -24,7 +25,7 @@ class DineInBookingDetails extends StatelessWidget { titleSpacing: 0, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( - "Dine in Bookings".tr, + "Dine in Bookings".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), ), ), @@ -43,11 +44,11 @@ class DineInBookingDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Order'.tr} ${Constant.orderId(orderId: controller.bookingModel.value.id.toString())}", + "${'Order'.tr()} ${Constant.orderId(orderId: controller.bookingModel.value.id.toString())}", style: TextStyle(fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), Text( - "${controller.bookingModel.value.totalGuest} ${'Peoples'.tr}", + "${controller.bookingModel.value.totalGuest} ${'Peoples'.tr()}", style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ], @@ -113,7 +114,7 @@ class DineInBookingDetails extends StatelessWidget { ); }, child: Text( - "View in Map".tr, + "View in Map".tr(), style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, @@ -133,7 +134,7 @@ class DineInBookingDetails extends StatelessWidget { } }, child: Text( - "Call Now".tr, + "Call Now".tr(), style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, @@ -153,7 +154,7 @@ class DineInBookingDetails extends StatelessWidget { ), const SizedBox(height: 20), Text( - "Booking Details".tr, + "Booking Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -169,7 +170,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Name".tr, + "Name".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ), @@ -188,7 +189,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Phone number".tr, + "Phone number".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ), @@ -207,7 +208,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Date and Time".tr, + "Date and Time".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ), @@ -226,7 +227,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Guest".tr, + "Guest".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ), @@ -245,7 +246,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Discount".tr, + "Discount".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ), diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart index af8a5a3..1bbeb1d 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/controllers/dine_in_booking_controller.dart'; import 'package:customer/models/dine_in_booking_model.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -27,7 +28,7 @@ class DineInBookingScreen extends StatelessWidget { titleSpacing: 0, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( - "Dine in Bookings".tr, + "Dine in Bookings".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), ), ), @@ -57,7 +58,7 @@ class DineInBookingScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Text( - "Upcoming".tr, + "Upcoming".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -88,7 +89,7 @@ class DineInBookingScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Text( - "History".tr, + "History".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -118,7 +119,7 @@ class DineInBookingScreen extends StatelessWidget { child: controller.isFeature.value ? controller.featureList.isEmpty - ? Constant.showEmptyView(message: "Upcoming Booking not found.".tr) + ? Constant.showEmptyView(message: "Upcoming Booking not found.".tr()) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, @@ -130,7 +131,7 @@ class DineInBookingScreen extends StatelessWidget { }, ) : controller.historyList.isEmpty - ? Constant.showEmptyView(message: "History not found.".tr) + ? Constant.showEmptyView(message: "History not found.".tr()) : ListView.builder( itemCount: controller.historyList.length, shrinkWrap: true, @@ -208,7 +209,7 @@ class DineInBookingScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: Text("Name".tr, style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400))), + Expanded(child: Text("Name".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400))), Expanded( child: Text( "${orderModel.guestFirstName} ${orderModel.guestLastName}", @@ -223,7 +224,7 @@ class DineInBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( - child: Text("Guest Number".tr, style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400)), + child: Text("Guest Number".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400)), ), Expanded( child: Text( diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart index fb2102c..96da285 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart @@ -5,6 +5,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -27,7 +28,7 @@ class BookTableScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - title: Text("Book Table".tr, style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text("Book Table".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -43,7 +44,7 @@ class BookTableScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Numbers of Guests".tr, + "Numbers of Guests".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), ), ), @@ -105,7 +106,7 @@ class BookTableScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "When are you visiting?".tr, + "When are you visiting?".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), SizedBox( @@ -151,9 +152,9 @@ class BookTableScreen extends StatelessWidget { children: [ Text( Constant.calculateDifference(controller.dateList[index].date.toDate()) == 0 - ? "Today".tr + ? "Today".tr() : Constant.calculateDifference(controller.dateList[index].date.toDate()) == 1 - ? "Tomorrow".tr + ? "Tomorrow".tr() : DateFormat('EEE').format(controller.dateList[index].date.toDate()), style: TextStyle( fontSize: 12, @@ -185,7 +186,7 @@ class BookTableScreen extends StatelessWidget { child: Center( child: RoundedButtonFill( borderRadius: 10.r, - title: "${controller.dateList[index].discountPer}%".tr, + title: "${controller.dateList[index].discountPer}%".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, width: 12, @@ -201,7 +202,7 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Select time slot and scroll to see offers".tr, + "Select time slot and scroll to see offers".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), @@ -256,7 +257,7 @@ class BookTableScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Special Occasion".tr, + "Special Occasion".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), ), @@ -264,7 +265,7 @@ class BookTableScreen extends StatelessWidget { onTap: () { controller.selectedOccasion.value = ""; }, - child: Text("Clear".tr, style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), + child: Text("Clear".tr(), style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), ), ], ), @@ -282,7 +283,7 @@ class BookTableScreen extends StatelessWidget { visualDensity: const VisualDensity(horizontal: 0, vertical: -4), dense: true, title: Text( - //'${controller.occasionList[i]}'.tr, + //'${controller.occasionList[i]}'.tr(), controller.getLocalizedOccasion(controller.occasionList[i]), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), ), @@ -301,7 +302,7 @@ class BookTableScreen extends StatelessWidget { visualDensity: const VisualDensity(horizontal: 0, vertical: -4), dense: true, title: Text( - 'Is this your first visit?'.tr, + 'Is this your first visit?'.tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), ), leading: Checkbox( @@ -319,7 +320,7 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Personal Details".tr, + "Personal Details".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), @@ -358,11 +359,11 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Additional Requests".tr, + "Additional Requests".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), - TextFieldWidget(controller: controller.additionRequestController.value, hintText: 'Add message here....'.tr, maxLine: 5), + TextFieldWidget(controller: controller.additionRequestController.value, hintText: 'Add message here....'.tr(), maxLine: 5), const SizedBox(height: 20), ], ), @@ -375,7 +376,7 @@ class BookTableScreen extends StatelessWidget { padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( borderRadius: 10.r, - title: "Book Now".tr, + title: "Book Now".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart index ca857d2..19c048e 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -215,7 +216,7 @@ class DineInDetailsScreen extends StatelessWidget { Get.to(const ReviewListScreen(), arguments: {"vendorModel": controller.vendorModel.value}); }, child: Text( - "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr}", + "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", style: TextStyle(decoration: TextDecoration.underline, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular), ), ), @@ -226,7 +227,7 @@ class DineInDetailsScreen extends StatelessWidget { Row( children: [ Text( - controller.isOpen.value ? "Open".tr : "Close".tr, + controller.isOpen.value ? "Open".tr() : "Close".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -243,7 +244,7 @@ class DineInDetailsScreen extends StatelessWidget { timeShowBottomSheet(context, controller); }, child: Text( - "View Timings".tr, + "View Timings".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -259,7 +260,7 @@ class DineInDetailsScreen extends StatelessWidget { ), Padding(padding: const EdgeInsets.symmetric(horizontal: 10), child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500)), Text( - "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr}".tr, + "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr()}".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -277,7 +278,7 @@ class DineInDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Also applicable on food delivery".tr, + "Also applicable on food delivery".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -292,7 +293,7 @@ class DineInDetailsScreen extends StatelessWidget { InkWell( onTap: () { if (Constant.userModel == null) { - ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr); + ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr()); } else { Get.to(const BookTableScreen(), arguments: {"vendorModel": controller.vendorModel.value}); } @@ -326,7 +327,7 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Table Booking".tr, + "Table Booking".tr(), style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -335,7 +336,7 @@ class DineInDetailsScreen extends StatelessWidget { ), ), Text( - "Quick Conformations".tr, + "Quick Conformations".tr(), style: TextStyle( fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, @@ -386,7 +387,7 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Available food delivery".tr, + "Available food delivery".tr(), style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -395,7 +396,7 @@ class DineInDetailsScreen extends StatelessWidget { ), ), Text( - "in 30-45 mins.".tr, + "in 30-45 mins.".tr(), style: TextStyle( fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, @@ -421,7 +422,7 @@ class DineInDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Menu".tr, + "Menu".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -466,7 +467,7 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Location, Timing & Costs".tr, + "Location, Timing & Costs".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -508,7 +509,7 @@ class DineInDetailsScreen extends StatelessWidget { ); }, child: Text( - "View on Map".tr, + "View on Map".tr(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -533,7 +534,7 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Timing".tr, + "Timing".tr(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -545,7 +546,7 @@ class DineInDetailsScreen extends StatelessWidget { InkWell( onTap: () {}, child: Text( - "${controller.vendorModel.value.openDineTime == '' ? "10:00 AM" : controller.vendorModel.value.openDineTime.toString()} ${"To".tr} ${controller.vendorModel.value.closeDineTime == '' ? "10:00 PM" : controller.vendorModel.value.closeDineTime.toString()}", + "${controller.vendorModel.value.openDineTime == '' ? "10:00 AM" : controller.vendorModel.value.openDineTime.toString()} ${"To".tr()} ${controller.vendorModel.value.closeDineTime == '' ? "10:00 PM" : controller.vendorModel.value.closeDineTime.toString()}", textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -573,7 +574,7 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Cost for Two".tr, + "Cost for Two".tr(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -583,7 +584,7 @@ class DineInDetailsScreen extends StatelessWidget { ), ), Text( - "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost ?? "0.0")} ${'(approx)'.tr}", + "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost ?? "0.0")} ${'(approx)'.tr()}", textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -603,7 +604,7 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Cuisines".tr, + "Cuisines".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index cb30299..11c9eeb 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -10,6 +10,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -80,7 +81,7 @@ class DineInScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Dine-In Reservations".tr, + "Dine-In Reservations".tr(), style: TextStyle( fontSize: 24, fontFamily: AppThemeData.semiBold, @@ -93,7 +94,7 @@ class DineInScreen extends StatelessWidget { ), Text( "Book a table at your favorite restaurant and enjoy a delightful dining experience." - .tr, + .tr(), textAlign: TextAlign.center, style: TextStyle( fontSize: 14, @@ -131,7 +132,7 @@ class DineInScreen extends StatelessWidget { ), const SizedBox(height: 12), Text( - "No Store Found in Your Area".tr, + "No Store Found in Your Area".tr(), style: TextStyle( color: isDark @@ -144,7 +145,7 @@ class DineInScreen extends StatelessWidget { const SizedBox(height: 5), Text( "Currently, there are no available store in your zone. Try changing your location to find nearby options." - .tr, + .tr(), textAlign: TextAlign.center, style: TextStyle( color: @@ -158,7 +159,7 @@ class DineInScreen extends StatelessWidget { const SizedBox(height: 20), RoundedButtonFill( borderRadius: 10.r, - title: "Change Zone".tr, + title: "Change Zone".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -182,7 +183,7 @@ class DineInScreen extends StatelessWidget { const SizedBox(height: 10), titleView( isDark, - "Explore the Categories".tr, + "Explore the Categories".tr(), () { Get.to(const ViewAllCategoryDineInScreen()); }, @@ -218,7 +219,7 @@ class DineInScreen extends StatelessWidget { children: [ Expanded( child: Text( - "New Arrivals".tr, + "New Arrivals".tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -244,7 +245,7 @@ class DineInScreen extends StatelessWidget { ); }, child: Text( - "View all".tr, + "View all".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: @@ -316,7 +317,7 @@ class DineInScreen extends StatelessWidget { vertical: 10, ), child: Text( - "Popular Stores".tr, + "Popular Stores".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: @@ -357,7 +358,7 @@ class DineInScreen extends StatelessWidget { vertical: 10, ), child: Text( - "All Stores".tr, + "All Stores".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: @@ -425,7 +426,7 @@ class DineInScreen extends StatelessWidget { onPress!(); }, child: Text( - "View all".tr, + "View all".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1292,7 +1293,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -1304,7 +1305,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -1324,7 +1325,7 @@ class BannerBottomView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr); + ShowToastDialog.showToast("Could not launch".tr()); } } }, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart index 6d27058..9d4054f 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/controllers/view_all_category_controller.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -25,7 +26,7 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Categories".tr, + "Categories".tr(), style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, diff --git a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart index 860ed95..33fa7e6 100644 --- a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -32,11 +33,11 @@ class EditProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Profile Information".tr, + "Profile Information".tr(), style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), Text( - "View and update your personal details, contact information, and preferences.".tr, + "View and update your personal details, contact information, and preferences.".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), const SizedBox(height: 20), @@ -79,13 +80,13 @@ class EditProfileScreen extends StatelessWidget { const SizedBox(height: 20), Row( children: [ - Expanded(child: TextFieldWidget(title: 'First Name'.tr, controller: controller.firstNameController.value, hintText: 'First Name'.tr)), + Expanded(child: TextFieldWidget(title: 'First Name'.tr(), controller: controller.firstNameController.value, hintText: 'First Name'.tr())), const SizedBox(width: 10), - Expanded(child: TextFieldWidget(title: 'Last Name'.tr, controller: controller.lastNameController.value, hintText: 'Last Name'.tr)), + Expanded(child: TextFieldWidget(title: 'Last Name'.tr(), controller: controller.lastNameController.value, hintText: 'Last Name'.tr())), ], ), - TextFieldWidget(title: 'Email'.tr, textInputType: TextInputType.emailAddress, controller: controller.emailController.value, hintText: 'Email'.tr, enable: false), - TextFieldWidget(title: 'Phone Number'.tr, textInputType: TextInputType.emailAddress, controller: controller.phoneNumberController.value, hintText: 'Phone Number'.tr, enable: false), + TextFieldWidget(title: 'Email'.tr(), textInputType: TextInputType.emailAddress, controller: controller.emailController.value, hintText: 'Email'.tr(), enable: false), + TextFieldWidget(title: 'Phone Number'.tr(), textInputType: TextInputType.emailAddress, controller: controller.phoneNumberController.value, hintText: 'Phone Number'.tr(), enable: false), ], ), ), @@ -97,7 +98,7 @@ class EditProfileScreen extends StatelessWidget { padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( borderRadius: 10.r, - title: "Save Details".tr, + title: "Save Details".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -124,7 +125,7 @@ class EditProfileScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(top: 15), child: Text("please select".tr, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600))), + Padding(padding: const EdgeInsets.only(top: 15), child: Text("please select".tr(), style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600))), Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -135,7 +136,7 @@ class EditProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ IconButton(onPressed: () => controller.pickFile(source: ImageSource.camera), icon: const Icon(Icons.camera_alt, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("camera".tr, style: const TextStyle())), + Padding(padding: const EdgeInsets.only(top: 3), child: Text("camera".tr(), style: const TextStyle())), ], ), ), @@ -146,7 +147,7 @@ class EditProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ IconButton(onPressed: () => controller.pickFile(source: ImageSource.gallery), icon: const Icon(Icons.photo_library_sharp, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("gallery".tr, style: const TextStyle())), + Padding(padding: const EdgeInsets.only(top: 3), child: Text("gallery".tr(), style: const TextStyle())), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart index 47a2d40..baa570c 100644 --- a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart +++ b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart @@ -7,6 +7,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; @@ -43,7 +44,7 @@ class FavouriteScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Your Favourites, All in One Place".tr, + "Your Favourites, All in One Place".tr(), style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), ), @@ -64,18 +65,18 @@ class FavouriteScreen extends StatelessWidget { Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), Text( - "Please Log In to Continue".tr, + "Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold), ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr, + "You’re not logged in. Please sign in to access your account and explore all features.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr, + title: "Log in".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -113,7 +114,7 @@ class FavouriteScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Text( - "Favourite Store".tr, + "Favourite Store".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), @@ -134,7 +135,7 @@ class FavouriteScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Text( - "Favourite Item".tr, + "Favourite Item".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -164,7 +165,7 @@ class FavouriteScreen extends StatelessWidget { child: controller.favouriteRestaurant.value ? controller.favouriteVendorList.isEmpty - ? Constant.showEmptyView(message: "Favourite Store not found.".tr) + ? Constant.showEmptyView(message: "Favourite Store not found.".tr()) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, @@ -260,7 +261,7 @@ class FavouriteScreen extends StatelessWidget { SvgPicture.asset("assets/icons/ic_free_delivery.svg"), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle( fontSize: 14, color: AppThemeData.success600, @@ -370,7 +371,7 @@ class FavouriteScreen extends StatelessWidget { }, ) : controller.favouriteFoodList.isEmpty - ? Constant.showEmptyView(message: "Favourite Item not found.".tr) + ? Constant.showEmptyView(message: "Favourite Item not found.".tr()) : ListView.builder( itemCount: controller.favouriteFoodList.length, shrinkWrap: true, @@ -384,7 +385,7 @@ class FavouriteScreen extends StatelessWidget { return Constant.loader(); } else { if (snapshot.hasError) { - return Center(child: Text('${"error".tr}: ${snapshot.error}')); + return Center(child: Text('${"error".tr()}: ${snapshot.error}')); } else if (snapshot.data == null) { return const SizedBox(); } else { @@ -427,7 +428,7 @@ class FavouriteScreen extends StatelessWidget { : SvgPicture.asset("assets/icons/ic_veg.svg"), const SizedBox(width: 5), Text( - productModel.nonveg == true ? "Non Veg.".tr : "Pure veg.".tr, + productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), style: TextStyle( color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, fontFamily: AppThemeData.semiBold, diff --git a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart index 52fa366..e70da70 100644 --- a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart +++ b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart @@ -2,6 +2,7 @@ import 'package:customer/controllers/forgot_password_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -26,13 +27,13 @@ class ForgotPasswordScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Forgot Password".tr, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 22, fontFamily: AppThemeData.semiBold)), - Text("No worries!! We’ll send you reset instructions".tr, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.regular)), + Text("Forgot Password".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("No worries!! We’ll send you reset instructions".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.regular)), const SizedBox(height: 32), TextFieldWidget( - title: 'Email Address'.tr, + title: 'Email Address'.tr(), controller: controller.emailEditingController.value, - hintText: 'Enter email address'.tr, + hintText: 'Enter email address'.tr(), prefix: Padding( padding: const EdgeInsets.all(12), child: SvgPicture.asset("assets/icons/ic_mail.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn)), @@ -40,12 +41,12 @@ class ForgotPasswordScreen extends StatelessWidget { ), const SizedBox(height: 32), RoundedButtonFill( - title: "Forgot Password".tr, + title: "Forgot Password".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.emailEditingController.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter valid email".tr); + ShowToastDialog.showToast("Please enter valid email".tr()); } else { controller.forgotPassword(); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart index 685fc0b..d4f2197 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart @@ -8,6 +8,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -32,7 +33,7 @@ class GiftCardScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Customize Gift Card".tr, + "Customize Gift Card".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -97,16 +98,16 @@ class GiftCardScreen extends StatelessWidget { ), const SizedBox(height: 20), TextFieldWidget( - title: 'Choose an amount'.tr, + title: 'Choose an amount'.tr(), controller: controller.amountController.value, - hintText: 'Enter gift card amount'.tr, + hintText: 'Enter gift card amount'.tr(), textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), textInputAction: TextInputAction.done, inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], prefix: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), child: Text( - Constant.currencyModel!.symbol.tr, + Constant.currencyModel!.symbol.tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 18), ), ), @@ -159,7 +160,7 @@ class GiftCardScreen extends StatelessWidget { ), ), const SizedBox(height: 40), - TextFieldWidget(title: 'Add Message (Optional)'.tr, controller: controller.messageController.value, hintText: 'Add message here....'.tr, maxLine: 6), + TextFieldWidget(title: 'Add Message (Optional)'.tr(), controller: controller.messageController.value, hintText: 'Add message here....'.tr(), maxLine: 6), ], ), ), @@ -170,7 +171,7 @@ class GiftCardScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -178,12 +179,12 @@ class GiftCardScreen extends StatelessWidget { onPress: () async { if (controller.amountController.value.text.isNotEmpty) { if (Constant.userModel == null) { - ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr); + ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr()); } else { giftCardBottomSheet(context, controller); } } else { - ShowToastDialog.showToast("Please enter Amount".tr); + ShowToastDialog.showToast("Please enter Amount".tr()); } }, ), @@ -229,7 +230,7 @@ class GiftCardScreen extends StatelessWidget { padding: const EdgeInsets.all(8), decoration: ShapeDecoration(color: AppThemeData.ecommerce50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), child: Text( - 'Complete payment and share this e-gift card with loved ones using any app'.tr, + 'Complete payment and share this e-gift card with loved ones using any app'.tr(), style: TextStyle(color: AppThemeData.ecommerce300, fontSize: 14, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), ), ), @@ -238,7 +239,7 @@ class GiftCardScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Bill Details".tr, + "Bill Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -255,7 +256,7 @@ class GiftCardScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Sub Total".tr, + "Sub Total".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -273,7 +274,7 @@ class GiftCardScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Grand Total".tr, + "Grand Total".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -294,7 +295,7 @@ class GiftCardScreen extends StatelessWidget { const SizedBox(height: 20), Center( child: Text( - "${'Gift Card expire'.tr} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr}".tr, + "${'Gift Card expire'.tr()} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr()}".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), ), @@ -309,7 +310,7 @@ class GiftCardScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "${'Pay'.tr} ${Constant.amountShow(amount: controller.amountController.value.text)}", + title: "${'Pay'.tr()} ${Constant.amountShow(amount: controller.amountController.value.text)}", height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart index 5a34585..1322201 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart @@ -2,6 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/history_gift_card_controller.dart'; import 'package:customer/models/gift_cards_order_model.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; @@ -26,7 +27,7 @@ class HistoryGiftCard extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16), child: controller.giftCardsOrderList.isEmpty - ? Constant.showEmptyView(message: "Purchased Gift card not found".tr) + ? Constant.showEmptyView(message: "Purchased Gift card not found".tr()) : ListView.builder( itemCount: controller.giftCardsOrderList.length, shrinkWrap: true, @@ -71,7 +72,7 @@ class HistoryGiftCard extends StatelessWidget { children: [ Expanded( child: Text( - "Gift Code".tr, + "Gift Code".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), ), @@ -91,7 +92,7 @@ class HistoryGiftCard extends StatelessWidget { children: [ Expanded( child: Text( - "Gift Pin".tr, + "Gift Pin".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), ), @@ -157,7 +158,7 @@ class HistoryGiftCard extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - 'Share'.tr, + 'Share'.tr(), style: TextStyle( color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 14, @@ -174,7 +175,7 @@ class HistoryGiftCard extends StatelessWidget { ), const Expanded(child: SizedBox()), Text( - giftCardOrderModel.redeem == true ? "Redeemed".tr : "Not Redeem".tr, + giftCardOrderModel.redeem == true ? "Redeemed".tr() : "Not Redeem".tr(), style: TextStyle( fontSize: 16, color: giftCardOrderModel.redeem == true ? AppThemeData.success400 : AppThemeData.danger300, diff --git a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart index a67bf7e..0096cda 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart @@ -7,6 +7,7 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -38,25 +39,25 @@ class RedeemGiftCardScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Redeem Gift Card".tr, + "Redeem Gift Card".tr(), style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), Text( - "Enter your gift card code to enjoy discounts and special offers on your orders.".tr, + "Enter your gift card code to enjoy discounts and special offers on your orders.".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), const SizedBox(height: 20), TextFieldWidget( - title: 'Gift Code'.tr, + title: 'Gift Code'.tr(), controller: controller.giftCodeController.value, - hintText: 'Enter gift code'.tr, + hintText: 'Enter gift code'.tr(), textInputType: TextInputType.number, prefix: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_gift_code.svg")), ), TextFieldWidget( - title: 'Gift Pin'.tr, + title: 'Gift Pin'.tr(), controller: controller.giftPinController.value, - hintText: 'Enter gift pin'.tr, + hintText: 'Enter gift pin'.tr(), textInputType: TextInputType.number, prefix: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_gift_pin.svg")), ), @@ -70,30 +71,30 @@ class RedeemGiftCardScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Redeem".tr, + title: "Redeem".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { if (controller.giftCodeController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Gift Code".tr); + ShowToastDialog.showToast("Please Enter Gift Code".tr()); } else if (controller.giftPinController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Gift Pin".tr); + ShowToastDialog.showToast("Please Enter Gift Pin".tr()); } else { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); await FireStoreUtils.checkRedeemCode(controller.giftCodeController.value.text.replaceAll(" ", "")).then((value) async { if (value != null) { GiftCardsOrderModel giftCodeModel = value; if (giftCodeModel.redeem == true) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Gift voucher already redeemed".tr); + ShowToastDialog.showToast("Gift voucher already redeemed".tr()); } else if (giftCodeModel.giftPin != controller.giftPinController.value.text) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Gift Pin Invalid".tr); + ShowToastDialog.showToast("Gift Pin Invalid".tr()); } else if (giftCodeModel.expireDate!.toDate().isBefore(DateTime.now())) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Gift Voucher expire".tr); + ShowToastDialog.showToast("Gift Voucher expire".tr()); } else { giftCodeModel.redeem = true; @@ -120,7 +121,7 @@ class RedeemGiftCardScreen extends StatelessWidget { DashBoardController controller = Get.put(DashBoardController()); controller.selectedIndex.value = 2; } - ShowToastDialog.showToast("Voucher redeem successfully".tr); + ShowToastDialog.showToast("Voucher redeem successfully".tr()); }); }); } @@ -128,7 +129,7 @@ class RedeemGiftCardScreen extends StatelessWidget { } } else { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Invalid Gift Code".tr); + ShowToastDialog.showToast("Invalid Gift Code".tr()); } }); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart index bbcf508..9297be8 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/payment/createRazorPayOrderModel.dart'; import 'package:customer/payment/rozorpayConroller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; @@ -26,7 +27,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Payment Option".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Payment Option".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -35,7 +36,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Preferred Payment".tr, + "Preferred Payment".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -64,7 +65,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Other Payment Options".tr, + "Other Payment Options".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -114,7 +115,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Pay Now".tr, + title: "Pay Now".tr(), height: 5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -144,14 +145,14 @@ class SelectGiftPaymentScreen extends StatelessWidget { RazorPayController().createOrderRazorPay(amount: double.parse(controller.amountController.value.text), razorpayModel: controller.razorPayModel.value).then((value) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: controller.amountController.value.text, orderId: result.id); } }); } else { - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast("Please select payment method".tr()); } }, ), diff --git a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart index a311418..80ffc28 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/controllers/category_restaurant_controller.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -26,7 +27,7 @@ class CategoryRestaurantScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.allNearestRestaurant.isEmpty - ? Constant.showEmptyView(message: "No Restaurant found".tr) + ? Constant.showEmptyView(message: "No Restaurant found".tr()) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: ListView.builder( @@ -87,7 +88,7 @@ class CategoryRestaurantScreen extends StatelessWidget { SvgPicture.asset("assets/icons/ic_free_delivery.svg"), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle(fontSize: 14, color: AppThemeData.success600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart index 52c3082..05059fb 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -77,7 +78,7 @@ class DiscountRestaurantListScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Text( - "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".toUpperCase().tr : " off".toUpperCase().tr}", + "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".toUpperCase().tr() : " off".toUpperCase().tr()}", textAlign: TextAlign.start, maxLines: 1, style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index 6292219..f8c9af2 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -22,6 +22,7 @@ import 'package:customer/utils/preferences.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -92,7 +93,7 @@ class HomeScreen extends StatelessWidget { ), const SizedBox(height: 12), Text( - "No Store Found in Your Area".tr, + "No Store Found in Your Area".tr(), style: TextStyle( color: isDark @@ -105,7 +106,7 @@ class HomeScreen extends StatelessWidget { const SizedBox(height: 5), Text( "Currently, there are no available store in your zone. Try changing your location to find nearby options." - .tr, + .tr(), textAlign: TextAlign.center, style: TextStyle( color: @@ -118,7 +119,7 @@ class HomeScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Change Zone".tr, + title: "Change Zone".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -229,7 +230,7 @@ class HomeScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader( "Please wait..." - .tr, + .tr(), ); // ✅ declare it once here! @@ -516,7 +517,7 @@ class HomeScreen extends StatelessWidget { true ? 'Искать что угодно' : 'Search the store, item and more...' - .tr, + .tr(), controller: null, enable: false, backgroundColor: @@ -704,7 +705,7 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "New Arrivals".tr, + "New Arrivals".tr(), textAlign: TextAlign .start, @@ -739,7 +740,7 @@ class HomeScreen extends StatelessWidget { }); }, child: Text( - "View all".tr, + "View all".tr(), textAlign: TextAlign .center, @@ -821,7 +822,7 @@ class HomeScreen extends StatelessWidget { Expanded( child: Text( "Highlights for you" - .tr, + .tr(), textAlign: TextAlign .start, @@ -851,7 +852,7 @@ class HomeScreen extends StatelessWidget { }, child: Text( "View all" - .tr, + .tr(), textAlign: TextAlign .center, @@ -967,7 +968,7 @@ class HomeScreen extends StatelessWidget { ), child: Text( "Popular Stores" - .tr, + .tr(), textAlign: TextAlign .center, @@ -1020,7 +1021,7 @@ class HomeScreen extends StatelessWidget { vertical: 10, ), child: Text( - "All Stores".tr, + "All Stores".tr(), textAlign: TextAlign .center, @@ -1208,16 +1209,16 @@ class HomeScreen extends StatelessWidget { isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - value: controller.selectedOrderTypeValue.value.tr, + value: controller.selectedOrderTypeValue.value.tr(), icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr, 'TakeAway'.tr].map(( + ['Delivery'.tr(), 'TakeAway'.tr()].map(( String value, ) { return DropdownMenuItem( value: value, child: Text( - value.tr, + value.tr(), style: TextStyle( fontFamily: AppThemeData.semiBold, fontSize: 16, @@ -1242,12 +1243,12 @@ class HomeScreen extends StatelessWidget { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Alert".tr, + title: "Alert".tr(), descriptions: "Do you really want to change the delivery option? Your cart will be empty." - .tr, - positiveString: "Ok".tr, - negativeString: "Cancel".tr, + .tr(), + positiveString: "Ok".tr(), + negativeString: "Cancel".tr(), positiveClick: () async { await Preferences.setString( Preferences.foodDeliveryType, @@ -1287,7 +1288,7 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - name.tr, + name.tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.bold, @@ -1300,7 +1301,7 @@ class HomeScreen extends StatelessWidget { onPress!(); }, child: Text( - "View all".tr, + "View all".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1474,7 +1475,7 @@ class PopularRestaurant extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -1779,7 +1780,7 @@ class AllRestaurant extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -2076,7 +2077,7 @@ class NewArrival extends StatelessWidget { ), const SizedBox(width: 4), Text( - "Free Delivery".tr, + "Free Delivery".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2186,7 +2187,7 @@ class AdvertisementHomeCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById( model.vendorId!, ); @@ -2499,7 +2500,7 @@ class OfferView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Upto".tr, + "Upto".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2514,7 +2515,7 @@ class OfferView extends StatelessWidget { ), ), Text( - "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr : "off".tr}", + "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr() : "off".tr()}", textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2563,7 +2564,7 @@ class OfferView extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle( fontSize: 12, overflow: TextOverflow.ellipsis, @@ -2649,7 +2650,7 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -2661,7 +2662,7 @@ class BannerView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -2681,7 +2682,7 @@ class BannerView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr); + ShowToastDialog.showToast("Could not launch".tr()); } } }, @@ -2755,7 +2756,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -2767,7 +2768,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -2787,7 +2788,7 @@ class BannerBottomView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr); + ShowToastDialog.showToast("Could not launch".tr()); } } }, @@ -2971,7 +2972,7 @@ class StoryView extends StatelessWidget { if (snapshot.hasError) { return Center( child: Text( - '${"Error".tr}: ${snapshot.error}', + '${"Error".tr()}: ${snapshot.error}', ), ); } else if (snapshot.data == null) { @@ -3399,7 +3400,7 @@ class MapView extends StatelessWidget { ), Text( "Free Delivery" - .tr, + .tr(), style: TextStyle( fontSize: 14, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart index ef0cfed..27ccd52 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart @@ -23,6 +23,7 @@ import 'package:customer/utils/preferences.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; @@ -69,16 +70,16 @@ class HomeScreenTwo extends StatelessWidget { children: [ Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("No Store Found in Your Area".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr, + "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Change Zone".tr, + title: "Change Zone".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -122,7 +123,7 @@ class HomeScreenTwo extends StatelessWidget { Get.offAll(const LoginScreen()); }, child: Text( - "Login".tr, + "Login".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), ), @@ -145,7 +146,7 @@ class HomeScreenTwo extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); // ✅ declare once for whole method ShippingAddress shippingAddress = ShippingAddress(); @@ -255,8 +256,8 @@ class HomeScreenTwo extends StatelessWidget { child: TextFieldWidget( hintText: Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true - ? 'Search the dish, foo and more...'.tr - : 'Search the store, item and more...'.tr, + ? 'Search the dish, foo and more...'.tr() + : 'Search the store, item and more...'.tr(), controller: null, enable: false, prefix: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg")), @@ -299,7 +300,7 @@ class HomeScreenTwo extends StatelessWidget { children: [ Expanded( child: Text( - "Highlights for you".tr, + "Highlights for you".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -311,7 +312,7 @@ class HomeScreenTwo extends StatelessWidget { }); }, child: Text( - "See all".tr, + "See all".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), @@ -417,13 +418,13 @@ class HomeScreenTwo extends StatelessWidget { DropdownButton( isDense: false, underline: const SizedBox(), - value: controller.selectedOrderTypeValue.value.tr, + value: controller.selectedOrderTypeValue.value.tr(), icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr, 'TakeAway'.tr].map((String value) { + ['Delivery'.tr(), 'TakeAway'.tr()].map((String value) { return DropdownMenuItem( value: value, - child: Text(value.tr, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + child: Text(value.tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ); }).toList(), onChanged: (value) async { @@ -436,10 +437,10 @@ class HomeScreenTwo extends StatelessWidget { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Alert".tr, - descriptions: "Do you really want to change the delivery option? Your cart will be empty.".tr, - positiveString: "Ok".tr, - negativeString: "Cancel".tr, + title: "Alert".tr(), + descriptions: "Do you really want to change the delivery option? Your cart will be empty.".tr(), + positiveString: "Ok".tr(), + negativeString: "Cancel".tr(), positiveClick: () async { await Preferences.setString(Preferences.foodDeliveryType, value!); controller.selectedOrderTypeValue.value = value; @@ -493,13 +494,13 @@ class CategoryView extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text("Our Categories".tr, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded(child: Text("Our Categories".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), InkWell( onTap: () { Get.to(const ViewAllCategoryScreen()); }, child: Text( - "See all".tr, + "See all".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), ), @@ -507,7 +508,7 @@ class CategoryView extends StatelessWidget { ], ), GradientText( - 'Best Servings Food'.tr, + 'Best Servings Food'.tr(), style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), gradient: LinearGradient(colors: [Color(0xFF3961F1), Color(0xFF11D0EA)]), ), @@ -571,7 +572,7 @@ class OfferView extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text("Large Discounts".tr, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded(child: Text("Large Discounts".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), InkWell( onTap: () { Get.to( @@ -580,7 +581,7 @@ class OfferView extends StatelessWidget { ); }, child: Text( - "See all".tr, + "See all".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), ), @@ -588,7 +589,7 @@ class OfferView extends StatelessWidget { ], ), GradientText( - 'Save Upto 50% Off'.tr, + 'Save Upto 50% Off'.tr(), style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), gradient: LinearGradient(colors: [Color(0xFF39F1C5), Color(0xFF97EA11)]), ), @@ -642,7 +643,7 @@ class OfferView extends StatelessWidget { const SizedBox(height: 5), RoundedButtonFill( title: - "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr : "off".tr}", + "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr() : "off".tr()}", color: Colors.primaries[Random().nextInt(Colors.primaries.length)], textColor: AppThemeData.grey50, width: 20, @@ -694,13 +695,13 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); ShowToastDialog.closeLoader(); Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); @@ -711,7 +712,7 @@ class BannerView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr); + ShowToastDialog.showToast("Could not launch".tr()); } } }, @@ -746,9 +747,9 @@ class StoryView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row(children: [Expanded(child: Text("Stories".tr, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 18)))]), + Row(children: [Expanded(child: Text("Stories".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 18)))]), GradientText( - 'Best Food Stories Ever'.tr, + 'Best Food Stories Ever'.tr(), style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), gradient: LinearGradient(colors: [Color(0xFFF1C839), Color(0xFFEA1111)]), ), @@ -787,7 +788,7 @@ class StoryView extends StatelessWidget { return Constant.loader(); } else { if (snapshot.hasError) { - return Center(child: Text('${"Error".tr}: ${snapshot.error}')); + return Center(child: Text('${"Error".tr()}: ${snapshot.error}')); } else if (snapshot.data == null) { return const SizedBox(); } else { @@ -814,7 +815,7 @@ class StoryView extends StatelessWidget { SvgPicture.asset("assets/icons/ic_star.svg"), const SizedBox(width: 5), Text( - "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum!.toStringAsFixed(0))} ${'reviews'.tr}", + "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum!.toStringAsFixed(0))} ${'reviews'.tr()}", textAlign: TextAlign.center, maxLines: 1, style: const TextStyle(color: AppThemeData.warning300, fontSize: 10, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), @@ -869,13 +870,13 @@ class RestaurantView extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Row( children: [ - Expanded(child: Text("Best Restaurants".tr, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded(child: Text("Best Restaurants".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), InkWell( onTap: () { Get.to(const RestaurantListScreen(), arguments: {"vendorList": controller.allNearestRestaurant, "title": "Best Restaurants"}); }, child: Text( - "See all".tr, + "See all".tr(), textAlign: TextAlign.center, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), ), @@ -938,7 +939,7 @@ class RestaurantView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Upto".tr, + "Upto".tr(), textAlign: TextAlign.center, maxLines: 1, style: TextStyle( @@ -949,7 +950,7 @@ class RestaurantView extends StatelessWidget { ), ), Text( - discountAmountTempList.reduce(min).toString() + "% OFF".tr, + discountAmountTempList.reduce(min).toString() + "% OFF".tr(), textAlign: TextAlign.center, maxLines: 1, style: TextStyle( @@ -1001,7 +1002,7 @@ class RestaurantView extends StatelessWidget { SvgPicture.asset("assets/icons/ic_free_delivery.svg", width: 18), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle( overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart index 7e5c18f..d6282a4 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -122,7 +123,7 @@ class RestaurantListScreen extends StatelessWidget { SvgPicture.asset("assets/icons/ic_free_delivery.svg"), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart index 3b9d6b2..5536d29 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart @@ -5,6 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/story_view/controller/story_controller.dart'; import 'package:customer/widget/story_view/utils.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -103,7 +104,7 @@ class MoreStoriesState extends State { return SizedBox(); } else { if (snapshot.hasError) { - return Center(child: Text('${"Error".tr}: ${snapshot.error}')); + return Center(child: Text('${"Error".tr()}: ${snapshot.error}')); return Center(child: Text('Error: ${snapshot.error}')); } else if (snapshot.data == null) { return const SizedBox(); @@ -135,7 +136,7 @@ class MoreStoriesState extends State { SvgPicture.asset("assets/icons/ic_star.svg"), const SizedBox(width: 5), Text( - "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} ${'reviews'.tr}", + "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} ${'reviews'.tr()}", textAlign: TextAlign.center, maxLines: 1, style: const TextStyle(color: AppThemeData.warning300, fontSize: 12, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), diff --git a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart index 49cc84a..06b516e 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/controllers/view_all_category_controller.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -24,7 +25,7 @@ class ViewAllCategoryScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Categories".tr, style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text("Categories".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), ), body: controller.isLoading.value diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart index 980aeb0..9bf1d32 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart @@ -1,6 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/live_tracking_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:get/get.dart'; @@ -24,7 +25,7 @@ class LiveTrackingScreen extends StatelessWidget { return Scaffold( backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text("Live Tracking".tr), centerTitle: false), + appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text("Live Tracking".tr()), centerTitle: false), body: Constant.selectedMapType == 'osm' ? flutterMap.FlutterMap( diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart index 0434d25..ead2ca4 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart @@ -8,6 +8,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -37,7 +38,7 @@ class OrderDetailsScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Order Details".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Order Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: controller.isLoading.value @@ -56,7 +57,7 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Order'.tr} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}".tr, + "${'Order'.tr()} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -64,7 +65,7 @@ class OrderDetailsScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: controller.orderModel.value.status.toString().tr, + title: controller.orderModel.value.status.toString().tr(), color: Constant.statusColor(status: controller.orderModel.value.status.toString()), width: 32, height: 4.5, @@ -125,7 +126,7 @@ class OrderDetailsScreen extends StatelessWidget { ? const SizedBox() : InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.vendor!.author.toString()); @@ -236,7 +237,7 @@ class OrderDetailsScreen extends StatelessWidget { ? const SizedBox() : InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.vendor!.author.toString()); @@ -314,7 +315,7 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Order Delivered.".tr, + "Order Delivered.".tr(), textAlign: TextAlign.right, style: TextStyle( color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, @@ -333,8 +334,8 @@ class OrderDetailsScreen extends StatelessWidget { const SizedBox(width: 5), Expanded( child: Text( - "${'Your Order has been Preparing and assign to the driver'.tr}\n${'Preparation Time'.tr} ${controller.orderModel.value.estimatedTimeToPrepare}" - .tr, + "${'Your Order has been Preparing and assign to the driver'.tr()}\n${'Preparation Time'.tr()} ${controller.orderModel.value.estimatedTimeToPrepare}" + .tr(), textAlign: TextAlign.start, style: TextStyle( color: isDark ? AppThemeData.warning400 : AppThemeData.warning400, @@ -404,7 +405,7 @@ class OrderDetailsScreen extends StatelessWidget { const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.driverID.toString()); @@ -450,7 +451,7 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 14), Text( - "Your Order".tr, + "Your Order".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -555,7 +556,7 @@ class OrderDetailsScreen extends StatelessWidget { Align( alignment: Alignment.centerRight, child: RoundedButtonFill( - title: "Rate us".tr, + title: "Rate us".tr(), height: 3.8, width: 20, color: isDark ? AppThemeData.warning300 : AppThemeData.warning300, @@ -578,7 +579,7 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Variants".tr, + "Variants".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -616,7 +617,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Addons".tr, + "Addons".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -670,7 +671,7 @@ class OrderDetailsScreen extends StatelessWidget { // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Text( - // "Delivery Man".tr, + // "Delivery Man".tr(), // textAlign: TextAlign.start, // style: TextStyle( // fontFamily: AppThemeData.semiBold, @@ -689,7 +690,7 @@ class OrderDetailsScreen extends StatelessWidget { // ], // ), Text( - "Bill Details".tr, + "Bill Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -706,7 +707,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Item totals".tr, + "Item totals".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -726,13 +727,13 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Delivery Fee".tr, + "Delivery Fee".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), ), (controller.orderModel.value.vendor?.isSelfDelivery == true) - ? Text('Free Delivery'.tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: AppThemeData.success400, fontSize: 16)) + ? Text('Free Delivery'.tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: AppThemeData.success400, fontSize: 16)) : Text( Constant.amountShow( amount: @@ -753,7 +754,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Coupon Discount".tr, + "Coupon Discount".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -774,7 +775,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Special Discount".tr, + "Special Discount".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -800,7 +801,7 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Delivery Tips".tr, + "Delivery Tips".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -860,7 +861,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "To Pay".tr, + "To Pay".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -878,7 +879,7 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 14), Text( - "Order Details".tr, + "Order Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -895,17 +896,17 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Delivery type".tr, + "Delivery type".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), ), Text( controller.orderModel.value.takeAway == true - ? "TakeAway".tr + ? "TakeAway".tr() : controller.orderModel.value.scheduleTime == null - ? "Standard".tr - : "Schedule".tr, + ? "Standard".tr() + : "Schedule".tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -926,7 +927,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Payment Method".tr, + "Payment Method".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -944,7 +945,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Date and Time".tr, + "Date and Time".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -965,7 +966,7 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Phone Number".tr, + "Phone Number".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -991,7 +992,7 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Remarks".tr, + "Remarks".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -1026,7 +1027,7 @@ class OrderDetailsScreen extends StatelessWidget { child: controller.orderModel.value.status == Constant.orderShipped || controller.orderModel.value.status == Constant.orderInTransit ? RoundedButtonFill( - title: "Track Order".tr, + title: "Track Order".tr(), height: 5.5, color: AppThemeData.warning300, textColor: AppThemeData.grey900, @@ -1035,14 +1036,14 @@ class OrderDetailsScreen extends StatelessWidget { }, ) : RoundedButtonFill( - title: "Reorder".tr, + title: "Reorder".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { for (var element in controller.orderModel.value.products!) { controller.addToCart(cartProductModel: element); - ShowToastDialog.showToast("Item Added In a cart".tr); + ShowToastDialog.showToast("Item Added In a cart".tr()); } }, ), diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart index 3cacd3a..871c7c4 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; @@ -40,16 +41,16 @@ class OrderScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr, + "You’re not logged in. Please sign in to access your account and explore all features.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr, + title: "Log in".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -74,11 +75,11 @@ class OrderScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "My Order".tr, + "My Order".tr(), style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), Text( - "Keep track your delivered, In Progress and Rejected item all in just one place.".tr, + "Keep track your delivered, In Progress and Rejected item all in just one place.".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ], @@ -109,11 +110,11 @@ class OrderScreen extends StatelessWidget { dividerColor: Colors.transparent, indicatorSize: TabBarIndicatorSize.tab, tabs: [ - Padding(padding: const EdgeInsets.symmetric(horizontal: 18), child: Tab(text: 'All'.tr)), - Tab(text: 'In Progress'.tr), - Tab(text: 'Delivered'.tr), - Tab(text: 'Cancelled'.tr), - Tab(text: 'Rejected'.tr), + Padding(padding: const EdgeInsets.symmetric(horizontal: 18), child: Tab(text: 'All'.tr())), + Tab(text: 'In Progress'.tr()), + Tab(text: 'Delivered'.tr()), + Tab(text: 'Cancelled'.tr()), + Tab(text: 'Rejected'.tr()), ], ), ), @@ -122,7 +123,7 @@ class OrderScreen extends StatelessWidget { child: TabBarView( children: [ controller.allList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr) + ? Constant.showEmptyView(message: "Order Not Found".tr()) : RefreshIndicator( onRefresh: () => controller.getOrder(), child: ListView.builder( @@ -136,7 +137,7 @@ class OrderScreen extends StatelessWidget { ), ), controller.inProgressList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr) + ? Constant.showEmptyView(message: "Order Not Found".tr()) : RefreshIndicator( onRefresh: () => controller.getOrder(), child: ListView.builder( @@ -150,7 +151,7 @@ class OrderScreen extends StatelessWidget { ), ), controller.deliveredList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr) + ? Constant.showEmptyView(message: "Order Not Found".tr()) : RefreshIndicator( onRefresh: () => controller.getOrder(), child: ListView.builder( @@ -164,7 +165,7 @@ class OrderScreen extends StatelessWidget { ), ), controller.cancelledList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr) + ? Constant.showEmptyView(message: "Order Not Found".tr()) : RefreshIndicator( onRefresh: () => controller.getOrder(), child: ListView.builder( @@ -178,7 +179,7 @@ class OrderScreen extends StatelessWidget { ), ), controller.rejectedList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr) + ? Constant.showEmptyView(message: "Order Not Found".tr()) : RefreshIndicator( onRefresh: () => controller.getOrder(), child: ListView.builder( @@ -296,11 +297,11 @@ class OrderScreen extends StatelessWidget { onTap: () { for (var element in orderModel.products!) { controller.addToCart(cartProductModel: element); - ShowToastDialog.showToast("Item Added In a cart".tr); + ShowToastDialog.showToast("Item Added In a cart".tr()); } }, child: Text( - "Reorder".tr, + "Reorder".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), ), @@ -313,7 +314,7 @@ class OrderScreen extends StatelessWidget { Get.to(const LiveTrackingScreen(), arguments: {"orderModel": orderModel}); }, child: Text( - "Track Order".tr, + "Track Order".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), ), @@ -327,7 +328,7 @@ class OrderScreen extends StatelessWidget { // Get.off(const OrderPlacingScreen(), arguments: {"orderModel": orderModel}); }, child: Text( - "View Details".tr, + "View Details".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), ), diff --git a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart index 12f17fc..81933b3 100644 --- a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart @@ -5,6 +5,7 @@ import 'package:customer/screen_ui/on_demand_service/worker_inbox_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/custom_dialog_box.dart'; import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:in_app_review/in_app_review.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; @@ -51,16 +52,16 @@ class ProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "My Profile".tr, + "My Profile".tr(), style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), Text( - "Manage your personal information, preferences, and settings all in one place.".tr, + "Manage your personal information, preferences, and settings all in one place.".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), const SizedBox(height: 20), Text( - "General Information".tr, + "General Information".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), @@ -73,18 +74,18 @@ class ProfileScreen extends StatelessWidget { children: [ Constant.userModel == null ? const SizedBox() - : cardDecoration(isDark, controller, "assets/images/ic_profile.svg", "Profile Information".tr, () { + : cardDecoration(isDark, controller, "assets/images/ic_profile.svg", "Profile Information".tr(), () { Get.to(const EditProfileScreen()); }), if (Constant.sectionConstantModel!.dineInActive == true) - cardDecoration(isDark, controller, "assets/images/ic_dinin.svg", "Dine-In".tr, () { + cardDecoration(isDark, controller, "assets/images/ic_dinin.svg", "Dine-In".tr(), () { Get.to(const DineInScreen()); }), - cardDecoration(isDark, controller, "assets/images/ic_gift.svg", "Gift Card".tr, () { + cardDecoration(isDark, controller, "assets/images/ic_gift.svg", "Gift Card".tr(), () { Get.to(const GiftCardScreen()); }), if (Constant.isCashbackActive == true) - cardDecoration(isDark, controller, "assets/icons/ic_cashback_Offer.svg", "Cashback Offers".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_cashback_Offer.svg", "Cashback Offers".tr(), () { Get.to(const CashbackOffersListScreen()); }), ], @@ -97,7 +98,7 @@ class ProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Bookings Information".tr, + "Bookings Information".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), @@ -108,7 +109,7 @@ class ProfileScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_dinin_order.svg", "Dine-In Booking".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_dinin_order.svg", "Dine-In Booking".tr(), () { Get.to(const DineInBookingScreen()); }), ], @@ -120,7 +121,7 @@ class ProfileScreen extends StatelessWidget { : const SizedBox(), const SizedBox(height: 10), Text( - "Preferences".tr, + "Preferences".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), @@ -131,17 +132,17 @@ class ProfileScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_change_language.svg", "Change Language".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_change_language.svg", "Change Language".tr(), () { Get.to(const ChangeLanguageScreen()); }), - cardDecoration(isDark, controller, "assets/icons/ic_light_dark.svg", "Dark Mode".tr, () {}), + cardDecoration(isDark, controller, "assets/icons/ic_light_dark.svg", "Dark Mode".tr(), () {}), ], ), ), ), const SizedBox(height: 10), Text( - "Social".tr, + "Social".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), @@ -154,16 +155,16 @@ class ProfileScreen extends StatelessWidget { children: [ Constant.userModel == null ? const SizedBox() - : cardDecoration(isDark, controller, "assets/icons/ic_refer.svg", "Refer a Friend".tr, () { + : cardDecoration(isDark, controller, "assets/icons/ic_refer.svg", "Refer a Friend".tr(), () { Get.to(const ReferFriendScreen()); }), - cardDecoration(isDark, controller, "assets/icons/ic_share.svg", "Share app".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_share.svg", "Share app".tr(), () { Share.share( - '${'Check out Foodie, your ultimate food delivery application!'.tr} \n\n${'Google Play:'.tr} ${Constant.googlePlayLink} \n\n${'App Store:'.tr} ${Constant.appStoreLink}', - subject: 'Look what I made!'.tr, + '${'Check out Foodie, your ultimate food delivery application!'.tr()} \n\n${'Google Play:'.tr()} ${Constant.googlePlayLink} \n\n${'App Store:'.tr()} ${Constant.appStoreLink}', + subject: 'Look what I made!'.tr(), ); }), - cardDecoration(isDark, controller, "assets/icons/ic_rate.svg", "Rate the app".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_rate.svg", "Rate the app".tr(), () { final InAppReview inAppReview = InAppReview.instance; inAppReview.requestReview(); }), @@ -178,7 +179,7 @@ class ProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Communication".tr, + "Communication".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 10), @@ -189,16 +190,16 @@ class ProfileScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Store Inbox".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Store Inbox".tr(), () { Get.to(const RestaurantInboxScreen()); }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Driver Inbox".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Driver Inbox".tr(), () { Get.to(const DriverInboxScreen()); }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Provider Inbox".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Provider Inbox".tr(), () { Get.to(const ProviderInboxScreen()); }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Worker Inbox".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Worker Inbox".tr(), () { Get.to(const WorkerInboxScreen()); }), ], @@ -208,7 +209,7 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), ], ), - Text("Legal".tr, style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), + Text("Legal".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), const SizedBox(height: 10), Container( width: Responsive.width(100, context), @@ -217,10 +218,10 @@ class ProfileScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_privacy_policy.svg", "Privacy Policy".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_privacy_policy.svg", "Privacy Policy".tr(), () { Get.to(const TermsAndConditionScreen(type: "privacy")); }), - cardDecoration(isDark, controller, "assets/icons/ic_tearm_condition.svg", "Terms and Conditions".tr, () { + cardDecoration(isDark, controller, "assets/icons/ic_tearm_condition.svg", "Terms and Conditions".tr(), () { Get.to(const TermsAndConditionScreen(type: "termAndCondition")); }), ], @@ -237,18 +238,18 @@ class ProfileScreen extends StatelessWidget { child: Column( children: [ Constant.userModel == null - ? cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log In".tr, () { + ? cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log In".tr(), () { Get.offAll(const LoginScreen()); }) - : cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log out".tr, () { + : cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log out".tr(), () { showDialog( context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Log out".tr, - descriptions: "Are you sure you want to log out? You will need to enter your credentials to log back in.".tr, - positiveString: "Log out".tr, - negativeString: "Cancel".tr, + title: "Log out".tr(), + descriptions: "Are you sure you want to log out? You will need to enter your credentials to log back in.".tr(), + positiveString: "Log out".tr(), + negativeString: "Cancel".tr(), positiveClick: () async { Constant.userModel!.fcmToken = ""; await FireStoreUtils.updateUser(Constant.userModel!); @@ -279,20 +280,20 @@ class ProfileScreen extends StatelessWidget { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Delete Account".tr, - descriptions: "Are you sure you want to delete your account? This action is irreversible and will permanently remove all your data.".tr, - positiveString: "Delete".tr, - negativeString: "Cancel".tr, + title: "Delete Account".tr(), + descriptions: "Are you sure you want to delete your account? This action is irreversible and will permanently remove all your data.".tr(), + positiveString: "Delete".tr(), + negativeString: "Cancel".tr(), positiveClick: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); await controller.deleteUserFromServer(); await FireStoreUtils.deleteUser().then((value) { ShowToastDialog.closeLoader(); if (value == true) { - ShowToastDialog.showToast("Account deleted successfully".tr); + ShowToastDialog.showToast("Account deleted successfully".tr()); Get.offAll(const LoginScreen()); } else { - ShowToastDialog.showToast("Contact Administrator".tr); + ShowToastDialog.showToast("Contact Administrator".tr()); } }); }, @@ -311,7 +312,7 @@ class ProfileScreen extends StatelessWidget { SvgPicture.asset("assets/icons/ic_delete.svg"), const SizedBox(width: 10), Text( - "Delete Account".tr, + "Delete Account".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300), ), @@ -347,25 +348,25 @@ class ProfileScreen extends StatelessWidget { }, child: Row( children: [ - SvgPicture.asset(image, colorFilter: title == "Log In".tr || title == "Cashbacks".tr ? const ColorFilter.mode(AppThemeData.success500, BlendMode.srcIn) : null, height: 24, width: 24), + SvgPicture.asset(image, colorFilter: title == "Log In".tr() || title == "Cashbacks".tr() ? const ColorFilter.mode(AppThemeData.success500, BlendMode.srcIn) : null, height: 24, width: 24), const SizedBox(width: 10), Expanded( child: Text( - title.tr, + title.tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, fontSize: 16, color: - title == "Log out".tr + title == "Log out".tr() ? AppThemeData.danger300 - : title == "Log In".tr + : title == "Log In".tr() ? AppThemeData.success500 : (isDark ? AppThemeData.grey100 : AppThemeData.grey800), ), ), ), - title == "Dark Mode".tr + title == "Dark Mode".tr() ? Transform.scale( scale: 0.8, child: Obx(() => CupertinoSwitch(value: controller.isDarkModeSwitch.value, activeTrackColor: AppThemeData.primary300, onChanged: controller.toggleDarkMode)), diff --git a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart index 14f1542..840a7d1 100644 --- a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart +++ b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -31,7 +32,7 @@ class RateProductScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Rate the item".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Rate the item".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: controller.isLoading.value @@ -49,9 +50,9 @@ class RateProductScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Rate for".tr, style: TextStyle(color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.medium)), + Text("Rate for".tr(), style: TextStyle(color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.medium)), Text( - "${controller.productModel.value.name}".tr, + "${controller.productModel.value.name}".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 18, fontFamily: AppThemeData.semiBold), ), const SizedBox(height: 10), @@ -123,14 +124,14 @@ class RateProductScreen extends StatelessWidget { SvgPicture.asset('assets/icons/ic_folder.svg'), const SizedBox(height: 10), Text( - "Choose a image and upload here".tr, + "Choose a image and upload here".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.medium, fontSize: 16), ), const SizedBox(height: 5), - Text("JPEG, PNG".tr, style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular)), + Text("JPEG, PNG".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular)), const SizedBox(height: 10), RoundedButtonFill( - title: "Brows Image".tr, + title: "Brows Image".tr(), color: AppThemeData.primary50, width: 30, height: 5, @@ -216,7 +217,7 @@ class RateProductScreen extends StatelessWidget { enabledBorder: InputBorder.none, errorBorder: InputBorder.none, border: InputBorder.none, - hintText: "Type comment".tr, + hintText: "Type comment".tr(), hintStyle: TextStyle(fontSize: 14, color: isDark ? AppThemeData.grey600 : AppThemeData.grey400, fontFamily: AppThemeData.regular), ), ), @@ -235,7 +236,7 @@ class RateProductScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Submit Review".tr, + title: "Submit Review".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -265,7 +266,7 @@ class RateProductScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 15), - child: Text("Please Select".tr, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.bold, fontSize: 16)), + child: Text("Please Select".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.bold, fontSize: 16)), ), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -277,7 +278,7 @@ class RateProductScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ IconButton(onPressed: () => controller.pickFile(source: ImageSource.camera), icon: const Icon(Icons.camera_alt, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("Camera".tr)), + Padding(padding: const EdgeInsets.only(top: 3), child: Text("Camera".tr())), ], ), ), @@ -288,7 +289,7 @@ class RateProductScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ IconButton(onPressed: () => controller.pickFile(source: ImageSource.gallery), icon: const Icon(Icons.photo_library_sharp, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("Gallery".tr)), + Padding(padding: const EdgeInsets.only(top: 3), child: Text("Gallery".tr())), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart index f2f6c03..c8a1bbd 100644 --- a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart +++ b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart @@ -3,6 +3,7 @@ import 'package:customer/controllers/refer_friend_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -51,17 +52,17 @@ class ReferFriendScreen extends StatelessWidget { Center(child: SvgPicture.asset("assets/images/referal_top.svg")), const SizedBox(height: 10), Text( - "Refer your friend and earn".tr, + "Refer your friend and earn".tr(), style: TextStyle(fontSize: 22, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), ), const SizedBox(width: 4), Text( - "${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'Each🎉'.tr}", + "${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'Each🎉'.tr()}", style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), const SizedBox(height: 32), Text( - "Invite Friends & Businesses".tr, + "Invite Friends & Businesses".tr(), style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, @@ -71,8 +72,8 @@ class ReferFriendScreen extends StatelessWidget { ), const SizedBox(height: 8), Text( - "${'Invite your friends to sign up with Foodie using your code, and you’ll earn'.tr} ${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'after their Success the first order! 💸🍔'.tr}" - .tr, + "${'Invite your friends to sign up with Foodie using your code, and you’ll earn'.tr()} ${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'after their Success the first order! 💸🍔'.tr()}" + .tr(), textAlign: TextAlign.center, style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), ), @@ -101,7 +102,7 @@ class ReferFriendScreen extends StatelessWidget { InkWell( onTap: () { Clipboard.setData(ClipboardData(text: controller.referralModel.value.referralCode.toString())); - ShowToastDialog.showToast("Copied".tr); + ShowToastDialog.showToast("Copied".tr()); }, child: const Icon(Icons.copy, color: AppThemeData.ecommerce100), ), @@ -117,7 +118,7 @@ class ReferFriendScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), child: Text( - "or".tr, + "or".tr(), textAlign: TextAlign.center, style: TextStyle( color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, @@ -132,13 +133,13 @@ class ReferFriendScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Share Code".tr, + title: "Share Code".tr(), width: 55, color: AppThemeData.ecommerce300, textColor: AppThemeData.grey50, onPress: () async { await Share.share( - "${"Hey there, thanks for choosing Foodie. Hope you love our product. If you do, share it with your friends using code".tr} ${controller.referralModel.value.referralCode.toString()} ${"and get".tr}${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount.toString())} ${"when order completed".tr}", + "${"Hey there, thanks for choosing Foodie. Hope you love our product. If you do, share it with your friends using code".tr()} ${controller.referralModel.value.referralCode.toString()} ${"and get".tr()}${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount.toString())} ${"when order completed".tr()}", ); }, ), diff --git a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart index 690a53e..5f6f69e 100644 --- a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart @@ -13,6 +13,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -51,8 +52,8 @@ class RestaurantDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('${cartItem.length} ${"items".tr}', style: TextStyle(fontFamily: AppThemeData.medium, color: AppThemeData.grey50, fontSize: 16)), - Text('View Cart'.tr, style: TextStyle(fontFamily: AppThemeData.semiBold, color: AppThemeData.grey50, fontSize: 16, fontWeight: FontWeight.bold)), + Text('${cartItem.length} ${"items".tr()}', style: TextStyle(fontFamily: AppThemeData.medium, color: AppThemeData.grey50, fontSize: 16)), + Text('View Cart'.tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: AppThemeData.grey50, fontSize: 16, fontWeight: FontWeight.bold)), ], ), ), @@ -89,7 +90,7 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ SvgPicture.asset("assets/icons/ic_free_delivery.svg"), const SizedBox(width: 5), - Text("Free Delivery".tr, style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600)), + Text("Free Delivery".tr(), style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600)), ], ), ), @@ -288,7 +289,7 @@ class RestaurantDetailsScreen extends StatelessWidget { Get.to(const ReviewListScreen(), arguments: {"vendorModel": controller.vendorModel.value}); }, child: Text( - "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr}", + "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", style: TextStyle(decoration: TextDecoration.underline, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular), ), ), @@ -301,7 +302,7 @@ class RestaurantDetailsScreen extends StatelessWidget { : Row( children: [ Text( - controller.isOpen.value ? "Open".tr : "Close".tr, + controller.isOpen.value ? "Open".tr() : "Close".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -316,13 +317,13 @@ class RestaurantDetailsScreen extends StatelessWidget { InkWell( onTap: () { if (controller.vendorModel.value.workingHours!.isEmpty) { - ShowToastDialog.showToast("Timing is not added by store".tr); + ShowToastDialog.showToast("Timing is not added by store".tr()); } else { timeShowBottomSheet(context, controller); } }, child: Text( - "View Timings".tr, + "View Timings".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -344,7 +345,7 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Also applicable on table booking".tr, + "Also applicable on table booking".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -383,7 +384,7 @@ class RestaurantDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Table Booking".tr, + "Table Booking".tr(), style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -392,7 +393,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), ), Text( - "Quick Conformations".tr, + "Quick Conformations".tr(), style: TextStyle( fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, @@ -418,7 +419,7 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Additional Offers".tr, + "Additional Offers".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -435,7 +436,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(height: 20), Text( - "Menu".tr, + "Menu".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -449,7 +450,7 @@ class RestaurantDetailsScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( controller: controller.searchEditingController.value, - hintText: 'Search the item and more...'.tr, + hintText: 'Search the item and more...'.tr(), onchange: (value) { controller.searchProduct(value); }, @@ -492,7 +493,7 @@ class RestaurantDetailsScreen extends StatelessWidget { SvgPicture.asset("assets/icons/ic_veg.svg", height: 20, width: 20), const SizedBox(width: 8), Text( - 'Veg'.tr, + 'Veg'.tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], @@ -532,7 +533,7 @@ class RestaurantDetailsScreen extends StatelessWidget { SvgPicture.asset("assets/icons/ic_nonveg.svg", height: 20, width: 20), const SizedBox(width: 8), Text( - 'Non Veg'.tr, + 'Non Veg'.tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], @@ -805,7 +806,7 @@ class CouponListView extends StatelessWidget { InkWell( onTap: () { Clipboard.setData(ClipboardData(text: offerModel.code.toString())).then((value) { - ShowToastDialog.showToast("Copied".tr); + ShowToastDialog.showToast("Copied".tr()); }); }, child: Row( @@ -921,7 +922,7 @@ class ProductListView extends StatelessWidget { productModel.nonveg == true ? SvgPicture.asset("assets/icons/ic_nonveg.svg") : SvgPicture.asset("assets/icons/ic_veg.svg"), const SizedBox(width: 5), Text( - productModel.nonveg == true ? "Non Veg.".tr : "Pure veg.".tr, + productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), style: TextStyle( color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, fontFamily: AppThemeData.semiBold, @@ -995,7 +996,7 @@ class ProductListView extends StatelessWidget { Icon(Icons.info, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, size: 18), const SizedBox(width: 8), Text( - "Info".tr, + "Info".tr(), maxLines: 2, style: TextStyle( overflow: TextOverflow.ellipsis, @@ -1064,7 +1065,7 @@ class ProductListView extends StatelessWidget { child: selectedVariants.isNotEmpty || (productModel.addOnsTitle != null && productModel.addOnsTitle!.isNotEmpty) ? RoundedButtonFill( - title: "Add".tr, + title: "Add".tr(), width: 10, height: 4, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, @@ -1177,7 +1178,7 @@ class ProductListView extends StatelessWidget { quantity: cartItem.where((p0) => p0.id == productModel.id).first.quantity! + 1, ); } else { - ShowToastDialog.showToast("Out of stock".tr); + ShowToastDialog.showToast("Out of stock".tr()); } }, child: Icon(Icons.add, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50), @@ -1186,7 +1187,7 @@ class ProductListView extends StatelessWidget { ), ) : RoundedButtonFill( - title: "Add".tr, + title: "Add".tr(), width: 10, height: 4, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, @@ -1195,7 +1196,7 @@ class ProductListView extends StatelessWidget { if (1 <= (productModel.quantity ?? 0) || (productModel.quantity ?? 0) == -1) { controller.addToCart(productModel: productModel, price: price, discountPrice: disPrice, isIncrement: true, quantity: 1); } else { - ShowToastDialog.showToast("Out of stock".tr); + ShowToastDialog.showToast("Out of stock".tr()); } }, ), @@ -1257,7 +1258,7 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Product Information's".tr, + "Product Information's".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.bold, fontWeight: FontWeight.w700, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -1278,7 +1279,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Gram".tr, + "Gram".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -1300,7 +1301,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Calories".tr, + "Calories".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -1322,7 +1323,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Proteins".tr, + "Proteins".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -1344,7 +1345,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Fats".tr, + "Fats".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), ), @@ -1365,7 +1366,7 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Specification".tr, + "Specification".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w700, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -1408,7 +1409,7 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Brand".tr, + "Brand".tr(), textAlign: TextAlign.start, style: TextStyle(fontWeight: FontWeight.w700, fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), ), @@ -1424,7 +1425,7 @@ class ProductListView extends StatelessWidget { : const SizedBox(), const SizedBox(height: 20), RoundedButtonFill( - title: "Back".tr, + title: "Back".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -1588,7 +1589,7 @@ class ProductDetailsView extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Text( - "Required • Select any 1 option".tr, + "Required • Select any 1 option".tr(), style: TextStyle( fontSize: 12, overflow: TextOverflow.ellipsis, @@ -1700,7 +1701,7 @@ class ProductDetailsView extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 12), child: Text( - "Addons".tr, + "Addons".tr(), style: TextStyle( fontSize: 16, overflow: TextOverflow.ellipsis, @@ -1830,7 +1831,7 @@ class ProductDetailsView extends StatelessWidget { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast("Out of stock".tr); + ShowToastDialog.showToast("Out of stock".tr()); } } else { int totalQuantity = int.parse( @@ -1840,7 +1841,7 @@ class ProductDetailsView extends StatelessWidget { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast("Out of stock".tr); + ShowToastDialog.showToast("Out of stock".tr()); } } }, @@ -1854,7 +1855,7 @@ class ProductDetailsView extends StatelessWidget { Expanded( flex: 2, child: RoundedButtonFill( - title: "${'Add item'.tr} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}".tr, + title: "${'Add item'.tr()} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart index 84e25ae..3cbab3d 100644 --- a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/models/rating_model.dart'; import 'package:customer/models/review_attribute_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; @@ -31,13 +32,13 @@ class ReviewListScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Reviews".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Reviews".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: controller.isLoading.value ? Constant.loader() : controller.ratingList.isEmpty - ? Constant.showEmptyView(message: "No Review found".tr) + ? Constant.showEmptyView(message: "No Review found".tr()) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: ListView.builder( @@ -72,7 +73,7 @@ class ReviewListScreen extends StatelessWidget { } else if (snapshot.data != null) { ProductModel model = ProductModel.fromJson(snapshot.data!.data()!); return Text( - '${'Rate for'.tr} - ${model.name ?? ''}', + '${'Rate for'.tr()} - ${model.name ?? ''}', style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.semiBold), ); } else { diff --git a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart index 8a8b9c4..8d13806 100644 --- a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart +++ b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart @@ -1,6 +1,7 @@ import 'package:customer/controllers/scan_qr_code_controller.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:qr_code_dart_scan/qr_code_dart_scan.dart'; @@ -24,7 +25,7 @@ class ScanQrCodeScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - title: Text("Scan QR Code".tr, style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text("Scan QR Code".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), ), body: QRCodeDartScanView( // enable scan invert qr code ( default = false) @@ -32,11 +33,11 @@ class ScanQrCodeScreen extends StatelessWidget { // if TypeScan.takePicture will try decode when click to take a picture(default TypeScan.live) onCapture: (Result result) { Get.back(); - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); if (controller.allNearestRestaurant.isNotEmpty) { if (controller.allNearestRestaurant.where((vendor) => vendor.id == result.text).isEmpty) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Store is not available".tr); + ShowToastDialog.showToast("Store is not available".tr()); return; } VendorModel storeModel = controller.allNearestRestaurant.firstWhere((vendor) => vendor.id == result.text); @@ -45,7 +46,7 @@ class ScanQrCodeScreen extends StatelessWidget { Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": storeModel}); } else { Get.back(); - ShowToastDialog.showToast("Store is not available".tr); + ShowToastDialog.showToast("Store is not available".tr()); } }, ), diff --git a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart index b5f0b51..c7d6acd 100644 --- a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart +++ b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart @@ -5,6 +5,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/text_field_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; @@ -31,7 +32,7 @@ class SearchScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? "Find your favorite products and nearby stores" : "Search Item & Store".tr, + Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? "Find your favorite products and nearby stores" : "Search Item & Store".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -40,7 +41,7 @@ class SearchScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: TextFieldWidget( - hintText: Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? 'Find your favorite products and nearby stores'.tr : 'Search the store and item'.tr, + hintText: Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? 'Find your favorite products and nearby stores'.tr() : 'Search the store and item'.tr(), prefix: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg")), controller: null, onchange: (value) { @@ -65,7 +66,7 @@ class SearchScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Store".tr, + "Store".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -131,7 +132,7 @@ class SearchScreen extends StatelessWidget { SvgPicture.asset("assets/icons/ic_free_delivery.svg"), const SizedBox(width: 5), Text( - "Free Delivery".tr, + "Free Delivery".tr(), style: TextStyle(fontSize: 14, color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], @@ -236,7 +237,7 @@ class SearchScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Items".tr, + "Items".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -290,7 +291,7 @@ class SearchScreen extends StatelessWidget { productModel.nonveg == true ? SvgPicture.asset("assets/icons/ic_nonveg.svg") : SvgPicture.asset("assets/icons/ic_veg.svg"), const SizedBox(width: 5), Text( - productModel.nonveg == true ? "Non Veg.".tr : "Pure veg.".tr, + productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), style: TextStyle( color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, fontFamily: AppThemeData.semiBold, diff --git a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart index 72c8525..a23577b 100644 --- a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart +++ b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart @@ -1,5 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_html/flutter_html.dart'; @@ -28,7 +29,7 @@ class TermsAndConditionScreen extends StatelessWidget { child: Icon(Icons.chevron_left_outlined, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), title: Text( - type == "privacy" ? "Privacy Policy".tr : "Terms & Conditions".tr, + type == "privacy" ? "Privacy Policy".tr() : "Terms & Conditions".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.bold, fontSize: 18), ), elevation: 0, diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart index 94b47cd..a59d6ee 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_scr import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; @@ -27,7 +28,7 @@ class PaymentListScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Top up Wallet".tr, style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text("Top up Wallet".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), ), body: SingleChildScrollView( child: Column( @@ -36,8 +37,8 @@ class PaymentListScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: TextFieldWidget( - title: 'Amount'.tr, - hintText: 'Enter Amount'.tr, + title: 'Amount'.tr(), + hintText: 'Enter Amount'.tr(), controller: controller.topUpAmountController.value, textInputType: const TextInputType.numberWithOptions(decimal: true, signed: true), prefix: Padding(padding: const EdgeInsets.all(12.0), child: Text(Constant.currencyModel!.symbol.toString(), style: const TextStyle(fontSize: 20, color: AppThemeData.grey800))), @@ -47,7 +48,7 @@ class PaymentListScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Text( - "Select Top up Options".tr, + "Select Top up Options".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), ), @@ -86,14 +87,14 @@ class PaymentListScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Top-up".tr, + title: "Top-up".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { if (controller.topUpAmountController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Amount".tr); + ShowToastDialog.showToast("Please Enter Amount".tr()); } else { if (double.parse(controller.topUpAmountController.value.text) >= double.parse(Constant.minimumAmountToDeposit.toString())) { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { @@ -118,17 +119,17 @@ class PaymentListScreen extends StatelessWidget { RazorPayController().createOrderRazorPay(amount: double.parse(controller.topUpAmountController.value.text), razorpayModel: controller.razorPayModel.value).then((value) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: controller.topUpAmountController.value.text, orderId: result.id); } }); } else { - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast("Please select payment method".tr()); } } else { - ShowToastDialog.showToast("${'Please Enter minimum amount of'.tr} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}"); + ShowToastDialog.showToast("${'Please Enter minimum amount of'.tr()} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}"); } } }, diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart index 0c2af9d..959eb23 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import '../../../constant/collection_name.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/cab_order_model.dart'; @@ -48,16 +49,16 @@ class WalletScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr, + "You’re not logged in. Please sign in to access your account and explore all features.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr, + title: "Log in".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -86,11 +87,11 @@ class WalletScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "My Wallet".tr, + "My Wallet".tr(), style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), Text( - "Keep track of your balance, transactions, and payment methods all in one place.".tr, + "Keep track of your balance, transactions, and payment methods all in one place.".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), ), ], @@ -112,7 +113,7 @@ class WalletScreen extends StatelessWidget { child: Column( children: [ Text( - "My Wallet".tr, + "My Wallet".tr(), maxLines: 1, style: TextStyle( color: isDark ? AppThemeData.primary100 : AppThemeData.primary100, @@ -130,7 +131,7 @@ class WalletScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 80), child: RoundedButtonFill( - title: "Top up".tr, + title: "Top up".tr(), color: AppThemeData.warning300, textColor: AppThemeData.grey900, onPress: () { @@ -148,7 +149,7 @@ class WalletScreen extends StatelessWidget { Expanded( child: controller.walletTransactionList.isEmpty - ? Constant.showEmptyView(message: "Transaction not found".tr) + ? Constant.showEmptyView(message: "Transaction not found".tr()) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: ListView.builder( @@ -197,7 +198,7 @@ class WalletScreen extends StatelessWidget { Get.to(const OrderDetailsScreen(), arguments: {"orderModel": OrderModel.fromJson(orderData)}); break; default: - ShowToastDialog.showToast("Order details not available".tr); + ShowToastDialog.showToast("Order details not available".tr()); } } }, diff --git a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart index efaeca3..e693647 100644 --- a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart +++ b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart @@ -1,5 +1,6 @@ import 'package:customer/constant/assets.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../controllers/on_boarding_controller.dart'; @@ -65,7 +66,7 @@ class OnboardingScreen extends StatelessWidget { const SizedBox(height: 20), controller.currentPage.value == pageCount - 1 ? RoundedButtonFill( - title: "Let’s Get Started".tr, + title: "Let’s Get Started".tr(), onPress: () { _finish(); }, @@ -73,11 +74,11 @@ class OnboardingScreen extends StatelessWidget { ) : Row( children: [ - Expanded(child: RoundedButtonFill(title: "Skip".tr, onPress: () => _finish(), color: AppThemeData.grey50, textColor: AppThemeData.grey900)), + Expanded(child: RoundedButtonFill(title: "Skip".tr(), onPress: () => _finish(), color: AppThemeData.grey50, textColor: AppThemeData.grey900)), const SizedBox(width: 20), Expanded( child: RoundedButtonFill( - title: "Next".tr, + title: "Next".tr(), onPress: () { controller.nextPage(); }, diff --git a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart index 5764a23..527dfbf 100644 --- a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart +++ b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart @@ -9,6 +9,7 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_details_screen.da import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -32,7 +33,7 @@ class FavouriteOndemandScreen extends StatelessWidget { child: Row( children: [ const SizedBox(width: 10), - Text("Favourite Services".tr, style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey900 : AppThemeData.grey900, fontSize: 20)), + Text("Favourite Services".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey900 : AppThemeData.grey900, fontSize: 20)), ], ), ), @@ -49,16 +50,16 @@ class FavouriteOndemandScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr, + "You’re not logged in. Please sign in to access your account and explore all features.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr, + title: "Log in".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -74,7 +75,7 @@ class FavouriteOndemandScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: controller.lstFav.isEmpty - ? Constant.showEmptyView(message: "Favourite Service not found.".tr) + ? Constant.showEmptyView(message: "Favourite Service not found.".tr()) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, @@ -271,19 +272,19 @@ class FavouriteOndemandScreen extends StatelessWidget { Widget _buildPrice(ProviderServiceModel provider, {bool isDark = false}) { if (provider.disPrice == "" || provider.disPrice == "0") { return Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), ); } else { return Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), ), const SizedBox(width: 5), Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', style: const TextStyle(fontSize: 12, color: Colors.grey, decoration: TextDecoration.lineThrough), ), ], diff --git a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart index c52ab10..5b61b49 100644 --- a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart +++ b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart @@ -1,4 +1,5 @@ import 'package:cached_network_image/cached_network_image.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; @@ -29,7 +30,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, centerTitle: false, - title: Padding(padding: const EdgeInsets.only(bottom: 10), child: Text("Booking History".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))), + title: Padding(padding: const EdgeInsets.only(bottom: 10), child: Text("Booking History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))), bottom: PreferredSize( preferredSize: const Size.fromHeight(48), child: TabBar( @@ -54,7 +55,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No ride found".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center(child: Text("No ride found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); } return ListView.builder( @@ -124,7 +125,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { onProviderOrder.otp != null && onProviderOrder.otp!.isNotEmpty) Text( - "${'OTP :'.tr} ${onProviderOrder.otp}", + "${'OTP :'.tr()} ${onProviderOrder.otp}", style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ], @@ -155,7 +156,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { final price = hasDiscount ? order.provider.disPrice.toString() : order.provider.price.toString(); return Text( - order.provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: price) : "${Constant.amountShow(amount: price)}/${'hr'.tr}", + order.provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: price) : "${Constant.amountShow(amount: price)}/${'hr'.tr()}", style: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.primary300), ); } @@ -194,8 +195,8 @@ class MyBookingOnDemandScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(label.tr, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value.tr, style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(label.tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(value.tr(), style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart index 5ca8936..d073c77 100644 --- a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart @@ -1,5 +1,6 @@ import 'package:bottom_picker/bottom_picker.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; @@ -46,7 +47,7 @@ class OnDemandBookingScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Book Service".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Book Service".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -57,7 +58,7 @@ class OnDemandBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ // Services Section - Text("Services".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Services".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), const SizedBox(height: 10), Container( decoration: BoxDecoration( @@ -118,7 +119,7 @@ class OnDemandBookingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Address".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Address".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), SizedBox(height: 5), InkWell( onTap: () async { @@ -130,14 +131,14 @@ class OnDemandBookingScreen extends StatelessWidget { controller.selectedAddress.value = shippingAddress; controller.calculatePrice(); } else { - ShowToastDialog.showToast("Service not available in this area".tr); + ShowToastDialog.showToast("Service not available in this area".tr()); } } }); } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ShippingAddress shippingAddress = ShippingAddress(); @@ -205,7 +206,7 @@ class OnDemandBookingScreen extends StatelessWidget { ), ), const SizedBox(height: 15), - TextFieldWidget(title: "Description".tr, hintText: "Enter Description".tr, controller: controller.descriptionController.value, maxLine: 5), + TextFieldWidget(title: "Description".tr(), hintText: "Enter Description".tr(), controller: controller.descriptionController.value, maxLine: 5), const SizedBox(height: 10), GestureDetector( onTap: () { @@ -225,7 +226,7 @@ class OnDemandBookingScreen extends StatelessWidget { closeIconColor: isDark ? Colors.white : Colors.black, ).show(context); }, - child: TextFieldWidget(title: "Booking Date & Slot".tr, hintText: "Choose Date and Time".tr, controller: controller.dateTimeController.value, enable: false), + child: TextFieldWidget(title: "Booking Date & Slot".tr(), hintText: "Choose Date and Time".tr(), controller: controller.dateTimeController.value, enable: false), ), const SizedBox(height: 15), controller.provider.value?.priceUnit == "Fixed" @@ -248,7 +249,7 @@ class OnDemandBookingScreen extends StatelessWidget { buildPromoCode(controller, isDark), Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("Price Detail".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), priceTotalRow(controller, isDark), ], @@ -259,7 +260,7 @@ class OnDemandBookingScreen extends StatelessWidget { ), bottomNavigationBar: Padding( padding: const EdgeInsets.all(20.0), - child: RoundedButtonFill(title: "Confirm".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.confirmBooking(context)), + child: RoundedButtonFill(title: "Confirm".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.confirmBooking(context)), ), ); }, @@ -288,7 +289,7 @@ class OnDemandBookingScreen extends StatelessWidget { Container( margin: const EdgeInsets.only(top: 3), child: Text( - coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr}" : "${coupon.discount} ${'% Off'.tr}", + coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" : "${coupon.discount} ${'% Off'.tr()}", style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 0.7, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ), @@ -301,7 +302,7 @@ class OnDemandBookingScreen extends StatelessWidget { Text(coupon.code ?? '', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, letterSpacing: 0.5, color: Colors.orange)), Container(margin: const EdgeInsets.only(left: 15, right: 15, top: 3), width: 1, color: AppThemeData.grey50), Text( - "valid till ".tr + controller.getDate(coupon.expiresAt!.toDate().toString()), + "valid till ".tr() + controller.getDate(coupon.expiresAt!.toDate().toString()), style: TextStyle(letterSpacing: 0.5, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ], @@ -337,10 +338,10 @@ class OnDemandBookingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Promo Code".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), + Text("Promo Code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), const SizedBox(height: 5), Text( - "Apply promo code".tr, + "Apply promo code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis, ), @@ -402,12 +403,12 @@ class OnDemandBookingScreen extends StatelessWidget { Container(padding: const EdgeInsets.only(top: 30), child: const Image(image: AssetImage('assets/images/redeem_coupon.png'), width: 100)), Container( padding: const EdgeInsets.only(top: 20), - child: Text('Redeem Your Coupons'.tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + child: Text('Redeem Your Coupons'.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), ), Center( child: Container( padding: const EdgeInsets.only(top: 10, left: 22, right: 22), - child: Text("Voucher or Coupon code".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text("Voucher or Coupon code".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), ), Container( @@ -426,7 +427,7 @@ class OnDemandBookingScreen extends StatelessWidget { controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, - hintText: "Write Coupon Code".tr, + hintText: "Write Coupon Code".tr(), hintStyle: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400), ), ), @@ -437,7 +438,7 @@ class OnDemandBookingScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 30, bottom: 30, left: 15, right: 15), child: RoundedButtonFill( - title: "REDEEM NOW".tr, + title: "REDEEM NOW".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { @@ -449,7 +450,7 @@ class OnDemandBookingScreen extends StatelessWidget { controller.applyCoupon(matchingCoupon); Get.back(); } else { - ShowToastDialog.showToast("Applied coupon not valid.".tr); + ShowToastDialog.showToast("Applied coupon not valid.".tr()); } }, ), @@ -475,7 +476,7 @@ class OnDemandBookingScreen extends StatelessWidget { child: Column( children: [ const SizedBox(height: 5), - rowText("Price".tr, Constant.amountShow(amount: controller.price.value.toString()), isDark), + rowText("Price".tr(), Constant.amountShow(amount: controller.price.value.toString()), isDark), controller.discountAmount.value != 0 ? const Divider() : const SizedBox(), controller.discountAmount.value != 0 ? Padding( @@ -488,7 +489,7 @@ class OnDemandBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${"Discount".tr} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", + "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), Text(controller.offerCode.value, style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), @@ -501,7 +502,7 @@ class OnDemandBookingScreen extends StatelessWidget { ) : const SizedBox(), const Divider(), - rowText("SubTotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + rowText("SubTotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), const Divider(), ListView.builder( itemCount: Constant.taxList.length, @@ -534,7 +535,7 @@ class OnDemandBookingScreen extends StatelessWidget { ); }, ), - rowText("Total Amount".tr, Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + rowText("Total Amount".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), const SizedBox(height: 5), ], ), @@ -548,8 +549,8 @@ class OnDemandBookingScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title.tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value.tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(title.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(value.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart index 951ab38..80daba8 100644 --- a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/screen_ui/on_demand_service/view_category_service_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; @@ -41,9 +42,9 @@ class OnDemandCategoryScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Explore services".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Explore services".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), Text( - "Explore services tailored for you—quick, easy, and personalized.".tr, + "Explore services tailored for you—quick, easy, and personalized.".tr(), maxLines: 1, overflow: TextOverflow.ellipsis, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900), @@ -64,7 +65,7 @@ class OnDemandCategoryScreen extends StatelessWidget { child: Column( children: [ controller.categories.isEmpty - ? Center(child: Text("No Categories".tr)) + ? Center(child: Text("No Categories".tr())) : GridView.builder( padding: const EdgeInsets.all(5), itemCount: controller.categories.length, diff --git a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart index 74e2b49..47b5f9a 100644 --- a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart @@ -2,6 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -41,18 +42,18 @@ class OnDemandDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr, controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr(), controller: controller), + navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart index 98997ee..31b8c6c 100644 --- a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart @@ -1,6 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/screen_ui/on_demand_service/provider_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:get/get.dart'; @@ -35,7 +36,7 @@ class OnDemandDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ RoundedButtonFill( - title: "Book Now".tr, + title: "Book Now".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -81,7 +82,7 @@ class OnDemandDetailsScreen extends StatelessWidget { child: Container( decoration: BoxDecoration(borderRadius: BorderRadius.circular(40), color: controller.isOpen.value ? Colors.green : Colors.red), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(controller.isOpen.value ? "Open".tr : "Close".tr, style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.white, fontSize: 14)), + child: Text(controller.isOpen.value ? "Open".tr() : "Close".tr(), style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.white, fontSize: 14)), ), ), ], @@ -111,19 +112,19 @@ class OnDemandDetailsScreen extends StatelessWidget { children: [ provider.disPrice == "" || provider.disPrice == "0" ? Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', style: TextStyle(fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), ) : Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr()}', style: TextStyle(fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.grey, decoration: TextDecoration.lineThrough), ), ), @@ -153,7 +154,7 @@ class OnDemandDetailsScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "(${provider.reviewsCount} ${'Reviews'.tr})", + "(${provider.reviewsCount} ${'Reviews'.tr()})", style: TextStyle(letterSpacing: 0.5, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: isDark ? Colors.white : Colors.black), ), ], @@ -190,7 +191,7 @@ class OnDemandDetailsScreen extends StatelessWidget { builder: (context) => showTiming(context, controller, isDark), ); }, - child: Text("View Timing".tr, style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.green, letterSpacing: 0.5)), + child: Text("View Timing".tr(), style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.green, letterSpacing: 0.5)), ), ), ), @@ -253,7 +254,7 @@ class OnDemandDetailsScreen extends StatelessWidget { margin: const EdgeInsets.only(right: 10), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), decoration: BoxDecoration(color: controller.tabString.value == title ? AppThemeData.primary300 : Colors.grey.shade200, borderRadius: BorderRadius.circular(10)), - child: Text(title.tr, style: TextStyle(fontWeight: FontWeight.bold, color: controller.tabString.value == title ? Colors.white : Colors.black)), + child: Text(title.tr(), style: TextStyle(fontWeight: FontWeight.bold, color: controller.tabString.value == title ? Colors.white : Colors.black)), ), ); } @@ -264,7 +265,7 @@ class OnDemandDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text((providerModel.description ?? '').tr, style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), + Text((providerModel.description ?? '').tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), const SizedBox(height: 10), Obx(() { final user = controller.userModel.value; @@ -339,7 +340,7 @@ class OnDemandDetailsScreen extends StatelessWidget { final photos = controller.provider.photos; if (photos.isEmpty) { - return Center(child: Text("No Image Found".tr)); + return Center(child: Text("No Image Found".tr())); } return GridView.builder( @@ -373,7 +374,7 @@ class OnDemandDetailsScreen extends StatelessWidget { final reviews = controller.ratingService; if (reviews.isEmpty) { - return SizedBox(height: 200, child: Center(child: Text("No review Found".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)))); + return SizedBox(height: 200, child: Center(child: Text("No review Found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)))); } return ListView.builder( @@ -439,21 +440,21 @@ class OnDemandDetailsScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - child: Text("Service Timing".tr, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + child: Text("Service Timing".tr(), style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), ), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), child: Row( children: [ - Expanded(child: _timeCard(context, "Start Time : ".tr, provider.startTime.toString(), isDark)), + Expanded(child: _timeCard(context, "Start Time : ".tr(), provider.startTime.toString(), isDark)), const SizedBox(width: 10), - Expanded(child: _timeCard(context, "End Time : ".tr, provider.endTime.toString(), isDark)), + Expanded(child: _timeCard(context, "End Time : ".tr(), provider.endTime.toString(), isDark)), ], ), ), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - child: Text("Service Days".tr, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + child: Text("Service Days".tr(), style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), diff --git a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart index 0a7f050..fbe5aa6 100644 --- a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart @@ -15,6 +15,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:geocoding/geocoding.dart'; @@ -60,7 +61,7 @@ class OnDemandHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Constant.userModel == null - ? InkWell(onTap: () => Get.offAll(const LoginScreen()), child: Text("Login".tr, style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12))) + ? InkWell(onTap: () => Get.offAll(const LoginScreen()), child: Text("Login".tr(), style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12))) : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12)), InkWell( onTap: () async { @@ -75,7 +76,7 @@ class OnDemandHomeScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); // ✅ declare it once here! ShippingAddress shippingAddress = ShippingAddress(); @@ -165,16 +166,16 @@ class OnDemandHomeScreen extends StatelessWidget { children: [ Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("No Store Found in Your Area".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr, + "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Change Zone".tr, + title: "Change Zone".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -203,7 +204,7 @@ class OnDemandHomeScreen extends StatelessWidget { ), child: controller.categories.isEmpty - ? Constant.showEmptyView(message: "No Categories".tr) + ? Constant.showEmptyView(message: "No Categories".tr()) : Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Row( @@ -240,7 +241,7 @@ class OnDemandHomeScreen extends StatelessWidget { width: 70, child: Center( child: Text( - "View All".tr, + "View All".tr(), textAlign: TextAlign.center, maxLines: 1, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), @@ -260,7 +261,7 @@ class OnDemandHomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Most Popular services".tr, + "Most Popular services".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w600), ), ), @@ -268,13 +269,13 @@ class OnDemandHomeScreen extends StatelessWidget { onTap: () { Get.to(() => ViewAllPopularServiceScreen()); }, - child: Text("View all".tr, style: TextStyle(color: AppThemeData.primary300, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w600)), + child: Text("View all".tr(), style: TextStyle(color: AppThemeData.primary300, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w600)), ), ], ), ), controller.providerList.isEmpty - ? Center(child: Text("No Services Found".tr)) + ? Center(child: Text("No Services Found".tr())) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, @@ -492,14 +493,14 @@ class ServiceView extends StatelessWidget { Widget _buildPrice() { if (provider.disPrice == "" || provider.disPrice == "0") { return Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), ); } else { return Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr}', + provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), ), const SizedBox(width: 6), diff --git a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart index f7723bc..95c1555 100644 --- a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart @@ -1,5 +1,6 @@ import 'package:clipboard/clipboard.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; @@ -42,7 +43,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Order Details".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -68,7 +69,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Cancel Reason'.tr, style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text('Cancel Reason'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text(controller.onProviderOrder.value?.reason ?? '', style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.danger300)), ], ), @@ -89,13 +90,13 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('Booking ID'.tr, style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text('Booking ID'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), InkWell( onTap: () { FlutterClipboard.copy(controller.onProviderOrder.value?.id ?? '').then((value) { SnackBar snackBar = SnackBar( content: Text( - "Booking ID Copied".tr, + "Booking ID Copied".tr(), textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -110,7 +111,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), SizedBox(height: 10), Text( - "${'Booking Address :'.tr} ${controller.onProviderOrder.value?.address?.getFullAddress()}", + "${'Booking Address :'.tr()} ${controller.onProviderOrder.value?.address?.getFullAddress()}", style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ], @@ -159,7 +160,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 6), - child: Text('${'Date:'.tr} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text('${'Date:'.tr()} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), Padding( padding: const EdgeInsets.only(top: 6), @@ -176,7 +177,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 6), - child: Text('${'Time:'.tr} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text('${'Time:'.tr()} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), Padding( padding: const EdgeInsets.only(top: 6), @@ -205,7 +206,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text('About Worker'.tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text('About Worker'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), Container( decoration: BoxDecoration( @@ -302,7 +303,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { }, style: ElevatedButton.styleFrom(backgroundColor: Colors.orange, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), - child: Text('Add Review'.tr, style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text('Add Review'.tr(), style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), ), ), @@ -327,7 +328,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Icon(Icons.call, color: AppThemeData.grey50), SizedBox(width: 10), - Text('Call'.tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text('Call'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), ], ), ), @@ -336,7 +337,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Expanded( child: ElevatedButton( onPressed: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ShowToastDialog.closeLoader(); Get.to( @@ -361,7 +362,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Icon(Icons.chat_bubble, color: AppThemeData.grey50), SizedBox(width: 10), - Text('Chat'.tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text('Chat'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), ], ), ), @@ -379,7 +380,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : SizedBox(), Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("About provider".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text("About provider".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), Container( decoration: BoxDecoration( @@ -458,7 +459,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { } }, style: ElevatedButton.styleFrom(backgroundColor: Colors.orange, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), - child: Text('Add Review'.tr, style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text('Add Review'.tr(), style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), ), ), @@ -483,7 +484,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Icon(Icons.call, color: AppThemeData.grey50), SizedBox(width: 10), - Text('Call'.tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text('Call'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), ], ), ), @@ -498,7 +499,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Expanded( child: ElevatedButton( onPressed: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ShowToastDialog.closeLoader(); @@ -524,7 +525,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Icon(Icons.chat_bubble, color: AppThemeData.grey50), SizedBox(width: 10), - Text('Chat'.tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text('Chat'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), ], ), ), @@ -544,7 +545,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("Price Detail".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), priceTotalRow(controller, isDark), ], @@ -574,7 +575,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : Offstage(), Padding( padding: EdgeInsets.symmetric(vertical: 16), - child: Text("Price Detail".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), priceTotalRow(controller, isDark), ], @@ -594,7 +595,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Total Extra Charges : ".tr, style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), + Text("Total Extra Charges : ".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), Text( Constant.amountShow(amount: controller.onProviderOrder.value?.extraCharges.toString()), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), @@ -607,7 +608,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Extra charge Notes : ".tr, + "Extra charge Notes : ".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), ), ), @@ -640,7 +641,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { controller.onProviderOrder.value?.newScheduleDateTime != null ? Row( children: [ - Text("New Date : ".tr, style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), + Text("New Date : ".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), Text( DateFormat('dd-MMM-yyyy hh:mm a').format(controller.onProviderOrder.value!.newScheduleDateTime!.toDate()), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), @@ -652,7 +653,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ? Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( - title: "Cancel Booking".tr, + title: "Cancel Booking".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { @@ -672,7 +673,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ? Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( - title: 'Pay Extra Amount'.tr, + title: 'Pay Extra Amount'.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -689,7 +690,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( - title: 'Pay Now'.tr, + title: 'Pay Now'.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -738,7 +739,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Container( margin: const EdgeInsets.only(top: 3), child: Text( - coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr}" : "${coupon.discount} ${'% Off'.tr}", + coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" : "${coupon.discount} ${'% Off'.tr()}", style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 0.7, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ), @@ -751,7 +752,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Text(coupon.code ?? '', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, letterSpacing: 0.5, color: Colors.orange)), Container(margin: const EdgeInsets.only(left: 15, right: 15, top: 3), width: 1, color: AppThemeData.grey50), Text( - "valid till ".tr + controller.getDate(coupon.expiresAt!.toDate().toString()), + "valid till ".tr() + controller.getDate(coupon.expiresAt!.toDate().toString()), style: TextStyle(letterSpacing: 0.5, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ], @@ -787,10 +788,10 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Promo Code".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), + Text("Promo Code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), const SizedBox(height: 5), Text( - "Apply promo code".tr, + "Apply promo code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis, ), @@ -846,12 +847,12 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Container(padding: const EdgeInsets.only(top: 30), child: const Image(image: AssetImage('assets/images/redeem_coupon.png'), width: 100)), Container( padding: const EdgeInsets.only(top: 20), - child: Text('Redeem Your Coupons'.tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + child: Text('Redeem Your Coupons'.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), ), Center( child: Container( padding: const EdgeInsets.only(top: 10, left: 22, right: 22), - child: Text("Voucher or Coupon code".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text("Voucher or Coupon code".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ), ), Container( @@ -870,7 +871,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, - hintText: "Write Coupon Code".tr, + hintText: "Write Coupon Code".tr(), hintStyle: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400), ), ), @@ -881,7 +882,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 30, bottom: 30, left: 15, right: 15), child: RoundedButtonFill( - title: "REDEEM NOW".tr, + title: "REDEEM NOW".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { @@ -899,7 +900,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { }); } else { print("❌ No matching coupon found"); - ShowToastDialog.showToast("Applied coupon not valid.".tr); + ShowToastDialog.showToast("Applied coupon not valid.".tr()); } }, ), @@ -926,7 +927,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 5), rowText( - "Price".tr, + "Price".tr(), //Constant.amountShow(amount: controller.price.value.toString()), controller.onProviderOrder.value?.provider.disPrice == "" || controller.onProviderOrder.value?.provider.disPrice == "0" ? "${Constant.amountShow(amount: controller.onProviderOrder.value?.provider.price.toString())} × ${controller.onProviderOrder.value?.quantity.toStringAsFixed(2)} ${Constant.amountShow(amount: controller.price.value.toString())}" @@ -945,7 +946,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${"Discount".tr} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", + "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), Text(controller.offerCode.value, style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), @@ -958,7 +959,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ) : const SizedBox(), const Divider(), - rowText("SubTotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + rowText("SubTotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), const Divider(), ListView.builder( itemCount: Constant.taxList.length, @@ -992,7 +993,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { }, ), // Total Amount - rowText("Total Amount".tr, Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + rowText("Total Amount".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), const SizedBox(height: 5), ], ), @@ -1017,23 +1018,23 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { return Get.dialog( AlertDialog( backgroundColor: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - title: Text('Please give reason for canceling this Booking'.tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + title: Text('Please give reason for canceling this Booking'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), content: TextFormField( controller: controller.cancelBookingController.value, maxLines: 5, - decoration: InputDecoration(hintText: "Specify your reason here".tr, border: OutlineInputBorder(borderRadius: BorderRadius.circular(7))), + decoration: InputDecoration(hintText: "Specify your reason here".tr(), border: OutlineInputBorder(borderRadius: BorderRadius.circular(7))), ), actions: [ - TextButton(onPressed: () => Get.back(), child: Text('Cancel'.tr, style: TextStyle(color: Colors.red))), + TextButton(onPressed: () => Get.back(), child: Text('Cancel'.tr(), style: TextStyle(color: Colors.red))), TextButton( onPressed: () async { if (controller.cancelBookingController.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter reason".tr); + ShowToastDialog.showToast("Please enter reason".tr()); } else { await controller.cancelBooking(); } }, - child: Text('Continue'.tr, style: TextStyle(color: Colors.green)), + child: Text('Continue'.tr(), style: TextStyle(color: Colors.green)), ), ], ), diff --git a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart index 1ea95bd..dd6854a 100644 --- a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart @@ -1,4 +1,5 @@ import 'package:customer/constant/constant.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../controllers/0n_demand_payment_controller.dart'; @@ -39,7 +40,7 @@ class OnDemandPaymentScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Select Payment Method".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Select Payment Method".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -54,7 +55,7 @@ class OnDemandPaymentScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) Container( @@ -84,7 +85,7 @@ class OnDemandPaymentScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - "Other Payment Options".tr, + "Other Payment Options".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), ), @@ -132,7 +133,7 @@ class OnDemandPaymentScreen extends StatelessWidget { ), SizedBox(height: 20), RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { @@ -156,9 +157,9 @@ class OnDemandPaymentScreen extends StatelessWidget { double walletAmount = double.tryParse(Constant.userModel?.walletAmount?.toString() ?? "0") ?? 0; if (walletAmount == 0) { - ShowToastDialog.showToast("Wallet balance is 0. Please recharge wallet.".tr); + ShowToastDialog.showToast("Wallet balance is 0. Please recharge wallet.".tr()); } else if (walletAmount < totalAmount) { - ShowToastDialog.showToast("Insufficient wallet balance. Please add funds.".tr); + ShowToastDialog.showToast("Insufficient wallet balance. Please add funds.".tr()); } else { controller.placeOrder(); } @@ -176,7 +177,7 @@ class OnDemandPaymentScreen extends StatelessWidget { RazorPayController().createOrderRazorPay(amount: double.parse("${controller.totalAmount.value}"), razorpayModel: controller.razorPayModel.value).then((value) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: "${controller.totalAmount.value}", orderId: result.id); @@ -184,7 +185,7 @@ class OnDemandPaymentScreen extends StatelessWidget { }); } else { controller.isOrderPlaced.value = false; - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast("Please select payment method".tr()); } controller.isOrderPlaced.value = false; } diff --git a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart index a147698..f108a20 100644 --- a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:get/get.dart'; @@ -38,7 +39,7 @@ class OnDemandReviewScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text(controller.ratingModel.value != null ? "Update Review".tr : "Add Review".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text(controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -62,7 +63,7 @@ class OnDemandReviewScreen extends StatelessWidget { padding: const EdgeInsets.only(top: 65), child: Column( children: [ - Text('Rate for'.tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text('Rate for'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( controller.reviewFor.value == "Provider" ? controller.order.value!.provider.authorName ?? "" : controller.workerModel.value!.fullName(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), @@ -83,11 +84,11 @@ class OnDemandReviewScreen extends StatelessWidget { }, ), ), - Padding(padding: EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr, controller: controller.comment, maxLine: 5)), + Padding(padding: EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr(), controller: controller.comment, maxLine: 5)), Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review".tr : "Add Review".tr, + title: controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: controller.submitReview, diff --git a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart index 617c526..d582fc2 100644 --- a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart @@ -8,6 +8,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dart'; import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -27,7 +28,7 @@ class ProviderInboxScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Provider Inbox".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Provider Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: FirestorePagination( //item builder type is compulsory. @@ -37,7 +38,7 @@ class ProviderInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); @@ -113,7 +114,7 @@ class ProviderInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance.collection('chat_provider').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), //Change types customerId diff --git a/lib/screen_ui/on_demand_service/provider_screen.dart b/lib/screen_ui/on_demand_service/provider_screen.dart index 9290009..02e9936 100644 --- a/lib/screen_ui/on_demand_service/provider_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_screen.dart @@ -1,5 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -86,7 +87,7 @@ class ProviderScreen extends StatelessWidget { const Divider(), const SizedBox(height: 10), controller.providerList.isEmpty - ? Center(child: Text("No Services Found".tr)) + ? Center(child: Text("No Services Found".tr())) : Expanded( child: ListView.builder( itemCount: controller.providerList.length, diff --git a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart index 67a35cc..b180048 100644 --- a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart @@ -1,4 +1,5 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; @@ -36,7 +37,7 @@ class ViewAllPopularServiceScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("All Services".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("All Services".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -48,10 +49,10 @@ class ViewAllPopularServiceScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), child: Column( children: [ - TextFieldWidget(hintText: "Search Service".tr, controller: controller.searchTextFiledController.value, onchange: (value) => controller.getFilterData(value.toString())), + TextFieldWidget(hintText: "Search Service".tr(), controller: controller.searchTextFiledController.value, onchange: (value) => controller.getFilterData(value.toString())), const SizedBox(height: 15), controller.providerList.isEmpty - ? Expanded(child: Center(child: Constant.showEmptyView(message: "No service Found".tr))) + ? Expanded(child: Center(child: Constant.showEmptyView(message: "No service Found".tr()))) : Expanded( child: ListView.builder( itemCount: controller.providerList.length, diff --git a/lib/screen_ui/on_demand_service/view_category_service_screen.dart b/lib/screen_ui/on_demand_service/view_category_service_screen.dart index ae5be3d..e86e7d9 100644 --- a/lib/screen_ui/on_demand_service/view_category_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_category_service_screen.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; @@ -45,7 +46,7 @@ class ViewCategoryServiceListScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.providerList.isEmpty - ? Constant.showEmptyView(message: "No Service Found".tr) + ? Constant.showEmptyView(message: "No Service Found".tr()) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: ListView.builder( diff --git a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart index acbe6ca..4b32e36 100644 --- a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart @@ -8,6 +8,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dart'; import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -27,7 +28,7 @@ class WorkerInboxScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Worker Inbox".tr, textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text("Worker Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), ), body: FirestorePagination( //item builder type is compulsory. @@ -37,7 +38,7 @@ class WorkerInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); @@ -114,7 +115,7 @@ class WorkerInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance.collection('chat_worker').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), //Change types customerId diff --git a/lib/screen_ui/parcel_service/book_parcel_screen.dart b/lib/screen_ui/parcel_service/book_parcel_screen.dart index 084b6b7..e60a814 100644 --- a/lib/screen_ui/parcel_service/book_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/book_parcel_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:dropdown_textfield/dropdown_textfield.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; @@ -51,9 +52,9 @@ class BookParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Book Your Document Delivery".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Book Your Document Delivery".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), Text( - "Schedule a secure and timely pickup & delivery".tr, + "Schedule a secure and timely pickup & delivery".tr(), maxLines: 1, overflow: TextOverflow.ellipsis, style: AppThemeData.mediumTextStyle(fontSize: 12, color: AppThemeData.grey900), @@ -78,7 +79,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 16), buildInfoSectionView( - title: "Sender Information".tr, + title: "Sender Information".tr(), locationController: controller.senderLocationController.value, nameController: controller.senderNameController.value, mobileController: controller.senderMobileController.value, @@ -101,7 +102,7 @@ class BookParcelScreen extends StatelessWidget { controller.senderLocationController.value.text = address; // ✅ controller.senderLocation.value = UserLocation(latitude: lat, longitude: lng); // ✅ <-- Add this } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); } } } else { @@ -113,7 +114,7 @@ class BookParcelScreen extends StatelessWidget { controller.senderLocationController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); controller.senderLocation.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); } // ✅ <-- Add this } @@ -123,7 +124,7 @@ class BookParcelScreen extends StatelessWidget { ), const SizedBox(height: 16), buildInfoSectionView( - title: "Receiver Information".tr, + title: "Receiver Information".tr(), locationController: controller.receiverLocationController.value, nameController: controller.receiverNameController.value, mobileController: controller.receiverMobileController.value, @@ -147,7 +148,7 @@ class BookParcelScreen extends StatelessWidget { controller.receiverLocationController.value.text = address; // ✅ controller.receiverLocation.value = UserLocation(latitude: lat, longitude: lng); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); } } } else { @@ -159,7 +160,7 @@ class BookParcelScreen extends StatelessWidget { controller.receiverLocationController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); controller.receiverLocation.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); // ✅ <-- Add this } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); } } }); @@ -170,7 +171,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 15), RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), onPress: () { controller.bookNow(); }, @@ -197,7 +198,7 @@ class BookParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Select delivery type".tr, style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text("Select delivery type".tr(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), const SizedBox(height: 10), InkWell( onTap: () { @@ -208,7 +209,7 @@ class BookParcelScreen extends StatelessWidget { children: [ Image.asset("assets/images/image_parcel.png", height: 38, width: 38), const SizedBox(width: 20), - Expanded(child: Text("As soon as possible".tr, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), + Expanded(child: Text("As soon as possible".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), Icon( controller.selectedDeliveryType.value == 'now' ? Icons.radio_button_checked : Icons.radio_button_off, color: controller.selectedDeliveryType.value == 'now' ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), @@ -229,7 +230,7 @@ class BookParcelScreen extends StatelessWidget { children: [ Image.asset("assets/images/image_parcel_scheduled.png", height: 38, width: 38), const SizedBox(width: 20), - Expanded(child: Text("Scheduled".tr, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), + Expanded(child: Text("Scheduled".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), Icon( controller.selectedDeliveryType.value == 'later' ? Icons.radio_button_checked : Icons.radio_button_off, color: controller.selectedDeliveryType.value == 'later' ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), @@ -242,7 +243,7 @@ class BookParcelScreen extends StatelessWidget { GestureDetector( onTap: () => controller.pickScheduledDate(context), child: TextFieldWidget( - hintText: "When to pickup at this address".tr, + hintText: "When to pickup at this address".tr(), controller: controller.scheduledDateController.value, enable: false, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, @@ -254,7 +255,7 @@ class BookParcelScreen extends StatelessWidget { GestureDetector( onTap: () => controller.pickScheduledTime(context), child: TextFieldWidget( - hintText: "When to pickup at this address".tr, + hintText: "When to pickup at this address".tr(), controller: controller.scheduledTimeController.value, enable: false, // onchange: (v) => controller.pickScheduledTime(context), @@ -283,7 +284,7 @@ class BookParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Upload parcel image".tr, style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text("Upload parcel image".tr(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), const SizedBox(height: 10), DottedBorder( options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300), @@ -296,13 +297,13 @@ class BookParcelScreen extends StatelessWidget { children: [ SvgPicture.asset("assets/icons/ic_upload_parcel.svg", height: 40, width: 40), const SizedBox(height: 10), - Text("Upload Parcel Image".tr, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Upload Parcel Image".tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), const SizedBox(height: 4), - Text("Supported: .jpg, .jpeg, .png".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text("Max size 1MB".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text("Supported: .jpg, .jpeg, .png".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text("Max size 1MB".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), const SizedBox(height: 8), RoundedButtonFill( - title: "Browse Image".tr, + title: "Browse Image".tr(), onPress: () { controller.onCameraClick(Get.context!); }, @@ -378,7 +379,7 @@ class BookParcelScreen extends StatelessWidget { GestureDetector( onTap: onTap, child: TextFieldWidget( - hintText: "Your Location".tr, + hintText: "Your Location".tr(), controller: locationController, suffix: const Padding(padding: EdgeInsets.only(right: 10), child: Icon(Icons.location_on_outlined)), @@ -390,7 +391,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( - hintText: "Name".tr, + hintText: "Name".tr(), controller: nameController, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, @@ -398,7 +399,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( - hintText: "Enter Mobile number".tr, + hintText: "Enter Mobile number".tr(), controller: mobileController, textInputType: TextInputType.number, inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]')), LengthLimitingTextInputFormatter(10)], @@ -435,7 +436,7 @@ class BookParcelScreen extends StatelessWidget { clearOption: false, enableSearch: false, textFieldDecoration: InputDecoration( - hintText: "Select parcel Weight".tr, + hintText: "Select parcel Weight".tr(), hintStyle: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.greyDark400), filled: true, fillColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, @@ -447,8 +448,8 @@ class BookParcelScreen extends StatelessWidget { dropDownList: controller.parcelWeight.map((e) { return DropDownValueModel( - name: e.title ?? 'Normal'.tr, - value: e.title ?? 'Normal'.tr, // safer to use title string + name: e.title ?? 'Normal'.tr(), + value: e.title ?? 'Normal'.tr(), // safer to use title string ); }).toList(), onChanged: (val) { @@ -464,7 +465,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( - hintText: "Notes (Optional)".tr, + hintText: "Notes (Optional)".tr(), controller: noteController, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, diff --git a/lib/screen_ui/parcel_service/home_parcel_screen.dart b/lib/screen_ui/parcel_service/home_parcel_screen.dart index dd91551..16e2437 100644 --- a/lib/screen_ui/parcel_service/home_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/home_parcel_screen.dart @@ -1,4 +1,5 @@ import 'package:customer/constant/constant.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; @@ -59,7 +60,7 @@ class HomeParcelScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + child: Text("Login".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), ) : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), InkWell( @@ -74,7 +75,7 @@ class HomeParcelScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); ShippingAddress shippingAddress = ShippingAddress(); @@ -159,7 +160,7 @@ class HomeParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("What are you sending?".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("What are you sending?".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), const SizedBox(height: 12), Container( decoration: BoxDecoration( diff --git a/lib/screen_ui/parcel_service/my_booking_screen.dart b/lib/screen_ui/parcel_service/my_booking_screen.dart index 2b6a99b..c1f00d5 100644 --- a/lib/screen_ui/parcel_service/my_booking_screen.dart +++ b/lib/screen_ui/parcel_service/my_booking_screen.dart @@ -1,6 +1,7 @@ import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/screen_ui/parcel_service/parcel_order_details.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; @@ -29,7 +30,7 @@ class MyBookingScreen extends StatelessWidget { backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text("Parcel History".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row(children: [const SizedBox(width: 10), Text("Parcel History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), ), bottom: TabBar( // don't re-subscribe onTap — just update selectedTab (optional) @@ -55,16 +56,16 @@ class MyBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Please Log In to Continue".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr, + "You’re not logged in. Please sign in to access your account and explore all features.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr, + title: "Log in".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -82,7 +83,7 @@ class MyBookingScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No orders found".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center(child: Text("No orders found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); } return ListView.builder( @@ -108,7 +109,7 @@ class MyBookingScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( - "${'Order Date:'.tr}${order.isSchedule == true ? controller.formatDate(order.createdAt!) : controller.formatDate(order.senderPickupDateTime!)}", + "${'Order Date:'.tr()}${order.isSchedule == true ? controller.formatDate(order.createdAt!) : controller.formatDate(order.senderPickupDateTime!)}", style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), ), ), @@ -140,7 +141,7 @@ class MyBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ _infoSection( - "Pickup Address (Sender):".tr, + "Pickup Address (Sender):".tr(), order.sender?.name ?? '', order.sender?.address ?? '', order.sender?.phone ?? '', @@ -152,7 +153,7 @@ class MyBookingScreen extends StatelessWidget { ), const SizedBox(height: 16), _infoSection( - "Delivery Address (Receiver):".tr, + "Delivery Address (Receiver):".tr(), order.receiver?.name ?? '', order.receiver?.address ?? '', order.receiver?.phone ?? '', diff --git a/lib/screen_ui/parcel_service/order_successfully_placed.dart b/lib/screen_ui/parcel_service/order_successfully_placed.dart index 9379cf1..a4ff870 100644 --- a/lib/screen_ui/parcel_service/order_successfully_placed.dart +++ b/lib/screen_ui/parcel_service/order_successfully_placed.dart @@ -1,4 +1,5 @@ import 'package:customer/screen_ui/parcel_service/parcel_dashboard_screen.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:customer/themes/app_them_data.dart'; @@ -28,7 +29,7 @@ class OrderSuccessfullyPlaced extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( - "Your Order Has Been Placed!".tr, + "Your Order Has Been Placed!".tr(), style: AppThemeData.boldTextStyle(fontSize: 22, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), textAlign: TextAlign.center, ), @@ -37,14 +38,14 @@ class OrderSuccessfullyPlaced extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - "We’ve received your parcel booking and it’s now being processed. You can track its status in real time.".tr, + "We’ve received your parcel booking and it’s now being processed. You can track its status in real time.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), textAlign: TextAlign.center, ), ), const SizedBox(height: 30), RoundedButtonFill( - title: "Track Your Order".tr, + title: "Track Your Order".tr(), onPress: () { print("Tracking Order: $parcelOrder"); //Get.to(() => TrackOrderScreen(), arguments: {'order': parcelOrder}); diff --git a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart index 6de1f4c..7c372ae 100644 --- a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -37,7 +38,7 @@ class ParcelCouponScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Coupon".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Coupon".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -46,7 +47,7 @@ class ParcelCouponScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.cabCouponList.isEmpty - ? Constant.showEmptyView(message: "Coupon not found".tr) + ? Constant.showEmptyView(message: "Coupon not found".tr()) : ListView.builder( shrinkWrap: true, itemCount: controller.cabCouponList.length, @@ -71,7 +72,7 @@ class ParcelCouponScreen extends StatelessWidget { child: RotatedBox( quarterTurns: -1, child: Text( - "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", + "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), ), @@ -106,7 +107,7 @@ class ParcelCouponScreen extends StatelessWidget { Get.back(result: couponModel); }, child: Text( - "Tap To Apply".tr, + "Tap To Apply".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), diff --git a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart index 9058bc3..97744c2 100644 --- a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart @@ -2,6 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/parcel_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -39,15 +40,15 @@ class ParcelDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr(), controller: controller), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_parcel.svg", label: 'Wallet'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_parcel.svg", label: 'Wallet'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr(), controller: controller), ], ), ); @@ -62,8 +63,8 @@ class ParcelDashboardScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 5), child: SvgPicture.asset( assetIcon, - height: label == 'Wallet'.tr ? 18 : 22, - width: label == 'Wallet'.tr ? 18 : 22, + height: label == 'Wallet'.tr() ? 18 : 22, + width: label == 'Wallet'.tr() ? 18 : 22, color: controller.selectedIndex.value == index ? isDark diff --git a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart index 6c54262..a53ea1a 100644 --- a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart +++ b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart @@ -1,6 +1,7 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/screen_ui/parcel_service/parcel_coupon_screen.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; @@ -42,7 +43,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Order Confirmation".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Order Confirmation".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -93,7 +94,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ _infoSection( - "Pickup Address (Sender):".tr, + "Pickup Address (Sender):".tr(), controller.parcelOrder.value.sender?.name ?? '', controller.parcelOrder.value.sender?.address ?? '', controller.parcelOrder.value.sender?.phone ?? '', @@ -104,7 +105,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), const SizedBox(height: 16), _infoSection( - "Delivery Address (Receiver):".tr, + "Delivery Address (Receiver):".tr(), controller.parcelOrder.value.receiver?.name ?? '', controller.parcelOrder.value.receiver?.address ?? '', controller.parcelOrder.value.receiver?.phone ?? '', @@ -131,9 +132,9 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr}", "Distance".tr, "assets/icons/ic_distance_parcel.svg", isDark), - _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr, "assets/icons/ic_weight_parcel.svg", isDark), - _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr, "assets/icons/ic_rate_parcel.svg", isDark), + _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr()}", "Distance".tr(), "assets/icons/ic_distance_parcel.svg", isDark), + _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr(), "assets/icons/ic_weight_parcel.svg", isDark), + _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr(), "assets/icons/ic_rate_parcel.svg", isDark), ], ), ), @@ -142,7 +143,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text("Coupons".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded(child: Text("Coupons".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), InkWell( onTap: () { Get.to(ParcelCouponScreen())!.then((value) { @@ -152,13 +153,13 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { controller.selectedCouponModel.value = value; controller.calculatePrice(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast("This offer not eligible for this booking".tr()); } } }); }, child: Text( - "View All".tr, + "View All".tr(), style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), ), @@ -181,14 +182,14 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { controller: controller.couponController.value, style: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), decoration: InputDecoration( - hintText: "Write coupon code".tr, + hintText: "Write coupon code".tr(), hintStyle: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.parcelService500), border: InputBorder.none, ), ), ), RoundedButtonFill( - title: "Redeem now".tr, + title: "Redeem now".tr(), onPress: () { if (controller.couponList.where((element) => element.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()).isNotEmpty) { CouponModel couponModel = controller.couponList.firstWhere((p0) => p0.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()); @@ -199,13 +200,13 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { controller.calculatePrice(); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast("This offer not eligible for this booking".tr()); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr); + ShowToastDialog.showToast("This coupon code has been expired".tr()); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr); + ShowToastDialog.showToast("Invalid coupon code".tr()); } }, borderRadius: 10, @@ -230,14 +231,14 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), + _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), // Discount - _summaryTile("Discount".tr, "-${Constant.amountShow(amount: controller.discount.value.toString())}", isDark, AppThemeData.dangerDark300), + _summaryTile("Discount".tr(), "-${Constant.amountShow(amount: controller.discount.value.toString())}", isDark, AppThemeData.dangerDark300), // Tax List ...List.generate(Constant.taxList.length, (index) { @@ -251,7 +252,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { const Divider(), // Total - _summaryTile("Order Total".tr, Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), ], ), ), @@ -267,7 +268,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ // Title - Text("Payment by".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Payment by".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 12), // Row with Sender and Receiver options @@ -284,7 +285,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { size: 20, ), const SizedBox(width: 6), - Text("Sender".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text("Sender".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), ], ), ), @@ -302,7 +303,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { size: 20, ), const SizedBox(width: 6), - Text("Receiver".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text("Receiver".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), ], ), ), @@ -316,7 +317,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Continue button RoundedButtonFill( - title: controller.paymentBy.value == "Sender" ? "Select Payment Method".tr : "Continue".tr, + title: controller.paymentBy.value == "Sender" ? "Select Payment Method".tr() : "Continue".tr(), onPress: () async { if (controller.paymentBy.value == "Sender") { Get.bottomSheet( @@ -394,7 +395,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), GestureDetector( onTap: () { Get.back(); @@ -408,7 +409,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: ListView( controller: scrollController, children: [ - Text("Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) Container( @@ -434,7 +435,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), ), if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) const SizedBox(height: 10), - Text("Other Payment Options".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Other Payment Options".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), Container( decoration: BoxDecoration( @@ -474,7 +475,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), color: AppThemeData.taxiBooking300, textColor: AppThemeData.grey900, onPress: () async { @@ -496,7 +497,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { double walletBalance = double.tryParse(controller.userModel.value.walletAmount.toString()) ?? 0.0; double amountToPay = double.tryParse(controller.totalAmount.value.toString()) ?? 0.0; if (walletBalance < amountToPay) { - ShowToastDialog.showToast("Insufficient wallet balance".tr); + ShowToastDialog.showToast("Insufficient wallet balance".tr()); return; } controller.placeOrder(); @@ -514,14 +515,14 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); } }); } else { - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast("Please select payment method".tr()); } }, ), diff --git a/lib/screen_ui/parcel_service/parcel_order_details.dart b/lib/screen_ui/parcel_service/parcel_order_details.dart index b3f6fd9..8c75859 100644 --- a/lib/screen_ui/parcel_service/parcel_order_details.dart +++ b/lib/screen_ui/parcel_service/parcel_order_details.dart @@ -1,5 +1,6 @@ import 'package:customer/screen_ui/parcel_service/parcel_review_screen.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; @@ -48,9 +49,9 @@ class ParcelOrderDetails extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Details".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), Text( - "Your parcel is on the way. Track it in real time below.".tr, + "Your parcel is on the way. Track it in real time below.".tr(), maxLines: 1, overflow: TextOverflow.ellipsis, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey900), @@ -79,7 +80,7 @@ class ParcelOrderDetails extends StatelessWidget { width: double.infinity, padding: const EdgeInsets.all(16), child: Text( - "${'Order Id:'.tr} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}".tr, + "${'Order Id:'.tr()} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), ), @@ -125,7 +126,7 @@ class ParcelOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ _infoSection( - "Pickup Address (Sender):".tr, + "Pickup Address (Sender):".tr(), controller.parcelOrder.value.sender?.name ?? '', controller.parcelOrder.value.sender?.address ?? '', controller.parcelOrder.value.sender?.phone ?? '', @@ -136,7 +137,7 @@ class ParcelOrderDetails extends StatelessWidget { ), const SizedBox(height: 16), _infoSection( - "Delivery Address (Receiver):".tr, + "Delivery Address (Receiver):".tr(), controller.parcelOrder.value.receiver?.name ?? '', controller.parcelOrder.value.receiver?.address ?? '', controller.parcelOrder.value.receiver?.phone ?? '', @@ -157,7 +158,7 @@ class ParcelOrderDetails extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( - "${'Schedule Pickup time:'.tr} ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", + "${'Schedule Pickup time:'.tr()} ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), ), ), @@ -165,7 +166,7 @@ class ParcelOrderDetails extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( - "${'Order Date:'.tr}${controller.parcelOrder.value.isSchedule == true ? controller.formatDate(controller.parcelOrder.value.createdAt!) : controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", + "${'Order Date:'.tr()}${controller.parcelOrder.value.isSchedule == true ? controller.formatDate(controller.parcelOrder.value.createdAt!) : controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), ), ), @@ -173,7 +174,7 @@ class ParcelOrderDetails extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Parcel Type:".tr, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text("Parcel Type:".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), Row( children: [ Text( @@ -221,9 +222,9 @@ class ParcelOrderDetails extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${Constant.distanceType}", "Distance".tr, "assets/icons/ic_distance_parcel.svg", isDark), - _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr, "assets/icons/ic_weight_parcel.svg", isDark), - _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr, "assets/icons/ic_rate_parcel.svg", isDark), + _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${Constant.distanceType}", "Distance".tr(), "assets/icons/ic_distance_parcel.svg", isDark), + _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr(), "assets/icons/ic_weight_parcel.svg", isDark), + _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr(), "assets/icons/ic_rate_parcel.svg", isDark), ], ), ), @@ -241,7 +242,7 @@ class ParcelOrderDetails extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("About Driver".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("About Driver".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -284,7 +285,7 @@ class ParcelOrderDetails extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( - title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr : 'Add Review'.tr, + title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr() : 'Add Review'.tr(), onPress: () async { final result = await Get.to(() => ParcelReviewScreen(), arguments: {'order': controller.parcelOrder.value}); @@ -323,7 +324,7 @@ class ParcelOrderDetails extends StatelessWidget { const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(controller.parcelOrder.value.authorID ?? ''); UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.parcelOrder.value.driverId ?? ''); @@ -375,14 +376,14 @@ class ParcelOrderDetails extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), // Discount - _summaryTile("Discount".tr, Constant.amountShow(amount: controller.discount.value.toString()), isDark), + _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark), // Tax List ...List.generate(controller.parcelOrder.value.taxSetting!.length, (index) { @@ -404,7 +405,7 @@ class ParcelOrderDetails extends StatelessWidget { const Divider(), // Total - _summaryTile("Order Total".tr, Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), ], ), ), @@ -416,7 +417,7 @@ class ParcelOrderDetails extends StatelessWidget { ? Padding( padding: const EdgeInsets.all(16.0), child: RoundedButtonFill( - title: "Cancel Parcel".tr, + title: "Cancel Parcel".tr(), onPress: () { controller.cancelParcelOrder(); }, @@ -447,7 +448,7 @@ class ParcelOrderDetails extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Parcel Status Timeline".tr, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18)), + Text("Parcel Status Timeline".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18)), const SizedBox(height: 8), // Dynamic List @@ -457,7 +458,7 @@ class ParcelOrderDetails extends StatelessWidget { if (history.isEmpty) { return SizedBox( height: 80, - child: Center(child: Text("No status updates yet".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + child: Center(child: Text("No status updates yet".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), ); } @@ -531,7 +532,7 @@ class ParcelOrderDetails extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total".tr ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total".tr() ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ), ); diff --git a/lib/screen_ui/parcel_service/parcel_review_screen.dart b/lib/screen_ui/parcel_service/parcel_review_screen.dart index d6620d2..3464b07 100644 --- a/lib/screen_ui/parcel_service/parcel_review_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_review_screen.dart @@ -1,4 +1,5 @@ import 'package:customer/controllers/parcel_review_controller.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:get/get.dart'; @@ -27,7 +28,7 @@ class ParcelReviewScreen extends StatelessWidget { backgroundColor: AppThemeData.primary300, leading: GestureDetector(onTap: () => Get.back(), child: Icon(Icons.arrow_back_ios, color: isDark ? Colors.white : Colors.black)), title: Text( - controller.ratingModel.value != null && controller.ratingModel.value!.id!.isNotEmpty ? "Update Review".tr : "Add Review".tr, + controller.ratingModel.value != null && controller.ratingModel.value!.id!.isNotEmpty ? "Update Review".tr() : "Add Review".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16), ), ), @@ -64,12 +65,12 @@ class ParcelReviewScreen extends StatelessWidget { // Title Padding( padding: const EdgeInsets.only(top: 16), - child: Text('How is your trip?'.tr, style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2)), + child: Text('How is your trip?'.tr(), style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2)), ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( - 'Your feedback will help us improve \n driving experience better'.tr, + 'Your feedback will help us improve \n driving experience better'.tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8), ), @@ -78,7 +79,7 @@ class ParcelReviewScreen extends StatelessWidget { // Rating Padding( padding: const EdgeInsets.only(top: 20), - child: Text('Rate for'.tr, style: TextStyle(fontSize: 16, color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8)), + child: Text('Rate for'.tr(), style: TextStyle(fontSize: 16, color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8)), ), Padding( padding: const EdgeInsets.only(top: 8), @@ -102,13 +103,13 @@ class ParcelReviewScreen extends StatelessWidget { ), // Comment - Padding(padding: const EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr, controller: controller.comment.value, maxLine: 5)), + Padding(padding: const EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr(), controller: controller.comment.value, maxLine: 5)), // Submit Button Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review".tr : "Add Review".tr, + title: controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), color: AppThemeData.primary300, textColor: isDark ? Colors.white : Colors.black, onPress: controller.submitReview, diff --git a/lib/screen_ui/rental_service/my_rental_booking_screen.dart b/lib/screen_ui/rental_service/my_rental_booking_screen.dart index 268124b..072d05a 100644 --- a/lib/screen_ui/rental_service/my_rental_booking_screen.dart +++ b/lib/screen_ui/rental_service/my_rental_booking_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/rental_service/rental_order_details_screen.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../constant/constant.dart'; @@ -31,7 +32,7 @@ class MyRentalBookingScreen extends StatelessWidget { backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text("Rental History".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row(children: [const SizedBox(width: 10), Text("Rental History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), ), bottom: TabBar( onTap: (index) { @@ -55,16 +56,16 @@ class MyRentalBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Please Log In to Continue".tr, style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr, + "You’re not logged in. Please sign in to access your account and explore all features.".tr(), textAlign: TextAlign.center, style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr, + title: "Log in".tr(), width: 55, height: 5.5, color: AppThemeData.primary300, @@ -82,7 +83,7 @@ class MyRentalBookingScreen extends StatelessWidget { List orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No orders found".tr, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center(child: Text("No orders found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); } return ListView.builder( padding: const EdgeInsets.all(16), @@ -151,7 +152,7 @@ class MyRentalBookingScreen extends StatelessWidget { ], ), const SizedBox(height: 12), - Text("Vehicle Type :".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Vehicle Type :".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), child: Row( @@ -195,7 +196,7 @@ class MyRentalBookingScreen extends StatelessWidget { ], ), ), - Text("Package info :".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Package info :".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), child: Row( @@ -226,7 +227,7 @@ class MyRentalBookingScreen extends StatelessWidget { ), ), if (Constant.isEnableOTPTripStartForRental == true) - Text("${'OTP :'.tr} ${order.otpCode}", style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("${'OTP :'.tr()} ${order.otpCode}", style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), SizedBox(height: 10), Row( children: [ diff --git a/lib/screen_ui/rental_service/rental_conformation_screen.dart b/lib/screen_ui/rental_service/rental_conformation_screen.dart index 34e9b3e..1c2419c 100644 --- a/lib/screen_ui/rental_service/rental_conformation_screen.dart +++ b/lib/screen_ui/rental_service/rental_conformation_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/screen_ui/rental_service/rental_coupon_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; @@ -42,7 +43,7 @@ class RentalConformationScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Confirm Rent a Car".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Confirm Rent a Car".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -98,7 +99,7 @@ class RentalConformationScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Your Preference".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Your Preference".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -140,7 +141,7 @@ class RentalConformationScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Vehicle Type".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -175,7 +176,7 @@ class RentalConformationScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text("Coupons".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded(child: Text("Coupons".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), InkWell( onTap: () { Get.to(RentalCouponScreen())!.then((value) { @@ -185,13 +186,13 @@ class RentalConformationScreen extends StatelessWidget { controller.selectedCouponModel.value = value; controller.calculateAmount(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast("This offer not eligible for this booking".tr()); } } }); }, child: Text( - "View All".tr, + "View All".tr(), style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), ), @@ -214,14 +215,14 @@ class RentalConformationScreen extends StatelessWidget { controller: controller.couponController.value, style: AppThemeData.semiBoldTextStyle(color: AppThemeData.grey900), decoration: InputDecoration( - hintText: "Write coupon code".tr, + hintText: "Write coupon code".tr(), hintStyle: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.parcelService500), border: InputBorder.none, ), ), ), RoundedButtonFill( - title: "Redeem now".tr, + title: "Redeem now".tr(), onPress: () { if (controller.couponList.where((element) => element.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()).isNotEmpty) { CouponModel couponModel = controller.couponList.firstWhere((p0) => p0.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()); @@ -232,13 +233,13 @@ class RentalConformationScreen extends StatelessWidget { controller.calculateAmount(); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr); + ShowToastDialog.showToast("This offer not eligible for this booking".tr()); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr); + ShowToastDialog.showToast("This coupon code has been expired".tr()); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr); + ShowToastDialog.showToast("Invalid coupon code".tr()); } }, borderRadius: 10, @@ -263,14 +264,14 @@ class RentalConformationScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), + _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), // Discount - _summaryTile("Discount".tr, Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), + _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), // Tax List ...List.generate(controller.rentalOrderModel.value.taxSetting!.length, (index) { @@ -294,13 +295,13 @@ class RentalConformationScreen extends StatelessWidget { const Divider(), // Total - _summaryTile("Order Total".tr, Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), ], ), ), SizedBox(height: 20), RoundedButtonFill( - title: "Book now".tr, + title: "Book now".tr(), onPress: () { controller.placeOrder(); }, diff --git a/lib/screen_ui/rental_service/rental_coupon_screen.dart b/lib/screen_ui/rental_service/rental_coupon_screen.dart index b721549..2ce13d3 100644 --- a/lib/screen_ui/rental_service/rental_coupon_screen.dart +++ b/lib/screen_ui/rental_service/rental_coupon_screen.dart @@ -6,6 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -37,7 +38,7 @@ class RentalCouponScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Coupon".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Coupon".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -46,7 +47,7 @@ class RentalCouponScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.cabCouponList.isEmpty - ? Constant.showEmptyView(message: "Coupon not found".tr) + ? Constant.showEmptyView(message: "Coupon not found".tr()) : ListView.builder( shrinkWrap: true, itemCount: controller.cabCouponList.length, @@ -71,7 +72,7 @@ class RentalCouponScreen extends StatelessWidget { child: RotatedBox( quarterTurns: -1, child: Text( - "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", + "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), ), @@ -106,7 +107,7 @@ class RentalCouponScreen extends StatelessWidget { Get.back(result: couponModel); }, child: Text( - "Tap To Apply".tr, + "Tap To Apply".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), ), diff --git a/lib/screen_ui/rental_service/rental_dashboard_screen.dart b/lib/screen_ui/rental_service/rental_dashboard_screen.dart index 99a24c9..ae0e79f 100644 --- a/lib/screen_ui/rental_service/rental_dashboard_screen.dart +++ b/lib/screen_ui/rental_service/rental_dashboard_screen.dart @@ -2,6 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -40,15 +41,15 @@ class RentalDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr, controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr, controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr, controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr, controller: controller), + navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), + navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), + navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr(), controller: controller), + navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), ], ), ); diff --git a/lib/screen_ui/rental_service/rental_home_screen.dart b/lib/screen_ui/rental_service/rental_home_screen.dart index 94e8b62..30f7ca1 100644 --- a/lib/screen_ui/rental_service/rental_home_screen.dart +++ b/lib/screen_ui/rental_service/rental_home_screen.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/constant/constant.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../controllers/rental_home_controller.dart'; @@ -57,7 +58,7 @@ class RentalHomeScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + child: Text("Login".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), ) : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), ], @@ -92,7 +93,7 @@ class RentalHomeScreen extends StatelessWidget { controller.sourceTextEditController.value.text = address; controller.departureLatLongOsm.value = latlong.LatLng(lat, lng); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); } } } else { @@ -104,7 +105,7 @@ class RentalHomeScreen extends StatelessWidget { controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); controller.departureLatLong.value = latlong.LatLng(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr); + ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); } } }); @@ -113,8 +114,8 @@ class RentalHomeScreen extends StatelessWidget { hoverColor: Colors.transparent, child: TextFieldWidget( controller: controller.sourceTextEditController.value, - hintText: "Your current location".tr, - title: "Pickup Location".tr, + hintText: "Your current location".tr(), + title: "Pickup Location".tr(), enable: false, prefix: Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), ), @@ -124,7 +125,7 @@ class RentalHomeScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Select Your Vehicle Type".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Select Your Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), const SizedBox(width: 10), GestureDetector( onTap: () => controller.pickDate(context), @@ -247,27 +248,27 @@ class RentalHomeScreen extends StatelessWidget { ), const SizedBox(height: 25), RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), onPress: () async { final sourceText = controller.sourceTextEditController.value.text.trim(); if (Constant.userModel == null) { - ShowToastDialog.showToast("Please login to continue".tr); + ShowToastDialog.showToast("Please login to continue".tr()); return; } if (sourceText.isEmpty) { - ShowToastDialog.showToast("Please select source location".tr); + ShowToastDialog.showToast("Please select source location".tr()); return; } if (controller.selectedVehicleType.value == null) { - ShowToastDialog.showToast("Please select a vehicle type".tr); + ShowToastDialog.showToast("Please select a vehicle type".tr()); return; } await controller.getRentalPackage(); if (controller.rentalPackages.isEmpty) { - ShowToastDialog.showToast("No preference available for the selected vehicle type".tr); + ShowToastDialog.showToast("No preference available for the selected vehicle type".tr()); return; } @@ -308,7 +309,7 @@ class RentalHomeScreen extends StatelessWidget { alignment: Alignment.topLeft, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), - child: Text("Select Preferences".tr, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: isDark ? Colors.white : Colors.black)), + child: Text("Select Preferences".tr(), style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: isDark ? Colors.white : Colors.black)), ), ), @@ -398,7 +399,7 @@ class RentalHomeScreen extends StatelessWidget { const SizedBox(height: 10), RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), onPress: () { Get.bottomSheet(paymentBottomSheet(context, controller, isDark), isScrollControlled: true, backgroundColor: Colors.transparent); }, @@ -434,7 +435,7 @@ class RentalHomeScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), GestureDetector(onTap: () => Get.back(), child: const Icon(Icons.close)), ], ), @@ -446,7 +447,7 @@ class RentalHomeScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Preferred Payment".tr(), style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) @@ -478,7 +479,7 @@ class RentalHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), - Text("Other Payment Options".tr, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Other Payment Options".tr(), style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), ], ), @@ -524,12 +525,12 @@ class RentalHomeScreen extends StatelessWidget { // Continue button RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr); + ShowToastDialog.showToast("Please select a payment method".tr()); return; } @@ -539,7 +540,7 @@ class RentalHomeScreen extends StatelessWidget { num baseFare = double.tryParse(controller.selectedPackage.value?.baseFare.toString() ?? "0") ?? 0; if (walletAmount < baseFare) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr); + ShowToastDialog.showToast("You do not have sufficient wallet balance".tr()); return; } } diff --git a/lib/screen_ui/rental_service/rental_order_details_screen.dart b/lib/screen_ui/rental_service/rental_order_details_screen.dart index 6457250..9b6129a 100644 --- a/lib/screen_ui/rental_service/rental_order_details_screen.dart +++ b/lib/screen_ui/rental_service/rental_order_details_screen.dart @@ -7,6 +7,7 @@ import 'package:customer/screen_ui/rental_service/rental_review_screen.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/network_image_widget.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; @@ -50,7 +51,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(width: 10), - Text("Order Details".tr, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), ], ), ), @@ -80,14 +81,15 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "${'Booking Id :'.tr} ${controller.order.value.id}", + + "${'Booking Id :'.tr()} ${controller.order.value.id}", style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700), ), ), InkWell( onTap: () { Clipboard.setData(ClipboardData(text: controller.order.value.id.toString())); - ShowToastDialog.showToast("Booking ID copied to clipboard".tr); + ShowToastDialog.showToast("Booking ID copied to clipboard".tr()); }, child: Icon(Icons.copy), ), @@ -132,7 +134,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Your Preference".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Your Preference".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), SizedBox(height: 10), Row( @@ -178,7 +180,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("About Driver".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("About Driver".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -234,7 +236,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( - title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr : 'Add Review'.tr, + title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr() : 'Add Review'.tr(), onPress: () async { final result = await Get.to(() => RentalReviewScreen(), arguments: {'order': controller.order.value}); @@ -274,7 +276,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader("Please wait...".tr()); UserModel? customer = await FireStoreUtils.getUserProfile(controller.order.value.authorID ?? ''); UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.order.value.driverId ?? ''); @@ -327,7 +329,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Vehicle Type".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), SizedBox(height: 10), Row( children: [ @@ -371,7 +373,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Rental Details".tr, style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Rental Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Divider(color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300), Padding( padding: const EdgeInsets.symmetric(vertical: 10), @@ -379,13 +381,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Rental Package'.tr, + 'Rental Package'.tr(), textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ), Text( - controller.order.value.rentalPackageModel!.name.toString().tr, + controller.order.value.rentalPackageModel!.name.toString().tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -398,13 +400,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Rental Package Price'.tr, + 'Rental Package Price'.tr(), textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ), Text( - Constant.amountShow(amount: controller.order.value.rentalPackageModel!.baseFare.toString()).tr, + Constant.amountShow(amount: controller.order.value.rentalPackageModel!.baseFare.toString()).tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -417,13 +419,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${'Including'.tr} ${Constant.distanceType.tr}', + '${'Including'.tr()} ${Constant.distanceType.tr()}', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ), Text( - "${controller.order.value.rentalPackageModel!.includedDistance.toString()} ${Constant.distanceType}".tr, + "${controller.order.value.rentalPackageModel!.includedDistance.toString()} ${Constant.distanceType}".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -436,13 +438,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Including Hours'.tr, + 'Including Hours'.tr(), textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ), Text( - "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr}".tr, + "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr()}".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -455,7 +457,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${'Extra'.tr} ${Constant.distanceType}', + '${'Extra'.tr()} ${Constant.distanceType}', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -496,13 +498,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Extra Minutes'.tr, + 'Extra Minutes'.tr(), textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), ), Text( - "${controller.order.value.endTime == null ? "0" : (((controller.order.value.endTime!.toDate().difference(controller.order.value.startTime!.toDate()).inMinutes) - (int.parse(controller.order.value.rentalPackageModel!.includedHours.toString()) * 60)).clamp(0, double.infinity).toInt().toString())} ${'Min'.tr}", + "${controller.order.value.endTime == null ? "0" : (((controller.order.value.endTime!.toDate().difference(controller.order.value.startTime!.toDate()).inMinutes) - (int.parse(controller.order.value.rentalPackageModel!.includedHours.toString()) * 60)).clamp(0, double.infinity).toInt().toString())} ${'Min'.tr()}", textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), ), @@ -524,11 +526,11 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), const SizedBox(height: 8), - _summaryTile("Subtotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), - _summaryTile("Discount".tr, Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), + _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), + _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), ...List.generate(controller.order.value.taxSetting?.length ?? 0, (index) { final taxModel = controller.order.value.taxSetting![index]; @@ -542,7 +544,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { }), const Divider(), - _summaryTile("Order Total".tr, Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), ], ), ), @@ -563,7 +565,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { if (controller.order.value.endKitoMetersReading == null || controller.order.value.endKitoMetersReading == "0.0" || controller.order.value.endKitoMetersReading!.isEmpty) { - ShowToastDialog.showToast("You are not able to pay now until driver adds kilometer".tr); + ShowToastDialog.showToast("You are not able to pay now until driver adds kilometer".tr()); } else { Get.bottomSheet(paymentBottomSheet(context, controller, isDark, controller.order.value), isScrollControlled: true, backgroundColor: Colors.transparent); } @@ -626,7 +628,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr, style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), GestureDetector( onTap: () { Get.back(); @@ -641,7 +643,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) Container( @@ -672,7 +674,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - "Other Payment Options".tr, + "Other Payment Options".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), ), @@ -717,12 +719,12 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Continue".tr, + title: "Continue".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr); + ShowToastDialog.showToast("Please select a payment method".tr()); } else { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); @@ -740,7 +742,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { controller.completeOrder(); } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { if (Constant.userModel!.walletAmount == null || Constant.userModel!.walletAmount! < controller.totalAmount.value) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr); + ShowToastDialog.showToast("You do not have sufficient wallet balance".tr()); } else { controller.completeOrder(); } @@ -756,14 +758,14 @@ class RentalOrderDetailsScreen extends StatelessWidget { RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { if (value == null) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); + ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); } else { CreateRazorPayOrderModel result = value; controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); } }); } else { - ShowToastDialog.showToast("Please select payment method".tr); + ShowToastDialog.showToast("Please select payment method".tr()); } } }, diff --git a/lib/screen_ui/rental_service/rental_review_screen.dart b/lib/screen_ui/rental_service/rental_review_screen.dart index 98c00b1..486ea7a 100644 --- a/lib/screen_ui/rental_service/rental_review_screen.dart +++ b/lib/screen_ui/rental_service/rental_review_screen.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:get/get.dart'; @@ -30,7 +31,7 @@ class RentalReviewScreen extends StatelessWidget { child: Icon(Icons.arrow_back_ios, color: isDark ? Colors.white : Colors.black), ), title: Text( - controller.ratingModel.value != null ? "Update Review".tr : "Add Review".tr, + controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16), ), ), @@ -93,7 +94,7 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 16), child: Text( - 'How is your trip?'.tr, + 'How is your trip?'.tr(), style: TextStyle( fontSize: 18, color: isDark ? Colors.white : Colors.black, @@ -105,7 +106,7 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - 'Your feedback will help us improve \n driving experience better'.tr, + 'Your feedback will help us improve \n driving experience better'.tr(), textAlign: TextAlign.center, style: TextStyle( color: isDark ? Colors.white : Colors.black.withOpacity(0.60), @@ -118,7 +119,7 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 20), child: Text( - 'Rate for'.tr, + 'Rate for'.tr(), style: TextStyle( fontSize: 16, color: isDark ? Colors.white : Colors.black.withOpacity(0.60), @@ -156,7 +157,7 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.all(20.0), child: TextFieldWidget( - hintText: "Type comment....".tr, + hintText: "Type comment....".tr(), controller: controller.comment.value, maxLine: 5, ), diff --git a/lib/service/cart_provider.dart b/lib/service/cart_provider.dart index 4853938..4868e0a 100644 --- a/lib/service/cart_provider.dart +++ b/lib/service/cart_provider.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/cart_product_model.dart'; import 'package:customer/themes/custom_dialog_box.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -48,10 +49,10 @@ class CartProvider with ChangeNotifier { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Alert".tr, - descriptions: "Your cart already contains items from another restaurant. Would you like to replace them with items from this restaurant instead?".tr, - positiveString: "Add".tr, - negativeString: "Cancel".tr, + title: "Alert".tr(), + descriptions: "Your cart already contains items from another restaurant. Would you like to replace them with items from this restaurant instead?".tr(), + positiveString: "Add".tr(), + negativeString: "Cancel".tr(), positiveClick: () async { cartItem.clear(); _cartItems.clear(); diff --git a/lib/service/fire_store_utils.dart b/lib/service/fire_store_utils.dart index f054fc3..ad3e445 100644 --- a/lib/service/fire_store_utils.dart +++ b/lib/service/fire_store_utils.dart @@ -9,6 +9,7 @@ import 'package:customer/models/rental_order_model.dart'; import 'package:customer/models/rental_package_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/models/zone_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/cupertino.dart'; @@ -204,7 +205,7 @@ class FireStoreUtils { .set(ratingModel.toJson()); } catch (e, s) { print('FireStoreUtils.referralAdd $e $s'); - return "Couldn't review".tr; + return "Couldn't review".tr(); } return null; } @@ -2068,7 +2069,7 @@ class FireStoreUtils { File image, BuildContext context, ) async { - ShowToastDialog.showLoader("Please wait".tr); + ShowToastDialog.showLoader("Please wait".tr()); var uniqueID = const Uuid().v4(); Reference upload = FirebaseStorage.instance.ref().child( 'images/$uniqueID.png', @@ -2403,8 +2404,8 @@ class FireStoreUtils { // userId: FireStoreUtils.getCurrentUid(), // isTopup: false, // orderId: orderModel.id, - // note: "Order Amount debited".tr, - // paymentStatus: "success".tr, + // note: "Order Amount debited".tr(), + // paymentStatus: "success".tr(), // ); // // await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { @@ -2949,12 +2950,12 @@ class FireStoreUtils { String firstHTML = """ - + - + """; @@ -2999,12 +3000,12 @@ class FireStoreUtils { } String product = """ - + - + """; htmlList.add(product); diff --git a/lib/themes/custom_dialog_box.dart b/lib/themes/custom_dialog_box.dart index 6c87843..e2ff4d6 100644 --- a/lib/themes/custom_dialog_box.dart +++ b/lib/themes/custom_dialog_box.dart @@ -1,4 +1,5 @@ import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../controllers/theme_controller.dart'; @@ -41,10 +42,10 @@ class CustomDialogBox extends StatelessWidget { children: [ img ?? const SizedBox(), const SizedBox(height: 20), - if (title.isNotEmpty) Text(title.tr, style: AppThemeData.boldTextStyle(fontSize: 20, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + if (title.isNotEmpty) Text(title.tr(), style: AppThemeData.boldTextStyle(fontSize: 20, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), const SizedBox(height: 5), if (descriptions.isNotEmpty) - Text(descriptions.tr, textAlign: TextAlign.center, style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text(descriptions.tr(), textAlign: TextAlign.center, style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), const SizedBox(height: 20), Row( children: [ @@ -56,7 +57,7 @@ class CustomDialogBox extends StatelessWidget { height: Responsive.height(5, context), decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, borderRadius: BorderRadius.circular(200)), child: Center( - child: Text(negativeString.tr, textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100)), + child: Text(negativeString.tr(), textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100)), ), ), ), @@ -69,7 +70,7 @@ class CustomDialogBox extends StatelessWidget { width: Responsive.width(100, context), height: Responsive.height(5, context), decoration: BoxDecoration(color: AppThemeData.success300, borderRadius: BorderRadius.circular(200)), - child: Center(child: Text('Confirm'.tr, textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey100))), + child: Center(child: Text('Confirm'.tr(), textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey100))), ), ), ), diff --git a/lib/themes/round_button_border.dart b/lib/themes/round_button_border.dart index f93be6e..a46e769 100644 --- a/lib/themes/round_button_border.dart +++ b/lib/themes/round_button_border.dart @@ -1,5 +1,6 @@ import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'app_them_data.dart'; @@ -56,12 +57,12 @@ class RoundedButtonBorder extends StatelessWidget { children: [ if (isRight == false) Padding(padding: const EdgeInsets.only(right: 10, left: 0), child: icon), isCenter == true - ? Text(title.tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 14, color: textColor ?? AppThemeData.grey800)) + ? Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 14, color: textColor ?? AppThemeData.grey800)) : Expanded( child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), child: Text( - title.tr, + title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 14, color: textColor ?? (isDark ? AppThemeData.grey100 : AppThemeData.grey700)), ), diff --git a/lib/themes/round_button_fill.dart b/lib/themes/round_button_fill.dart index eada310..8f61cbe 100644 --- a/lib/themes/round_button_fill.dart +++ b/lib/themes/round_button_fill.dart @@ -1,4 +1,5 @@ import 'package:customer/themes/responsive.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'app_them_data.dart'; @@ -51,11 +52,11 @@ class RoundedButtonFill extends StatelessWidget { children: [ if (isRight == false) Padding(padding: const EdgeInsets.only(right: 10, left: 10), child: icon), isCenter == true - ? Text(title.tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)) + ? Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)) : Expanded( child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), - child: Text(title.tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)), + child: Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)), ), ), if (isRight == true) Padding(padding: const EdgeInsets.only(left: 10, right: 10), child: icon), diff --git a/lib/themes/text_field_widget.dart b/lib/themes/text_field_widget.dart index dfc9c06..7e87544 100644 --- a/lib/themes/text_field_widget.dart +++ b/lib/themes/text_field_widget.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -89,7 +90,7 @@ class _TextFieldWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.title != null) ...[ - Text(widget.title!.tr, style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text(widget.title!.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), const SizedBox(height: 5), ], TextFormField( @@ -121,7 +122,7 @@ class _TextFieldWidgetState extends State { focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor, width: 1.2)), errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: const BorderSide(color: Colors.red)), disabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), - hintText: widget.hintText.tr, + hintText: widget.hintText.tr(), hintStyle: AppThemeData.regularTextStyle(fontSize: 14.sp, color: hintColor), ), ), diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 3e2b574..a7c6398 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -1,5 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get_utils/src/extensions/internacionalization.dart'; import 'package:map_launcher/map_launcher.dart'; @@ -64,42 +65,42 @@ class Utils { if (isAvailable == true) { await MapLauncher.showDirections(mapType: MapType.google, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); } else { - ShowToastDialog.showToast("Google map is not installed".tr); + ShowToastDialog.showToast("Google map is not installed".tr()); } } else if (Constant.mapType == "googleGo") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.googleGo); if (isAvailable == true) { await MapLauncher.showDirections(mapType: MapType.googleGo, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); } else { - ShowToastDialog.showToast("Google Go map is not installed".tr); + ShowToastDialog.showToast("Google Go map is not installed".tr()); } } else if (Constant.mapType == "waze") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.waze); if (isAvailable == true) { await MapLauncher.showDirections(mapType: MapType.waze, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); } else { - ShowToastDialog.showToast("Waze is not installed".tr); + ShowToastDialog.showToast("Waze is not installed".tr()); } } else if (Constant.mapType == "mapswithme") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.mapswithme); if (isAvailable == true) { await MapLauncher.showDirections(mapType: MapType.mapswithme, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); } else { - ShowToastDialog.showToast("Mapswithme is not installed".tr); + ShowToastDialog.showToast("Mapswithme is not installed".tr()); } } else if (Constant.mapType == "yandexNavi") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.yandexNavi); if (isAvailable == true) { await MapLauncher.showDirections(mapType: MapType.yandexNavi, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); } else { - ShowToastDialog.showToast("YandexNavi is not installed".tr); + ShowToastDialog.showToast("YandexNavi is not installed".tr()); } } else if (Constant.mapType == "yandexMaps") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.yandexMaps); if (isAvailable == true) { await MapLauncher.showDirections(mapType: MapType.yandexMaps, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); } else { - ShowToastDialog.showToast("yandexMaps map is not installed".tr); + ShowToastDialog.showToast("yandexMaps map is not installed".tr()); } } } diff --git a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart index 7c9c853..844cd6d 100644 --- a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart +++ b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart @@ -1,4 +1,5 @@ // Flutter Packages +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -10,7 +11,7 @@ class EmptyScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Center( - child: Text('Nothing found here...'.tr), + child: Text('Nothing found here...'.tr()), ); } } diff --git a/lib/widget/osm_map/map_picker_page.dart b/lib/widget/osm_map/map_picker_page.dart index 7491e77..a05628d 100644 --- a/lib/widget/osm_map/map_picker_page.dart +++ b/lib/widget/osm_map/map_picker_page.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/widget/osm_map/map_controller.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -27,7 +28,7 @@ class MapPickerPage extends StatelessWidget { // centerTitle: false, // titleSpacing: 0, // title: Text( - // "PickUp Location".tr, + // "PickUp Location".tr(), // textAlign: TextAlign.start, // style: TextStyle( // fontFamily: AppThemeData.medium, @@ -97,7 +98,7 @@ class MapPickerPage extends StatelessWidget { isDark ? AppThemeData.grey900 : AppThemeData.grey900, ), decoration: InputDecoration( - hintText: 'Search location...'.tr, + hintText: 'Search location...'.tr(), hintStyle: TextStyle( color: isDark @@ -156,8 +157,8 @@ class MapPickerPage extends StatelessWidget { children: [ Text( controller.pickedPlace.value != null - ? "Picked Location:".tr - : "No Location Picked".tr, + ? "Picked Location:".tr() + : "No Location Picked".tr(), style: AppThemeData.boldTextStyle( color: AppThemeData.grey900, fontSize: 17.sp, @@ -177,7 +178,7 @@ class MapPickerPage extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( - title: "Confirm Location".tr, + title: "Confirm Location".tr(), color: AppThemeData.mainColor, textColor: AppThemeData.grey50, borderRadius: 12, diff --git a/lib/widget/permission_dialog.dart b/lib/widget/permission_dialog.dart index da17132..701275b 100644 --- a/lib/widget/permission_dialog.dart +++ b/lib/widget/permission_dialog.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; @@ -23,7 +24,7 @@ class PermissionDialog extends StatelessWidget { Icon(Icons.add_location_alt_rounded, color: Theme.of(context).primaryColor, size: 100), const SizedBox(height: 20), Text( - 'You denied location permission forever. Please allow location permission from your app settings and receive more accurate delivery.'.tr, + 'You denied location permission forever. Please allow location permission from your app settings and receive more accurate delivery.'.tr(), textAlign: TextAlign.center, style: TextStyle(fontSize: 18), ), @@ -36,14 +37,14 @@ class PermissionDialog extends StatelessWidget { shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30), side: BorderSide(width: 2, color: Theme.of(context).primaryColor)), minimumSize: const Size(1, 50), ), - child: Text('close'.tr), + child: Text('close'.tr()), onPressed: () => Navigator.pop(context), ), ), const SizedBox(width: 10), Expanded( child: RoundedButtonFill( - title: "Settings".tr, + title: "Settings".tr(), color: AppThemeData.grey900, textColor: AppThemeData.grey50, onPress: () async { diff --git a/lib/widget/place_picker/location_picker_screen.dart b/lib/widget/place_picker/location_picker_screen.dart index 38d6dc8..4c0c96d 100644 --- a/lib/widget/place_picker/location_picker_screen.dart +++ b/lib/widget/place_picker/location_picker_screen.dart @@ -4,6 +4,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/widget/place_picker/location_controller.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/theme_controller.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_google_places_hoc081098/flutter_google_places_hoc081098.dart'; import 'package:flutter_google_places_hoc081098/google_maps_webservice_places.dart'; @@ -130,7 +131,7 @@ class LocationPickerScreen extends StatelessWidget { children: [ Icon(Icons.search), SizedBox(width: 8), - Text("Search place...".tr), + Text("Search place...".tr()), ], ), ), diff --git a/lib/widget/story_view/widgets/story_image.dart b/lib/widget/story_view/widgets/story_image.dart index c7cd2a4..ce6308f 100644 --- a/lib/widget/story_view/widgets/story_image.dart +++ b/lib/widget/story_view/widgets/story_image.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:ui' as ui; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:get/get_utils/src/extensions/internacionalization.dart'; @@ -194,7 +195,7 @@ class StoryImageState extends State { return Center( child: widget.errorWidget ?? Text( - "Image failed to load.".tr, + "Image failed to load.".tr(), style: TextStyle( color: Colors.white, ), diff --git a/pubspec.yaml b/pubspec.yaml index 16a2b21..2be1d69 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -109,6 +109,7 @@ flutter: - assets/images/ - assets/icons/ - assets/fonts/ + - assets/translations/ - assets/ fonts: -- 2.49.1 From e602782eddefeb1ab5609bfc70569c661b86e315 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Thu, 4 Dec 2025 10:23:59 +0500 Subject: [PATCH 20/30] BASE: Update Icons & Name Of The App. --- android/app/src/main/res/ic_launcher-web.png | Bin 0 -> 32877 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 + .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9107 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 18883 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15732 bytes android/app/src/main/res/play_store_512.png | Bin 209796 -> 0 bytes android/app/src/main/res/playstore-icon.png | Bin 0 -> 34909 bytes .../res/values/ic_launcher_background.xml | 3 + android/app/src/main/res/values/styles.xml | 11 - .../translations/{en_En.json => en-US.json} | 4 +- assets/translations/ru-RU.json | 108 + assets/translations/ru_RU.json | 0 assets/translations/uz-UZ.json | 108 + assets/translations/uz_UZ.json | 0 lib/constant/constant.dart | 353 ++- .../0n_demand_payment_controller.dart | 400 ++- .../Intercity_home_controller.dart | 895 +++++-- lib/controllers/address_list_controller.dart | 7 +- .../advertisement_list_controller.dart | 2 +- .../all_brand_product_controller.dart | 22 +- .../all_category_product_controller.dart | 6 +- lib/controllers/book_parcel_controller.dart | 176 +- lib/controllers/cab_booking_controller.dart | 895 +++++-- .../cab_coupon_code_controller.dart | 6 +- lib/controllers/cab_dashboard_controller.dart | 19 +- lib/controllers/cab_home_controller.dart | 2 +- .../cab_order_details_controller.dart | 61 +- .../cab_rental_dashboard_controllers.dart | 20 +- lib/controllers/cab_review_controller.dart | 26 +- lib/controllers/cart_controller.dart | 594 ++++- lib/controllers/cashback_controller.dart | 2 +- .../category_restaurant_controller.dart | 14 +- .../change_language_controller.dart | 39 +- lib/controllers/chat_controller.dart | 47 +- lib/controllers/complain_controller.dart | 22 +- lib/controllers/dash_board_controller.dart | 36 +- .../dash_board_ecommarce_controller.dart | 21 +- .../dine_in_booking_controller.dart | 18 +- .../dine_in_booking_details_controller.dart | 2 +- lib/controllers/dine_in_controller.dart | 57 +- ...dine_in_restaurant_details_controller.dart | 231 +- .../discount_restaurant_list_controller.dart | 2 +- lib/controllers/edit_profile_controller.dart | 18 +- .../enter_manually_location_controller.dart | 22 +- lib/controllers/favourite_controller.dart | 67 +- .../favourite_ondemmand_controller.dart | 43 +- lib/controllers/food_home_controller.dart | 51 +- .../forgot_password_controller.dart | 9 +- lib/controllers/gift_card_controller.dart | 606 +++-- .../global_setting_controller.dart | 34 +- .../history_gift_card_controller.dart | 13 +- .../home_e_commerce_controller.dart | 30 +- lib/controllers/home_parcel_controller.dart | 2 +- lib/controllers/live_tracking_controller.dart | 188 +- lib/controllers/login_controller.dart | 144 +- lib/controllers/map_view_controller.dart | 2 +- lib/controllers/mobile_login_controller.dart | 26 +- .../my_booking_on_demand_controller.dart | 36 +- .../my_cab_booking_controller.dart | 304 ++- lib/controllers/my_profile_controller.dart | 7 +- .../my_rental_booking_controller.dart | 140 +- lib/controllers/on_boarding_controller.dart | 2 +- .../on_demand_booking_controller.dart | 80 +- .../on_demand_category_controller.dart | 3 +- .../on_demand_dashboard_controller.dart | 14 +- .../on_demand_details_controller.dart | 36 +- .../on_demand_home_controller.dart | 66 +- .../on_demand_order_details_controller.dart | 88 +- .../on_demand_review_controller.dart | 75 +- lib/controllers/order_controller.dart | 27 +- lib/controllers/order_details_controller.dart | 51 +- lib/controllers/order_placing_controller.dart | 2 +- .../osm_search_place_controller.dart | 5 +- .../otp_verification_controller.dart | 37 +- lib/controllers/parcel_coupon_controller.dart | 11 +- .../parcel_dashboard_controller.dart | 19 +- .../parcel_my_booking_controller.dart | 55 +- .../parcel_order_confirmation_controller.dart | 2 +- .../parcel_order_details_controller.dart | 52 +- lib/controllers/parcel_review_controller.dart | 23 +- lib/controllers/provider_controller.dart | 9 +- lib/controllers/rate_product_controller.dart | 87 +- .../redeem_gift_card_controller.dart | 2 +- lib/controllers/refer_friend_controller.dart | 2 +- .../rental_conformation_controller.dart | 32 +- lib/controllers/rental_coupon_controller.dart | 11 +- lib/controllers/rental_home_controller.dart | 122 +- .../rental_order_details_controller.dart | 412 ++- lib/controllers/rental_review_controller.dart | 26 +- .../restaurant_details_controller.dart | 150 +- .../restaurant_list_controller.dart | 2 +- lib/controllers/review_list_controller.dart | 2 +- lib/controllers/scan_qr_code_controller.dart | 2 +- lib/controllers/search_controller.dart | 15 +- lib/controllers/service_list_controller.dart | 2 +- lib/controllers/sign_up_controller.dart | 48 +- lib/controllers/splash_controller.dart | 21 +- lib/controllers/theme_controller.dart | 4 +- .../view_all_category_controller.dart | 15 +- .../view_all_popular_service_controller.dart | 42 +- .../view_category_service_controller.dart | 32 +- lib/controllers/wallet_controller.dart | 278 +- lib/main.dart | 2 + lib/payment/MercadoPagoScreen.dart | 23 +- lib/payment/PayFastScreen.dart | 19 +- lib/payment/midtrans_screen.dart | 28 +- lib/payment/orangePayScreen.dart | 63 +- lib/payment/paystack/pay_stack_screen.dart | 118 +- lib/payment/xenditScreen.dart | 35 +- .../auth_screens/forgot_password_screen.dart | 2 +- lib/screen_ui/auth_screens/login_screen.dart | 11 +- .../auth_screens/mobile_login_screen.dart | 2 +- .../auth_screens/otp_verification_screen.dart | 2 +- .../auth_screens/sign_up_screen.dart | 2 +- .../Intercity_home_screen.dart | 2299 +++++++++++++--- .../cab_booking_screen.dart | 58 +- .../cab_coupon_code_screen.dart | 132 +- .../cab_dashboard_screen.dart | 2 +- .../cab_service_screens/cab_home_screen.dart | 7 +- .../cab_order_details.dart | 2 +- .../cab_review_screen.dart | 2 +- .../cab_service_screens/complain_screen.dart | 48 +- .../my_cab_booking_screen.dart | 707 ++++- .../ecommarce/all_brand_product_screen.dart | 185 +- .../all_category_product_screen.dart | 183 +- .../dash_board_e_commerce_screen.dart | 100 +- .../ecommarce/home_e_commerce_screen.dart | 1252 +++++++-- .../address_list_screen.dart | 172 +- .../enter_manually_location.dart | 314 ++- .../location_permission_screen.dart | 101 +- .../maintenance_mode_screen.dart | 18 +- .../all_advertisement_screen.dart | 204 +- .../cart_screen/cart_screen.dart | 1964 +++++++++++--- .../cart_screen/coupon_list_screen.dart | 163 +- .../cart_screen/oder_placing_screens.dart | 226 +- .../cart_screen/select_payment_screen.dart | 3 +- .../cashback_screen/cashback_offers_list.dart | 73 +- .../change_language_screen.dart | 3 +- .../chat_screens/chat_screen.dart | 264 +- .../chat_screens/driver_inbox_screen.dart | 74 +- .../chat_screens/restaurant_inbox_screen.dart | 78 +- .../dash_board_screens/dash_board_screen.dart | 100 +- .../dine_in_booking_details.dart | 280 +- .../dine_in_booking_screen.dart | 222 +- .../dine_in_screeen/book_table_screen.dart | 432 ++- .../dine_in_details_screen.dart | 877 +++++-- .../dine_in_restaurant_list_screen.dart | 44 +- .../dine_in_screeen/dine_in_screen.dart | 2 +- .../view_all_category_dine_in_screen.dart | 98 +- .../edit_profile_screen.dart | 139 +- .../favourite_screens/favourite_screen.dart | 1022 ++++++-- .../forgot_password_screen.dart | 42 +- .../gift_card/gift_card_screen.dart | 280 +- .../gift_card/history_gift_card.dart | 223 +- .../gift_card/redeem_gift_card_screen.dart | 109 +- .../gift_card/select_gift_payment_screen.dart | 368 ++- .../category_restaurant_screen.dart | 213 +- .../discount_restaurant_list_screen.dart | 198 +- .../home_screen/home_screen.dart | 5 +- .../home_screen/home_screen_two.dart | 1139 ++++++-- .../home_screen/restaurant_list_screen.dart | 273 +- .../home_screen/story_view.dart | 73 +- .../home_screen/view_all_category_screen.dart | 82 +- .../live_tracking_screen.dart | 52 +- .../order_details_screen.dart | 1804 ++++++++++--- .../order_list_screen/order_screen.dart | 353 ++- .../profile_screen/profile_screen.dart | 591 ++++- .../rate_us_screen/rate_product_screen.dart | 357 ++- .../refer_friend_screen.dart | 154 +- .../restaurant_details_screen.dart | 2321 ++++++++++++++--- .../review_list_screen.dart | 231 +- .../scan_qr_code_screen.dart | 27 +- .../search_screen/search_screen.dart | 632 ++++- .../terms_and_condition_screen.dart | 31 +- .../wallet_screen/payment_list_screen.dart | 314 ++- .../wallet_screen/wallet_screen.dart | 251 +- .../on_boarding_screen.dart | 53 +- .../favourite_ondemand_screen.dart | 521 +++- .../my_booking_on_demand_screen.dart | 318 ++- .../on_demand_booking_screen.dart | 616 ++++- .../on_demand_category_screen.dart | 85 +- .../on_demand_dashboard_screen.dart | 100 +- .../on_demand_details_screen.dart | 602 ++++- .../on_demand_home_screen.dart | 453 +++- .../on_demand_order_details_screen.dart | 1726 ++++++++++-- .../on_demand_payment_screen.dart | 486 +++- .../on_demand_review_screen.dart | 126 +- .../provider_inbox_screen.dart | 74 +- .../on_demand_service/provider_screen.dart | 106 +- .../view_all_popular_service_screen.dart | 58 +- .../view_category_service_screen.dart | 40 +- .../worker_inbox_screen.dart | 78 +- .../parcel_service/book_parcel_screen.dart | 425 ++- .../parcel_service/home_parcel_screen.dart | 190 +- .../parcel_service/my_booking_screen.dart | 222 +- .../order_successfully_placed.dart | 29 +- .../parcel_service/parcel_coupon_screen.dart | 128 +- .../parcel_dashboard_screen.dart | 85 +- .../parcel_order_confirmation.dart | 918 +++++-- .../parcel_service/parcel_order_details.dart | 710 ++++- .../parcel_service/parcel_review_screen.dart | 174 +- .../my_rental_booking_screen.dart | 462 +++- .../rental_conformation_screen.dart | 470 +++- .../rental_service/rental_coupon_screen.dart | 128 +- .../rental_dashboard_screen.dart | 83 +- .../rental_service/rental_home_screen.dart | 680 ++++- .../rental_order_details_screen.dart | 1403 ++++++++-- .../rental_service/rental_review_screen.dart | 149 +- .../service_list_screen.dart | 12 +- .../splash_screen/splash_screen.dart | 9 +- lib/service/cart_provider.dart | 21 +- lib/service/fire_store_utils.dart | 4 +- lib/service/localization_service.dart | 2 +- lib/themes/custom_dialog_box.dart | 69 +- lib/themes/easy_loading_config.dart | 2 +- lib/themes/round_button_border.dart | 37 +- lib/themes/round_button_fill.dart | 39 +- lib/themes/text_field_widget.dart | 75 +- lib/utils/utils.dart | 2 +- .../src/widgets/defaults/empty_screen.dart | 6 +- lib/widget/osm_map/map_controller.dart | 35 +- lib/widget/osm_map/map_picker_page.dart | 2 +- lib/widget/permission_dialog.dart | 19 +- .../place_picker/location_controller.dart | 28 +- .../place_picker/location_picker_screen.dart | 2 +- .../story_view/widgets/story_image.dart | 2 - pubspec.yaml | 2 +- 228 files changed, 34364 insertions(+), 7905 deletions(-) create mode 100644 android/app/src/main/res/ic_launcher-web.png create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/play_store_512.png create mode 100644 android/app/src/main/res/playstore-icon.png create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml delete mode 100644 android/app/src/main/res/values/styles.xml rename assets/translations/{en_En.json => en-US.json} (96%) create mode 100644 assets/translations/ru-RU.json delete mode 100644 assets/translations/ru_RU.json create mode 100644 assets/translations/uz-UZ.json delete mode 100644 assets/translations/uz_UZ.json diff --git a/android/app/src/main/res/ic_launcher-web.png b/android/app/src/main/res/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..97553a3be8c2fda69ed07635b07e345886ff975a GIT binary patch literal 32877 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 - + - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..79d695e --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..62a0b5188c750204e3c0ce841e1662db3d5472a1 GIT binary patch literal 9107 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%0AC@f+KP{ur@NmiOzlc4yCz5WidHV`BB$6gu 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 K#cM^4g8mCb)J3O?TgX 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
pHpvv;x26m`&ynd7iaVZB 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

Product Name
Quantity
Price
Total
${orderModel.provider.title} ${orderModel.quantity} ${Constant.amountShow(amount: (orderModel.provider.disPrice == "" || orderModel.provider.disPrice == "0") ? orderModel.provider.price.toString() : orderModel.provider.disPrice.toString())} ${Constant.amountShow(amount: (total).toString())}
6-~h7rV1nWuNVRS`x84H9?Q^UinN)_Cr^kSEM=9%JigL zg^#ZHU9VG-vr_xADXidDK-%zwZIRi$nl$fW(1N_spm{LsJ;8qqY583JQExv_;^KUy z&ECes`chwzx&D3(#W*662A3BtHM8qQrecJGZu3veR=Da5eiD?1bK!bGb{6}ci7i2V z9pB-ENjK*EDqLI94ZlCT+I)->J7Z(_n4a}I%&{hKM2XDqGSYy;l=iY`9al;L&Wk>j zn{D>ifR}(CU_Wo>cIuChUyJ>_%Q-69UxQqy&}LM6zibP*W9$5R1aitR`R4qRyJwX_ zM^gIfJ<9nd$#3Fs4xFdxQN*4OQNB%l2YxV%C0DBnVkGf@Do2PmtOvmW2;iTn^-wZJU2zb?w zRu@?fOUr#9%{j6i$A|e^UbQ8eezY16BLTyi#ZjKt0B>8iSG?@4Kfj3Gsid*(#0PcK zr@k~Xtwq_ae{puucHLeh%+WQc7*JG^ov zoF)=-(3B)YU?xBm9*Rb$`G|(oHqgrUDM;3U8=E;GZy!JmtA-+dPH zzy*1d_kTMLc@*>W?_S7t@Fqia`#)K9A8PrG3W1UGiwOBd@Yv?!3(40LiMW&ew2J+W z@oJ9o>%)7D?kM+W$&;5o;awjB%rF{3VS8CZDuJgaf71ml$SjBsG~*m4X6^6s;uUpc zg$MJ2!Jy5^<|Jmhq0DIX>1i**-XnL@c^`|Ypsm&rfoZ2<(E&cPdbW70pnqQ{TPihj z$5G|}3Cm{7N;@~@-iJ%IJ^}sH=R&R(V@tTr0F)N3E5mssyy))=48F|Rkc?KJUKl84 z@JENl%rDl<_WqZ=J8xR6ZQ}Y}A_Qap4?Q=3=4vM9(&gvJXZ`!VywIrQZjXFCq~zbD z(2nrAi?#3&E47fNkkH;MUFb2K6IjQ>5?B;+%u{8gW-DJN8f+V=v6%b*Y9K0{bV=Ku z=T#`Gb0n3~?#KTa!;RX*zhiKBU8aW!uZt%`L3;GWX0}o6RD~N9%V`vHm;0E7zB_EG z$x9q27uhK_H-Sg)7Jz?J;}0i~xg$bn{(86b8^#XLxsNH6eu_fV=Z_LniFe@7V1vO- zu+TKmZSC$x>oeeROMYXBrCa@q3w(kA)Mi1SZ~PDa(`)AC0vI_YhR{!WT1gl~rWnyZ zHayzd*{E%Em0CVl3jYzd5g8JPU@b~5OmpT05*UtE#lGIrBooWYaTHQ2n%qy06%Gv@ zwJZ&QQw9*P0rR7(Ud-lbW|mgI{%XZUCBge^V=HQ`x0V=pwJxPwr(zqTNd>f5QS-;tek`yw>n!mSM6u`DFb?r=$ zyydU9di7oc#S18R(}q(LaT>8|&IYAst~{qNl&_q$c&gChzZ*~5fmPSr6kflPx-3TS zBH!^o7lR#(#j+O(GjbM>?$(9ZQKlr=9^SQ^!#fBs@!oYGk&eH8~LmDCp3b5W6Xj{Hm-WnISWlh@Ye`x zYx~?W<;VXjSk_zBf;3fuc%SuTId>PjHg1R2?^c=(C5B=k25T!#*LzBoJIwFDTGqvy z5@PJ4+{y(R7}r}6IGHhaJcDy4 zpCpQ;jw#?OJ&&EV7xVW*=YDQy<71gC3c8Ep7*8W{*SxUr$B#rK4o`oPVLT6fBdf>o zSDQCJO9xjDqj2^mZ=Zc6+ySwF|3X!{@?q<7=kKN=R+iN96Jj*;WwL*^KQ2AUPL?zi zk9@HIJ=FF$A|;O&tLDSAqd8w_3C|F){G!9`wG*GO-QLpGtbk0HiT4@xe*yHfZA!qH zm}SrECSwmRcY8Y*$8090Q(fEf+r1Qartpl3n}Adi{M|yoTh*`bl4!=7Co}(&6j~Ja ze6w|w?IhkkB~Kap?xdHTCeZTmEr|4k-d~~StEjsN9MB}tI9U~lM&44aVK#Jim3`MB z(?HcRp?D|!V^hz*(d)kwMIqHFE1lMqR1E9@qUN@;70NHK3yktl$q$U@tf*BA1WP2H z>?}qMp-Tu%%kvv;*!zX)521MYvid__gE_{J^5dZVA0Jk&ym{Sg3+6l}R2=^h*)zo( zXrOoo=p31+8P0%gZD9i&zb;>TQ)>PqLdPwJEny9iOYe`5C)yXeue$Dz9L5f$?#AJ* z_O=^6lB041Eq)OWkKoglejm$+e5qSX$>uOt#-#4^yXSAO?N zVUWQ)nUSss(_A>1>zn}^79e%awiB}g?TqtnYnJ+ZMeCvVpdxvPbhZ&U*l6+3S51YU zyaaRV7=|_8o9wth{DSYRks_AdJ{-QHI5#j0w_uA@D`#&JFbYI7R<6-{{e98HPEeIo zhunsL&~0Cx5kP2FX`OAD^4IlABBS)$Md}8!bf}(ysmRoY8bZP&Q?>zn#&V;!{+B{XJ&?haFQrAL?Q%cIj- z*1~ru`HPG^XD(Tvs5DX!Ye3I}A3U(l7*PT>)4`oLe2fe}TwGwUsG{N-yd8DIzlm;Y z@yar(K|~UM4Y6K6E6z~h3X%X&FAG%245|aTC?~XZM!LGx;SV)S?^#Vqblht;dcFN# zAPMlx7tDc-*qYeN!B!H-M?{DT*m;SZVtj;MvX+a&S!UrtAcPyx@KOiyN^)E?6A zs-8RS44V~AGxDn;$dd#C*p*~SqRaddds#X(^DhJf+ z_pt^Q@T(u1B-$|Tc<{X3N@gn~p@*aY5;52_SZJU4wHJFP%xV1|qN9Z@c*BS>F@8$h zy#Y;pqX*n)x`KZ|5OCD)zc;-jzK^ktPt&bz4waApuMxp_ zCYSJ7-0FU|vw9D}-4E_*xoqxoSbzK;`FLrvcrKUn$T5jFwsSjgTdWlK<1&-HJhZ*tC=>K#pz-U>%l-QFvM9b*o63fE5keKm2g-90rXMd|YrcLl|Df*7Wt_c=NNl4B2fDC5 zcrhH%!D{aATfCDTYt7kN$5YUTV|>s^9^e9W{VHb5CL{!io@npJ&(0$swpGvN7UMtc_ zB!PFZ{fi*&h#3Ff+{w6Spg$)=pVajbQuejoKpJ)F|zGXimXZD zv;od$|Lk<+UadjmfX~F0dyAvuIEazwcF{-Jz8_qSvs;f?k+HeiqW2t}E{we`Vxyzx ziAO$omZbtbJUajQO`W5)I_l37#{qnJOF0MC^comFkI-Fw6EUd&KD%;UcLQjKJ}6$` zQIHs%I3N^5@J%R9iVA>57n%Rq|9h|bc^Z=P9Ou6R5C03kJz!UNf=8vR-quBkM+gwL zy=jignP|sw4adGq;-pK3_&6d;WGrpz#0i^eo;fj8t(z7WkCo?9ez6^`=3khi*JNIX z7IT2Ctg9?}WH8N6%Q=OOxhdp%eq)|ewr79*79MR!XCU$Gg{@WWJiLmjs^4qB`&?FV{)7)anaOprkU77p8srLi=GO zJu#EGhOdc~)MHs_}k~qepH}K4C~t)J2jAUa1+^oubINXwG2u|8Cn4RcW-W&tOlkU zW3hYs_vt1UU*jmrc3r1srM^H`97p1CpH1&*!9!mnnHmFIm^llyjQ*w@cD>^2iC3Nd zX;G1ULDMrihuFEd!&PUHxU6LVg@@NPDV0ca&g(A{DUP6!v2IbGNJSK_U>b$~FP*Oy zf=WcyuAt;OVeH;0-T3|5X zmKX4QM)^c|Gv<^d5Wl%t-{MSJx!n3k-R(|rkNK0Ye^ow@JNpJI`}<`FfrL* zCaGF36;01cMFh>`lu`wsryZ&mAe&qS-L(qt^ontJOiYiZDVPA>_L4sAmtlwD*WpAq zZR!gy9E&X3*s{mdQpM;d;G`XRaY`Cc38LCn|NnGkGwgeuJU9B-Y&eU}s>9yf-RWSD zP)}~p4NuZ!3(Z8TaHSY|N2Q}JbC;)9h0HMe#_cxU5IJ`uxozKOL5j6S+(LViF#Nwf z{oD(q0gekafjc%9#mUH3M(=o@7R0ht@=XiU%RGnUN7?P7E9M&)pFaa#W4`ZjFI<8? z9Jcca*%k}7%5Iz8-hTp@Xt?5>RsPnCHj%W?!$P^h5oIdP(NiS0qG6@~F?dd|+!Cu^ zI7OQ-2glO}hxU6cmOPO6UIf-2H?f>U=y(8M^_U5)7iy+~lo7a4DdNIu36_)A#HYv;3 zS2F|S$oG_p;xK|b8Zz^xJqxeA3Xh%!vmy}vs4G^@p;KuUKk&tW0spVKRI7AU7srRU z&qKr@sNz@;);BI}9}8C%xacJo3p?727 z-pz1kvK=a*C;J2pWx1qgHt@W4M^_jSzat?P4Egj5_o;OqXGn`nEJQe^I^HJG4Z?dRnd;^*mj(SZZXH;>xq9=F3hB6eUZjC+k=hd zY{{j=PN6+kv=@$|VF3^yfl^!ocZ1HOoI+%>zx7GY&s}X9R>eDQr0m zey|<5rY86h_TN12yKUhD9j+7)OXn{oJ5w!A$0@juQEDb;td4WzCe^J+q0_^bWZChsOv^Lu{9_YQO|Bv{&vl2MzpFf$Q4w_6C0SWHvYWV8hcrF|yy{!fEMx+O) zn8ie*h}V*;(NtpSGrS#7nd(>bfxNVhEUlP74Z9HN;{0-CCHNDIzckBFKpkC-4XET3 z_B%i(ciuQuBgb>UJl{f$vCEVVy(T_^>t7-X0N5rqZYctA*J z=@<1GbWJXP%{>0;K_?$oYRo}l1cvetX??!?|76=R{6zAyYwNPU7t%2exRz%A6!vS0 ziyQi4(On*B7gUj0GT7fpR`&7mN1ku1ebB4k4XHd{GN135sf6)Te7+$}gu~zaJxbqf ze({$nsGk3K@p}fk!VyKYAV{~}Cw%F(2zow%HYk-sWA=ZS!8AR9*FxY2yTy?f@SI zggRs{>FDDgu3UQJmUT6${Xdz}Se#7Ixr_z9bm|#Y0#$3&T5Z|}dntt0n!jD`pYtHB zHaV%D$E5zwjSae_*c~|=m^Dp1H8<1mpp&`BgmZpq6v9cZTK-9R++5AdPCWlAM1K-d zi2JkC{-poG0)+rq7#>@4${>x`Yt;EmYV8$IPS5)hnOMx`{B8U%<6F^~`}IwQH;5i!mC`8+>`5_;37oZRAibWtKh{ zIyG-E9jv;3zV9y1aK zNUn|DsJup-vD+lbX?^&lD)tEnL=K&cJ?e`Y=k;D{funMhl5gEgp`V}$yL^dNa7_R0 zDWD^+sPpSjpRp`C1)l;ZD$S7V<^KED^)O;=$CFU+vg}2oq}yq=z)sWx?ulDm3P%AW zJM!l3C;Nb?;01OJ!({CRQH;GfIm3jp8|&98Q*VvS?Zn3HE&q_|DqKW;D|WKA3K#i0 z|8ETS3*%~Mh(%58sMzx7L5LH%HYyN6mQpm?3Hg({^}ljV$rSoShxg(J_VdDmBJM

)?f^N%Ma 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


{dnA%jGV0oM{k;wO#!IXK0q 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%0DFObR)Y)9teS}HY((LzsFbpZ8 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 SB%XNy0000l-Nvr8{fU~#w*|RoKOh`hWWY>+ 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

_~JvG8(1FQt|778O-F2 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..4db2c8a --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,3 @@ + + #ff643c + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index d2aa524..0000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/assets/translations/en_En.json b/assets/translations/en-US.json similarity index 96% rename from assets/translations/en_En.json rename to assets/translations/en-US.json index 3552d0d..bdb591d 100644 --- a/assets/translations/en_En.json +++ b/assets/translations/en-US.json @@ -102,5 +102,7 @@ "rideHistory": "Ride History", "plsLoginToAcc": "Please Log In to Continue", "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", - "noOrderfound": "No order found" + "noOrderfound": "No order found", + "reset_password_link_sent": "A reset link has been sent to {email}", + "pay_amount": "Pay Amount: {amount}" } \ No newline at end of file diff --git a/assets/translations/ru-RU.json b/assets/translations/ru-RU.json new file mode 100644 index 0000000..bdb591d --- /dev/null +++ b/assets/translations/ru-RU.json @@ -0,0 +1,108 @@ +{ + "loginToExplore" : "Log in to explore your all in one vendor app favourites and shop effortlessly.", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in", + "orContinueWith": "or continue with", + + + "withGoogle": "with Google", + "withApple": "with Apple", + "dontHaveAccount": "Didn't have an account?", + "signUp": "Sign up", + "skip": "Skip", + "signUpToExplore": "Sign up to explore all our services and start shopping, riding, and more.", + "firstName": "First Name*", + "lastName": "Last Name*", + "enterMobileNumber": "Enter Mobile number", + "confirmPassword": "Confirm Password*", + "enterConfirmPassword": "Enter confirm password", + "referralCode": "Referral Code", + "enterReferralCode": "Enter referral code", + "alreadyHaveAccount":"Already have an account?", + "enterYourregisteredEmail": "Enter your registered email to receive a reset link.", + "sendLink": "Send Link", + "rememberPassword": "Remember Password?", + "enterOtpSent": "Enter the OTP sent to your mobile", + "resendOTP": "Resend OTP", + "verify": "Verify", + "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", + "sendCode":"Send Code", + "serviceIsUnavailable": "Service is unavailable at the selected address.", + "pickUpLocation": "Pickup Location", + "destinationLocation": "Destination Location", + "continueT":"Continue", + "plsSelectSourceLocation": "Please select source location", + "plsSelectDestinationLocations": "Please select destination location", + "selectVehicleType": "Select Your Vehicle Type", + "plsSelectVehicleTypeFirst": "Please select a vehicle type first.", + "plsSelectPaymentMethod": "Please select a payment method", + "insufficientWallet": "Insufficient wallet balance. Please select another payment method.", + "promoCode": "Promo code", + "thisOfferNotEligible": "This offer not eligible for this booking", + "viewAll": "View All", + "writeCoupon": "Write coupon Code", + "redeemNow": "Redeem now", + "plsEnterCouponCode":"Please enter a coupon code", + "couponApplied": "Coupon applied successfully", + "couponExpired": "This coupon code has been expired", + "invalidCouponCode": "Invalid coupon code", + "orderSummary": "Order Summary", + "subtotal": "Subtotal", + "discount": "Discount", + "orderTotal": "Order Total", + "confirmBooking": "Confirm Booking", + "waitingForDriver": "Waiting for driver....", + "cancelRide": "Cancel Ride", + "riderCancelledSucces": "Ride cancelled successfully", + "failedToCancel": "Failed to cancel ride", + "pleaseWait": "Please wait...", + "change": "Change", + "yourSosRequest": "Your SOS request has been submitted to admin", + "yourSosrequestAlreadySubmitted": "Your SOS request is already submitted", + "payNow": "Pay Now", + "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", + "somethingWentWrong": "Something went wrong, please contact admin.", + "cash": "Cash", + "coupon": "Coupon", + "couponNotFound": "Coupon not found.", + "tapToApply": "Tap To Apply", + "home": "Home", + "myBookings": "My Bookings", + "profile": "profile", + "wallet": "Wallet", + "cabServiceType": "Cab Service Type", + "everyRideVerified": "Every Ride. Every Driver. Verified.", + "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", + "intercity": "Intercity", + "aroundTheCity": "Around the city", + "rideDetails": "Ride Details", + "orderId": "Order Id:", + "bookingData": "Booking Date:", + "rideAndFareSummary": "Ride & Fare Summary", + "updateReview": "Update Review", + "addReview": "Add Review", + "complain": "Complain", + "distance": "Distance", + "km": "KM", + "duration": "Duration", + "howWasTrip": "How was your trip?", + "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", + "rateFor": "Rate for", + "typeComment": "Type comment....", + "title": "Title", + "typeDescription": "Type Description...", + "save": "Save", + "popularDestinations": "Popular Destinations", + "selectPaymentMethod": "Select Payment Method", + "prefferedPayment": "Preferred Payment", + "otherPaymentOptions": "Other Payment Options", + "rideHistory": "Ride History", + "plsLoginToAcc": "Please Log In to Continue", + "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", + "noOrderfound": "No order found", + "reset_password_link_sent": "A reset link has been sent to {email}", + "pay_amount": "Pay Amount: {amount}" +} \ No newline at end of file diff --git a/assets/translations/ru_RU.json b/assets/translations/ru_RU.json deleted file mode 100644 index e69de29..0000000 diff --git a/assets/translations/uz-UZ.json b/assets/translations/uz-UZ.json new file mode 100644 index 0000000..bdb591d --- /dev/null +++ b/assets/translations/uz-UZ.json @@ -0,0 +1,108 @@ +{ + "loginToExplore" : "Log in to explore your all in one vendor app favourites and shop effortlessly.", + "emailAddress": "Email Address*", + "password": "Password*", + "enterPassword": "Enter password", + "forgotPassword": "Forgot Password", + "login": "Log in", + "orContinueWith": "or continue with", + + + "withGoogle": "with Google", + "withApple": "with Apple", + "dontHaveAccount": "Didn't have an account?", + "signUp": "Sign up", + "skip": "Skip", + "signUpToExplore": "Sign up to explore all our services and start shopping, riding, and more.", + "firstName": "First Name*", + "lastName": "Last Name*", + "enterMobileNumber": "Enter Mobile number", + "confirmPassword": "Confirm Password*", + "enterConfirmPassword": "Enter confirm password", + "referralCode": "Referral Code", + "enterReferralCode": "Enter referral code", + "alreadyHaveAccount":"Already have an account?", + "enterYourregisteredEmail": "Enter your registered email to receive a reset link.", + "sendLink": "Send Link", + "rememberPassword": "Remember Password?", + "enterOtpSent": "Enter the OTP sent to your mobile", + "resendOTP": "Resend OTP", + "verify": "Verify", + "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", + "sendCode":"Send Code", + "serviceIsUnavailable": "Service is unavailable at the selected address.", + "pickUpLocation": "Pickup Location", + "destinationLocation": "Destination Location", + "continueT":"Continue", + "plsSelectSourceLocation": "Please select source location", + "plsSelectDestinationLocations": "Please select destination location", + "selectVehicleType": "Select Your Vehicle Type", + "plsSelectVehicleTypeFirst": "Please select a vehicle type first.", + "plsSelectPaymentMethod": "Please select a payment method", + "insufficientWallet": "Insufficient wallet balance. Please select another payment method.", + "promoCode": "Promo code", + "thisOfferNotEligible": "This offer not eligible for this booking", + "viewAll": "View All", + "writeCoupon": "Write coupon Code", + "redeemNow": "Redeem now", + "plsEnterCouponCode":"Please enter a coupon code", + "couponApplied": "Coupon applied successfully", + "couponExpired": "This coupon code has been expired", + "invalidCouponCode": "Invalid coupon code", + "orderSummary": "Order Summary", + "subtotal": "Subtotal", + "discount": "Discount", + "orderTotal": "Order Total", + "confirmBooking": "Confirm Booking", + "waitingForDriver": "Waiting for driver....", + "cancelRide": "Cancel Ride", + "riderCancelledSucces": "Ride cancelled successfully", + "failedToCancel": "Failed to cancel ride", + "pleaseWait": "Please wait...", + "change": "Change", + "yourSosRequest": "Your SOS request has been submitted to admin", + "yourSosrequestAlreadySubmitted": "Your SOS request is already submitted", + "payNow": "Pay Now", + "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", + "somethingWentWrong": "Something went wrong, please contact admin.", + "cash": "Cash", + "coupon": "Coupon", + "couponNotFound": "Coupon not found.", + "tapToApply": "Tap To Apply", + "home": "Home", + "myBookings": "My Bookings", + "profile": "profile", + "wallet": "Wallet", + "cabServiceType": "Cab Service Type", + "everyRideVerified": "Every Ride. Every Driver. Verified.", + "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", + "intercity": "Intercity", + "aroundTheCity": "Around the city", + "rideDetails": "Ride Details", + "orderId": "Order Id:", + "bookingData": "Booking Date:", + "rideAndFareSummary": "Ride & Fare Summary", + "updateReview": "Update Review", + "addReview": "Add Review", + "complain": "Complain", + "distance": "Distance", + "km": "KM", + "duration": "Duration", + "howWasTrip": "How was your trip?", + "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", + "rateFor": "Rate for", + "typeComment": "Type comment....", + "title": "Title", + "typeDescription": "Type Description...", + "save": "Save", + "popularDestinations": "Popular Destinations", + "selectPaymentMethod": "Select Payment Method", + "prefferedPayment": "Preferred Payment", + "otherPaymentOptions": "Other Payment Options", + "rideHistory": "Ride History", + "plsLoginToAcc": "Please Log In to Continue", + "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", + "noOrderfound": "No order found", + "reset_password_link_sent": "A reset link has been sent to {email}", + "pay_amount": "Pay Amount: {amount}" +} \ No newline at end of file diff --git a/assets/translations/uz_UZ.json b/assets/translations/uz_UZ.json deleted file mode 100644 index e69de29..0000000 diff --git a/lib/constant/constant.dart b/lib/constant/constant.dart index 4d13a6b..6becfc0 100644 --- a/lib/constant/constant.dart +++ b/lib/constant/constant.dart @@ -19,7 +19,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:geolocator/geolocator.dart' as geolocator; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:intl/intl.dart'; import 'package:mailer/mailer.dart'; @@ -172,7 +172,10 @@ class Constant { static bool checkZoneCheck(double latitude, double longLatitude) { bool isZoneAvailable = false; for (var element in Constant.zoneList) { - if (Constant.isPointInPolygon(LatLng(latitude, longLatitude), element.area!)) { + if (Constant.isPointInPolygon( + LatLng(latitude, longLatitude), + element.area!, + )) { isZoneAvailable = true; break; } else { @@ -185,7 +188,10 @@ class Constant { static String? getZoneId(double latitude, double longLatitude) { String? zoneId; for (var element in Constant.zoneList) { - if (Constant.isPointInPolygon(LatLng(latitude, longLatitude), element.area!)) { + if (Constant.isPointInPolygon( + LatLng(latitude, longLatitude), + element.area!, + )) { zoneId = element.id; break; } @@ -198,13 +204,18 @@ class Constant { return (rng.nextInt(900000) + 100000).toString(); // 6 digit } - static Future checkPermission({required BuildContext context, required Function() onTap}) async { + static Future checkPermission({ + required BuildContext context, + required Function() onTap, + }) async { LocationPermission permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); } if (permission == LocationPermission.denied) { - ShowToastDialog.showToast("You have to allow location permission to use your location"); + ShowToastDialog.showToast( + "You have to allow location permission to use your location", + ); } else if (permission == LocationPermission.deniedForever) { showDialog( context: context, @@ -241,7 +252,10 @@ class Constant { return isPlanExpire; } - static bool isExpireDate({required bool expiryDay, Timestamp? subscriptionExpiryDate}) { + static bool isExpireDate({ + required bool expiryDay, + Timestamp? subscriptionExpiryDate, + }) { bool isPlanExpire = false; if (expiryDay == true) { isPlanExpire = false; @@ -301,17 +315,49 @@ class Constant { String commission = "0"; if (sectionConstantModel!.adminCommision!.isEnabled == true) { if (vendorModel.adminCommission == null) { - if (sectionConstantModel!.adminCommision!.commissionType!.toLowerCase() == "Percent".toLowerCase() || - sectionConstantModel!.adminCommision!.commissionType?.toLowerCase() == "Percentage".toLowerCase()) { - commission = (double.parse(price) + (double.parse(price) * double.parse(sectionConstantModel!.adminCommision!.amount.toString()) / 100)).toString(); + if (sectionConstantModel!.adminCommision!.commissionType! + .toLowerCase() == + "Percent".toLowerCase() || + sectionConstantModel!.adminCommision!.commissionType + ?.toLowerCase() == + "Percentage".toLowerCase()) { + commission = + (double.parse(price) + + (double.parse(price) * + double.parse( + sectionConstantModel!.adminCommision!.amount + .toString(), + ) / + 100)) + .toString(); } else { - commission = (double.parse(price) + double.parse(sectionConstantModel!.adminCommision!.amount.toString())).toString(); + commission = + (double.parse(price) + + double.parse( + sectionConstantModel!.adminCommision!.amount.toString(), + )) + .toString(); } } else { - if (vendorModel.adminCommission!.commissionType!.toLowerCase() == "Percent".toLowerCase() || vendorModel.adminCommission!.commissionType?.toLowerCase() == "Percentage".toLowerCase()) { - commission = (double.parse(price) + (double.parse(price) * double.parse(vendorModel.adminCommission!.amount.toString()) / 100)).toString(); + if (vendorModel.adminCommission!.commissionType!.toLowerCase() == + "Percent".toLowerCase() || + vendorModel.adminCommission!.commissionType?.toLowerCase() == + "Percentage".toLowerCase()) { + commission = + (double.parse(price) + + (double.parse(price) * + double.parse( + vendorModel.adminCommission!.amount.toString(), + ) / + 100)) + .toString(); } else { - commission = (double.parse(price) + double.parse(vendorModel.adminCommission!.amount.toString())).toString(); + commission = + (double.parse(price) + + double.parse( + vendorModel.adminCommission!.amount.toString(), + )) + .toString(); } } } else { @@ -327,7 +373,10 @@ class Constant { if (taxModel.type == "fix") { taxAmount = double.parse(taxModel.tax.toString()); } else { - taxAmount = (double.parse(amount.toString()) * double.parse(taxModel.tax!.toString())) / 100; + taxAmount = + (double.parse(amount.toString()) * + double.parse(taxModel.tax!.toString())) / + 100; } } return taxAmount; @@ -336,8 +385,12 @@ class Constant { static double calculateDiscount({String? amount, CouponModel? offerModel}) { double taxAmount = 0.0; if (offerModel != null) { - if (offerModel.discountType == "Percentage" || offerModel.discountType == "percentage") { - taxAmount = (double.parse(amount.toString()) * double.parse(offerModel.discount.toString())) / 100; + if (offerModel.discountType == "Percentage" || + offerModel.discountType == "percentage") { + taxAmount = + (double.parse(amount.toString()) * + double.parse(offerModel.discount.toString())) / + 100; } else { taxAmount = double.parse(offerModel.discount.toString()); } @@ -345,11 +398,17 @@ class Constant { return taxAmount; } - static String calculateReview({required String? reviewCount, required String? reviewSum}) { - if (0 == double.parse(reviewSum.toString()) && 0 == double.parse(reviewSum.toString())) { + static String calculateReview({ + required String? reviewCount, + required String? reviewSum, + }) { + if (0 == double.parse(reviewSum.toString()) && + 0 == double.parse(reviewSum.toString())) { return "0"; } - return (double.parse(reviewSum.toString()) / double.parse(reviewCount.toString())).toStringAsFixed(1); + return (double.parse(reviewSum.toString()) / + double.parse(reviewCount.toString())) + .toStringAsFixed(1); } static String getUuid() { @@ -357,13 +416,24 @@ class Constant { } static Widget loader() { - return Center(child: CircularProgressIndicator(color: AppThemeData.primary300)); + return Center( + child: CircularProgressIndicator(color: AppThemeData.primary300), + ); } static Widget showEmptyView({required String message}) { final themeController = Get.find(); final isDark = themeController.isDark.value; - return Center(child: Text(message, style: TextStyle(fontFamily: AppThemeData.fontFamily, fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + message, + style: TextStyle( + fontFamily: AppThemeData.fontFamily, + fontSize: 18, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + ); } static String maskingString(String documentId, int maskingDigit) { @@ -382,7 +452,8 @@ class Constant { } String? validateEmail(String? value) { - String pattern = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; + String pattern = + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; RegExp regExp = RegExp(pattern); if (value == null || value.isEmpty) { return "Email is Required"; @@ -393,9 +464,19 @@ class Constant { } } - static String getDistance({required String lat1, required String lng1, required String lat2, required String lng2}) { + static String getDistance({ + required String lat1, + required String lng1, + required String lat2, + required String lng2, + }) { double distance; - double distanceInMeters = Geolocator.distanceBetween(double.parse(lat1), double.parse(lng1), double.parse(lat2), double.parse(lng2)); + double distanceInMeters = Geolocator.distanceBetween( + double.parse(lat1), + double.parse(lng1), + double.parse(lat2), + double.parse(lng2), + ); if (distanceType == "miles") { distance = distanceInMeters / 1609; } else { @@ -405,7 +486,8 @@ class Constant { } bool hasValidUrl(String? value) { - String pattern = r'(http|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?'; + String pattern = + r'(http|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?'; RegExp regExp = RegExp(pattern); if (value == null || value.isEmpty) { return false; @@ -415,10 +497,17 @@ class Constant { return true; } - static Future uploadUserImageToFireStorage(File image, String filePath, String fileName) async { - Reference upload = FirebaseStorage.instance.ref().child('$filePath/$fileName'); + static Future uploadUserImageToFireStorage( + File image, + String filePath, + String fileName, + ) async { + Reference upload = FirebaseStorage.instance.ref().child( + '$filePath/$fileName', + ); UploadTask uploadTask = upload.putFile(image); - var downloadUrl = await (await uploadTask.whenComplete(() {})).ref.getDownloadURL(); + var downloadUrl = + await (await uploadTask.whenComplete(() {})).ref.getDownloadURL(); return downloadUrl.toString(); } @@ -435,14 +524,22 @@ class Constant { Future getBytesFromAsset(String path, int width) async { ByteData data = await rootBundle.load(path); - ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(), targetWidth: width); + ui.Codec codec = await ui.instantiateImageCodec( + data.buffer.asUint8List(), + targetWidth: width, + ); ui.FrameInfo fi = await codec.getNextFrame(); - return (await fi.image.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List(); + return (await fi.image.toByteData( + format: ui.ImageByteFormat.png, + ))!.buffer.asUint8List(); } static Future selectTime(context) async { FocusScope.of(context).requestFocus(FocusNode()); //remove focus - TimeOfDay? newTime = await showTimePicker(context: context, initialTime: TimeOfDay.now()); + TimeOfDay? newTime = await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ); if (newTime != null) { return newTime; } @@ -480,7 +577,11 @@ class Constant { static int calculateDifference(DateTime date) { DateTime now = DateTime.now(); - return DateTime(date.year, date.month, date.day).difference(DateTime(now.year, now.month, now.day)).inDays; + return DateTime( + date.year, + date.month, + date.day, + ).difference(DateTime(now.year, now.month, now.day)).inDays; } static String timestampToDate(Timestamp timestamp) { @@ -509,7 +610,15 @@ class Constant { } static DateTime stringToDate(String openDineTime) { - return DateFormat('HH:mm').parse(DateFormat('HH:mm').format(DateFormat("hh:mm a").parse((Intl.getCurrentLocale() == "en_US") ? openDineTime : openDineTime.toLowerCase()))); + return DateFormat('HH:mm').parse( + DateFormat('HH:mm').format( + DateFormat("hh:mm a").parse( + (Intl.getCurrentLocale() == "en_US") + ? openDineTime + : openDineTime.toLowerCase(), + ), + ), + ); } static LanguageModel getLanguage() { @@ -527,7 +636,10 @@ class Constant { int crossings = 0; for (int i = 0; i < polygon.length; i++) { int next = (i + 1) % polygon.length; - if (polygon[i].latitude <= point.latitude && polygon[next].latitude > point.latitude || polygon[i].latitude > point.latitude && polygon[next].latitude <= point.latitude) { + if (polygon[i].latitude <= point.latitude && + polygon[next].latitude > point.latitude || + polygon[i].latitude > point.latitude && + polygon[next].latitude <= point.latitude) { double edgeLong = polygon[next].longitude - polygon[i].longitude; double edgeLat = polygon[next].latitude - polygon[i].latitude; double interpol = (point.latitude - polygon[i].latitude) / edgeLat; @@ -549,7 +661,12 @@ class Constant { allowInsecure: true, ); - static Future sendMail({String? subject, String? body, bool? isAdmin = false, List? recipients}) async { + static Future sendMail({ + String? subject, + String? body, + bool? isAdmin = false, + List? recipients, + }) async { // Create our message. if (mailSettings != null) { if (isAdmin == true) { @@ -557,7 +674,10 @@ class Constant { } final message = Message() - ..from = Address(mailSettings!.userName.toString(), mailSettings!.fromName.toString()) + ..from = Address( + mailSettings!.userName.toString(), + mailSettings!.fromName.toString(), + ) ..recipients = recipients! ..subject = subject ..text = body @@ -581,10 +701,17 @@ class Constant { // await connection.send(message); } - static Uri createCoordinatesUrl(double latitude, double longitude, [String? label]) { + static Uri createCoordinatesUrl( + double latitude, + double longitude, [ + String? label, + ]) { Uri uri; if (kIsWeb) { - uri = Uri.https('www.google.com', '/maps/search/', {'api': '1', 'query': '$latitude,$longitude'}); + uri = Uri.https('www.google.com', '/maps/search/', { + 'api': '1', + 'query': '$latitude,$longitude', + }); } else if (Platform.isAndroid) { var query = '$latitude,$longitude'; if (label != null) query += '($label)'; @@ -594,14 +721,18 @@ class Constant { if (label != null) params['q'] = label; uri = Uri.https('maps.apple.com', '/', params); } else { - uri = Uri.https('www.google.com', '/maps/search/', {'api': '1', 'query': '$latitude,$longitude'}); + uri = Uri.https('www.google.com', '/maps/search/', { + 'api': '1', + 'query': '$latitude,$longitude', + }); } return uri; } static Future sendOrderEmail({required OrderModel orderModel}) async { - EmailTemplateModel? emailTemplateModel = await FireStoreUtils.getEmailTemplates(newOrderPlaced); + EmailTemplateModel? emailTemplateModel = + await FireStoreUtils.getEmailTemplates(newOrderPlaced); if (emailTemplateModel != null) { String firstHTML = """ @@ -618,11 +749,23 @@ class Constant { """; String newString = emailTemplateModel.message.toString(); - newString = newString.replaceAll("{username}", "${Constant.userModel!.firstName} ${Constant.userModel!.lastName}"); + newString = newString.replaceAll( + "{username}", + "${Constant.userModel!.firstName} ${Constant.userModel!.lastName}", + ); newString = newString.replaceAll("{orderid}", orderModel.id.toString()); - newString = newString.replaceAll("{date}", DateFormat('yyyy-MM-dd').format(orderModel.createdAt!.toDate())); - newString = newString.replaceAll("{address}", orderModel.address!.getFullAddress()); - newString = newString.replaceAll("{paymentmethod}", orderModel.paymentMethod.toString()); + newString = newString.replaceAll( + "{date}", + DateFormat('yyyy-MM-dd').format(orderModel.createdAt!.toDate()), + ); + newString = newString.replaceAll( + "{address}", + orderModel.address!.getFullAddress(), + ); + newString = newString.replaceAll( + "{paymentmethod}", + orderModel.paymentMethod.toString(), + ); double deliveryCharge = 0.0; double total = 0.0; @@ -630,7 +773,8 @@ class Constant { double discount = 0.0; double taxAmount = 0.0; double tipValue = 0.0; - String specialLabel = '(${orderModel.specialDiscount!['special_discount_label']}${orderModel.specialDiscount!['specialType'] == "amount" ? currencyModel!.symbol : "%"})'; + String specialLabel = + '(${orderModel.specialDiscount!['special_discount_label']}${orderModel.specialDiscount!['specialType'] == "amount" ? currencyModel!.symbol : "%"})'; List htmlList = []; if (orderModel.deliveryCharge != null) { @@ -640,15 +784,22 @@ class Constant { tipValue = double.parse(orderModel.tipAmount.toString()); } for (var element in orderModel.products!) { - if (element.extrasPrice != null && element.extrasPrice!.isNotEmpty && double.parse(element.extrasPrice!) != 0.0) { - total += double.parse(element.quantity.toString()) * double.parse(element.extrasPrice!); + if (element.extrasPrice != null && + element.extrasPrice!.isNotEmpty && + double.parse(element.extrasPrice!) != 0.0) { + total += + double.parse(element.quantity.toString()) * + double.parse(element.extrasPrice!); } - total += double.parse(element.quantity.toString()) * double.parse(element.price.toString()); + total += + double.parse(element.quantity.toString()) * + double.parse(element.price.toString()); List? addon = element.extras; String extrasDisVal = ''; for (int i = 0; i < addon!.length; i++) { - extrasDisVal += '${addon[i].toString().replaceAll("\"", "")} ${(i == addon.length - 1) ? "" : ","}'; + extrasDisVal += + '${addon[i].toString().replaceAll("\"", "")} ${(i == addon.length - 1) ? "" : ","}'; } String product = """ @@ -666,7 +817,9 @@ class Constant { } if (orderModel.specialDiscount!.isNotEmpty) { - specialDiscount = double.parse(orderModel.specialDiscount!['special_discount'].toString()); + specialDiscount = double.parse( + orderModel.specialDiscount!['special_discount'].toString(), + ); } if (orderModel.couponId != null && orderModel.couponId!.isNotEmpty) { @@ -675,35 +828,81 @@ class Constant { List taxHtmlList = []; for (var element in taxList) { - taxAmount = taxAmount + calculateTax(amount: (total - discount - specialDiscount).toString(), taxModel: element); + taxAmount = + taxAmount + + calculateTax( + amount: (total - discount - specialDiscount).toString(), + taxModel: element, + ); String taxHtml = """${element.title}: ${amountShow(amount: calculateTax(amount: (total - discount - specialDiscount).toString(), taxModel: element).toString())}${taxList.indexOf(element) == taxList.length - 1 ? "" : "
"}"""; taxHtmlList.add(taxHtml); } var totalamount = - orderModel.deliveryCharge == null || orderModel.deliveryCharge!.isEmpty + orderModel.deliveryCharge == null || + orderModel.deliveryCharge!.isEmpty ? total + taxAmount - discount - specialDiscount - : total + taxAmount + double.parse(orderModel.deliveryCharge!) + double.parse(orderModel.tipAmount!) - discount - specialDiscount; + : total + + taxAmount + + double.parse(orderModel.deliveryCharge!) + + double.parse(orderModel.tipAmount!) - + discount - + specialDiscount; - newString = newString.replaceAll("{subtotal}", amountShow(amount: total.toString())); - newString = newString.replaceAll("{coupon}", orderModel.couponId.toString()); - newString = newString.replaceAll("{discountamount}", amountShow(amount: orderModel.discount.toString())); + newString = newString.replaceAll( + "{subtotal}", + amountShow(amount: total.toString()), + ); + newString = newString.replaceAll( + "{coupon}", + orderModel.couponId.toString(), + ); + newString = newString.replaceAll( + "{discountamount}", + amountShow(amount: orderModel.discount.toString()), + ); newString = newString.replaceAll("{specialcoupon}", specialLabel); - newString = newString.replaceAll("{specialdiscountamount}", amountShow(amount: specialDiscount.toString())); - newString = newString.replaceAll("{shippingcharge}", amountShow(amount: deliveryCharge.toString())); - newString = newString.replaceAll("{tipamount}", amountShow(amount: tipValue.toString())); - newString = newString.replaceAll("{totalAmount}", amountShow(amount: totalamount.toString())); + newString = newString.replaceAll( + "{specialdiscountamount}", + amountShow(amount: specialDiscount.toString()), + ); + newString = newString.replaceAll( + "{shippingcharge}", + amountShow(amount: deliveryCharge.toString()), + ); + newString = newString.replaceAll( + "{tipamount}", + amountShow(amount: tipValue.toString()), + ); + newString = newString.replaceAll( + "{totalAmount}", + amountShow(amount: totalamount.toString()), + ); String tableHTML = htmlList.join(); String lastHTML = "
"; - newString = newString.replaceAll("{productdetails}", firstHTML + tableHTML + lastHTML); + newString = newString.replaceAll( + "{productdetails}", + firstHTML + tableHTML + lastHTML, + ); newString = newString.replaceAll("{taxdetails}", taxHtmlList.join()); - newString = newString.replaceAll("{newwalletbalance}.", amountShow(amount: Constant.userModel!.walletAmount.toString())); + newString = newString.replaceAll( + "{newwalletbalance}.", + amountShow(amount: Constant.userModel!.walletAmount.toString()), + ); String subjectNewString = emailTemplateModel.subject.toString(); - subjectNewString = subjectNewString.replaceAll("{orderid}", orderModel.id.toString()); - await sendMail(subject: subjectNewString, isAdmin: emailTemplateModel.isSendToAdmin, body: newString, recipients: [Constant.userModel!.email]); + subjectNewString = subjectNewString.replaceAll( + "{orderid}", + orderModel.id.toString(), + ); + await sendMail( + subject: subjectNewString, + isAdmin: emailTemplateModel.isSendToAdmin, + body: newString, + recipients: [Constant.userModel!.email], + ); } } @@ -711,7 +910,12 @@ class Constant { const R = 6371; // Earth's radius in km final dLat = _degToRad(lat2 - lat1); final dLon = _degToRad(lon2 - lon1); - final a = sin(dLat / 2) * sin(dLat / 2) + cos(_degToRad(lat1)) * cos(_degToRad(lat2)) * sin(dLon / 2) * sin(dLon / 2); + final a = + sin(dLat / 2) * sin(dLat / 2) + + cos(_degToRad(lat1)) * + cos(_degToRad(lat2)) * + sin(dLon / 2) * + sin(dLon / 2); final c = 2 * atan2(sqrt(a), sqrt(1 - a)); return R * c; } @@ -725,13 +929,19 @@ class Constant { } /// Calculate tax amount for a single tax model - static double getTaxValue({required String amount, required TaxModel taxModel}) { + static double getTaxValue({ + required String amount, + required TaxModel taxModel, + }) { double taxVal = 0.0; if (taxModel.enable == true) { if (taxModel.type == "fix") { taxVal = double.tryParse(taxModel.tax.toString()) ?? 0.0; } else { - taxVal = (double.tryParse(amount) ?? 0.0) * (double.tryParse(taxModel.tax.toString()) ?? 0.0) / 100; + taxVal = + (double.tryParse(amount) ?? 0.0) * + (double.tryParse(taxModel.tax.toString()) ?? 0.0) / + 100; } } return taxVal; @@ -743,10 +953,15 @@ class Constant { if (response.statusCode != 200) throw Exception("Failed to load image"); final Uint8List bytes = response.bodyBytes; - final ui.Codec codec = await ui.instantiateImageCodec(bytes, targetWidth: width); + final ui.Codec codec = await ui.instantiateImageCodec( + bytes, + targetWidth: width, + ); final ui.FrameInfo frameInfo = await codec.getNextFrame(); - final ByteData? byteData = await frameInfo.image.toByteData(format: ui.ImageByteFormat.png); + final ByteData? byteData = await frameInfo.image.toByteData( + format: ui.ImageByteFormat.png, + ); return byteData!.buffer.asUint8List(); } catch (e) { print("⚠️ getBytesFromUrl error: $e — using default cab icon"); diff --git a/lib/controllers/0n_demand_payment_controller.dart b/lib/controllers/0n_demand_payment_controller.dart index 6a8e3cd..e53d848 100644 --- a/lib/controllers/0n_demand_payment_controller.dart +++ b/lib/controllers/0n_demand_payment_controller.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import '../../models/onprovider_order_model.dart'; import '../models/wallet_transaction_model.dart'; @@ -48,7 +48,9 @@ import '../utils/preferences.dart'; import 'on_demand_dashboard_controller.dart'; class OnDemandPaymentController extends GetxController { - Rx onDemandOrderModel = Rx(null); + Rx onDemandOrderModel = Rx( + null, + ); RxDouble totalAmount = 0.0.obs; late bool isExtra; @@ -76,19 +78,37 @@ class OnDemandPaymentController extends GetxController { ShowToastDialog.showLoader("Please wait...".tr()); onDemandOrderModel.value?.payment_method = selectedPaymentMethod.value; - onDemandOrderModel.value?.paymentStatus = onDemandOrderModel.value?.provider.priceUnit == "Fixed" && selectedPaymentMethod.value == "cod" ? false : true; + onDemandOrderModel.value?.paymentStatus = + onDemandOrderModel.value?.provider.priceUnit == "Fixed" && + selectedPaymentMethod.value == "cod" + ? false + : true; onDemandOrderModel.value?.extraPaymentStatus = true; - await FireStoreUtils.onDemandOrderPlace(onDemandOrderModel.value!, totalAmount.value); + await FireStoreUtils.onDemandOrderPlace( + onDemandOrderModel.value!, + totalAmount.value, + ); if (onDemandOrderModel.value?.status == Constant.orderPlaced) { - await FireStoreUtils.sendOrderOnDemandServiceEmail(orderModel: onDemandOrderModel.value!); + await FireStoreUtils.sendOrderOnDemandServiceEmail( + orderModel: onDemandOrderModel.value!, + ); - final providerUser = await FireStoreUtils.getUserProfile(onDemandOrderModel.value!.provider.author!); + final providerUser = await FireStoreUtils.getUserProfile( + onDemandOrderModel.value!.provider.author!, + ); if (providerUser != null) { - final payLoad = {"type": 'provider_order', "orderId": onDemandOrderModel.value?.id}; - await SendNotification.sendFcmMessage(Constant.bookingPlaced, providerUser.fcmToken ?? '', payLoad); + final payLoad = { + "type": 'provider_order', + "orderId": onDemandOrderModel.value?.id, + }; + await SendNotification.sendFcmMessage( + Constant.bookingPlaced, + providerUser.fcmToken ?? '', + payLoad, + ); } ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); @@ -107,16 +127,23 @@ class OnDemandPaymentController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } ShowToastDialog.closeLoader(); Get.offAll(const OnDemandDashboardScreen()); - OnDemandDashboardController controller = Get.put(OnDemandDashboardController()); + OnDemandDashboardController controller = Get.put( + OnDemandDashboardController(), + ); controller.selectedIndex.value = 2; } else { // Extra Charges Flow @@ -137,9 +164,14 @@ class OnDemandPaymentController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } @@ -160,9 +192,14 @@ class OnDemandPaymentController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-$totalAmount", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-$totalAmount", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -171,7 +208,9 @@ class OnDemandPaymentController extends GetxController { ShowToastDialog.closeLoader(); Get.offAll(const OnDemandDashboardScreen()); - OnDemandDashboardController controller = Get.put(OnDemandDashboardController()); + OnDemandDashboardController controller = Get.put( + OnDemandDashboardController(), + ); controller.selectedIndex.value = 2; } } @@ -194,19 +233,45 @@ class OnDemandPaymentController extends GetxController { Future getPaymentSettings() async { isLoading.value = true; await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -249,20 +314,32 @@ class OnDemandPaymentController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -308,7 +385,10 @@ class OnDemandPaymentController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -318,8 +398,14 @@ class OnDemandPaymentController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -332,12 +418,20 @@ class OnDemandPaymentController extends GetxController { }, ], "payer": {"email": Constant.userModel?.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -420,15 +514,23 @@ class OnDemandPaymentController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -436,15 +538,24 @@ class OnDemandPaymentController extends GetxController { "currency": "NGN", "redirect_url": "${Constant.globalUrl}payment/success", "payment_options": "ussd, card, barter, payattitude", - "customer": {"email": Constant.userModel?.email.toString(), "phonenumber": Constant.userModel?.phoneNumber, "name": Constant.userModel?.fullName()}, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customer": { + "email": Constant.userModel?.email.toString(), + "phonenumber": Constant.userModel?.phoneNumber, + "name": Constant.userModel?.fullName(), + }, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -473,8 +584,14 @@ class OnDemandPaymentController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: Constant.userModel!, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -494,26 +611,50 @@ class OnDemandPaymentController extends GetxController { final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString()}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + }, ); final data = jsonDecode(response.body); - await verifyCheckSum(checkSum: data["code"], amount: amount, orderId: orderId).then((value) { + await verifyCheckSum( + checkSum: data["code"], + amount: amount, + orderId: orderId, + ).then((value) { initiatePayment(amount: amount, orderId: orderId).then((value) { String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } GetPaymentTxtTokenModel result = value; - startTransaction(context, txnTokenBy: result.body.txnToken ?? '', orderId: orderId, amount: amount, callBackURL: callback, isStaging: paytmModel.value.isSandboxEnabled); + startTransaction( + context, + txnTokenBy: result.body.txnToken ?? '', + orderId: orderId, + amount: amount, + callBackURL: callback, + isStaging: paytmModel.value.isSandboxEnabled, + ); }); }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -549,24 +690,38 @@ class OnDemandPaymentController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -584,9 +739,12 @@ class OnDemandPaymentController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -604,7 +762,10 @@ class OnDemandPaymentController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': Constant.userModel?.phoneNumber, 'email': Constant.userModel?.email}, + 'prefill': { + 'contact': Constant.userModel?.phoneNumber, + 'email': Constant.userModel?.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -639,7 +800,10 @@ class OnDemandPaymentController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -657,15 +821,30 @@ class OnDemandPaymentController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -673,7 +852,9 @@ class OnDemandPaymentController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -692,16 +873,33 @@ class OnDemandPaymentController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString().isNotEmpty) { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -712,13 +910,22 @@ class OnDemandPaymentController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth ?? ''}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth ?? ''}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -731,21 +938,36 @@ class OnDemandPaymentController extends GetxController { return ''; } - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; // ✅ Null-safe handling bool isSandbox = orangeMoneyModel.value.isSandbox ?? false; - String apiUrl = isSandbox ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + isSandbox + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', @@ -761,7 +983,11 @@ class OnDemandPaymentController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -774,7 +1000,9 @@ class OnDemandPaymentController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -888,7 +1116,13 @@ class OnDemandPaymentController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -905,7 +1139,9 @@ class OnDemandPaymentController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -918,7 +1154,11 @@ class OnDemandPaymentController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/Intercity_home_controller.dart b/lib/controllers/Intercity_home_controller.dart index 20fef19..ba768de 100644 --- a/lib/controllers/Intercity_home_controller.dart +++ b/lib/controllers/Intercity_home_controller.dart @@ -48,7 +48,7 @@ import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:http/http.dart' as http; import 'package:latlong2/latlong.dart' as latlong; @@ -65,10 +65,13 @@ class IntercityHomeController extends GetxController { late GoogleMapController mapController; final flutterMap.MapController mapOsmController = flutterMap.MapController(); - final Rx sourceTextEditController = TextEditingController().obs; - final Rx destinationTextEditController = TextEditingController().obs; + final Rx sourceTextEditController = + TextEditingController().obs; + final Rx destinationTextEditController = + TextEditingController().obs; - final Rx couponCodeTextEditController = TextEditingController().obs; + final Rx couponCodeTextEditController = + TextEditingController().obs; final Rx currentLocation = Location().obs; @@ -142,64 +145,99 @@ class IntercityHomeController extends GetxController { await getPaymentSettings(); - FireStoreUtils.fireStore.collection(CollectionName.users).doc(FireStoreUtils.getCurrentUid()).snapshots().listen((userSnapshot) async { - if (!userSnapshot.exists) return; + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(FireStoreUtils.getCurrentUid()) + .snapshots() + .listen((userSnapshot) async { + if (!userSnapshot.exists) return; - userModel.value = UserModel.fromJson(userSnapshot.data()!); + userModel.value = UserModel.fromJson(userSnapshot.data()!); - if (userModel.value.inProgressOrderID != null && userModel.value.inProgressOrderID!.isNotEmpty) { - String? validRideId; + if (userModel.value.inProgressOrderID != null && + userModel.value.inProgressOrderID!.isNotEmpty) { + String? validRideId; - for (String id in userModel.value.inProgressOrderID!) { - final rideDoc = await FireStoreUtils.fireStore.collection(CollectionName.rides).doc(id).get(); + for (String id in userModel.value.inProgressOrderID!) { + final rideDoc = + await FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(id) + .get(); - if (rideDoc.exists && (rideDoc.data()?['rideType'] ?? '').toString().toLowerCase() == "intercity") { - validRideId = userModel.value.inProgressOrderID!.first!; - break; - } - } - - FireStoreUtils.fireStore.collection(CollectionName.rides).doc(validRideId).snapshots().listen((rideSnapshot) async { - if (!rideSnapshot.exists) return; - - final rideData = rideSnapshot.data()!; - currentOrder.value = CabOrderModel.fromJson(rideData); - final status = currentOrder.value.status; - - if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - FireStoreUtils.fireStore.collection(CollectionName.users).doc(currentOrder.value.driverId).snapshots().listen((event) async { - if (event.exists && event.data() != null) { - UserModel driverModel0 = UserModel.fromJson(event.data()!); - driverModel.value = driverModel0; - await updateDriverRoute(driverModel0); + if (rideDoc.exists && + (rideDoc.data()?['rideType'] ?? '') + .toString() + .toLowerCase() == + "intercity") { + validRideId = userModel.value.inProgressOrderID!.first!; + break; } - }); - } + } - print("Current Ride Status: $status"); - if (status == Constant.orderPlaced || status == Constant.driverPending || status == Constant.driverRejected || (status == Constant.orderAccepted && currentOrder.value.driverId == null)) { - bottomSheetType.value = 'waitingForDriver'; - } else if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - bottomSheetType.value = 'driverDetails'; - sourceTextEditController.value.text = currentOrder.value.sourceLocationName ?? ''; - destinationTextEditController.value.text = currentOrder.value.destinationLocationName ?? ''; - selectedPaymentMethod.value = currentOrder.value.paymentMethod ?? ''; - calculateTotalAmountAfterAccept(); - } else if (status == Constant.orderCompleted) { - userModel.value.inProgressOrderID!.remove(validRideId); - await FireStoreUtils.updateUser(userModel.value); + FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(validRideId) + .snapshots() + .listen((rideSnapshot) async { + if (!rideSnapshot.exists) return; + + final rideData = rideSnapshot.data()!; + currentOrder.value = CabOrderModel.fromJson(rideData); + final status = currentOrder.value.status; + + if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(currentOrder.value.driverId) + .snapshots() + .listen((event) async { + if (event.exists && event.data() != null) { + UserModel driverModel0 = UserModel.fromJson( + event.data()!, + ); + driverModel.value = driverModel0; + await updateDriverRoute(driverModel0); + } + }); + } + + print("Current Ride Status: $status"); + if (status == Constant.orderPlaced || + status == Constant.driverPending || + status == Constant.driverRejected || + (status == Constant.orderAccepted && + currentOrder.value.driverId == null)) { + bottomSheetType.value = 'waitingForDriver'; + } else if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + bottomSheetType.value = 'driverDetails'; + sourceTextEditController.value.text = + currentOrder.value.sourceLocationName ?? ''; + destinationTextEditController.value.text = + currentOrder.value.destinationLocationName ?? ''; + selectedPaymentMethod.value = + currentOrder.value.paymentMethod ?? ''; + calculateTotalAmountAfterAccept(); + } else if (status == Constant.orderCompleted) { + userModel.value.inProgressOrderID!.remove(validRideId); + await FireStoreUtils.updateUser(userModel.value); + bottomSheetType.value = 'location'; + Get.back(); + } + }); + } else { bottomSheetType.value = 'location'; - Get.back(); + if (Constant.currentLocation != null) { + setDepartureMarker( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ); + searchPlaceNameOSM(); + } } }); - } else { - bottomSheetType.value = 'location'; - if (Constant.currentLocation != null) { - setDepartureMarker(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude); - searchPlaceNameOSM(); - } - } - }); final coupons = await FireStoreUtils.getCabCoupon(); cabCouponList.value = coupons; @@ -226,18 +264,30 @@ class IntercityHomeController extends GetxController { if (order.status == Constant.driverAccepted) { // DRIVER → PICKUP - await fetchRouteWithWaypoints([latlong.LatLng(driverLat, driverLng), latlong.LatLng(pickupLat, pickupLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(driverLat, driverLng), + latlong.LatLng(pickupLat, pickupLng), + ]); } else if (order.status == Constant.orderInTransit) { // PICKUP → DESTINATION - await fetchRouteWithWaypoints([latlong.LatLng(pickupLat, pickupLng), latlong.LatLng(destLat, destLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(pickupLat, pickupLng), + latlong.LatLng(destLat, destLng), + ]); } updateRouteMarkers(driverModel); } else { /// For Google Maps if (order.status == Constant.driverAccepted) { - await fetchGoogleRouteBetween(LatLng(driverLat, driverLng), LatLng(pickupLat, pickupLng)); + await fetchGoogleRouteBetween( + LatLng(driverLat, driverLng), + LatLng(pickupLat, pickupLng), + ); } else if (order.status == Constant.orderInTransit) { - await fetchGoogleRouteBetween(LatLng(pickupLat, pickupLng), LatLng(destLat, destLng)); + await fetchGoogleRouteBetween( + LatLng(pickupLat, pickupLng), + LatLng(destLat, destLng), + ); } updateRouteMarkers(driverModel); } @@ -261,12 +311,24 @@ class IntercityHomeController extends GetxController { markers.clear(); osmMarker.clear(); - final departureBytes = await Constant().getBytesFromAsset('assets/images/location_black3x.png', 50); - final destinationBytes = await Constant().getBytesFromAsset('assets/images/location_orange3x.png', 50); + final departureBytes = await Constant().getBytesFromAsset( + 'assets/images/location_black3x.png', + 50, + ); + final destinationBytes = await Constant().getBytesFromAsset( + 'assets/images/location_orange3x.png', + 50, + ); final driverBytesRaw = (Constant.sectionConstantModel?.markerIcon?.isNotEmpty ?? false) - ? await Constant().getBytesFromUrl(Constant.sectionConstantModel!.markerIcon!, width: 120) - : await Constant().getBytesFromAsset('assets/images/ic_cab.png', 50); + ? await Constant().getBytesFromUrl( + Constant.sectionConstantModel!.markerIcon!, + width: 120, + ) + : await Constant().getBytesFromAsset( + 'assets/images/ic_cab.png', + 50, + ); departureIcon = BitmapDescriptor.fromBytes(departureBytes); destinationIcon = BitmapDescriptor.fromBytes(destinationBytes); @@ -275,7 +337,15 @@ class IntercityHomeController extends GetxController { if (Constant.selectedMapType == 'osm') { if (order.status == Constant.driverAccepted) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(pickupLat, pickupLng), width: 40, height: 40, child: Image.asset('assets/images/location_black3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(pickupLat, pickupLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_black3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -286,13 +356,26 @@ class IntercityHomeController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); } else if (order.status == Constant.orderInTransit) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(destLat, destLng), width: 40, height: 40, child: Image.asset('assets/images/location_orange3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(destLat, destLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_orange3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -303,7 +386,12 @@ class IntercityHomeController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); @@ -315,9 +403,18 @@ class IntercityHomeController extends GetxController { markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), infoWindow: InfoWindow(title: "Pickup Location".tr()), - icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), + icon: + departureIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueGreen, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver at Pickup".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } else if (order.status == Constant.orderInTransit) { markers.addAll([ @@ -325,9 +422,18 @@ class IntercityHomeController extends GetxController { markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), infoWindow: InfoWindow(title: "Destination Location".tr()), - icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), + icon: + destinationIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueRed, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver Location".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } } @@ -338,7 +444,10 @@ class IntercityHomeController extends GetxController { } } - Future fetchGoogleRouteBetween(LatLng originPoint, LatLng destPoint) async { + Future fetchGoogleRouteBetween( + LatLng originPoint, + LatLng destPoint, + ) async { final origin = '${originPoint.latitude},${originPoint.longitude}'; final destination = '${destPoint.latitude},${destPoint.longitude}'; final url = Uri.parse( @@ -355,7 +464,8 @@ class IntercityHomeController extends GetxController { final route = data['routes'][0]; final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -382,7 +492,12 @@ class IntercityHomeController extends GetxController { if (currentOrder.value.taxSetting != null) { for (var element in currentOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } } @@ -398,11 +513,19 @@ class IntercityHomeController extends GetxController { subTotal.value = getAmount(selectedVehicleType.value); if (selectedCouponModel.value.id != null) { - discount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + discount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } for (var element in Constant.taxList) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; @@ -439,9 +562,14 @@ class IntercityHomeController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -455,13 +583,25 @@ class IntercityHomeController extends GetxController { Future placeOrder() async { DestinationLocation sourceLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.latitude + : departureLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.longitude + : departureLatLong.value.longitude, ); DestinationLocation destinationLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.latitude : destinationLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.longitude : destinationLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.latitude + : destinationLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.longitude + : destinationLatLong.value.longitude, ); CabOrderModel orderModel = CabOrderModel(); @@ -472,7 +612,8 @@ class IntercityHomeController extends GetxController { orderModel.vehicleType = selectedVehicleType.value; orderModel.authorID = FireStoreUtils.getCurrentUid(); orderModel.sourceLocationName = sourceTextEditController.value.text; - orderModel.destinationLocationName = destinationTextEditController.value.text; + orderModel.destinationLocationName = + destinationTextEditController.value.text; orderModel.sourceLocation = sourceLocation; orderModel.destinationLocation = destinationLocation; @@ -484,11 +625,14 @@ class IntercityHomeController extends GetxController { orderModel.taxSetting = Constant.taxList; orderModel.adminCommissionType = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true - ? Constant.sectionConstantModel!.adminCommision!.commissionType.toString() + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true + ? Constant.sectionConstantModel!.adminCommision!.commissionType + .toString() : null; orderModel.adminCommission = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true ? Constant.sectionConstantModel!.adminCommision!.amount.toString() : null; orderModel.couponCode = couponCodeTextEditController.value.text; @@ -501,7 +645,9 @@ class IntercityHomeController extends GetxController { orderModel.roundTrip = false; orderModel.sectionId = Constant.sectionConstantModel!.id; orderModel.createdAt = Timestamp.now(); - orderModel.otpCode = (maths.Random().nextInt(9000) + 1000).toString(); // Generate a 4-digit OTP + orderModel.otpCode = + (maths.Random().nextInt(9000) + 1000) + .toString(); // Generate a 4-digit OTP orderModel.status = Constant.orderPlaced; orderModel.scheduleDateTime = Timestamp.now(); log("Order Model : ${orderModel.toJson()}"); @@ -516,8 +662,10 @@ class IntercityHomeController extends GetxController { double getAmount(VehicleType vehicleType) { final double currentDistance = distance.value; - if (currentDistance <= (vehicleType.minimum_delivery_charges_within_km ?? 0)) { - return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? 0.0; + if (currentDistance <= + (vehicleType.minimum_delivery_charges_within_km ?? 0)) { + return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? + 0.0; } else { return (vehicleType.delivery_charges_per_km ?? 0.0) * currentDistance; } @@ -542,28 +690,50 @@ class IntercityHomeController extends GetxController { void setStopMarker(double lat, double lng, int index) { if (Constant.selectedMapType == 'osm') { // Add new stop marker without clearing - osmMarker.add(flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: stopIconOsm!)); + osmMarker.add( + flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: stopIconOsm!, + ), + ); getDirections(isStopMarker: true); } else { final markerId = MarkerId('Stop $index'); markers.removeWhere((marker) => marker.markerId == markerId); - markers.add(Marker(markerId: markerId, infoWindow: InfoWindow(title: 'Stop ${String.fromCharCode(index + 65)}'), position: LatLng(lat, lng), icon: stopIcon!)); + markers.add( + Marker( + markerId: markerId, + infoWindow: InfoWindow( + title: 'Stop ${String.fromCharCode(index + 65)}', + ), + position: LatLng(lat, lng), + icon: stopIcon!, + ), + ); getDirections(); } } void _setOsmMarker(double lat, double lng, {required bool isDeparture}) { - final marker = flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: isDeparture ? departureIconOsm! : destinationIconOsm!); + final marker = flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: isDeparture ? departureIconOsm! : destinationIconOsm!, + ); if (isDeparture) { departureLatLongOsm.value = latlong.LatLng(lat, lng); } else { destinationLatLongOsm.value = latlong.LatLng(lat, lng); } osmMarker.add(marker); - if (departureLatLongOsm.value.latitude != 0 && destinationLatLongOsm.value.latitude != 0) { + if (departureLatLongOsm.value.latitude != 0 && + destinationLatLongOsm.value.latitude != 0) { getDirections(); animateToSource(lat, lng); } @@ -585,14 +755,26 @@ class IntercityHomeController extends GetxController { markers.removeWhere((marker) => marker.markerId == markerId); // Add new marker - markers.add(Marker(markerId: markerId, position: pos, icon: icon, infoWindow: InfoWindow(title: title))); + markers.add( + Marker( + markerId: markerId, + position: pos, + icon: icon, + infoWindow: InfoWindow(title: title), + ), + ); mapController.animateCamera(CameraUpdate.newLatLngZoom(pos, 14)); - if (departureLatLong.value.latitude != 0 && destinationLatLong.value.latitude != 0) { + if (departureLatLong.value.latitude != 0 && + destinationLatLong.value.latitude != 0) { getDirections(); } else { - mapController.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(target: LatLng(lat, lng), zoom: 14))); + mapController.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition(target: LatLng(lat, lng), zoom: 14), + ), + ); } } @@ -601,25 +783,43 @@ class IntercityHomeController extends GetxController { final wayPoints = []; // Only add valid source - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { wayPoints.add(departureLatLongOsm.value); } // Only add valid destination - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { wayPoints.add(destinationLatLongOsm.value); } if (!isStopMarker) osmMarker.clear(); // Add source marker - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: departureLatLongOsm.value, width: 40, height: 40, child: departureIconOsm!)); + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: departureLatLongOsm.value, + width: 40, + height: 40, + child: departureIconOsm!, + ), + ); } // Add destination marker - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: destinationLatLongOsm.value, width: 40, height: 40, child: destinationIconOsm!)); + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: destinationLatLongOsm.value, + width: 40, + height: 40, + child: destinationIconOsm!, + ), + ); } if (wayPoints.length >= 2) { @@ -632,10 +832,14 @@ class IntercityHomeController extends GetxController { } Future fetchGoogleRouteWithWaypoints() async { - if (departureLatLong.value.latitude == 0.0 || destinationLatLong.value.latitude == 0.0) return; + if (departureLatLong.value.latitude == 0.0 || + destinationLatLong.value.latitude == 0.0) + return; - final origin = '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; - final destination = '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; + final origin = + '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; + final destination = + '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; final url = Uri.parse( 'https://maps.googleapis.com/maps/api/directions/json' @@ -654,7 +858,8 @@ class IntercityHomeController extends GetxController { // Polyline final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -686,19 +891,26 @@ class IntercityHomeController extends GetxController { } Future fetchRouteWithWaypoints(List points) async { - final coordinates = points.map((p) => '${p.longitude},${p.latitude}').join(';'); - final url = Uri.parse('https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson'); + final coordinates = points + .map((p) => '${p.longitude},${p.latitude}') + .join(';'); + final url = Uri.parse( + 'https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson', + ); try { final response = await http.get(url); if (response.statusCode == 200) { final decoded = json.decode(response.body); - final geometry = decoded['routes'][0]['geometry']['coordinates'] as List; + final geometry = + decoded['routes'][0]['geometry']['coordinates'] as List; final dist = decoded['routes'][0]['distance']; final dur = decoded['routes'][0]['duration']; routePoints.clear(); - routePoints.addAll(geometry.map((coord) => latlong.LatLng(coord[1], coord[0]))); + routePoints.addAll( + geometry.map((coord) => latlong.LatLng(coord[1], coord[0])), + ); if (Constant.distanceType.toLowerCase() == "KM".toLowerCase()) { distance.value = dist / 1000.00; @@ -723,7 +935,10 @@ class IntercityHomeController extends GetxController { void zoomToPolylineOSM() { if (routePoints.isEmpty) return; // LatLngBounds requires at least two points - final bounds = flutterMap.LatLngBounds(routePoints.first, routePoints.first); + final bounds = flutterMap.LatLngBounds( + routePoints.first, + routePoints.first, + ); for (final point in routePoints) { bounds.extend(point); } @@ -735,8 +950,10 @@ class IntercityHomeController extends GetxController { double getBoundsZoomLevel(flutterMap.LatLngBounds bounds) { // Simple heuristic: zoom out for larger bounds - final latDiff = (bounds.northEast.latitude - bounds.southWest.latitude).abs(); - final lngDiff = (bounds.northEast.longitude - bounds.southWest.longitude).abs(); + final latDiff = + (bounds.northEast.latitude - bounds.southWest.latitude).abs(); + final lngDiff = + (bounds.northEast.longitude - bounds.southWest.longitude).abs(); double maxDiff = math.max(latDiff, lngDiff); if (maxDiff < 0.005) return 18.0; if (maxDiff < 0.01) return 16.0; @@ -748,7 +965,13 @@ class IntercityHomeController extends GetxController { void addPolyLine(List points) { final id = const PolylineId("poly"); - final polyline = Polyline(polylineId: id, color: AppThemeData.primary300, points: points, width: 6, geodesic: true); + final polyline = Polyline( + polylineId: id, + color: AppThemeData.primary300, + points: points, + width: 6, + geodesic: true, + ); polyLines[id] = polyline; if (points.length >= 2) { @@ -757,7 +980,10 @@ class IntercityHomeController extends GetxController { } } - Future updateCameraLocationToFitPolyline(List points, GoogleMapController? mapController) async { + Future updateCameraLocationToFitPolyline( + List points, + GoogleMapController? mapController, + ) async { if (mapController == null || points.isEmpty) return; double minLat = points.first.latitude, maxLat = points.first.latitude; double minLng = points.first.longitude, maxLng = points.first.longitude; @@ -767,16 +993,24 @@ class IntercityHomeController extends GetxController { if (p.longitude < minLng) minLng = p.longitude; if (p.longitude > maxLng) maxLng = p.longitude; } - final bounds = LatLngBounds(southwest: LatLng(minLat, minLng), northeast: LatLng(maxLat, maxLng)); + final bounds = LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50); await checkCameraLocation(cameraUpdate, mapController); } Future animateToSource(double lat, double long) async { - final hasBothCoords = departureLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.latitude != 0.0; + final hasBothCoords = + departureLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.latitude != 0.0; if (hasBothCoords) { - await calculateZoomLevel(source: departureLatLongOsm.value, destination: destinationLatLongOsm.value); + await calculateZoomLevel( + source: departureLatLongOsm.value, + destination: destinationLatLongOsm.value, + ); } else { mapOsmController.move(latlong.LatLng(lat, long), 10); } @@ -784,15 +1018,25 @@ class IntercityHomeController extends GetxController { RxMap polyLines = {}.obs; - Future calculateZoomLevel({required latlong.LatLng source, required latlong.LatLng destination, double paddingFraction = 0.001}) async { + Future calculateZoomLevel({ + required latlong.LatLng source, + required latlong.LatLng destination, + double paddingFraction = 0.001, + }) async { final bounds = flutterMap.LatLngBounds.fromPoints([source, destination]); final screenSize = Size(Get.width, Get.height * 0.5); const double worldDimension = 256.0; const double maxZoom = 10.0; - double latToRad(double lat) => math.log((1 + math.sin(lat * math.pi / 180)) / (1 - math.sin(lat * math.pi / 180))) / 2; + double latToRad(double lat) => + math.log( + (1 + math.sin(lat * math.pi / 180)) / + (1 - math.sin(lat * math.pi / 180)), + ) / + 2; - double computeZoom(double screenPx, double worldPx, double fraction) => math.log(screenPx / worldPx / fraction) / math.ln2; + double computeZoom(double screenPx, double worldPx, double fraction) => + math.log(screenPx / worldPx / fraction) / math.ln2; final north = bounds.northEast.latitude; final south = bounds.southWest.latitude; @@ -810,27 +1054,48 @@ class IntercityHomeController extends GetxController { final latFraction = (latToRad(north) - latToRad(south)) / math.pi; final lngFraction = ((east - west + 360) % 360) / 360; - final latZoom = computeZoom(screenSize.height, worldDimension, latFraction + paddingFraction); - final lngZoom = computeZoom(screenSize.width, worldDimension, lngFraction + paddingFraction); + final latZoom = computeZoom( + screenSize.height, + worldDimension, + latFraction + paddingFraction, + ); + final lngZoom = computeZoom( + screenSize.width, + worldDimension, + lngFraction + paddingFraction, + ); final zoomLevel = math.min(latZoom, lngZoom).clamp(0.0, maxZoom); mapOsmController.move(center, zoomLevel); } } - Future updateCameraLocation(LatLng source, LatLng destination, GoogleMapController? mapController) async { + Future updateCameraLocation( + LatLng source, + LatLng destination, + GoogleMapController? mapController, + ) async { if (mapController == null) return; final bounds = LatLngBounds( - southwest: LatLng(math.min(source.latitude, destination.latitude), math.min(source.longitude, destination.longitude)), - northeast: LatLng(math.max(source.latitude, destination.latitude), math.max(source.longitude, destination.longitude)), + southwest: LatLng( + math.min(source.latitude, destination.latitude), + math.min(source.longitude, destination.longitude), + ), + northeast: LatLng( + math.max(source.latitude, destination.latitude), + math.max(source.longitude, destination.longitude), + ), ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 90); await checkCameraLocation(cameraUpdate, mapController); } - Future checkCameraLocation(CameraUpdate cameraUpdate, GoogleMapController mapController) async { + Future checkCameraLocation( + CameraUpdate cameraUpdate, + GoogleMapController mapController, + ) async { await mapController.animateCamera(cameraUpdate); final l1 = await mapController.getVisibleRegion(); final l2 = await mapController.getVisibleRegion(); @@ -843,16 +1108,44 @@ class IntercityHomeController extends GetxController { Future setIcons() async { try { if (Constant.selectedMapType == 'osm') { - departureIconOsm = Image.asset("assets/icons/pickup.png", width: 30, height: 30); - destinationIconOsm = Image.asset("assets/icons/dropoff.png", width: 30, height: 30); - taxiIconOsm = Image.asset("assets/icons/ic_taxi.png", width: 30, height: 30); - stopIconOsm = Image.asset("assets/icons/location.png", width: 26, height: 26); + departureIconOsm = Image.asset( + "assets/icons/pickup.png", + width: 30, + height: 30, + ); + destinationIconOsm = Image.asset( + "assets/icons/dropoff.png", + width: 30, + height: 30, + ); + taxiIconOsm = Image.asset( + "assets/icons/ic_taxi.png", + width: 30, + height: 30, + ); + stopIconOsm = Image.asset( + "assets/icons/location.png", + width: 26, + height: 26, + ); } else { const config = ImageConfiguration(size: Size(48, 48)); - departureIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/pickup.png"); - destinationIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/dropoff.png"); - taxiIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/ic_taxi.png"); - stopIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/location.png"); + departureIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/pickup.png", + ); + destinationIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/dropoff.png", + ); + taxiIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/ic_taxi.png", + ); + stopIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/location.png", + ); } } catch (e) { print('Error loading icons: $e'); @@ -860,8 +1153,12 @@ class IntercityHomeController extends GetxController { } void clearMapDataIfLocationsRemoved() { - final isSourceEmpty = departureLatLongOsm.value.latitude == 0.0 && departureLatLongOsm.value.longitude == 0.0; - final isDestinationEmpty = destinationLatLongOsm.value.latitude == 0.0 && destinationLatLongOsm.value.longitude == 0.0; + final isSourceEmpty = + departureLatLongOsm.value.latitude == 0.0 && + departureLatLongOsm.value.longitude == 0.0; + final isDestinationEmpty = + destinationLatLongOsm.value.latitude == 0.0 && + destinationLatLongOsm.value.longitude == 0.0; if (isSourceEmpty || isDestinationEmpty) { // Clear polylines @@ -890,7 +1187,9 @@ class IntercityHomeController extends GetxController { // Remove marker if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == departureLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == departureLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Departure'); } @@ -906,7 +1205,9 @@ class IntercityHomeController extends GetxController { destinationTextEditController.value.clear(); if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == destinationLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == destinationLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Destination'); } @@ -916,9 +1217,16 @@ class IntercityHomeController extends GetxController { } Future searchPlaceNameOSM() async { - final url = Uri.parse('https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json'); + final url = Uri.parse( + 'https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json', + ); - final response = await http.get(url, headers: {'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)'}); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { log("response.body :: ${response.body}"); @@ -931,7 +1239,9 @@ class IntercityHomeController extends GetxController { final lat = departureLatLong.value.latitude; final lng = departureLatLong.value.longitude; - final url = Uri.parse('https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}'); + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}', + ); final response = await http.get(url); @@ -974,19 +1284,45 @@ class IntercityHomeController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -1028,20 +1364,32 @@ class IntercityHomeController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -1087,7 +1435,10 @@ class IntercityHomeController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -1097,8 +1448,14 @@ class IntercityHomeController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -1111,12 +1468,20 @@ class IntercityHomeController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -1174,9 +1539,12 @@ class IntercityHomeController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -1196,15 +1564,23 @@ class IntercityHomeController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -1217,14 +1593,19 @@ class IntercityHomeController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1253,8 +1634,14 @@ class IntercityHomeController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -1293,7 +1680,14 @@ class IntercityHomeController extends GetxController { // }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -1329,24 +1723,38 @@ class IntercityHomeController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -1364,9 +1772,12 @@ class IntercityHomeController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -1384,7 +1795,10 @@ class IntercityHomeController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -1419,7 +1833,10 @@ class IntercityHomeController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -1437,15 +1854,30 @@ class IntercityHomeController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -1453,7 +1885,9 @@ class IntercityHomeController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1470,13 +1904,30 @@ class IntercityHomeController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1488,13 +1939,22 @@ class IntercityHomeController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -1505,17 +1965,32 @@ class IntercityHomeController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -1530,7 +2005,11 @@ class IntercityHomeController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -1544,7 +2023,9 @@ class IntercityHomeController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1561,7 +2042,13 @@ class IntercityHomeController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1578,7 +2065,9 @@ class IntercityHomeController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -1591,7 +2080,11 @@ class IntercityHomeController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/address_list_controller.dart b/lib/controllers/address_list_controller.dart index 3a90915..ef1b6a2 100644 --- a/lib/controllers/address_list_controller.dart +++ b/lib/controllers/address_list_controller.dart @@ -1,6 +1,5 @@ import 'package:customer/models/user_model.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../service/fire_store_utils.dart'; @@ -18,7 +17,9 @@ class AddressListController extends GetxController { } Future getUser() async { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; if (userModel.value.shippingAddress != null) { diff --git a/lib/controllers/advertisement_list_controller.dart b/lib/controllers/advertisement_list_controller.dart index 56ae63b..a8f0e65 100644 --- a/lib/controllers/advertisement_list_controller.dart +++ b/lib/controllers/advertisement_list_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/advertisement_model.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AdvertisementListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/all_brand_product_controller.dart b/lib/controllers/all_brand_product_controller.dart index 5ffaec1..8a8867a 100644 --- a/lib/controllers/all_brand_product_controller.dart +++ b/lib/controllers/all_brand_product_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/brands_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllBrandProductController extends GetxController { RxList productList = [].obs; @@ -27,19 +27,27 @@ class AllBrandProductController extends GetxController { } Future getProductByCategoryId() async { - List productDataList = await FireStoreUtils.getProductListByBrandId(brandModel.value.id.toString()); + List productDataList = + await FireStoreUtils.getProductListByBrandId( + brandModel.value.id.toString(), + ); List vendorList = await FireStoreUtils.getAllStoresFuture(); List allProduct = []; for (var vendor in vendorList) { await FireStoreUtils.getAllProducts(vendor.id.toString()).then((value) { - if (Constant.isSubscriptionModelApplied == true || vendor.adminCommission?.isEnabled == true) { - if (vendor.subscriptionPlan != null && Constant.isExpire(vendor) == false) { + if (Constant.isSubscriptionModelApplied == true || + vendor.adminCommission?.isEnabled == true) { + if (vendor.subscriptionPlan != null && + Constant.isExpire(vendor) == false) { if (vendor.subscriptionPlan?.itemLimit == '-1') { allProduct.addAll(value); } else { int selectedProduct = - value.length < int.parse(vendor.subscriptionPlan?.itemLimit ?? '0') ? (value.isEmpty ? 0 : (value.length)) : int.parse(vendor.subscriptionPlan?.itemLimit ?? '0'); + value.length < + int.parse(vendor.subscriptionPlan?.itemLimit ?? '0') + ? (value.isEmpty ? 0 : (value.length)) + : int.parse(vendor.subscriptionPlan?.itemLimit ?? '0'); allProduct.addAll(value.sublist(0, selectedProduct)); } } @@ -49,7 +57,9 @@ class AllBrandProductController extends GetxController { }); } for (var element in productDataList) { - final bool productIsInList = allProduct.any((product) => product.id == element.id); + final bool productIsInList = allProduct.any( + (product) => product.id == element.id, + ); if (productIsInList) { productList.add(element); } diff --git a/lib/controllers/all_category_product_controller.dart b/lib/controllers/all_category_product_controller.dart index d5454f6..d609ade 100644 --- a/lib/controllers/all_category_product_controller.dart +++ b/lib/controllers/all_category_product_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllCategoryProductController extends GetxController { RxBool isLoading = true.obs; @@ -25,6 +25,8 @@ class AllCategoryProductController extends GetxController { } Future getProductByCategoryId() async { - productList.value = await FireStoreUtils.getProductListByCategoryId(categoryModel.value.id.toString()); + productList.value = await FireStoreUtils.getProductListByCategoryId( + categoryModel.value.id.toString(), + ); } } diff --git a/lib/controllers/book_parcel_controller.dart b/lib/controllers/book_parcel_controller.dart index 825b239..e7d25e1 100644 --- a/lib/controllers/book_parcel_controller.dart +++ b/lib/controllers/book_parcel_controller.dart @@ -8,7 +8,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart' as latlong; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; @@ -23,26 +23,39 @@ import '../themes/show_toast_dialog.dart'; class BookParcelController extends GetxController { // Sender details - final Rx senderLocationController = TextEditingController().obs; - final Rx senderNameController = TextEditingController().obs; - final Rx senderMobileController = TextEditingController().obs; - final Rx senderWeightController = SingleValueDropDownController().obs; - final Rx senderNoteController = TextEditingController().obs; - final Rx senderCountryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + final Rx senderLocationController = + TextEditingController().obs; + final Rx senderNameController = + TextEditingController().obs; + final Rx senderMobileController = + TextEditingController().obs; + final Rx senderWeightController = + SingleValueDropDownController().obs; + final Rx senderNoteController = + TextEditingController().obs; + final Rx senderCountryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; // Receiver details - final Rx receiverLocationController = TextEditingController().obs; - final Rx receiverNameController = TextEditingController().obs; - final Rx receiverMobileController = TextEditingController().obs; - final Rx receiverNoteController = TextEditingController().obs; - final Rx receiverCountryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + final Rx receiverLocationController = + TextEditingController().obs; + final Rx receiverNameController = + TextEditingController().obs; + final Rx receiverMobileController = + TextEditingController().obs; + final Rx receiverNoteController = + TextEditingController().obs; + final Rx receiverCountryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; // Delivery type final RxString selectedDeliveryType = 'now'.obs; // Scheduled delivery fields - final Rx scheduledDateController = TextEditingController().obs; - final Rx scheduledTimeController = TextEditingController().obs; + final Rx scheduledDateController = + TextEditingController().obs; + final Rx scheduledTimeController = + TextEditingController().obs; final RxString scheduledDate = ''.obs; final RxString scheduledTime = ''.obs; @@ -83,7 +96,12 @@ class BookParcelController extends GetxController { } Future pickScheduledDate(BuildContext context) async { - final DateTime? picked = await showDatePicker(context: context, initialDate: DateTime.now(), firstDate: DateTime.now(), lastDate: DateTime.now().add(const Duration(days: 365))); + final DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime.now(), + lastDate: DateTime.now().add(const Duration(days: 365)), + ); if (picked != null) { final formattedDate = "${picked.day}/${picked.month}/${picked.year}"; scheduledDate.value = formattedDate; @@ -92,7 +110,10 @@ class BookParcelController extends GetxController { } Future pickScheduledTime(BuildContext context) async { - final TimeOfDay? picked = await showTimePicker(context: context, initialTime: TimeOfDay.now()); + final TimeOfDay? picked = await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ); if (picked != null) { final formattedTime = picked.format(context); scheduledTime.value = formattedTime; @@ -102,7 +123,10 @@ class BookParcelController extends GetxController { void onCameraClick(BuildContext context) { final action = CupertinoActionSheet( - message: Text('Add your parcel image.'.tr(), style: const TextStyle(fontSize: 15.0)), + message: Text( + 'Add your parcel image.'.tr(), + style: const TextStyle(fontSize: 15.0), + ), actions: [ CupertinoActionSheetAction( child: Text('Choose image from gallery'.tr()), @@ -118,14 +142,19 @@ class BookParcelController extends GetxController { child: Text('Take a picture'.tr()), onPressed: () async { Navigator.pop(context); - final XFile? photo = await _picker.pickImage(source: ImageSource.camera); + final XFile? photo = await _picker.pickImage( + source: ImageSource.camera, + ); if (photo != null) { images.add(photo); } }, ), ], - cancelButton: CupertinoActionSheetAction(child: Text('Cancel'.tr()), onPressed: () => Navigator.pop(context)), + cancelButton: CupertinoActionSheetAction( + child: Text('Cancel'.tr()), + onPressed: () => Navigator.pop(context), + ), ); showCupertinoModalPopup(context: context, builder: (context) => action); } @@ -134,11 +163,18 @@ class BookParcelController extends GetxController { try { await Geolocator.requestPermission(); final position = await Geolocator.getCurrentPosition(); - final placemarks = await placemarkFromCoordinates(position.latitude, position.longitude); + final placemarks = await placemarkFromCoordinates( + position.latitude, + position.longitude, + ); final place = placemarks.first; - final address = "${place.name}, ${place.subLocality}, ${place.locality}, ${place.administrativeArea}, ${place.postalCode}, ${place.country}"; + final address = + "${place.name}, ${place.subLocality}, ${place.locality}, ${place.administrativeArea}, ${place.postalCode}, ${place.country}"; - final userLocation = UserLocation(latitude: position.latitude, longitude: position.longitude); + final userLocation = UserLocation( + latitude: position.latitude, + longitude: position.longitude, + ); senderLocation.value = userLocation; senderLocationController.value.text = address; } catch (e) { @@ -179,7 +215,9 @@ class BookParcelController extends GetxController { ShowToastDialog.showToast("Please select parcel weight".tr()); return false; } else if (senderLocation.value == null || receiverLocation.value == null) { - ShowToastDialog.showToast("Please select both sender and receiver locations".tr()); + ShowToastDialog.showToast( + "Please select both sender and receiver locations".tr(), + ); return false; } return true; @@ -193,22 +231,37 @@ class BookParcelController extends GetxController { if (Constant.selectedMapType == 'osm') { print("Fetching route using OSM"); - print("Sender Location: ${senderLocation.value?.latitude}, ${senderLocation.value?.longitude}"); - print("Receiver Location: ${receiverLocation.value?.latitude}, ${receiverLocation.value?.longitude}"); + print( + "Sender Location: ${senderLocation.value?.latitude}, ${senderLocation.value?.longitude}", + ); + print( + "Receiver Location: ${receiverLocation.value?.latitude}, ${receiverLocation.value?.longitude}", + ); await fetchRouteWithWaypoints([ - latlong.LatLng(senderLocation.value?.latitude ?? 0.0, senderLocation.value?.longitude ?? 0.0), - latlong.LatLng(receiverLocation.value?.latitude ?? 0.0, receiverLocation.value?.longitude ?? 0.0), + latlong.LatLng( + senderLocation.value?.latitude ?? 0.0, + senderLocation.value?.longitude ?? 0.0, + ), + latlong.LatLng( + receiverLocation.value?.latitude ?? 0.0, + receiverLocation.value?.longitude ?? 0.0, + ), ]); } else { await fetchGoogleRouteWithWaypoints(); } if (distance.value < 0.5) { - ShowToastDialog.showToast("Sender's location to receiver's location should be more than 1 km.".tr()); + ShowToastDialog.showToast( + "Sender's location to receiver's location should be more than 1 km." + .tr(), + ); return; } - subTotal.value = (distance.value * double.parse(selectedWeight!.deliveryCharge.toString())); + subTotal.value = + (distance.value * + double.parse(selectedWeight!.deliveryCharge.toString())); goToCart(); } catch (e) { ShowToastDialog.showToast("Something went wrong while booking.".tr()); @@ -217,7 +270,10 @@ class BookParcelController extends GetxController { } void goToCart() { - DateTime senderPickup = isScheduled.value ? parseScheduledDateTime(scheduledDate.value, scheduledTime.value) : DateTime.now(); + DateTime senderPickup = + isScheduled.value + ? parseScheduledDateTime(scheduledDate.value, scheduledTime.value) + : DateTime.now(); print("Sender Pickup: $distance"); ParcelOrderModel order = ParcelOrderModel( @@ -236,22 +292,42 @@ class BookParcelController extends GetxController { taxSetting: Constant.taxList, isSchedule: isScheduled.value, sourcePoint: G( - geopoint: GeoPoint(senderLocation.value!.latitude ?? 0.0, senderLocation.value!.longitude ?? 0.0), - geohash: Geoflutterfire().point(latitude: senderLocation.value!.latitude ?? 0.0, longitude: senderLocation.value!.longitude ?? 0.0).hash, + geopoint: GeoPoint( + senderLocation.value!.latitude ?? 0.0, + senderLocation.value!.longitude ?? 0.0, + ), + geohash: + Geoflutterfire() + .point( + latitude: senderLocation.value!.latitude ?? 0.0, + longitude: senderLocation.value!.longitude ?? 0.0, + ) + .hash, ), destinationPoint: G( - geopoint: GeoPoint(receiverLocation.value!.latitude ?? 0.0, receiverLocation.value!.longitude ?? 0.0), - geohash: Geoflutterfire().point(latitude: receiverLocation.value!.latitude ?? 0.0, longitude: receiverLocation.value!.longitude ?? 0.0).hash, + geopoint: GeoPoint( + receiverLocation.value!.latitude ?? 0.0, + receiverLocation.value!.longitude ?? 0.0, + ), + geohash: + Geoflutterfire() + .point( + latitude: receiverLocation.value!.latitude ?? 0.0, + longitude: receiverLocation.value!.longitude ?? 0.0, + ) + .hash, ), sender: LocationInformation( address: senderLocationController.value.text, name: senderNameController.value.text, - phone: "(${senderCountryCodeController.value.text}) ${senderMobileController.value.text}", + phone: + "(${senderCountryCodeController.value.text}) ${senderMobileController.value.text}", ), receiver: LocationInformation( address: receiverLocationController.value.text, name: receiverNameController.value.text, - phone: "(${receiverCountryCodeController.value.text}) ${receiverMobileController.value.text}", + phone: + "(${receiverCountryCodeController.value.text}) ${receiverMobileController.value.text}", ), receiverLatLong: receiverLocation.value, senderLatLong: senderLocation.value, @@ -262,7 +338,10 @@ class BookParcelController extends GetxController { debugPrint("Subtotal: ${subTotal.value}"); debugPrint("Order JSON: ${order.toJson()}"); - Get.to(() => ParcelOrderConfirmationScreen(), arguments: {'parcelOrder': order, 'images': images}); + Get.to( + () => ParcelOrderConfirmationScreen(), + arguments: {'parcelOrder': order, 'images': images}, + ); } DateTime parseScheduledDateTime(String dateStr, String timeStr) { @@ -272,7 +351,10 @@ class BookParcelController extends GetxController { final month = int.parse(dateParts[1]); final year = int.parse(dateParts[2]); - final time = TimeOfDay(hour: int.parse(timeStr.split(':')[0]), minute: int.parse(timeStr.split(':')[1].split(' ')[0])); + final time = TimeOfDay( + hour: int.parse(timeStr.split(':')[0]), + minute: int.parse(timeStr.split(':')[1].split(' ')[0]), + ); final isPM = timeStr.toLowerCase().contains('pm'); final hour24 = isPM && time.hour < 12 ? time.hour + 12 : time.hour; @@ -284,9 +366,13 @@ class BookParcelController extends GetxController { } Future fetchGoogleRouteWithWaypoints() async { - final origin = '${senderLocation.value!.latitude},${senderLocation.value!.longitude}'; - final destination = '${receiverLocation.value!.latitude},${receiverLocation.value!.longitude}'; - final url = Uri.parse('https://maps.googleapis.com/maps/api/directions/json?origin=$origin&destination=$destination&mode=driving&key=${Constant.mapAPIKey}'); + final origin = + '${senderLocation.value!.latitude},${senderLocation.value!.longitude}'; + final destination = + '${receiverLocation.value!.latitude},${receiverLocation.value!.longitude}'; + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/directions/json?origin=$origin&destination=$destination&mode=driving&key=${Constant.mapAPIKey}', + ); try { final response = await http.get(url); @@ -315,8 +401,12 @@ class BookParcelController extends GetxController { } Future fetchRouteWithWaypoints(List points) async { - final coordinates = points.map((p) => '${p.longitude},${p.latitude}').join(';'); - final url = Uri.parse('https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson'); + final coordinates = points + .map((p) => '${p.longitude},${p.latitude}') + .join(';'); + final url = Uri.parse( + 'https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson', + ); try { final response = await http.get(url); diff --git a/lib/controllers/cab_booking_controller.dart b/lib/controllers/cab_booking_controller.dart index ce05319..ccd500c 100644 --- a/lib/controllers/cab_booking_controller.dart +++ b/lib/controllers/cab_booking_controller.dart @@ -46,7 +46,7 @@ import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:http/http.dart' as http; import 'package:latlong2/latlong.dart' as latlong; @@ -60,10 +60,13 @@ class CabBookingController extends GetxController { late GoogleMapController mapController; final flutterMap.MapController mapOsmController = flutterMap.MapController(); - final Rx sourceTextEditController = TextEditingController().obs; - final Rx destinationTextEditController = TextEditingController().obs; + final Rx sourceTextEditController = + TextEditingController().obs; + final Rx destinationTextEditController = + TextEditingController().obs; - final Rx couponCodeTextEditController = TextEditingController().obs; + final Rx couponCodeTextEditController = + TextEditingController().obs; final Rx currentLocation = Location().obs; @@ -133,64 +136,99 @@ class CabBookingController extends GetxController { await getPaymentSettings(); - FireStoreUtils.fireStore.collection(CollectionName.users).doc(FireStoreUtils.getCurrentUid()).snapshots().listen((userSnapshot) async { - if (!userSnapshot.exists) return; + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(FireStoreUtils.getCurrentUid()) + .snapshots() + .listen((userSnapshot) async { + if (!userSnapshot.exists) return; - userModel.value = UserModel.fromJson(userSnapshot.data()!); + userModel.value = UserModel.fromJson(userSnapshot.data()!); - if (userModel.value.inProgressOrderID != null && userModel.value.inProgressOrderID!.isNotEmpty) { - String? validRideId; + if (userModel.value.inProgressOrderID != null && + userModel.value.inProgressOrderID!.isNotEmpty) { + String? validRideId; - for (String id in userModel.value.inProgressOrderID!) { - final rideDoc = await FireStoreUtils.fireStore.collection(CollectionName.rides).doc(id).get(); + for (String id in userModel.value.inProgressOrderID!) { + final rideDoc = + await FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(id) + .get(); - if (rideDoc.exists && (rideDoc.data()?['rideType'] ?? '').toString().toLowerCase() == "ride") { - validRideId = userModel.value.inProgressOrderID!.first!; - break; - } - } - - FireStoreUtils.fireStore.collection(CollectionName.rides).doc(validRideId).snapshots().listen((rideSnapshot) async { - if (!rideSnapshot.exists) return; - - final rideData = rideSnapshot.data()!; - currentOrder.value = CabOrderModel.fromJson(rideData); - final status = currentOrder.value.status; - - if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - FireStoreUtils.fireStore.collection(CollectionName.users).doc(currentOrder.value.driverId).snapshots().listen((event) async { - if (event.exists && event.data() != null) { - UserModel driverModel0 = UserModel.fromJson(event.data()!); - driverModel.value = driverModel0; - await updateDriverRoute(driverModel0); + if (rideDoc.exists && + (rideDoc.data()?['rideType'] ?? '') + .toString() + .toLowerCase() == + "ride") { + validRideId = userModel.value.inProgressOrderID!.first!; + break; } - }); - } + } - print("Current Ride Status: $status"); - if (status == Constant.orderPlaced || status == Constant.driverPending || status == Constant.driverRejected || (status == Constant.orderAccepted && currentOrder.value.driverId == null)) { - bottomSheetType.value = 'waitingForDriver'; - } else if (status == Constant.driverAccepted || status == Constant.orderInTransit) { - bottomSheetType.value = 'driverDetails'; - sourceTextEditController.value.text = currentOrder.value.sourceLocationName ?? ''; - destinationTextEditController.value.text = currentOrder.value.destinationLocationName ?? ''; - selectedPaymentMethod.value = currentOrder.value.paymentMethod ?? ''; - calculateTotalAmountAfterAccept(); - } else if (status == Constant.orderCompleted) { - userModel.value.inProgressOrderID!.remove(validRideId); - await FireStoreUtils.updateUser(userModel.value); + FireStoreUtils.fireStore + .collection(CollectionName.rides) + .doc(validRideId) + .snapshots() + .listen((rideSnapshot) async { + if (!rideSnapshot.exists) return; + + final rideData = rideSnapshot.data()!; + currentOrder.value = CabOrderModel.fromJson(rideData); + final status = currentOrder.value.status; + + if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(currentOrder.value.driverId) + .snapshots() + .listen((event) async { + if (event.exists && event.data() != null) { + UserModel driverModel0 = UserModel.fromJson( + event.data()!, + ); + driverModel.value = driverModel0; + await updateDriverRoute(driverModel0); + } + }); + } + + print("Current Ride Status: $status"); + if (status == Constant.orderPlaced || + status == Constant.driverPending || + status == Constant.driverRejected || + (status == Constant.orderAccepted && + currentOrder.value.driverId == null)) { + bottomSheetType.value = 'waitingForDriver'; + } else if (status == Constant.driverAccepted || + status == Constant.orderInTransit) { + bottomSheetType.value = 'driverDetails'; + sourceTextEditController.value.text = + currentOrder.value.sourceLocationName ?? ''; + destinationTextEditController.value.text = + currentOrder.value.destinationLocationName ?? ''; + selectedPaymentMethod.value = + currentOrder.value.paymentMethod ?? ''; + calculateTotalAmountAfterAccept(); + } else if (status == Constant.orderCompleted) { + userModel.value.inProgressOrderID!.remove(validRideId); + await FireStoreUtils.updateUser(userModel.value); + bottomSheetType.value = 'location'; + Get.back(); + } + }); + } else { bottomSheetType.value = 'location'; - Get.back(); + if (Constant.currentLocation != null) { + setDepartureMarker( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ); + searchPlaceNameOSM(); + } } }); - } else { - bottomSheetType.value = 'location'; - if (Constant.currentLocation != null) { - setDepartureMarker(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude); - searchPlaceNameOSM(); - } - } - }); final coupons = await FireStoreUtils.getCabCoupon(); cabCouponList.value = coupons; @@ -217,18 +255,30 @@ class CabBookingController extends GetxController { if (order.status == Constant.driverAccepted) { // DRIVER → PICKUP - await fetchRouteWithWaypoints([latlong.LatLng(driverLat, driverLng), latlong.LatLng(pickupLat, pickupLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(driverLat, driverLng), + latlong.LatLng(pickupLat, pickupLng), + ]); } else if (order.status == Constant.orderInTransit) { // PICKUP → DESTINATION - await fetchRouteWithWaypoints([latlong.LatLng(driverLat, driverLng), latlong.LatLng(destLat, destLng)]); + await fetchRouteWithWaypoints([ + latlong.LatLng(driverLat, driverLng), + latlong.LatLng(destLat, destLng), + ]); } updateRouteMarkers(driverModel); } else { /// For Google Maps if (order.status == Constant.driverAccepted) { - await fetchGoogleRouteBetween(LatLng(driverLat, driverLng), LatLng(pickupLat, pickupLng)); + await fetchGoogleRouteBetween( + LatLng(driverLat, driverLng), + LatLng(pickupLat, pickupLng), + ); } else if (order.status == Constant.orderInTransit) { - await fetchGoogleRouteBetween(LatLng(driverLat, driverLng), LatLng(destLat, destLng)); + await fetchGoogleRouteBetween( + LatLng(driverLat, driverLng), + LatLng(destLat, destLng), + ); } updateRouteMarkers(driverModel); } @@ -252,12 +302,24 @@ class CabBookingController extends GetxController { markers.clear(); osmMarker.clear(); - final departureBytes = await Constant().getBytesFromAsset('assets/images/location_black3x.png', 50); - final destinationBytes = await Constant().getBytesFromAsset('assets/images/location_orange3x.png', 50); + final departureBytes = await Constant().getBytesFromAsset( + 'assets/images/location_black3x.png', + 50, + ); + final destinationBytes = await Constant().getBytesFromAsset( + 'assets/images/location_orange3x.png', + 50, + ); final driverBytesRaw = (Constant.sectionConstantModel?.markerIcon?.isNotEmpty ?? false) - ? await Constant().getBytesFromUrl(Constant.sectionConstantModel!.markerIcon!, width: 120) - : await Constant().getBytesFromAsset('assets/images/ic_cab.png', 50); + ? await Constant().getBytesFromUrl( + Constant.sectionConstantModel!.markerIcon!, + width: 120, + ) + : await Constant().getBytesFromAsset( + 'assets/images/ic_cab.png', + 50, + ); departureIcon = BitmapDescriptor.fromBytes(departureBytes); destinationIcon = BitmapDescriptor.fromBytes(destinationBytes); @@ -266,7 +328,15 @@ class CabBookingController extends GetxController { if (Constant.selectedMapType == 'osm') { if (order.status == Constant.driverAccepted) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(pickupLat, pickupLng), width: 40, height: 40, child: Image.asset('assets/images/location_black3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(pickupLat, pickupLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_black3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -277,13 +347,26 @@ class CabBookingController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); } else if (order.status == Constant.orderInTransit) { osmMarker.addAll([ - flutterMap.Marker(point: latlong.LatLng(destLat, destLng), width: 40, height: 40, child: Image.asset('assets/images/location_orange3x.png', width: 40)), + flutterMap.Marker( + point: latlong.LatLng(destLat, destLng), + width: 40, + height: 40, + child: Image.asset( + 'assets/images/location_orange3x.png', + width: 40, + ), + ), flutterMap.Marker( point: latlong.LatLng(driverLat, driverLng), width: 45, @@ -294,7 +377,12 @@ class CabBookingController extends GetxController { height: 50, imageUrl: Constant.sectionConstantModel!.markerIcon.toString(), placeholder: (context, url) => Constant.loader(), - errorWidget: (context, url, error) => SizedBox(width: 30, height: 30, child: CircularProgressIndicator(strokeWidth: 2)), + errorWidget: + (context, url, error) => SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator(strokeWidth: 2), + ), ), ), ]); @@ -306,9 +394,18 @@ class CabBookingController extends GetxController { markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), infoWindow: InfoWindow(title: "Pickup Location".tr()), - icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), + icon: + departureIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueGreen, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver at Pickup".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver at Pickup".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } else if (order.status == Constant.orderInTransit) { markers.addAll([ @@ -316,9 +413,18 @@ class CabBookingController extends GetxController { markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), infoWindow: InfoWindow(title: "Destination Location".tr()), - icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), + icon: + destinationIcon ?? + BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueRed, + ), + ), + Marker( + markerId: const MarkerId("driver"), + position: LatLng(driverLat, driverLng), + infoWindow: InfoWindow(title: "Driver Location".tr()), + icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), - Marker(markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), infoWindow: InfoWindow(title: "Driver Location".tr()), icon: taxiIcon ?? BitmapDescriptor.defaultMarker), ]); } } @@ -329,7 +435,10 @@ class CabBookingController extends GetxController { } } - Future fetchGoogleRouteBetween(LatLng originPoint, LatLng destPoint) async { + Future fetchGoogleRouteBetween( + LatLng originPoint, + LatLng destPoint, + ) async { final origin = '${originPoint.latitude},${originPoint.longitude}'; final destination = '${destPoint.latitude},${destPoint.longitude}'; final url = Uri.parse( @@ -346,7 +455,8 @@ class CabBookingController extends GetxController { final route = data['routes'][0]; final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -373,7 +483,12 @@ class CabBookingController extends GetxController { if (currentOrder.value.taxSetting != null) { for (var element in currentOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } } @@ -389,11 +504,19 @@ class CabBookingController extends GetxController { subTotal.value = getAmount(selectedVehicleType.value); if (selectedCouponModel.value.id != null) { - discount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + discount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } for (var element in Constant.taxList) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; @@ -430,9 +553,14 @@ class CabBookingController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -446,13 +574,25 @@ class CabBookingController extends GetxController { Future placeOrder() async { DestinationLocation sourceLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.latitude + : departureLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.longitude + : departureLatLong.value.longitude, ); DestinationLocation destinationLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.latitude : destinationLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? destinationLatLongOsm.value.longitude : destinationLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.latitude + : destinationLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? destinationLatLongOsm.value.longitude + : destinationLatLong.value.longitude, ); CabOrderModel orderModel = CabOrderModel(); @@ -463,7 +603,8 @@ class CabBookingController extends GetxController { orderModel.vehicleType = selectedVehicleType.value; orderModel.authorID = FireStoreUtils.getCurrentUid(); orderModel.sourceLocationName = sourceTextEditController.value.text; - orderModel.destinationLocationName = destinationTextEditController.value.text; + orderModel.destinationLocationName = + destinationTextEditController.value.text; orderModel.sourceLocation = sourceLocation; orderModel.destinationLocation = destinationLocation; @@ -475,11 +616,14 @@ class CabBookingController extends GetxController { orderModel.taxSetting = Constant.taxList; orderModel.adminCommissionType = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true - ? Constant.sectionConstantModel!.adminCommision!.commissionType.toString() + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true + ? Constant.sectionConstantModel!.adminCommision!.commissionType + .toString() : null; orderModel.adminCommission = - Constant.sectionConstantModel!.adminCommision != null && Constant.sectionConstantModel!.adminCommision!.isEnabled == true + Constant.sectionConstantModel!.adminCommision != null && + Constant.sectionConstantModel!.adminCommision!.isEnabled == true ? Constant.sectionConstantModel!.adminCommision!.amount.toString() : null; orderModel.couponCode = couponCodeTextEditController.value.text; @@ -492,7 +636,9 @@ class CabBookingController extends GetxController { orderModel.roundTrip = false; orderModel.sectionId = Constant.sectionConstantModel!.id; orderModel.createdAt = Timestamp.now(); - orderModel.otpCode = (maths.Random().nextInt(9000) + 1000).toString(); // Generate a 4-digit OTP + orderModel.otpCode = + (maths.Random().nextInt(9000) + 1000) + .toString(); // Generate a 4-digit OTP orderModel.status = Constant.orderPlaced; orderModel.scheduleDateTime = Timestamp.now(); log("Order Model : ${orderModel.toJson()}"); @@ -507,8 +653,10 @@ class CabBookingController extends GetxController { double getAmount(VehicleType vehicleType) { final double currentDistance = distance.value; - if (currentDistance <= (vehicleType.minimum_delivery_charges_within_km ?? 0)) { - return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? 0.0; + if (currentDistance <= + (vehicleType.minimum_delivery_charges_within_km ?? 0)) { + return double.tryParse(vehicleType.minimum_delivery_charges.toString()) ?? + 0.0; } else { return (vehicleType.delivery_charges_per_km ?? 0.0) * currentDistance; } @@ -533,28 +681,50 @@ class CabBookingController extends GetxController { void setStopMarker(double lat, double lng, int index) { if (Constant.selectedMapType == 'osm') { // Add new stop marker without clearing - osmMarker.add(flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: stopIconOsm!)); + osmMarker.add( + flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: stopIconOsm!, + ), + ); getDirections(isStopMarker: true); } else { final markerId = MarkerId('Stop $index'); markers.removeWhere((marker) => marker.markerId == markerId); - markers.add(Marker(markerId: markerId, infoWindow: InfoWindow(title: '${'Stop'.tr()} ${String.fromCharCode(index + 65)}'), position: LatLng(lat, lng), icon: stopIcon!)); + markers.add( + Marker( + markerId: markerId, + infoWindow: InfoWindow( + title: '${'Stop'.tr()} ${String.fromCharCode(index + 65)}', + ), + position: LatLng(lat, lng), + icon: stopIcon!, + ), + ); getDirections(); } } void _setOsmMarker(double lat, double lng, {required bool isDeparture}) { - final marker = flutterMap.Marker(point: latlong.LatLng(lat, lng), width: 40, height: 40, child: isDeparture ? departureIconOsm! : destinationIconOsm!); + final marker = flutterMap.Marker( + point: latlong.LatLng(lat, lng), + width: 40, + height: 40, + child: isDeparture ? departureIconOsm! : destinationIconOsm!, + ); if (isDeparture) { departureLatLongOsm.value = latlong.LatLng(lat, lng); } else { destinationLatLongOsm.value = latlong.LatLng(lat, lng); } osmMarker.add(marker); - if (departureLatLongOsm.value.latitude != 0 && destinationLatLongOsm.value.latitude != 0) { + if (departureLatLongOsm.value.latitude != 0 && + destinationLatLongOsm.value.latitude != 0) { getDirections(); animateToSource(lat, lng); } @@ -576,14 +746,26 @@ class CabBookingController extends GetxController { markers.removeWhere((marker) => marker.markerId == markerId); // Add new marker - markers.add(Marker(markerId: markerId, position: pos, icon: icon, infoWindow: InfoWindow(title: title))); + markers.add( + Marker( + markerId: markerId, + position: pos, + icon: icon, + infoWindow: InfoWindow(title: title), + ), + ); mapController.animateCamera(CameraUpdate.newLatLngZoom(pos, 14)); - if (departureLatLong.value.latitude != 0 && destinationLatLong.value.latitude != 0) { + if (departureLatLong.value.latitude != 0 && + destinationLatLong.value.latitude != 0) { getDirections(); } else { - mapController.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(target: LatLng(lat, lng), zoom: 14))); + mapController.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition(target: LatLng(lat, lng), zoom: 14), + ), + ); } } @@ -592,25 +774,43 @@ class CabBookingController extends GetxController { final wayPoints = []; // Only add valid source - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { wayPoints.add(departureLatLongOsm.value); } // Only add valid destination - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { wayPoints.add(destinationLatLongOsm.value); } if (!isStopMarker) osmMarker.clear(); // Add source marker - if (departureLatLongOsm.value.latitude != 0.0 && departureLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: departureLatLongOsm.value, width: 40, height: 40, child: departureIconOsm!)); + if (departureLatLongOsm.value.latitude != 0.0 && + departureLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: departureLatLongOsm.value, + width: 40, + height: 40, + child: departureIconOsm!, + ), + ); } // Add destination marker - if (destinationLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.longitude != 0.0) { - osmMarker.add(flutterMap.Marker(point: destinationLatLongOsm.value, width: 40, height: 40, child: destinationIconOsm!)); + if (destinationLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.longitude != 0.0) { + osmMarker.add( + flutterMap.Marker( + point: destinationLatLongOsm.value, + width: 40, + height: 40, + child: destinationIconOsm!, + ), + ); } if (wayPoints.length >= 2) { @@ -623,10 +823,14 @@ class CabBookingController extends GetxController { } Future fetchGoogleRouteWithWaypoints() async { - if (departureLatLong.value.latitude == 0.0 || destinationLatLong.value.latitude == 0.0) return; + if (departureLatLong.value.latitude == 0.0 || + destinationLatLong.value.latitude == 0.0) + return; - final origin = '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; - final destination = '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; + final origin = + '${departureLatLong.value.latitude},${departureLatLong.value.longitude}'; + final destination = + '${destinationLatLong.value.latitude},${destinationLatLong.value.longitude}'; final url = Uri.parse( 'https://maps.googleapis.com/maps/api/directions/json' @@ -645,7 +849,8 @@ class CabBookingController extends GetxController { // Polyline final encodedPolyline = route['overview_polyline']['points']; final decodedPoints = PolylinePoints.decodePolyline(encodedPolyline); - final coordinates = decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); + final coordinates = + decodedPoints.map((e) => LatLng(e.latitude, e.longitude)).toList(); addPolyLine(coordinates); @@ -677,19 +882,26 @@ class CabBookingController extends GetxController { } Future fetchRouteWithWaypoints(List points) async { - final coordinates = points.map((p) => '${p.longitude},${p.latitude}').join(';'); - final url = Uri.parse('https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson'); + final coordinates = points + .map((p) => '${p.longitude},${p.latitude}') + .join(';'); + final url = Uri.parse( + 'https://router.project-osrm.org/route/v1/driving/$coordinates?overview=full&geometries=geojson', + ); try { final response = await http.get(url); if (response.statusCode == 200) { final decoded = json.decode(response.body); - final geometry = decoded['routes'][0]['geometry']['coordinates'] as List; + final geometry = + decoded['routes'][0]['geometry']['coordinates'] as List; final dist = decoded['routes'][0]['distance']; final dur = decoded['routes'][0]['duration']; routePoints.clear(); - routePoints.addAll(geometry.map((coord) => latlong.LatLng(coord[1], coord[0]))); + routePoints.addAll( + geometry.map((coord) => latlong.LatLng(coord[1], coord[0])), + ); if (Constant.distanceType.toLowerCase() == "KM".toLowerCase()) { distance.value = dist / 1000.00; @@ -714,7 +926,10 @@ class CabBookingController extends GetxController { void zoomToPolylineOSM() { if (routePoints.isEmpty) return; // LatLngBounds requires at least two points - final bounds = flutterMap.LatLngBounds(routePoints.first, routePoints.first); + final bounds = flutterMap.LatLngBounds( + routePoints.first, + routePoints.first, + ); for (final point in routePoints) { bounds.extend(point); } @@ -726,8 +941,10 @@ class CabBookingController extends GetxController { double getBoundsZoomLevel(flutterMap.LatLngBounds bounds) { // Simple heuristic: zoom out for larger bounds - final latDiff = (bounds.northEast.latitude - bounds.southWest.latitude).abs(); - final lngDiff = (bounds.northEast.longitude - bounds.southWest.longitude).abs(); + final latDiff = + (bounds.northEast.latitude - bounds.southWest.latitude).abs(); + final lngDiff = + (bounds.northEast.longitude - bounds.southWest.longitude).abs(); double maxDiff = math.max(latDiff, lngDiff); if (maxDiff < 0.005) return 18.0; if (maxDiff < 0.01) return 16.0; @@ -739,7 +956,13 @@ class CabBookingController extends GetxController { void addPolyLine(List points) { final id = const PolylineId("poly"); - final polyline = Polyline(polylineId: id, color: AppThemeData.primary300, points: points, width: 6, geodesic: true); + final polyline = Polyline( + polylineId: id, + color: AppThemeData.primary300, + points: points, + width: 6, + geodesic: true, + ); polyLines[id] = polyline; if (points.length >= 2) { @@ -748,7 +971,10 @@ class CabBookingController extends GetxController { } } - Future updateCameraLocationToFitPolyline(List points, GoogleMapController? mapController) async { + Future updateCameraLocationToFitPolyline( + List points, + GoogleMapController? mapController, + ) async { if (mapController == null || points.isEmpty) return; double minLat = points.first.latitude, maxLat = points.first.latitude; double minLng = points.first.longitude, maxLng = points.first.longitude; @@ -758,16 +984,24 @@ class CabBookingController extends GetxController { if (p.longitude < minLng) minLng = p.longitude; if (p.longitude > maxLng) maxLng = p.longitude; } - final bounds = LatLngBounds(southwest: LatLng(minLat, minLng), northeast: LatLng(maxLat, maxLng)); + final bounds = LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50); await checkCameraLocation(cameraUpdate, mapController); } Future animateToSource(double lat, double long) async { - final hasBothCoords = departureLatLongOsm.value.latitude != 0.0 && destinationLatLongOsm.value.latitude != 0.0; + final hasBothCoords = + departureLatLongOsm.value.latitude != 0.0 && + destinationLatLongOsm.value.latitude != 0.0; if (hasBothCoords) { - await calculateZoomLevel(source: departureLatLongOsm.value, destination: destinationLatLongOsm.value); + await calculateZoomLevel( + source: departureLatLongOsm.value, + destination: destinationLatLongOsm.value, + ); } else { mapOsmController.move(latlong.LatLng(lat, long), 10); } @@ -775,15 +1009,25 @@ class CabBookingController extends GetxController { RxMap polyLines = {}.obs; - Future calculateZoomLevel({required latlong.LatLng source, required latlong.LatLng destination, double paddingFraction = 0.001}) async { + Future calculateZoomLevel({ + required latlong.LatLng source, + required latlong.LatLng destination, + double paddingFraction = 0.001, + }) async { final bounds = flutterMap.LatLngBounds.fromPoints([source, destination]); final screenSize = Size(Get.width, Get.height * 0.5); const double worldDimension = 256.0; const double maxZoom = 10.0; - double latToRad(double lat) => math.log((1 + math.sin(lat * math.pi / 180)) / (1 - math.sin(lat * math.pi / 180))) / 2; + double latToRad(double lat) => + math.log( + (1 + math.sin(lat * math.pi / 180)) / + (1 - math.sin(lat * math.pi / 180)), + ) / + 2; - double computeZoom(double screenPx, double worldPx, double fraction) => math.log(screenPx / worldPx / fraction) / math.ln2; + double computeZoom(double screenPx, double worldPx, double fraction) => + math.log(screenPx / worldPx / fraction) / math.ln2; final north = bounds.northEast.latitude; final south = bounds.southWest.latitude; @@ -801,27 +1045,48 @@ class CabBookingController extends GetxController { final latFraction = (latToRad(north) - latToRad(south)) / math.pi; final lngFraction = ((east - west + 360) % 360) / 360; - final latZoom = computeZoom(screenSize.height, worldDimension, latFraction + paddingFraction); - final lngZoom = computeZoom(screenSize.width, worldDimension, lngFraction + paddingFraction); + final latZoom = computeZoom( + screenSize.height, + worldDimension, + latFraction + paddingFraction, + ); + final lngZoom = computeZoom( + screenSize.width, + worldDimension, + lngFraction + paddingFraction, + ); final zoomLevel = math.min(latZoom, lngZoom).clamp(0.0, maxZoom); mapOsmController.move(center, zoomLevel); } } - Future updateCameraLocation(LatLng source, LatLng destination, GoogleMapController? mapController) async { + Future updateCameraLocation( + LatLng source, + LatLng destination, + GoogleMapController? mapController, + ) async { if (mapController == null) return; final bounds = LatLngBounds( - southwest: LatLng(math.min(source.latitude, destination.latitude), math.min(source.longitude, destination.longitude)), - northeast: LatLng(math.max(source.latitude, destination.latitude), math.max(source.longitude, destination.longitude)), + southwest: LatLng( + math.min(source.latitude, destination.latitude), + math.min(source.longitude, destination.longitude), + ), + northeast: LatLng( + math.max(source.latitude, destination.latitude), + math.max(source.longitude, destination.longitude), + ), ); final cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 90); await checkCameraLocation(cameraUpdate, mapController); } - Future checkCameraLocation(CameraUpdate cameraUpdate, GoogleMapController mapController) async { + Future checkCameraLocation( + CameraUpdate cameraUpdate, + GoogleMapController mapController, + ) async { await mapController.animateCamera(cameraUpdate); final l1 = await mapController.getVisibleRegion(); final l2 = await mapController.getVisibleRegion(); @@ -834,16 +1099,44 @@ class CabBookingController extends GetxController { Future setIcons() async { try { if (Constant.selectedMapType == 'osm') { - departureIconOsm = Image.asset("assets/icons/pickup.png", width: 30, height: 30); - destinationIconOsm = Image.asset("assets/icons/dropoff.png", width: 30, height: 30); - taxiIconOsm = Image.asset("assets/icons/ic_taxi.png", width: 30, height: 30); - stopIconOsm = Image.asset("assets/icons/location.png", width: 26, height: 26); + departureIconOsm = Image.asset( + "assets/icons/pickup.png", + width: 30, + height: 30, + ); + destinationIconOsm = Image.asset( + "assets/icons/dropoff.png", + width: 30, + height: 30, + ); + taxiIconOsm = Image.asset( + "assets/icons/ic_taxi.png", + width: 30, + height: 30, + ); + stopIconOsm = Image.asset( + "assets/icons/location.png", + width: 26, + height: 26, + ); } else { const config = ImageConfiguration(size: Size(48, 48)); - departureIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/pickup.png"); - destinationIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/dropoff.png"); - taxiIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/ic_taxi.png"); - stopIcon = await BitmapDescriptor.fromAssetImage(config, "assets/icons/location.png"); + departureIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/pickup.png", + ); + destinationIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/dropoff.png", + ); + taxiIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/ic_taxi.png", + ); + stopIcon = await BitmapDescriptor.fromAssetImage( + config, + "assets/icons/location.png", + ); } } catch (e) { print('Error loading icons: $e'); @@ -851,8 +1144,12 @@ class CabBookingController extends GetxController { } void clearMapDataIfLocationsRemoved() { - final isSourceEmpty = departureLatLongOsm.value.latitude == 0.0 && departureLatLongOsm.value.longitude == 0.0; - final isDestinationEmpty = destinationLatLongOsm.value.latitude == 0.0 && destinationLatLongOsm.value.longitude == 0.0; + final isSourceEmpty = + departureLatLongOsm.value.latitude == 0.0 && + departureLatLongOsm.value.longitude == 0.0; + final isDestinationEmpty = + destinationLatLongOsm.value.latitude == 0.0 && + destinationLatLongOsm.value.longitude == 0.0; if (isSourceEmpty || isDestinationEmpty) { // Clear polylines @@ -881,7 +1178,9 @@ class CabBookingController extends GetxController { // Remove marker if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == departureLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == departureLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Departure'); } @@ -897,7 +1196,9 @@ class CabBookingController extends GetxController { destinationTextEditController.value.clear(); if (Constant.selectedMapType == 'osm') { - osmMarker.removeWhere((marker) => marker.point == destinationLatLongOsm.value); + osmMarker.removeWhere( + (marker) => marker.point == destinationLatLongOsm.value, + ); } else { markers.removeWhere((marker) => marker.markerId.value == 'Destination'); } @@ -907,9 +1208,16 @@ class CabBookingController extends GetxController { } Future searchPlaceNameOSM() async { - final url = Uri.parse('https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json'); + final url = Uri.parse( + 'https://nominatim.openstreetmap.org/reverse?lat=${departureLatLongOsm.value.latitude}&lon=${departureLatLongOsm.value.longitude}&format=json', + ); - final response = await http.get(url, headers: {'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)'}); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { log("response.body :: ${response.body}"); @@ -922,7 +1230,9 @@ class CabBookingController extends GetxController { final lat = departureLatLong.value.latitude; final lng = departureLatLong.value.longitude; - final url = Uri.parse('https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}'); + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=${Constant.mapAPIKey}', + ); final response = await http.get(url); @@ -965,19 +1275,45 @@ class CabBookingController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -1019,20 +1355,32 @@ class CabBookingController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -1078,7 +1426,10 @@ class CabBookingController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -1088,8 +1439,14 @@ class CabBookingController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -1102,12 +1459,20 @@ class CabBookingController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -1165,9 +1530,12 @@ class CabBookingController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -1187,15 +1555,23 @@ class CabBookingController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -1208,14 +1584,19 @@ class CabBookingController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1244,8 +1625,14 @@ class CabBookingController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -1284,7 +1671,14 @@ class CabBookingController extends GetxController { // }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -1320,24 +1714,38 @@ class CabBookingController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -1355,9 +1763,12 @@ class CabBookingController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -1375,7 +1786,10 @@ class CabBookingController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -1410,7 +1824,10 @@ class CabBookingController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -1428,15 +1845,30 @@ class CabBookingController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -1444,7 +1876,9 @@ class CabBookingController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1461,13 +1895,30 @@ class CabBookingController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1479,13 +1930,22 @@ class CabBookingController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -1496,17 +1956,32 @@ class CabBookingController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -1521,7 +1996,11 @@ class CabBookingController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -1535,7 +2014,9 @@ class CabBookingController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1552,7 +2033,13 @@ class CabBookingController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -1569,7 +2056,9 @@ class CabBookingController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -1582,7 +2071,11 @@ class CabBookingController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/cab_coupon_code_controller.dart b/lib/controllers/cab_coupon_code_controller.dart index 8d57707..2da0007 100644 --- a/lib/controllers/cab_coupon_code_controller.dart +++ b/lib/controllers/cab_coupon_code_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabCouponCodeController extends GetxController { // Add your methods and properties here @@ -12,10 +12,10 @@ class CabCouponCodeController extends GetxController { super.onInit(); } - - void getData(){ + void getData() { getCouponCode(); } + RxBool isLoading = true.obs; RxList cabCouponList = [].obs; diff --git a/lib/controllers/cab_dashboard_controller.dart b/lib/controllers/cab_dashboard_controller.dart index 2bd4e9b..24e33cf 100644 --- a/lib/controllers/cab_dashboard_controller.dart +++ b/lib/controllers/cab_dashboard_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/cab_service_screens/cab_home_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/cab_service_screens/my_cab_booking_screen.dart'; class CabDashboardController extends GetxController { @@ -15,15 +15,26 @@ class CabDashboardController extends GetxController { void onInit() { getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [CabHomeScreen(), const MyCabBookingScreen(), const ProfileScreen()]; + pageList.value = [ + CabHomeScreen(), + const MyCabBookingScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [CabHomeScreen(), const MyCabBookingScreen(), const WalletScreen(), const ProfileScreen()]; + pageList.value = [ + CabHomeScreen(), + const MyCabBookingScreen(), + const WalletScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/cab_home_controller.dart b/lib/controllers/cab_home_controller.dart index ba4361c..8ece16f 100644 --- a/lib/controllers/cab_home_controller.dart +++ b/lib/controllers/cab_home_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/banner_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabHomeController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/cab_order_details_controller.dart b/lib/controllers/cab_order_details_controller.dart index 0106e98..e2f5e3b 100644 --- a/lib/controllers/cab_order_details_controller.dart +++ b/lib/controllers/cab_order_details_controller.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/rating_model.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap; import 'package:latlong2/latlong.dart' as osm; @@ -56,14 +56,18 @@ class CabOrderDetailsController extends GetxController { Future fetchDriverDetails() async { if (cabOrder.value.driverId != null) { - await FireStoreUtils.getUserProfile(cabOrder.value.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(cabOrder.value.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; } }); print(driverUser.value.toJson()); - await FireStoreUtils.getReviewsbyID(cabOrder.value.id.toString()).then((value) { + await FireStoreUtils.getReviewsbyID(cabOrder.value.id.toString()).then(( + value, + ) { if (value != null) { ratingModel.value = value; } @@ -79,7 +83,12 @@ class CabOrderDetailsController extends GetxController { if (cabOrder.value.taxSetting != null) { for (var element in cabOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } } @@ -94,8 +103,20 @@ class CabOrderDetailsController extends GetxController { final destLng = cabOrder.value.destinationLocation!.longitude; googleMarkers.value = { - gmap.Marker(markerId: const gmap.MarkerId('source'), position: gmap.LatLng(sourceLat!, sourceLng!), icon: gmap.BitmapDescriptor.defaultMarkerWithHue(gmap.BitmapDescriptor.hueGreen)), - gmap.Marker(markerId: const gmap.MarkerId('destination'), position: gmap.LatLng(destLat!, destLng!), icon: gmap.BitmapDescriptor.defaultMarkerWithHue(gmap.BitmapDescriptor.hueRed)), + gmap.Marker( + markerId: const gmap.MarkerId('source'), + position: gmap.LatLng(sourceLat!, sourceLng!), + icon: gmap.BitmapDescriptor.defaultMarkerWithHue( + gmap.BitmapDescriptor.hueGreen, + ), + ), + gmap.Marker( + markerId: const gmap.MarkerId('destination'), + position: gmap.LatLng(destLat!, destLng!), + icon: gmap.BitmapDescriptor.defaultMarkerWithHue( + gmap.BitmapDescriptor.hueRed, + ), + ), }; } @@ -104,7 +125,8 @@ class CabOrderDetailsController extends GetxController { final src = cabOrder.value.sourceLocation; final dest = cabOrder.value.destinationLocation; - final url = "https://maps.googleapis.com/maps/api/directions/json?origin=${src!.latitude},${src.longitude}&destination=${dest!.latitude},${dest.longitude}&key=$googleApiKey"; + final url = + "https://maps.googleapis.com/maps/api/directions/json?origin=${src!.latitude},${src.longitude}&destination=${dest!.latitude},${dest.longitude}&key=$googleApiKey"; final response = await http.get(Uri.parse(url)); final data = jsonDecode(response.body); @@ -113,9 +135,19 @@ class CabOrderDetailsController extends GetxController { final points = data["routes"][0]["overview_polyline"]["points"]; final polylinePoints = PolylinePoints.decodePolyline(points); - final polylineCoords = polylinePoints.map((p) => gmap.LatLng(p.latitude, p.longitude)).toList(); + final polylineCoords = + polylinePoints + .map((p) => gmap.LatLng(p.latitude, p.longitude)) + .toList(); - googlePolylines.value = {gmap.Polyline(polylineId: const gmap.PolylineId("google_route"), color: AppThemeData.onDemandDark100, width: 5, points: polylineCoords)}; + googlePolylines.value = { + gmap.Polyline( + polylineId: const gmap.PolylineId("google_route"), + color: AppThemeData.onDemandDark100, + width: 5, + points: polylineCoords, + ), + }; } } @@ -124,15 +156,20 @@ class CabOrderDetailsController extends GetxController { final src = cabOrder.value.sourceLocation; final dest = cabOrder.value.destinationLocation; - final url = "http://router.project-osrm.org/route/v1/driving/${src!.longitude},${src.latitude};${dest!.longitude},${dest.latitude}?overview=full&geometries=geojson"; + final url = + "http://router.project-osrm.org/route/v1/driving/${src!.longitude},${src.latitude};${dest!.longitude},${dest.latitude}?overview=full&geometries=geojson"; final response = await http.get(Uri.parse(url)); final data = jsonDecode(response.body); if (data["routes"].isNotEmpty) { - final coords = data["routes"][0]["geometry"]["coordinates"] as List; + final coords = + data["routes"][0]["geometry"]["coordinates"] as List; - osmPolyline.value = coords.map((c) => osm.LatLng(c[1].toDouble(), c[0].toDouble())).toList(); + osmPolyline.value = + coords + .map((c) => osm.LatLng(c[1].toDouble(), c[0].toDouble())) + .toList(); } } } diff --git a/lib/controllers/cab_rental_dashboard_controllers.dart b/lib/controllers/cab_rental_dashboard_controllers.dart index add5017..1e0eda6 100644 --- a/lib/controllers/cab_rental_dashboard_controllers.dart +++ b/lib/controllers/cab_rental_dashboard_controllers.dart @@ -3,8 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/rental_service/rental_home_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../screen_ui/rental_service/my_rental_booking_screen.dart'; class CabRentalDashboardControllers extends GetxController { @@ -17,15 +16,26 @@ class CabRentalDashboardControllers extends GetxController { // TODO: implement onInit getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [RentalHomeScreen(), MyRentalBookingScreen(), const ProfileScreen()]; + pageList.value = [ + RentalHomeScreen(), + MyRentalBookingScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [RentalHomeScreen(), MyRentalBookingScreen(), const WalletScreen(), const ProfileScreen()]; + pageList.value = [ + RentalHomeScreen(), + MyRentalBookingScreen(), + const WalletScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/cab_review_controller.dart b/lib/controllers/cab_review_controller.dart index bbd1b20..e5218bb 100644 --- a/lib/controllers/cab_review_controller.dart +++ b/lib/controllers/cab_review_controller.dart @@ -2,7 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/cab_order_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../models/rating_model.dart'; import '../models/user_model.dart'; @@ -44,12 +44,17 @@ class CabReviewController extends GetxController { } }); - await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; - final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0; - final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; + final int userReviewsCount = + int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? + 0; + final int userReviewsSum = + int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; if (ratingModel.value != null) { final int oldRating = ratingModel.value?.rating?.toInt() ?? 0; @@ -74,7 +79,9 @@ class CabReviewController extends GetxController { ShowToastDialog.showLoader("Submit in...".tr()); - final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); + final user = await FireStoreUtils.getUserProfile( + order.value?.driverId ?? '', + ); if (user != null) { user.reviewsCount = (futureCount.value + 1).toString(); @@ -91,7 +98,8 @@ class CabReviewController extends GetxController { driverId: ratingModel.value!.driverId, customerId: ratingModel.value!.customerId, vendorId: ratingModel.value?.vendorId, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -102,7 +110,8 @@ class CabReviewController extends GetxController { } } else { /// New review - final docRef = FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); + final docRef = + FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); final newRating = RatingModel( id: docRef.id, comment: comment.value.text, @@ -111,7 +120,8 @@ class CabReviewController extends GetxController { orderId: order.value?.id, driverId: order.value?.driverId.toString(), customerId: Constant.userModel?.id, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/cart_controller.dart b/lib/controllers/cart_controller.dart index 8998fa7..5dc45ff 100644 --- a/lib/controllers/cart_controller.dart +++ b/lib/controllers/cart_controller.dart @@ -17,7 +17,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -108,7 +108,9 @@ class CartController extends GetxController { cartItem.addAll(event); if (cartItem.isNotEmpty) { - await FireStoreUtils.getVendorById(cartItem.first.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + cartItem.first.vendorID.toString(), + ).then((value) { if (value != null) { vendorModel.value = value; } @@ -116,9 +118,14 @@ class CartController extends GetxController { } calculatePrice(); }); - selectedFoodType.value = Preferences.getString(Preferences.foodDeliveryType, defaultValue: "Delivery"); + selectedFoodType.value = Preferences.getString( + Preferences.foodDeliveryType, + defaultValue: "Delivery", + ); - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; } @@ -127,16 +134,22 @@ class CartController extends GetxController { await FireStoreUtils.getDeliveryCharge().then((value) { if (value != null) { deliveryChargeModel.value = value; - print("===> Delivery Charge Model: ${deliveryChargeModel.value.toJson()}"); + print( + "===> Delivery Charge Model: ${deliveryChargeModel.value.toJson()}", + ); calculatePrice(); } }); - await FireStoreUtils.getAllVendorPublicCoupons(vendorModel.value.id.toString()).then((value) { + await FireStoreUtils.getAllVendorPublicCoupons( + vendorModel.value.id.toString(), + ).then((value) { couponList.value = value; }); - await FireStoreUtils.getAllVendorCoupons(vendorModel.value.id.toString()).then((value) { + await FireStoreUtils.getAllVendorCoupons( + vendorModel.value.id.toString(), + ).then((value) { allCouponList.value = value; }); } @@ -150,8 +163,11 @@ class CartController extends GetxController { totalAmount.value = 0.0; if (cartItem.isNotEmpty) { - if (Constant.sectionConstantModel!.serviceTypeFlag == "ecommerce-service") { - deliveryCharges.value = double.parse(Constant.sectionConstantModel!.delivery_charge ?? "0"); + if (Constant.sectionConstantModel!.serviceTypeFlag == + "ecommerce-service") { + deliveryCharges.value = double.parse( + Constant.sectionConstantModel!.delivery_charge ?? "0", + ); } else { if (selectedFoodType.value == "Delivery") { totalDistance.value = double.parse( @@ -162,26 +178,50 @@ class CartController extends GetxController { lng2: vendorModel.value.longitude.toString(), ), ); - if (vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) { + if (vendorModel.value.isSelfDelivery == true && + Constant.isSelfDeliveryFeature == true) { deliveryCharges.value = 0.0; } else if (deliveryChargeModel.value.vendorCanModify == false) { - if (totalDistance.value > deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { - deliveryCharges.value = totalDistance.value * deliveryChargeModel.value.deliveryChargesPerKm!; + if (totalDistance.value > + deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { + deliveryCharges.value = + totalDistance.value * + deliveryChargeModel.value.deliveryChargesPerKm!; } else { - deliveryCharges.value = (deliveryChargeModel.value.minimumDeliveryCharges)!.toDouble(); + deliveryCharges.value = + (deliveryChargeModel.value.minimumDeliveryCharges)! + .toDouble(); } } else { if (vendorModel.value.deliveryCharge != null) { - if (totalDistance.value > vendorModel.value.deliveryCharge!.minimumDeliveryChargesWithinKm!) { - deliveryCharges.value = (totalDistance.value * vendorModel.value.deliveryCharge!.deliveryChargesPerKm!).toDouble(); + if (totalDistance.value > + vendorModel + .value + .deliveryCharge! + .minimumDeliveryChargesWithinKm!) { + deliveryCharges.value = + (totalDistance.value * + vendorModel + .value + .deliveryCharge! + .deliveryChargesPerKm!) + .toDouble(); } else { - deliveryCharges.value = vendorModel.value.deliveryCharge!.minimumDeliveryCharges!.toDouble(); + deliveryCharges.value = + vendorModel.value.deliveryCharge!.minimumDeliveryCharges! + .toDouble(); } } else { - if (totalDistance.value > deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { - deliveryCharges.value = (totalDistance.value * deliveryChargeModel.value.deliveryChargesPerKm!).toDouble(); + if (totalDistance.value > + deliveryChargeModel.value.minimumDeliveryChargesWithinKm!) { + deliveryCharges.value = + (totalDistance.value * + deliveryChargeModel.value.deliveryChargesPerKm!) + .toDouble(); } else { - deliveryCharges.value = deliveryChargeModel.value.minimumDeliveryCharges!.toDouble(); + deliveryCharges.value = + deliveryChargeModel.value.minimumDeliveryCharges! + .toDouble(); } } } @@ -195,21 +235,29 @@ class CartController extends GetxController { if (double.parse(element.discountPrice.toString()) <= 0) { subTotal.value = subTotal.value + - double.parse(element.price.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + double.parse(element.price.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } else { subTotal.value = subTotal.value + - double.parse(element.discountPrice.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + double.parse(element.discountPrice.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } } if (selectedCouponModel.value.id != null) { - couponAmount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + couponAmount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } - if (vendorModel.value.specialDiscountEnable == true && Constant.specialDiscountOffer == true) { + if (vendorModel.value.specialDiscountEnable == true && + Constant.specialDiscountOffer == true) { final now = DateTime.now(); var day = DateFormat('EEEE', 'en_US').format(now); var date = DateFormat('dd-MM-yyyy').format(now); @@ -218,13 +266,20 @@ class CartController extends GetxController { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { if (element.discountType == "delivery") { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); if (isCurrentDateInRange(start, end)) { - specialDiscount.value = double.parse(element.discount.toString()); + specialDiscount.value = double.parse( + element.discount.toString(), + ); specialType.value = element.type.toString(); if (element.type == "percentage") { - specialDiscountAmount.value = subTotal * specialDiscount.value / 100; + specialDiscountAmount.value = + subTotal * specialDiscount.value / 100; } else { specialDiscountAmount.value = specialDiscount.value; } @@ -240,10 +295,23 @@ class CartController extends GetxController { } for (var element in Constant.taxList) { - taxAmount.value = taxAmount.value + Constant.calculateTax(amount: (subTotal.value - couponAmount.value - specialDiscountAmount.value).toString(), taxModel: element); + taxAmount.value = + taxAmount.value + + Constant.calculateTax( + amount: + (subTotal.value - + couponAmount.value - + specialDiscountAmount.value) + .toString(), + taxModel: element, + ); } - totalAmount.value = (subTotal.value - couponAmount.value - specialDiscountAmount.value) + taxAmount.value + deliveryCharges.value + deliveryTips.value; + totalAmount.value = + (subTotal.value - couponAmount.value - specialDiscountAmount.value) + + taxAmount.value + + deliveryCharges.value + + deliveryTips.value; getCashback(); } @@ -264,17 +332,31 @@ class CartController extends GetxController { if (startDate == null || endDate == null) continue; - final withinDateRange = startDate.toDate().isBefore(now) && endDate.toDate().isAfter(now); - final meetsMinAmount = orderTotal >= (cashback.minimumPurchaseAmount ?? 0); + final withinDateRange = + startDate.toDate().isBefore(now) && endDate.toDate().isAfter(now); + final meetsMinAmount = + orderTotal >= (cashback.minimumPurchaseAmount ?? 0); final allPayment = cashback.allPayment ?? false; - final paymentMatch = allPayment || (cashback.paymentMethods ?? []).contains(paymentMethod); + final paymentMatch = + allPayment || + (cashback.paymentMethods ?? []).contains(paymentMethod); final allCustomer = cashback.allCustomer ?? false; - final customerMatch = allCustomer || (cashback.customerIds ?? []).contains(FireStoreUtils.getCurrentUid()); + final customerMatch = + allCustomer || + (cashback.customerIds ?? []).contains( + FireStoreUtils.getCurrentUid(), + ); - final redeemData = await FireStoreUtils.getRedeemedCashbacks(cashback.id ?? ''); + final redeemData = await FireStoreUtils.getRedeemedCashbacks( + cashback.id ?? '', + ); final underLimit = redeemData.length < (cashback.redeemLimit ?? 0); - if (withinDateRange && meetsMinAmount && paymentMatch && customerMatch && underLimit) { + if (withinDateRange && + meetsMinAmount && + paymentMatch && + customerMatch && + underLimit) { eligibleCashbacks.add(cashback); } } @@ -312,7 +394,11 @@ class CartController extends GetxController { } } - Future addToCart({required CartProductModel cartProductModel, required bool isIncrement, required int quantity}) async { + Future addToCart({ + required CartProductModel cartProductModel, + required bool isIncrement, + required int quantity, + }) async { if (isIncrement) { cartProvider.addToCart(Get.context!, cartProductModel, quantity); } else { @@ -325,10 +411,13 @@ class CartController extends GetxController { Future placeOrder() async { if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (double.parse(userModel.value.walletAmount.toString()) >= totalAmount.value) { + if (double.parse(userModel.value.walletAmount.toString()) >= + totalAmount.value) { setOrder(); } else { - ShowToastDialog.showToast("You don't have sufficient wallet balance to place order".tr()); + ShowToastDialog.showToast( + "You don't have sufficient wallet balance to place order".tr(), + ); } } else { setOrder(); @@ -338,11 +427,19 @@ class CartController extends GetxController { Future setOrder() async { ShowToastDialog.showLoader("Please wait...".tr()); - if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) { - await FireStoreUtils.getVendorById(vendorModel.value.id!).then((vender) async { - if (vender?.subscriptionTotalOrders == '0' || vender?.subscriptionTotalOrders == null) { + if ((Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && + vendorModel.value.subscriptionPlan != null) { + await FireStoreUtils.getVendorById(vendorModel.value.id!).then(( + vender, + ) async { + if (vender?.subscriptionTotalOrders == '0' || + vender?.subscriptionTotalOrders == null) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("This vendor has reached their maximum order capacity. Please select a different vendor or try again later.".tr()); + ShowToastDialog.showToast( + "This vendor has reached their maximum order capacity. Please select a different vendor or try again later." + .tr(), + ); return; } }); @@ -356,7 +453,11 @@ class CartController extends GetxController { tempProduc.add(tempCart); } - Map specialDiscountMap = {'special_discount': specialDiscountAmount.value, 'special_discount_label': specialDiscount.value, 'specialType': specialType.value}; + Map specialDiscountMap = { + 'special_discount': specialDiscountAmount.value, + 'special_discount_label': specialDiscount.value, + 'specialType': specialType.value, + }; OrderModel orderModel = OrderModel(); orderModel.id = Constant.getUuid(); @@ -391,8 +492,12 @@ class CartController extends GetxController { orderModel.notes = reMarkController.value.text; orderModel.takeAway = selectedFoodType.value == "Delivery" ? false : true; orderModel.createdAt = Timestamp.now(); - orderModel.scheduleTime = deliveryType.value == "schedule" ? Timestamp.fromDate(scheduleDateTime.value) : null; - orderModel.cashback = bestCashback.value.id == null ? null : bestCashback.value; + orderModel.scheduleTime = + deliveryType.value == "schedule" + ? Timestamp.fromDate(scheduleDateTime.value) + : null; + orderModel.cashback = + bestCashback.value.id == null ? null : bestCashback.value; if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { WalletTransactionModel transactionModel = WalletTransactionModel( id: Constant.getUuid(), @@ -407,33 +512,57 @@ class CartController extends GetxController { paymentStatus: "success".tr(), ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } for (int i = 0; i < tempProduc.length; i++) { - await FireStoreUtils.getProductById(tempProduc[i].id!.split('~').first).then((value) async { + await FireStoreUtils.getProductById( + tempProduc[i].id!.split('~').first, + ).then((value) async { ProductModel? productModel = value; if (tempProduc[i].variantInfo != null) { if (productModel!.itemAttribute != null) { - for (int j = 0; j < productModel.itemAttribute!.variants!.length; j++) { - if (productModel.itemAttribute!.variants![j].variantId == tempProduc[i].id!.split('~').last) { - if (productModel.itemAttribute!.variants![j].variantQuantity != "-1") { - productModel.itemAttribute!.variants![j].variantQuantity = (int.parse(productModel.itemAttribute!.variants![j].variantQuantity.toString()) - tempProduc[i].quantity!).toString(); + for ( + int j = 0; + j < productModel.itemAttribute!.variants!.length; + j++ + ) { + if (productModel.itemAttribute!.variants![j].variantId == + tempProduc[i].id!.split('~').last) { + if (productModel.itemAttribute!.variants![j].variantQuantity != + "-1") { + productModel.itemAttribute!.variants![j].variantQuantity = + (int.parse( + productModel + .itemAttribute! + .variants![j] + .variantQuantity + .toString(), + ) - + tempProduc[i].quantity!) + .toString(); } } } } else { if (productModel.quantity != -1) { - productModel.quantity = (productModel.quantity! - tempProduc[i].quantity!); + productModel.quantity = + (productModel.quantity! - tempProduc[i].quantity!); } } } else { if (productModel!.quantity != -1) { - productModel.quantity = (productModel.quantity! - tempProduc[i].quantity!); + productModel.quantity = + (productModel.quantity! - tempProduc[i].quantity!); } } @@ -451,18 +580,31 @@ class CartController extends GetxController { await FireStoreUtils.setCashbackRedeemModel(cashbackRedeemModel); } await FireStoreUtils.setOrder(orderModel).then((value) async { - await FireStoreUtils.getUserProfile(orderModel.vendor!.author.toString()).then((value) async { + await FireStoreUtils.getUserProfile( + orderModel.vendor!.author.toString(), + ).then((value) async { if (value != null) { if (orderModel.scheduleTime != null) { - await SendNotification.sendFcmMessage(Constant.scheduleOrder, value.fcmToken ?? '', {}); + await SendNotification.sendFcmMessage( + Constant.scheduleOrder, + value.fcmToken ?? '', + {}, + ); } else { - await SendNotification.sendFcmMessage(Constant.newOrderPlaced, value.fcmToken ?? '', {}); + await SendNotification.sendFcmMessage( + Constant.newOrderPlaced, + value.fcmToken ?? '', + {}, + ); } } }); await Constant.sendOrderEmail(orderModel: orderModel); ShowToastDialog.closeLoader(); - Get.off(const OrderPlacingScreen(), arguments: {"orderModel": orderModel}); + Get.off( + const OrderPlacingScreen(), + arguments: {"orderModel": orderModel}, + ); }); } @@ -483,19 +625,45 @@ class CartController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -537,20 +705,32 @@ class CartController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -596,7 +776,10 @@ class CartController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -606,8 +789,14 @@ class CartController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -620,12 +809,20 @@ class CartController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -683,9 +880,12 @@ class CartController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -705,15 +905,23 @@ class CartController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -726,14 +934,19 @@ class CartController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -762,8 +975,14 @@ class CartController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -783,26 +1002,50 @@ class CartController extends GetxController { final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString()}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + }, ); final data = jsonDecode(response.body); - await verifyCheckSum(checkSum: data["code"], amount: amount, orderId: orderId).then((value) { + await verifyCheckSum( + checkSum: data["code"], + amount: amount, + orderId: orderId, + ).then((value) { initiatePayment(amount: amount, orderId: orderId).then((value) { String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } GetPaymentTxtTokenModel result = value; - startTransaction(context, txnTokenBy: result.body.txnToken ?? '', orderId: orderId, amount: amount, callBackURL: callback, isStaging: paytmModel.value.isSandboxEnabled); + startTransaction( + context, + txnTokenBy: result.body.txnToken ?? '', + orderId: orderId, + amount: amount, + callBackURL: callback, + isStaging: paytmModel.value.isSandboxEnabled, + ); }); }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -838,24 +1081,38 @@ class CartController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -873,9 +1130,12 @@ class CartController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -893,7 +1153,10 @@ class CartController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -927,7 +1190,10 @@ class CartController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -945,15 +1211,30 @@ class CartController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -961,7 +1242,9 @@ class CartController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -978,13 +1261,30 @@ class CartController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -996,13 +1296,22 @@ class CartController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -1013,17 +1322,32 @@ class CartController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -1038,7 +1362,11 @@ class CartController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -1052,7 +1380,9 @@ class CartController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -1069,7 +1399,13 @@ class CartController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -1086,7 +1422,9 @@ class CartController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -1099,7 +1437,11 @@ class CartController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/cashback_controller.dart b/lib/controllers/cashback_controller.dart index 43aa518..786fa55 100644 --- a/lib/controllers/cashback_controller.dart +++ b/lib/controllers/cashback_controller.dart @@ -1,5 +1,5 @@ import '../models/cashback_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../service/fire_store_utils.dart'; class CashbackController extends GetxController { diff --git a/lib/controllers/category_restaurant_controller.dart b/lib/controllers/category_restaurant_controller.dart index bd8e41a..a80b92b 100644 --- a/lib/controllers/category_restaurant_controller.dart +++ b/lib/controllers/category_restaurant_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/vendor_category_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CategoryRestaurantController extends GetxController { RxBool isLoading = true.obs; @@ -33,9 +33,10 @@ class CategoryRestaurantController extends GetxController { } Future getRestaurant() async { - FireStoreUtils.getAllNearestRestaurantByCategoryId(categoryId: vendorCategoryModel.value.id.toString(), isDining: dineIn.value).listen(( - event, - ) async { + FireStoreUtils.getAllNearestRestaurantByCategoryId( + categoryId: vendorCategoryModel.value.id.toString(), + isDining: dineIn.value, + ).listen((event) async { allNearestRestaurant.clear(); allNearestRestaurant.addAll(event); }); @@ -46,7 +47,10 @@ class CategoryRestaurantController extends GetxController { if (value != null) { for (int i = 0; i < value.length; i++) { if (Constant.isPointInPolygon( - LatLng(Constant.selectedLocation.location!.latitude ?? 0.0, Constant.selectedLocation.location!.longitude ?? 0.0), + LatLng( + Constant.selectedLocation.location!.latitude ?? 0.0, + Constant.selectedLocation.location!.longitude ?? 0.0, + ), value[i].area!, )) { Constant.selectedZone = value[i]; diff --git a/lib/controllers/change_language_controller.dart b/lib/controllers/change_language_controller.dart index aad7891..82be122 100644 --- a/lib/controllers/change_language_controller.dart +++ b/lib/controllers/change_language_controller.dart @@ -2,8 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/language_model.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; class ChangeLanguageController extends GetxController { @@ -20,24 +19,30 @@ class ChangeLanguageController extends GetxController { } Future getLanguage() async { - await FireStoreUtils.fireStore.collection(CollectionName.settings).doc("languages").get().then((event) { - if (event.exists) { - List languageListTemp = event.data()!["list"]; - for (var element in languageListTemp) { - LanguageModel languageModel = LanguageModel.fromJson(element); - languageList.add(languageModel); - } + await FireStoreUtils.fireStore + .collection(CollectionName.settings) + .doc("languages") + .get() + .then((event) { + if (event.exists) { + List languageListTemp = event.data()!["list"]; + for (var element in languageListTemp) { + LanguageModel languageModel = LanguageModel.fromJson(element); + languageList.add(languageModel); + } - if (Preferences.getString(Preferences.languageCodeKey).toString().isNotEmpty) { - LanguageModel pref = Constant.getLanguage(); - for (var element in languageList) { - if (element.slug == pref.slug) { - selectedLanguage.value = element; + if (Preferences.getString( + Preferences.languageCodeKey, + ).toString().isNotEmpty) { + LanguageModel pref = Constant.getLanguage(); + for (var element in languageList) { + if (element.slug == pref.slug) { + selectedLanguage.value = element; + } + } } } - } - } - }); + }); isLoading.value = false; } diff --git a/lib/controllers/chat_controller.dart b/lib/controllers/chat_controller.dart index bce8cf5..c0e2925 100644 --- a/lib/controllers/chat_controller.dart +++ b/lib/controllers/chat_controller.dart @@ -7,7 +7,7 @@ import '../models/conversation_model.dart'; import '../models/inbox_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:uuid/uuid.dart'; import '../service/send_notification.dart'; @@ -21,7 +21,11 @@ class ChatController extends GetxController { void onInit() { // TODO: implement onInit if (scrollController.hasClients) { - Timer(const Duration(milliseconds: 500), () => scrollController.jumpTo(scrollController.position.maxScrollExtent)); + Timer( + const Duration(milliseconds: 500), + () => + scrollController.jumpTo(scrollController.position.maxScrollExtent), + ); } getArgument(); super.onInit(); @@ -47,14 +51,20 @@ class ChatController extends GetxController { customerProfileImage.value = argumentData['customerProfileImage'] ?? ""; restaurantId.value = argumentData['restaurantId']; restaurantName.value = argumentData['restaurantName']; - restaurantProfileImage.value = argumentData['restaurantProfileImage'] ?? ""; + restaurantProfileImage.value = + argumentData['restaurantProfileImage'] ?? ""; token.value = argumentData['token'] ?? ""; chatType.value = argumentData['chatType']; } isLoading.value = false; } - Future sendMessage(String message, Url? url, String videoThumbnail, String messageType) async { + Future sendMessage( + String message, + Url? url, + String videoThumbnail, + String messageType, + ) async { InboxModel inboxModel = InboxModel( lastSenderId: customerId.value, customerId: customerId.value, @@ -113,18 +123,23 @@ class ChatController extends GetxController { } //await SendNotification.sendChatFcmMessage(customerName.value, conversationModel.message.toString(), token.value, {}); - await SendNotification.sendChatFcmMessage(customerName.value, conversationModel.message.toString(), token.value, { - "type": "chat", - "chatType": chatType.value, - "orderId": orderId.value, - "customerId": customerId.value, - "customerName": customerName.value, - "customerProfileImage": customerProfileImage.value, - "restaurantId": restaurantId.value, - "restaurantName": restaurantName.value, - "restaurantProfileImage": restaurantProfileImage.value, - "token": token.value, - }); + await SendNotification.sendChatFcmMessage( + customerName.value, + conversationModel.message.toString(), + token.value, + { + "type": "chat", + "chatType": chatType.value, + "orderId": orderId.value, + "customerId": customerId.value, + "customerName": customerName.value, + "customerProfileImage": customerProfileImage.value, + "restaurantId": restaurantId.value, + "restaurantName": restaurantName.value, + "restaurantProfileImage": restaurantProfileImage.value, + "token": token.value, + }, + ); } final ImagePicker imagePicker = ImagePicker(); diff --git a/lib/controllers/complain_controller.dart b/lib/controllers/complain_controller.dart index a76d011..45367eb 100644 --- a/lib/controllers/complain_controller.dart +++ b/lib/controllers/complain_controller.dart @@ -1,6 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/cab_order_model.dart'; import '../service/fire_store_utils.dart'; import '../themes/show_toast_dialog.dart'; @@ -30,7 +30,9 @@ class ComplainController extends GetxController { Future getComplain() async { isLoading.value = true; try { - final data = await FireStoreUtils.getRideComplainData(order.value.id ?? ''); + final data = await FireStoreUtils.getRideComplainData( + order.value.id ?? '', + ); if (data != null) { title.value.text = data['title'] ?? ''; comment.value.text = data['description'] ?? ''; @@ -59,7 +61,9 @@ class ComplainController extends GetxController { try { // Check if complaint already exists - bool exists = await FireStoreUtils.isRideComplainAdded(order.value.id ?? ''); + bool exists = await FireStoreUtils.isRideComplainAdded( + order.value.id ?? '', + ); if (!exists) { await FireStoreUtils.setRideComplain( @@ -67,13 +71,19 @@ class ComplainController extends GetxController { title: title.value.text.trim(), description: comment.value.text.trim(), customerID: order.value.authorID ?? '', - customerName: "${order.value.author?.firstName ?? ''} ${order.value.author?.lastName ?? ''}".trim(), + customerName: + "${order.value.author?.firstName ?? ''} ${order.value.author?.lastName ?? ''}" + .trim(), driverID: order.value.driverId ?? '', - driverName: "${order.value.driver?.firstName ?? ''} ${order.value.driver?.lastName ?? ''}".trim(), + driverName: + "${order.value.driver?.firstName ?? ''} ${order.value.driver?.lastName ?? ''}" + .trim(), ); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Your complaint has been submitted to admin".tr()); + ShowToastDialog.showToast( + "Your complaint has been submitted to admin".tr(), + ); Get.back(); } else { ShowToastDialog.closeLoader(); diff --git a/lib/controllers/dash_board_controller.dart b/lib/controllers/dash_board_controller.dart index ae6445f..405df62 100644 --- a/lib/controllers/dash_board_controller.dart +++ b/lib/controllers/dash_board_controller.dart @@ -6,7 +6,7 @@ import '../screen_ui/multi_vendor_service/order_list_screen/order_screen.dart'; import '../screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DashBoardController extends GetxController { RxInt selectedIndex = 0.obs; @@ -19,22 +19,46 @@ class DashBoardController extends GetxController { getTaxList(); if (Constant.sectionConstantModel!.theme == "theme_2") { if (Constant.walletSetting == false) { - pageList.value = [const HomeScreen(), const FavouriteScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreen(), + const FavouriteScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeScreen(), const FavouriteScreen(), const WalletScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreen(), + const FavouriteScreen(), + const WalletScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } } else { if (Constant.walletSetting == false) { - pageList.value = [const HomeScreenTwo(), const FavouriteScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreenTwo(), + const FavouriteScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeScreenTwo(), const FavouriteScreen(), const WalletScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeScreenTwo(), + const FavouriteScreen(), + const WalletScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/dash_board_ecommarce_controller.dart b/lib/controllers/dash_board_ecommarce_controller.dart index 02bb9ce..647f120 100644 --- a/lib/controllers/dash_board_ecommarce_controller.dart +++ b/lib/controllers/dash_board_ecommarce_controller.dart @@ -5,7 +5,7 @@ import '../screen_ui/multi_vendor_service/order_list_screen/order_screen.dart'; import '../screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DashBoardEcommerceController extends GetxController { RxInt selectedIndex = 0.obs; @@ -17,15 +17,28 @@ class DashBoardEcommerceController extends GetxController { // TODO: implement onInit getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [const HomeECommerceScreen(), const FavouriteScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeECommerceScreen(), + const FavouriteScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeECommerceScreen(), const FavouriteScreen(), const WalletScreen(), const OrderScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeECommerceScreen(), + const FavouriteScreen(), + const WalletScreen(), + const OrderScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/dine_in_booking_controller.dart b/lib/controllers/dine_in_booking_controller.dart index e273284..4f31c69 100644 --- a/lib/controllers/dine_in_booking_controller.dart +++ b/lib/controllers/dine_in_booking_controller.dart @@ -1,6 +1,6 @@ import '../models/dine_in_booking_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DineInBookingController extends GetxController { RxBool isLoading = true.obs; @@ -18,16 +18,12 @@ class DineInBookingController extends GetxController { } Future getDineInBooking() async { - await FireStoreUtils.getDineInBooking(true).then( - (value) { - featureList.value = value; - }, - ); - await FireStoreUtils.getDineInBooking(false).then( - (value) { - historyList.value = value; - }, - ); + await FireStoreUtils.getDineInBooking(true).then((value) { + featureList.value = value; + }); + await FireStoreUtils.getDineInBooking(false).then((value) { + historyList.value = value; + }); isLoading.value = false; } diff --git a/lib/controllers/dine_in_booking_details_controller.dart b/lib/controllers/dine_in_booking_details_controller.dart index 994420c..9332e76 100644 --- a/lib/controllers/dine_in_booking_details_controller.dart +++ b/lib/controllers/dine_in_booking_details_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/models/dine_in_booking_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DineInBookingDetailsController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/dine_in_controller.dart b/lib/controllers/dine_in_controller.dart index b582900..57c6524 100644 --- a/lib/controllers/dine_in_controller.dart +++ b/lib/controllers/dine_in_controller.dart @@ -7,7 +7,7 @@ import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/banner_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DineInController extends GetxController { RxBool isLoading = true.obs; @@ -28,7 +28,8 @@ class DineInController extends GetxController { RxList popularRestaurantList = [].obs; RxList bannerBottomModel = [].obs; - Rx pageBottomController = PageController(viewportFraction: 0.877).obs; + Rx pageBottomController = + PageController(viewportFraction: 0.877).obs; RxInt currentBottomPage = 0.obs; RxList favouriteList = [].obs; @@ -37,7 +38,9 @@ class DineInController extends GetxController { isLoading.value = true; await getZone(); - FireStoreUtils.getAllNearestRestaurant(isDining: true).listen((event) async { + FireStoreUtils.getAllNearestRestaurant(isDining: true).listen(( + event, + ) async { newArrivalRestaurantList.clear(); allNearestRestaurant.clear(); popularRestaurantList.clear(); @@ -47,12 +50,21 @@ class DineInController extends GetxController { popularRestaurantList.addAll(event); popularRestaurantList.sort( - (a, b) => Constant.calculateReview(reviewCount: b.reviewsCount.toString(), reviewSum: b.reviewsSum.toString()) - .compareTo(Constant.calculateReview(reviewCount: a.reviewsCount.toString(), reviewSum: a.reviewsSum.toString())), + (a, b) => Constant.calculateReview( + reviewCount: b.reviewsCount.toString(), + reviewSum: b.reviewsSum.toString(), + ).compareTo( + Constant.calculateReview( + reviewCount: a.reviewsCount.toString(), + reviewSum: a.reviewsSum.toString(), + ), + ), ); newArrivalRestaurantList.sort( - (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo((a.createdAt ?? Timestamp.now()).toDate()), + (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo( + (a.createdAt ?? Timestamp.now()).toDate(), + ), ); }); @@ -61,23 +73,17 @@ class DineInController extends GetxController { } Future getCategory() async { - await FireStoreUtils.getHomeVendorCategory().then( - (value) { - vendorCategoryModel.value = value; - }, - ); + await FireStoreUtils.getHomeVendorCategory().then((value) { + vendorCategoryModel.value = value; + }); - await FireStoreUtils.getHomeBottomBanner().then( - (value) { - bannerBottomModel.value = value; - }, - ); + await FireStoreUtils.getHomeBottomBanner().then((value) { + bannerBottomModel.value = value; + }); if (Constant.userModel != null) { - await FireStoreUtils.getFavouriteRestaurant().then( - (value) { - favouriteList.value = value; - }, - ); + await FireStoreUtils.getFavouriteRestaurant().then((value) { + favouriteList.value = value; + }); } } @@ -85,7 +91,13 @@ class DineInController extends GetxController { await FireStoreUtils.getZone().then((value) { if (value != null) { for (int i = 0; i < value.length; i++) { - if (Constant.isPointInPolygon(LatLng(Constant.selectedLocation.location!.latitude ?? 0.0, Constant.selectedLocation.location!.longitude ?? 0.0), value[i].area!)) { + if (Constant.isPointInPolygon( + LatLng( + Constant.selectedLocation.location!.latitude ?? 0.0, + Constant.selectedLocation.location!.longitude ?? 0.0, + ), + value[i].area!, + )) { Constant.selectedZone = value[i]; Constant.isZoneAvailable = true; break; @@ -96,5 +108,4 @@ class DineInController extends GetxController { } }); } - } diff --git a/lib/controllers/dine_in_restaurant_details_controller.dart b/lib/controllers/dine_in_restaurant_details_controller.dart index 8d2105c..5436203 100644 --- a/lib/controllers/dine_in_restaurant_details_controller.dart +++ b/lib/controllers/dine_in_restaurant_details_controller.dart @@ -8,16 +8,18 @@ import 'package:easy_localization/easy_localization.dart'; import '../screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../service/send_notification.dart'; import '../themes/show_toast_dialog.dart'; class DineInRestaurantDetailsController extends GetxController { - Rx searchEditingController = TextEditingController().obs; + Rx searchEditingController = + TextEditingController().obs; - Rx additionRequestController = TextEditingController().obs; + Rx additionRequestController = + TextEditingController().obs; RxBool isLoading = true.obs; RxBool firstVisit = false.obs; @@ -42,6 +44,7 @@ class DineInRestaurantDetailsController extends GetxController { return key; } } + RxString selectedOccasion = "".obs; RxList dateList = [].obs; @@ -65,30 +68,53 @@ class DineInRestaurantDetailsController extends GetxController { ShowToastDialog.showLoader("Please wait...".tr()); DateTime dt = selectedDate.value.toDate(); - String hour = DateFormat("kk:mm").format(DateFormat('hh:mm a').parse((Intl.getCurrentLocale() == "en_US") ? selectedTimeSlot.value : selectedTimeSlot.value.toLowerCase())); - dt = DateTime(dt.year, dt.month, dt.day, int.parse(hour.split(":")[0]), int.parse(hour.split(":")[1]), dt.second, dt.millisecond, dt.microsecond); + String hour = DateFormat("kk:mm").format( + DateFormat('hh:mm a').parse( + (Intl.getCurrentLocale() == "en_US") + ? selectedTimeSlot.value + : selectedTimeSlot.value.toLowerCase(), + ), + ); + dt = DateTime( + dt.year, + dt.month, + dt.day, + int.parse(hour.split(":")[0]), + int.parse(hour.split(":")[1]), + dt.second, + dt.millisecond, + dt.microsecond, + ); selectedDate.value = Timestamp.fromDate(dt); DineInBookingModel dineInBookingModel = DineInBookingModel( - id: Constant.getUuid(), - author: Constant.userModel, - authorID: FireStoreUtils.getCurrentUid(), - createdAt: Timestamp.now(), - date: selectedDate.value, - status: Constant.orderPlaced, - vendor: vendorModel.value, - specialRequest: additionRequestController.value.text.isEmpty ? "" : additionRequestController.value.text, - vendorID: vendorModel.value.id, - guestEmail: Constant.userModel!.email, - guestFirstName: Constant.userModel!.firstName, - guestLastName: Constant.userModel!.lastName, - guestPhone: Constant.userModel!.phoneNumber, - occasion: selectedOccasion.value, - discount: selectedTimeDiscount.value, - discountType: selectedTimeDiscountType.value, - totalGuest: noOfQuantity.value.toString(), - firstVisit: firstVisit.value); + id: Constant.getUuid(), + author: Constant.userModel, + authorID: FireStoreUtils.getCurrentUid(), + createdAt: Timestamp.now(), + date: selectedDate.value, + status: Constant.orderPlaced, + vendor: vendorModel.value, + specialRequest: + additionRequestController.value.text.isEmpty + ? "" + : additionRequestController.value.text, + vendorID: vendorModel.value.id, + guestEmail: Constant.userModel!.email, + guestFirstName: Constant.userModel!.firstName, + guestLastName: Constant.userModel!.lastName, + guestPhone: Constant.userModel!.phoneNumber, + occasion: selectedOccasion.value, + discount: selectedTimeDiscount.value, + discountType: selectedTimeDiscountType.value, + totalGuest: noOfQuantity.value.toString(), + firstVisit: firstVisit.value, + ); await FireStoreUtils.setBookedOrder(dineInBookingModel); - await SendNotification.sendFcmMessage(Constant.dineInPlaced, vendorModel.value.fcmToken.toString(), {}); + await SendNotification.sendFcmMessage( + Constant.dineInPlaced, + vendorModel.value.fcmToken.toString(), + {}, + ); ShowToastDialog.closeLoader(); Get.back(); Get.to(const DineInBookingScreen()); @@ -99,27 +125,46 @@ class DineInRestaurantDetailsController extends GetxController { for (int i = 0; i < 7; i++) { final now = DateTime.now().add(Duration(days: i)); var day = DateFormat('EEEE').format(now); - if (vendorModel.value.specialDiscount?.isNotEmpty == true && vendorModel.value.specialDiscountEnable == true) { + if (vendorModel.value.specialDiscount?.isNotEmpty == true && + vendorModel.value.specialDiscountEnable == true) { for (var element in vendorModel.value.specialDiscount!) { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { - SpecialDiscountTimeslot employeeWithMaxSalary = - element.timeslot!.reduce((item1, item2) => double.parse(item1.discount.toString()) > double.parse(item2.discount.toString()) ? item1 : item2); + SpecialDiscountTimeslot employeeWithMaxSalary = element.timeslot! + .reduce( + (item1, item2) => + double.parse(item1.discount.toString()) > + double.parse(item2.discount.toString()) + ? item1 + : item2, + ); if (employeeWithMaxSalary.discountType == "dinein") { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: employeeWithMaxSalary.discount.toString()); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: employeeWithMaxSalary.discount.toString(), + ); dateList.add(model); } else { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0"); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: "0", + ); dateList.add(model); } } else { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0"); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: "0", + ); dateList.add(model); } } } } else { - DateModel model = DateModel(date: Timestamp.fromDate(now), discountPer: "0"); + DateModel model = DateModel( + date: Timestamp.fromDate(now), + discountPer: "0", + ); dateList.add(model); } } @@ -127,70 +172,116 @@ class DineInRestaurantDetailsController extends GetxController { timeSet(selectedDate.value); if (timeSlotList.isNotEmpty) { - selectedTimeSlot.value = DateFormat('hh:mm a').format(timeSlotList[0].time!); + selectedTimeSlot.value = DateFormat( + 'hh:mm a', + ).format(timeSlotList[0].time!); } } void timeSet(Timestamp selectedDate) { timeSlotList.clear(); - for (DateTime time = Constant.stringToDate(vendorModel.value.openDineTime.toString()); - time.isBefore(Constant.stringToDate(vendorModel.value.closeDineTime.toString())); - time = time.add(const Duration(minutes: 30))) { + for ( + DateTime time = Constant.stringToDate( + vendorModel.value.openDineTime.toString(), + ); + time.isBefore( + Constant.stringToDate(vendorModel.value.closeDineTime.toString()), + ); + time = time.add(const Duration(minutes: 30)) + ) { final now = DateTime.parse(selectedDate.toDate().toString()); var day = DateFormat('EEEE').format(now); var date = DateFormat('dd-MM-yyyy').format(now); - if (vendorModel.value.specialDiscount?.isNotEmpty == true && vendorModel.value.specialDiscountEnable == true) { + if (vendorModel.value.specialDiscount?.isNotEmpty == true && + vendorModel.value.specialDiscountEnable == true) { for (var element in vendorModel.value.specialDiscount!) { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { if (element.discountType == "dinein") { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); - var selected = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${DateFormat.Hm().format(time)}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); + var selected = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${DateFormat.Hm().format(time)}"); if (isCurrentDateInRangeDineIn(start, end, selected)) { - var contains = timeSlotList.where((element) => element.time == time); + var contains = timeSlotList.where( + (element) => element.time == time, + ); if (contains.isNotEmpty) { - var index = timeSlotList.indexWhere((element) => element.time == time); + var index = timeSlotList.indexWhere( + (element) => element.time == time, + ); if (timeSlotList[index].discountPer == "0") { timeSlotList.removeAt(index); - TimeModel model = TimeModel(time: time, discountPer: element.discount, discountType: element.type); + TimeModel model = TimeModel( + time: time, + discountPer: element.discount, + discountType: element.type, + ); timeSlotList.insert(index == 0 ? 0 : index, model); } } else { - TimeModel model = TimeModel(time: time, discountPer: element.discount, discountType: element.type); + TimeModel model = TimeModel( + time: time, + discountPer: element.discount, + discountType: element.type, + ); timeSlotList.add(model); } } else { - var contains = timeSlotList.where((element) => element.time == time); + var contains = timeSlotList.where( + (element) => element.time == time, + ); if (contains.isEmpty) { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } else { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } else { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } } else { - TimeModel model = TimeModel(time: time, discountPer: "0", discountType: "amount"); + TimeModel model = TimeModel( + time: time, + discountPer: "0", + discountType: "amount", + ); timeSlotList.add(model); } } } void animateSlider() { - if (vendorModel.value.photos != null && vendorModel.value.photos!.isNotEmpty) { + if (vendorModel.value.photos != null && + vendorModel.value.photos!.isNotEmpty) { Timer.periodic(const Duration(seconds: 2), (Timer timer) { if (currentPage < vendorModel.value.photos!.length) { currentPage++; @@ -226,18 +317,16 @@ class DineInRestaurantDetailsController extends GetxController { Future getFavouriteList() async { if (Constant.userModel != null) { - await FireStoreUtils.getFavouriteRestaurant().then( - (value) { - favouriteList.value = value; - }, - ); + await FireStoreUtils.getFavouriteRestaurant().then((value) { + favouriteList.value = value; + }); } - await FireStoreUtils.getVendorCuisines(vendorModel.value.id.toString()).then( - (value) { - tags.value = value; - }, - ); + await FireStoreUtils.getVendorCuisines( + vendorModel.value.id.toString(), + ).then((value) { + tags.value = value; + }); update(); } @@ -251,8 +340,12 @@ class DineInRestaurantDetailsController extends GetxController { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); if (isCurrentDateInRange(start, end)) { isOpen.value = true; } @@ -262,8 +355,14 @@ class DineInRestaurantDetailsController extends GetxController { } } - bool isCurrentDateInRangeDineIn(DateTime startDate, DateTime endDate, DateTime selected) { - return selected.isAtSameMomentAs(startDate) || selected.isAtSameMomentAs(endDate) || selected.isAfter(startDate) && selected.isBefore(endDate); + bool isCurrentDateInRangeDineIn( + DateTime startDate, + DateTime endDate, + DateTime selected, + ) { + return selected.isAtSameMomentAs(startDate) || + selected.isAtSameMomentAs(endDate) || + selected.isAfter(startDate) && selected.isBefore(endDate); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -284,5 +383,9 @@ class TimeModel { String? discountPer; String? discountType; - TimeModel({required this.time, required this.discountPer, required this.discountType}); + TimeModel({ + required this.time, + required this.discountPer, + required this.discountType, + }); } diff --git a/lib/controllers/discount_restaurant_list_controller.dart b/lib/controllers/discount_restaurant_list_controller.dart index 4b01083..bc5b12e 100644 --- a/lib/controllers/discount_restaurant_list_controller.dart +++ b/lib/controllers/discount_restaurant_list_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/vendor_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class DiscountRestaurantListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/edit_profile_controller.dart b/lib/controllers/edit_profile_controller.dart index 47537b4..6fc4203 100644 --- a/lib/controllers/edit_profile_controller.dart +++ b/lib/controllers/edit_profile_controller.dart @@ -5,7 +5,7 @@ import 'package:easy_localization/easy_localization.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../themes/show_toast_dialog.dart'; @@ -18,7 +18,8 @@ class EditProfileController extends GetxController { Rx lastNameController = TextEditingController().obs; Rx emailController = TextEditingController().obs; Rx phoneNumberController = TextEditingController().obs; - Rx countryCodeController = TextEditingController(text: "+91").obs; + Rx countryCodeController = + TextEditingController(text: "+91").obs; @override void onInit() { @@ -27,14 +28,18 @@ class EditProfileController extends GetxController { } Future getData() async { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; firstNameController.value.text = userModel.value.firstName.toString(); lastNameController.value.text = userModel.value.lastName.toString(); emailController.value.text = userModel.value.email.toString(); - phoneNumberController.value.text = userModel.value.phoneNumber.toString(); - countryCodeController.value.text = userModel.value.countryCode.toString(); + phoneNumberController.value.text = + userModel.value.phoneNumber.toString(); + countryCodeController.value.text = + userModel.value.countryCode.toString(); profileImage.value = userModel.value.profilePictureURL ?? ""; } }); @@ -44,7 +49,8 @@ class EditProfileController extends GetxController { Future saveData() async { ShowToastDialog.showLoader("Please wait...".tr()); - if (Constant().hasValidUrl(profileImage.value) == false && profileImage.value.isNotEmpty) { + if (Constant().hasValidUrl(profileImage.value) == false && + profileImage.value.isNotEmpty) { profileImage.value = await Constant.uploadUserImageToFireStorage( File(profileImage.value), "profileImage/${FireStoreUtils.getCurrentUid()}", diff --git a/lib/controllers/enter_manually_location_controller.dart b/lib/controllers/enter_manually_location_controller.dart index a3962f1..6a7382d 100644 --- a/lib/controllers/enter_manually_location_controller.dart +++ b/lib/controllers/enter_manually_location_controller.dart @@ -1,8 +1,7 @@ import 'package:customer/service/fire_store_utils.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../models/user_model.dart'; class EnterManuallyLocationController extends GetxController { @@ -13,9 +12,12 @@ class EnterManuallyLocationController extends GetxController { List saveAsList = ['Home', 'Work', 'Hotel', 'other'].obs; RxString selectedSaveAs = "Home".obs; - Rx houseBuildingTextEditingController = TextEditingController().obs; - Rx localityEditingController = TextEditingController().obs; - Rx landmarkEditingController = TextEditingController().obs; + Rx houseBuildingTextEditingController = + TextEditingController().obs; + Rx localityEditingController = + TextEditingController().obs; + Rx landmarkEditingController = + TextEditingController().obs; Rx location = UserLocation().obs; Rx shippingModel = ShippingAddress().obs; RxBool isLoading = false.obs; @@ -36,7 +38,8 @@ class EnterManuallyLocationController extends GetxController { mode.value = argumentData['mode'] ?? "Add"; //check address - if (argumentData['address'] != null && argumentData['address'] is ShippingAddress) { + if (argumentData['address'] != null && + argumentData['address'] is ShippingAddress) { shippingModel.value = argumentData['address']; setData(shippingModel.value); } @@ -49,7 +52,8 @@ class EnterManuallyLocationController extends GetxController { void setData(ShippingAddress shippingAddress) { shippingModel.value = shippingAddress; - houseBuildingTextEditingController.value.text = shippingAddress.address.toString(); + houseBuildingTextEditingController.value.text = + shippingAddress.address.toString(); localityEditingController.value.text = shippingAddress.locality.toString(); landmarkEditingController.value.text = shippingAddress.landmark.toString(); selectedSaveAs.value = shippingAddress.addressAs.toString(); @@ -57,7 +61,9 @@ class EnterManuallyLocationController extends GetxController { } Future getUser() async { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; if (userModel.value.shippingAddress != null) { diff --git a/lib/controllers/favourite_controller.dart b/lib/controllers/favourite_controller.dart index 149265e..b150298 100644 --- a/lib/controllers/favourite_controller.dart +++ b/lib/controllers/favourite_controller.dart @@ -5,7 +5,7 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class FavouriteController extends GetxController { RxBool favouriteRestaurant = true.obs; @@ -35,14 +35,22 @@ class FavouriteController extends GetxController { }); for (var element in favouriteList) { - await FireStoreUtils.getVendorById(element.restaurantId.toString()).then((value) async { + await FireStoreUtils.getVendorById( + element.restaurantId.toString(), + ).then((value) async { if (value != null) { - if ((Constant.isSubscriptionModelApplied == true || value.adminCommission?.isEnabled == true) && value.subscriptionPlan != null) { + if ((Constant.isSubscriptionModelApplied == true || + value.adminCommission?.isEnabled == true) && + value.subscriptionPlan != null) { if (value.subscriptionTotalOrders == "-1") { favouriteVendorList.add(value); } else { print("Restaurant :: ${value.title.toString()}"); - if ((value.subscriptionExpiryDate != null && value.subscriptionExpiryDate!.toDate().isBefore(DateTime.now()) == false) || + if ((value.subscriptionExpiryDate != null && + value.subscriptionExpiryDate!.toDate().isBefore( + DateTime.now(), + ) == + false) || value.subscriptionPlan?.expiryDay == '-1') { if (value.subscriptionTotalOrders != '0') { favouriteVendorList.add(value); @@ -57,32 +65,45 @@ class FavouriteController extends GetxController { } for (var element in favouriteItemList) { - await FireStoreUtils.getProductById(element.productId.toString()).then((value) async { + await FireStoreUtils.getProductById(element.productId.toString()).then(( + value, + ) async { if (value != null) { - await FireStoreUtils.fireStore.collection(CollectionName.vendors).doc(value.vendorID.toString()).get().then((value1) async { - if (value1.exists) { - VendorModel vendorModel = VendorModel.fromJson(value1.data()!); - if(value.publish == true){ - if (Constant.isSubscriptionModelApplied == true || vendorModel.adminCommission?.isEnabled == true) { - if (vendorModel.subscriptionPlan != null) { - if (vendorModel.subscriptionTotalOrders == "-1") { - favouriteFoodList.add(value); - } else { - if ((vendorModel.subscriptionExpiryDate != null && vendorModel.subscriptionExpiryDate!.toDate().isBefore(DateTime.now()) == false) || - vendorModel.subscriptionPlan?.expiryDay == "-1") { - if (vendorModel.subscriptionTotalOrders != '0') { + await FireStoreUtils.fireStore + .collection(CollectionName.vendors) + .doc(value.vendorID.toString()) + .get() + .then((value1) async { + if (value1.exists) { + VendorModel vendorModel = VendorModel.fromJson( + value1.data()!, + ); + if (value.publish == true) { + if (Constant.isSubscriptionModelApplied == true || + vendorModel.adminCommission?.isEnabled == true) { + if (vendorModel.subscriptionPlan != null) { + if (vendorModel.subscriptionTotalOrders == "-1") { favouriteFoodList.add(value); + } else { + if ((vendorModel.subscriptionExpiryDate != null && + vendorModel.subscriptionExpiryDate! + .toDate() + .isBefore(DateTime.now()) == + false) || + vendorModel.subscriptionPlan?.expiryDay == + "-1") { + if (vendorModel.subscriptionTotalOrders != '0') { + favouriteFoodList.add(value); + } + } } } + } else { + favouriteFoodList.add(value); } } - } else { - favouriteFoodList.add(value); } - } - - } - }); + }); } }); } diff --git a/lib/controllers/favourite_ondemmand_controller.dart b/lib/controllers/favourite_ondemmand_controller.dart index 0ed8f26..19174cf 100644 --- a/lib/controllers/favourite_ondemmand_controller.dart +++ b/lib/controllers/favourite_ondemmand_controller.dart @@ -4,13 +4,14 @@ import 'package:customer/models/favorite_ondemand_service_model.dart'; import 'package:customer/models/provider_serivce_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class FavouriteOndemmandController extends GetxController { // Add your controller logic here Rx isLoading = false.obs; - RxList lstFav = [].obs; + RxList lstFav = + [].obs; RxList categories = [].obs; @override @@ -25,7 +26,9 @@ class FavouriteOndemmandController extends GetxController { await FireStoreUtils.getOnDemandCategory().then((catValue) { categories.value = catValue; }); - await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((favList) { + await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((favList) { lstFav.value = favList; }); isLoading.value = false; @@ -35,23 +38,27 @@ class FavouriteOndemmandController extends GetxController { if (Constant.userModel == null) { Get.to(LoginScreen()); } else { - var contain = lstFav.where((element) => element.service_id == provider.id); + var contain = lstFav.where( + (element) => element.service_id == provider.id, + ); if (contain.isNotEmpty) { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.removeFavouriteOndemandService(favouriteModel); lstFav.removeWhere((item) => item.service_id == provider.id); } else { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.setFavouriteOndemandSection(favouriteModel); lstFav.add(favouriteModel); } @@ -63,7 +70,9 @@ class FavouriteOndemmandController extends GetxController { if (categoryId == null || categoryId.isEmpty) return null; // Try to find category from cached list - CategoryModel? cat = categories.firstWhereOrNull((element) => element.id == categoryId); + CategoryModel? cat = categories.firstWhereOrNull( + (element) => element.id == categoryId, + ); // If not found, fetch from Firestore cat ??= await FireStoreUtils.getCategoryById(categoryId); diff --git a/lib/controllers/food_home_controller.dart b/lib/controllers/food_home_controller.dart index 3e1a300..2ffdf08 100644 --- a/lib/controllers/food_home_controller.dart +++ b/lib/controllers/food_home_controller.dart @@ -11,7 +11,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/utils/preferences.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/banner_model.dart'; import '../models/story_model.dart'; @@ -35,8 +35,10 @@ class FoodHomeController extends GetxController { RxBool isPopular = true.obs; RxString selectedOrderTypeValue = "Delivery".tr().obs; - Rx pageController = PageController(viewportFraction: 0.877).obs; - Rx pageBottomController = PageController(viewportFraction: 0.877).obs; + Rx pageController = + PageController(viewportFraction: 0.877).obs; + Rx pageBottomController = + PageController(viewportFraction: 0.877).obs; RxInt currentPage = 0.obs; RxInt currentBottomPage = 0.obs; @@ -66,7 +68,10 @@ class FoodHomeController extends GetxController { Future getData() async { isLoading.value = true; getCartData(); - selectedOrderTypeValue.value = Preferences.getString(Preferences.foodDeliveryType, defaultValue: "Delivery"); + selectedOrderTypeValue.value = Preferences.getString( + Preferences.foodDeliveryType, + defaultValue: "Delivery", + ); await getZone(); FireStoreUtils.getAllNearestRestaurant().listen((event) async { popularRestaurantList.clear(); @@ -82,17 +87,27 @@ class FoodHomeController extends GetxController { (a, b) => Constant.calculateReview( reviewCount: b.reviewsCount.toString(), reviewSum: b.reviewsSum.toString(), - ).compareTo(Constant.calculateReview(reviewCount: a.reviewsCount.toString(), reviewSum: a.reviewsSum.toString())), + ).compareTo( + Constant.calculateReview( + reviewCount: a.reviewsCount.toString(), + reviewSum: a.reviewsSum.toString(), + ), + ), ); - newArrivalRestaurantList.sort((a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo((a.createdAt ?? Timestamp.now()).toDate())); + newArrivalRestaurantList.sort( + (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo( + (a.createdAt ?? Timestamp.now()).toDate(), + ), + ); await getVendorCategory(); await FireStoreUtils.getHomeCoupon().then((value) { couponRestaurantList.clear(); couponList.clear(); for (var element1 in value) { for (var element in allNearestRestaurant) { - if (element1.vendorID == element.id && element1.expiresAt!.toDate().isAfter(DateTime.now())) { + if (element1.vendorID == element.id && + element1.expiresAt!.toDate().isAfter(DateTime.now())) { couponList.add(element1); couponRestaurantList.add(element); } @@ -110,7 +125,7 @@ class FoodHomeController extends GetxController { print("nearestIds: $nearestIds"); // Filter stories whose vendorID exists in nearestIds storyList.addAll( - stories.where((story) => nearestIds.contains(story.vendorID)) + stories.where((story) => nearestIds.contains(story.vendorID)), ); print("Filtered storyList length: ${storyList.length}"); }); @@ -148,8 +163,16 @@ class FoodHomeController extends GetxController { await FireStoreUtils.getHomeVendorCategory().then((value) { vendorCategoryModel.value = value; if (Constant.restaurantList != null) { - List usedCategoryIds = Constant.restaurantList!.expand((vendor) => vendor.categoryID ?? []).whereType().toSet().toList(); - vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList(); + List usedCategoryIds = + Constant.restaurantList! + .expand((vendor) => vendor.categoryID ?? []) + .whereType() + .toSet() + .toList(); + vendorCategoryModel.value = + vendorCategoryModel + .where((category) => usedCategoryIds.contains(category.id)) + .toList(); } }); @@ -177,7 +200,13 @@ class FoodHomeController extends GetxController { await FireStoreUtils.getZone().then((value) { if (value != null) { for (int i = 0; i < value.length; i++) { - if (Constant.isPointInPolygon(LatLng(Constant.selectedLocation.location?.latitude ?? 0.0, Constant.selectedLocation.location?.longitude ?? 0.0), value[i].area!)) { + if (Constant.isPointInPolygon( + LatLng( + Constant.selectedLocation.location?.latitude ?? 0.0, + Constant.selectedLocation.location?.longitude ?? 0.0, + ), + value[i].area!, + )) { Constant.selectedZone = value[i]; Constant.isZoneAvailable = true; break; diff --git a/lib/controllers/forgot_password_controller.dart b/lib/controllers/forgot_password_controller.dart index 0ea2da8..4b84ad8 100644 --- a/lib/controllers/forgot_password_controller.dart +++ b/lib/controllers/forgot_password_controller.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../themes/show_toast_dialog.dart'; class ForgotPasswordController extends GetxController { @@ -26,7 +26,8 @@ class ForgotPasswordController extends GetxController { await FirebaseAuth.instance.sendPasswordResetEmail(email: email); ShowToastDialog.closeLoader(); ShowToastDialog.showToast( - 'reset_password_link_sent'.trParams({'email': email}), + 'reset_password_link_sent'.tr(namedArgs: {'email': email}) + ); Get.back(); } on FirebaseAuthException catch (e) { @@ -34,7 +35,9 @@ class ForgotPasswordController extends GetxController { if (e.code == 'user-not-found') { ShowToastDialog.showToast('No user found for that email.'.tr()); } else { - ShowToastDialog.showToast(e.message?.tr() ?? "something_went_wrong".tr()); + ShowToastDialog.showToast( + e.message?.tr() ?? "something_went_wrong".tr(), + ); } } } diff --git a/lib/controllers/gift_card_controller.dart b/lib/controllers/gift_card_controller.dart index 3476e93..0acedfe 100644 --- a/lib/controllers/gift_card_controller.dart +++ b/lib/controllers/gift_card_controller.dart @@ -42,7 +42,7 @@ import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:uuid/uuid.dart'; @@ -76,27 +76,31 @@ class GiftCardController extends GetxController { giftCardList = value; if (giftCardList.isNotEmpty) { selectedGiftCard.value = giftCardList.first; - messageController.value.text = selectedGiftCard.value.message.toString(); + messageController.value.text = + selectedGiftCard.value.message.toString(); } }); isLoading.value = false; - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then( - (value) { - if (value != null) { - userModel.value = value; - } - }, - ); + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { + if (value != null) { + userModel.value = value; + } + }); await getPaymentSettings(); } Future placeOrder() async { if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (double.parse(userModel.value.walletAmount.toString()) >= double.parse(amountController.value.text)) { + if (double.parse(userModel.value.walletAmount.toString()) >= + double.parse(amountController.value.text)) { setOrder(); } else { - ShowToastDialog.showToast("You don't have sufficient wallet balance to purchase gift card".tr()); + ShowToastDialog.showToast( + "You don't have sufficient wallet balance to purchase gift card".tr(), + ); } } else { setOrder(); @@ -116,26 +120,34 @@ class GiftCardController extends GetxController { giftCardsOrderModel.giftCode = generateGiftCode(); giftCardsOrderModel.paymentType = selectedPaymentMethod.value; giftCardsOrderModel.createdDate = Timestamp.now(); - DateTime dateTime = DateTime.now().add(Duration(days: int.parse(selectedGiftCard.value.expiryDay ?? "2"))); + DateTime dateTime = DateTime.now().add( + Duration(days: int.parse(selectedGiftCard.value.expiryDay ?? "2")), + ); giftCardsOrderModel.expireDate = Timestamp.fromDate(dateTime); giftCardsOrderModel.userid = FireStoreUtils.getCurrentUid(); if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { WalletTransactionModel transactionModel = WalletTransactionModel( - id: Constant.getUuid(), - amount: double.parse(amountController.value.text), - date: Timestamp.now(), - paymentMethod: PaymentGateway.wallet.name, - transactionUser: "user", - userId: FireStoreUtils.getCurrentUid(), - isTopup: false, - orderId: giftCardsOrderModel.id, - note: "Gift card purchase amount debited".tr(), - paymentStatus: "success".tr()); + id: Constant.getUuid(), + amount: double.parse(amountController.value.text), + date: Timestamp.now(), + paymentMethod: PaymentGateway.wallet.name, + transactionUser: "user", + userId: FireStoreUtils.getCurrentUid(), + isTopup: false, + orderId: giftCardsOrderModel.id, + note: "Gift card purchase amount debited".tr(), + paymentStatus: "success".tr(), + ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${amountController.value.text.toString()}", userId: FireStoreUtils.getCurrentUid()).then((value) {}); + await FireStoreUtils.updateUserWallet( + amount: "-${amountController.value.text.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ).then((value) {}); } }); } @@ -179,54 +191,78 @@ class GiftCardController extends GetxController { Rx xenditModel = Xendit().obs; Future getPaymentSettings() async { - await FireStoreUtils.getPaymentSettingsData().then( - (value) { - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - if (walletSettingModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.wallet.name; - } else if (stripeModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.stripe.name; - } else if (payPalModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.paypal.name; - } else if (payStackModel.value.isEnable == true) { - selectedPaymentMethod.value = PaymentGateway.payStack.name; - } else if (mercadoPagoModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.mercadoPago.name; - } else if (flutterWaveModel.value.isEnable == true) { - selectedPaymentMethod.value = PaymentGateway.flutterWave.name; - }else if (payFastModel.value.isEnable == true) { - selectedPaymentMethod.value = PaymentGateway.payFast.name; - } else if (razorPayModel.value.isEnabled == true) { - selectedPaymentMethod.value = PaymentGateway.razorpay.name; - } else if (midTransModel.value.enable == true) { - selectedPaymentMethod.value = PaymentGateway.midTrans.name; - } else if (orangeMoneyModel.value.enable == true) { - selectedPaymentMethod.value = PaymentGateway.orangeMoney.name; - } else if (xenditModel.value.enable == true) { - selectedPaymentMethod.value = PaymentGateway.xendit.name; - } - Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString(); - Stripe.merchantIdentifier = 'GoRide'; - Stripe.instance.applySettings(); - setRef(); + await FireStoreUtils.getPaymentSettingsData().then((value) { + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + if (walletSettingModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.wallet.name; + } else if (stripeModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.stripe.name; + } else if (payPalModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.paypal.name; + } else if (payStackModel.value.isEnable == true) { + selectedPaymentMethod.value = PaymentGateway.payStack.name; + } else if (mercadoPagoModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.mercadoPago.name; + } else if (flutterWaveModel.value.isEnable == true) { + selectedPaymentMethod.value = PaymentGateway.flutterWave.name; + } else if (payFastModel.value.isEnable == true) { + selectedPaymentMethod.value = PaymentGateway.payFast.name; + } else if (razorPayModel.value.isEnabled == true) { + selectedPaymentMethod.value = PaymentGateway.razorpay.name; + } else if (midTransModel.value.enable == true) { + selectedPaymentMethod.value = PaymentGateway.midTrans.name; + } else if (orangeMoneyModel.value.enable == true) { + selectedPaymentMethod.value = PaymentGateway.orangeMoney.name; + } else if (xenditModel.value.enable == true) { + selectedPaymentMethod.value = PaymentGateway.xendit.name; + } + Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString(); + Stripe.merchantIdentifier = 'GoRide'; + Stripe.instance.applySettings(); + setRef(); - razorPay.on(Razorpay.EVENT_PAYMENT_SUCCESS, handlePaymentSuccess); - razorPay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWaller); - razorPay.on(Razorpay.EVENT_PAYMENT_ERROR, handlePaymentError); - }, - ); + razorPay.on(Razorpay.EVENT_PAYMENT_SUCCESS, handlePaymentSuccess); + razorPay.on(Razorpay.EVENT_EXTERNAL_WALLET, handleExternalWaller); + razorPay.on(Razorpay.EVENT_PAYMENT_ERROR, handlePaymentError); + }); } // final _flutterPaypalNativePlugin = FlutterPaypalNative.instance; @@ -297,28 +333,34 @@ class GiftCardController extends GetxController { // Strip Future stripeMakePayment({required String amount}) async { try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin."); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.", + ); } else { await Stripe.instance.initPaymentSheet( - paymentSheetParameters: SetupPaymentSheetParameters( - paymentIntentClientSecret: paymentIntentData['client_secret'], - allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay( - merchantCountryCode: 'US', - testEnv: true, - currencyCode: "USD", - ), - customFlow: true, - style: ThemeMode.system, - appearance: PaymentSheetAppearance( - colors: PaymentSheetAppearanceColors( - primary: AppThemeData.primary300, - ), - ), - merchantDisplayName: 'GoRide')); + paymentSheetParameters: SetupPaymentSheetParameters( + paymentIntentClientSecret: paymentIntentData['client_secret'], + allowsDelayedPaymentMethods: false, + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), + customFlow: true, + style: ThemeMode.system, + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), + merchantDisplayName: 'GoRide', + ), + ); displayStripePaymentSheet(amount: amount); } } catch (e, s) { @@ -357,8 +399,14 @@ class GiftCardController extends GetxController { "shipping[address][country]": "US", }; var stripeSecret = stripeModel.value.stripeSecret; - var response = await http.post(Uri.parse('https://api.stripe.com/v1/payment_intents'), - body: body, headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}); + var response = await http.post( + Uri.parse('https://api.stripe.com/v1/payment_intents'), + body: body, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + ); return jsonDecode(response.body); } catch (e) { @@ -367,7 +415,10 @@ class GiftCardController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { final headers = { 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json', @@ -381,7 +432,7 @@ class GiftCardController extends GetxController { "quantity": 1, "currency_id": "BRL", // or your preferred currency "unit_price": double.parse(amount), - } + }, ], "payer": {"email": userModel.value.email}, "back_urls": { @@ -389,7 +440,8 @@ class GiftCardController extends GetxController { "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success", }, - "auto_return": "approved" // Automatically return after payment is approved + "auto_return": + "approved", // Automatically return after payment is approved }); final response = await http.post( @@ -417,18 +469,22 @@ class GiftCardController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { await PayStackURLGen.payStackURLGen( - amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value) - .then((value) async { + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; - Get.to(PayStackScreen( - secretKey: payStackModel.value.secretKey.toString(), - callBackUrl: payStackModel.value.callbackURL.toString(), - initialURl: payStackModel0.data.authorizationUrl, - amount: totalAmount, - reference: payStackModel0.data.reference, - ))! - .then((value) { + Get.to( + PayStackScreen( + secretKey: payStackModel.value.secretKey.toString(), + callBackUrl: payStackModel.value.callbackURL.toString(), + initialURl: payStackModel0.data.authorizationUrl, + amount: totalAmount, + reference: payStackModel0.data.reference, + ), + )!.then((value) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -437,13 +493,18 @@ class GiftCardController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); final headers = { 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', @@ -464,14 +525,16 @@ class GiftCardController extends GetxController { "customizations": { "title": "Payment for Services", "description": "Payment for XYZ services", - } + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -500,8 +563,14 @@ class GiftCardController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -513,38 +582,40 @@ class GiftCardController extends GetxController { }); } -//PayPal + //PayPal void paypalPaymentSheet(String amount, context) { Navigator.of(context).push( MaterialPageRoute( - builder: (BuildContext context) => UsePaypal( - sandboxMode: payPalModel.value.isLive == true ? false : true, - clientId: payPalModel.value.paypalClient ?? '', - secretKey: payPalModel.value.paypalSecret ?? '', - returnURL: "com.parkme://paypalpay", - cancelURL: "com.parkme://paypalpay", - transactions: [ - { - "amount": { - "total": amount, - "currency": "USD", - "details": {"subtotal": amount} + builder: + (BuildContext context) => UsePaypal( + sandboxMode: payPalModel.value.isLive == true ? false : true, + clientId: payPalModel.value.paypalClient ?? '', + secretKey: payPalModel.value.paypalSecret ?? '', + returnURL: "com.parkme://paypalpay", + cancelURL: "com.parkme://paypalpay", + transactions: [ + { + "amount": { + "total": amount, + "currency": "USD", + "details": {"subtotal": amount}, + }, }, - } - ], - note: "Contact us for any questions on your order.", - onSuccess: (Map params) async { - placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); - }, - onError: (error) { - Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); - }, - onCancel: (params) { - Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); - }), + ], + note: "Contact us for any questions on your order.", + onSuccess: (Map params) async { + placeOrder(); + ShowToastDialog.showToast("Payment Successful!!".tr()); + }, + onError: (error) { + Get.back(); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + }, + onCancel: (params) { + Get.back(); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + }, + ), ), ); } @@ -555,33 +626,52 @@ class GiftCardController extends GetxController { String getChecksum = "${Constant.globalUrl}payments/getpaytmchecksum"; final response = await http.post( - Uri.parse( - getChecksum, - ), - headers: {}, - body: { - "mid": paytmModel.value.paytmMID.toString(), - "order_id": orderId, - "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), - }); + Uri.parse(getChecksum), + headers: {}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + }, + ); final data = jsonDecode(response.body); - await verifyCheckSum(checkSum: data["code"], amount: amount, orderId: orderId).then((value) { + await verifyCheckSum( + checkSum: data["code"], + amount: amount, + orderId: orderId, + ).then((value) { initiatePayment(amount: amount, orderId: orderId).then((value) { String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } GetPaymentTxtTokenModel result = value; - startTransaction(context, txnTokenBy: result.body.txnToken ?? '', orderId: orderId, amount: amount, callBackURL: callback, isStaging: paytmModel.value.isSandboxEnabled); + startTransaction( + context, + txnTokenBy: result.body.txnToken ?? '', + orderId: orderId, + amount: amount, + callBackURL: callback, + isStaging: paytmModel.value.isSandboxEnabled, + ); }); }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -616,46 +706,61 @@ class GiftCardController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( - Uri.parse( - getChecksum, - ), - headers: {}, - body: { - "mid": paytmModel.value.paytmMID.toString(), - "order_id": orderId, - "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), - "checksum_value": checkSum, - }); + Uri.parse(getChecksum), + headers: {}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, + ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } - final response = await http.post(Uri.parse(initiateURL), headers: {}, body: { - "mid": paytmModel.value.paytmMID, - "order_id": orderId, - "key_secret": paytmModel.value.pAYTMMERCHANTKEY, - "amount": amount.toString(), - "currency": "INR", - "callback_url": callback, - "custId": FireStoreUtils.getCurrentUid(), - "issandbox": paytmModel.value.isSandboxEnabled == true ? "1" : "2", - }); + final response = await http.post( + Uri.parse(initiateURL), + headers: {}, + body: { + "mid": paytmModel.value.paytmMID, + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY, + "amount": amount.toString(), + "currency": "INR", + "callback_url": callback, + "custId": FireStoreUtils.getCurrentUid(), + "issandbox": paytmModel.value.isSandboxEnabled == true ? "1" : "2", + }, + ); print(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -678,8 +783,8 @@ class GiftCardController extends GetxController { 'email': userModel.value.email, }, 'external': { - 'wallets': ['paytm'] - } + 'wallets': ['paytm'], + }, }; try { @@ -706,14 +811,14 @@ class GiftCardController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { - Get.to(() => MidtransScreen( - initialURl: url, - ))! - .then((value) { + Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -727,14 +832,20 @@ class GiftCardController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!), + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), }, body: jsonEncode({ 'transaction_details': { @@ -742,7 +853,9 @@ class GiftCardController extends GetxController { 'gross_amount': double.parse(amount.toString()).toInt(), }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -750,7 +863,9 @@ class GiftCardController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -767,21 +882,30 @@ class GiftCardController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen( - initialURl: paymentURL, - accessToken: accessToken, - amount: amount, - orangePay: orangeMoneyModel.value, - orderId: orderId, - payToken: payToken, - ))! - .then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -793,19 +917,24 @@ class GiftCardController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; - Map requestBody = { - 'grant_type': 'client_credentials', - }; + Map requestBody = {'grant_type': 'client_credentials'}; - var response = await http.post(Uri.parse(apiUrl), - headers: { - 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json', - }, - body: requestBody); + var response = await http.post( + Uri.parse(apiUrl), + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, + body: requestBody, + ); // Handle the response @@ -814,18 +943,32 @@ class GiftCardController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; String apiUrl = - orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -840,7 +983,11 @@ class GiftCardController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -854,7 +1001,9 @@ class GiftCardController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -871,12 +1020,13 @@ class GiftCardController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen( - initialURl: model.invoiceUrl ?? '', - transId: model.id ?? '', - apiKey: xenditModel.value.apiKey!.toString(), - ))! - .then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); placeOrder(); @@ -893,7 +1043,9 @@ class GiftCardController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -906,7 +1058,11 @@ class GiftCardController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/global_setting_controller.dart b/lib/controllers/global_setting_controller.dart index 1bcf70e..0eba1f1 100644 --- a/lib/controllers/global_setting_controller.dart +++ b/lib/controllers/global_setting_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/currency_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/utils/notification_service.dart'; import 'package:firebase_auth/firebase_auth.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../service/fire_store_utils.dart'; @@ -18,13 +18,27 @@ class GlobalSettingController extends GetxController { } Future getCurrentCurrency() async { - FireStoreUtils.fireStore.collection(CollectionName.currencies).where("isActive", isEqualTo: true).snapshots().listen((event) { - if (event.docs.isNotEmpty) { - Constant.currencyModel = CurrencyModel.fromJson(event.docs.first.data()); - } else { - Constant.currencyModel = CurrencyModel(id: "", code: "USD", decimal: 2, isactive: true, name: "US Dollar", symbol: "\$", symbolatright: false); - } - }); + FireStoreUtils.fireStore + .collection(CollectionName.currencies) + .where("isActive", isEqualTo: true) + .snapshots() + .listen((event) { + if (event.docs.isNotEmpty) { + Constant.currencyModel = CurrencyModel.fromJson( + event.docs.first.data(), + ); + } else { + Constant.currencyModel = CurrencyModel( + id: "", + code: "USD", + decimal: 2, + isactive: true, + name: "US Dollar", + symbol: "\$", + symbolatright: false, + ); + } + }); await FireStoreUtils.getSettings(); } @@ -35,7 +49,9 @@ class GlobalSettingController extends GetxController { String token = await NotificationService.getToken(); log(":::::::TOKEN:::::: $token"); if (FirebaseAuth.instance.currentUser != null) { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile( + FireStoreUtils.getCurrentUid(), + ).then((value) { if (value != null) { UserModel driverUserModel = value; driverUserModel.fcmToken = token; diff --git a/lib/controllers/history_gift_card_controller.dart b/lib/controllers/history_gift_card_controller.dart index 138b313..d11c857 100644 --- a/lib/controllers/history_gift_card_controller.dart +++ b/lib/controllers/history_gift_card_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/gift_cards_order_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:share_plus/share_plus.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class HistoryGiftCardController extends GetxController { RxList giftCardsOrderList = [].obs; @@ -25,13 +25,20 @@ class HistoryGiftCardController extends GetxController { void updateList(int index) { GiftCardsOrderModel giftCardsOrderModel = giftCardsOrderList[index]; - giftCardsOrderModel.isPasswordShow = giftCardsOrderModel.isPasswordShow == true ? false : true; + giftCardsOrderModel.isPasswordShow = + giftCardsOrderModel.isPasswordShow == true ? false : true; giftCardsOrderList.removeAt(index); giftCardsOrderList.insert(index, giftCardsOrderModel); } - Future share(String giftCode, String giftPin, String msg, String amount, Timestamp date) async { + Future share( + String giftCode, + String giftPin, + String msg, + String amount, + Timestamp date, + ) async { await Share.share( "${'Gift Code :'.tr()} $giftCode\n${'Gift Pin :'.tr()} $giftPin\n${'Price :'.tr()} ${Constant.amountShow(amount: amount)}\n${'Expire Date :'.tr()} ${date.toDate()}\n\n${'Message'.tr()} : $msg", ); diff --git a/lib/controllers/home_e_commerce_controller.dart b/lib/controllers/home_e_commerce_controller.dart index d92daa0..95adb18 100644 --- a/lib/controllers/home_e_commerce_controller.dart +++ b/lib/controllers/home_e_commerce_controller.dart @@ -8,8 +8,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/service/cart_provider.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; class HomeECommerceController extends GetxController { @@ -27,8 +26,10 @@ class HomeECommerceController extends GetxController { RxBool isListView = true.obs; RxBool isPopular = true.obs; - Rx pageController = PageController(viewportFraction: 0.877).obs; - Rx pageBottomController = PageController(viewportFraction: 0.877).obs; + Rx pageController = + PageController(viewportFraction: 0.877).obs; + Rx pageBottomController = + PageController(viewportFraction: 0.877).obs; RxInt currentPage = 0.obs; RxInt currentBottomPage = 0.obs; @@ -41,7 +42,8 @@ class HomeECommerceController extends GetxController { } RxList vendorCategoryModel = [].obs; - RxList categoryWiseProductList = [].obs; + RxList categoryWiseProductList = + [].obs; RxList allNearestRestaurant = [].obs; RxList newArrivalRestaurantList = [].obs; @@ -64,10 +66,22 @@ class HomeECommerceController extends GetxController { allNearestRestaurant.addAll(event); newArrivalRestaurantList.addAll(event); Constant.restaurantList = allNearestRestaurant; - List usedCategoryIds = allNearestRestaurant.expand((vendor) => vendor.categoryID ?? []).whereType().toSet().toList(); - vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList(); + List usedCategoryIds = + allNearestRestaurant + .expand((vendor) => vendor.categoryID ?? []) + .whereType() + .toSet() + .toList(); + vendorCategoryModel.value = + vendorCategoryModel + .where((category) => usedCategoryIds.contains(category.id)) + .toList(); - newArrivalRestaurantList.sort((a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo((a.createdAt ?? Timestamp.now()).toDate())); + newArrivalRestaurantList.sort( + (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo( + (a.createdAt ?? Timestamp.now()).toDate(), + ), + ); if (Constant.isEnableAdsFeature == true) { await FireStoreUtils.getAllAdvertisement().then((value) { diff --git a/lib/controllers/home_parcel_controller.dart b/lib/controllers/home_parcel_controller.dart index aaccf75..f3e112f 100644 --- a/lib/controllers/home_parcel_controller.dart +++ b/lib/controllers/home_parcel_controller.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/banner_model.dart'; import '../models/parcel_category.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/live_tracking_controller.dart b/lib/controllers/live_tracking_controller.dart index dbc245c..9ec6f71 100644 --- a/lib/controllers/live_tracking_controller.dart +++ b/lib/controllers/live_tracking_controller.dart @@ -6,7 +6,7 @@ import 'package:customer/models/order_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import 'package:flutter_map/flutter_map.dart' as flutterMap; @@ -59,37 +59,58 @@ class LiveTrackingController extends GetxController { orderModel.value = args['orderModel']; - orderSub = FireStoreUtils.fireStore.collection(CollectionName.vendorOrders).doc(orderModel.value.id).snapshots().listen((orderSnap) { - if (orderSnap.data() == null) return; - orderModel.value = OrderModel.fromJson(orderSnap.data()!); + orderSub = FireStoreUtils.fireStore + .collection(CollectionName.vendorOrders) + .doc(orderModel.value.id) + .snapshots() + .listen((orderSnap) { + if (orderSnap.data() == null) return; + orderModel.value = OrderModel.fromJson(orderSnap.data()!); - if (orderModel.value.driverID != null) { - driverSub?.cancel(); - driverSub = FireStoreUtils.fireStore.collection(CollectionName.users).doc(orderModel.value.driverID).snapshots().listen((driverSnap) async { - if (driverSnap.data() == null) return; - driverUserModel.value = UserModel.fromJson(driverSnap.data()!); - await updateLiveTracking(); + if (orderModel.value.driverID != null) { + driverSub?.cancel(); + driverSub = FireStoreUtils.fireStore + .collection(CollectionName.users) + .doc(orderModel.value.driverID) + .snapshots() + .listen((driverSnap) async { + if (driverSnap.data() == null) return; + driverUserModel.value = UserModel.fromJson( + driverSnap.data()!, + ); + await updateLiveTracking(); + }); + } + + if (orderModel.value.status == Constant.orderCompleted) { + Get.back(); + } }); - } - - if (orderModel.value.status == Constant.orderCompleted) { - Get.back(); - } - }); isLoading.value = false; } Future updateLiveTracking() async { - driverCurrent.value = location.LatLng(driverUserModel.value.location?.latitude ?? 0.0, driverUserModel.value.location?.longitude ?? 0.0); + driverCurrent.value = location.LatLng( + driverUserModel.value.location?.latitude ?? 0.0, + driverUserModel.value.location?.longitude ?? 0.0, + ); - source.value = location.LatLng(orderModel.value.vendor?.latitude ?? 0.0, orderModel.value.vendor?.longitude ?? 0.0); + source.value = location.LatLng( + orderModel.value.vendor?.latitude ?? 0.0, + orderModel.value.vendor?.longitude ?? 0.0, + ); - destination.value = location.LatLng(orderModel.value.address?.location?.latitude ?? 0.0, orderModel.value.address?.location?.longitude ?? 0.0); + destination.value = location.LatLng( + orderModel.value.address?.location?.latitude ?? 0.0, + orderModel.value.address?.location?.longitude ?? 0.0, + ); - if (orderModel.value.status == Constant.orderPlaced || orderModel.value.status == Constant.orderAccepted) { + if (orderModel.value.status == Constant.orderPlaced || + orderModel.value.status == Constant.orderAccepted) { await showDriverToRestaurantRoute(); - } else if (orderModel.value.status == Constant.orderShipped || orderModel.value.status == Constant.orderInTransit) { + } else if (orderModel.value.status == Constant.orderShipped || + orderModel.value.status == Constant.orderInTransit) { await showDriverToCustomerRoute(); } } @@ -136,7 +157,10 @@ class LiveTrackingController extends GetxController { routePoints.clear(); } - Future fetchRoute(location.LatLng source, location.LatLng destination) async { + Future fetchRoute( + location.LatLng source, + location.LatLng destination, + ) async { final url = Uri.parse( 'https://router.project-osrm.org/route/v1/driving/${source.longitude},${source.latitude};${destination.longitude},${destination.latitude}?overview=full&geometries=geojson', ); @@ -144,7 +168,12 @@ class LiveTrackingController extends GetxController { if (response.statusCode == 200) { final data = json.decode(response.body); final coords = data['routes'][0]['geometry']['coordinates']; - routePoints.value = coords.map((c) => location.LatLng(c[1].toDouble(), c[0].toDouble())).toList(); + routePoints.value = + coords + .map( + (c) => location.LatLng(c[1].toDouble(), c[0].toDouble()), + ) + .toList(); } } @@ -155,15 +184,34 @@ class LiveTrackingController extends GetxController { void addOsmMarkers({bool showPickup = false, bool showDrop = false}) { final List tempMarkers = [ // Driver Marker - flutterMap.Marker(point: driverCurrent.value, width: 40, height: 40, child: Image.asset('assets/images/food_delivery.png')), + flutterMap.Marker( + point: driverCurrent.value, + width: 40, + height: 40, + child: Image.asset('assets/images/food_delivery.png'), + ), ]; if (showPickup) { - tempMarkers.add(flutterMap.Marker(point: source.value, width: 40, height: 40, child: Image.asset('assets/images/pickup.png'))); + tempMarkers.add( + flutterMap.Marker( + point: source.value, + width: 40, + height: 40, + child: Image.asset('assets/images/pickup.png'), + ), + ); } if (showDrop) { - tempMarkers.add(flutterMap.Marker(point: destination.value, width: 40, height: 40, child: Image.asset('assets/images/dropoff.png'))); + tempMarkers.add( + flutterMap.Marker( + point: destination.value, + width: 40, + height: 40, + child: Image.asset('assets/images/dropoff.png'), + ), + ); } osmMarkers.value = tempMarkers; @@ -180,11 +228,16 @@ class LiveTrackingController extends GetxController { List polylineCoordinates = []; PolylineResult result = await polylinePoints.getRouteBetweenCoordinates( - request: PolylineRequest(origin: PointLatLng(sourceLatitude, sourceLongitude), destination: PointLatLng(destinationLatitude, destinationLongitude), mode: TravelMode.driving), + request: PolylineRequest( + origin: PointLatLng(sourceLatitude, sourceLongitude), + destination: PointLatLng(destinationLatitude, destinationLongitude), + mode: TravelMode.driving, + ), ); if (result.points.isNotEmpty) { - polylineCoordinates = result.points.map((e) => LatLng(e.latitude, e.longitude)).toList(); + polylineCoordinates = + result.points.map((e) => LatLng(e.latitude, e.longitude)).toList(); } addGoogleMarkers(showPickup: showPickup, showDrop: showDrop); @@ -205,9 +258,19 @@ class LiveTrackingController extends GetxController { ); } - if (showPickup && orderModel.value.vendor?.latitude != null && pickupIcon != null) { - addMarker(id: "Pickup", latitude: orderModel.value.vendor!.latitude ?? 0.0, longitude: orderModel.value.vendor!.longitude ?? 0.0, descriptor: pickupIcon!, rotation: 0.0); - } else if (showDrop && orderModel.value.address?.location?.latitude != null && dropoffIcon != null) { + if (showPickup && + orderModel.value.vendor?.latitude != null && + pickupIcon != null) { + addMarker( + id: "Pickup", + latitude: orderModel.value.vendor!.latitude ?? 0.0, + longitude: orderModel.value.vendor!.longitude ?? 0.0, + descriptor: pickupIcon!, + rotation: 0.0, + ); + } else if (showDrop && + orderModel.value.address?.location?.latitude != null && + dropoffIcon != null) { addMarker( id: "Drop", latitude: orderModel.value.address!.location!.latitude ?? 0.0, @@ -218,24 +281,50 @@ class LiveTrackingController extends GetxController { } } - void addMarker({required String id, required double latitude, required double longitude, required BitmapDescriptor descriptor, required double rotation}) { + void addMarker({ + required String id, + required double latitude, + required double longitude, + required BitmapDescriptor descriptor, + required double rotation, + }) { MarkerId markerId = MarkerId(id); - markers[markerId] = Marker(markerId: markerId, icon: descriptor, position: LatLng(latitude, longitude), rotation: rotation, anchor: const Offset(0.5, 0.5)); + markers[markerId] = Marker( + markerId: markerId, + icon: descriptor, + position: LatLng(latitude, longitude), + rotation: rotation, + anchor: const Offset(0.5, 0.5), + ); } Future addMarkerIcons() async { if (Constant.selectedMapType == 'osm') return; - pickupIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/pickup.png', 100)); - dropoffIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/dropoff.png', 100)); - driverIcon = BitmapDescriptor.fromBytes(await Constant().getBytesFromAsset('assets/images/food_delivery.png', 100)); + pickupIcon = BitmapDescriptor.fromBytes( + await Constant().getBytesFromAsset('assets/images/pickup.png', 100), + ); + dropoffIcon = BitmapDescriptor.fromBytes( + await Constant().getBytesFromAsset('assets/images/dropoff.png', 100), + ); + driverIcon = BitmapDescriptor.fromBytes( + await Constant().getBytesFromAsset( + 'assets/images/food_delivery.png', + 100, + ), + ); } Future _addPolyLine(List polylineCoordinates) async { if (polylineCoordinates.isEmpty) return; PolylineId id = const PolylineId("poly"); - Polyline polyline = Polyline(polylineId: id, color: Colors.blue, width: 5, points: polylineCoordinates); + Polyline polyline = Polyline( + polylineId: id, + color: Colors.blue, + width: 5, + points: polylineCoordinates, + ); polyLines[id] = polyline; await updateCameraBounds(polylineCoordinates); @@ -244,13 +333,26 @@ class LiveTrackingController extends GetxController { Future updateCameraBounds(List points) async { if (mapController == null || points.isEmpty) return; - double minLat = points.map((e) => e.latitude).reduce((a, b) => a < b ? a : b); - double maxLat = points.map((e) => e.latitude).reduce((a, b) => a > b ? a : b); - double minLng = points.map((e) => e.longitude).reduce((a, b) => a < b ? a : b); - double maxLng = points.map((e) => e.longitude).reduce((a, b) => a > b ? a : b); + double minLat = points + .map((e) => e.latitude) + .reduce((a, b) => a < b ? a : b); + double maxLat = points + .map((e) => e.latitude) + .reduce((a, b) => a > b ? a : b); + double minLng = points + .map((e) => e.longitude) + .reduce((a, b) => a < b ? a : b); + double maxLng = points + .map((e) => e.longitude) + .reduce((a, b) => a > b ? a : b); - LatLngBounds bounds = LatLngBounds(southwest: LatLng(minLat, minLng), northeast: LatLng(maxLat, maxLng)); + LatLngBounds bounds = LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ); - await mapController!.animateCamera(CameraUpdate.newLatLngBounds(bounds, 80)); + await mapController!.animateCamera( + CameraUpdate.newLatLngBounds(bounds, 80), + ); } } diff --git a/lib/controllers/login_controller.dart b/lib/controllers/login_controller.dart index 132c7ad..3af30c4 100644 --- a/lib/controllers/login_controller.dart +++ b/lib/controllers/login_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_s import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_sign_in/google_sign_in.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import '../constant/constant.dart'; @@ -46,16 +46,22 @@ class LoginController extends GetxController { isLoading.value = true; ShowToastDialog.showLoader("Logging in...".tr()); - final credential = await FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password); + final credential = await FirebaseAuth.instance.signInWithEmailAndPassword( + email: email, + password: password, + ); - final userModel = await FireStoreUtils.getUserProfile(credential.user!.uid); + final userModel = await FireStoreUtils.getUserProfile( + credential.user!.uid, + ); if (userModel != null && userModel.role == Constant.userRoleCustomer) { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { final defaultAddress = userModel.shippingAddress!.firstWhere( (e) => e.isDefault == true, orElse: () => userModel.shippingAddress!.first, @@ -69,12 +75,16 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); + ShowToastDialog.showToast( + "This user is disabled. Please contact admin.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); + ShowToastDialog.showToast( + "This user does not exist in the customer app.".tr(), + ); Get.offAll(() => const LoginScreen()); } } on FirebaseAuthException catch (e) { @@ -85,7 +95,9 @@ class LoginController extends GetxController { } else if (e.code == 'invalid-email') { ShowToastDialog.showToast("Invalid email.".tr()); } else { - ShowToastDialog.showToast(e.message?.tr() ?? "Login failed. Please try again.".tr()); + ShowToastDialog.showToast( + e.message?.tr() ?? "Login failed. Please try again.".tr(), + ); } } finally { isLoading.value = false; @@ -107,22 +119,32 @@ class LoginController extends GetxController { userModel.provider = 'google'; ShowToastDialog.closeLoader(); - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "google"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "google"}, + ); } else { - await FireStoreUtils.userExistOrNot(value.user!.uid).then((userExit) async { + await FireStoreUtils.userExistOrNot(value.user!.uid).then(( + userExit, + ) async { ShowToastDialog.closeLoader(); if (userExit == true) { - UserModel? userModel = await FireStoreUtils.getUserProfile(value.user!.uid); - if (userModel != null && userModel.role == Constant.userRoleCustomer) { + UserModel? userModel = await FireStoreUtils.getUserProfile( + value.user!.uid, + ); + if (userModel != null && + userModel.role == Constant.userRoleCustomer) { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { - final defaultAddress = userModel.shippingAddress!.firstWhere( - (e) => e.isDefault == true, - orElse: () => userModel.shippingAddress!.first, - ); + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { + final defaultAddress = userModel.shippingAddress! + .firstWhere( + (e) => e.isDefault == true, + orElse: () => userModel.shippingAddress!.first, + ); Constant.selectedLocation = defaultAddress; @@ -132,12 +154,16 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); + ShowToastDialog.showToast( + "This user is disabled. Please contact admin.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); + ShowToastDialog.showToast( + "This user does not exist in the customer app.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { @@ -148,7 +174,10 @@ class LoginController extends GetxController { userModel.lastName = value.user!.displayName?.split(' ').last; userModel.provider = 'google'; - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "google"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "google"}, + ); } }); } @@ -174,22 +203,32 @@ class LoginController extends GetxController { userModel.lastName = appleCredential.familyName; userModel.provider = 'apple'; - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "apple"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "apple"}, + ); } else { // Existing user - await FireStoreUtils.userExistOrNot(userCredential.user!.uid).then((userExit) async { + await FireStoreUtils.userExistOrNot(userCredential.user!.uid).then(( + userExit, + ) async { if (userExit == true) { - UserModel? userModel = await FireStoreUtils.getUserProfile(userCredential.user!.uid); - if (userModel != null && userModel.role == Constant.userRoleCustomer) { + UserModel? userModel = await FireStoreUtils.getUserProfile( + userCredential.user!.uid, + ); + if (userModel != null && + userModel.role == Constant.userRoleCustomer) { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { - final defaultAddress = userModel.shippingAddress!.firstWhere( - (e) => e.isDefault == true, - orElse: () => userModel.shippingAddress!.first, - ); + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { + final defaultAddress = userModel.shippingAddress! + .firstWhere( + (e) => e.isDefault == true, + orElse: () => userModel.shippingAddress!.first, + ); Constant.selectedLocation = defaultAddress; Get.offAll(() => const ServiceListScreen()); @@ -198,12 +237,16 @@ class LoginController extends GetxController { } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user is disabled. Please contact admin.".tr()); + ShowToastDialog.showToast( + "This user is disabled. Please contact admin.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); - ShowToastDialog.showToast("This user does not exist in the customer app.".tr()); + ShowToastDialog.showToast( + "This user does not exist in the customer app.".tr(), + ); Get.offAll(() => const LoginScreen()); } } else { @@ -215,7 +258,10 @@ class LoginController extends GetxController { userModel.lastName = appleCredential.familyName; userModel.provider = 'apple'; - Get.off(const SignUpScreen(), arguments: {"userModel": userModel, "type": "apple"}); + Get.off( + const SignUpScreen(), + arguments: {"userModel": userModel, "type": "apple"}, + ); } }); } @@ -234,8 +280,12 @@ class LoginController extends GetxController { final GoogleSignInAuthentication googleAuth = googleUser.authentication; - final credential = GoogleAuthProvider.credential(idToken: googleAuth.idToken); - final userCredential = await FirebaseAuth.instance.signInWithCredential(credential); + final credential = GoogleAuthProvider.credential( + idToken: googleAuth.idToken, + ); + final userCredential = await FirebaseAuth.instance.signInWithCredential( + credential, + ); return userCredential; } catch (e) { @@ -255,17 +305,27 @@ class LoginController extends GetxController { final rawNonce = generateNonce(); final nonce = sha256ofString(rawNonce); - AuthorizationCredentialAppleID appleCredential = await SignInWithApple.getAppleIDCredential( - scopes: [AppleIDAuthorizationScopes.email, AppleIDAuthorizationScopes.fullName], - nonce: nonce, + AuthorizationCredentialAppleID appleCredential = + await SignInWithApple.getAppleIDCredential( + scopes: [ + AppleIDAuthorizationScopes.email, + AppleIDAuthorizationScopes.fullName, + ], + nonce: nonce, + ); + + final oauthCredential = OAuthProvider("apple.com").credential( + idToken: appleCredential.identityToken, + rawNonce: rawNonce, + accessToken: appleCredential.authorizationCode, ); - final oauthCredential = OAuthProvider( - "apple.com", - ).credential(idToken: appleCredential.identityToken, rawNonce: rawNonce, accessToken: appleCredential.authorizationCode); - - UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(oauthCredential); - return {"appleCredential": appleCredential, "userCredential": userCredential}; + UserCredential userCredential = await FirebaseAuth.instance + .signInWithCredential(oauthCredential); + return { + "appleCredential": appleCredential, + "userCredential": userCredential, + }; } catch (e) { debugPrint(e.toString()); } diff --git a/lib/controllers/map_view_controller.dart b/lib/controllers/map_view_controller.dart index a7e148e..efa346f 100644 --- a/lib/controllers/map_view_controller.dart +++ b/lib/controllers/map_view_controller.dart @@ -2,7 +2,7 @@ import 'dart:typed_data'; import 'package:customer/constant/constant.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import '../screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart'; diff --git a/lib/controllers/mobile_login_controller.dart b/lib/controllers/mobile_login_controller.dart index ddca48c..5717b2c 100644 --- a/lib/controllers/mobile_login_controller.dart +++ b/lib/controllers/mobile_login_controller.dart @@ -2,14 +2,15 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../screen_ui/auth_screens/otp_verification_screen.dart'; class MobileLoginController extends GetxController { - final Rx mobileController = TextEditingController().obs; - final Rx countryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + final Rx mobileController = + TextEditingController().obs; + final Rx countryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; final FirebaseAuth _auth = FirebaseAuth.instance; @@ -19,7 +20,9 @@ class MobileLoginController extends GetxController { final countryCode = countryCodeController.value.text.trim(); if (mobile.isEmpty || mobile.length != 10) { - ShowToastDialog.showToast("Please enter a valid 10-digit mobile number".tr()); + ShowToastDialog.showToast( + "Please enter a valid 10-digit mobile number".tr(), + ); return; } @@ -36,12 +39,21 @@ class MobileLoginController extends GetxController { if (e.code == 'invalid-phone-number') { ShowToastDialog.showToast("Invalid phone number".tr()); } else { - ShowToastDialog.showToast(e.message ?? "OTP verification failed".tr()); + ShowToastDialog.showToast( + e.message ?? "OTP verification failed".tr(), + ); } }, codeSent: (String verificationId, int? resendToken) { ShowToastDialog.closeLoader(); - Get.to(() => const OtpVerificationScreen(), arguments: {'countryCode': countryCode, 'phoneNumber': mobile, 'verificationId': verificationId}); + Get.to( + () => const OtpVerificationScreen(), + arguments: { + 'countryCode': countryCode, + 'phoneNumber': mobile, + 'verificationId': verificationId, + }, + ); }, codeAutoRetrievalTimeout: (String verificationId) { ShowToastDialog.closeLoader(); diff --git a/lib/controllers/my_booking_on_demand_controller.dart b/lib/controllers/my_booking_on_demand_controller.dart index 150f4d5..6fc60e6 100644 --- a/lib/controllers/my_booking_on_demand_controller.dart +++ b/lib/controllers/my_booking_on_demand_controller.dart @@ -1,4 +1,4 @@ -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/onprovider_order_model.dart'; import '../models/worker_model.dart'; import '../service/fire_store_utils.dart'; @@ -18,7 +18,6 @@ class MyBookingOnDemandController extends GetxController { listenOrders(); // Listen for real-time updates } - void selectTab(String tab) { selectedTab.value = tab; } @@ -32,7 +31,9 @@ class MyBookingOnDemandController extends GetxController { // Fetch worker info if not already fetched for (var order in updatedOrders) { - if (order.workerId != null && order.workerId!.isNotEmpty && !workers.containsKey(order.workerId!)) { + if (order.workerId != null && + order.workerId!.isNotEmpty && + !workers.containsKey(order.workerId!)) { FireStoreUtils.getWorker(order.workerId!).then((worker) { if (worker != null) workers[order.workerId!] = worker; }); @@ -48,18 +49,39 @@ class MyBookingOnDemandController extends GetxController { ); } - List get filteredParcelOrders => getOrdersForTab(selectedTab.value); + List get filteredParcelOrders => + getOrdersForTab(selectedTab.value); List getOrdersForTab(String tab) { switch (tab) { case "Placed": - return orders.where((order) => ["Order Placed", "Order Accepted", "Order Assigned", "Order Ongoing", "In Transit"].contains(order.status)).toList(); + return orders + .where( + (order) => [ + "Order Placed", + "Order Accepted", + "Order Assigned", + "Order Ongoing", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Completed": - return orders.where((order) => ["Order Completed"].contains(order.status)).toList(); + return orders + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return orders.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return orders + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; diff --git a/lib/controllers/my_cab_booking_controller.dart b/lib/controllers/my_cab_booking_controller.dart index d563f7c..884a512 100644 --- a/lib/controllers/my_cab_booking_controller.dart +++ b/lib/controllers/my_cab_booking_controller.dart @@ -39,7 +39,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -72,7 +72,9 @@ class MyCabBookingController extends GetxController { isLoading.value = true; if (FirebaseAuth.instance.currentUser != null) { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((user) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + user, + ) { if (user != null) { userModel.value = user; } @@ -88,21 +90,45 @@ class MyCabBookingController extends GetxController { isLoading.value = false; } - List get filteredParcelOrders => getOrdersForTab(selectedTab.value); + List get filteredParcelOrders => + getOrdersForTab(selectedTab.value); List getOrdersForTab(String tab) { switch (tab) { case "New": - return cabOrder.where((order) => ["Order Placed", "Driver Pending"].contains(order.status)).toList(); + return cabOrder + .where( + (order) => + ["Order Placed", "Driver Pending"].contains(order.status), + ) + .toList(); case "On Going": - return cabOrder.where((order) => ["Driver Accepted", "Order Shipped", "In Transit"].contains(order.status)).toList(); + return cabOrder + .where( + (order) => [ + "Driver Accepted", + "Order Shipped", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Completed": - return cabOrder.where((order) => ["Order Completed"].contains(order.status)).toList(); + return cabOrder + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return cabOrder.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return cabOrder + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; @@ -164,15 +190,22 @@ class MyCabBookingController extends GetxController { selectedOrder.value = order; try { - subTotal.value = double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? 0.0; - discount.value = double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? 0.0; + subTotal.value = + double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? + 0.0; + discount.value = + double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? + 0.0; taxAmount.value = 0.0; subTotal.value = subTotal.value; if (selectedOrder.value.taxSetting != null) { for (var element in selectedOrder.value.taxSetting!) { - taxAmount.value += Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element); + taxAmount.value += Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + ); } } @@ -209,8 +242,13 @@ class MyCabBookingController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); }); } selectedOrder.value.paymentStatus = true; @@ -223,19 +261,45 @@ class MyCabBookingController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -277,20 +341,32 @@ class MyCabBookingController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -336,7 +412,10 @@ class MyCabBookingController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -346,8 +425,14 @@ class MyCabBookingController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -369,7 +454,11 @@ class MyCabBookingController extends GetxController { // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -452,15 +541,23 @@ class MyCabBookingController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -470,17 +567,23 @@ class MyCabBookingController extends GetxController { "payment_options": "ussd, card, barter, payattitude", "customer": { "email": Constant.userModel!.email.toString(), - "phonenumber": Constant.userModel!.phoneNumber, // Add a real phone number + "phonenumber": + Constant.userModel!.phoneNumber, // Add a real phone number "name": Constant.userModel!.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -509,10 +612,14 @@ class MyCabBookingController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then(( - String? value, - ) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: Constant.userModel!, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -594,7 +701,11 @@ class MyCabBookingController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), @@ -610,13 +721,18 @@ class MyCabBookingController extends GetxController { return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -634,9 +750,12 @@ class MyCabBookingController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -654,7 +773,10 @@ class MyCabBookingController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': Constant.userModel!.phoneNumber, 'email': Constant.userModel!.email}, + 'prefill': { + 'contact': Constant.userModel!.phoneNumber, + 'email': Constant.userModel!.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -689,7 +811,10 @@ class MyCabBookingController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -708,7 +833,9 @@ class MyCabBookingController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); final url = Uri.parse( - midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links', + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', ); final response = await http.post( @@ -716,12 +843,19 @@ class MyCabBookingController extends GetxController { headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!), + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -729,7 +863,9 @@ class MyCabBookingController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -746,10 +882,18 @@ class MyCabBookingController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { Get.to( @@ -773,7 +917,12 @@ class MyCabBookingController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; @@ -794,9 +943,16 @@ class MyCabBookingController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -827,7 +983,11 @@ class MyCabBookingController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -841,7 +1001,9 @@ class MyCabBookingController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -859,7 +1021,11 @@ class MyCabBookingController extends GetxController { ShowToastDialog.closeLoader(); if (model.id != null) { Get.to( - () => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()), + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); @@ -877,7 +1043,9 @@ class MyCabBookingController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -890,7 +1058,11 @@ class MyCabBookingController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/my_profile_controller.dart b/lib/controllers/my_profile_controller.dart index 566b012..c6d7068 100644 --- a/lib/controllers/my_profile_controller.dart +++ b/lib/controllers/my_profile_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/theme_controller.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; class MyProfileController extends GetxController { @@ -41,7 +41,10 @@ class MyProfileController extends GetxController { Future deleteUserFromServer() async { var url = '${Constant.websiteUrl}/api/delete-user'; try { - var response = await http.post(Uri.parse(url), body: {'uuid': FireStoreUtils.getCurrentUid()}); + var response = await http.post( + Uri.parse(url), + body: {'uuid': FireStoreUtils.getCurrentUid()}, + ); log("deleteUserFromServer :: ${response.body}"); return response.statusCode == 200; } catch (e) { diff --git a/lib/controllers/my_rental_booking_controller.dart b/lib/controllers/my_rental_booking_controller.dart index 672ef22..3e595a7 100644 --- a/lib/controllers/my_rental_booking_controller.dart +++ b/lib/controllers/my_rental_booking_controller.dart @@ -5,7 +5,7 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/rental_order_model.dart'; import '../models/tax_model.dart'; import '../service/fire_store_utils.dart'; @@ -46,7 +46,6 @@ class MyRentalBookingController extends GetxController { ); } isLoading.value = false; - } Rx selectedOrder = RentalOrderModel().obs; @@ -67,38 +66,84 @@ class MyRentalBookingController extends GetxController { selectedOrder.value = order; try { - subTotal.value = double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? 0.0; - discount.value = double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? 0.0; + subTotal.value = + double.tryParse(selectedOrder.value.subTotal?.toString() ?? "0") ?? + 0.0; + discount.value = + double.tryParse(selectedOrder.value.discount?.toString() ?? "0") ?? + 0.0; taxAmount.value = 0.0; if (selectedOrder.value.endTime != null) { DateTime start = selectedOrder.value.startTime!.toDate(); DateTime end = selectedOrder.value.endTime!.toDate(); int hours = end.difference(start).inHours; - if (hours >= int.parse(selectedOrder.value.rentalPackageModel!.includedHours.toString())) { - hours = hours - int.parse(selectedOrder.value.rentalPackageModel!.includedHours.toString()); - double hourlyRate = double.tryParse(selectedOrder.value.rentalPackageModel?.extraMinuteFare?.toString() ?? "0") ?? 0.0; + if (hours >= + int.parse( + selectedOrder.value.rentalPackageModel!.includedHours.toString(), + )) { + hours = + hours - + int.parse( + selectedOrder.value.rentalPackageModel!.includedHours + .toString(), + ); + double hourlyRate = + double.tryParse( + selectedOrder.value.rentalPackageModel?.extraMinuteFare + ?.toString() ?? + "0", + ) ?? + 0.0; extraMinutesCharge.value = (hours * 60) * hourlyRate; } } - if (selectedOrder.value.startKitoMetersReading != null && selectedOrder.value.endKitoMetersReading != null) { - double startKm = double.tryParse(selectedOrder.value.startKitoMetersReading?.toString() ?? "0") ?? 0.0; - double endKm = double.tryParse(selectedOrder.value.endKitoMetersReading?.toString() ?? "0") ?? 0.0; + if (selectedOrder.value.startKitoMetersReading != null && + selectedOrder.value.endKitoMetersReading != null) { + double startKm = + double.tryParse( + selectedOrder.value.startKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; + double endKm = + double.tryParse( + selectedOrder.value.endKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; if (endKm > startKm) { double totalKm = endKm - startKm; - if (totalKm > double.parse(selectedOrder.value.rentalPackageModel!.includedDistance!)) { - totalKm = totalKm - double.parse(selectedOrder.value.rentalPackageModel!.includedDistance!); - double extraKmRate = double.tryParse(selectedOrder.value.rentalPackageModel?.extraKmFare?.toString() ?? "0") ?? 0.0; + if (totalKm > + double.parse( + selectedOrder.value.rentalPackageModel!.includedDistance!, + )) { + totalKm = + totalKm - + double.parse( + selectedOrder.value.rentalPackageModel!.includedDistance!, + ); + double extraKmRate = + double.tryParse( + selectedOrder.value.rentalPackageModel?.extraKmFare + ?.toString() ?? + "0", + ) ?? + 0.0; extraKilometerCharge.value = totalKm * extraKmRate; } } } - subTotal.value = subTotal.value + extraKilometerCharge.value + extraMinutesCharge.value; + subTotal.value = + subTotal.value + + extraKilometerCharge.value + + extraMinutesCharge.value; if (selectedOrder.value.taxSetting != null) { for (var element in selectedOrder.value.taxSetting!) { - taxAmount.value += Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element); + taxAmount.value += Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + ); } } @@ -134,9 +179,14 @@ class MyRentalBookingController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.value.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.value.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -153,16 +203,42 @@ class MyRentalBookingController extends GetxController { List getOrdersForTab(String tab) { switch (tab) { case "New": - return rentalOrders.where((order) => ["Order Placed", "Order Accepted", "Driver Pending"].contains(order.status)).toList(); + return rentalOrders + .where( + (order) => [ + "Order Placed", + "Order Accepted", + "Driver Pending", + ].contains(order.status), + ) + .toList(); case "On Going": - return rentalOrders.where((order) => ["Driver Accepted", "Order Shipped", "In Transit"].contains(order.status)).toList(); + return rentalOrders + .where( + (order) => [ + "Driver Accepted", + "Order Shipped", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Completed": - return rentalOrders.where((order) => ["Order Completed"].contains(order.status)).toList(); + return rentalOrders + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return rentalOrders.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return rentalOrders + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; @@ -170,9 +246,13 @@ class MyRentalBookingController extends GetxController { } /// Old helper (optional) - List get filteredRentalOrders => getOrdersForTab(selectedTab.value); + List get filteredRentalOrders => + getOrdersForTab(selectedTab.value); - Future cancelRentalRequest(RentalOrderModel order, {List? taxList}) async { + Future cancelRentalRequest( + RentalOrderModel order, { + List? taxList, + }) async { try { isLoading.value = true; order.status = Constant.orderCancelled; @@ -186,13 +266,18 @@ class MyRentalBookingController extends GetxController { if (taxList != null) { for (var element in taxList) { totalTax += Constant.calculateTax( - amount: (double.parse(order.subTotal.toString()) - double.parse(order.discount.toString())).toString(), + amount: + (double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString())) + .toString(), taxModel: element, ); } } - double subTotal = double.parse(order.subTotal.toString()) - double.parse(order.discount.toString()); + double subTotal = + double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString()); double refundAmount = subTotal + totalTax; WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -211,7 +296,10 @@ class MyRentalBookingController extends GetxController { ); await FireStoreUtils.setWalletTransaction(walletTransaction); - await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: refundAmount.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } ShowToastDialog.showToast("Booking cancelled successfully".tr()); } catch (e) { diff --git a/lib/controllers/on_boarding_controller.dart b/lib/controllers/on_boarding_controller.dart index 178fbaf..eed931f 100644 --- a/lib/controllers/on_boarding_controller.dart +++ b/lib/controllers/on_boarding_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/on_boarding_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/on_demand_booking_controller.dart b/lib/controllers/on_demand_booking_controller.dart index ebc84d3..dc73c5b 100644 --- a/lib/controllers/on_demand_booking_controller.dart +++ b/lib/controllers/on_demand_booking_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../models/onprovider_order_model.dart'; import '../models/provider_serivce_model.dart'; @@ -55,8 +55,12 @@ class OnDemandBookingController extends GetxController { void fetchCoupons() { if (provider.value?.author != null && provider.value!.author!.isNotEmpty) { - FireStoreUtils.getProviderCoupon(provider.value!.author!).then((activeCoupons) => couponList.assignAll(activeCoupons)); - FireStoreUtils.getProviderCouponAfterExpire(provider.value!.author!).then((expiredCoupons) => couponList.addAll(expiredCoupons)); + FireStoreUtils.getProviderCoupon( + provider.value!.author!, + ).then((activeCoupons) => couponList.assignAll(activeCoupons)); + FireStoreUtils.getProviderCouponAfterExpire( + provider.value!.author!, + ).then((expiredCoupons) => couponList.addAll(expiredCoupons)); } } @@ -80,8 +84,12 @@ class OnDemandBookingController extends GetxController { void applyCoupon(CouponModel coupon) { double discount = 0.0; - if (coupon.discountType == "Percentage" || coupon.discountType == "Percent") { - discount = price.value * (double.tryParse(coupon.discount.toString()) ?? 0) / 100; + if (coupon.discountType == "Percentage" || + coupon.discountType == "Percent") { + discount = + price.value * + (double.tryParse(coupon.discount.toString()) ?? 0) / + 100; } else { discount = double.tryParse(coupon.discount.toString()) ?? 0; } @@ -115,9 +123,14 @@ class OnDemandBookingController extends GetxController { // discount if (discountType.value == "Percentage" || discountType.value == "Percent") { - discountAmount.value = price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; + discountAmount.value = + price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; } else { - discountAmount.value = double.tryParse(discountLabel.value.isEmpty ? '0' : discountLabel.value) ?? 0; + discountAmount.value = + double.tryParse( + discountLabel.value.isEmpty ? '0' : discountLabel.value, + ) ?? + 0; } subTotal.value = price.value - discountAmount.value; @@ -125,7 +138,10 @@ class OnDemandBookingController extends GetxController { // tax calculation double total = subTotal.value; for (var element in Constant.taxList) { - total += Constant.getTaxValue(amount: subTotal.value.toString(), taxModel: element); + total += Constant.getTaxValue( + amount: subTotal.value.toString(), + taxModel: element, + ); } totalAmount.value = total; @@ -137,7 +153,9 @@ class OnDemandBookingController extends GetxController { } else if (dateTimeController.value.text.isEmpty) { ShowToastDialog.showToast("Please select time slot.".tr()); } else { - UserModel? providerUser = await FireStoreUtils.getUserProfile(provider.value!.author!); + UserModel? providerUser = await FireStoreUtils.getUserProfile( + provider.value!.author!, + ); if (provider.value?.priceUnit == "Fixed") { OnProviderOrderModel onDemandOrderModel = OnProviderOrderModel( @@ -161,14 +179,27 @@ class OnDemandBookingController extends GetxController { adminCommissionType: Constant.sectionConstantModel?.adminCommision?.isEnabled == false ? 'fixed' - : providerUser?.adminCommissionModel?.commissionType ?? Constant.sectionConstantModel?.adminCommision?.commissionType, + : providerUser?.adminCommissionModel?.commissionType ?? + Constant + .sectionConstantModel + ?.adminCommision + ?.commissionType, otp: Constant.getReferralCode(), couponCode: offerCode.toString(), ); - print('totalAmount ::::::: ${double.tryParse(Constant.amountShow(amount: totalAmount.value.toString())) ?? 0.0}'); + print( + 'totalAmount ::::::: ${double.tryParse(Constant.amountShow(amount: totalAmount.value.toString())) ?? 0.0}', + ); print('totalAmount value ::::::: ${totalAmount.value}'); - Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': Rxn(onDemandOrderModel), 'totalAmount': totalAmount.value, 'isExtra': false}); + Get.to( + () => OnDemandPaymentScreen(), + arguments: { + 'onDemandOrderModel': Rxn(onDemandOrderModel), + 'totalAmount': totalAmount.value, + 'isExtra': false, + }, + ); } else { ShowToastDialog.showLoader("Please wait...".tr()); OnProviderOrderModel onDemandOrder = OnProviderOrderModel( @@ -192,21 +223,36 @@ class OnDemandBookingController extends GetxController { adminCommissionType: Constant.sectionConstantModel?.adminCommision?.isEnabled == false ? 'fixed' - : providerUser?.adminCommissionModel?.commissionType ?? Constant.sectionConstantModel?.adminCommision?.commissionType, + : providerUser?.adminCommissionModel?.commissionType ?? + Constant + .sectionConstantModel + ?.adminCommision + ?.commissionType, paymentStatus: true, ); await FireStoreUtils.onDemandOrderPlace(onDemandOrder, 0.0); - await FireStoreUtils.sendOrderOnDemandServiceEmail(orderModel: onDemandOrder); + await FireStoreUtils.sendOrderOnDemandServiceEmail( + orderModel: onDemandOrder, + ); if (providerUser != null) { - Map payLoad = {"type": 'provider_order', "orderId": onDemandOrder.id}; - await SendNotification.sendFcmMessage(Constant.bookingPlaced, providerUser.fcmToken.toString(), payLoad); + Map payLoad = { + "type": 'provider_order', + "orderId": onDemandOrder.id, + }; + await SendNotification.sendFcmMessage( + Constant.bookingPlaced, + providerUser.fcmToken.toString(), + payLoad, + ); } ShowToastDialog.closeLoader(); Get.offAll(const OnDemandDashboardScreen()); - OnDemandDashboardController controller = Get.put(OnDemandDashboardController()); + OnDemandDashboardController controller = Get.put( + OnDemandDashboardController(), + ); controller.selectedIndex.value = 2; ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); } diff --git a/lib/controllers/on_demand_category_controller.dart b/lib/controllers/on_demand_category_controller.dart index 31e6da0..1df529a 100644 --- a/lib/controllers/on_demand_category_controller.dart +++ b/lib/controllers/on_demand_category_controller.dart @@ -1,5 +1,4 @@ -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../models/category_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/on_demand_dashboard_controller.dart b/lib/controllers/on_demand_dashboard_controller.dart index 33b395c..a6f90f8 100644 --- a/lib/controllers/on_demand_dashboard_controller.dart +++ b/lib/controllers/on_demand_dashboard_controller.dart @@ -3,8 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/on_demand_service/favourite_ondemand_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../screen_ui/on_demand_service/my_booking_on_demand_screen.dart'; import '../screen_ui/on_demand_service/on_demand_home_screen.dart'; @@ -17,7 +16,12 @@ class OnDemandDashboardController extends GetxController { void onInit() { getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [OnDemandHomeScreen(), FavouriteOndemandScreen(), const MyBookingOnDemandScreen(), const ProfileScreen()]; + pageList.value = [ + OnDemandHomeScreen(), + FavouriteOndemandScreen(), + const MyBookingOnDemandScreen(), + const ProfileScreen(), + ]; } else { pageList.value = [ OnDemandHomeScreen(), @@ -31,7 +35,9 @@ class OnDemandDashboardController extends GetxController { } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/on_demand_details_controller.dart b/lib/controllers/on_demand_details_controller.dart index 8f7ea01..a569994 100644 --- a/lib/controllers/on_demand_details_controller.dart +++ b/lib/controllers/on_demand_details_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../models/favorite_ondemand_service_model.dart'; import '../models/provider_serivce_model.dart'; @@ -14,7 +14,8 @@ class OnDemandDetailsController extends GetxController { final RxString subCategoryTitle = ''.obs; final RxString categoryTitle = ''.obs; final RxList ratingService = [].obs; - final RxList lstFav = [].obs; + final RxList lstFav = + [].obs; final RxBool isLoading = true.obs; final RxBool isOpen = false.obs; final RxString tabString = "About".obs; @@ -27,35 +28,44 @@ class OnDemandDetailsController extends GetxController { getData(); } - Future getData() async { await getReviewList(); await getAuthor(); //fetch and set provider author here if (Constant.userModel != null) { - lstFav.value = await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()); + lstFav.value = await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ); } isLoading.value = false; } Future getReviewList() async { - await FireStoreUtils.getCategoryById(provider.categoryId.toString()).then((value) { + await FireStoreUtils.getCategoryById(provider.categoryId.toString()).then(( + value, + ) { if (value != null) { categoryTitle.value = value.title.toString(); } }); - await FireStoreUtils.getSubCategoryById(provider.subCategoryId.toString()).then((value) { + await FireStoreUtils.getSubCategoryById( + provider.subCategoryId.toString(), + ).then((value) { if (value != null) { subCategoryTitle.value = value.title.toString(); } }); - await FireStoreUtils.getReviewByProviderServiceId(provider.id.toString()).then((value) { + await FireStoreUtils.getReviewByProviderServiceId( + provider.id.toString(), + ).then((value) { ratingService.value = value; }); if (Constant.userModel != null) { - await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((value) { lstFav.value = value; }); } @@ -78,8 +88,12 @@ class OnDemandDetailsController extends GetxController { for (var element in provider.days) { if (day == element.toString()) { - final start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${provider.startTime}"); - final end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${provider.endTime}"); + final start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${provider.startTime}"); + final end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${provider.endTime}"); if (isCurrentDateInRange(start, end)) { isOpen.value = true; } @@ -96,5 +110,3 @@ class OnDemandDetailsController extends GetxController { tabString.value = tab; } } - - diff --git a/lib/controllers/on_demand_home_controller.dart b/lib/controllers/on_demand_home_controller.dart index 16f4aac..2b609a8 100644 --- a/lib/controllers/on_demand_home_controller.dart +++ b/lib/controllers/on_demand_home_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/favorite_ondemand_service_model.dart'; import 'package:customer/models/provider_serivce_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../constant/constant.dart'; @@ -40,24 +40,31 @@ class OnDemandHomeController extends GetxController { // Fetch provider services FireStoreUtils.getProviderFuture() .then((providerServiceList) { - Set uniqueAuthorIds = providerServiceList.map((service) => service.author).toSet(); + Set uniqueAuthorIds = + providerServiceList.map((service) => service.author).toSet(); List listOfUniqueProviders = uniqueAuthorIds.toList(); List filteredProviders = []; for (var provider in listOfUniqueProviders) { - List filteredList = providerServiceList.where((service) => service.author == provider).toList(); + List filteredList = + providerServiceList + .where((service) => service.author == provider) + .toList(); filteredList.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); for (int index = 0; index < filteredList.length; index++) { final service = filteredList[index]; - if (Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) { + if (Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel?.adminCommision?.isEnabled == + true) { if (service.subscriptionPlan?.itemLimit == "-1") { filteredProviders.add(service); } else { - if (index < int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { + if (index < + int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { filteredProviders.add(service); } } @@ -75,7 +82,9 @@ class OnDemandHomeController extends GetxController { isLoading.value = false; }); - FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((favList) { + FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((favList) { lstFav.value = favList; }); } @@ -85,7 +94,9 @@ class OnDemandHomeController extends GetxController { if (categoryId == null || categoryId.isEmpty) return null; // Try to find category from cached list - CategoryModel? cat = categories.firstWhereOrNull((element) => element.id == categoryId); + CategoryModel? cat = categories.firstWhereOrNull( + (element) => element.id == categoryId, + ); // If not found, fetch from Firestore cat ??= await FireStoreUtils.getCategoryById(categoryId); @@ -94,29 +105,34 @@ class OnDemandHomeController extends GetxController { return cat; } - RxList lstFav = [].obs; + RxList lstFav = + [].obs; void toggleFavourite(ProviderServiceModel provider) { if (Constant.userModel == null) { Get.to(LoginScreen()); } else { - var contain = lstFav.where((element) => element.service_id == provider.id); + var contain = lstFav.where( + (element) => element.service_id == provider.id, + ); if (contain.isNotEmpty) { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.removeFavouriteOndemandService(favouriteModel); lstFav.removeWhere((item) => item.service_id == provider.id); } else { - FavouriteOndemandServiceModel favouriteModel = FavouriteOndemandServiceModel( - section_id: provider.sectionId, - service_id: provider.id, - user_id: FireStoreUtils.getCurrentUid(), - serviceAuthorId: provider.author, - ); + FavouriteOndemandServiceModel favouriteModel = + FavouriteOndemandServiceModel( + section_id: provider.sectionId, + service_id: provider.id, + user_id: FireStoreUtils.getCurrentUid(), + serviceAuthorId: provider.author, + ); FireStoreUtils.setFavouriteOndemandSection(favouriteModel); lstFav.add(favouriteModel); } @@ -127,7 +143,13 @@ class OnDemandHomeController extends GetxController { await FireStoreUtils.getZone().then((value) { if (value != null) { for (int i = 0; i < value.length; i++) { - if (Constant.isPointInPolygon(LatLng(Constant.selectedLocation.location?.latitude ?? 0.0, Constant.selectedLocation.location?.longitude ?? 0.0), value[i].area!)) { + if (Constant.isPointInPolygon( + LatLng( + Constant.selectedLocation.location?.latitude ?? 0.0, + Constant.selectedLocation.location?.longitude ?? 0.0, + ), + value[i].area!, + )) { Constant.selectedZone = value[i]; Constant.isZoneAvailable = true; break; diff --git a/lib/controllers/on_demand_order_details_controller.dart b/lib/controllers/on_demand_order_details_controller.dart index 3860ac7..afab172 100644 --- a/lib/controllers/on_demand_order_details_controller.dart +++ b/lib/controllers/on_demand_order_details_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../models/onprovider_order_model.dart'; import '../models/wallet_transaction_model.dart'; @@ -19,7 +19,8 @@ class OnDemandOrderDetailsController extends GetxController { Rxn worker = Rxn(); Rx couponTextController = TextEditingController().obs; - Rx cancelBookingController = TextEditingController().obs; + Rx cancelBookingController = + TextEditingController().obs; RxDouble subTotal = 0.0.obs; RxDouble price = 0.0.obs; @@ -48,17 +49,22 @@ class OnDemandOrderDetailsController extends GetxController { Future getData() async { try { - final order = await FireStoreUtils.getProviderOrderById(onProviderOrder.value!.id); + final order = await FireStoreUtils.getProviderOrderById( + onProviderOrder.value!.id, + ); if (order != null) { onProviderOrder.value = order; discountType.value = order.discountType ?? ""; discountLabel.value = order.discountLabel ?? ""; - discountAmount.value = double.tryParse(order.discount.toString()) ?? 0.0; + discountAmount.value = + double.tryParse(order.discount.toString()) ?? 0.0; offerCode.value = order.couponCode ?? ""; // Fetch provider - providerUser.value = await FireStoreUtils.getUserProfile(order.provider.author.toString()); + providerUser.value = await FireStoreUtils.getUserProfile( + order.provider.author.toString(), + ); // Fetch worker (if exists) if (order.workerId != null && order.workerId!.isNotEmpty) { @@ -70,7 +76,9 @@ class OnDemandOrderDetailsController extends GetxController { calculatePrice(); // Load available coupons - FireStoreUtils.getProviderCouponAfterExpire(order.provider.author.toString()).then((expiredCoupons) { + FireStoreUtils.getProviderCouponAfterExpire( + order.provider.author.toString(), + ).then((expiredCoupons) { couponList.assignAll(expiredCoupons); }); } else { @@ -90,8 +98,12 @@ class OnDemandOrderDetailsController extends GetxController { void applyCoupon(CouponModel coupon) { double discount = 0.0; - if (coupon.discountType == "Percentage" || coupon.discountType == "Percent") { - discount = price.value * (double.tryParse(coupon.discount.toString()) ?? 0) / 100; + if (coupon.discountType == "Percentage" || + coupon.discountType == "Percent") { + discount = + price.value * + (double.tryParse(coupon.discount.toString()) ?? 0) / + 100; } else { discount = double.tryParse(coupon.discount.toString()) ?? 0; } @@ -108,17 +120,29 @@ class OnDemandOrderDetailsController extends GetxController { void calculatePrice() { double basePrice = - (onProviderOrder.value?.provider.disPrice == "" || onProviderOrder.value?.provider.disPrice == "0") - ? double.tryParse(onProviderOrder.value?.provider.price.toString() ?? "0") ?? 0 - : double.tryParse(onProviderOrder.value?.provider.disPrice.toString() ?? "0") ?? 0; + (onProviderOrder.value?.provider.disPrice == "" || + onProviderOrder.value?.provider.disPrice == "0") + ? double.tryParse( + onProviderOrder.value?.provider.price.toString() ?? "0", + ) ?? + 0 + : double.tryParse( + onProviderOrder.value?.provider.disPrice.toString() ?? "0", + ) ?? + 0; price.value = basePrice * (onProviderOrder.value?.quantity ?? 0.0); // discount if (discountType.value == "Percentage" || discountType.value == "Percent") { - discountAmount.value = price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; + discountAmount.value = + price.value * (double.tryParse(discountLabel.value) ?? 0) / 100; } else { - discountAmount.value = double.tryParse(discountLabel.value.isEmpty ? '0' : discountLabel.value) ?? 0; + discountAmount.value = + double.tryParse( + discountLabel.value.isEmpty ? '0' : discountLabel.value, + ) ?? + 0; } subTotal.value = price.value - discountAmount.value; @@ -126,7 +150,10 @@ class OnDemandOrderDetailsController extends GetxController { // tax calculation double total = subTotal.value; for (var element in Constant.taxList) { - total += Constant.getTaxValue(amount: subTotal.value.toString(), taxModel: element); + total += Constant.getTaxValue( + amount: subTotal.value.toString(), + taxModel: element, + ); } totalAmount.value = total; @@ -152,22 +179,30 @@ class OnDemandOrderDetailsController extends GetxController { // Calculate total final pricePerUnit = - (order.provider.disPrice == "" || order.provider.disPrice == "0") ? double.tryParse(order.provider.price.toString()) ?? 0 : double.tryParse(order.provider.disPrice.toString()) ?? 0; + (order.provider.disPrice == "" || order.provider.disPrice == "0") + ? double.tryParse(order.provider.price.toString()) ?? 0 + : double.tryParse(order.provider.disPrice.toString()) ?? 0; total = pricePerUnit * (order.quantity); // Add tax if (Constant.taxList.isNotEmpty) { for (var tax in Constant.taxList) { - total += Constant.getTaxValue(amount: total.toString(), taxModel: tax); + total += Constant.getTaxValue( + amount: total.toString(), + taxModel: tax, + ); } } // Admin commission double adminComm = 0.0; - if ((order.adminCommission ?? '0') != '0' && (order.adminCommissionType ?? '').isNotEmpty) { - if (order.adminCommissionType!.toLowerCase() == 'percentage' || order.adminCommissionType!.toLowerCase() == 'percent') { - adminComm = (total * (double.tryParse(order.adminCommission!) ?? 0)) / 100; + if ((order.adminCommission ?? '0') != '0' && + (order.adminCommissionType ?? '').isNotEmpty) { + if (order.adminCommissionType!.toLowerCase() == 'percentage' || + order.adminCommissionType!.toLowerCase() == 'percent') { + adminComm = + (total * (double.tryParse(order.adminCommission!) ?? 0)) / 100; } else { adminComm = double.tryParse(order.adminCommission!) ?? 0; } @@ -237,10 +272,19 @@ class OnDemandOrderDetailsController extends GetxController { await FireStoreUtils.updateOnDemandOrder(order); // Ensure this completes // Notify provider - final provider = await FireStoreUtils.getUserProfile(order.provider.author ?? ''); + final provider = await FireStoreUtils.getUserProfile( + order.provider.author ?? '', + ); if (provider != null) { - Map payload = {"type": 'provider_order', "orderId": order.id}; - await SendNotification.sendFcmMessage(Constant.bookingPlaced, provider.fcmToken ?? '', payload); + Map payload = { + "type": 'provider_order', + "orderId": order.id, + }; + await SendNotification.sendFcmMessage( + Constant.bookingPlaced, + provider.fcmToken ?? '', + payload, + ); } ShowToastDialog.closeLoader(); diff --git a/lib/controllers/on_demand_review_controller.dart b/lib/controllers/on_demand_review_controller.dart index 4d82f52..a5ea0a0 100644 --- a/lib/controllers/on_demand_review_controller.dart +++ b/lib/controllers/on_demand_review_controller.dart @@ -1,7 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../models/onprovider_order_model.dart'; import '../models/provider_serivce_model.dart'; @@ -20,7 +20,8 @@ class OnDemandReviewController extends GetxController { final TextEditingController comment = TextEditingController(); final Rxn provider = Rxn(); - final Rxn providerServiceModel = Rxn(); + final Rxn providerServiceModel = + Rxn(); final Rxn workerModel = Rxn(); final RxInt providerReviewCount = 0.obs; @@ -46,14 +47,20 @@ class OnDemandReviewController extends GetxController { void getReview() async { // Get existing rating if (reviewFor.value == "Provider") { - RatingModel? value = await FireStoreUtils.getReviewsByProviderID(order.value!.id, order.value!.provider.author.toString()); + RatingModel? value = await FireStoreUtils.getReviewsByProviderID( + order.value!.id, + order.value!.provider.author.toString(), + ); if (value != null) { ratingModel.value = value; ratings.value = value.rating ?? 0.0; comment.text = value.comment ?? ''; } } else { - RatingModel? value = await FireStoreUtils.getReviewsByWorkerID(order.value!.id, order.value!.workerId.toString()); + RatingModel? value = await FireStoreUtils.getReviewsByWorkerID( + order.value!.id, + order.value!.workerId.toString(), + ); if (value != null) { ratingModel.value = value; ratings.value = value.rating ?? 0.0; @@ -63,7 +70,9 @@ class OnDemandReviewController extends GetxController { // Worker review logic if (reviewFor.value == "Worker") { - WorkerModel? value = await FireStoreUtils.getWorker(order.value!.workerId.toString()); + WorkerModel? value = await FireStoreUtils.getWorker( + order.value!.workerId.toString(), + ); if (value != null) { workerModel.value = value; @@ -71,25 +80,35 @@ class OnDemandReviewController extends GetxController { final double existingSum = (value.reviewsSum ?? 0.0).toDouble(); final double oldRating = ratingModel.value?.rating ?? 0.0; - workerReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount; - workerReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum; + workerReviewCount.value = + ratingModel.value != null ? (existingCount - 1) : existingCount; + workerReviewSum.value = + ratingModel.value != null ? (existingSum - oldRating) : existingSum; } } // Provider & service review logic else { - UserModel? user = await FireStoreUtils.getUserProfile(order.value!.provider.author.toString()); + UserModel? user = await FireStoreUtils.getUserProfile( + order.value!.provider.author.toString(), + ); if (user != null) { provider.value = user; - final int existingCount = int.tryParse(user.reviewsCount?.toString() ?? '0') ?? 0; - final double existingSum = double.tryParse(user.reviewsSum?.toString() ?? '0.0') ?? 0.0; + final int existingCount = + int.tryParse(user.reviewsCount?.toString() ?? '0') ?? 0; + final double existingSum = + double.tryParse(user.reviewsSum?.toString() ?? '0.0') ?? 0.0; final double oldRating = ratingModel.value?.rating ?? 0.0; - providerReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount; - providerReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum; + providerReviewCount.value = + ratingModel.value != null ? (existingCount - 1) : existingCount; + providerReviewSum.value = + ratingModel.value != null ? (existingSum - oldRating) : existingSum; } - ProviderServiceModel? service = await FireStoreUtils.getCurrentProvider(order.value!.provider.id.toString()); + ProviderServiceModel? service = await FireStoreUtils.getCurrentProvider( + order.value!.provider.id.toString(), + ); if (service != null) { providerServiceModel.value = service; @@ -97,8 +116,10 @@ class OnDemandReviewController extends GetxController { final double existingSum = (service.reviewsSum ?? 0.0).toDouble(); final double oldRating = ratingModel.value?.rating ?? 0.0; - serviceReviewCount.value = ratingModel.value != null ? (existingCount - 1) : existingCount; - serviceReviewSum.value = ratingModel.value != null ? (existingSum - oldRating) : existingSum; + serviceReviewCount.value = + ratingModel.value != null ? (existingCount - 1) : existingCount; + serviceReviewSum.value = + ratingModel.value != null ? (existingSum - oldRating) : existingSum; } } } @@ -114,22 +135,29 @@ class OnDemandReviewController extends GetxController { Future _providerReviewSubmit() async { ShowToastDialog.showLoader("Submit in...".tr()); providerServiceModel.value!.reviewsCount = serviceReviewCount.value + 1; - providerServiceModel.value!.reviewsSum = serviceReviewSum.value + ratings.value; + providerServiceModel.value!.reviewsSum = + serviceReviewSum.value + ratings.value; // Convert to string only if your model field is String provider.value!.reviewsCount = (providerReviewCount.value + 1).toString(); - provider.value!.reviewsSum = (providerReviewSum.value + ratings.value).toString(); + provider.value!.reviewsSum = + (providerReviewSum.value + ratings.value).toString(); RatingModel rate = RatingModel( - id: ratingModel.value?.id ?? firestore.collection(CollectionName.itemsReview).doc().id, + id: + ratingModel.value?.id ?? + firestore.collection(CollectionName.itemsReview).doc().id, productId: ratingModel.value?.productId ?? order.value!.provider.id, comment: comment.text, photos: ratingModel.value?.photos ?? [], rating: ratings.value, orderId: ratingModel.value?.orderId ?? order.value!.id, - vendorId: ratingModel.value?.vendorId ?? order.value!.provider.author.toString(), + vendorId: + ratingModel.value?.vendorId ?? + order.value!.provider.author.toString(), customerId: Constant.userModel?.id, - uname: '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', + uname: + '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -148,7 +176,9 @@ class OnDemandReviewController extends GetxController { workerModel.value!.reviewsSum = workerReviewSum.value + ratings.value; RatingModel rate = RatingModel( - id: ratingModel.value?.id ?? firestore.collection(CollectionName.itemsReview).doc().id, + id: + ratingModel.value?.id ?? + firestore.collection(CollectionName.itemsReview).doc().id, productId: ratingModel.value?.productId ?? order.value!.provider.id, comment: comment.text, photos: ratingModel.value?.photos ?? [], @@ -156,7 +186,8 @@ class OnDemandReviewController extends GetxController { orderId: ratingModel.value?.orderId ?? order.value!.id, driverId: ratingModel.value?.driverId ?? order.value!.workerId.toString(), customerId: Constant.userModel?.id, - uname: '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', + uname: + '${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}', profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/order_controller.dart b/lib/controllers/order_controller.dart index c6b606b..7c39996 100644 --- a/lib/controllers/order_controller.dart +++ b/lib/controllers/order_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/cart_product_model.dart'; import 'package:customer/models/order_model.dart'; import '../service/cart_provider.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class OrderController extends GetxController { RxList allList = [].obs; @@ -26,16 +26,27 @@ class OrderController extends GetxController { await FireStoreUtils.getAllOrder().then((value) { allList.value = value; - rejectedList.value = allList.where((p0) => p0.status == Constant.orderRejected).toList(); + rejectedList.value = + allList.where((p0) => p0.status == Constant.orderRejected).toList(); inProgressList.value = allList .where( - (p0) => p0.status == Constant.orderAccepted || p0.status == Constant.driverPending || p0.status == Constant.orderShipped || p0.status == Constant.orderInTransit, + (p0) => + p0.status == Constant.orderAccepted || + p0.status == Constant.driverPending || + p0.status == Constant.orderShipped || + p0.status == Constant.orderInTransit, ) .toList(); - deliveredList.value = allList.where((p0) => p0.status == Constant.orderCompleted).toList(); - cancelledList.value = allList.where((p0) => p0.status == Constant.orderCancelled).toList(); + deliveredList.value = + allList + .where((p0) => p0.status == Constant.orderCompleted) + .toList(); + cancelledList.value = + allList + .where((p0) => p0.status == Constant.orderCancelled) + .toList(); }); } @@ -45,7 +56,11 @@ class OrderController extends GetxController { final CartProvider cartProvider = CartProvider(); void addToCart({required CartProductModel cartProductModel}) { - cartProvider.addToCart(Get.context!, cartProductModel, cartProductModel.quantity!); + cartProvider.addToCart( + Get.context!, + cartProductModel, + cartProductModel.quantity!, + ); update(); } } diff --git a/lib/controllers/order_details_controller.dart b/lib/controllers/order_details_controller.dart index 44c2898..e1a51fa 100644 --- a/lib/controllers/order_details_controller.dart +++ b/lib/controllers/order_details_controller.dart @@ -1,8 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/cart_product_model.dart'; import 'package:customer/models/order_model.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../service/cart_provider.dart'; class OrderDetailsController extends GetxController { @@ -39,28 +38,48 @@ class OrderDetailsController extends GetxController { for (var element in orderModel.value.products!) { if (double.parse(element.discountPrice.toString()) <= 0) { - subTotal.value = subTotal.value + - double.parse(element.price.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + subTotal.value = + subTotal.value + + double.parse(element.price.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } else { - subTotal.value = subTotal.value + - double.parse(element.discountPrice.toString()) * double.parse(element.quantity.toString()) + - (double.parse(element.extrasPrice.toString()) * double.parse(element.quantity.toString())); + subTotal.value = + subTotal.value + + double.parse(element.discountPrice.toString()) * + double.parse(element.quantity.toString()) + + (double.parse(element.extrasPrice.toString()) * + double.parse(element.quantity.toString())); } } - if (orderModel.value.specialDiscount != null && orderModel.value.specialDiscount!['special_discount'] != null) { - specialDiscountAmount.value = double.parse(orderModel.value.specialDiscount!['special_discount'].toString()); + if (orderModel.value.specialDiscount != null && + orderModel.value.specialDiscount!['special_discount'] != null) { + specialDiscountAmount.value = double.parse( + orderModel.value.specialDiscount!['special_discount'].toString(), + ); } if (orderModel.value.taxSetting != null) { for (var element in orderModel.value.taxSetting!) { - taxAmount.value = taxAmount.value + - Constant.calculateTax(amount: (subTotal.value - double.parse(orderModel.value.discount.toString()) - specialDiscountAmount.value).toString(), taxModel: element); + taxAmount.value = + taxAmount.value + + Constant.calculateTax( + amount: + (subTotal.value - + double.parse(orderModel.value.discount.toString()) - + specialDiscountAmount.value) + .toString(), + taxModel: element, + ); } } - totalAmount.value = (subTotal.value - double.parse(orderModel.value.discount.toString()) - specialDiscountAmount.value) + + totalAmount.value = + (subTotal.value - + double.parse(orderModel.value.discount.toString()) - + specialDiscountAmount.value) + taxAmount.value + double.parse(orderModel.value.deliveryCharge.toString()) + double.parse(orderModel.value.tipAmount.toString()); @@ -71,7 +90,11 @@ class OrderDetailsController extends GetxController { final CartProvider cartProvider = CartProvider(); void addToCart({required CartProductModel cartProductModel}) { - cartProvider.addToCart(Get.context!, cartProductModel, cartProductModel.quantity!); + cartProvider.addToCart( + Get.context!, + cartProductModel, + cartProductModel.quantity!, + ); update(); } } diff --git a/lib/controllers/order_placing_controller.dart b/lib/controllers/order_placing_controller.dart index fa489d6..5fa8060 100644 --- a/lib/controllers/order_placing_controller.dart +++ b/lib/controllers/order_placing_controller.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'package:customer/models/order_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../service/database_helper.dart'; class OrderPlacingController extends GetxController { diff --git a/lib/controllers/osm_search_place_controller.dart b/lib/controllers/osm_search_place_controller.dart index 7cdf1e2..be7afab 100644 --- a/lib/controllers/osm_search_place_controller.dart +++ b/lib/controllers/osm_search_place_controller.dart @@ -1,7 +1,7 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_osm_plugin/flutter_osm_plugin.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:shared_preferences/shared_preferences.dart'; class OsmSearchPlaceController extends GetxController { @@ -25,7 +25,8 @@ class OsmSearchPlaceController extends GetxController { try { String locale = 'en'; SharedPreferences sp = await SharedPreferences.getInstance(); - if (sp.getString("languageCode") != null || sp.getString("languageCode")?.isNotEmpty == true) { + if (sp.getString("languageCode") != null || + sp.getString("languageCode")?.isNotEmpty == true) { locale = sp.getString("languageCode") ?? "en"; } suggestionsList.value = await addressSuggestion(text, locale: locale); diff --git a/lib/controllers/otp_verification_controller.dart b/lib/controllers/otp_verification_controller.dart index f33f250..745082a 100644 --- a/lib/controllers/otp_verification_controller.dart +++ b/lib/controllers/otp_verification_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/constant.dart'; import '../models/user_model.dart'; import '../screen_ui/auth_screens/login_screen.dart'; @@ -63,15 +63,27 @@ class OtpVerifyController extends GetxController { try { ShowToastDialog.showLoader("Verifying OTP...".tr()); - final credential = PhoneAuthProvider.credential(verificationId: verificationId.value, smsCode: otpController.value.text.trim()); + final credential = PhoneAuthProvider.credential( + verificationId: verificationId.value, + smsCode: otpController.value.text.trim(), + ); final fcmToken = await NotificationService.getToken(); final result = await _auth.signInWithCredential(credential); if (result.additionalUserInfo?.isNewUser == true) { - final userModel = UserModel(id: result.user!.uid, countryCode: countryCode.value, phoneNumber: phoneNumber.value, fcmToken: fcmToken, active: true); + final userModel = UserModel( + id: result.user!.uid, + countryCode: countryCode.value, + phoneNumber: phoneNumber.value, + fcmToken: fcmToken, + active: true, + ); ShowToastDialog.closeLoader(); - Get.to(() => const SignUpScreen(), arguments: {'type': 'mobileNumber', 'userModel': userModel}); + Get.to( + () => const SignUpScreen(), + arguments: {'type': 'mobileNumber', 'userModel': userModel}, + ); return; } @@ -79,8 +91,16 @@ class OtpVerifyController extends GetxController { ShowToastDialog.closeLoader(); if (!exists) { - final userModel = UserModel(id: result.user!.uid, countryCode: countryCode.value, phoneNumber: phoneNumber.value, fcmToken: fcmToken); - Get.off(() => const SignUpScreen(), arguments: {'type': 'mobileNumber', 'userModel': userModel}); + final userModel = UserModel( + id: result.user!.uid, + countryCode: countryCode.value, + phoneNumber: phoneNumber.value, + fcmToken: fcmToken, + ); + Get.off( + () => const SignUpScreen(), + arguments: {'type': 'mobileNumber', 'userModel': userModel}, + ); return; } @@ -102,7 +122,10 @@ class OtpVerifyController extends GetxController { await FireStoreUtils.updateUser(userModel); if (userModel.shippingAddress?.isNotEmpty ?? false) { - final defaultAddress = userModel.shippingAddress!.firstWhere((e) => e.isDefault == true, orElse: () => userModel.shippingAddress!.first); + final defaultAddress = userModel.shippingAddress!.firstWhere( + (e) => e.isDefault == true, + orElse: () => userModel.shippingAddress!.first, + ); Constant.selectedLocation = defaultAddress; Get.offAll(() => const ServiceListScreen()); diff --git a/lib/controllers/parcel_coupon_controller.dart b/lib/controllers/parcel_coupon_controller.dart index 89da091..fe0c298 100644 --- a/lib/controllers/parcel_coupon_controller.dart +++ b/lib/controllers/parcel_coupon_controller.dart @@ -1,9 +1,8 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - -class ParcelCouponController extends GetxController{ +import 'package:get/get.dart' hide Trans; +class ParcelCouponController extends GetxController { @override void onInit() { // TODO: implement onInit @@ -11,10 +10,10 @@ class ParcelCouponController extends GetxController{ super.onInit(); } - - void getData(){ + void getData() { getCouponCode(); } + RxBool isLoading = true.obs; RxList cabCouponList = [].obs; @@ -26,4 +25,4 @@ class ParcelCouponController extends GetxController{ print("cabCouponList ${cabCouponList.length}"); isLoading.value = false; } -} \ No newline at end of file +} diff --git a/lib/controllers/parcel_dashboard_controller.dart b/lib/controllers/parcel_dashboard_controller.dart index bc9b6a5..38a274e 100644 --- a/lib/controllers/parcel_dashboard_controller.dart +++ b/lib/controllers/parcel_dashboard_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/parcel_service/home_parcel_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/parcel_service/my_booking_screen.dart'; class ParcelDashboardController extends GetxController { @@ -15,15 +15,26 @@ class ParcelDashboardController extends GetxController { void onInit() { getTaxList(); if (Constant.walletSetting == false) { - pageList.value = [const HomeParcelScreen(), const MyBookingScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeParcelScreen(), + const MyBookingScreen(), + const ProfileScreen(), + ]; } else { - pageList.value = [const HomeParcelScreen(), const MyBookingScreen(), const WalletScreen(), const ProfileScreen()]; + pageList.value = [ + const HomeParcelScreen(), + const MyBookingScreen(), + const WalletScreen(), + const ProfileScreen(), + ]; } super.onInit(); } Future getTaxList() async { - await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then((value) { + await FireStoreUtils.getTaxList(Constant.sectionConstantModel!.id).then(( + value, + ) { if (value != null) { Constant.taxList = value; } diff --git a/lib/controllers/parcel_my_booking_controller.dart b/lib/controllers/parcel_my_booking_controller.dart index 745472f..742e67c 100644 --- a/lib/controllers/parcel_my_booking_controller.dart +++ b/lib/controllers/parcel_my_booking_controller.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../constant/constant.dart'; import '../models/parcel_order_model.dart'; @@ -15,7 +15,8 @@ class ParcelMyBookingController extends GetxController { RxList parcelOrder = [].obs; RxString selectedTab = "New".obs; - RxList tabTitles = ["New", "In Transit", "Delivered", "Cancelled"].obs; + RxList tabTitles = + ["New", "In Transit", "Delivered", "Cancelled"].obs; StreamSubscription>? _parcelSubscription; @@ -53,16 +54,38 @@ class ParcelMyBookingController extends GetxController { List getOrdersForTab(String tab) { switch (tab) { case "New": - return parcelOrder.where((order) => ["Order Placed"].contains(order.status)).toList(); + return parcelOrder + .where((order) => ["Order Placed"].contains(order.status)) + .toList(); case "In Transit": - return parcelOrder.where((order) => ["Order Accepted", "Driver Accepted", "Driver Pending", "Order Shipped", "In Transit"].contains(order.status)).toList(); + return parcelOrder + .where( + (order) => [ + "Order Accepted", + "Driver Accepted", + "Driver Pending", + "Order Shipped", + "In Transit", + ].contains(order.status), + ) + .toList(); case "Delivered": - return parcelOrder.where((order) => ["Order Completed"].contains(order.status)).toList(); + return parcelOrder + .where((order) => ["Order Completed"].contains(order.status)) + .toList(); case "Cancelled": - return parcelOrder.where((order) => ["Order Rejected", "Order Cancelled", "Driver Rejected"].contains(order.status)).toList(); + return parcelOrder + .where( + (order) => [ + "Order Rejected", + "Order Cancelled", + "Driver Rejected", + ].contains(order.status), + ) + .toList(); default: return []; @@ -70,7 +93,8 @@ class ParcelMyBookingController extends GetxController { } /// Old helper (optional) - List get filteredParcelOrders => getOrdersForTab(selectedTab.value); + List get filteredParcelOrders => + getOrdersForTab(selectedTab.value); String formatDate(Timestamp timestamp) { final dateTime = timestamp.toDate(); @@ -97,10 +121,18 @@ class ParcelMyBookingController extends GetxController { final taxSettings = order.taxSetting ?? []; for (var element in taxSettings) { - totalTax += Constant.calculateTax(amount: (double.parse(order.subTotal.toString()) - double.parse(order.discount.toString())).toString(), taxModel: element); + totalTax += Constant.calculateTax( + amount: + (double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString())) + .toString(), + taxModel: element, + ); } - double subTotal = double.parse(order.subTotal.toString()) - double.parse(order.discount.toString()); + double subTotal = + double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString()); double refundAmount = subTotal + totalTax; WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -122,7 +154,10 @@ class ParcelMyBookingController extends GetxController { await FireStoreUtils.setWalletTransaction(walletTransaction); // Update wallet balance - await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: refundAmount.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } ShowToastDialog.showToast("Order cancelled successfully".tr()); diff --git a/lib/controllers/parcel_order_confirmation_controller.dart b/lib/controllers/parcel_order_confirmation_controller.dart index 85f2e1d..abbcef0 100644 --- a/lib/controllers/parcel_order_confirmation_controller.dart +++ b/lib/controllers/parcel_order_confirmation_controller.dart @@ -9,7 +9,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; diff --git a/lib/controllers/parcel_order_details_controller.dart b/lib/controllers/parcel_order_details_controller.dart index 334b4f9..6e9e83b 100644 --- a/lib/controllers/parcel_order_details_controller.dart +++ b/lib/controllers/parcel_order_details_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../constant/constant.dart'; import '../models/parcel_category.dart'; @@ -45,7 +45,12 @@ class ParcelOrderDetailsController extends GetxController { discount.value = double.parse(parcelOrder.value.discount ?? '0.0'); for (var element in parcelOrder.value.taxSetting!) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; @@ -54,22 +59,32 @@ class ParcelOrderDetailsController extends GetxController { Future fetchDriverDetails() async { if (parcelOrder.value.driverId != null) { - await FireStoreUtils.getUserProfile(parcelOrder.value.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile( + parcelOrder.value.driverId ?? '', + ).then((value) { if (value != null) { driverUser.value = value; } }); - await FireStoreUtils.getReviewsbyID(parcelOrder.value.id.toString()).then((value) { - if (value != null) { - ratingModel.value = value; - } - }); + await FireStoreUtils.getReviewsbyID(parcelOrder.value.id.toString()).then( + (value) { + if (value != null) { + ratingModel.value = value; + } + }, + ); } } void setStatusHistoryFromString(ParcelOrderModel order) { - final steps = ["Order Placed", "Driver Accepted", "Pickup Done", "In Transit", "Delivered"]; + final steps = [ + "Order Placed", + "Driver Accepted", + "Pickup Done", + "In Transit", + "Delivered", + ]; final history = []; @@ -79,7 +94,12 @@ class ParcelOrderDetailsController extends GetxController { for (int i = 0; i < steps.length; i++) { final step = steps[i]; - history.add(ParcelStatus(status: step, time: baseTime.add(Duration(minutes: i * minutesGap)))); + history.add( + ParcelStatus( + status: step, + time: baseTime.add(Duration(minutes: i * minutesGap)), + ), + ); if (step == order.status) break; } @@ -109,7 +129,10 @@ class ParcelOrderDetailsController extends GetxController { await FireStoreUtils.setWalletTransaction(walletTransaction); // Update wallet balance - await FireStoreUtils.updateUserWallet(amount: totalAmount.value.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: totalAmount.value.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } await FireStoreUtils.parcelOrderPlace(parcelOrder.value); @@ -132,7 +155,12 @@ class ParcelOrderDetailsController extends GetxController { ParcelCategory? getSelectedCategory() { try { - return parcelCategory.firstWhere((cat) => cat.title?.toLowerCase().trim() == parcelOrder.value.parcelType?.toLowerCase().trim(), orElse: () => ParcelCategory()); + return parcelCategory.firstWhere( + (cat) => + cat.title?.toLowerCase().trim() == + parcelOrder.value.parcelType?.toLowerCase().trim(), + orElse: () => ParcelCategory(), + ); } catch (e) { return null; } diff --git a/lib/controllers/parcel_review_controller.dart b/lib/controllers/parcel_review_controller.dart index 58691f8..2ad0958 100644 --- a/lib/controllers/parcel_review_controller.dart +++ b/lib/controllers/parcel_review_controller.dart @@ -2,7 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/parcel_order_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/rating_model.dart'; import '../models/user_model.dart'; import '../service/fire_store_utils.dart'; @@ -47,12 +47,17 @@ class ParcelReviewController extends GetxController { } }); - await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; - final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0; - final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; + final int userReviewsCount = + int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? + 0; + final int userReviewsSum = + int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; if (ratingModel.value != null) { final int oldRating = ratingModel.value?.rating?.toInt() ?? 0; @@ -77,7 +82,9 @@ class ParcelReviewController extends GetxController { ShowToastDialog.showLoader("Submit in...".tr()); - final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); + final user = await FireStoreUtils.getUserProfile( + order.value?.driverId ?? '', + ); if (user != null) { user.reviewsCount = (futureCount.value + 1).toString(); @@ -94,7 +101,8 @@ class ParcelReviewController extends GetxController { driverId: ratingModel.value!.driverId, customerId: ratingModel.value!.customerId, vendorId: ratingModel.value?.vendorId, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -113,7 +121,8 @@ class ParcelReviewController extends GetxController { orderId: order.value?.id, driverId: order.value?.driverId.toString(), customerId: Constant.userModel?.id, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/provider_controller.dart b/lib/controllers/provider_controller.dart index b10e21d..ed6379e 100644 --- a/lib/controllers/provider_controller.dart +++ b/lib/controllers/provider_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/provider_serivce_model.dart'; import '../models/user_model.dart'; import '../service/fire_store_utils.dart'; @@ -10,7 +10,8 @@ class ProviderController extends GetxController { RxBool isLoading = true.obs; late final String providerId; - Rx onDemandHomeController = Get.put(OnDemandHomeController()).obs; + Rx onDemandHomeController = + Get.put(OnDemandHomeController()).obs; @override void onInit() { @@ -24,7 +25,9 @@ class ProviderController extends GetxController { } void getProvider() async { - FireStoreUtils.getProviderServiceByProviderId(providerId: providerId).then((catValue) { + FireStoreUtils.getProviderServiceByProviderId(providerId: providerId).then(( + catValue, + ) { providerList.value = catValue; }); diff --git a/lib/controllers/rate_product_controller.dart b/lib/controllers/rate_product_controller.dart index 61086a1..ece8c88 100644 --- a/lib/controllers/rate_product_controller.dart +++ b/lib/controllers/rate_product_controller.dart @@ -12,7 +12,7 @@ import '../models/review_attribute_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../themes/show_toast_dialog.dart'; @@ -35,7 +35,8 @@ class RateProductController extends GetxController { Rx vendorModel = VendorModel().obs; Rx vendorCategoryModel = VendorCategoryModel().obs; - RxList reviewAttributeList = [].obs; + RxList reviewAttributeList = + [].obs; RxDouble ratings = 0.0.obs; @@ -54,7 +55,10 @@ class RateProductController extends GetxController { orderModel.value = argumentData['orderModel']; productId.value = argumentData['productId']; - await FireStoreUtils.getOrderReviewsByID(orderModel.value.id.toString(), productId.value).then((value) { + await FireStoreUtils.getOrderReviewsByID( + orderModel.value.id.toString(), + productId.value, + ).then((value) { if (value != null) { ratingModel.value = value; ratings.value = value.rating ?? 0.0; @@ -64,23 +68,33 @@ class RateProductController extends GetxController { } }); - await FireStoreUtils.getProductById(productId.value.split('~').first).then((value) { + await FireStoreUtils.getProductById( + productId.value.split('~').first, + ).then((value) { if (value != null) { productModel.value = value; - if (ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty) { + if (ratingModel.value.id != null && + ratingModel.value.id!.isNotEmpty) { productReviewCount.value = value.reviewsCount! - 1; productReviewSum.value = value.reviewsSum! - ratings.value; if (value.reviewAttributes != null) { value.reviewAttributes!.forEach((key, value) { - ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(value); - reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! - 1; - reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! - reviewAttribute[key]; - reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]); + ReviewsAttribute reviewsAttributeModel = + ReviewsAttribute.fromJson(value); + reviewsAttributeModel.reviewsCount = + reviewsAttributeModel.reviewsCount! - 1; + reviewsAttributeModel.reviewsSum = + reviewsAttributeModel.reviewsSum! - reviewAttribute[key]; + reviewProductAttributes.addEntries([ + MapEntry(key, reviewsAttributeModel.toJson()), + ]); }); } } else { - productReviewCount.value = double.parse(value.reviewsCount.toString()); + productReviewCount.value = double.parse( + value.reviewsCount.toString(), + ); productReviewSum.value = double.parse(value.reviewsSum.toString()); if (value.reviewAttributes != null) { reviewProductAttributes.value = value.reviewAttributes!; @@ -89,24 +103,33 @@ class RateProductController extends GetxController { } }); - await FireStoreUtils.getVendorById(productModel.value.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + productModel.value.vendorID.toString(), + ).then((value) { if (value != null) { vendorModel.value = value; - if (ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty) { + if (ratingModel.value.id != null && + ratingModel.value.id!.isNotEmpty) { vendorReviewCount.value = value.reviewsCount! - 1; vendorReviewSum.value = value.reviewsSum! - ratings.value; } else { - vendorReviewCount.value = double.parse(value.reviewsCount.toString()); + vendorReviewCount.value = double.parse( + value.reviewsCount.toString(), + ); vendorReviewSum.value = double.parse(value.reviewsSum.toString()); } } }); - await FireStoreUtils.getVendorCategoryByCategoryId(productModel.value.categoryID.toString()).then((value) async { + await FireStoreUtils.getVendorCategoryByCategoryId( + productModel.value.categoryID.toString(), + ).then((value) async { if (value != null) { vendorCategoryModel.value = value; for (var element in vendorCategoryModel.value.reviewAttributes!) { - await FireStoreUtils.getVendorReviewAttribute(element).then((value) { + await FireStoreUtils.getVendorReviewAttribute(element).then(( + value, + ) { reviewAttributeList.add(value!); }); } @@ -129,21 +152,36 @@ class RateProductController extends GetxController { if (reviewProductAttributes.isEmpty) { reviewAttribute.forEach((key, value) { - ReviewsAttribute reviewsAttributeModel = ReviewsAttribute(reviewsCount: 1, reviewsSum: value); - reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]); + ReviewsAttribute reviewsAttributeModel = ReviewsAttribute( + reviewsCount: 1, + reviewsSum: value, + ); + reviewProductAttributes.addEntries([ + MapEntry(key, reviewsAttributeModel.toJson()), + ]); }); } else { reviewProductAttributes.forEach((key, value) { - ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(value); - reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! + 1; - reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! + reviewAttribute[key]; - reviewProductAttributes.addEntries([MapEntry(key, reviewsAttributeModel.toJson())]); + ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson( + value, + ); + reviewsAttributeModel.reviewsCount = + reviewsAttributeModel.reviewsCount! + 1; + reviewsAttributeModel.reviewsSum = + reviewsAttributeModel.reviewsSum! + reviewAttribute[key]; + reviewProductAttributes.addEntries([ + MapEntry(key, reviewsAttributeModel.toJson()), + ]); }); } for (int i = 0; i < images.length; i++) { if (images[i].runtimeType == XFile) { - String url = await Constant.uploadUserImageToFireStorage(File(images[i].path), "profileImage/${FireStoreUtils.getCurrentUid()}", File(images[i].path).path.split('/').last); + String url = await Constant.uploadUserImageToFireStorage( + File(images[i].path), + "profileImage/${FireStoreUtils.getCurrentUid()}", + File(images[i].path).path.split('/').last, + ); images.removeAt(i); images.insert(i, url); } @@ -155,7 +193,10 @@ class RateProductController extends GetxController { photos: images, rating: ratings.value, customerId: FireStoreUtils.getCurrentUid(), - id: ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty ? ratingModel.value.id : Constant.getUuid(), + id: + ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty + ? ratingModel.value.id + : Constant.getUuid(), orderId: orderModel.value.id, vendorId: productModel.value.vendorID, createdAt: Timestamp.now(), diff --git a/lib/controllers/redeem_gift_card_controller.dart b/lib/controllers/redeem_gift_card_controller.dart index d445e2f..8332496 100644 --- a/lib/controllers/redeem_gift_card_controller.dart +++ b/lib/controllers/redeem_gift_card_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class RedeemGiftCardController extends GetxController { Rx giftCodeController = TextEditingController().obs; diff --git a/lib/controllers/refer_friend_controller.dart b/lib/controllers/refer_friend_controller.dart index 8b9cd87..66c3f7e 100644 --- a/lib/controllers/refer_friend_controller.dart +++ b/lib/controllers/refer_friend_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/referral_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ReferFriendController extends GetxController { Rx referralModel = ReferralModel().obs; diff --git a/lib/controllers/rental_conformation_controller.dart b/lib/controllers/rental_conformation_controller.dart index a0bf823..49f838e 100644 --- a/lib/controllers/rental_conformation_controller.dart +++ b/lib/controllers/rental_conformation_controller.dart @@ -7,8 +7,7 @@ import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../screen_ui/rental_service/rental_dashboard_screen.dart'; import 'cab_rental_dashboard_controllers.dart'; @@ -27,7 +26,8 @@ class RentalConformationController extends GetxController { void getArguments() { final args = Get.arguments; - if (args.containsKey('rentalOrderModel') && args['rentalOrderModel'] is RentalOrderModel) { + if (args.containsKey('rentalOrderModel') && + args['rentalOrderModel'] is RentalOrderModel) { rentalOrderModel.value = args['rentalOrderModel'] as RentalOrderModel; calculateAmount(); } else { @@ -48,12 +48,21 @@ class RentalConformationController extends GetxController { taxAmount.value = 0.0; totalAmount.value = 0.0; - subTotal.value = double.tryParse(rentalOrderModel.value.subTotal ?? '0') ?? 0.0; + subTotal.value = + double.tryParse(rentalOrderModel.value.subTotal ?? '0') ?? 0.0; if (selectedCouponModel.value.id != null) { - discount.value = Constant.calculateDiscount(amount: subTotal.value.toString(), offerModel: selectedCouponModel.value); + discount.value = Constant.calculateDiscount( + amount: subTotal.value.toString(), + offerModel: selectedCouponModel.value, + ); } for (var element in rentalOrderModel.value.taxSetting ?? []) { - taxAmount.value = (taxAmount.value + Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element)); + taxAmount.value = + (taxAmount.value + + Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + )); } totalAmount.value = subTotal.value - discount.value + taxAmount.value; @@ -77,12 +86,17 @@ class RentalConformationController extends GetxController { rentalOrderModel.value.couponCode = selectedCouponModel.value.code; rentalOrderModel.value.couponId = selectedCouponModel.value.id; rentalOrderModel.value.subTotal = subTotal.value.toString(); - rentalOrderModel.value.otpCode = (maths.Random().nextInt(9000) + 1000).toString(); - await FireStoreUtils.rentalOrderPlace(rentalOrderModel.value).then((value) async { + rentalOrderModel.value.otpCode = + (maths.Random().nextInt(9000) + 1000).toString(); + await FireStoreUtils.rentalOrderPlace(rentalOrderModel.value).then(( + value, + ) async { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Order placed successfully".tr()); Get.offAll(const RentalDashboardScreen()); - CabRentalDashboardControllers controller = Get.put(CabRentalDashboardControllers()); + CabRentalDashboardControllers controller = Get.put( + CabRentalDashboardControllers(), + ); controller.selectedIndex.value = 1; // Get.back(); }); diff --git a/lib/controllers/rental_coupon_controller.dart b/lib/controllers/rental_coupon_controller.dart index 9f4b303..4cb1292 100644 --- a/lib/controllers/rental_coupon_controller.dart +++ b/lib/controllers/rental_coupon_controller.dart @@ -1,9 +1,8 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart'; - -class RentalCouponController extends GetxController{ +import 'package:get/get.dart' hide Trans; +class RentalCouponController extends GetxController { @override void onInit() { // TODO: implement onInit @@ -11,10 +10,10 @@ class RentalCouponController extends GetxController{ super.onInit(); } - - void getData(){ + void getData() { getCouponCode(); } + RxBool isLoading = true.obs; RxList cabCouponList = [].obs; @@ -25,4 +24,4 @@ class RentalCouponController extends GetxController{ print("cabCouponList ${cabCouponList.length}"); isLoading.value = false; } -} \ No newline at end of file +} diff --git a/lib/controllers/rental_home_controller.dart b/lib/controllers/rental_home_controller.dart index c7a3a36..87b8181 100644 --- a/lib/controllers/rental_home_controller.dart +++ b/lib/controllers/rental_home_controller.dart @@ -10,7 +10,7 @@ import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart' as latlong; import '../constant/constant.dart'; import '../models/payment_model/cod_setting_model.dart'; @@ -38,7 +38,8 @@ class RentalHomeController extends GetxController { RxBool isLoading = false.obs; // Location input - final Rx sourceTextEditController = TextEditingController().obs; + final Rx sourceTextEditController = + TextEditingController().obs; // Selected date Rx selectedDate = DateTime.now().obs; @@ -74,11 +75,20 @@ class RentalHomeController extends GetxController { Constant.currentLocation = position; // Set default coordinates for Google or OSM - departureLatLong.value = gmaps.LatLng(position.latitude, position.longitude); - departureLatLongOsm.value = latlong.LatLng(position.latitude, position.longitude); + departureLatLong.value = gmaps.LatLng( + position.latitude, + position.longitude, + ); + departureLatLongOsm.value = latlong.LatLng( + position.latitude, + position.longitude, + ); // Get readable address - String address = await Utils.getAddressFromCoordinates(position.latitude, position.longitude); + String address = await Utils.getAddressFromCoordinates( + position.latitude, + position.longitude, + ); sourceTextEditController.value.text = address; } } catch (e) { @@ -102,7 +112,12 @@ class RentalHomeController extends GetxController { /// Date Picker Future pickDate(BuildContext context) async { - final DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate.value, firstDate: DateTime.now(), lastDate: DateTime(2100)); + final DateTime? picked = await showDatePicker( + context: context, + initialDate: selectedDate.value, + firstDate: DateTime.now(), + lastDate: DateTime(2100), + ); if (picked != null) { selectedDate.value = picked; @@ -110,7 +125,9 @@ class RentalHomeController extends GetxController { } Future getRentalPackage() async { - await FireStoreUtils.getRentalPackage(selectedVehicleType.value!.id.toString()).then((value) { + await FireStoreUtils.getRentalPackage( + selectedVehicleType.value!.id.toString(), + ).then((value) { rentalPackages.value = value; if (rentalPackages.isNotEmpty) { selectedPackage.value = rentalPackages[0]; @@ -120,8 +137,14 @@ class RentalHomeController extends GetxController { void completeOrder() { DestinationLocation sourceLocation = DestinationLocation( - latitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.latitude : departureLatLong.value.latitude, - longitude: Constant.selectedMapType == 'osm' ? departureLatLongOsm.value.longitude : departureLatLong.value.longitude, + latitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.latitude + : departureLatLong.value.latitude, + longitude: + Constant.selectedMapType == 'osm' + ? departureLatLongOsm.value.longitude + : departureLatLong.value.longitude, ); print("=====>"); @@ -144,18 +167,35 @@ class RentalHomeController extends GetxController { rentalOrderModel.taxSetting = Constant.taxList; rentalOrderModel.createdAt = Timestamp.now(); rentalOrderModel.sourceLocation = sourceLocation; - rentalOrderModel.adminCommission = Constant.sectionConstantModel!.adminCommision!.amount; - rentalOrderModel.adminCommissionType = Constant.sectionConstantModel!.adminCommision!.commissionType; + rentalOrderModel.adminCommission = + Constant.sectionConstantModel!.adminCommision!.amount; + rentalOrderModel.adminCommissionType = + Constant.sectionConstantModel!.adminCommision!.commissionType; rentalOrderModel.sourcePoint = G( - geopoint: GeoPoint(sourceLocation.latitude ?? 0.0, sourceLocation.longitude ?? 0.0), - geohash: Geoflutterfire().point(latitude: sourceLocation.latitude ?? 0.0, longitude: sourceLocation.longitude ?? 0.0).hash, + geopoint: GeoPoint( + sourceLocation.latitude ?? 0.0, + sourceLocation.longitude ?? 0.0, + ), + geohash: + Geoflutterfire() + .point( + latitude: sourceLocation.latitude ?? 0.0, + longitude: sourceLocation.longitude ?? 0.0, + ) + .hash, + ); + rentalOrderModel.zoneId = Constant.getZoneId( + sourceLocation.latitude ?? 0.0, + sourceLocation.longitude ?? 0.0, ); - rentalOrderModel.zoneId = Constant.getZoneId(sourceLocation.latitude ?? 0.0, sourceLocation.longitude ?? 0.0); log(rentalOrderModel.toJson().toString()); Get.back(); Get.back(); - Get.to(() => RentalConformationScreen(), arguments: {"rentalOrderModel": rentalOrderModel}); + Get.to( + () => RentalConformationScreen(), + arguments: {"rentalOrderModel": rentalOrderModel}, + ); } void setDepartureMarker(double lat, double lng) { @@ -194,19 +234,45 @@ class RentalHomeController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; diff --git a/lib/controllers/rental_order_details_controller.dart b/lib/controllers/rental_order_details_controller.dart index e51f7af..69bd57c 100644 --- a/lib/controllers/rental_order_details_controller.dart +++ b/lib/controllers/rental_order_details_controller.dart @@ -39,7 +39,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:razorpay_flutter/razorpay_flutter.dart'; import 'package:uuid/uuid.dart'; @@ -84,13 +84,17 @@ class RentalOrderDetailsController extends GetxController { Future fetchDriverDetails() async { if (order.value.driverId != null) { - await FireStoreUtils.getUserProfile(order.value.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; } }); - await FireStoreUtils.getReviewsbyID(order.value.id.toString()).then((value) { + await FireStoreUtils.getReviewsbyID(order.value.id.toString()).then(( + value, + ) { if (value != null) { ratingModel.value = value; } @@ -100,9 +104,15 @@ class RentalOrderDetailsController extends GetxController { String getExtraKm() { try { - final double start = double.tryParse(order.value.startKitoMetersReading ?? '0') ?? 0.0; - final double end = double.tryParse(order.value.endKitoMetersReading ?? '0') ?? 0.0; - final double included = double.tryParse(order.value.rentalPackageModel?.includedDistance?.toString() ?? '0') ?? 0.0; + final double start = + double.tryParse(order.value.startKitoMetersReading ?? '0') ?? 0.0; + final double end = + double.tryParse(order.value.endKitoMetersReading ?? '0') ?? 0.0; + final double included = + double.tryParse( + order.value.rentalPackageModel?.includedDistance?.toString() ?? '0', + ) ?? + 0.0; // Calculate extra km safely final double extra = (end - start - included); @@ -117,8 +127,10 @@ class RentalOrderDetailsController extends GetxController { ///Safe calculation after order is loaded void calculateTotalAmount() { try { - subTotal.value = double.tryParse(order.value.subTotal?.toString() ?? "0") ?? 0.0; - discount.value = double.tryParse(order.value.discount?.toString() ?? "0") ?? 0.0; + subTotal.value = + double.tryParse(order.value.subTotal?.toString() ?? "0") ?? 0.0; + discount.value = + double.tryParse(order.value.discount?.toString() ?? "0") ?? 0.0; taxAmount.value = 0.0; if (order.value.endTime != null) { @@ -128,12 +140,23 @@ class RentalOrderDetailsController extends GetxController { // Total rented minutes int totalMinutes = end.difference(start).inMinutes; - int includedMinutes = (int.tryParse(order.value.rentalPackageModel?.includedHours.toString() ?? "0") ?? 0) * 60; + int includedMinutes = + (int.tryParse( + order.value.rentalPackageModel?.includedHours.toString() ?? + "0", + ) ?? + 0) * + 60; if (totalMinutes > includedMinutes) { int extraMinutes = totalMinutes - includedMinutes; - double minuteFare = double.tryParse(order.value.rentalPackageModel?.extraMinuteFare?.toString() ?? "0") ?? 0.0; + double minuteFare = + double.tryParse( + order.value.rentalPackageModel?.extraMinuteFare?.toString() ?? + "0", + ) ?? + 0.0; extraMinutesCharge.value = extraMinutes * minuteFare; } else { @@ -141,24 +164,47 @@ class RentalOrderDetailsController extends GetxController { } } - if (order.value.startKitoMetersReading != null && order.value.endKitoMetersReading != null) { - double startKm = double.tryParse(order.value.startKitoMetersReading?.toString() ?? "0") ?? 0.0; - double endKm = double.tryParse(order.value.endKitoMetersReading?.toString() ?? "0") ?? 0.0; + if (order.value.startKitoMetersReading != null && + order.value.endKitoMetersReading != null) { + double startKm = + double.tryParse( + order.value.startKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; + double endKm = + double.tryParse( + order.value.endKitoMetersReading?.toString() ?? "0", + ) ?? + 0.0; if (endKm > startKm) { double totalKm = endKm - startKm; - if (totalKm > double.parse(order.value.rentalPackageModel!.includedDistance!)) { - totalKm = totalKm - double.parse(order.value.rentalPackageModel!.includedDistance!); - double extraKmRate = double.tryParse(order.value.rentalPackageModel?.extraKmFare?.toString() ?? "0") ?? 0.0; + if (totalKm > + double.parse(order.value.rentalPackageModel!.includedDistance!)) { + totalKm = + totalKm - + double.parse(order.value.rentalPackageModel!.includedDistance!); + double extraKmRate = + double.tryParse( + order.value.rentalPackageModel?.extraKmFare?.toString() ?? + "0", + ) ?? + 0.0; extraKilometerCharge.value = totalKm * extraKmRate; } } } - subTotal.value = subTotal.value + extraKilometerCharge.value + extraMinutesCharge.value; + subTotal.value = + subTotal.value + + extraKilometerCharge.value + + extraMinutesCharge.value; if (order.value.taxSetting != null) { for (var element in order.value.taxSetting!) { - taxAmount.value += Constant.calculateTax(amount: (subTotal.value - discount.value).toString(), taxModel: element); + taxAmount.value += Constant.calculateTax( + amount: (subTotal.value - discount.value).toString(), + taxModel: element, + ); } } @@ -194,9 +240,14 @@ class RentalOrderDetailsController extends GetxController { serviceType: Constant.parcelServiceType, ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: "-${totalAmount.toString()}", userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: "-${totalAmount.toString()}", + userId: FireStoreUtils.getCurrentUid(), + ); } }); } @@ -209,7 +260,10 @@ class RentalOrderDetailsController extends GetxController { } } - Future cancelRentalRequest(RentalOrderModel order, {List? taxList}) async { + Future cancelRentalRequest( + RentalOrderModel order, { + List? taxList, + }) async { try { isLoading.value = true; @@ -221,11 +275,19 @@ class RentalOrderDetailsController extends GetxController { if (taxList != null) { for (var element in taxList) { - totalTax += Constant.calculateTax(amount: (double.parse(order.subTotal.toString()) - double.parse(order.discount.toString())).toString(), taxModel: element); + totalTax += Constant.calculateTax( + amount: + (double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString())) + .toString(), + taxModel: element, + ); } } - double subTotal = double.parse(order.subTotal.toString()) - double.parse(order.discount.toString()); + double subTotal = + double.parse(order.subTotal.toString()) - + double.parse(order.discount.toString()); double refundAmount = subTotal + totalTax; WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -244,7 +306,10 @@ class RentalOrderDetailsController extends GetxController { ); await FireStoreUtils.setWalletTransaction(walletTransaction); - await FireStoreUtils.updateUserWallet(amount: refundAmount.toString(), userId: FireStoreUtils.getCurrentUid()); + await FireStoreUtils.updateUserWallet( + amount: refundAmount.toString(), + userId: FireStoreUtils.getCurrentUid(), + ); } ShowToastDialog.showToast("Booking cancelled successfully".tr()); Get.back(); @@ -272,19 +337,45 @@ class RentalOrderDetailsController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - paytmModel.value = PaytmModel.fromJson(jsonDecode(Preferences.getString(Preferences.paytmSettings))); - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(jsonDecode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); - walletSettingModel.value = WalletSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.walletSettings))); - cashOnDeliverySettingModel.value = CodSettingModel.fromJson(jsonDecode(Preferences.getString(Preferences.codSettings))); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + paytmModel.value = PaytmModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paytmSettings)), + ); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + jsonDecode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); + walletSettingModel.value = WalletSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.walletSettings)), + ); + cashOnDeliverySettingModel.value = CodSettingModel.fromJson( + jsonDecode(Preferences.getString(Preferences.codSettings)), + ); if (walletSettingModel.value.isEnabled == true) { selectedPaymentMethod.value = PaymentGateway.wallet.name; @@ -326,20 +417,32 @@ class RentalOrderDetailsController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -385,7 +488,10 @@ class RentalOrderDetailsController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -395,8 +501,14 @@ class RentalOrderDetailsController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -409,12 +521,20 @@ class RentalOrderDetailsController extends GetxController { }, ], "payer": {"email": Constant.userModel!.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, "auto_return": "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -497,15 +617,23 @@ class RentalOrderDetailsController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -515,17 +643,23 @@ class RentalOrderDetailsController extends GetxController { "payment_options": "ussd, card, barter, payattitude", "customer": { "email": Constant.userModel!.email.toString(), - "phonenumber": Constant.userModel!.phoneNumber, // Add a real phone number + "phonenumber": + Constant.userModel!.phoneNumber, // Add a real phone number "name": Constant.userModel!.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -554,8 +688,14 @@ class RentalOrderDetailsController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: Constant.userModel!).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: Constant.userModel!, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -594,7 +734,14 @@ class RentalOrderDetailsController extends GetxController { // }); } - Future startTransaction(context, {required String txnTokenBy, required orderId, required double amount, required callBackURL, required isStaging}) async { + Future startTransaction( + context, { + required String txnTokenBy, + required orderId, + required double amount, + required callBackURL, + required isStaging, + }) async { // try { // var response = AllInOneSdk.startTransaction( // paytmModel.value.paytmMID.toString(), @@ -630,24 +777,38 @@ class RentalOrderDetailsController extends GetxController { // } } - Future verifyCheckSum({required String checkSum, required double amount, required orderId}) async { + Future verifyCheckSum({ + required String checkSum, + required double amount, + required orderId, + }) async { String getChecksum = "${Constant.globalUrl}payments/validatechecksum"; final response = await http.post( Uri.parse(getChecksum), headers: {}, - body: {"mid": paytmModel.value.paytmMID.toString(), "order_id": orderId, "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), "checksum_value": checkSum}, + body: { + "mid": paytmModel.value.paytmMID.toString(), + "order_id": orderId, + "key_secret": paytmModel.value.pAYTMMERCHANTKEY.toString(), + "checksum_value": checkSum, + }, ); final data = jsonDecode(response.body); return data['status']; } - Future initiatePayment({required double amount, required orderId}) async { + Future initiatePayment({ + required double amount, + required orderId, + }) async { String initiateURL = "${Constant.globalUrl}payments/initiatepaytmpayment"; String callback = ""; if (paytmModel.value.isSandboxEnabled == true) { - callback = "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } else { - callback = "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; + callback = + "${callback}https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=$orderId"; } final response = await http.post( Uri.parse(initiateURL), @@ -665,9 +826,12 @@ class RentalOrderDetailsController extends GetxController { ); log(response.body); final data = jsonDecode(response.body); - if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { + if (data["body"]["txnToken"] == null || + data["body"]["txnToken"].toString().isEmpty) { Get.back(); - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); } return GetPaymentTxtTokenModel.fromJson(data); } @@ -685,7 +849,10 @@ class RentalOrderDetailsController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': Constant.userModel!.phoneNumber, 'email': Constant.userModel!.email}, + 'prefill': { + 'contact': Constant.userModel!.phoneNumber, + 'email': Constant.userModel!.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -720,7 +887,10 @@ class RentalOrderDetailsController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -738,15 +908,30 @@ class RentalOrderDetailsController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -754,7 +939,9 @@ class RentalOrderDetailsController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -771,13 +958,30 @@ class RentalOrderDetailsController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -789,13 +993,22 @@ class RentalOrderDetailsController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -806,17 +1019,32 @@ class RentalOrderDetailsController extends GetxController { accessToken = responseData['access_token']; // ignore: use_build_context_synchronously - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -831,7 +1059,11 @@ class RentalOrderDetailsController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -845,7 +1077,9 @@ class RentalOrderDetailsController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -861,7 +1095,13 @@ class RentalOrderDetailsController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); completeOrder(); @@ -877,7 +1117,9 @@ class RentalOrderDetailsController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -890,7 +1132,11 @@ class RentalOrderDetailsController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/controllers/rental_review_controller.dart b/lib/controllers/rental_review_controller.dart index 1314702..88d06c3 100644 --- a/lib/controllers/rental_review_controller.dart +++ b/lib/controllers/rental_review_controller.dart @@ -1,7 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../constant/collection_name.dart'; import '../models/rating_model.dart'; import '../models/rental_order_model.dart'; @@ -48,12 +48,17 @@ class RentalReviewController extends GetxController { } }); - await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then((value) { + await FireStoreUtils.getUserProfile(order.value?.driverId ?? '').then(( + value, + ) { if (value != null) { driverUser.value = value; - final int userReviewsCount = int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? 0; - final int userReviewsSum = int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; + final int userReviewsCount = + int.tryParse(driverUser.value!.reviewsCount?.toString() ?? "0") ?? + 0; + final int userReviewsSum = + int.tryParse(driverUser.value!.reviewsSum?.toString() ?? "0") ?? 0; if (ratingModel.value != null) { final int oldRating = ratingModel.value?.rating?.toInt() ?? 0; @@ -78,7 +83,9 @@ class RentalReviewController extends GetxController { ShowToastDialog.showLoader("Submit in...".tr()); - final user = await FireStoreUtils.getUserProfile(order.value?.driverId ?? ''); + final user = await FireStoreUtils.getUserProfile( + order.value?.driverId ?? '', + ); if (user != null) { user.reviewsCount = (futureCount.value + 1).toString(); @@ -95,7 +102,8 @@ class RentalReviewController extends GetxController { driverId: ratingModel.value!.driverId, customerId: ratingModel.value!.customerId, vendorId: ratingModel.value?.vendorId, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); @@ -106,7 +114,8 @@ class RentalReviewController extends GetxController { } } else { /// New review - final docRef = FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); + final docRef = + FireStoreUtils.fireStore.collection(CollectionName.itemsReview).doc(); final newRating = RatingModel( id: docRef.id, comment: comment.value.text, @@ -115,7 +124,8 @@ class RentalReviewController extends GetxController { orderId: order.value?.id, driverId: order.value?.driverId.toString(), customerId: Constant.userModel?.id, - uname: "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", + uname: + "${Constant.userModel?.firstName ?? ''} ${Constant.userModel?.lastName ?? ''}", profile: Constant.userModel?.profilePictureURL, createdAt: Timestamp.now(), ); diff --git a/lib/controllers/restaurant_details_controller.dart b/lib/controllers/restaurant_details_controller.dart index 7901954..dcc56ac 100644 --- a/lib/controllers/restaurant_details_controller.dart +++ b/lib/controllers/restaurant_details_controller.dart @@ -13,11 +13,12 @@ import '../models/attributes_model.dart'; import '../service/cart_provider.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; class RestaurantDetailsController extends GetxController { - Rx searchEditingController = TextEditingController().obs; + Rx searchEditingController = + TextEditingController().obs; RxBool isLoading = true.obs; Rx pageController = PageController().obs; @@ -44,7 +45,8 @@ class RestaurantDetailsController extends GetxController { } void animateSlider() { - if (vendorModel.value.photos != null && vendorModel.value.photos!.isNotEmpty) { + if (vendorModel.value.photos != null && + vendorModel.value.photos!.isNotEmpty) { Timer.periodic(const Duration(seconds: 2), (Timer timer) { if (currentPage < vendorModel.value.photos!.length - 1) { currentPage++; @@ -53,7 +55,11 @@ class RestaurantDetailsController extends GetxController { } if (pageController.value.hasClients) { - pageController.value.animateToPage(currentPage.value, duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + pageController.value.animateToPage( + currentPage.value, + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ); } }); } @@ -86,14 +92,25 @@ class RestaurantDetailsController extends GetxController { RxList brandList = [].obs; Future getProduct() async { - await FireStoreUtils.getProductByVendorId(vendorModel.value.id.toString()).then((value) { - if ((Constant.isSubscriptionModelApplied == true || vendorModel.value.adminCommission?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) { + await FireStoreUtils.getProductByVendorId( + vendorModel.value.id.toString(), + ).then((value) { + if ((Constant.isSubscriptionModelApplied == true || + vendorModel.value.adminCommission?.isEnabled == true) && + vendorModel.value.subscriptionPlan != null) { if (vendorModel.value.subscriptionPlan?.itemLimit == '-1') { allProductList.value = value; productList.value = value; } else { int selectedProduct = - value.length < int.parse(vendorModel.value.subscriptionPlan?.itemLimit ?? '0') ? (value.isEmpty ? 0 : (value.length)) : int.parse(vendorModel.value.subscriptionPlan?.itemLimit ?? '0'); + value.length < + int.parse( + vendorModel.value.subscriptionPlan?.itemLimit ?? '0', + ) + ? (value.isEmpty ? 0 : (value.length)) + : int.parse( + vendorModel.value.subscriptionPlan?.itemLimit ?? '0', + ); allProductList.value = value.sublist(0, selectedProduct); productList.value = value.sublist(0, selectedProduct); } @@ -104,7 +121,9 @@ class RestaurantDetailsController extends GetxController { }); for (var element in productList) { - await FireStoreUtils.getVendorCategoryById(element.categoryID.toString()).then((value) { + await FireStoreUtils.getVendorCategoryById( + element.categoryID.toString(), + ).then((value) { if (value != null) { vendorCategoryList.add(value); } @@ -116,7 +135,10 @@ class RestaurantDetailsController extends GetxController { }); var seen = {}; - vendorCategoryList.value = vendorCategoryList.where((element) => seen.add(element.id.toString())).toList(); + vendorCategoryList.value = + vendorCategoryList + .where((element) => seen.add(element.id.toString())) + .toList(); } void searchProduct(String name) { @@ -126,25 +148,42 @@ class RestaurantDetailsController extends GetxController { } else { isVag.value = false; isNonVag.value = false; - productList.value = allProductList.where((p0) => p0.name!.toLowerCase().contains(name.toLowerCase())).toList(); + productList.value = + allProductList + .where( + (p0) => p0.name!.toLowerCase().contains(name.toLowerCase()), + ) + .toList(); } update(); } void filterRecord() { if (isVag.value == true && isNonVag.value == true) { - productList.value = allProductList.where((p0) => p0.nonveg == true || p0.nonveg == false).toList(); + productList.value = + allProductList + .where((p0) => p0.nonveg == true || p0.nonveg == false) + .toList(); } else if (isVag.value == true && isNonVag.value == false) { - productList.value = allProductList.where((p0) => p0.nonveg == false).toList(); + productList.value = + allProductList.where((p0) => p0.nonveg == false).toList(); } else if (isVag.value == false && isNonVag.value == true) { - productList.value = allProductList.where((p0) => p0.nonveg == true).toList(); + productList.value = + allProductList.where((p0) => p0.nonveg == true).toList(); } else if (isVag.value == false && isNonVag.value == false) { - productList.value = allProductList.where((p0) => p0.nonveg == true || p0.nonveg == false).toList(); + productList.value = + allProductList + .where((p0) => p0.nonveg == true || p0.nonveg == false) + .toList(); } } - Future> getProductByCategory(VendorCategoryModel vendorCategoryModel) async { - return productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList(); + Future> getProductByCategory( + VendorCategoryModel vendorCategoryModel, + ) async { + return productList + .where((p0) => p0.categoryID == vendorCategoryModel.id) + .toList(); } Future getFavouriteList() async { @@ -157,7 +196,9 @@ class RestaurantDetailsController extends GetxController { favouriteItemList.value = value; }); - await FireStoreUtils.getOfferByVendorId(vendorModel.value.id.toString()).then((value) { + await FireStoreUtils.getOfferByVendorId( + vendorModel.value.id.toString(), + ).then((value) { couponList.value = value; }); } @@ -175,8 +216,12 @@ class RestaurantDetailsController extends GetxController { if (day == element.day.toString()) { if (element.timeslot!.isNotEmpty) { for (var element in element.timeslot!) { - var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}"); - var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}"); + var start = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.from}"); + var end = DateFormat( + "dd-MM-yyyy HH:mm", + ).parse("$date ${element.to}"); if (isCurrentDateInRange(start, end)) { isOpen.value = true; } @@ -219,15 +264,33 @@ class RestaurantDetailsController extends GetxController { String adOnsPrice = "0"; if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where((element) => element.variantSku == selectedVariants.join('-')) + .isNotEmpty) { variantPrice = Constant.productCommissionPrice( vendorModel.value, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); } } else { - String price = Constant.productCommissionPrice(vendorModel.value, productModel.price.toString()); - String disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel.value, productModel.disPrice.toString()); + String price = Constant.productCommissionPrice( + vendorModel.value, + productModel.price.toString(), + ); + String disPrice = + double.parse(productModel.disPrice.toString()) <= 0 + ? "0" + : Constant.productCommissionPrice( + vendorModel.value, + productModel.disPrice.toString(), + ); if (double.parse(disPrice) <= 0) { variantPrice = price; } else { @@ -237,11 +300,23 @@ class RestaurantDetailsController extends GetxController { for (int i = 0; i < productModel.addOnsPrice!.length; i++) { if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true) { - adOnsPrice = (double.parse(adOnsPrice.toString()) + double.parse(Constant.productCommissionPrice(vendorModel.value, productModel.addOnsPrice![i].toString()))).toString(); + adOnsPrice = + (double.parse(adOnsPrice.toString()) + + double.parse( + Constant.productCommissionPrice( + vendorModel.value, + productModel.addOnsPrice![i].toString(), + ), + )) + .toString(); } } adOnsPrice = (quantity.value * double.parse(adOnsPrice)).toString(); - mainPrice = ((double.parse(variantPrice.toString()) * double.parse(quantity.value.toString())) + double.parse(adOnsPrice.toString())).toString(); + mainPrice = + ((double.parse(variantPrice.toString()) * + double.parse(quantity.value.toString())) + + double.parse(adOnsPrice.toString())) + .toString(); return mainPrice; } @@ -253,18 +328,35 @@ class RestaurantDetailsController extends GetxController { }); } - Future addToCart({required ProductModel productModel, required String price, required String discountPrice, required bool isIncrement, required int quantity, VariantInfo? variantInfo}) async { + Future addToCart({ + required ProductModel productModel, + required String price, + required String discountPrice, + required bool isIncrement, + required int quantity, + VariantInfo? variantInfo, + }) async { CartProductModel cartProductModel = CartProductModel(); String adOnsPrice = "0"; for (int i = 0; i < productModel.addOnsPrice!.length; i++) { - if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true && productModel.addOnsPrice![i] != '0') { - adOnsPrice = (double.parse(adOnsPrice.toString()) + double.parse(Constant.productCommissionPrice(vendorModel.value, productModel.addOnsPrice![i].toString()))).toString(); + if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true && + productModel.addOnsPrice![i] != '0') { + adOnsPrice = + (double.parse(adOnsPrice.toString()) + + double.parse( + Constant.productCommissionPrice( + vendorModel.value, + productModel.addOnsPrice![i].toString(), + ), + )) + .toString(); } } if (variantInfo != null) { - cartProductModel.id = "${productModel.id!}~${variantInfo.variantId.toString()}"; + cartProductModel.id = + "${productModel.id!}~${variantInfo.variantId.toString()}"; cartProductModel.name = productModel.name!; cartProductModel.photo = productModel.photo!; cartProductModel.categoryId = productModel.categoryID!; diff --git a/lib/controllers/restaurant_list_controller.dart b/lib/controllers/restaurant_list_controller.dart index fe953e2..bfe86f8 100644 --- a/lib/controllers/restaurant_list_controller.dart +++ b/lib/controllers/restaurant_list_controller.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class RestaurantListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/review_list_controller.dart b/lib/controllers/review_list_controller.dart index 540165c..659bfb5 100644 --- a/lib/controllers/review_list_controller.dart +++ b/lib/controllers/review_list_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/models/rating_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ReviewListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/scan_qr_code_controller.dart b/lib/controllers/scan_qr_code_controller.dart index 066dcee..8c36a5b 100644 --- a/lib/controllers/scan_qr_code_controller.dart +++ b/lib/controllers/scan_qr_code_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ScanQrCodeController extends GetxController { @override diff --git a/lib/controllers/search_controller.dart b/lib/controllers/search_controller.dart index bf20ea6..01dee30 100644 --- a/lib/controllers/search_controller.dart +++ b/lib/controllers/search_controller.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class SearchScreenController extends GetxController { @override @@ -28,13 +28,20 @@ class SearchScreenController extends GetxController { isLoading.value = false; for (var element in vendorList) { - await FireStoreUtils.getProductByVendorId(element.id.toString()).then((value) { - if ((Constant.isSubscriptionModelApplied == true || element.adminCommission?.isEnabled == true) && element.subscriptionPlan != null) { + await FireStoreUtils.getProductByVendorId(element.id.toString()).then(( + value, + ) { + if ((Constant.isSubscriptionModelApplied == true || + element.adminCommission?.isEnabled == true) && + element.subscriptionPlan != null) { if (element.subscriptionPlan?.itemLimit == '-1') { productList.addAll(value); } else { int selectedProduct = - value.length < int.parse(element.subscriptionPlan?.itemLimit ?? '0') ? (value.isEmpty ? 0 : (value.length)) : int.parse(element.subscriptionPlan?.itemLimit ?? '0'); + value.length < + int.parse(element.subscriptionPlan?.itemLimit ?? '0') + ? (value.isEmpty ? 0 : (value.length)) + : int.parse(element.subscriptionPlan?.itemLimit ?? '0'); productList.addAll(value.sublist(0, selectedProduct)); } } else { diff --git a/lib/controllers/service_list_controller.dart b/lib/controllers/service_list_controller.dart index b12354b..e21ce0f 100644 --- a/lib/controllers/service_list_controller.dart +++ b/lib/controllers/service_list_controller.dart @@ -16,7 +16,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart'; import '../screen_ui/on_demand_service/on_demand_dashboard_screen.dart'; diff --git a/lib/controllers/sign_up_controller.dart b/lib/controllers/sign_up_controller.dart index 04f9de4..bd990ba 100644 --- a/lib/controllers/sign_up_controller.dart +++ b/lib/controllers/sign_up_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:firebase_auth/firebase_auth.dart' as auth; import '../constant/constant.dart'; import '../models/referral_model.dart'; @@ -17,9 +17,11 @@ class SignUpController extends GetxController { Rx lastNameController = TextEditingController().obs; Rx emailController = TextEditingController().obs; Rx mobileController = TextEditingController().obs; - Rx countryCodeController = TextEditingController(text: Constant.defaultCountryCode).obs; + Rx countryCodeController = + TextEditingController(text: Constant.defaultCountryCode).obs; Rx passwordController = TextEditingController().obs; - Rx confirmPasswordController = TextEditingController().obs; + Rx confirmPasswordController = + TextEditingController().obs; Rx referralController = TextEditingController().obs; final FocusNode emailFocusNode = FocusNode(); @@ -90,7 +92,8 @@ class SignUpController extends GetxController { } else if (lastNameController.value.text.isEmpty) { ShowToastDialog.showToast("Please enter last name".tr()); return false; - } else if (emailController.value.text.isEmpty || !emailController.value.text.isEmail) { + } else if (emailController.value.text.isEmpty || + !emailController.value.text.isEmail) { ShowToastDialog.showToast("Please enter a valid email address".tr()); return false; } else if (mobileController.value.text.isEmpty) { @@ -99,8 +102,11 @@ class SignUpController extends GetxController { } else if (passwordController.value.text.length < 6) { ShowToastDialog.showToast("Password must be at least 6 characters".tr()); return false; - } else if (passwordController.value.text != confirmPasswordController.value.text) { - ShowToastDialog.showToast("Password and Confirm password do not match".tr()); + } else if (passwordController.value.text != + confirmPasswordController.value.text) { + ShowToastDialog.showToast( + "Password and Confirm password do not match".tr(), + ); return false; } return true; @@ -109,7 +115,10 @@ class SignUpController extends GetxController { /// Email Sign-up Flow Future _signUpWithEmail() async { try { - final credential = await _firebaseAuth.createUserWithEmailAndPassword(email: emailController.value.text.trim(), password: passwordController.value.text.trim()); + final credential = await _firebaseAuth.createUserWithEmailAndPassword( + email: emailController.value.text.trim(), + password: passwordController.value.text.trim(), + ); if (credential.user != null) { final newUser = await _buildUserModel(credential.user?.uid ?? ''); @@ -119,7 +128,9 @@ class SignUpController extends GetxController { _navigateBasedOnAddress(newUser); } } on auth.FirebaseAuthException catch (e) { - debugPrint("FirebaseAuthException caught: code=${e.code}, message=${e.message}"); + debugPrint( + "FirebaseAuthException caught: code=${e.code}, message=${e.message}", + ); if (e.code == 'email-already-in-use') { ShowToastDialog.showToast("Email already in use".tr()); } else if (e.code == 'weak-password') { @@ -131,7 +142,9 @@ class SignUpController extends GetxController { } } catch (e) { debugPrint("Something went wrong: ${e.toString()}"); - ShowToastDialog.showToast("${'something_went_wrong'.tr()}: ${e.toString()}"); + ShowToastDialog.showToast( + "${'something_went_wrong'.tr()}: ${e.toString()}", + ); } } @@ -173,9 +186,17 @@ class SignUpController extends GetxController { /// Handle Referral Logic Future _handleReferral(String userId) async { final referralCode = referralController.value.text.trim(); - final referralBy = referralCode.isNotEmpty ? (await FireStoreUtils.getReferralUserByCode(referralCode))?.id ?? '' : ''; + final referralBy = + referralCode.isNotEmpty + ? (await FireStoreUtils.getReferralUserByCode(referralCode))?.id ?? + '' + : ''; - final referral = ReferralModel(id: userId, referralBy: referralBy, referralCode: Constant.getReferralCode()); + final referral = ReferralModel( + id: userId, + referralBy: referralBy, + referralCode: Constant.getReferralCode(), + ); await FireStoreUtils.referralAdd(referral); } @@ -183,7 +204,10 @@ class SignUpController extends GetxController { /// Navigate Based on Shipping Address void _navigateBasedOnAddress(UserModel user) { if (user.shippingAddress?.isNotEmpty == true) { - final defaultAddress = user.shippingAddress!.firstWhere((e) => e.isDefault == true, orElse: () => user.shippingAddress!.first); + final defaultAddress = user.shippingAddress!.firstWhere( + (e) => e.isDefault == true, + orElse: () => user.shippingAddress!.first, + ); /// Save the default address to global constant Constant.selectedLocation = defaultAddress; diff --git a/lib/controllers/splash_controller.dart b/lib/controllers/splash_controller.dart index 3042224..3143267 100644 --- a/lib/controllers/splash_controller.dart +++ b/lib/controllers/splash_controller.dart @@ -7,7 +7,7 @@ import 'package:customer/screen_ui/service_home_screen/service_list_screen.dart' import 'package:customer/utils/notification_service.dart'; import 'package:customer/utils/preferences.dart'; import 'package:firebase_auth/firebase_auth.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/location_enable_screens/location_permission_screen.dart'; import '../screen_ui/on_boarding_screen/on_boarding_screen.dart'; @@ -30,7 +30,9 @@ class SplashController extends GetxController { } else { bool isLogin = await FireStoreUtils.isLogin(); if (isLogin == true) { - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) async { + await FireStoreUtils.getUserProfile( + FireStoreUtils.getCurrentUid(), + ).then((value) async { if (value != null) { UserModel userModel = value; log(userModel.toJson().toString()); @@ -38,11 +40,18 @@ class SplashController extends GetxController { if (userModel.active == true) { userModel.fcmToken = await NotificationService.getToken(); await FireStoreUtils.updateUser(userModel); - if (userModel.shippingAddress != null && userModel.shippingAddress!.isNotEmpty) { - if (userModel.shippingAddress!.where((element) => element.isDefault == true).isNotEmpty) { - Constant.selectedLocation = userModel.shippingAddress!.where((element) => element.isDefault == true).single; + if (userModel.shippingAddress != null && + userModel.shippingAddress!.isNotEmpty) { + if (userModel.shippingAddress! + .where((element) => element.isDefault == true) + .isNotEmpty) { + Constant.selectedLocation = + userModel.shippingAddress! + .where((element) => element.isDefault == true) + .single; } else { - Constant.selectedLocation = userModel.shippingAddress!.first; + Constant.selectedLocation = + userModel.shippingAddress!.first; } Get.offAll(const ServiceListScreen()); } else { diff --git a/lib/controllers/theme_controller.dart b/lib/controllers/theme_controller.dart index 64b05d6..92ebb62 100644 --- a/lib/controllers/theme_controller.dart +++ b/lib/controllers/theme_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../utils/preferences.dart'; class ThemeController extends GetxController { @@ -23,5 +23,3 @@ class ThemeController extends GetxController { ThemeMode get themeMode => isDark.value ? ThemeMode.dark : ThemeMode.light; } - - diff --git a/lib/controllers/view_all_category_controller.dart b/lib/controllers/view_all_category_controller.dart index 1612e88..52ad4a4 100644 --- a/lib/controllers/view_all_category_controller.dart +++ b/lib/controllers/view_all_category_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/vendor_category_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ViewAllCategoryController extends GetxController { RxBool isLoading = true.obs; @@ -18,12 +18,19 @@ class ViewAllCategoryController extends GetxController { Future getCategoryData() async { await FireStoreUtils.getVendorCategory().then((value) { vendorCategoryModel.value = value; - }); if (Constant.restaurantList != null) { - List usedCategoryIds = Constant.restaurantList!.expand((vendor) => vendor.categoryID ?? []).whereType().toSet().toList(); - vendorCategoryModel.value = vendorCategoryModel.where((category) => usedCategoryIds.contains(category.id)).toList(); + List usedCategoryIds = + Constant.restaurantList! + .expand((vendor) => vendor.categoryID ?? []) + .whereType() + .toSet() + .toList(); + vendorCategoryModel.value = + vendorCategoryModel + .where((category) => usedCategoryIds.contains(category.id)) + .toList(); } isLoading.value = false; diff --git a/lib/controllers/view_all_popular_service_controller.dart b/lib/controllers/view_all_popular_service_controller.dart index 24da089..68379a6 100644 --- a/lib/controllers/view_all_popular_service_controller.dart +++ b/lib/controllers/view_all_popular_service_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:flutter/material.dart'; import '../models/favorite_ondemand_service_model.dart'; import '../models/provider_serivce_model.dart'; @@ -10,13 +10,17 @@ class ViewAllPopularServiceController extends GetxController { RxList providerList = [].obs; RxList allProviderList = [].obs; RxBool isLoading = true.obs; - Rx onDemandHomeController = Get.find().obs; + Rx onDemandHomeController = + Get.find().obs; - final OnDemandHomeController onDemandController = Get.find(); + final OnDemandHomeController onDemandController = + Get.find(); - Rx searchTextFiledController = TextEditingController().obs; + Rx searchTextFiledController = + TextEditingController().obs; - RxList lstFav = [].obs; + RxList lstFav = + [].obs; @override void onInit() { @@ -29,24 +33,31 @@ class ViewAllPopularServiceController extends GetxController { await FireStoreUtils.getProviderFuture() .then((providerServiceList) { - Set uniqueAuthorIds = providerServiceList.map((service) => service.author).toSet(); + Set uniqueAuthorIds = + providerServiceList.map((service) => service.author).toSet(); List listOfUniqueProviders = uniqueAuthorIds.toList(); List filteredProviders = []; for (var provider in listOfUniqueProviders) { - List filteredList = providerServiceList.where((service) => service.author == provider).toList(); + List filteredList = + providerServiceList + .where((service) => service.author == provider) + .toList(); filteredList.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); for (int index = 0; index < filteredList.length; index++) { final service = filteredList[index]; - if (Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) { + if (Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel?.adminCommision?.isEnabled == + true) { if (service.subscriptionPlan?.itemLimit == "-1") { filteredProviders.add(service); } else { - if (index < int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { + if (index < + int.parse(service.subscriptionPlan?.itemLimit ?? '0')) { filteredProviders.add(service); } } @@ -66,7 +77,9 @@ class ViewAllPopularServiceController extends GetxController { }); if (Constant.userModel != null) { - await FireStoreUtils.getFavouritesServiceList(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getFavouritesServiceList( + FireStoreUtils.getCurrentUid(), + ).then((value) { lstFav.value = value; }); } @@ -75,7 +88,14 @@ class ViewAllPopularServiceController extends GetxController { void getFilterData(String value) { if (value.isNotEmpty) { - providerList.value = allProviderList.where((e) => e.title!.toLowerCase().contains(value.toLowerCase()) || e.title!.startsWith(value)).toList(); + providerList.value = + allProviderList + .where( + (e) => + e.title!.toLowerCase().contains(value.toLowerCase()) || + e.title!.startsWith(value), + ) + .toList(); } else { providerList.assignAll(allProviderList); } diff --git a/lib/controllers/view_category_service_controller.dart b/lib/controllers/view_category_service_controller.dart index 58cdaf6..433bd2a 100644 --- a/lib/controllers/view_category_service_controller.dart +++ b/lib/controllers/view_category_service_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../models/provider_serivce_model.dart'; import '../service/fire_store_utils.dart'; @@ -9,7 +9,8 @@ class ViewCategoryServiceController extends GetxController { RxList providerList = [].obs; RxString categoryId = "".obs, categoryTitle = "".obs; - Rx onDemandHomeController = Get.find().obs; + Rx onDemandHomeController = + Get.find().obs; @override void onInit() { @@ -26,21 +27,32 @@ class ViewCategoryServiceController extends GetxController { providerList.clear(); isLoading.value = true; - List providerServiceList = await FireStoreUtils.getProviderFuture(categoryId: categoryId.value); + List providerServiceList = + await FireStoreUtils.getProviderFuture(categoryId: categoryId.value); - List uniqueAuthId = providerServiceList.map((service) => service.author).toList(); - List uniqueServiceId = providerServiceList.map((service) => service.id).toList(); + List uniqueAuthId = + providerServiceList.map((service) => service.author).toList(); + List uniqueServiceId = + providerServiceList.map((service) => service.id).toList(); List filterByItemLimit = []; List uniqueId = []; - if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel!.adminCommision?.isEnabled == true)) { + if ((Constant.isSubscriptionModelApplied == true || + Constant.sectionConstantModel!.adminCommision?.isEnabled == true)) { for (var authUser in uniqueAuthId) { - List listofAllServiceByAuth = await FireStoreUtils.getAllProviderServiceByAuthorId(authUser!); + List listofAllServiceByAuth = + await FireStoreUtils.getAllProviderServiceByAuthorId(authUser!); for (int i = 0; i < listofAllServiceByAuth.length; i++) { if (listofAllServiceByAuth[i].subscriptionPlan?.itemLimit != null && - (i < int.parse(listofAllServiceByAuth[i].subscriptionPlan?.itemLimit ?? '0') || listofAllServiceByAuth[i].subscriptionPlan?.itemLimit == '-1')) { + (i < + int.parse( + listofAllServiceByAuth[i].subscriptionPlan?.itemLimit ?? + '0', + ) || + listofAllServiceByAuth[i].subscriptionPlan?.itemLimit == + '-1')) { if (uniqueServiceId.contains(listofAllServiceByAuth[i].id)) { filterByItemLimit.add(listofAllServiceByAuth[i]); } @@ -49,7 +61,9 @@ class ViewCategoryServiceController extends GetxController { for (var service in filterByItemLimit) { for (var unique in uniqueServiceId) { - if (service.id == unique && !uniqueId.contains(service.id) && service.subscriptionTotalOrders != '0') { + if (service.id == unique && + !uniqueId.contains(service.id) && + service.subscriptionTotalOrders != '0') { uniqueId.add(service.id); providerList.add(service); } diff --git a/lib/controllers/wallet_controller.dart b/lib/controllers/wallet_controller.dart index 638eddc..44518fb 100644 --- a/lib/controllers/wallet_controller.dart +++ b/lib/controllers/wallet_controller.dart @@ -34,7 +34,7 @@ import '../payment/xenditScreen.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:uuid/uuid.dart'; @@ -45,7 +45,8 @@ class WalletController extends GetxController { Rx topUpAmountController = TextEditingController().obs; - RxList walletTransactionList = [].obs; + RxList walletTransactionList = + [].obs; Rx userModel = UserModel().obs; RxString selectedPaymentMethod = "".obs; @@ -71,17 +72,37 @@ class WalletController extends GetxController { Future getPaymentSettings() async { await FireStoreUtils.getPaymentSettingsData().then((value) { - payFastModel.value = PayFastModel.fromJson(jsonDecode(Preferences.getString(Preferences.payFastSettings))); - mercadoPagoModel.value = MercadoPagoModel.fromJson(jsonDecode(Preferences.getString(Preferences.mercadoPago))); - payPalModel.value = PayPalModel.fromJson(jsonDecode(Preferences.getString(Preferences.paypalSettings))); - stripeModel.value = StripeModel.fromJson(jsonDecode(Preferences.getString(Preferences.stripeSettings))); - flutterWaveModel.value = FlutterWaveModel.fromJson(jsonDecode(Preferences.getString(Preferences.flutterWave))); - payStackModel.value = PayStackModel.fromJson(jsonDecode(Preferences.getString(Preferences.payStack))); - razorPayModel.value = RazorPayModel.fromJson(jsonDecode(Preferences.getString(Preferences.razorpaySettings))); + payFastModel.value = PayFastModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payFastSettings)), + ); + mercadoPagoModel.value = MercadoPagoModel.fromJson( + jsonDecode(Preferences.getString(Preferences.mercadoPago)), + ); + payPalModel.value = PayPalModel.fromJson( + jsonDecode(Preferences.getString(Preferences.paypalSettings)), + ); + stripeModel.value = StripeModel.fromJson( + jsonDecode(Preferences.getString(Preferences.stripeSettings)), + ); + flutterWaveModel.value = FlutterWaveModel.fromJson( + jsonDecode(Preferences.getString(Preferences.flutterWave)), + ); + payStackModel.value = PayStackModel.fromJson( + jsonDecode(Preferences.getString(Preferences.payStack)), + ); + razorPayModel.value = RazorPayModel.fromJson( + jsonDecode(Preferences.getString(Preferences.razorpaySettings)), + ); - midTransModel.value = MidTrans.fromJson(jsonDecode(Preferences.getString(Preferences.midTransSettings))); - orangeMoneyModel.value = OrangeMoney.fromJson(json.decode(Preferences.getString(Preferences.orangeMoneySettings))); - xenditModel.value = Xendit.fromJson(jsonDecode(Preferences.getString(Preferences.xenditSettings))); + midTransModel.value = MidTrans.fromJson( + jsonDecode(Preferences.getString(Preferences.midTransSettings)), + ); + orangeMoneyModel.value = OrangeMoney.fromJson( + json.decode(Preferences.getString(Preferences.orangeMoneySettings)), + ); + xenditModel.value = Xendit.fromJson( + jsonDecode(Preferences.getString(Preferences.xenditSettings)), + ); Stripe.publishableKey = stripeModel.value.clientpublishableKey.toString(); Stripe.merchantIdentifier = 'GoRide'; @@ -101,7 +122,9 @@ class WalletController extends GetxController { walletTransactionList.value = value; } }); - await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.getUserProfile(FireStoreUtils.getCurrentUid()).then(( + value, + ) { if (value != null) { userModel.value = value; } @@ -123,9 +146,14 @@ class WalletController extends GetxController { paymentStatus: "success", ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction(transactionModel).then(( + value, + ) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: topUpAmountController.value.text, userId: FireStoreUtils.getCurrentUid()).then((value) { + await FireStoreUtils.updateUserWallet( + amount: topUpAmountController.value.text, + userId: FireStoreUtils.getCurrentUid(), + ).then((value) { getWalletTransaction(); Get.back(); }); @@ -139,20 +167,32 @@ class WalletController extends GetxController { Future stripeMakePayment({required String amount}) async { log(double.parse(amount).toStringAsFixed(0)); try { - Map? paymentIntentData = await createStripeIntent(amount: amount); + Map? paymentIntentData = await createStripeIntent( + amount: amount, + ); log("stripe Responce====>$paymentIntentData"); if (paymentIntentData!.containsKey("error")) { Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } else { await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData['client_secret'], allowsDelayedPaymentMethods: false, - googlePay: const PaymentSheetGooglePay(merchantCountryCode: 'US', testEnv: true, currencyCode: "USD"), + googlePay: const PaymentSheetGooglePay( + merchantCountryCode: 'US', + testEnv: true, + currencyCode: "USD", + ), customFlow: true, style: ThemeMode.system, - appearance: PaymentSheetAppearance(colors: PaymentSheetAppearanceColors(primary: AppThemeData.primary300)), + appearance: PaymentSheetAppearance( + colors: PaymentSheetAppearanceColors( + primary: AppThemeData.primary300, + ), + ), merchantDisplayName: 'GoRide', ), ); @@ -198,7 +238,10 @@ class WalletController extends GetxController { var response = await http.post( Uri.parse('https://api.stripe.com/v1/payment_intents'), body: body, - headers: {'Authorization': 'Bearer $stripeSecret', 'Content-Type': 'application/x-www-form-urlencoded'}, + headers: { + 'Authorization': 'Bearer $stripeSecret', + 'Content-Type': 'application/x-www-form-urlencoded', + }, ); return jsonDecode(response.body); @@ -208,8 +251,14 @@ class WalletController extends GetxController { } //mercadoo - Future mercadoPagoMakePayment({required BuildContext context, required String amount}) async { - final headers = {'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', 'Content-Type': 'application/json'}; + Future mercadoPagoMakePayment({ + required BuildContext context, + required String amount, + }) async { + final headers = { + 'Authorization': 'Bearer ${mercadoPagoModel.value.accessToken}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "items": [ @@ -222,11 +271,20 @@ class WalletController extends GetxController { }, ], "payer": {"email": userModel.value.email}, - "back_urls": {"failure": "${Constant.globalUrl}payment/failure", "pending": "${Constant.globalUrl}payment/pending", "success": "${Constant.globalUrl}payment/success"}, - "auto_return": "approved", // Automatically return after payment is approved + "back_urls": { + "failure": "${Constant.globalUrl}payment/failure", + "pending": "${Constant.globalUrl}payment/pending", + "success": "${Constant.globalUrl}payment/success", + }, + "auto_return": + "approved", // Automatically return after payment is approved }); - final response = await http.post(Uri.parse("https://api.mercadopago.com/checkout/preferences"), headers: headers, body: body); + final response = await http.post( + Uri.parse("https://api.mercadopago.com/checkout/preferences"), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); @@ -239,7 +297,9 @@ class WalletController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something want wrong please contact administrator".tr()); + ShowToastDialog.showToast( + "Something want wrong please contact administrator".tr(), + ); print('Error creating preference: ${response.body}'); return null; } @@ -284,9 +344,12 @@ class WalletController extends GetxController { ///PayStack Payment Method Future payStackPayment(String totalAmount) async { - await PayStackURLGen.payStackURLGen(amount: (double.parse(totalAmount) * 100).toString(), currency: "ZAR", secretKey: payStackModel.value.secretKey.toString(), userModel: userModel.value).then(( - value, - ) async { + await PayStackURLGen.payStackURLGen( + amount: (double.parse(totalAmount) * 100).toString(), + currency: "ZAR", + secretKey: payStackModel.value.secretKey.toString(), + userModel: userModel.value, + ).then((value) async { if (value != null) { PayStackUrlModel payStackModel0 = value; Get.to( @@ -306,15 +369,23 @@ class WalletController extends GetxController { } }); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); } }); } //flutter wave Payment Method - Future flutterWaveInitiatePayment({required BuildContext context, required String amount}) async { + Future flutterWaveInitiatePayment({ + required BuildContext context, + required String amount, + }) async { final url = Uri.parse('https://api.flutterwave.com/v3/payments'); - final headers = {'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', 'Content-Type': 'application/json'}; + final headers = { + 'Authorization': 'Bearer ${flutterWaveModel.value.secretKey}', + 'Content-Type': 'application/json', + }; final body = jsonEncode({ "tx_ref": _ref, @@ -327,14 +398,19 @@ class WalletController extends GetxController { "phonenumber": userModel.value.phoneNumber, // Add a real phone number "name": userModel.value.fullName(), // Add a real customer name }, - "customizations": {"title": "Payment for Services", "description": "Payment for XYZ services"}, + "customizations": { + "title": "Payment for Services", + "description": "Payment for XYZ services", + }, }); final response = await http.post(url, headers: headers, body: body); if (response.statusCode == 200) { final data = jsonDecode(response.body); - Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then((value) { + Get.to(MercadoPagoScreen(initialURl: data['data']['link']))!.then(( + value, + ) { if (value) { ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); @@ -363,8 +439,14 @@ class WalletController extends GetxController { // payFast void payFastPayment({required BuildContext context, required String amount}) { - PayStackURLGen.getPayHTML(payFastSettingData: payFastModel.value, amount: amount.toString(), userModel: userModel.value).then((String? value) async { - bool isDone = await Get.to(PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value)); + PayStackURLGen.getPayHTML( + payFastSettingData: payFastModel.value, + amount: amount.toString(), + userModel: userModel.value, + ).then((String? value) async { + bool isDone = await Get.to( + PayFastScreen(htmlData: value!, payFastSettingData: payFastModel.value), + ); if (isDone) { Get.back(); ShowToastDialog.showToast("Payment successfully".tr()); @@ -389,7 +471,10 @@ class WalletController extends GetxController { 'description': 'wallet Topup', 'retry': {'enabled': true, 'max_count': 1}, 'send_sms_hash': true, - 'prefill': {'contact': userModel.value.phoneNumber, 'email': userModel.value.email}, + 'prefill': { + 'contact': userModel.value.phoneNumber, + 'email': userModel.value.email, + }, 'external': { 'wallets': ['paytm'], }, @@ -418,7 +503,10 @@ class WalletController extends GetxController { } //Midtrans payment - Future midtransMakePayment({required String amount, required BuildContext context}) async { + Future midtransMakePayment({ + required String amount, + required BuildContext context, + }) async { await createPaymentLink(amount: amount).then((url) { ShowToastDialog.closeLoader(); if (url != '') { @@ -436,15 +524,30 @@ class WalletController extends GetxController { Future createPaymentLink({required var amount}) async { var ordersId = const Uuid().v1(); - final url = Uri.parse(midTransModel.value.isSandbox! ? 'https://api.sandbox.midtrans.com/v1/payment-links' : 'https://api.midtrans.com/v1/payment-links'); + final url = Uri.parse( + midTransModel.value.isSandbox! + ? 'https://api.sandbox.midtrans.com/v1/payment-links' + : 'https://api.midtrans.com/v1/payment-links', + ); final response = await http.post( url, - headers: {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(midTransModel.value.serverKey!)}, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader( + midTransModel.value.serverKey!, + ), + }, body: jsonEncode({ - 'transaction_details': {'order_id': ordersId, 'gross_amount': double.parse(amount.toString()).toInt()}, + 'transaction_details': { + 'order_id': ordersId, + 'gross_amount': double.parse(amount.toString()).toInt(), + }, 'usage_limit': 2, - "callbacks": {"finish": "https://www.google.com?merchant_order_id=$ordersId"}, + "callbacks": { + "finish": "https://www.google.com?merchant_order_id=$ordersId", + }, }), ); @@ -452,7 +555,9 @@ class WalletController extends GetxController { final responseData = jsonDecode(response.body); return responseData['payment_url']; } else { - ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -469,13 +574,30 @@ class WalletController extends GetxController { static String orderId = ''; static String amount = ''; - Future orangeMakePayment({required String amount, required BuildContext context}) async { + Future orangeMakePayment({ + required String amount, + required BuildContext context, + }) async { reset(); var id = const Uuid().v4(); - var paymentURL = await fetchToken(context: context, orderId: id, amount: amount, currency: 'USD'); + var paymentURL = await fetchToken( + context: context, + orderId: id, + amount: amount, + currency: 'USD', + ); ShowToastDialog.closeLoader(); if (paymentURL.toString() != '') { - Get.to(() => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken))!.then((value) { + Get.to( + () => OrangeMoneyScreen( + initialURl: paymentURL, + accessToken: accessToken, + amount: amount, + orangePay: orangeMoneyModel.value, + orderId: orderId, + payToken: payToken, + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); @@ -486,13 +608,22 @@ class WalletController extends GetxController { } } - Future fetchToken({required String orderId, required String currency, required BuildContext context, required String amount}) async { + Future fetchToken({ + required String orderId, + required String currency, + required BuildContext context, + required String amount, + }) async { String apiUrl = 'https://api.orange.com/oauth/v3/token'; Map requestBody = {'grant_type': 'client_credentials'}; var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': "Basic ${orangeMoneyModel.value.auth!}", 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, + headers: { + 'Authorization': "Basic ${orangeMoneyModel.value.auth!}", + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, body: requestBody, ); @@ -500,17 +631,32 @@ class WalletController extends GetxController { Map responseData = jsonDecode(response.body); accessToken = responseData['access_token']; - return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); + return await webpayment( + context: context, + amountData: amount, + currency: currency, + orderIdData: orderId, + ); } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } - Future webpayment({required String orderIdData, required BuildContext context, required String currency, required String amountData}) async { + Future webpayment({ + required String orderIdData, + required BuildContext context, + required String currency, + required String amountData, + }) async { orderId = orderIdData; amount = amountData; - String apiUrl = orangeMoneyModel.value.isSandbox! == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; + String apiUrl = + orangeMoneyModel.value.isSandbox! == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/webpayment' + : 'https://api.orange.com/orange-money-webpay/cm/v1/webpayment'; Map requestBody = { "merchant_key": orangeMoneyModel.value.merchantKey ?? '', "currency": orangeMoneyModel.value.isSandbox == true ? "OUV" : currency, @@ -525,7 +671,11 @@ class WalletController extends GetxController { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); print(response.statusCode); @@ -541,7 +691,9 @@ class WalletController extends GetxController { return ''; } } else { - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + ShowToastDialog.showToast( + "Something went wrong, please contact admin.".tr(), + ); return ''; } } @@ -558,7 +710,13 @@ class WalletController extends GetxController { await createXenditInvoice(amount: amount).then((model) { ShowToastDialog.closeLoader(); if (model.id != null) { - Get.to(() => XenditScreen(initialURl: model.invoiceUrl ?? '', transId: model.id ?? '', apiKey: xenditModel.value.apiKey!.toString()))!.then((value) { + Get.to( + () => XenditScreen( + initialURl: model.invoiceUrl ?? '', + transId: model.id ?? '', + apiKey: xenditModel.value.apiKey!.toString(), + ), + )!.then((value) { if (value == true) { ShowToastDialog.showToast("Payment Successful!!".tr()); walletTopUp(); @@ -574,7 +732,9 @@ class WalletController extends GetxController { const url = 'https://api.xendit.co/v2/invoices'; var headers = { 'Content-Type': 'application/json', - 'Authorization': generateBasicAuthHeader(xenditModel.value.apiKey!.toString()), + 'Authorization': generateBasicAuthHeader( + xenditModel.value.apiKey!.toString(), + ), // 'Cookie': '__cf_bm=yERkrx3xDITyFGiou0bbKY1bi7xEwovHNwxV1vCNbVc-1724155511-1.0.1.1-jekyYQmPCwY6vIJ524K0V6_CEw6O.dAwOmQnHtwmaXO_MfTrdnmZMka0KZvjukQgXu5B.K_6FJm47SGOPeWviQ', }; @@ -587,7 +747,11 @@ class WalletController extends GetxController { }); try { - final response = await http.post(Uri.parse(url), headers: headers, body: body); + final response = await http.post( + Uri.parse(url), + headers: headers, + body: body, + ); if (response.statusCode == 200 || response.statusCode == 201) { XenditModel model = XenditModel.fromJson(jsonDecode(response.body)); diff --git a/lib/main.dart b/lib/main.dart index bc48340..94ab4a6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,6 +13,8 @@ import 'controllers/global_setting_controller.dart'; import 'controllers/theme_controller.dart'; import 'firebase_options.dart'; + + void main() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); diff --git a/lib/payment/MercadoPagoScreen.dart b/lib/payment/MercadoPagoScreen.dart index f296a79..432e62c 100644 --- a/lib/payment/MercadoPagoScreen.dart +++ b/lib/payment/MercadoPagoScreen.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:customer/constant/constant.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class MercadoPagoScreen extends StatefulWidget { @@ -36,10 +36,17 @@ class _MercadoPagoScreenState extends State { onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest navigation) async { debugPrint("--->2 ${navigation.url}"); - if (navigation.url.contains("${Constant.globalUrl}payment/success")) { + if (navigation.url.contains( + "${Constant.globalUrl}payment/success", + )) { Get.back(result: true); } - if (navigation.url.contains("${Constant.globalUrl}payment/failure") || navigation.url.contains("${Constant.globalUrl}payment/pending")) { + if (navigation.url.contains( + "${Constant.globalUrl}payment/failure", + ) || + navigation.url.contains( + "${Constant.globalUrl}payment/pending", + )) { Get.back(result: false); } return NavigationDecision.navigate; @@ -82,14 +89,20 @@ class _MercadoPagoScreenState extends State { content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), + child: Text( + 'Cancel'.tr(), + style: const TextStyle(color: Colors.red), + ), onPressed: () { Navigator.of(context).pop(); Get.back(result: false); }, ), TextButton( - child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), + child: Text( + 'Continue'.tr(), + style: const TextStyle(color: Colors.green), + ), onPressed: () { Navigator.of(context).pop(); }, diff --git a/lib/payment/PayFastScreen.dart b/lib/payment/PayFastScreen.dart index 5b24b4e..d1cd451 100644 --- a/lib/payment/PayFastScreen.dart +++ b/lib/payment/PayFastScreen.dart @@ -6,14 +6,18 @@ import 'package:customer/models/payment_model/pay_fast_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class PayFastScreen extends StatefulWidget { final String htmlData; final PayFastModel payFastSettingData; - const PayFastScreen({super.key, required this.htmlData, required this.payFastSettingData}); + const PayFastScreen({ + super.key, + required this.htmlData, + required this.payFastSettingData, + }); @override State createState() => _PayFastScreenState(); @@ -45,9 +49,11 @@ class _PayFastScreenState extends State { } if (navigation.url == widget.payFastSettingData.returnUrl) { Get.back(result: true); - } else if (navigation.url == widget.payFastSettingData.notifyUrl) { + } else if (navigation.url == + widget.payFastSettingData.notifyUrl) { Get.back(result: false); - } else if (navigation.url == widget.payFastSettingData.cancelUrl) { + } else if (navigation.url == + widget.payFastSettingData.cancelUrl) { _showMyDialog(); } return NavigationDecision.navigate; @@ -95,7 +101,10 @@ class _PayFastScreenState extends State { }, ), TextButton( - child: Text('Continue Payment'.tr(), style: TextStyle(color: Colors.green)), + child: Text( + 'Continue Payment'.tr(), + style: TextStyle(color: Colors.green), + ), onPressed: () { Get.back(); }, diff --git a/lib/payment/midtrans_screen.dart b/lib/payment/midtrans_screen.dart index 7336b51..9c6c6c2 100644 --- a/lib/payment/midtrans_screen.dart +++ b/lib/payment/midtrans_screen.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class MidtransScreen extends StatefulWidget { @@ -48,7 +48,10 @@ class _MidtransScreenState extends State { Get.back(result: false); } } else { - String? orderId = Uri.parse(navigation.url).queryParameters['merchant_order_id']; + String? orderId = + Uri.parse( + navigation.url, + ).queryParameters['merchant_order_id']; if (orderId != null) { Get.back(result: true); } else { @@ -81,7 +84,16 @@ class _MidtransScreenState extends State { child: const Icon(Icons.arrow_back, color: Colors.white), ), ), - body: Stack(alignment: Alignment.center, children: [WebViewWidget(controller: controller), Visibility(visible: isLoading, child: const Center(child: CircularProgressIndicator()))]), + body: Stack( + alignment: Alignment.center, + children: [ + WebViewWidget(controller: controller), + Visibility( + visible: isLoading, + child: const Center(child: CircularProgressIndicator()), + ), + ], + ), ), ); } @@ -96,14 +108,20 @@ class _MidtransScreenState extends State { content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), + child: Text( + 'Cancel'.tr(), + style: const TextStyle(color: Colors.red), + ), onPressed: () { Get.back(result: false); Get.back(result: false); }, ), TextButton( - child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), + child: Text( + 'Continue'.tr(), + style: const TextStyle(color: Colors.green), + ), onPressed: () { Get.back(result: false); }, diff --git a/lib/payment/orangePayScreen.dart b/lib/payment/orangePayScreen.dart index 47e0f6b..7d2bbd7 100644 --- a/lib/payment/orangePayScreen.dart +++ b/lib/payment/orangePayScreen.dart @@ -5,7 +5,7 @@ import 'dart:convert'; import 'package:customer/models/payment_model/orange_money.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:webview_flutter/webview_flutter.dart'; @@ -17,7 +17,15 @@ class OrangeMoneyScreen extends StatefulWidget { String orderId = ''; String amount = ''; - OrangeMoneyScreen({super.key, required this.initialURl, required this.orangePay, required this.accessToken, required this.payToken, required this.orderId, required this.amount}); + OrangeMoneyScreen({ + super.key, + required this.initialURl, + required this.orangePay, + required this.accessToken, + required this.payToken, + required this.orderId, + required this.amount, + }); @override State createState() => _OrangeMoneyScreenState(); @@ -41,7 +49,12 @@ class _OrangeMoneyScreenState extends State { timer = Timer.periodic(const Duration(seconds: 3), (Timer t) async { if (!mounted) return; - String status = await transactionStatus(accessToken: widget.accessToken, amount: widget.amount, orderId: widget.orderId, payToken: widget.payToken); + String status = await transactionStatus( + accessToken: widget.accessToken, + amount: widget.amount, + orderId: widget.orderId, + payToken: widget.payToken, + ); if (status == 'SUCCESS') { timer?.cancel(); @@ -72,15 +85,31 @@ class _OrangeMoneyScreenState extends State { ..loadRequest(Uri.parse(widget.initialURl)); } - Future transactionStatus({required String orderId, required String amount, required String payToken, required String accessToken}) async { - String apiUrl = widget.orangePay.isSandbox == true ? 'https://api.orange.com/orange-money-webpay/dev/v1/transactionstatus' : 'https://api.orange.com/orange-money-webpay/cm/v1/transactionstatus'; + Future transactionStatus({ + required String orderId, + required String amount, + required String payToken, + required String accessToken, + }) async { + String apiUrl = + widget.orangePay.isSandbox == true + ? 'https://api.orange.com/orange-money-webpay/dev/v1/transactionstatus' + : 'https://api.orange.com/orange-money-webpay/cm/v1/transactionstatus'; - Map requestBody = {"order_id": orderId, "amount": amount, "pay_token": payToken}; + Map requestBody = { + "order_id": orderId, + "amount": amount, + "pay_token": payToken, + }; try { var response = await http.post( Uri.parse(apiUrl), - headers: {'Authorization': 'Bearer $accessToken', 'Content-Type': 'application/json', 'Accept': 'application/json'}, + headers: { + 'Authorization': 'Bearer $accessToken', + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, body: json.encode(requestBody), ); @@ -107,10 +136,16 @@ class _OrangeMoneyScreenState extends State { child: Scaffold( appBar: AppBar( backgroundColor: Colors.black, - leading: IconButton(icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: _showCancelDialog), + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: _showCancelDialog, + ), title: Text('Orange Money Payment'.tr()), ), - body: isLoading ? const Center(child: CircularProgressIndicator()) : WebViewWidget(controller: controller), + body: + isLoading + ? const Center(child: CircularProgressIndicator()) + : WebViewWidget(controller: controller), ), ); } @@ -124,9 +159,12 @@ class _OrangeMoneyScreenState extends State { title: Text('Cancel Payment'.tr()), content: Text('Are you sure you want to cancel this payment?'.tr()), actions: [ - TextButton(child: Text('No', style: TextStyle(color: Colors.green)), onPressed: () => Get.back()), TextButton( - child: Text('Yes'.tr(), style: TextStyle(color: Colors.red)), + child: Text('No', style: TextStyle(color: Colors.green)), + onPressed: () => Get.back(), + ), + TextButton( + child: Text('Yes'.tr(), style: TextStyle(color: Colors.red)), onPressed: () { timer?.cancel(); Get.back(); // close dialog @@ -152,8 +190,7 @@ class _OrangeMoneyScreenState extends State { // import 'dart:convert'; // import 'package:customer/models/payment_model/orange_money.dart'; // import 'package:flutter/material.dart'; -// import 'package:get/get.dart'; -// import 'package:http/http.dart' as http; +// import 'package:get/get.dart' hide Trans;// import 'package:http/http.dart' as http; // import 'package:webview_flutter/webview_flutter.dart'; // // class OrangeMoneyScreen extends StatefulWidget { diff --git a/lib/payment/paystack/pay_stack_screen.dart b/lib/payment/paystack/pay_stack_screen.dart index d33d2b4..51d3854 100644 --- a/lib/payment/paystack/pay_stack_screen.dart +++ b/lib/payment/paystack/pay_stack_screen.dart @@ -4,7 +4,7 @@ import 'package:customer/payment/paystack/paystack_url_genrater.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:webview_flutter/webview_flutter.dart'; class PayStackScreen extends StatefulWidget { @@ -14,7 +14,14 @@ class PayStackScreen extends StatefulWidget { final String secretKey; final String callBackUrl; - const PayStackScreen({super.key, required this.initialURl, required this.reference, required this.amount, required this.secretKey, required this.callBackUrl}); + const PayStackScreen({ + super.key, + required this.initialURl, + required this.reference, + required this.amount, + required this.secretKey, + required this.callBackUrl, + }); @override State createState() => _PayStackScreenState(); @@ -30,37 +37,52 @@ class _PayStackScreenState extends State { } void initController() { - controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setBackgroundColor(const Color(0x00000000)) - ..setNavigationDelegate( - NavigationDelegate( - onProgress: (int progress) { - // Update loading bar. - }, - onPageStarted: (String url) {}, - onPageFinished: (String url) {}, - onWebResourceError: (WebResourceError error) {}, - onNavigationRequest: (NavigationRequest navigation) async { - debugPrint("--->2${navigation.url}"); - debugPrint("--->2" "${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}"); - if (navigation.url == 'https://foodieweb.siswebapp.com/success?trxref=${widget.reference}&reference=${widget.reference}' || - navigation.url == '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') { - final isDone = await PayStackURLGen.verifyTransaction(secretKey: widget.secretKey, reference: widget.reference, amount: widget.amount); - Get.back(result: isDone); - } - if ((navigation.url == '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') || - (navigation.url == "https://hello.pstk.xyz/callback") || - (navigation.url == 'https://standard.paystack.co/close') || - (navigation.url == 'https://talazo.app/login')) { - final isDone = await PayStackURLGen.verifyTransaction(secretKey: widget.secretKey, reference: widget.reference, amount: widget.amount); - Get.back(result: isDone); - } - return NavigationDecision.navigate; - }, - ), - ) - ..loadRequest(Uri.parse(widget.initialURl)); + controller = + WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) {}, + onPageFinished: (String url) {}, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest navigation) async { + debugPrint("--->2${navigation.url}"); + debugPrint( + "--->2" + "${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}", + ); + if (navigation.url == + 'https://foodieweb.siswebapp.com/success?trxref=${widget.reference}&reference=${widget.reference}' || + navigation.url == + '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') { + final isDone = await PayStackURLGen.verifyTransaction( + secretKey: widget.secretKey, + reference: widget.reference, + amount: widget.amount, + ); + Get.back(result: isDone); + } + if ((navigation.url == + '${widget.callBackUrl}?trxref=${widget.reference}&reference=${widget.reference}') || + (navigation.url == "https://hello.pstk.xyz/callback") || + (navigation.url == 'https://standard.paystack.co/close') || + (navigation.url == 'https://talazo.app/login')) { + final isDone = await PayStackURLGen.verifyTransaction( + secretKey: widget.secretKey, + reference: widget.reference, + amount: widget.amount, + ); + Get.back(result: isDone); + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.initialURl)); } @override @@ -72,17 +94,16 @@ class _PayStackScreenState extends State { }, child: Scaffold( appBar: AppBar( - backgroundColor: AppThemeData.grey50, - title: Text("Payment".tr()), - centerTitle: false, - leading: GestureDetector( - onTap: () { - _showMyDialog(); - }, - child: const Icon( - Icons.arrow_back, - ), - )), + backgroundColor: AppThemeData.grey50, + title: Text("Payment".tr()), + centerTitle: false, + leading: GestureDetector( + onTap: () { + _showMyDialog(); + }, + child: const Icon(Icons.arrow_back), + ), + ), body: WebViewWidget(controller: controller), ), ); @@ -95,15 +116,10 @@ class _PayStackScreenState extends State { builder: (BuildContext context) { return AlertDialog( title: const Text('Cancel Payment'), - content: const SingleChildScrollView( - child: Text("cancelPayment?"), - ), + content: const SingleChildScrollView(child: Text("cancelPayment?")), actions: [ TextButton( - child: const Text( - 'Cancel', - style: TextStyle(color: Colors.red), - ), + child: const Text('Cancel', style: TextStyle(color: Colors.red)), onPressed: () { Navigator.of(context).pop(); Navigator.of(context).pop(false); diff --git a/lib/payment/xenditScreen.dart b/lib/payment/xenditScreen.dart index b3ace2b..0f3b178 100644 --- a/lib/payment/xenditScreen.dart +++ b/lib/payment/xenditScreen.dart @@ -5,7 +5,7 @@ import 'dart:developer'; import 'package:customer/payment/xenditModel.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import 'package:webview_flutter/webview_flutter.dart'; @@ -14,7 +14,12 @@ class XenditScreen extends StatefulWidget { final String transId; final String apiKey; - const XenditScreen({super.key, required this.initialURl, required this.transId, required this.apiKey}); + const XenditScreen({ + super.key, + required this.initialURl, + required this.transId, + required this.apiKey, + }); @override State createState() => _XenditScreenState(); @@ -102,7 +107,16 @@ class _XenditScreenState extends State { child: const Icon(Icons.arrow_back, color: Colors.white), ), ), - body: Stack(alignment: Alignment.center, children: [WebViewWidget(controller: controller), Visibility(visible: isLoading, child: const Center(child: CircularProgressIndicator()))]), + body: Stack( + alignment: Alignment.center, + children: [ + WebViewWidget(controller: controller), + Visibility( + visible: isLoading, + child: const Center(child: CircularProgressIndicator()), + ), + ], + ), ), ); } @@ -117,14 +131,20 @@ class _XenditScreenState extends State { content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), actions: [ TextButton( - child: Text('Cancel'.tr(), style: const TextStyle(color: Colors.red)), + child: Text( + 'Cancel'.tr(), + style: const TextStyle(color: Colors.red), + ), onPressed: () { Navigator.of(context).pop(false); Navigator.of(context).pop(false); }, ), TextButton( - child: Text('Continue'.tr(), style: const TextStyle(color: Colors.green)), + child: Text( + 'Continue'.tr(), + style: const TextStyle(color: Colors.green), + ), onPressed: () { Navigator.of(context).pop(false); }, @@ -140,7 +160,10 @@ class _XenditScreenState extends State { var url = Uri.parse('https://api.xendit.co/v2/invoices/$paymentId'); // Headers - var headers = {'Content-Type': 'application/json', 'Authorization': generateBasicAuthHeader(widget.apiKey.toString())}; + var headers = { + 'Content-Type': 'application/json', + 'Authorization': generateBasicAuthHeader(widget.apiKey.toString()), + }; // Making the POST request var response = await http.get(url, headers: headers); diff --git a/lib/screen_ui/auth_screens/forgot_password_screen.dart b/lib/screen_ui/auth_screens/forgot_password_screen.dart index 894fed1..e1ab3ad 100644 --- a/lib/screen_ui/auth_screens/forgot_password_screen.dart +++ b/lib/screen_ui/auth_screens/forgot_password_screen.dart @@ -3,7 +3,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/forgot_password_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; diff --git a/lib/screen_ui/auth_screens/login_screen.dart b/lib/screen_ui/auth_screens/login_screen.dart index 24e3116..620ffc7 100644 --- a/lib/screen_ui/auth_screens/login_screen.dart +++ b/lib/screen_ui/auth_screens/login_screen.dart @@ -13,7 +13,7 @@ import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; import '../../themes/round_button_fill.dart'; import '../../themes/text_field_widget.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'forgot_password_screen.dart'; import 'mobile_login_screen.dart'; @@ -72,8 +72,7 @@ class LoginScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - ConstTexts.loginToExplore.tr() - , + ConstTexts.loginToExplore.tr(), style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -143,7 +142,7 @@ class LoginScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.login.tr(), onPress: controller.loginWithEmail, color: @@ -218,7 +217,7 @@ class LoginScreen extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.withGoogle.tr(), textColor: isDark @@ -242,7 +241,7 @@ class LoginScreen extends StatelessWidget { Platform.isIOS ? Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.withApple.tr(), isCenter: true, textColor: diff --git a/lib/screen_ui/auth_screens/mobile_login_screen.dart b/lib/screen_ui/auth_screens/mobile_login_screen.dart index 9d1164c..7a04934 100644 --- a/lib/screen_ui/auth_screens/mobile_login_screen.dart +++ b/lib/screen_ui/auth_screens/mobile_login_screen.dart @@ -7,7 +7,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/assets.dart'; import '../../constant/constant.dart'; import '../../controllers/mobile_login_controller.dart'; diff --git a/lib/screen_ui/auth_screens/otp_verification_screen.dart b/lib/screen_ui/auth_screens/otp_verification_screen.dart index 7a62a97..251e952 100644 --- a/lib/screen_ui/auth_screens/otp_verification_screen.dart +++ b/lib/screen_ui/auth_screens/otp_verification_screen.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:pin_code_fields/pin_code_fields.dart'; import '../../constant/assets.dart'; import '../../controllers/otp_verification_controller.dart'; diff --git a/lib/screen_ui/auth_screens/sign_up_screen.dart b/lib/screen_ui/auth_screens/sign_up_screen.dart index 51fc91c..9ea4b1f 100644 --- a/lib/screen_ui/auth_screens/sign_up_screen.dart +++ b/lib/screen_ui/auth_screens/sign_up_screen.dart @@ -13,7 +13,7 @@ import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; import '../../themes/round_button_fill.dart'; import '../../themes/text_field_widget.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'login_screen.dart'; import 'mobile_login_screen.dart'; diff --git a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart index 45d7169..33fcf94 100644 --- a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart @@ -19,7 +19,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart' as get_cord_address; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:latlong2/latlong.dart' as latlong; @@ -59,19 +59,57 @@ class IntercityHomeScreen extends StatelessWidget { options: flutterMap.MapOptions( initialCenter: Constant.currentLocation != null - ? latlong.LatLng(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude) + ? latlong.LatLng( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ) : controller.currentOrder.value.id != null ? latlong.LatLng( - double.parse(controller.currentOrder.value.sourceLocation!.latitude.toString()), - double.parse(controller.currentOrder.value.sourceLocation!.longitude.toString()), + double.parse( + controller + .currentOrder + .value + .sourceLocation! + .latitude + .toString(), + ), + double.parse( + controller + .currentOrder + .value + .sourceLocation! + .longitude + .toString(), + ), ) - : latlong.LatLng(41.4219057, -102.0840772), + : latlong.LatLng( + 41.4219057, + -102.0840772, + ), initialZoom: 14, ), children: [ - flutterMap.TileLayer(urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: Platform.isAndroid ? "com.emart" : "com.emart.ios"), - flutterMap.MarkerLayer(markers: controller.osmMarker), - if (controller.routePoints.isNotEmpty) flutterMap.PolylineLayer(polylines: [flutterMap.Polyline(points: controller.routePoints, strokeWidth: 5.0, color: Colors.blue)]), + flutterMap.TileLayer( + urlTemplate: + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: + Platform.isAndroid + ? "com.emart" + : "com.emart.ios", + ), + flutterMap.MarkerLayer( + markers: controller.osmMarker, + ), + if (controller.routePoints.isNotEmpty) + flutterMap.PolylineLayer( + polylines: [ + flutterMap.Polyline( + points: controller.routePoints, + strokeWidth: 5.0, + color: Colors.blue, + ), + ], + ), ], ) : GoogleMap( @@ -79,16 +117,26 @@ class IntercityHomeScreen extends StatelessWidget { controller.mapController = googleMapController; if (Constant.currentLocation != null) { - controller.setDepartureMarker(Constant.currentLocation!.latitude, Constant.currentLocation!.longitude); + controller.setDepartureMarker( + Constant.currentLocation!.latitude, + Constant.currentLocation!.longitude, + ); controller.searchPlaceNameGoogle(); } }, - initialCameraPosition: CameraPosition(target: controller.currentPosition.value, zoom: 14), + initialCameraPosition: CameraPosition( + target: controller.currentPosition.value, + zoom: 14, + ), myLocationEnabled: true, zoomControlsEnabled: true, zoomGesturesEnabled: true, - polylines: Set.of(controller.polyLines.values), - markers: controller.markers.toSet(), // reactive marker set + polylines: Set.of( + controller.polyLines.values, + ), + markers: + controller.markers + .toSet(), // reactive marker set ), Positioned( top: 50, @@ -96,36 +144,64 @@ class IntercityHomeScreen extends StatelessWidget { right: Constant.isRtl ? 20 : null, child: InkWell( onTap: () { - if (controller.bottomSheetType.value == "vehicleSelection") { + if (controller.bottomSheetType.value == + "vehicleSelection") { controller.bottomSheetType.value = "location"; - } else if (controller.bottomSheetType.value == "payment") { - controller.bottomSheetType.value = "vehicleSelection"; - } else if (controller.bottomSheetType.value == "conformRide") { + } else if (controller.bottomSheetType.value == + "payment") { + controller.bottomSheetType.value = + "vehicleSelection"; + } else if (controller.bottomSheetType.value == + "conformRide") { controller.bottomSheetType.value = "payment"; - } else if (controller.bottomSheetType.value == "waitingDriver" || controller.bottomSheetType.value == "driverDetails") { + } else if (controller.bottomSheetType.value == + "waitingDriver" || + controller.bottomSheetType.value == + "driverDetails") { Get.back(result: true); } else { Get.back(); } }, child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + borderRadius: BorderRadius.circular(30), + ), child: Padding( padding: const EdgeInsets.all(10), - child: Center(child: Icon(Icons.arrow_back_ios_new, size: 20, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50)), + child: Center( + child: Icon( + Icons.arrow_back_ios_new, + size: 20, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.greyDark50, + ), + ), ), ), ), ), controller.bottomSheetType.value == "location" - ? searchLocationBottomSheet(context, controller, isDark) - : controller.bottomSheetType.value == "vehicleSelection" + ? searchLocationBottomSheet( + context, + controller, + isDark, + ) + : controller.bottomSheetType.value == + "vehicleSelection" ? vehicleSelection(context, controller, isDark) : controller.bottomSheetType.value == "payment" ? paymentBottomSheet(context, controller, isDark) : controller.bottomSheetType.value == "conformRide" ? conformBottomSheet(context, isDark) - : controller.bottomSheetType.value == "waitingForDriver" + : controller.bottomSheetType.value == + "waitingForDriver" ? waitingDialog(context, controller, isDark) : controller.bottomSheetType.value == "driverDetails" ? driverDialog(context, controller, isDark) @@ -137,7 +213,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget searchLocationBottomSheet(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget searchLocationBottomSheet( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.48, @@ -147,16 +227,29 @@ class IntercityHomeScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.all(16), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(35))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(35)), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), SizedBox(height: 10), Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -164,40 +257,82 @@ class IntercityHomeScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); - controller.sourceTextEditController.value.text = ''; + final result = await Get.to( + () => MapPickerPage(), + ); + controller.sourceTextEditController.value.text = + ''; final firstPlace = result; if (result != null) { - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.sourceTextEditController.value.text = address.toString(); + controller + .sourceTextEditController + .value + .text = address.toString(); controller.setDepartureMarker(lat, lng); } else { - ShowToastDialog.showToast(ConstTexts.serviceIsUnavailable.tr()); + ShowToastDialog.showToast( + ConstTexts.serviceIsUnavailable.tr(), + ); } } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDepartureMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + if (Constant.checkZoneCheck( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ) == + true) { + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.setDepartureMarker( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } else { - ShowToastDialog.showToast(ConstTexts.serviceIsUnavailable.tr()); + ShowToastDialog.showToast( + ConstTexts.serviceIsUnavailable.tr(), + ); } } }); } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller.sourceTextEditController.value, hintText: ConstTexts.pickUpLocation.tr(), enable: false, - prefix: Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Image.asset("assets/icons/pickup.png", height: 22, width: 22)), + prefix: Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Image.asset( + "assets/icons/pickup.png", + height: 22, + width: 22, + ), + ), ), ), const SizedBox(height: 10), @@ -205,34 +340,62 @@ class IntercityHomeScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.destinationTextEditController.value.text = ''; + controller + .destinationTextEditController + .value + .text = ''; final firstPlace = result; final lat = firstPlace.coordinates.latitude; final lng = firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.destinationTextEditController.value.text = address.toString(); + controller + .destinationTextEditController + .value + .text = address.toString(); controller.setDestinationMarker(lat, lng); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.destinationTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDestinationMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .destinationTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.setDestinationMarker( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: ConstTexts.destinationLocation.tr(), enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -258,7 +421,16 @@ class IntercityHomeScreen extends StatelessWidget { ], ), SizedBox(height: 15), - Align(alignment: Alignment.centerLeft, child: Text(ConstTexts.popularDestinations.tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: AppThemeData.grey900))), + Align( + alignment: Alignment.centerLeft, + child: Text( + ConstTexts.popularDestinations.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: AppThemeData.grey900, + ), + ), + ), SizedBox( height: 120, child: Padding( @@ -269,22 +441,62 @@ class IntercityHomeScreen extends StatelessWidget { itemBuilder: (context, index) { return InkWell( onTap: () async { - if (controller.popularDestination[index].latitude != null || controller.popularDestination[index].longitude != null) { - List placeMarks = await get_cord_address.placemarkFromCoordinates( - controller.popularDestination[index].latitude ?? 0.0, - controller.popularDestination[index].longitude ?? 0.0, - ); + if (controller.popularDestination[index].latitude != + null || + controller + .popularDestination[index] + .longitude != + null) { + List placeMarks = + await get_cord_address + .placemarkFromCoordinates( + controller + .popularDestination[index] + .latitude ?? + 0.0, + controller + .popularDestination[index] + .longitude ?? + 0.0, + ); final address = - (placeMarks.first.subLocality!.isEmpty ? '' : "${placeMarks.first.subLocality}, ") + - (placeMarks.first.street!.isEmpty ? '' : "${placeMarks.first.street}, ") + - (placeMarks.first.name!.isEmpty ? '' : "${placeMarks.first.name}, ") + - (placeMarks.first.subAdministrativeArea!.isEmpty ? '' : "${placeMarks.first.subAdministrativeArea}, ") + - (placeMarks.first.administrativeArea!.isEmpty ? '' : "${placeMarks.first.administrativeArea}, ") + - (placeMarks.first.country!.isEmpty ? '' : "${placeMarks.first.country}, ") + - (placeMarks.first.postalCode!.isEmpty ? '' : "${placeMarks.first.postalCode}, "); - controller.destinationTextEditController.value.text = address; - controller.setDestinationMarker(controller.popularDestination[index].latitude ?? 0.0, controller.popularDestination[index].longitude ?? 0.0); + (placeMarks.first.subLocality!.isEmpty + ? '' + : "${placeMarks.first.subLocality}, ") + + (placeMarks.first.street!.isEmpty + ? '' + : "${placeMarks.first.street}, ") + + (placeMarks.first.name!.isEmpty + ? '' + : "${placeMarks.first.name}, ") + + (placeMarks + .first + .subAdministrativeArea! + .isEmpty + ? '' + : "${placeMarks.first.subAdministrativeArea}, ") + + (placeMarks.first.administrativeArea!.isEmpty + ? '' + : "${placeMarks.first.administrativeArea}, ") + + (placeMarks.first.country!.isEmpty + ? '' + : "${placeMarks.first.country}, ") + + (placeMarks.first.postalCode!.isEmpty + ? '' + : "${placeMarks.first.postalCode}, "); + controller + .destinationTextEditController + .value + .text = address; + controller.setDestinationMarker( + controller.popularDestination[index].latitude ?? + 0.0, + controller + .popularDestination[index] + .longitude ?? + 0.0, + ); } }, child: Padding( @@ -293,24 +505,65 @@ class IntercityHomeScreen extends StatelessWidget { children: [ CachedNetworkImage( imageUrl: - (controller.popularDestination[index].image != null && controller.popularDestination[index].image!.isNotEmpty) - ? controller.popularDestination[index].image! + (controller + .popularDestination[index] + .image != + null && + controller + .popularDestination[index] + .image! + .isNotEmpty) + ? controller + .popularDestination[index] + .image! : Constant.placeHolderImage, height: 160, width: 120, imageBuilder: - (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), + (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), errorWidget: - (context, url, error) => - ClipRRect(borderRadius: BorderRadius.circular(10), child: Image.network(Constant.placeHolderImage, fit: BoxFit.cover, cacheHeight: 80, cacheWidth: 80)), + (context, url, error) => ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + cacheHeight: 80, + cacheWidth: 80, + ), + ), fit: BoxFit.cover, ), Positioned( left: 5, top: 80, - child: Text(controller.popularDestination[index].title.toString(), style: AppThemeData.boldTextStyle(fontSize: 15, color: AppThemeData.surface)), + child: Text( + controller.popularDestination[index].title + .toString(), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: AppThemeData.surface, + ), + ), ), ], ), @@ -322,13 +575,25 @@ class IntercityHomeScreen extends StatelessWidget { ), SizedBox(height: 10), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.continueT.tr(), onPress: () { - if (controller.sourceTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectSourceLocation.tr()); - } else if (controller.destinationTextEditController.value.text.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectDestinationLocations.tr()); + if (controller + .sourceTextEditController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + ConstTexts.plsSelectSourceLocation.tr(), + ); + } else if (controller + .destinationTextEditController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + ConstTexts.plsSelectDestinationLocations.tr(), + ); } else { controller.bottomSheetType.value = "vehicleSelection"; } @@ -344,7 +609,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget vehicleSelection(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget vehicleSelection( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.40, @@ -353,20 +622,42 @@ class IntercityHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Align( alignment: Alignment.topLeft, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Text( - ConstTexts.selectVehicleType.tr(), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.selectVehicleType.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), textAlign: TextAlign.start, ), ), @@ -379,11 +670,13 @@ class IntercityHomeScreen extends StatelessWidget { controller: scrollController, scrollDirection: Axis.vertical, itemBuilder: (context, index) { - VehicleType vehicleType = controller.vehicleTypes[index]; + VehicleType vehicleType = + controller.vehicleTypes[index]; return Obx( () => InkWell( onTap: () { - controller.selectedVehicleType.value = controller.vehicleTypes[index]; + controller.selectedVehicleType.value = + controller.vehicleTypes[index]; }, child: Padding( padding: const EdgeInsets.only(bottom: 10), @@ -393,60 +686,130 @@ class IntercityHomeScreen extends StatelessWidget { border: Border.all( color: isDark - ? controller.selectedVehicleType.value.id == vehicleType.id + ? controller + .selectedVehicleType + .value + .id == + vehicleType.id ? Colors.white : AppThemeData.grey500 - : controller.selectedVehicleType.value.id == vehicleType.id + : controller + .selectedVehicleType + .value + .id == + vehicleType.id ? AppThemeData.grey300 : Colors.transparent, width: 1, ), color: - controller.selectedVehicleType.value.id == vehicleType.id + controller.selectedVehicleType.value.id == + vehicleType.id ? AppThemeData.grey50 : isDark ? AppThemeData.grey300 : Colors.white, ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( children: [ ClipRRect( //borderRadius: BorderRadius.circular(10), child: CachedNetworkImage( - imageUrl: vehicleType.vehicleIcon.toString(), + imageUrl: + vehicleType.vehicleIcon + .toString(), height: 60, width: 60, imageBuilder: (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => ClipRRect(borderRadius: BorderRadius.circular(20), child: Image.network(Constant.userPlaceHolder, fit: BoxFit.cover)), + Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + (context, url, error) => + ClipRRect( + borderRadius: + BorderRadius.circular( + 20, + ), + child: Image.network( + Constant.userPlaceHolder, + fit: BoxFit.cover, + ), + ), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${vehicleType.name} | ${controller.distance.toStringAsFixed(2)}km", - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 1, + ), ), Padding( - padding: const EdgeInsets.only(top: 2.0), - child: Text(controller.duration.value, style: const TextStyle(fontWeight: FontWeight.w400, letterSpacing: 1)), + padding: const EdgeInsets.only( + top: 2.0, + ), + child: Text( + controller.duration.value, + style: const TextStyle( + fontWeight: FontWeight.w400, + letterSpacing: 1, + ), + ), ), ], ), ), ), Text( - Constant.amountShow(amount: controller.getAmount(vehicleType).toString()), - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1), + Constant.amountShow( + amount: + controller + .getAmount(vehicleType) + .toString(), + ), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 1, + ), ), ], ), @@ -460,13 +823,17 @@ class IntercityHomeScreen extends StatelessWidget { ), Obx( () => RoundedButtonFill( - borderRadius: 10.r, - title: 'pay_amount'.trParams({ - 'amount': - controller.selectedVehicleType.value.id == null - ? Constant.amountShow(amount: "0.0") - : Constant.amountShow(amount: controller.getAmount(controller.selectedVehicleType.value).toString()), - }), + borderRadius: 10.r, + title: 'pay_amount'.tr(namedArgs: { + 'amount': controller.selectedVehicleType.value.id == null + ? Constant.amountShow(amount: "0.0") + : Constant.amountShow( + amount: controller + .getAmount(controller.selectedVehicleType.value) + .toString(), + ), +}), + // title: // "Pay ${controller.selectedVehicleType.value.id == null ? Constant.amountShow(amount: "0.0") : Constant.amountShow(amount: controller.getAmount(controller.selectedVehicleType.value).toString())}", onPress: () async { @@ -474,7 +841,9 @@ class IntercityHomeScreen extends StatelessWidget { controller.calculateTotalAmount(); controller.bottomSheetType.value = "payment"; } else { - ShowToastDialog.showToast(ConstTexts.plsSelectVehicleTypeFirst.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectVehicleTypeFirst.tr(), + ); } }, color: AppThemeData.primary300, @@ -490,7 +859,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget paymentBottomSheet(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.70, @@ -500,19 +873,37 @@ class IntercityHomeScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.selectPaymentMethod.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + ConstTexts.selectPaymentMethod.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); }, - child: Icon(Icons.close, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + child: Icon( + Icons.close, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -522,32 +913,82 @@ class IntercityHomeScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text(ConstTexts.prefferedPayment.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.prefferedPayment.tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -555,7 +996,13 @@ class IntercityHomeScreen extends StatelessWidget { Text( ConstTexts.otherPaymentOptions.tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -563,32 +1010,136 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller + .mercadoPagoModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller + .flutterWaveModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -598,19 +1149,24 @@ class IntercityHomeScreen extends StatelessWidget { ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.continueT.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); return; } if (controller.selectedPaymentMethod.value == "wallet") { - num walletAmount = controller.userModel.value.walletAmount ?? 0; + num walletAmount = + controller.userModel.value.walletAmount ?? 0; if (walletAmount <= 0) { - ShowToastDialog.showToast(ConstTexts.insufficientWallet.tr()); + ShowToastDialog.showToast( + ConstTexts.insufficientWallet.tr(), + ); return; } } @@ -657,13 +1213,29 @@ class IntercityHomeScreen extends StatelessWidget { init: IntercityHomeController(), builder: (controller) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Expanded( child: ListView( controller: scrollController, @@ -673,75 +1245,178 @@ class IntercityHomeScreen extends StatelessWidget { Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? Colors.transparent : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: + isDark + ? Colors.transparent + : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ // Pickup Location InkWell( onTap: () async { - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + if (Constant.selectedMapType == + 'osm') { + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.sourceTextEditController.value.text = ''; + controller + .sourceTextEditController + .value + .text = ''; final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; - controller.sourceTextEditController.value.text = address.toString(); - controller.setDepartureMarker(lat, lng); + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace.address; + controller + .sourceTextEditController + .value + .text = address.toString(); + controller.setDepartureMarker( + lat, + lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to( + LocationPickerScreen(), + )!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDepartureMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller.setDepartureMarker( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, - hintText: ConstTexts.pickUpLocation.tr(), + controller: + controller + .sourceTextEditController + .value, + hintText: + ConstTexts.pickUpLocation.tr(), enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 10), // Destination Location InkWell( onTap: () async { - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + if (Constant.selectedMapType == + 'osm') { + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { - controller.destinationTextEditController.value.text = ''; + controller + .destinationTextEditController + .value + .text = ''; final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; - controller.destinationTextEditController.value.text = address.toString(); - controller.setDestinationMarker(lat, lng); + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace.address; + controller + .destinationTextEditController + .value + .text = address.toString(); + controller.setDestinationMarker( + lat, + lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to( + LocationPickerScreen(), + )!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.destinationTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.setDestinationMarker(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + controller + .destinationTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller.setDestinationMarker( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ); } }); } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: + ConstTexts.destinationLocation + .tr(), enable: false, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -759,9 +1434,15 @@ class IntercityHomeScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 40, ), - child: const SizedBox(width: 20, height: 40), ), ), ], @@ -770,24 +1451,55 @@ class IntercityHomeScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text(ConstTexts.promoCode.tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded( + child: Text( + ConstTexts.promoCode.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { - Get.to(CabCouponCodeScreen())!.then((value) { + Get.to(CabCouponCodeScreen())!.then(( + value, + ) { if (value != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: value); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = value; + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: value, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + value; controller.calculateTotalAmount(); } else { - ShowToastDialog.showToast(ConstTexts.thisOfferNotEligible.tr()); + ShowToastDialog.showToast( + ConstTexts.thisOfferNotEligible + .tr(), + ); } } }); }, child: Text( ConstTexts.viewAll.tr(), - style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.boldTextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], @@ -800,56 +1512,130 @@ class IntercityHomeScreen extends StatelessWidget { height: Responsive.height(6, context), color: AppThemeData.carRent50, child: DottedBorder( - options: RectDottedBorderOptions(dashPattern: [10, 5], strokeWidth: 1, padding: EdgeInsets.all(0), color: AppThemeData.carRent400), + options: RectDottedBorderOptions( + dashPattern: [10, 5], + strokeWidth: 1, + padding: EdgeInsets.all(0), + color: AppThemeData.carRent400, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_coupon.svg"), + SvgPicture.asset( + "assets/icons/ic_coupon.svg", + ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: TextFormField( - controller: controller.couponCodeTextEditController.value, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + controller: + controller + .couponCodeTextEditController + .value, + style: + AppThemeData.semiBoldTextStyle( + color: + AppThemeData + .parcelService500, + fontSize: 16, + ), decoration: InputDecoration( border: InputBorder.none, - hintText: ConstTexts.writeCoupon.tr(), - contentPadding: EdgeInsets.only(bottom: 10), - hintStyle: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + hintText: + ConstTexts.writeCoupon.tr(), + contentPadding: EdgeInsets.only( + bottom: 10, + ), + hintStyle: + AppThemeData.semiBoldTextStyle( + color: + AppThemeData + .parcelService500, + fontSize: 16, + ), ), ), ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.redeemNow.tr(), width: 27.w, fontSizes: 14, onPress: () async { if (controller.cabCouponList - .where((element) => element.code!.toLowerCase() == controller.couponCodeTextEditController.value.text.toLowerCase()) + .where( + (element) => + element.code! + .toLowerCase() == + controller + .couponCodeTextEditController + .value + .text + .toLowerCase(), + ) .isNotEmpty) { - CouponModel couponModel = controller.cabCouponList.firstWhere( - (p0) => p0.code!.toLowerCase() == controller.couponCodeTextEditController.value.text.toLowerCase(), - ); - if (couponModel.expiresAt!.toDate().isAfter(DateTime.now())) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; - controller.calculateTotalAmount(); + CouponModel + couponModel = controller + .cabCouponList + .firstWhere( + (p0) => + p0.code! + .toLowerCase() == + controller + .couponCodeTextEditController + .value + .text + .toLowerCase(), + ); + if (couponModel.expiresAt! + .toDate() + .isAfter(DateTime.now())) { + double couponAmount = + Constant.calculateDiscount( + amount: + controller + .subTotal + .value + .toString(), + offerModel: couponModel, + ); + if (couponAmount < + controller.subTotal.value) { + controller + .selectedCouponModel + .value = couponModel; + controller + .calculateTotalAmount(); controller.update(); } else { - ShowToastDialog.showToast(ConstTexts.thisOfferNotEligible.tr()); + ShowToastDialog.showToast( + ConstTexts + .thisOfferNotEligible + .tr(), + ); } } else { - ShowToastDialog.showToast(ConstTexts.couponExpired.tr()); + ShowToastDialog.showToast( + ConstTexts.couponExpired.tr(), + ); } } else { - ShowToastDialog.showToast(ConstTexts.invalidCouponCode.tr()); + ShowToastDialog.showToast( + ConstTexts.invalidCouponCode + .tr(), + ); } }, color: AppThemeData.parcelService300, @@ -866,46 +1652,121 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.orderSummary.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.subtotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Row( children: [ - Text(ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + ConstTexts.discount.tr(), + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), SizedBox(width: 5), Text( - controller.selectedCouponModel.value.id == null ? "" : "(${controller.selectedCouponModel.value.code})", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.primary300), + controller + .selectedCouponModel + .value + .id == + null + ? "" + : "(${controller.selectedCouponModel.value.code})", + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + AppThemeData.primary300, + ), ), ], ), - Text(Constant.amountShow(amount: controller.discount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.danger300)), + Text( + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: AppThemeData.danger300, + ), + ), ], ), ), @@ -917,24 +1778,56 @@ class IntercityHomeScreen extends StatelessWidget { physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { - TaxModel taxModel = Constant.taxList[index]; + TaxModel taxModel = + Constant.taxList[index]; return Padding( - padding: const EdgeInsets.only(bottom: 5), + padding: const EdgeInsets.only( + bottom: 5, + ), child: Row( children: [ Expanded( child: Text( '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( Constant.amountShow( - amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), + amount: + Constant.calculateTax( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -944,14 +1837,36 @@ class IntercityHomeScreen extends StatelessWidget { const Divider(), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.orderTotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -963,42 +1878,154 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(10), child: Row( children: [ controller.selectedPaymentMethod.value == '' - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "") - : controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecorationScreen(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecorationScreen(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecorationScreen(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecorationScreen(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecorationScreen(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecorationScreen(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecorationScreen(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecorationScreen(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecorationScreen(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecorationScreen(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name + ? cardDecorationScreen( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.stripe.name + ? cardDecorationScreen( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name + ? cardDecorationScreen( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name + ? cardDecorationScreen( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name + ? cardDecorationScreen( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name + ? cardDecorationScreen( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name + ? cardDecorationScreen( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name + ? cardDecorationScreen( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name + ? cardDecorationScreen( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name + ? cardDecorationScreen( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecorationScreen( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), SizedBox(width: 22), Text( controller.selectedPaymentMethod.value, textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1007,7 +2034,7 @@ class IntercityHomeScreen extends StatelessWidget { ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.confirmBooking.tr(), onPress: () async { controller.placeOrder(); @@ -1026,7 +2053,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget waitingDialog(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget waitingDialog( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.4, @@ -1035,18 +2066,40 @@ class IntercityHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), SizedBox(height: 30), - Text(ConstTexts.waitingForDriver.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + ConstTexts.waitingForDriver.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.cancelRide.tr(), onPress: () async { try { @@ -1059,7 +2112,9 @@ class IntercityHomeScreen extends StatelessWidget { // 2. Save to Firestore if (controller.currentOrder.value.id != null) { - await FireStoreUtils.updateCabOrder(controller.currentOrder.value); + await FireStoreUtils.updateCabOrder( + controller.currentOrder.value, + ); } // 3. Reset controller states @@ -1070,10 +2125,22 @@ class IntercityHomeScreen extends StatelessWidget { controller.routePoints.clear(); controller.sourceTextEditController.value.clear(); controller.destinationTextEditController.value.clear(); - controller.departureLatLong.value = const LatLng(0.0, 0.0); - controller.destinationLatLong.value = const LatLng(0.0, 0.0); - controller.departureLatLongOsm.value = latlong.LatLng(0.0, 0.0); - controller.destinationLatLongOsm.value = latlong.LatLng(0.0, 0.0); + controller.departureLatLong.value = const LatLng( + 0.0, + 0.0, + ); + controller.destinationLatLong.value = const LatLng( + 0.0, + 0.0, + ); + controller.departureLatLongOsm.value = latlong.LatLng( + 0.0, + 0.0, + ); + controller.destinationLatLongOsm.value = latlong.LatLng( + 0.0, + 0.0, + ); // 4. Reset user’s in-progress order if (Constant.userModel != null) { @@ -1082,12 +2149,18 @@ class IntercityHomeScreen extends StatelessWidget { } // 5. Optional feedback - ShowToastDialog.showToast(ConstTexts.riderCancelledSucces.tr()); + ShowToastDialog.showToast( + ConstTexts.riderCancelledSucces.tr(), + ); Get.back(); - CabDashboardController cabDashboardController = Get.put(CabDashboardController()); + CabDashboardController cabDashboardController = Get.put( + CabDashboardController(), + ); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast(ConstTexts.failedToCancel.tr()); + ShowToastDialog.showToast( + ConstTexts.failedToCancel.tr(), + ); } }, color: AppThemeData.danger300, @@ -1102,7 +2175,11 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Widget driverDialog(BuildContext context, IntercityHomeController controller, bool isDark) { + Widget driverDialog( + BuildContext context, + IntercityHomeController controller, + bool isDark, + ) { return Positioned.fill( child: DraggableScrollableSheet( initialChildSize: 0.7, @@ -1111,13 +2188,29 @@ class IntercityHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey700 : Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.grey400), height: 4, width: 33), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.grey400, + ), + height: 4, + width: 33, + ), Expanded( child: ListView( controller: scrollController, @@ -1127,7 +2220,11 @@ class IntercityHomeScreen extends StatelessWidget { Stack( children: [ Container( - decoration: BoxDecoration(color: isDark ? Colors.transparent : Colors.white, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: + isDark ? Colors.transparent : Colors.white, + borderRadius: BorderRadius.circular(12), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -1157,11 +2254,23 @@ class IntercityHomeScreen extends StatelessWidget { // } }, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller + .sourceTextEditController + .value, hintText: ConstTexts.pickUpLocation.tr(), enable: false, readOnly: true, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 10), @@ -1191,13 +2300,26 @@ class IntercityHomeScreen extends StatelessWidget { // } }, child: TextFieldWidget( - controller: controller.destinationTextEditController.value, + controller: + controller + .destinationTextEditController + .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: + ConstTexts.destinationLocation.tr(), enable: false, readOnly: true, - prefix: const Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.radio_button_checked, color: Colors.red)), + prefix: const Padding( + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + child: Icon( + Icons.radio_button_checked, + color: Colors.red, + ), + ), ), ), ], @@ -1215,7 +2337,10 @@ class IntercityHomeScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), ), child: const SizedBox(width: 20, height: 40), ), @@ -1229,7 +2354,18 @@ class IntercityHomeScreen extends StatelessWidget { children: [ ClipRRect( borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.currentOrder.value.driver?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + child: NetworkImageWidget( + imageUrl: + controller + .currentOrder + .value + .driver + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), SizedBox(width: 10), Expanded( @@ -1238,22 +2374,51 @@ class IntercityHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - controller.currentOrder.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller.currentOrder.value.driver + ?.fullName() ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 18, + ), ), Text( "${controller.currentOrder.value.driver?.vehicleType ?? ''} | ${controller.currentOrder.value.driver?.carMakes ?? ''}", - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.greyDark700 + : AppThemeData.grey700, + fontSize: 14, + ), ), Text( - controller.currentOrder.value.driver?.carNumber ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 16), + controller + .currentOrder + .value + .driver + ?.carNumber ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.greyDark700 + : AppThemeData.grey700, + fontSize: 16, + ), ), ], ), ), RoundedButtonBorder( - title: controller.driverModel.value.averageRating.toStringAsFixed(1) ?? '', + title: + controller.driverModel.value.averageRating + .toStringAsFixed(1) ?? + '', width: 20, height: 3.5, radius: 10, @@ -1262,7 +2427,9 @@ class IntercityHomeScreen extends StatelessWidget { textColor: AppThemeData.warning400, borderColor: AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), ], @@ -1271,37 +2438,98 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(ConstTexts.orderSummary.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.orderSummary.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.subtotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.subtotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.discount.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(Constant.amountShow(amount: controller.discount.value.toString()), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.danger300)), + Text( + ConstTexts.discount.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: AppThemeData.danger300, + ), + ), ], ), ), @@ -1322,15 +2550,38 @@ class IntercityHomeScreen extends StatelessWidget { child: Text( '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Text( Constant.amountShow( - amount: Constant.calculateTax(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(), + amount: + Constant.calculateTax( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1340,14 +2591,36 @@ class IntercityHomeScreen extends StatelessWidget { const Divider(), Padding( - padding: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric( + vertical: 4, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.orderTotal.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ConstTexts.orderTotal.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1359,8 +2632,16 @@ class IntercityHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(10), child: InkWell( @@ -1369,34 +2650,111 @@ class IntercityHomeScreen extends StatelessWidget { }, child: Row( children: [ - controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecorationScreen(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecorationScreen(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecorationScreen(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecorationScreen(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecorationScreen(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecorationScreen(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecorationScreen(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecorationScreen(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecorationScreen(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecorationScreen(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecorationScreen(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecorationScreen(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name + ? cardDecorationScreen( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.cod.name + ? cardDecorationScreen( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name + ? cardDecorationScreen( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name + ? cardDecorationScreen( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name + ? cardDecorationScreen( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name + ? cardDecorationScreen( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name + ? cardDecorationScreen( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name + ? cardDecorationScreen( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name + ? cardDecorationScreen( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name + ? cardDecorationScreen( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name + ? cardDecorationScreen( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecorationScreen( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), SizedBox(width: 22), Text( controller.selectedPaymentMethod.value, textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -1404,48 +2762,77 @@ class IntercityHomeScreen extends StatelessWidget { ), const SizedBox(height: 20), Obx(() { - if (controller.currentOrder.value.status == Constant.orderInTransit) { + if (controller.currentOrder.value.status == + Constant.orderInTransit) { return Column( children: [ RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "SOS", color: Colors.red.withValues(alpha: 0.50), textColor: AppThemeData.grey50, isCenter: true, icon: Icon(Icons.call, color: Colors.white), onPress: () async { - ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr()); + ShowToastDialog.showLoader( + ConstTexts.pleaseWait.tr(), + ); - LocationData location = await controller.currentLocation.value.getLocation(); + LocationData location = + await controller.currentLocation.value + .getLocation(); - await FireStoreUtils.getSOS(controller.currentOrder.value.id ?? '').then((value) async { + await FireStoreUtils.getSOS( + controller.currentOrder.value.id ?? '', + ).then((value) async { if (value == false) { - await FireStoreUtils.setSos(controller.currentOrder.value.id ?? '', UserLocation(latitude: location.latitude!, longitude: location.longitude!)).then((value) { + await FireStoreUtils.setSos( + controller.currentOrder.value.id ?? + '', + UserLocation( + latitude: location.latitude!, + longitude: location.longitude!, + ), + ).then((value) { ShowToastDialog.closeLoader(); - ScaffoldMessenger.of(context).showSnackBar( + ScaffoldMessenger.of( + context, + ).showSnackBar( SnackBar( content: Builder( builder: (context) { - return Text(ConstTexts.yourSosRequest.tr()); + return Text( + ConstTexts.yourSosRequest + .tr(), + ); }, ), backgroundColor: Colors.green, - duration: const Duration(seconds: 3), + duration: const Duration( + seconds: 3, + ), ), ); }); } else { ShowToastDialog.closeLoader(); - ScaffoldMessenger.of(context).showSnackBar( + ScaffoldMessenger.of( + context, + ).showSnackBar( SnackBar( content: Builder( builder: (context) { - return Text(ConstTexts.yourSosrequestAlreadySubmitted.tr()); + return Text( + ConstTexts + .yourSosrequestAlreadySubmitted + .tr(), + ); }, ), backgroundColor: Colors.red, - duration: const Duration(seconds: 3), + duration: const Duration( + seconds: 3, + ), ), ); } @@ -1463,45 +2850,100 @@ class IntercityHomeScreen extends StatelessWidget { ), ), Obx(() { - if (controller.currentOrder.value.status == Constant.orderInTransit && controller.currentOrder.value.paymentStatus == false) { + if (controller.currentOrder.value.status == + Constant.orderInTransit && + controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.payNow.tr(), onPress: () async { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast(ConstTexts.somethingWentWrong.tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + ConstTexts.somethingWentWrong.tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: + controller.totalAmount.value + .toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); } }, color: AppThemeData.primary300, @@ -1520,19 +2962,42 @@ class IntercityHomeScreen extends StatelessWidget { ); } - Padding cardDecorationScreen(IntercityHomeController controller, PaymentGateway value, isDark, String image) { + Padding cardDecorationScreen( + IntercityHomeController controller, + PaymentGateway value, + isDark, + String image, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( width: 40, height: 40, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: image == '' ? Container(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100) : Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: + image == '' + ? Container( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + ) + : Image.asset(image), + ), ), ); } - Obx cardDecoration(IntercityHomeController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + IntercityHomeController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -1547,8 +3012,21 @@ class IntercityHomeScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -1559,12 +3037,34 @@ class IntercityHomeScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == + null + ? '0.0' + : controller + .userModel + .value + .walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -1573,14 +3073,23 @@ class IntercityHomeScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 0df9bdd..56de16c 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -18,7 +18,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:latlong2/latlong.dart' as latlong; @@ -668,21 +668,16 @@ class CabBookingScreen extends StatelessWidget { child: Obx( () => RoundedButtonFill( borderRadius: 10.r, - title: 'pay_amount'.trParams({ - 'amount': - controller.selectedVehicleType.value.id == null - ? Constant.amountShow(amount: "0.0") - : Constant.amountShow( - amount: - controller - .getAmount( - controller - .selectedVehicleType - .value, - ) - .toString(), - ), - }), + title: 'pay_amount'.tr(namedArgs: { + 'amount': controller.selectedVehicleType.value.id == null + ? Constant.amountShow(amount: "0.0") + : Constant.amountShow( + amount: controller + .getAmount(controller.selectedVehicleType.value) + .toString(), + ), +}), + onPress: () async { if (controller.selectedVehicleType.value.id != null) { controller.calculateTotalAmount(); @@ -1927,7 +1922,9 @@ class CabBookingScreen extends StatelessWidget { ); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast(ConstTexts.failedToCancel.tr()); + ShowToastDialog.showToast( + ConstTexts.failedToCancel.tr(), + ); } }, ), @@ -2069,7 +2066,8 @@ class CabBookingScreen extends StatelessWidget { .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: + ConstTexts.destinationLocation.tr(), enable: false, readOnly: true, prefix: const Padding( @@ -2282,7 +2280,7 @@ class CabBookingScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - ConstTexts.pleaseWait.tr(), + ConstTexts.pleaseWait.tr(), ); UserModel? customer = @@ -2621,8 +2619,7 @@ class CabBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})' - , + '${taxModel.title} (${taxModel.tax} ${taxModel.type == "Fixed" ? Constant.currencyData!.code : "%"})', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( fontSize: 14, @@ -2720,7 +2717,9 @@ class CabBookingScreen extends StatelessWidget { isCenter: true, icon: const Icon(Icons.call, color: Colors.white), onPress: () async { - ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr()); + ShowToastDialog.showLoader( + ConstTexts.pleaseWait.tr(), + ); LocationData location = await controller.currentLocation.value @@ -2741,8 +2740,7 @@ class CabBookingScreen extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - ConstTexts.yourSosRequest.tr() - + ConstTexts.yourSosRequest.tr(), ), backgroundColor: Colors.green, duration: Duration(seconds: 3), @@ -2754,7 +2752,9 @@ class CabBookingScreen extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - ConstTexts.yourSosrequestAlreadySubmitted.tr() + ConstTexts + .yourSosrequestAlreadySubmitted + .tr(), ), backgroundColor: Colors.red, duration: Duration(seconds: 3), @@ -2822,7 +2822,8 @@ class CabBookingScreen extends StatelessWidget { Constant.userModel!.walletAmount! < controller.totalAmount.value) { ShowToastDialog.showToast( - ConstTexts.youDoNothaveSufficientwalletBalance.tr() + ConstTexts.youDoNothaveSufficientwalletBalance + .tr(), ); } else { controller.completeOrder(); @@ -2858,8 +2859,7 @@ class CabBookingScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - - ConstTexts.somethingWentWrong.tr() + ConstTexts.somethingWentWrong.tr(), ); } else { CreateRazorPayOrderModel result = value; @@ -2873,7 +2873,7 @@ class CabBookingScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr(), ); } }, diff --git a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart index 251c102..c74bdb0 100644 --- a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabCouponCodeScreen extends StatelessWidget { const CabCouponCodeScreen({super.key}); @@ -34,12 +34,30 @@ class CabCouponCodeScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text(ConstTexts.coupon.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + ConstTexts.coupon.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -48,24 +66,44 @@ class CabCouponCodeScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.cabCouponList.isEmpty - ? Constant.showEmptyView(message: ConstTexts.couponNotFound.tr()) + ? Constant.showEmptyView( + message: ConstTexts.couponNotFound.tr(), + ) : ListView.builder( shrinkWrap: true, itemCount: controller.cabCouponList.length, itemBuilder: (context, index) { CouponModel couponModel = controller.cabCouponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -75,7 +113,14 @@ class CabCouponCodeScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -85,24 +130,53 @@ class CabCouponCodeScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: + RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ), ), - const Expanded(child: SizedBox(height: 10)), + const Expanded( + child: SizedBox(height: 10), + ), InkWell( onTap: () { Get.back(result: couponModel); @@ -110,18 +184,38 @@ class CabCouponCodeScreen extends StatelessWidget { child: Text( ConstTexts.tapToApply.tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart index 9f322af..2e29d07 100644 --- a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart @@ -7,7 +7,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class CabDashboardScreen extends StatelessWidget { const CabDashboardScreen({super.key}); diff --git a/lib/screen_ui/cab_service_screens/cab_home_screen.dart b/lib/screen_ui/cab_service_screens/cab_home_screen.dart index c5e981b..bf9e6d9 100644 --- a/lib/screen_ui/cab_service_screens/cab_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_home_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'Intercity_home_screen.dart'; import 'cab_booking_screen.dart'; @@ -123,7 +123,7 @@ class CabHomeScreen extends HookWidget { CrossAxisAlignment.start, children: [ Text( - ConstTexts.everyRideVerified.tr(), + ConstTexts.everyRideVerified.tr(), style: AppThemeData.boldTextStyle( color: isDark @@ -133,8 +133,7 @@ class CabHomeScreen extends HookWidget { ), ), Text( - ConstTexts.allDriversIDCheck - .tr(), + ConstTexts.allDriversIDCheck.tr(), style: AppThemeData.mediumTextStyle( color: isDark diff --git a/lib/screen_ui/cab_service_screens/cab_order_details.dart b/lib/screen_ui/cab_service_screens/cab_order_details.dart index 1c2a5c2..1e3b71a 100644 --- a/lib/screen_ui/cab_service_screens/cab_order_details.dart +++ b/lib/screen_ui/cab_service_screens/cab_order_details.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/cab_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; diff --git a/lib/screen_ui/cab_service_screens/cab_review_screen.dart b/lib/screen_ui/cab_service_screens/cab_review_screen.dart index e39a593..ef6ee21 100644 --- a/lib/screen_ui/cab_service_screens/cab_review_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_review_screen.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; diff --git a/lib/screen_ui/cab_service_screens/complain_screen.dart b/lib/screen_ui/cab_service_screens/complain_screen.dart index 94402a8..b3019ce 100644 --- a/lib/screen_ui/cab_service_screens/complain_screen.dart +++ b/lib/screen_ui/cab_service_screens/complain_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/const_texts.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/complain_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -35,12 +35,27 @@ class ComplainScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: const Center(child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20)), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: const Center( + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), ), ), const SizedBox(width: 10), - Text(ConstTexts.complain.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + ConstTexts.complain.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -52,11 +67,30 @@ class ComplainScreen extends StatelessWidget { padding: const EdgeInsets.all(16), child: Column( children: [ - Obx(() => TextFieldWidget(title: ConstTexts.title.tr(), hintText: ConstTexts.title.tr(), controller: controller.title.value)), + Obx( + () => TextFieldWidget( + title: ConstTexts.title.tr(), + hintText: ConstTexts.title.tr(), + controller: controller.title.value, + ), + ), const SizedBox(height: 10), - Obx(() => TextFieldWidget(title:ConstTexts.complain.tr(), hintText: ConstTexts.typeDescription.tr(), controller: controller.comment.value, maxLine: 8)), + Obx( + () => TextFieldWidget( + title: ConstTexts.complain.tr(), + hintText: ConstTexts.typeDescription.tr(), + controller: controller.comment.value, + maxLine: 8, + ), + ), const SizedBox(height: 20), - RoundedButtonFill( borderRadius: 10.r,title: ConstTexts.save.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.submitComplain()), + RoundedButtonFill( + borderRadius: 10.r, + title: ConstTexts.save.tr(), + color: AppThemeData.primary300, + textColor: AppThemeData.grey50, + onPress: () => controller.submitComplain(), + ), ], ), ), diff --git a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart index 5a85e86..de98f82 100644 --- a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/my_cab_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -33,14 +33,27 @@ class MyCabBookingScreen extends StatelessWidget { // length: controller.tabTitles.length, // initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), length: controller.tabKeys.length, - initialIndex: controller.tabKeys.indexOf(controller.selectedTab.value), + initialIndex: controller.tabKeys.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text(ConstTexts.rideHistory.tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row( + children: [ + const SizedBox(width: 10), + Text( + ConstTexts.rideHistory.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ], + ), ), bottom: PreferredSize( preferredSize: const Size.fromHeight(48), @@ -53,7 +66,9 @@ class MyCabBookingScreen extends StatelessWidget { labelColor: AppThemeData.taxiBooking500, unselectedLabelColor: AppThemeData.taxiBooking500, labelStyle: AppThemeData.boldTextStyle(fontSize: 14), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 14), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 14, + ), tabs: controller.tabKeys .map( @@ -63,7 +78,9 @@ class MyCabBookingScreen extends StatelessWidget { child: Text( controller.getLocalizedTabTitle(key), textAlign: TextAlign.center, - overflow: TextOverflow.visible, // 👈 show full text + overflow: + TextOverflow + .visible, // 👈 show full text ), ), ), @@ -83,16 +100,33 @@ class MyCabBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(ConstTexts.plsLoginToAcc.tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + ConstTexts.plsLoginToAcc.tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( ConstTexts.youAreNotLoggedIn.tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.login.tr(), width: 55, height: 5.5, @@ -111,7 +145,17 @@ class MyCabBookingScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text(ConstTexts.noOrderfound.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + ConstTexts.noOrderfound.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( @@ -121,74 +165,150 @@ class MyCabBookingScreen extends StatelessWidget { CabOrderModel order = orders[index]; return GestureDetector( onTap: () { - Get.to(() => CabOrderDetails(), arguments: {"cabOrderModel": order}); + Get.to( + () => CabOrderDetails(), + arguments: {"cabOrderModel": order}, + ); }, child: Container( margin: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, borderRadius: BorderRadius.circular(15), - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${'Booking Date:'.tr} ${controller.formatDate(order.scheduleDateTime!)}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Column( children: [ - Icon(Icons.stop_circle_outlined, color: Colors.green), - DottedBorder( - options: CustomPathDottedBorderOptions( - color: Colors.grey.shade400, - strokeWidth: 2, - dashPattern: [4, 4], - customPath: - (size) => - Path() - ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), - ), - child: const SizedBox(width: 20, height: 55), + Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + DottedBorder( + options: + CustomPathDottedBorderOptions( + color: + Colors + .grey + .shade400, + strokeWidth: 2, + dashPattern: [4, 4], + customPath: + (size) => + Path() + ..moveTo( + size.width / + 2, + 0, + ) + ..lineTo( + size.width / + 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 55, + ), + ), + Icon( + Icons.radio_button_checked, + color: Colors.red, ), - Icon(Icons.radio_button_checked, color: Colors.red), ], ), const SizedBox(width: 12), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ // Source Location Name Expanded( child: Text( - order.sourceLocationName.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + order + .sourceLocationName + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), maxLines: 2, - overflow: TextOverflow.ellipsis, + overflow: + TextOverflow + .ellipsis, ), ), const SizedBox(width: 8), Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all(color: AppThemeData.warning300, width: 1), - color: AppThemeData.warning50, + borderRadius: + BorderRadius.circular( + 10, + ), + border: Border.all( + color: + AppThemeData + .warning300, + width: 1, + ), + color: + AppThemeData + .warning50, ), - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + padding: + const EdgeInsets.symmetric( + vertical: 8, + horizontal: 12, + ), child: Text( - order.status.toString(), - style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.warning500), - overflow: TextOverflow.ellipsis, + order.status + .toString(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + AppThemeData + .warning500, + ), + overflow: + TextOverflow + .ellipsis, ), ), ], @@ -196,46 +316,114 @@ class MyCabBookingScreen extends StatelessWidget { SizedBox(height: 15), DottedBorder( options: CustomPathDottedBorderOptions( - color: Colors.grey.shade400, + color: + Colors.grey.shade400, strokeWidth: 2, dashPattern: [4, 4], customPath: (size) => Path() - ..moveTo(0, size.height / 2) // start from left center - ..lineTo(size.width, size.height / 2), // draw to right center + ..moveTo( + 0, + size.height / + 2, + ) // start from left center + ..lineTo( + size.width, + size.height / + 2, + ), // draw to right center + ), + child: const SizedBox( + width: 295, + height: 3, ), - child: const SizedBox(width: 295, height: 3), ), SizedBox(height: 15), Text( - order.destinationLocationName.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + order + .destinationLocationName + .toString(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), ], ), - if (Constant.isEnableOTPTripStart == true) + if (Constant.isEnableOTPTripStart == + true) Row( //mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Text("Otp :", style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Otp :", + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark800 + : AppThemeData + .grey800, + ), + ), SizedBox(width: 5), - Text(order.otpCode ?? '', style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + order.otpCode ?? '', + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ], ), - if (order.status == Constant.orderInTransit && order.paymentStatus == false) SizedBox(height: 14), - order.status == Constant.orderInTransit && order.paymentStatus == false + if (order.status == + Constant.orderInTransit && + order.paymentStatus == false) + SizedBox(height: 14), + order.status == + Constant.orderInTransit && + order.paymentStatus == false ? RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.payNow.tr(), onPress: () async { - controller.selectedPaymentMethod.value = order.paymentMethod.toString(); - controller.calculateTotalAmount(order); - Get.bottomSheet(paymentBottomSheet(context, controller, isDark), isScrollControlled: true, backgroundColor: Colors.transparent); + controller + .selectedPaymentMethod + .value = order.paymentMethod + .toString(); + controller.calculateTotalAmount( + order, + ); + Get.bottomSheet( + paymentBottomSheet( + context, + controller, + isDark, + ), + isScrollControlled: true, + backgroundColor: + Colors.transparent, + ); }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -255,7 +443,11 @@ class MyCabBookingScreen extends StatelessWidget { ); } - Widget paymentBottomSheet(BuildContext context, MyCabBookingController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + MyCabBookingController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, // Start height @@ -268,14 +460,26 @@ class MyCabBookingScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(ConstTexts.selectPaymentMethod.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + ConstTexts.selectPaymentMethod.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); @@ -290,40 +494,88 @@ class MyCabBookingScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text(ConstTexts.prefferedPayment.tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + ConstTexts.prefferedPayment.tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), Text( - ConstTexts.otherPaymentOptions.tr(), + ConstTexts.otherPaymentOptions.tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -331,32 +583,129 @@ class MyCabBookingScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -366,52 +715,109 @@ class MyCabBookingScreen extends StatelessWidget { ), ), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: ConstTexts.continueT.tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); } else { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (Constant.userModel!.walletAmount == null || Constant.userModel!.walletAmount! < controller.totalAmount.value) { - ShowToastDialog.showToast(ConstTexts.youDoNothaveSufficientwalletBalance.tr()); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { + if (Constant.userModel!.walletAmount == null || + Constant.userModel!.walletAmount! < + controller.totalAmount.value) { + ShowToastDialog.showToast( + ConstTexts.youDoNothaveSufficientwalletBalance.tr(), + ); } else { controller.completeOrder(); } - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast(ConstTexts.somethingWentWrong.tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + ConstTexts.somethingWentWrong.tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.totalAmount.value.toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast(ConstTexts.plsSelectPaymentMethod.tr()); + ShowToastDialog.showToast( + ConstTexts.plsSelectPaymentMethod.tr(), + ); } } }, @@ -423,7 +829,12 @@ class MyCabBookingScreen extends StatelessWidget { ); } - Obx cardDecoration(MyCabBookingController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + MyCabBookingController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -438,8 +849,21 @@ class MyCabBookingScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -450,12 +874,30 @@ class MyCabBookingScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel!.walletAmount == null ? '0.0' : Constant.userModel!.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel!.walletAmount == null + ? '0.0' + : Constant.userModel!.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -464,14 +906,23 @@ class MyCabBookingScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/ecommarce/all_brand_product_screen.dart b/lib/screen_ui/ecommarce/all_brand_product_screen.dart index c50aa39..0545863 100644 --- a/lib/screen_ui/ecommarce/all_brand_product_screen.dart +++ b/lib/screen_ui/ecommarce/all_brand_product_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllBrandProductScreen extends StatelessWidget { const AllBrandProductScreen({super.key}); @@ -22,23 +22,41 @@ class AllBrandProductScreen extends StatelessWidget { init: AllBrandProductController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: GridView.builder( shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 3.5 / 6, crossAxisSpacing: 10), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 10, + ), padding: EdgeInsets.zero, - itemCount: controller.productList.length, + itemCount: controller.productList.length, itemBuilder: (context, index) { - ProductModel productModel = controller.productList[index]; + ProductModel productModel = + controller.productList[index]; return FutureBuilder( - future: FireStoreUtils.getVendorById(productModel.vendorID.toString()), + future: FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ), builder: (context, vendorSnapshot) { - if (!vendorSnapshot.hasData || vendorSnapshot.connectionState == ConnectionState.waiting) { + if (!vendorSnapshot.hasData || + vendorSnapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); // Show placeholder or loader } VendorModel? vendorModel = vendorSnapshot.data; @@ -48,34 +66,78 @@ class AllBrandProductScreen extends StatelessWidget { List selectedIndexVariants = []; List selectedIndexArray = []; if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { if (element.attributeOptions!.isNotEmpty) { selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf(element)] + .attributeOptions![0] + .toString(), ); selectedIndexVariants.add( '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', ); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( vendorModel!, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = + double.parse( + productModel.disPrice.toString(), + ) <= + 0 + ? "0" + : Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return GestureDetector( onTap: () async { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -85,47 +147,108 @@ class AllBrandProductScreen extends StatelessWidget { child: SizedBox( height: 90, width: Responsive.width(100, context), - child: NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover), + child: NetworkImageWidget( + imageUrl: productModel.photo.toString(), + fit: BoxFit.cover, + ), ), ), Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( productModel.name!.capitalizeString(), textAlign: TextAlign.start, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), disPrice == "" || disPrice == "0" - ? Text(Constant.amountShow(amount: price), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.primary300)) + ? Text( + Constant.amountShow(amount: price), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData.primary300, + ), + ) : Row( children: [ Text( - Constant.amountShow(amount: price), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: Colors.grey, decoration: TextDecoration.lineThrough), + Constant.amountShow( + amount: price, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: Colors.grey, + decoration: + TextDecoration + .lineThrough, + ), ), const SizedBox(width: 5), Text( - Constant.amountShow(amount: disPrice), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: disPrice, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.warning50 + : AppThemeData.warning50, + borderRadius: BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: 18, + color: AppThemeData.warning400, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount.toString(), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + AppThemeData + .warning400, + ), ), ], ), diff --git a/lib/screen_ui/ecommarce/all_category_product_screen.dart b/lib/screen_ui/ecommarce/all_category_product_screen.dart index 16d9658..30afacd 100644 --- a/lib/screen_ui/ecommarce/all_category_product_screen.dart +++ b/lib/screen_ui/ecommarce/all_category_product_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AllCategoryProductScreen extends StatelessWidget { const AllCategoryProductScreen({super.key}); @@ -22,23 +22,41 @@ class AllCategoryProductScreen extends StatelessWidget { init: AllCategoryProductController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: GridView.builder( shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 3.5 / 6, crossAxisSpacing: 10), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 10, + ), padding: EdgeInsets.zero, itemCount: controller.productList.length, itemBuilder: (context, index) { - ProductModel productModel = controller.productList[index]; + ProductModel productModel = + controller.productList[index]; return FutureBuilder( - future: FireStoreUtils.getVendorById(productModel.vendorID.toString()), + future: FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ), builder: (context, vendorSnapshot) { - if (!vendorSnapshot.hasData || vendorSnapshot.connectionState == ConnectionState.waiting) { + if (!vendorSnapshot.hasData || + vendorSnapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); // Show placeholder or loader } VendorModel? vendorModel = vendorSnapshot.data; @@ -48,34 +66,78 @@ class AllCategoryProductScreen extends StatelessWidget { List selectedIndexVariants = []; List selectedIndexArray = []; if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { if (element.attributeOptions!.isNotEmpty) { selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf(element)] + .attributeOptions![0] + .toString(), ); selectedIndexVariants.add( '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', ); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( vendorModel!, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = + double.parse( + productModel.disPrice.toString(), + ) <= + 0 + ? "0" + : Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return GestureDetector( onTap: () async { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -85,47 +147,108 @@ class AllCategoryProductScreen extends StatelessWidget { child: SizedBox( height: 90, width: Responsive.width(100, context), - child: NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover), + child: NetworkImageWidget( + imageUrl: productModel.photo.toString(), + fit: BoxFit.cover, + ), ), ), Column( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( productModel.name!.capitalizeString(), textAlign: TextAlign.start, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), disPrice == "" || disPrice == "0" - ? Text(Constant.amountShow(amount: price), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.primary300)) + ? Text( + Constant.amountShow(amount: price), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData.primary300, + ), + ) : Row( children: [ Text( - Constant.amountShow(amount: price), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: Colors.grey, decoration: TextDecoration.lineThrough), + Constant.amountShow( + amount: price, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: Colors.grey, + decoration: + TextDecoration + .lineThrough, + ), ), const SizedBox(width: 5), Text( - Constant.amountShow(amount: disPrice), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: disPrice, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.warning50 + : AppThemeData.warning50, + borderRadius: BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: 18, + color: AppThemeData.warning400, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount.toString(), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + AppThemeData + .warning400, + ), ), ], ), diff --git a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart index 9f7b0bd..dfdbdc0 100644 --- a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../controllers/theme_controller.dart'; class DashBoardEcommerceScreen extends StatelessWidget { @@ -27,12 +26,19 @@ class DashBoardEcommerceScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(DashBoardController()); @@ -42,17 +48,71 @@ class DashBoardEcommerceScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 4, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -61,7 +121,13 @@ class DashBoardEcommerceScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required DashBoardEcommerceController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required DashBoardEcommerceController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart index cae6b77..7e4dae3 100644 --- a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart @@ -17,7 +17,8 @@ import 'package:customer/screen_ui/location_enable_screens/address_list_screen.d import 'package:customer/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart'; -import 'package:customer/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart' show RestaurantListScreen; +import 'package:customer/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart' + show RestaurantListScreen; import 'package:customer/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/search_screen/search_screen.dart'; @@ -37,7 +38,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; class HomeECommerceScreen extends StatelessWidget { @@ -53,13 +54,18 @@ class HomeECommerceScreen extends StatelessWidget { return Scaffold( backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + backgroundColor: + isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, titleSpacing: 0, leading: InkWell( onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, size: 20), + child: Icon( + Icons.arrow_back, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + size: 20, + ), ), title: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -69,9 +75,27 @@ class HomeECommerceScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 12)), + child: Text( + "Login".tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 12, + ), + ), ) - : Text(Constant.userModel!.fullName(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 12)), + : Text( + Constant.userModel!.fullName(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey50, + fontSize: 12, + ), + ), InkWell( onTap: () async { if (Constant.userModel != null) { @@ -96,7 +120,9 @@ class HomeECommerceScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; final lat = firstPlace.coordinates.latitude; @@ -105,19 +131,31 @@ class HomeECommerceScreen extends StatelessWidget { shippingAddress.addressAs = "Home"; shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); + shippingAddress.location = UserLocation( + latitude: lat, + longitude: lng, + ); Constant.selectedLocation = shippingAddress; controller.getData(); Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel selectedLocationModel = + value; shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; // You can reverse-geocode + shippingAddress.location = UserLocation( + latitude: + selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); + shippingAddress.locality = + "Picked from Map"; // You can reverse-geocode Constant.selectedLocation = shippingAddress; controller.getData(); @@ -125,9 +163,15 @@ class HomeECommerceScreen extends StatelessWidget { }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + shippingAddress.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; shippingAddress.locality = currentLocation; @@ -147,8 +191,25 @@ class HomeECommerceScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, TextSpan( children: [ - TextSpan(text: Constant.selectedLocation.getFullAddress(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 14)), - WidgetSpan(child: SvgPicture.asset("assets/icons/ic_down.svg", colorFilter: ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn))), + TextSpan( + text: Constant.selectedLocation.getFullAddress(), + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 14, + ), + ), + WidgetSpan( + child: SvgPicture.asset( + "assets/icons/ic_down.svg", + colorFilter: ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ), + ), ], ), ), @@ -168,10 +229,14 @@ class HomeECommerceScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey50, ), ), - badgeStyle: badges.BadgeStyle(shape: badges.BadgeShape.circle, badgeColor: AppThemeData.info300), + badgeStyle: badges.BadgeStyle( + shape: badges.BadgeShape.circle, + badgeColor: AppThemeData.info300, + ), child: InkWell( onTap: () async { (await Get.to(const CartScreen())); @@ -182,11 +247,28 @@ class HomeECommerceScreen extends StatelessWidget { width: 30, height: 30, decoration: ShapeDecoration( - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), borderRadius: BorderRadius.circular(120)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: BorderRadius.circular(120), + ), ), child: Padding( padding: const EdgeInsets.all(8.0), - child: SvgPicture.asset("assets/icons/ic_shoping_cart.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey50 : AppThemeData.grey50, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_shoping_cart.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + BlendMode.srcIn, + ), + ), ), ), ), @@ -196,22 +278,39 @@ class HomeECommerceScreen extends StatelessWidget { ), ], bottom: PreferredSize( - preferredSize: Size.fromHeight(50.0), // height of the bottom widget + preferredSize: Size.fromHeight( + 50.0, + ), // height of the bottom widget child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), child: InkWell( onTap: () { - Get.to(const SearchScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); + Get.to( + const SearchScreen(), + arguments: { + "vendorList": controller.allNearestRestaurant, + }, + ); }, child: TextFieldWidget( hintText: 'Search the store, item and more...'.tr(), controller: null, enable: false, backgroundColor: AppThemeData.grey50, - hintColor: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + hintColor: + isDark ? AppThemeData.grey400 : AppThemeData.grey400, prefix: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), - child: SvgPicture.asset("assets/icons/ic_search.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey400, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_search.svg", + colorFilter: ColorFilter.mode( + isDark ? AppThemeData.grey400 : AppThemeData.grey400, + BlendMode.srcIn, + ), + ), ), ), ), @@ -236,7 +335,13 @@ class HomeECommerceScreen extends StatelessWidget { child: Text( "Category".tr(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), InkWell( @@ -248,7 +353,10 @@ class HomeECommerceScreen extends StatelessWidget { textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( decoration: TextDecoration.underline, - color: isDark ? AppThemeData.multiVendorDark300 : AppThemeData.multiVendor300, + color: + isDark + ? AppThemeData.multiVendorDark300 + : AppThemeData.multiVendor300, fontSize: 14, ), ), @@ -264,26 +372,51 @@ class HomeECommerceScreen extends StatelessWidget { child: ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - itemCount: controller.vendorCategoryModel.length, + itemCount: + controller.vendorCategoryModel.length, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": false}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": + vendorCategoryModel, + "dineIn": false, + }, + ); }, child: Padding( padding: const EdgeInsets.only(right: 18), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), height: 60, width: 60, fit: BoxFit.cover), + NetworkImageWidget( + imageUrl: + vendorCategoryModel.photo + .toString(), + height: 60, + width: 60, + fit: BoxFit.cover, + ), const SizedBox(height: 5), Text( - vendorCategoryModel.title.toString(), + vendorCategoryModel.title + .toString(), textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, fontSize: 14), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + fontSize: 14, + ), ), ], ), @@ -294,20 +427,38 @@ class HomeECommerceScreen extends StatelessWidget { ), ), SizedBox(height: 10), - Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: controller.bannerModel.isEmpty ? const SizedBox() : BannerView(controller: controller)), - Visibility(visible: (Constant.isEnableAdsFeature == true && controller.advertisementList.isNotEmpty), child: const SizedBox(height: 20)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: + controller.bannerModel.isEmpty + ? const SizedBox() + : BannerView(controller: controller), + ), + Visibility( + visible: + (Constant.isEnableAdsFeature == true && + controller.advertisementList.isNotEmpty), + child: const SizedBox(height: 20), + ), Visibility( visible: Constant.isEnableAdsFeature == true, child: controller.advertisementList.isEmpty ? const SizedBox() : Container( - color: AppThemeData.primary300.withAlpha(40), + color: AppThemeData.primary300.withAlpha( + 40, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -315,19 +466,41 @@ class HomeECommerceScreen extends StatelessWidget { child: Text( "Highlights for you".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + ), ), ), InkWell( onTap: () { - Get.to(AllAdvertisementScreen())?.then((value) { - controller.getFavouriteRestaurant(); + Get.to( + AllAdvertisementScreen(), + )?.then((value) { + controller + .getFavouriteRestaurant(); }); }, child: Text( "View all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], @@ -336,12 +509,30 @@ class HomeECommerceScreen extends StatelessWidget { SizedBox( height: 220, child: ListView.builder( - physics: const BouncingScrollPhysics(), - scrollDirection: Axis.horizontal, - itemCount: controller.advertisementList.length >= 10 ? 10 : controller.advertisementList.length, + physics: + const BouncingScrollPhysics(), + scrollDirection: + Axis.horizontal, + itemCount: + controller + .advertisementList + .length >= + 10 + ? 10 + : controller + .advertisementList + .length, padding: EdgeInsets.all(0), - itemBuilder: (BuildContext context, int index) { - return AdvertisementHomeCard(controller: controller, model: controller.advertisementList[index]); + itemBuilder: ( + BuildContext context, + int index, + ) { + return AdvertisementHomeCard( + controller: controller, + model: + controller + .advertisementList[index], + ); }, ), ), @@ -356,7 +547,13 @@ class HomeECommerceScreen extends StatelessWidget { child: Text( "New Arrivals".tr(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), SizedBox(height: 20), @@ -372,7 +569,13 @@ class HomeECommerceScreen extends StatelessWidget { childAspectRatio: 1 / 1.1, padding: EdgeInsets.zero, physics: NeverScrollableScrollPhysics(), - children: controller.newArrivalRestaurantList.take(4).map((item) => NewArrivalCard(item: item)).toList(), + children: + controller.newArrivalRestaurantList + .take(4) + .map( + (item) => NewArrivalCard(item: item), + ) + .toList(), ), ), ), @@ -381,11 +584,24 @@ class HomeECommerceScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16), child: RoundedButtonBorder( radius: 10, - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey100, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, title: 'View All Arrivals'.tr(), onPress: () { - Get.to(RestaurantListScreen(), arguments: {"vendorList": controller.newArrivalRestaurantList, "title": "New Arrivals".tr()}); + Get.to( + RestaurantListScreen(), + arguments: { + "vendorList": + controller.newArrivalRestaurantList, + "title": "New Arrivals".tr(), + }, + ); }, ), ), @@ -395,19 +611,38 @@ class HomeECommerceScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Top Brands".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text( + "Top Brands".tr(), + textAlign: TextAlign.start, + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), SizedBox(height: 10), GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 4.5 / 6, crossAxisSpacing: 2), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 4.5 / 6, + crossAxisSpacing: 2, + ), itemCount: controller.brandList.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - BrandsModel brandModel = controller.brandList[index]; + BrandsModel brandModel = + controller.brandList[index]; return InkWell( onTap: () { - Get.to(AllBrandProductScreen(), arguments: {"brandModel": brandModel}); + Get.to( + AllBrandProductScreen(), + arguments: {"brandModel": brandModel}, + ); }, child: Column( children: [ @@ -415,20 +650,49 @@ class HomeECommerceScreen extends StatelessWidget { width: 80, height: 80, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, strokeAlign: BorderSide.strokeAlignOutside, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), - borderRadius: BorderRadius.circular(10), + side: BorderSide( + width: 1, + strokeAlign: + BorderSide + .strokeAlignOutside, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData + .grey100, + ), + borderRadius: + BorderRadius.circular(10), + ), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: ClipOval( + child: NetworkImageWidget( + imageUrl: + brandModel.photo + .toString(), + fit: BoxFit.cover, + ), ), ), - child: Padding(padding: const EdgeInsets.all(10), child: ClipOval(child: NetworkImageWidget(imageUrl: brandModel.photo.toString(), fit: BoxFit.cover))), ), SizedBox(height: 5), Text( '${brandModel.title}', textAlign: TextAlign.center, maxLines: 2, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), @@ -443,137 +707,389 @@ class HomeECommerceScreen extends StatelessWidget { shrinkWrap: true, physics: const BouncingScrollPhysics(), padding: EdgeInsets.zero, - itemCount: controller.categoryWiseProductList.length, + itemCount: + controller.categoryWiseProductList.length, itemBuilder: (context, index) { - VendorCategoryModel item = controller.categoryWiseProductList[index]; - String imagePath = ["assets/images/ic_product_bg_1.png", "assets/images/ic_product_bg_2.png", "assets/images/ic_product_bg_3.png"][index % ["", "", ""].length]; + VendorCategoryModel item = + controller.categoryWiseProductList[index]; + String imagePath = + [ + "assets/images/ic_product_bg_1.png", + "assets/images/ic_product_bg_2.png", + "assets/images/ic_product_bg_3.png", + ][index % ["", "", ""].length]; return Container( width: Responsive.width(100, context), - decoration: BoxDecoration(image: DecorationImage(image: AssetImage(imagePath), fit: BoxFit.fill)), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(imagePath), + fit: BoxFit.fill, + ), + ), child: Padding( - padding: const EdgeInsets.only(left: 16, right: 16, top: 10, bottom: 20), + padding: const EdgeInsets.only( + left: 16, + right: 16, + top: 10, + bottom: 20, + ), child: FutureBuilder>( - future: FireStoreUtils.getProductListByCategoryId(item.id.toString()), + future: + FireStoreUtils.getProductListByCategoryId( + item.id.toString(), + ), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))); - } else if ((snapshot.hasData || (snapshot.data?.isNotEmpty ?? false))) { - List productList = snapshot.data!; + if (snapshot.connectionState == + ConnectionState.waiting) { + return Center( + child: + CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ); + } else if ((snapshot.hasData || + (snapshot.data?.isNotEmpty ?? + false))) { + List productList = + snapshot.data!; return snapshot.data!.isEmpty ? Container() : Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, children: [ - Text(item.title.toString(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 18)), Text( - "Style up with the latest fits, now at unbeatable prices.".tr(), + item.title.toString(), textAlign: TextAlign.start, - style: AppThemeData.regularTextStyle(color: AppThemeData.grey900, fontSize: 12), + style: + AppThemeData.boldTextStyle( + color: + AppThemeData + .grey900, + fontSize: 18, + ), + ), + Text( + "Style up with the latest fits, now at unbeatable prices." + .tr(), + textAlign: TextAlign.start, + style: + AppThemeData.regularTextStyle( + color: + AppThemeData + .grey900, + fontSize: 12, + ), ), SizedBox(height: 20), GridView.builder( shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 3.5 / 6, crossAxisSpacing: 10), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: + 3.5 / 6, + crossAxisSpacing: 10, + ), padding: EdgeInsets.zero, - physics: NeverScrollableScrollPhysics(), - itemCount: productList.length > 6 ? 6 : productList.length, - itemBuilder: (context, index) { - ProductModel productModel = productList[index]; + physics: + NeverScrollableScrollPhysics(), + itemCount: + productList.length > 6 + ? 6 + : productList.length, + itemBuilder: ( + context, + index, + ) { + ProductModel productModel = + productList[index]; return FutureBuilder( - future: FireStoreUtils.getVendorById(productModel.vendorID.toString()), - builder: (context, vendorSnapshot) { - if (!vendorSnapshot.hasData || vendorSnapshot.connectionState == ConnectionState.waiting) { + future: + FireStoreUtils.getVendorById( + productModel + .vendorID + .toString(), + ), + builder: ( + context, + vendorSnapshot, + ) { + if (!vendorSnapshot + .hasData || + vendorSnapshot + .connectionState == + ConnectionState + .waiting) { return const SizedBox(); // Show placeholder or loader } - VendorModel? vendorModel = vendorSnapshot.data; + VendorModel? + vendorModel = + vendorSnapshot.data; String price = "0.0"; String disPrice = "0.0"; - List selectedVariants = []; - List selectedIndexVariants = []; - List selectedIndexArray = []; - if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { - if (element.attributeOptions!.isNotEmpty) { + List + selectedVariants = []; + List + selectedIndexVariants = + []; + List + selectedIndexArray = []; + if (productModel + .itemAttribute != + null) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { + if (element + .attributeOptions! + .isNotEmpty) { selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf( + element, + )] + .attributeOptions![0] + .toString(), ); - selectedIndexVariants.add( - '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', - ); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedIndexVariants + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel + .itemAttribute! + .variants! + .where( + (element) => + element + .variantSku == + selectedVariants + .join( + '-', + ), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( vendorModel!, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel + .itemAttribute! + .variants! + .where( + ( + element, + ) => + element.variantSku == + selectedVariants.join( + '-', + ), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); + price = + Constant.productCommissionPrice( + vendorModel!, + productModel + .price + .toString(), + ); disPrice = - double.parse(productModel.disPrice.toString()) <= 0 + double.parse( + productModel + .disPrice + .toString(), + ) <= + 0 ? "0" - : Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + : Constant.productCommissionPrice( + vendorModel, + productModel + .disPrice + .toString(), + ); } return GestureDetector( onTap: () async { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + vendorModel, + }, + ); }, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ ClipRRect( - borderRadius: BorderRadius.circular(10), + borderRadius: + BorderRadius.circular( + 10, + ), child: SizedBox( height: 90, - width: Responsive.width(100, context), - child: NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover), + width: + Responsive.width( + 100, + context, + ), + child: NetworkImageWidget( + imageUrl: + productModel + .photo + .toString(), + fit: + BoxFit + .cover, + ), ), ), Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - productModel.name!.capitalizeString(), - textAlign: TextAlign.start, + productModel + .name! + .capitalizeString(), + textAlign: + TextAlign + .start, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 18, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), - disPrice == "" || disPrice == "0" - ? Text(Constant.amountShow(amount: price), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.primary300)) + disPrice == + "" || + disPrice == + "0" + ? Text( + Constant.amountShow( + amount: + price, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 16, + color: + AppThemeData.primary300, + ), + ) : Column( children: [ Text( - Constant.amountShow(amount: price), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: Colors.grey, decoration: TextDecoration.lineThrough), + Constant.amountShow( + amount: + price, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 14, + color: + Colors.grey, + decoration: + TextDecoration.lineThrough, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( - Constant.amountShow(amount: disPrice), - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + disPrice, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.warning50 + : AppThemeData.warning50, + borderRadius: + BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisSize: + MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: + 18, + color: + AppThemeData.warning400, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount.toString(), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: AppThemeData.semiBoldTextStyle( + fontSize: + 12, + color: + AppThemeData.warning400, + ), ), ], ), @@ -590,11 +1106,26 @@ class HomeECommerceScreen extends StatelessWidget { ), RoundedButtonBorder( radius: 10, - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + color: + isDark + ? AppThemeData + .greyDark100 + : AppThemeData + .grey100, + borderColor: + isDark + ? AppThemeData + .greyDark200 + : AppThemeData + .grey200, title: 'View All Products', onPress: () { - Get.to(AllCategoryProductScreen(), arguments: {"categoryModel": item}); + Get.to( + AllCategoryProductScreen(), + arguments: { + "categoryModel": item, + }, + ); }, ), ], @@ -609,7 +1140,13 @@ class HomeECommerceScreen extends StatelessWidget { }, ), SizedBox(height: 10), - Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: controller.bannerModel.isEmpty ? const SizedBox() : BannerBottomView(controller: controller)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: + controller.bannerModel.isEmpty + ? const SizedBox() + : BannerBottomView(controller: controller), + ), // Visibility( // visible: (Constant.isEnableAdsFeature == true && controller.advertisementList.isNotEmpty), // child: const SizedBox(height: 20), @@ -687,56 +1224,145 @@ class HomeECommerceScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("All Store".tr(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text( + "All Store".tr(), + textAlign: TextAlign.start, + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), SizedBox(height: 10), ListView.builder( padding: EdgeInsets.zero, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - itemCount: controller.allNearestRestaurant.length > 8 ? 8 : controller.allNearestRestaurant.length, + itemCount: + controller.allNearestRestaurant.length > 8 + ? 8 + : controller + .allNearestRestaurant + .length, itemBuilder: (context, index) { - VendorModel item = controller.allNearestRestaurant[index]; + VendorModel item = + controller.allNearestRestaurant[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": item}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": item}, + ); }, child: Padding( - padding: const EdgeInsets.only(bottom: 20), + padding: const EdgeInsets.only( + bottom: 20, + ), child: Row( children: [ - ClipRRect(borderRadius: BorderRadius.circular(10), child: NetworkImageWidget(imageUrl: item.photo.toString(), height: 80, width: 130, fit: BoxFit.cover)), + ClipRRect( + borderRadius: + BorderRadius.circular(10), + child: NetworkImageWidget( + imageUrl: item.photo.toString(), + height: 80, + width: 130, + fit: BoxFit.cover, + ), + ), SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text(item.title.toString(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), + Text( + item.title.toString(), + style: + AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + fontSize: 16, + ), + ), Row( children: [ - Icon(Icons.location_on, size: 14, color: Colors.grey), + Icon( + Icons.location_on, + size: 14, + color: Colors.grey, + ), SizedBox(width: 4), Expanded( child: Text( - item.location.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), - overflow: TextOverflow.ellipsis, + item.location + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark500 + : AppThemeData + .grey500, + ), + overflow: + TextOverflow + .ellipsis, ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData + .warning50 + : AppThemeData + .warning50, + borderRadius: + BorderRadius.circular( + 30, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, + mainAxisSize: + MainAxisSize.min, children: [ - Icon(Icons.star, size: 18, color: AppThemeData.warning400), + Icon( + Icons.star, + size: 18, + color: + AppThemeData + .warning400, + ), Text( "${Constant.calculateReview(reviewCount: item.reviewsCount.toString(), reviewSum: item.reviewsSum.toString())} (${item.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + AppThemeData + .warning400, + ), ), ], ), @@ -753,11 +1379,23 @@ class HomeECommerceScreen extends StatelessWidget { ), RoundedButtonBorder( radius: 10, - color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey100, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, title: 'View All Stores'.tr(), onPress: () { - Get.to(const RestaurantListScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); + Get.to( + const RestaurantListScreen(), + arguments: { + "vendorList": + controller.allNearestRestaurant, + }, + ); }, ), ], @@ -784,7 +1422,10 @@ class NewArrivalCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": item}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": item}, + ); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -795,11 +1436,20 @@ class NewArrivalCard extends StatelessWidget { height: 100, width: double.infinity, fit: BoxFit.cover, - imageUrl: item.photo != null && item.photo!.isNotEmpty ? item.photo.toString() : Constant.placeHolderImage.toString(), + imageUrl: + item.photo != null && item.photo!.isNotEmpty + ? item.photo.toString() + : Constant.placeHolderImage.toString(), ), ), SizedBox(height: 5), - Text(item.title.toString(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 14)), + Text( + item.title.toString(), + style: AppThemeData.semiBoldTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + fontSize: 14, + ), + ), Row( children: [ Icon(Icons.location_on, size: 14, color: Colors.grey), @@ -807,14 +1457,23 @@ class NewArrivalCard extends StatelessWidget { Expanded( child: Text( item.location.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), overflow: TextOverflow.ellipsis, ), ), ], ), Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, borderRadius: BorderRadius.circular(30)), + decoration: BoxDecoration( + color: isDark ? AppThemeData.warning50 : AppThemeData.warning50, + borderRadius: BorderRadius.circular(30), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), child: Row( @@ -825,7 +1484,10 @@ class NewArrivalCard extends StatelessWidget { Icon(Icons.star, size: 18, color: AppThemeData.warning400), Text( "${Constant.calculateReview(reviewCount: item.reviewsCount.toString(), reviewSum: item.reviewsSum.toString())} (${item.reviewsSum})", - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: AppThemeData.warning400), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: AppThemeData.warning400, + ), ), ], ), @@ -865,17 +1527,32 @@ class BannerView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr()); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -887,7 +1564,13 @@ class BannerView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -905,7 +1588,13 @@ class BannerView extends StatelessWidget { alignment: Alignment.centerLeft, height: 9, width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentPage.value == index ? AppThemeData.primary300 : Colors.black12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentPage.value == index + ? AppThemeData.primary300 + : Colors.black12, + ), ), ); }), @@ -944,17 +1633,32 @@ class BannerBottomView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr()); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -966,7 +1670,13 @@ class BannerBottomView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -977,14 +1687,22 @@ class BannerBottomView extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.bannerBottomModel.length, (index) { + children: List.generate(controller.bannerBottomModel.length, ( + index, + ) { return Obx( () => Container( margin: const EdgeInsets.only(right: 5), alignment: Alignment.centerLeft, height: 9, width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentBottomPage.value == index ? AppThemeData.primary300 : Colors.black12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentBottomPage.value == index + ? AppThemeData.primary300 + : Colors.black12, + ), ), ); }), @@ -999,7 +1717,11 @@ class AdvertisementHomeCard extends StatelessWidget { final AdvertisementModel model; final HomeECommerceController controller; - const AdvertisementHomeCard({super.key, required this.controller, required this.model}); + const AdvertisementHomeCard({ + super.key, + required this.controller, + required this.model, + }); @override Widget build(BuildContext context) { @@ -1008,9 +1730,14 @@ class AdvertisementHomeCard extends StatelessWidget { return InkWell( onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(model.vendorId!); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + model.vendorId!, + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Container( margin: EdgeInsets.only(right: 16), @@ -1018,7 +1745,14 @@ class AdvertisementHomeCard extends StatelessWidget { decoration: BoxDecoration( color: isDark ? AppThemeData.info600 : AppThemeData.surface, borderRadius: BorderRadius.circular(16), - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.1), blurRadius: isDark ? 6 : 2, spreadRadius: 0, offset: Offset(0, isDark ? 3 : 1))], + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: isDark ? 6 : 2, + spreadRadius: 0, + offset: Offset(0, isDark ? 3 : 1), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -1027,18 +1761,32 @@ class AdvertisementHomeCard extends StatelessWidget { children: [ model.type == 'restaurant_promotion' ? ClipRRect( - borderRadius: BorderRadius.vertical(top: Radius.circular(16)), - child: NetworkImageWidget(imageUrl: model.coverImage ?? '', height: 135, width: double.infinity, fit: BoxFit.cover), + borderRadius: BorderRadius.vertical( + top: Radius.circular(16), + ), + child: NetworkImageWidget( + imageUrl: model.coverImage ?? '', + height: 135, + width: double.infinity, + fit: BoxFit.cover, + ), ) - : VideoAdvWidget(url: model.video ?? '', height: 135, width: double.infinity), - if (model.type != 'video_promotion' && model.vendorId != null && (model.showRating == true || model.showReview == true)) + : VideoAdvWidget( + url: model.video ?? '', + height: 135, + width: double.infinity, + ), + if (model.type != 'video_promotion' && + model.vendorId != null && + (model.showRating == true || model.showReview == true)) Positioned( bottom: 8, right: 8, child: FutureBuilder( future: FireStoreUtils.getVendorById(model.vendorId!), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); } else { if (snapshot.hasError) { @@ -1048,16 +1796,43 @@ class AdvertisementHomeCard extends StatelessWidget { } else { VendorModel vendorModel = snapshot.data!; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - if (model.showRating == true) SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - if (model.showRating == true) const SizedBox(width: 5), + if (model.showRating == true) + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), + if (model.showRating == true) + const SizedBox(width: 5), Text( "${model.showRating == true ? Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString()) : ''} ${model.showReview == true ? '(${vendorModel.reviewsCount!.toStringAsFixed(0)})' : ''}", - style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -1076,7 +1851,15 @@ class AdvertisementHomeCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (model.type == 'restaurant_promotion') - ClipRRect(borderRadius: BorderRadius.circular(30), child: NetworkImageWidget(imageUrl: model.profileImage ?? '', height: 50, width: 50, fit: BoxFit.cover)), + ClipRRect( + borderRadius: BorderRadius.circular(30), + child: NetworkImageWidget( + imageUrl: model.profileImage ?? '', + height: 50, + width: 50, + fit: BoxFit.cover, + ), + ), SizedBox(width: 8), Expanded( child: Column( @@ -1084,12 +1867,26 @@ class AdvertisementHomeCard extends StatelessWidget { children: [ Text( model.title ?? '', - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 14, fontWeight: FontWeight.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 14, + fontWeight: FontWeight.bold, + ), overflow: TextOverflow.ellipsis, ), Text( model.description ?? '', - style: TextStyle(fontSize: 12, fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey600), + style: TextStyle( + fontSize: 12, + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + ), overflow: TextOverflow.ellipsis, maxLines: 2, ), @@ -1100,26 +1897,73 @@ class AdvertisementHomeCard extends StatelessWidget { ? IconButton( icon: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey600, BlendMode.srcIn)), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == model.vendorId, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), ), onPressed: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == model.vendorId); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where((p0) => p0.restaurantId == model.vendorId) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => item.restaurantId == model.vendorId, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } controller.update(); }, ) : Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))), - child: Padding(padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Icon(Icons.arrow_forward, size: 20, color: AppThemeData.primary300)), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 4, + ), + child: Icon( + Icons.arrow_forward, + size: 20, + color: AppThemeData.primary300, + ), + ), ), ], ), diff --git a/lib/screen_ui/location_enable_screens/address_list_screen.dart b/lib/screen_ui/location_enable_screens/address_list_screen.dart index 474620a..f8eca2e 100644 --- a/lib/screen_ui/location_enable_screens/address_list_screen.dart +++ b/lib/screen_ui/location_enable_screens/address_list_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class AddressListScreen extends StatelessWidget { const AddressListScreen({super.key}); @@ -39,50 +39,120 @@ class AddressListScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("My Addresses".tr(), style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "My Addresses".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 5), - Text("Allows users to view, manage, add, or edit delivery addresses.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), + Text( + "Allows users to view, manage, add, or edit delivery addresses." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey600, + ), + ), const SizedBox(height: 24), Expanded( child: controller.shippingAddressList.isEmpty - ? Constant.showEmptyView(message: "Address not found".tr()) + ? Constant.showEmptyView( + message: "Address not found".tr(), + ) : ListView.separated( - itemCount: controller.shippingAddressList.length, + itemCount: + controller.shippingAddressList.length, itemBuilder: (context, index) { - ShippingAddress address = controller.shippingAddressList[index]; + ShippingAddress address = + controller.shippingAddressList[index]; return InkWell( onTap: () { Get.back(result: address); }, child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData + .greyDark100 + : AppThemeData + .grey100, + borderRadius: + BorderRadius.circular( + 8, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Text( - address.addressAs.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + address.addressAs + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ), ), SizedBox(width: 10), address.isDefault == true ? Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.success100 : AppThemeData.success100, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData + .success100 + : AppThemeData + .success100, + borderRadius: + BorderRadius.circular( + 8, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: + const EdgeInsets.symmetric( + horizontal: + 10, + vertical: 5, + ), child: Text( "Default".tr(), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ), ) @@ -91,35 +161,72 @@ class AddressListScreen extends StatelessWidget { ), SizedBox(height: 10), Text( - address.getFullAddress().toString(), - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + address + .getFullAddress() + .toString(), + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark800 + : AppThemeData + .grey800, + ), ), ], ), ), InkWell( onTap: () async { - await controller.deleteAddress(index); + await controller.deleteAddress( + index, + ); }, - child: SvgPicture.asset("assets/icons/ic_delete_address.svg"), + child: SvgPicture.asset( + "assets/icons/ic_delete_address.svg", + ), ), SizedBox(width: 10), InkWell( onTap: () { - Get.to(EnterManuallyLocationScreen(), arguments: {"address": address, "mode": "Edit"})!.then((value) { + Get.to( + EnterManuallyLocationScreen(), + arguments: { + "address": address, + "mode": "Edit", + }, + )!.then((value) { if (value == true) { controller.getUser(); } }); }, - child: SvgPicture.asset("assets/icons/ic_edit_address.svg"), + child: SvgPicture.asset( + "assets/icons/ic_edit_address.svg", + ), ), ], ), ); }, - separatorBuilder: (BuildContext context, int index) { - return Padding(padding: const EdgeInsets.symmetric(vertical: 20), child: Divider(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, height: 1)); + separatorBuilder: ( + BuildContext context, + int index, + ) { + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, + ), + child: Divider( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + height: 1, + ), + ); }, ), ), @@ -127,9 +234,14 @@ class AddressListScreen extends StatelessWidget { ), ), bottomNavigationBar: Padding( - padding: const EdgeInsets.only(bottom: 30, left: 16, right: 16, top: 20), + padding: const EdgeInsets.only( + bottom: 30, + left: 16, + right: 16, + top: 20, + ), child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Add New Address", onPress: () { Get.to(EnterManuallyLocationScreen())!.then((value) { @@ -140,7 +252,15 @@ class AddressListScreen extends StatelessWidget { }, isRight: false, isCenter: true, - icon: SvgPicture.asset(AppAssets.icPlus, width: 20, height: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.greyDark900), + icon: SvgPicture.asset( + AppAssets.icPlus, + width: 20, + height: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.greyDark900, + ), color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, textColor: isDark ? AppThemeData.grey50 : AppThemeData.grey50, ), diff --git a/lib/screen_ui/location_enable_screens/enter_manually_location.dart b/lib/screen_ui/location_enable_screens/enter_manually_location.dart index 83046f1..ff1f41e 100644 --- a/lib/screen_ui/location_enable_screens/enter_manually_location.dart +++ b/lib/screen_ui/location_enable_screens/enter_manually_location.dart @@ -9,8 +9,7 @@ import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../controllers/enter_manually_location_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -40,23 +39,50 @@ class EnterManuallyLocationScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 10, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - controller.mode == "Edit" ? "Edit Address".tr() : "Add a New Address".tr(), - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller.mode == "Edit" + ? "Edit Address".tr() + : "Add a New Address".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), - Text("Enter your location details so we can deliver your orders quickly and accurately.".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600)), + Text( + "Enter your location details so we can deliver your orders quickly and accurately." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey600, + ), + ), const SizedBox(height: 24), Row( children: [ - Expanded(child: Text("Set as Default Address".tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey600))), + Expanded( + child: Text( + "Set as Default Address".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey600, + ), + ), + ), Transform.scale( - scale: 0.7, // Decrease the size (try 0.5, 0.6, etc.) + scale: + 0.7, // Decrease the size (try 0.5, 0.6, etc.) child: Switch( value: controller.isDefault.value, onChanged: (value) { @@ -74,23 +100,53 @@ class EnterManuallyLocationScreen extends StatelessWidget { context: context, onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.localityEditingController.value.text = address.toString(); - controller.location.value = UserLocation(latitude: lat, longitude: lng); + controller + .localityEditingController + .value + .text = address.toString(); + controller.location.value = UserLocation( + latitude: lat, + longitude: lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.localityEditingController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.location.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + controller + .localityEditingController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller + .location + .value = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); } }); } @@ -109,23 +165,55 @@ class EnterManuallyLocationScreen extends StatelessWidget { context: context, onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.localityEditingController.value.text = address.toString(); - controller.location.value = UserLocation(latitude: lat, longitude: lng); + controller + .localityEditingController + .value + .text = address.toString(); + controller + .location + .value = UserLocation( + latitude: lat, + longitude: lng, + ); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - controller.localityEditingController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.location.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + controller + .localityEditingController + .value + .text = Utils.formatAddress( + selectedLocation: + selectedLocationModel, + ); + controller + .location + .value = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); Get.back(); } }); @@ -133,20 +221,50 @@ class EnterManuallyLocationScreen extends StatelessWidget { }, ); }, - child: Padding(padding: const EdgeInsets.only(right: 10), child: Icon(Icons.gps_fixed, size: 24, color: AppThemeData.ecommerce300)), + child: Padding( + padding: const EdgeInsets.only(right: 10), + child: Icon( + Icons.gps_fixed, + size: 24, + color: AppThemeData.ecommerce300, + ), + ), ), ), ), const SizedBox(height: 15), - TextFieldWidget(title: "Flat/House/Floor/Building*".tr(), hintText: "Enter address details".tr(), controller: controller.houseBuildingTextEditingController.value), + TextFieldWidget( + title: "Flat/House/Floor/Building*".tr(), + hintText: "Enter address details".tr(), + controller: + controller + .houseBuildingTextEditingController + .value, + ), const SizedBox(height: 15), - TextFieldWidget(title: "Area/Sector/Locality*".tr(), hintText: "Enter area/locality".tr(), controller: controller.localityEditingController.value), + TextFieldWidget( + title: "Area/Sector/Locality*".tr(), + hintText: "Enter area/locality".tr(), + controller: + controller.localityEditingController.value, + ), const SizedBox(height: 15), - TextFieldWidget(title: "Nearby Landmark".tr(), hintText: "Add a landmark".tr(), controller: controller.landmarkEditingController.value), + TextFieldWidget( + title: "Nearby Landmark".tr(), + hintText: "Add a landmark".tr(), + controller: + controller.landmarkEditingController.value, + ), const SizedBox(height: 30), Container(height: 1, color: AppThemeData.grey200), const SizedBox(height: 25), - Text("Save Address As".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + Text( + "Save Address As".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), const SizedBox(height: 10), Wrap( spacing: 10, @@ -155,17 +273,37 @@ class EnterManuallyLocationScreen extends StatelessWidget { .map( (item) => GestureDetector( onTap: () { - controller.selectedSaveAs.value = item; + controller.selectedSaveAs.value = + item; }, child: Container( decoration: BoxDecoration( - color: controller.selectedSaveAs.value == item ? AppThemeData.primary300 : AppThemeData.grey100, - borderRadius: BorderRadius.circular(10), + color: + controller + .selectedSaveAs + .value == + item + ? AppThemeData.primary300 + : AppThemeData.grey100, + borderRadius: BorderRadius.circular( + 10, + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 10, ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), child: Text( controller.getLocalizedSaveAs(item), - style: AppThemeData.mediumTextStyle(color: controller.selectedSaveAs.value == item ? AppThemeData.grey50 : AppThemeData.grey600), + style: AppThemeData.mediumTextStyle( + color: + controller + .selectedSaveAs + .value == + item + ? AppThemeData.grey50 + : AppThemeData.grey600, + ), textAlign: TextAlign.center, ), ), @@ -175,55 +313,111 @@ class EnterManuallyLocationScreen extends StatelessWidget { ), const SizedBox(height: 30), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Save Address".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { - if (controller.location.value.latitude == null || controller.location.value.longitude == null) { - ShowToastDialog.showToast("Please select Location".tr()); - } else if (controller.houseBuildingTextEditingController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Flat / House / Floor / Building".tr()); - } else if (controller.localityEditingController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Area / Sector / Locality".tr()); + if (controller.location.value.latitude == null || + controller.location.value.longitude == null) { + ShowToastDialog.showToast( + "Please select Location".tr(), + ); + } else if (controller + .houseBuildingTextEditingController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please Enter Flat / House / Floor / Building" + .tr(), + ); + } else if (controller + .localityEditingController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please Enter Area / Sector / Locality".tr(), + ); } else { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); //Common values - controller.shippingModel.value.location = controller.location.value; - controller.shippingModel.value.addressAs = controller.selectedSaveAs.value; - controller.shippingModel.value.address = controller.houseBuildingTextEditingController.value.text; - controller.shippingModel.value.locality = controller.localityEditingController.value.text; - controller.shippingModel.value.landmark = controller.landmarkEditingController.value.text; + controller.shippingModel.value.location = + controller.location.value; + controller.shippingModel.value.addressAs = + controller.selectedSaveAs.value; + controller.shippingModel.value.address = + controller + .houseBuildingTextEditingController + .value + .text; + controller.shippingModel.value.locality = + controller + .localityEditingController + .value + .text; + controller.shippingModel.value.landmark = + controller + .landmarkEditingController + .value + .text; if (controller.mode.value == "Edit") { //Edit Mode controller.shippingAddressList.value = - controller.shippingAddressList.map((address) { - if (address.id == controller.shippingModel.value.id) { - return controller.shippingModel.value; // replace existing one + controller.shippingAddressList.map(( + address, + ) { + if (address.id == + controller.shippingModel.value.id) { + return controller + .shippingModel + .value; // replace existing one } return address; }).toList(); - Constant.selectedLocation = controller.shippingModel.value; + Constant.selectedLocation = + controller.shippingModel.value; } else { //Add Mode - controller.shippingModel.value.id = Constant.getUuid(); - controller.shippingModel.value.isDefault = controller.shippingAddressList.isEmpty ? true : false; - controller.shippingAddressList.add(controller.shippingModel.value); + controller.shippingModel.value.id = + Constant.getUuid(); + controller.shippingModel.value.isDefault = + controller.shippingAddressList.isEmpty + ? true + : false; + controller.shippingAddressList.add( + controller.shippingModel.value, + ); } //Handle default address switch if (controller.isDefault.value) { controller.shippingAddressList.value = - controller.shippingAddressList.map((address) { - address.isDefault = address.id == controller.shippingModel.value.id ? true : false; + controller.shippingAddressList.map(( + address, + ) { + address.isDefault = + address.id == + controller + .shippingModel + .value + .id + ? true + : false; return address; }).toList(); } - controller.userModel.value.shippingAddress = controller.shippingAddressList; - await FireStoreUtils.updateUser(controller.userModel.value); + controller.userModel.value.shippingAddress = + controller.shippingAddressList; + await FireStoreUtils.updateUser( + controller.userModel.value, + ); ShowToastDialog.closeLoader(); Get.back(result: true); diff --git a/lib/screen_ui/location_enable_screens/location_permission_screen.dart b/lib/screen_ui/location_enable_screens/location_permission_screen.dart index b3903e1..7577eea 100644 --- a/lib/screen_ui/location_enable_screens/location_permission_screen.dart +++ b/lib/screen_ui/location_enable_screens/location_permission_screen.dart @@ -14,8 +14,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../constant/assets.dart'; import '../../utils/utils.dart'; @@ -41,7 +40,13 @@ class LocationPermissionScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( "Enable Location for a Personalized Experience".tr(), - style: AppThemeData.boldTextStyle(fontSize: 24, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), textAlign: TextAlign.center, ), ), @@ -49,14 +54,21 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - "Allow location access to discover beauty stores and services near you.".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + "Allow location access to discover beauty stores and services near you." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), textAlign: TextAlign.center, ), ), const SizedBox(height: 30), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Use current location".tr(), onPress: () async { Constant.checkPermission( @@ -66,34 +78,51 @@ class LocationPermissionScreen extends StatelessWidget { ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); - Position newLocalData = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); - await placemarkFromCoordinates(newLocalData.latitude, newLocalData.longitude).then((valuePlaceMaker) { + Position newLocalData = + await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); + await placemarkFromCoordinates( + newLocalData.latitude, + newLocalData.longitude, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; addressModel.addressAs = "Home"; - addressModel.location = UserLocation(latitude: newLocalData.latitude, longitude: newLocalData.longitude); + addressModel.location = UserLocation( + latitude: newLocalData.latitude, + longitude: newLocalData.longitude, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; addressModel.locality = currentLocation; }); Constant.selectedLocation = addressModel; - Constant.currentLocation = await Utils.getCurrentLocation(); + Constant.currentLocation = + await Utils.getCurrentLocation(); ShowToastDialog.closeLoader(); Get.offAll(const ServiceListScreen()); } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; addressModel.addressAs = "Home"; - addressModel.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + addressModel.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; addressModel.locality = currentLocation; }); Constant.selectedLocation = addressModel; - Constant.currentLocation = await Utils.getCurrentLocation(); + Constant.currentLocation = + await Utils.getCurrentLocation(); ShowToastDialog.closeLoader(); @@ -107,7 +136,7 @@ class LocationPermissionScreen extends StatelessWidget { ), const SizedBox(height: 10), RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Set from map".tr(), onPress: () async { Constant.checkPermission( @@ -117,7 +146,9 @@ class LocationPermissionScreen extends StatelessWidget { ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); - await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); + await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { final result = await Get.to(() => MapPickerPage()); @@ -129,18 +160,29 @@ class LocationPermissionScreen extends StatelessWidget { addressModel.addressAs = "Home"; addressModel.locality = address.toString(); - addressModel.location = UserLocation(latitude: lat, longitude: lng); + addressModel.location = UserLocation( + latitude: lat, + longitude: lng, + ); Constant.selectedLocation = addressModel; Get.offAll(const ServiceListScreen()); } } else { Get.to(LocationPickerScreen())!.then((value) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel selectedLocationModel = + value; addressModel.addressAs = "Home"; - addressModel.locality = Utils.formatAddress(selectedLocation: selectedLocationModel); - addressModel.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + addressModel.locality = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + addressModel.location = UserLocation( + latitude: + selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); Constant.selectedLocation = addressModel; Get.offAll(const ServiceListScreen()); @@ -148,10 +190,16 @@ class LocationPermissionScreen extends StatelessWidget { }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; addressModel.addressAs = "Home"; - addressModel.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + addressModel.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; addressModel.locality = currentLocation; @@ -181,7 +229,16 @@ class LocationPermissionScreen extends StatelessWidget { } }); }, - child: Text("Enter Manually location".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Enter Manually location".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), ], ), diff --git a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart index 38ae3cc..7a67cfc 100644 --- a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart +++ b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class MaintenanceModeScreen extends StatelessWidget { const MaintenanceModeScreen({super.key}); @@ -14,14 +14,24 @@ class MaintenanceModeScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Center(child: Image.asset('assets/images/maintenance.png', height: 200, width: 200)), + Center( + child: Image.asset( + 'assets/images/maintenance.png', + height: 200, + width: 200, + ), + ), const SizedBox(height: 20), - Text("We'll be back soon!".tr(), style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), + Text( + "We'll be back soon!".tr(), + style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), const SizedBox(height: 10), Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Text( - "Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!".tr(), + "Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!" + .tr(), textAlign: TextAlign.center, style: const TextStyle(fontSize: 16), ), diff --git a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart index 87b1649..8585299 100644 --- a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart +++ b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart @@ -9,8 +9,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -30,20 +29,27 @@ class AllAdvertisementScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( "Highlights for you".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: controller.isLoading.value ? Constant.loader() : controller.advertisementList.isEmpty - ? Constant.showEmptyView(message: "Highlights for you not found.".tr()) + ? Constant.showEmptyView( + message: "Highlights for you not found.".tr(), + ) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: ListView.builder( @@ -51,7 +57,10 @@ class AllAdvertisementScreen extends StatelessWidget { itemCount: controller.advertisementList.length, padding: EdgeInsets.all(0), itemBuilder: (BuildContext context, int index) { - return AdvertisementCard(controller: controller, model: controller.advertisementList[index]); + return AdvertisementCard( + controller: controller, + model: controller.advertisementList[index], + ); }, ), ), @@ -65,7 +74,11 @@ class AdvertisementCard extends StatelessWidget { final AdvertisementModel model; final AdvertisementListController controller; - const AdvertisementCard({super.key, required this.controller, required this.model}); + const AdvertisementCard({ + super.key, + required this.controller, + required this.model, + }); @override Widget build(BuildContext context) { @@ -74,9 +87,14 @@ class AdvertisementCard extends StatelessWidget { return InkWell( onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(model.vendorId!); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + model.vendorId!, + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Container( margin: EdgeInsets.only(bottom: 16), @@ -84,7 +102,14 @@ class AdvertisementCard extends StatelessWidget { decoration: BoxDecoration( color: isDark ? AppThemeData.info600 : AppThemeData.surface, borderRadius: BorderRadius.circular(16), - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.1), blurRadius: isDark ? 6 : 2, spreadRadius: 0, offset: Offset(0, isDark ? 3 : 1))], + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: isDark ? 6 : 2, + spreadRadius: 0, + offset: Offset(0, isDark ? 3 : 1), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -93,18 +118,32 @@ class AdvertisementCard extends StatelessWidget { children: [ model.type == 'restaurant_promotion' ? ClipRRect( - borderRadius: BorderRadius.vertical(top: Radius.circular(16)), - child: NetworkImageWidget(imageUrl: model.coverImage ?? '', height: 150, width: double.infinity, fit: BoxFit.cover), + borderRadius: BorderRadius.vertical( + top: Radius.circular(16), + ), + child: NetworkImageWidget( + imageUrl: model.coverImage ?? '', + height: 150, + width: double.infinity, + fit: BoxFit.cover, + ), ) - : VideoAdvWidget(url: model.video ?? '', height: 150, width: double.infinity), - if (model.type != 'video_promotion' && model.vendorId != null && (model.showRating == true || model.showReview == true)) + : VideoAdvWidget( + url: model.video ?? '', + height: 150, + width: double.infinity, + ), + if (model.type != 'video_promotion' && + model.vendorId != null && + (model.showRating == true || model.showReview == true)) Positioned( bottom: 8, right: 8, child: FutureBuilder( future: FireStoreUtils.getVendorById(model.vendorId!), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return const SizedBox(); } else { if (snapshot.hasError) { @@ -114,16 +153,42 @@ class AdvertisementCard extends StatelessWidget { } else { VendorModel vendorModel = snapshot.data!; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - if (model.showRating == true) SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - if (model.showRating == true) const SizedBox(width: 5), + if (model.showRating == true) + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), + if (model.showRating == true) + const SizedBox(width: 5), Text( "${model.showRating == true ? Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString()) : ''}${model.showRating == true && model.showReview == true ? ' ' : ''}${model.showReview == true ? '(${vendorModel.reviewsCount!.toStringAsFixed(0)})' : ''}", - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -142,7 +207,15 @@ class AdvertisementCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (model.type == 'restaurant_promotion') - ClipRRect(borderRadius: BorderRadius.circular(30), child: NetworkImageWidget(imageUrl: model.profileImage ?? '', height: 50, width: 50, fit: BoxFit.cover)), + ClipRRect( + borderRadius: BorderRadius.circular(30), + child: NetworkImageWidget( + imageUrl: model.profileImage ?? '', + height: 50, + width: 50, + fit: BoxFit.cover, + ), + ), SizedBox(width: 8), Expanded( child: Column( @@ -150,12 +223,26 @@ class AdvertisementCard extends StatelessWidget { children: [ Text( model.title ?? '', - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + fontWeight: FontWeight.bold, + ), overflow: TextOverflow.ellipsis, ), Text( model.description ?? '', - style: TextStyle(fontSize: 14, fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey600), + style: TextStyle( + fontSize: 14, + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + ), overflow: TextOverflow.ellipsis, maxLines: 2, ), @@ -166,25 +253,74 @@ class AdvertisementCard extends StatelessWidget { ? Obx( () => IconButton( icon: - controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey600, BlendMode.srcIn)), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == model.vendorId, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), onPressed: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == model.vendorId).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == model.vendorId); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => p0.restaurantId == model.vendorId, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => item.restaurantId == model.vendorId, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: model.vendorId, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: model.vendorId, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, ), ) : Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))), - child: Padding(padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Icon(Icons.arrow_forward, size: 20, color: AppThemeData.primary300)), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 4, + ), + child: Icon( + Icons.arrow_forward, + size: 20, + color: AppThemeData.primary300, + ), + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart index acf9906..85e802c 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart @@ -19,8 +19,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../models/user_model.dart'; import '../../../service/fire_store_utils.dart'; @@ -41,8 +40,12 @@ class CartScreen extends StatelessWidget { init: CartController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + ), body: cartItem.isEmpty ? Constant.showEmptyView(message: "Item Not available".tr()) @@ -53,17 +56,28 @@ class CartScreen extends StatelessWidget { controller.selectedFoodType.value == 'TakeAway' ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: InkWell( onTap: () { Get.to(AddressListScreen())!.then((value) { if (value != null) { ShippingAddress shippingAddress = value; - if (Constant.checkZoneCheck(shippingAddress.location!.latitude ?? 0.0, shippingAddress.location!.longitude ?? 0.0)) { - controller.selectedAddress.value = shippingAddress; + if (Constant.checkZoneCheck( + shippingAddress.location!.latitude ?? + 0.0, + shippingAddress.location!.longitude ?? + 0.0, + )) { + controller.selectedAddress.value = + shippingAddress; controller.calculatePrice(); } else { - ShowToastDialog.showToast("Service not available in this area".tr()); + ShowToastDialog.showToast( + "Service not available in this area" + .tr(), + ); } } }); @@ -71,33 +85,71 @@ class CartScreen extends StatelessWidget { child: Column( children: [ Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 8, + ), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_send_one.svg"), + SvgPicture.asset( + "assets/icons/ic_send_one.svg", + ), const SizedBox(width: 10), Expanded( child: Text( - controller.selectedAddress.value.addressAs.toString(), + controller + .selectedAddress + .value + .addressAs + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), ), - SvgPicture.asset("assets/icons/ic_down.svg"), + SvgPicture.asset( + "assets/icons/ic_down.svg", + ), ], ), const SizedBox(height: 5), Text( - controller.selectedAddress.value.getFullAddress(), + controller.selectedAddress.value + .getFullAddress(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -111,87 +163,189 @@ class CartScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: ListView.separated( shrinkWrap: true, padding: EdgeInsets.zero, itemCount: cartItem.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - CartProductModel cartProductModel = cartItem[index]; + CartProductModel cartProductModel = + cartItem[index]; ProductModel? productModel; - FireStoreUtils.getProductById(cartProductModel.id!.split('~').first).then((value) { + FireStoreUtils.getProductById( + cartProductModel.id!.split('~').first, + ).then((value) { productModel = value; }); - print("cartItem[index] :: ${cartItem[index].extras} ::${cartItem[index].extrasPrice}"); + print( + "cartItem[index] :: ${cartItem[index].extras} ::${cartItem[index].extrasPrice}", + ); return InkWell( onTap: () async { - await FireStoreUtils.getVendorById(productModel!.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ).then((value) { if (value != null) { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": value}, + ); } }); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: + const BorderRadius.all( + Radius.circular(16), + ), child: NetworkImageWidget( - imageUrl: cartProductModel.photo.toString(), - height: Responsive.height(10, context), - width: Responsive.width(20, context), + imageUrl: + cartProductModel.photo + .toString(), + height: Responsive.height( + 10, + context, + ), + width: Responsive.width( + 20, + context, + ), fit: BoxFit.cover, ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${cartProductModel.name}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), - double.parse(cartProductModel.discountPrice.toString()) <= 0 + double.parse( + cartProductModel + .discountPrice + .toString(), + ) <= + 0 ? Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: cartProductModel.discountPrice.toString()), + Constant.amountShow( + amount: + cartProductModel + .discountPrice + .toString(), + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: 5, + ), Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + decoration: + TextDecoration + .lineThrough, + decorationColor: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], @@ -201,76 +355,219 @@ class CartScreen extends StatelessWidget { ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFD1D5DB)), borderRadius: BorderRadius.circular(200)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFD1D5DB), + ), + borderRadius: + BorderRadius.circular( + 200, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5), + padding: + const EdgeInsets.symmetric( + vertical: 5, + horizontal: 5, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ InkWell( onTap: () { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: false, quantity: cartProductModel.quantity! - 1); + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: false, + quantity: + cartProductModel + .quantity! - + 1, + ); }, - child: Icon(Icons.remove, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.remove, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( - cartProductModel.quantity.toString(), - textAlign: TextAlign.start, + cartProductModel + .quantity + .toString(), + textAlign: + TextAlign.start, maxLines: 1, style: TextStyle( fontSize: 16, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + overflow: + TextOverflow + .ellipsis, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, ), ), ), InkWell( onTap: () { - if (productModel!.itemAttribute != null) { - if (productModel!.itemAttribute!.variants!.where((element) => element.variantSku == cartProductModel.variantInfo!.variantSku).isNotEmpty) { + if (productModel! + .itemAttribute != + null) { + if (productModel! + .itemAttribute! + .variants! + .where( + (element) => + element + .variantSku == + cartProductModel + .variantInfo! + .variantSku, + ) + .isNotEmpty) { if (int.parse( - productModel!.itemAttribute!.variants! - .where((element) => element.variantSku == cartProductModel.variantInfo!.variantSku) + productModel! + .itemAttribute! + .variants! + .where( + ( + element, + ) => + element.variantSku == + cartProductModel.variantInfo!.variantSku, + ) .first .variantQuantity .toString(), ) > - (cartProductModel.quantity ?? 0) || + (cartProductModel + .quantity ?? + 0) || int.parse( - productModel!.itemAttribute!.variants! - .where((element) => element.variantSku == cartProductModel.variantInfo!.variantSku) + productModel! + .itemAttribute! + .variants! + .where( + ( + element, + ) => + element.variantSku == + cartProductModel.variantInfo!.variantSku, + ) .first .variantQuantity .toString(), ) == -1) { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: + true, + quantity: + cartProductModel + .quantity! + + 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } } else { - if ((productModel!.quantity ?? 0) > (cartProductModel.quantity ?? 0) || productModel!.quantity == -1) { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); + if ((productModel! + .quantity ?? + 0) > + (cartProductModel + .quantity ?? + 0) || + productModel! + .quantity == + -1) { + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: + true, + quantity: + cartProductModel + .quantity! + + 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } } } else { - if ((productModel!.quantity ?? 0) > (cartProductModel.quantity ?? 0) || productModel!.quantity == -1) { - controller.addToCart(cartProductModel: cartProductModel, isIncrement: true, quantity: cartProductModel.quantity! + 1); + if ((productModel! + .quantity ?? + 0) > + (cartProductModel + .quantity ?? + 0) || + productModel! + .quantity == + -1) { + controller.addToCart( + cartProductModel: + cartProductModel, + isIncrement: + true, + quantity: + cartProductModel + .quantity! + + 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } } }, - child: Icon(Icons.add, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.add, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + ), ), ], ), @@ -278,47 +575,112 @@ class CartScreen extends StatelessWidget { ), ], ), - cartProductModel.variantInfo == null || cartProductModel.variantInfo!.variantOptions == null || cartProductModel.variantInfo!.variantOptions!.isEmpty + cartProductModel.variantInfo == + null || + cartProductModel + .variantInfo! + .variantOptions == + null || + cartProductModel + .variantInfo! + .variantOptions! + .isEmpty ? Container() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 5, + vertical: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Variants".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), const SizedBox(height: 5), Wrap( spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.variantInfo!.variantOptions!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .variantInfo! + .variantOptions! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: + 5, + ), + child: Text( + "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), ), - cartProductModel.extras == null || cartProductModel.extras!.isEmpty || cartProductModel.extrasPrice == '0' + cartProductModel.extras == null || + cartProductModel + .extras! + .isEmpty || + cartProductModel + .extrasPrice == + '0' ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 10), Row( @@ -326,16 +688,51 @@ class CartScreen extends StatelessWidget { Expanded( child: Text( "Addons".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( Constant.amountShow( - amount: (double.parse(cartProductModel.extrasPrice.toString()) * double.parse(cartProductModel.quantity.toString())).toString(), + amount: + (double.parse( + cartProductModel + .extrasPrice + .toString(), + ) * + double.parse( + cartProductModel + .quantity + .toString(), + )) + .toString(), + ), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, ), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), ), ], ), @@ -344,22 +741,55 @@ class CartScreen extends StatelessWidget { spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.extras!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - cartProductModel.extras![i].toString(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .extras! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: + 5, + ), + child: Text( + cartProductModel + .extras![i] + .toString(), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), @@ -369,7 +799,17 @@ class CartScreen extends StatelessWidget { ); }, separatorBuilder: (context, index) { - return Padding(padding: const EdgeInsets.symmetric(vertical: 10), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)); + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + ); }, ), ), @@ -382,44 +822,84 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Delivery Type'.tr()} (${controller.selectedFoodType.value})".tr(), + "${'Delivery Type'.tr()} (${controller.selectedFoodType.value})" + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), controller.selectedFoodType.value == 'TakeAway' ? const SizedBox() : Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Instant Delivery".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), const SizedBox(height: 5), Text( "Standard".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontSize: 12, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ], ), ), Radio( - value: controller.deliveryType.value, + value: + controller.deliveryType.value, groupValue: "instant".tr(), - activeColor: AppThemeData.primary300, + activeColor: + AppThemeData.primary300, onChanged: (value) { - controller.deliveryType.value = "instant"; + controller.deliveryType.value = + "instant"; }, ), ], @@ -429,18 +909,28 @@ class CartScreen extends StatelessWidget { const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: InkWell( onTap: () { controller.deliveryType.value = "schedule"; BottomPicker.dateTime( onSubmit: (index) { - controller.scheduleDateTime.value = index; + controller.scheduleDateTime.value = + index; }, minDateTime: DateTime.now(), displaySubmitButton: true, pickerTitle: Text('Schedule Time'.tr()), - buttonSingleColor: AppThemeData.primary300, + buttonSingleColor: + AppThemeData.primary300, ).show(context); }, child: Padding( @@ -449,18 +939,38 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Schedule Time".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), const SizedBox(height: 5), Text( "${'Your preferred time'.tr()} ${controller.deliveryType.value == "schedule" ? Constant.timestampToDateTime(Timestamp.fromDate(controller.scheduleDateTime.value)) : ""}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ], ), @@ -470,16 +980,28 @@ class CartScreen extends StatelessWidget { groupValue: "schedule".tr(), activeColor: AppThemeData.primary300, onChanged: (value) { - controller.deliveryType.value = "schedule"; + controller.deliveryType.value = + "schedule"; BottomPicker.dateTime( - initialDateTime: controller.scheduleDateTime.value, + initialDateTime: + controller + .scheduleDateTime + .value, onSubmit: (index) { - controller.scheduleDateTime.value = index; + controller + .scheduleDateTime + .value = index; }, - minDateTime: controller.scheduleDateTime.value, + minDateTime: + controller + .scheduleDateTime + .value, displaySubmitButton: true, - pickerTitle: Text('Schedule Time'.tr()), - buttonSingleColor: AppThemeData.primary300, + pickerTitle: Text( + 'Schedule Time'.tr(), + ), + buttonSingleColor: + AppThemeData.primary300, ).show(context); }, ), @@ -500,7 +1022,14 @@ class CartScreen extends StatelessWidget { Text( "Offers & Benefits".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), InkWell( @@ -510,20 +1039,43 @@ class CartScreen extends StatelessWidget { child: Container( width: Responsive.width(100, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - shadows: const [BoxShadow(color: Color(0x14000000), blurRadius: 52, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + shadows: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 52, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Apply Coupons".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), const SizedBox(height: 5), @@ -545,101 +1097,234 @@ class CartScreen extends StatelessWidget { Text( "Bill Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - shadows: const [BoxShadow(color: Color(0x14000000), blurRadius: 52, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + shadows: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 52, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Item totals".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - controller.selectedFoodType.value == 'TakeAway' + controller.selectedFoodType.value == + 'TakeAway' ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Delivery Fee".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), - (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) + (controller + .vendorModel + .value + .isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true) ? Text( 'Free Delivery'.tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: AppThemeData.success400, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + AppThemeData + .success400, + fontSize: 16, + ), ) : Text( - Constant.amountShow(amount: controller.deliveryCharges.value.toString()), + Constant.amountShow( + amount: + controller + .deliveryCharges + .value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Coupon Discount".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.couponAmount.value.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.danger300 + : AppThemeData.danger300, + fontSize: 16, + ), ), ], ), - controller.vendorModel.value.specialDiscountEnable == true && Constant.specialDiscountOffer == true + controller + .vendorModel + .value + .specialDiscountEnable == + true && + Constant.specialDiscountOffer == + true ? Column( children: [ const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Special Discount".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.specialDiscountAmount.value.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .danger300 + : AppThemeData + .danger300, + fontSize: 16, + ), ), ], ), @@ -647,63 +1332,135 @@ class CartScreen extends StatelessWidget { ) : const SizedBox(), const SizedBox(height: 10), - controller.selectedFoodType.value == 'TakeAway' || (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) + controller.selectedFoodType.value == + 'TakeAway' || + (controller + .vendorModel + .value + .isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true) ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Delivery Tips".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), - controller.deliveryTips.value == 0 + controller + .deliveryTips + .value == + 0 ? const SizedBox() : InkWell( onTap: () { - controller.deliveryTips.value = 0; - controller.calculatePrice(); + controller + .deliveryTips + .value = 0; + controller + .calculatePrice(); }, child: Text( "Remove".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), ), Text( - Constant.amountShow(amount: controller.deliveryTips.toString()), + Constant.amountShow( + amount: + controller.deliveryTips + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), ListView.builder( itemCount: Constant.taxList.length, shrinkWrap: true, padding: EdgeInsets.zero, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - TaxModel taxModel = Constant.taxList[index]; + TaxModel taxModel = + Constant.taxList[index]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "${taxModel.title.toString()} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( @@ -711,12 +1468,34 @@ class CartScreen extends StatelessWidget { amount: Constant.calculateTax( amount: - (double.parse(controller.subTotal.value.toString()) - controller.couponAmount.value - controller.specialDiscountAmount.value).toString(), + (double.parse( + controller + .subTotal + .value + .toString(), + ) - + controller + .couponAmount + .value - + controller + .specialDiscountAmount + .value) + .toString(), taxModel: taxModel, ).toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), @@ -725,19 +1504,39 @@ class CartScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "To Pay".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -748,10 +1547,15 @@ class CartScreen extends StatelessWidget { ], ), ), - controller.selectedFoodType.value == 'TakeAway' || (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true) + controller.selectedFoodType.value == 'TakeAway' || + (controller.vendorModel.value.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == true) ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -759,32 +1563,67 @@ class CartScreen extends StatelessWidget { Text( "Thanks with a tip!".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - shadows: const [BoxShadow(color: Color(0x14000000), blurRadius: 52, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + shadows: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 52, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( - "Around the clock, our delivery partners make it happen. Show gratitude with a tip..".tr(), + "Around the clock, our delivery partners make it happen. Show gratitude with a tip.." + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + ), ), ), const SizedBox(width: 10), - SvgPicture.asset("assets/images/ic_tips.svg"), + SvgPicture.asset( + "assets/images/ic_tips.svg", + ), ], ), const SizedBox(height: 20), @@ -793,7 +1632,9 @@ class CartScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.deliveryTips.value = 20; + controller + .deliveryTips + .value = 20; controller.calculatePrice(); }, child: Container( @@ -802,25 +1643,47 @@ class CartScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.deliveryTips.value == 20 - ? AppThemeData.primary300 + controller + .deliveryTips + .value == + 20 + ? AppThemeData + .primary300 : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, + ? AppThemeData + .grey800 + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: "20"), + Constant.amountShow( + amount: "20", + ), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -832,7 +1695,9 @@ class CartScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.deliveryTips.value = 30; + controller + .deliveryTips + .value = 30; controller.calculatePrice(); }, child: Container( @@ -841,25 +1706,47 @@ class CartScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.deliveryTips.value == 30 - ? AppThemeData.primary300 + controller + .deliveryTips + .value == + 30 + ? AppThemeData + .primary300 : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, + ? AppThemeData + .grey800 + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: "30"), + Constant.amountShow( + amount: "30", + ), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -871,7 +1758,9 @@ class CartScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.deliveryTips.value = 40; + controller + .deliveryTips + .value = 40; controller.calculatePrice(); }, child: Container( @@ -880,25 +1769,47 @@ class CartScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.deliveryTips.value == 40 - ? AppThemeData.primary300 + controller + .deliveryTips + .value == + 40 + ? AppThemeData + .primary300 : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, + ? AppThemeData + .grey800 + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: "40"), + Constant.amountShow( + amount: "40", + ), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -912,28 +1823,55 @@ class CartScreen extends StatelessWidget { onTap: () { showDialog( context: context, - builder: (BuildContext context) { - return tipsDialog(controller, isDark); + builder: ( + BuildContext context, + ) { + return tipsDialog( + controller, + isDark, + ); }, ); }, child: Container( decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), - borderRadius: BorderRadius.circular(8), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + ), + borderRadius: + BorderRadius.circular( + 8, + ), ), ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Center( child: Text( 'Other'.tr(), style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w600, ), ), ), @@ -953,7 +1891,16 @@ class CartScreen extends StatelessWidget { const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column(children: [TextFieldWidget(title: 'Remarks'.tr(), controller: controller.reMarkController.value, hintText: 'Write remarks for the store'.tr(), maxLine: 4)]), + child: Column( + children: [ + TextFieldWidget( + title: 'Remarks'.tr(), + controller: controller.reMarkController.value, + hintText: 'Write remarks for the store'.tr(), + maxLine: 4, + ), + ], + ), ), ], ), @@ -962,8 +1909,12 @@ class CartScreen extends StatelessWidget { cartItem.isEmpty ? null : Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - height: controller.isCashbackApply.value == true ? 150 : 100, + decoration: BoxDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + ), + height: + controller.isCashbackApply.value == true ? 150 : 100, child: Column( children: [ if (controller.isCashbackApply.value == true) @@ -974,77 +1925,240 @@ class CartScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 8), - child: Text("Cashback Offer".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 13)), + child: Text( + "Cashback Offer".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontSize: 13, + ), + ), ), Text( "${"Cashback Name :".tr()} ${controller.bestCashback.value.title ?? ''}", - style: TextStyle(color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontSize: 13), + style: TextStyle( + color: AppThemeData.success300, + fontFamily: AppThemeData.semiBold, + fontSize: 13, + ), ), Text( "${"You will get".tr()} ${Constant.amountShow(amount: controller.bestCashback.value.cashbackValue?.toStringAsFixed(2))} ${"cashback after completing the order.".tr()}", - style: TextStyle(color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontSize: 13), + style: TextStyle( + color: AppThemeData.success300, + fontFamily: AppThemeData.semiBold, + fontSize: 13, + ), ), ], ), ), Padding( - padding: EdgeInsets.only(left: 16, right: 16, top: controller.isCashbackApply.value == false ? 16 : 12, bottom: 20), + padding: EdgeInsets.only( + left: 16, + right: 16, + top: + controller.isCashbackApply.value == false + ? 16 + : 12, + bottom: 20, + ), child: Row( children: [ Expanded( flex: 2, child: InkWell( onTap: () { - Get.to(const SelectPaymentScreen())?.then((v) { + Get.to(const SelectPaymentScreen())?.then(( + v, + ) { controller.getCashback(); }); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - controller.selectedPaymentMethod.value == '' - ? cardDecoration(controller, PaymentGateway.wallet, isDark, "") - : controller.selectedPaymentMethod.value == PaymentGateway.wallet.name - ? cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png") - : controller.selectedPaymentMethod.value == PaymentGateway.cod.name - ? cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png") - : controller.selectedPaymentMethod.value == PaymentGateway.stripe.name - ? cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png") - : controller.selectedPaymentMethod.value == PaymentGateway.paypal.name - ? cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payStack.name - ? cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png") - : controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name - ? cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png") - : controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name - ? cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png") - : controller.selectedPaymentMethod.value == PaymentGateway.payFast.name - ? cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png") - : controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name - ? cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png") - : controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name - ? cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png") - : controller.selectedPaymentMethod.value == PaymentGateway.xendit.name - ? cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png") - : cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + controller.selectedPaymentMethod.value == + '' + ? cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name + ? cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name + ? cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.stripe.name + ? cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name + ? cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name + ? cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name + ? cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name + ? cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name + ? cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name + ? cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name + ? cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ) + : controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name + ? cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ) + : cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), const SizedBox(width: 10), Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Pay Via".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontSize: 12), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontSize: 12, + ), ), - controller.selectedPaymentMethod.value == '' - ? Padding(padding: const EdgeInsets.only(top: 4), child: Container(width: 60, height: 12, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100)) + controller + .selectedPaymentMethod + .value == + '' + ? Padding( + padding: const EdgeInsets.only( + top: 4, + ), + child: Container( + width: 60, + height: 12, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData + .grey100, + ), + ) : Text( - controller.selectedPaymentMethod.value, + controller + .selectedPaymentMethod + .value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), @@ -1054,9 +2168,10 @@ class CartScreen extends StatelessWidget { ), Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, textColor: - controller.selectedPaymentMethod.value != '' + controller.selectedPaymentMethod.value != + '' ? AppThemeData.surface : isDark ? AppThemeData.grey800 @@ -1064,61 +2179,176 @@ class CartScreen extends StatelessWidget { title: "Pay Now".tr(), height: 5, color: - controller.selectedPaymentMethod.value != '' + controller.selectedPaymentMethod.value != + '' ? AppThemeData.primary300 : isDark ? AppThemeData.grey800 : AppThemeData.grey100, fontSizes: 16, onPress: () async { - if ((controller.couponAmount.value >= 1) && (controller.couponAmount.value > controller.totalAmount.value)) { - ShowToastDialog.showToast("The total price must be greater than or equal to the coupon discount value for the code to apply. Please review your cart total.".tr()); + if ((controller.couponAmount.value >= 1) && + (controller.couponAmount.value > + controller.totalAmount.value)) { + ShowToastDialog.showToast( + "The total price must be greater than or equal to the coupon discount value for the code to apply. Please review your cart total." + .tr(), + ); return; } - if ((controller.specialDiscountAmount.value >= 1) && (controller.specialDiscountAmount.value > controller.totalAmount.value)) { - ShowToastDialog.showToast("The total price must be greater than or equal to the special discount value for the code to apply. Please review your cart total.".tr()); + if ((controller + .specialDiscountAmount + .value >= + 1) && + (controller + .specialDiscountAmount + .value > + controller.totalAmount.value)) { + ShowToastDialog.showToast( + "The total price must be greater than or equal to the special discount value for the code to apply. Please review your cart total." + .tr(), + ); return; } - if (controller.isOrderPlaced.value == false) { + if (controller.isOrderPlaced.value == + false) { controller.isOrderPlaced.value = true; await controller.getCashback(); - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller + .selectedPaymentMethod + .value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value + .toString(), + context, + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then(( - value, - ) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value + .toString(), + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value + .toString(), + ), + razorpayModel: + controller + .razorPayModel + .value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel + result = value; + controller.openCheckout( + amount: + controller + .totalAmount + .value + .toString(), + orderId: result.id, + ); + } + }); } else { controller.isOrderPlaced.value = false; - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } controller.isOrderPlaced.value = false; } @@ -1136,14 +2366,32 @@ class CartScreen extends StatelessWidget { ); } - Padding cardDecoration(CartController controller, PaymentGateway value, isDark, String image) { + Padding cardDecoration( + CartController controller, + PaymentGateway value, + isDark, + String image, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( width: 40, height: 40, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: image == '' ? Container(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100) : Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: + image == '' + ? Container( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + ) + : Image.asset(image), + ), ), ); } @@ -1165,12 +2413,28 @@ class CartScreen extends StatelessWidget { TextFieldWidget( title: 'Tips Amount'.tr(), controller: controller.tipsController.value, - textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), + textInputType: const TextInputType.numberWithOptions( + signed: true, + decimal: true, + ), textInputAction: TextInputAction.done, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + ], prefix: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - child: Text(Constant.currencyModel!.symbol.tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 18)), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + child: Text( + Constant.currencyModel!.symbol.tr(), + style: TextStyle( + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontSize: 18, + ), + ), ), hintText: 'Enter Tips Amount'.tr(), ), @@ -1179,10 +2443,12 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Cancel".tr(), - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - textColor: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark ? AppThemeData.grey700 : AppThemeData.grey200, + textColor: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, onPress: () async { Get.back(); }, @@ -1191,15 +2457,19 @@ class CartScreen extends StatelessWidget { const SizedBox(width: 20), Expanded( child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Add".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.tipsController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter tips Amount".tr()); + ShowToastDialog.showToast( + "Please enter tips Amount".tr(), + ); } else { - controller.deliveryTips.value = double.parse(controller.tipsController.value.text); + controller.deliveryTips.value = double.parse( + controller.tipsController.value.text, + ); controller.calculatePrice(); Get.back(); } diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart index 812e5df..4e7a57e 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -23,12 +23,22 @@ class CouponListScreen extends StatelessWidget { init: CartController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Coupon Code".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Coupon Code".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), bottom: PreferredSize( preferredSize: const Size.fromHeight(55), child: Padding( @@ -37,23 +47,44 @@ class CouponListScreen extends StatelessWidget { hintText: 'Enter coupon code'.tr(), controller: controller.couponCodeController.value, suffix: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), child: InkWell( onTap: () { - if (controller.couponCodeController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter coupon code".tr()); + if (controller + .couponCodeController + .value + .text + .isEmpty) { + ShowToastDialog.showToast( + "Please enter coupon code".tr(), + ); return; } - CouponModel? matchedCoupon = controller.couponList.firstWhereOrNull((coupon) => coupon.code!.toLowerCase() == controller.couponCodeController.value.text.toLowerCase()); + CouponModel? matchedCoupon = controller.couponList + .firstWhereOrNull( + (coupon) => + coupon.code!.toLowerCase() == + controller.couponCodeController.value.text + .toLowerCase(), + ); if (matchedCoupon != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: matchedCoupon); + double couponAmount = Constant.calculateDiscount( + amount: controller.subTotal.value.toString(), + offerModel: matchedCoupon, + ); if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = matchedCoupon; + controller.selectedCouponModel.value = + matchedCoupon; controller.calculatePrice(); Get.back(); } else { - ShowToastDialog.showToast("Coupon code not applied".tr()); + ShowToastDialog.showToast( + "Coupon code not applied".tr(), + ); } } else { ShowToastDialog.showToast("Invalid Coupon".tr()); @@ -62,7 +93,14 @@ class CouponListScreen extends StatelessWidget { child: Text( "Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ), @@ -76,17 +114,32 @@ class CouponListScreen extends StatelessWidget { itemBuilder: (context, index) { CouponModel couponModel = controller.couponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -96,7 +149,14 @@ class CouponListScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -106,51 +166,98 @@ class CouponListScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(6), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ), ), const Expanded(child: SizedBox(height: 10)), InkWell( onTap: () { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: couponModel, + ); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + couponModel; controller.calculatePrice(); Get.back(); } else { - ShowToastDialog.showToast("Coupon code not applied".tr()); + ShowToastDialog.showToast( + "Coupon code not applied".tr(), + ); } }, child: Text( "Tap To Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart index 07796a8..cf4d0bc 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart @@ -10,8 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../dash_board_screens/dash_board_screen.dart'; @@ -26,8 +25,14 @@ class OrderPlacingScreen extends StatelessWidget { init: OrderPlacingController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() @@ -41,16 +46,41 @@ class OrderPlacingScreen extends StatelessWidget { Text( "Order Placed".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 34, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 34, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), Text( - "Hang tight — your items are being delivered quickly and safely!".tr(), + "Hang tight — your items are being delivered quickly and safely!" + .tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 40), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( @@ -60,13 +90,26 @@ class OrderPlacingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_location.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_location.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 10), Expanded( child: Text( "Order ID".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 16, + ), ), ), ], @@ -75,7 +118,13 @@ class OrderPlacingScreen extends StatelessWidget { Text( controller.orderModel.value.id.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -90,21 +139,51 @@ class OrderPlacingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Center(child: Image.asset("assets/images/ic_timer.gif", height: 140)), + Center( + child: Image.asset( + "assets/images/ic_timer.gif", + height: 140, + ), + ), const SizedBox(height: 20), Text( "Placing your order".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 34, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 34, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), Text( - "Take a moment to review your order before proceeding to checkout.".tr(), + "Take a moment to review your order before proceeding to checkout." + .tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 40), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( @@ -114,22 +193,42 @@ class OrderPlacingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_location.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_location.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 10), Expanded( child: Text( "Delivery Address".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 16, + ), ), ), ], ), const SizedBox(height: 5), Text( - controller.orderModel.value.address!.getFullAddress(), + controller.orderModel.value.address! + .getFullAddress(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -137,7 +236,15 @@ class OrderPlacingScreen extends StatelessWidget { ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( @@ -147,13 +254,27 @@ class OrderPlacingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_book.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn), height: 22), + SvgPicture.asset( + "assets/icons/ic_book.svg", + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + height: 22, + ), const SizedBox(width: 10), Expanded( child: Text( "Order Summary".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 16, + ), ), ), ], @@ -161,21 +282,47 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(height: 5), ListView.builder( shrinkWrap: true, - itemCount: controller.orderModel.value.products!.length, + itemCount: + controller + .orderModel + .value + .products! + .length, itemBuilder: (context, index) { - CartProductModel cartProductModel = controller.orderModel.value.products![index]; + CartProductModel cartProductModel = + controller + .orderModel + .value + .products![index]; return Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${cartProductModel.quantity} x".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), Text( "${cartProductModel.name}".tr(), textAlign: TextAlign.start, - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey900, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ); @@ -196,30 +343,39 @@ class OrderPlacingScreen extends StatelessWidget { child: controller.isPlacing.value ? RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Track Order".tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { - if (Constant.sectionConstantModel!.serviceTypeFlag == "ecommerce-service") { + if (Constant.sectionConstantModel!.serviceTypeFlag == + "ecommerce-service") { Get.offAll(const DashBoardEcommerceScreen()); - DashBoardEcommerceController controller = Get.put(DashBoardEcommerceController()); + DashBoardEcommerceController controller = Get.put( + DashBoardEcommerceController(), + ); controller.selectedIndex.value = 3; } else { Get.offAll(const DashBoardScreen()); - DashBoardController controller = Get.put(DashBoardController()); + DashBoardController controller = Get.put( + DashBoardController(), + ); controller.selectedIndex.value = 3; } }, ) : RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Track Order".tr(), height: 5.5, - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - textColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + textColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, fontSizes: 16, onPress: () async {}, ), diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart index ed41845..8817c3c 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../wallet_screen/wallet_screen.dart'; diff --git a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart index 92801a3..bc0aea5 100644 --- a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart +++ b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart @@ -3,8 +3,7 @@ import 'package:customer/controllers/cashback_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; class CashbackOffersListScreen extends StatelessWidget { @@ -21,8 +20,17 @@ class CashbackOffersListScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - title: Text("Cashback Offers".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text( + "Cashback Offers".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, ), body: controller.isLoading.value @@ -35,9 +43,18 @@ class CashbackOffersListScreen extends StatelessWidget { padding: const EdgeInsets.all(16), margin: const EdgeInsets.symmetric(vertical: 6), decoration: BoxDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, borderRadius: BorderRadius.circular(12), - boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 6, offset: const Offset(0, 3))], + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -47,25 +64,57 @@ class CashbackOffersListScreen extends StatelessWidget { Expanded( child: Text( controller.cashbackList[index].title ?? '', - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), Text( - controller.cashbackList[index].cashbackType == 'Percent' + controller.cashbackList[index].cashbackType == + 'Percent' ? "${controller.cashbackList[index].cashbackAmount}%" - : Constant.amountShow(amount: "${controller.cashbackList[index].cashbackAmount}"), - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + : Constant.amountShow( + amount: + "${controller.cashbackList[index].cashbackAmount}", + ), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), const SizedBox(height: 6), Text( "${"Min spent".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].minimumPurchaseAmount ?? 0.0}")} | ${"Valid till".tr()} ${Constant.timestampToDateTime2(controller.cashbackList[index].endDate!)}", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontSize: 14), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontSize: 14, + ), ), Text( "${"Maximum cashback up to".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].maximumDiscount ?? 0.0}")}", - style: TextStyle(color: isDark ? AppThemeData.primary200 : AppThemeData.primary300, fontFamily: AppThemeData.regular, fontSize: 14), + style: TextStyle( + color: + isDark + ? AppThemeData.primary200 + : AppThemeData.primary300, + fontFamily: AppThemeData.regular, + fontSize: 14, + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart index bdbd0b0..537a753 100644 --- a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart +++ b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart @@ -6,8 +6,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/preferences.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import '../../../controllers/theme_controller.dart'; +import 'package:get/get.dart' hide Trans;import '../../../controllers/theme_controller.dart'; import '../../../service/localization_service.dart'; class ChangeLanguageScreen extends StatelessWidget { diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart index 0a9f324..fc40a8a 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart @@ -11,7 +11,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; import '../../../service/fire_store_utils.dart'; @@ -33,13 +33,18 @@ class ChatScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( controller.restaurantName.value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: Column( @@ -53,18 +58,28 @@ class ChatScreen extends StatelessWidget { controller: controller.scrollController, physics: const BouncingScrollPhysics(), itemBuilder: (context, documentSnapshots, index) { - ConversationModel inboxModel = ConversationModel.fromJson(documentSnapshots[index].data() as Map); - return chatItemView(isDark, inboxModel.senderId == FireStoreUtils.getCurrentUid(), inboxModel); + ConversationModel inboxModel = ConversationModel.fromJson( + documentSnapshots[index].data() as Map, + ); + return chatItemView( + isDark, + inboxModel.senderId == FireStoreUtils.getCurrentUid(), + inboxModel, + ); }, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), + onEmpty: Constant.showEmptyView( + message: "No Conversion found".tr(), + ), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance .collection( controller.chatType.value == "Driver" ? 'chat_driver' - : controller.chatType.value == "Provider" || controller.chatType.value == "provider" + : controller.chatType.value == "Provider" || + controller.chatType.value == "provider" ? 'chat_provider' - : controller.chatType.value == "worker" || controller.chatType.value == "Worker" + : controller.chatType.value == "worker" || + controller.chatType.value == "Worker" ? 'chat_worker' : 'chat_store', ) @@ -79,7 +94,10 @@ class ChatScreen extends StatelessWidget { Container( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -90,7 +108,9 @@ class ChatScreen extends StatelessWidget { onTap: () { onCameraClick(context, controller); }, - child: SvgPicture.asset("assets/icons/ic_picture_one.svg"), + child: SvgPicture.asset( + "assets/icons/ic_picture_one.svg", + ), ), Flexible( child: Padding( @@ -98,18 +118,39 @@ class ChatScreen extends StatelessWidget { child: TextField( textInputAction: TextInputAction.send, keyboardType: TextInputType.text, - textCapitalization: TextCapitalization.sentences, + textCapitalization: + TextCapitalization.sentences, controller: controller.messageController.value, decoration: InputDecoration( - contentPadding: const EdgeInsets.only(top: 3, left: 10), + contentPadding: const EdgeInsets.only( + top: 3, + left: 10, + ), focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, hintText: 'Type message here....'.tr(), ), onSubmitted: (value) async { - if (controller.messageController.value.text.isNotEmpty) { - controller.sendMessage(controller.messageController.value.text, null, '', 'text'); - Timer(const Duration(milliseconds: 500), () => controller.scrollController.jumpTo(controller.scrollController.position.maxScrollExtent)); + if (controller + .messageController + .value + .text + .isNotEmpty) { + controller.sendMessage( + controller.messageController.value.text, + null, + '', + 'text', + ); + Timer( + const Duration(milliseconds: 500), + () => controller.scrollController.jumpTo( + controller + .scrollController + .position + .maxScrollExtent, + ), + ); controller.messageController.value.clear(); } }, @@ -118,16 +159,36 @@ class ChatScreen extends StatelessWidget { ), InkWell( onTap: () { - if (controller.messageController.value.text.isNotEmpty) { - controller.sendMessage(controller.messageController.value.text, null, '', 'text'); + if (controller + .messageController + .value + .text + .isNotEmpty) { + controller.sendMessage( + controller.messageController.value.text, + null, + '', + 'text', + ); controller.messageController.value.clear(); // Timer(const Duration(milliseconds: 500), () => controller.scrollController.jumpTo(controller.scrollController.position.maxScrollExtent)); } }, child: Container( margin: const EdgeInsets.only(left: 10), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, borderRadius: BorderRadius.circular(30)), - child: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_send.svg")), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + borderRadius: BorderRadius.circular(30), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: SvgPicture.asset( + "assets/icons/ic_send.svg", + ), + ), ), ), ], @@ -157,23 +218,53 @@ class ChatScreen extends StatelessWidget { data.messageType == "text" ? Container( decoration: BoxDecoration( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomLeft: Radius.circular(12)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomLeft: Radius.circular(12), + ), color: AppThemeData.primary300, ), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(data.message.toString(), style: const TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: AppThemeData.grey50)), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + data.message.toString(), + style: const TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: AppThemeData.grey50, + ), + ), ) : data.messageType == "image" ? ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomLeft: Radius.circular(12)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomLeft: Radius.circular(12), + ), child: Stack( alignment: Alignment.center, children: [ GestureDetector( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: data.url!.url)); + Get.to( + FullScreenImageViewer( + imageUrl: data.url!.url, + ), + ); }, - child: Hero(tag: data.url!.url, child: NetworkImageWidget(imageUrl: data.url!.url, height: 100, width: 100, fit: BoxFit.cover)), + child: Hero( + tag: data.url!.url, + child: NetworkImageWidget( + imageUrl: data.url!.url, + height: 100, + width: 100, + fit: BoxFit.cover, + ), + ), ), ], ), @@ -183,13 +274,25 @@ class ChatScreen extends StatelessWidget { heroTag: data.id, backgroundColor: AppThemeData.primary300, onPressed: () { - Get.to(FullScreenVideoViewer(heroTag: data.id.toString(), videoUrl: data.url!.url)); + Get.to( + FullScreenVideoViewer( + heroTag: data.id.toString(), + videoUrl: data.url!.url, + ), + ); }, - child: const Icon(Icons.play_arrow, color: Colors.white), + child: const Icon( + Icons.play_arrow, + color: Colors.white, + ), ), const SizedBox(height: 5), Text( - DateFormat('MMM d, yyyy hh:mm aa').format(DateTime.fromMillisecondsSinceEpoch(data.createdAt!.millisecondsSinceEpoch)), + DateFormat('MMM d, yyyy hh:mm aa').format( + DateTime.fromMillisecondsSinceEpoch( + data.createdAt!.millisecondsSinceEpoch, + ), + ), style: const TextStyle(color: Colors.grey, fontSize: 12), ), ], @@ -201,25 +304,61 @@ class ChatScreen extends StatelessWidget { data.messageType == "text" ? Container( decoration: BoxDecoration( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomRight: Radius.circular(12)), - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomRight: Radius.circular(12), + ), + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + data.message.toString(), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(data.message.toString(), style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800)), ) : data.messageType == "image" ? ConstrainedBox( - constraints: const BoxConstraints(minWidth: 50, maxWidth: 200), + constraints: const BoxConstraints( + minWidth: 50, + maxWidth: 200, + ), child: ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12), bottomRight: Radius.circular(12)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + bottomRight: Radius.circular(12), + ), child: Stack( alignment: Alignment.center, children: [ GestureDetector( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: data.url!.url)); + Get.to( + FullScreenImageViewer( + imageUrl: data.url!.url, + ), + ); }, - child: Hero(tag: data.url!.url, child: NetworkImageWidget(imageUrl: data.url!.url)), + child: Hero( + tag: data.url!.url, + child: NetworkImageWidget( + imageUrl: data.url!.url, + ), + ), ), ], ), @@ -230,13 +369,25 @@ class ChatScreen extends StatelessWidget { heroTag: data.id, backgroundColor: AppThemeData.primary300, onPressed: () { - Get.to(FullScreenVideoViewer(heroTag: data.id.toString(), videoUrl: data.url!.url)); + Get.to( + FullScreenVideoViewer( + heroTag: data.id.toString(), + videoUrl: data.url!.url, + ), + ); }, - child: const Icon(Icons.play_arrow, color: Colors.white), + child: const Icon( + Icons.play_arrow, + color: Colors.white, + ), ), const SizedBox(height: 5), Text( - DateFormat('MMM d, yyyy hh:mm aa').format(DateTime.fromMillisecondsSinceEpoch(data.createdAt!.millisecondsSinceEpoch)), + DateFormat('MMM d, yyyy hh:mm aa').format( + DateTime.fromMillisecondsSinceEpoch( + data.createdAt!.millisecondsSinceEpoch, + ), + ), style: const TextStyle(color: Colors.grey, fontSize: 12), ), ], @@ -252,9 +403,14 @@ class ChatScreen extends StatelessWidget { isDefaultAction: false, onPressed: () async { Get.back(); - XFile? image = await controller.imagePicker.pickImage(source: ImageSource.gallery); + XFile? image = await controller.imagePicker.pickImage( + source: ImageSource.gallery, + ); if (image != null) { - Url url = await FireStoreUtils.uploadChatImageToFireStorage(File(image.path), context); + Url url = await FireStoreUtils.uploadChatImageToFireStorage( + File(image.path), + context, + ); controller.sendMessage('', url, '', 'image'); } }, @@ -264,11 +420,22 @@ class ChatScreen extends StatelessWidget { isDefaultAction: false, onPressed: () async { Get.back(); - XFile? galleryVideo = await controller.imagePicker.pickVideo(source: ImageSource.gallery); + XFile? galleryVideo = await controller.imagePicker.pickVideo( + source: ImageSource.gallery, + ); if (galleryVideo != null) { - ChatVideoContainer? videoContainer = await FireStoreUtils.uploadChatVideoToFireStorage(context, File(galleryVideo.path)); + ChatVideoContainer? videoContainer = + await FireStoreUtils.uploadChatVideoToFireStorage( + context, + File(galleryVideo.path), + ); if (videoContainer != null) { - controller.sendMessage('', videoContainer.videoUrl, videoContainer.thumbnailUrl, 'video'); + controller.sendMessage( + '', + videoContainer.videoUrl, + videoContainer.thumbnailUrl, + 'video', + ); } } }, @@ -278,9 +445,14 @@ class ChatScreen extends StatelessWidget { isDestructiveAction: false, onPressed: () async { Get.back(); - XFile? image = await controller.imagePicker.pickImage(source: ImageSource.camera); + XFile? image = await controller.imagePicker.pickImage( + source: ImageSource.camera, + ); if (image != null) { - Url url = await FireStoreUtils.uploadChatImageToFireStorage(File(image.path), context); + Url url = await FireStoreUtils.uploadChatImageToFireStorage( + File(image.path), + context, + ); controller.sendMessage('', url, '', 'image'); } }, diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart index 4427f8d..39bf091 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart @@ -7,8 +7,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +24,19 @@ class DriverInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Driver Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Driver Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -40,8 +48,12 @@ class DriverInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); ShowToastDialog.closeLoader(); Get.to( @@ -62,15 +74,23 @@ class DriverInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -87,13 +107,29 @@ class DriverInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -101,7 +137,14 @@ class DriverInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -116,7 +159,10 @@ class DriverInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_driver').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_driver') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart index 9f99581..a1d22b5 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart @@ -10,8 +10,7 @@ import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dar import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -26,10 +25,19 @@ class RestaurantInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Store Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Store Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -41,9 +49,15 @@ class RestaurantInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(restaurantUser!.vendorID.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + restaurantUser!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); Get.to( @@ -64,15 +78,23 @@ class RestaurantInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -89,13 +111,29 @@ class RestaurantInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -103,7 +141,14 @@ class RestaurantInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -118,7 +163,10 @@ class RestaurantInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_store').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_store') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart index 90c1480..0421c23 100644 --- a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart @@ -4,8 +4,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; class DashBoardScreen extends StatelessWidget { @@ -26,12 +25,19 @@ class DashBoardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(DashBoardController()); @@ -41,17 +47,71 @@ class DashBoardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", label: 'Orders'.tr(), controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_orders.svg", + label: 'Orders'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 4, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -60,7 +120,13 @@ class DashBoardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required DashBoardController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required DashBoardController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart index 8bb2ec2..b19398c 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart @@ -4,7 +4,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; @@ -23,10 +23,16 @@ class DineInBookingDetails extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( "Dine in Bookings".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), body: @@ -45,25 +51,55 @@ class DineInBookingDetails extends StatelessWidget { children: [ Text( "${'Order'.tr()} ${Constant.orderId(orderId: controller.bookingModel.value.id.toString())}", - style: TextStyle(fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), Text( "${controller.bookingModel.value.totalGuest} ${'Peoples'.tr()}", - style: TextStyle(fontSize: 14, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ), ), Container( decoration: ShapeDecoration( - color: Constant.statusColor(status: controller.bookingModel.value.status), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: Constant.statusColor( + status: controller.bookingModel.value.status, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 6, + ), child: Text( "${controller.bookingModel.value.status}", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), ), @@ -71,7 +107,15 @@ class DineInBookingDetails extends StatelessWidget { ), const SizedBox(height: 20), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -79,19 +123,47 @@ class DineInBookingDetails extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_building.svg"), + SvgPicture.asset( + "assets/icons/ic_building.svg", + ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.bookingModel.value.vendor!.title.toString(), - style: TextStyle(fontSize: 18, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + controller + .bookingModel + .value + .vendor! + .title + .toString(), + style: TextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), Text( - controller.bookingModel.value.vendor!.location.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + controller + .bookingModel + .value + .vendor! + .location + .toString(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -107,9 +179,23 @@ class DineInBookingDetails extends StatelessWidget { onTap: () { launchUrl( Constant.createCoordinatesUrl( - controller.bookingModel.value.vendor!.latitude ?? 0.0, - controller.bookingModel.value.vendor!.longitude ?? 0.0, - controller.bookingModel.value.vendor!.title, + controller + .bookingModel + .value + .vendor! + .latitude ?? + 0.0, + controller + .bookingModel + .value + .vendor! + .longitude ?? + 0.0, + controller + .bookingModel + .value + .vendor! + .title, ), ); }, @@ -117,19 +203,44 @@ class DineInBookingDetails extends StatelessWidget { "View in Map".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, decoration: TextDecoration.underline, - decorationColor: AppThemeData.primary300, + decorationColor: + AppThemeData.primary300, ), ), ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 16), child: SizedBox(height: 16, child: VerticalDivider(width: 1))), + const Padding( + padding: EdgeInsets.symmetric( + horizontal: 16, + ), + child: SizedBox( + height: 16, + child: VerticalDivider(width: 1), + ), + ), InkWell( onTap: () { - if (controller.bookingModel.value.vendor!.phonenumber!.isNotEmpty) { - final Uri launchUri = Uri(scheme: 'tel', path: controller.bookingModel.value.vendor!.phonenumber); + if (controller + .bookingModel + .value + .vendor! + .phonenumber! + .isNotEmpty) { + final Uri launchUri = Uri( + scheme: 'tel', + path: + controller + .bookingModel + .value + .vendor! + .phonenumber, + ); launchUrl(launchUri); } }, @@ -137,11 +248,15 @@ class DineInBookingDetails extends StatelessWidget { "Call Now".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, decoration: TextDecoration.underline, - decorationColor: AppThemeData.primary300, + decorationColor: + AppThemeData.primary300, ), ), ), @@ -156,11 +271,26 @@ class DineInBookingDetails extends StatelessWidget { Text( "Booking Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 5), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -171,14 +301,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Name".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.guestFirstName} ${controller.bookingModel.value.guestLastName}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -190,14 +334,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Phone number".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.guestPhone}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -209,14 +367,30 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Date and Time".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( - Constant.timestampToDateTime(controller.bookingModel.value.date!), + Constant.timestampToDateTime( + controller.bookingModel.value.date!, + ), textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -228,14 +402,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Guest".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.totalGuest}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -247,14 +435,28 @@ class DineInBookingDetails extends StatelessWidget { Expanded( child: Text( "Discount".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Expanded( child: Text( "${controller.bookingModel.value.discount} %", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart index 1bbeb1d..85e714c 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/app_them_data.dart'; import '../../../widget/my_separator.dart'; @@ -26,10 +26,16 @@ class DineInBookingScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( "Dine in Bookings".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), body: @@ -40,7 +46,15 @@ class DineInBookingScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( @@ -54,16 +68,28 @@ class DineInBookingScreen extends StatelessWidget { decoration: controller.isFeature.value == false ? null - : ShapeDecoration(color: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: AppThemeData.primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "Upcoming".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, color: - controller.isFeature.value == false + controller.isFeature.value == + false ? isDark ? AppThemeData.grey400 : AppThemeData.grey500 @@ -85,16 +111,28 @@ class DineInBookingScreen extends StatelessWidget { decoration: controller.isFeature.value == true ? null - : ShapeDecoration(color: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: AppThemeData.primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "History".tr(), textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, color: - controller.isFeature.value == true + controller.isFeature.value == + true ? isDark ? AppThemeData.grey400 : AppThemeData.grey500 @@ -119,26 +157,45 @@ class DineInBookingScreen extends StatelessWidget { child: controller.isFeature.value ? controller.featureList.isEmpty - ? Constant.showEmptyView(message: "Upcoming Booking not found.".tr()) + ? Constant.showEmptyView( + message: + "Upcoming Booking not found.".tr(), + ) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, scrollDirection: Axis.vertical, - itemCount: controller.featureList.length, - itemBuilder: (BuildContext context, int index) { - DineInBookingModel dineBookingModel = controller.featureList[index]; - return itemView(isDark, context, dineBookingModel); + itemCount: + controller.featureList.length, + itemBuilder: ( + BuildContext context, + int index, + ) { + DineInBookingModel dineBookingModel = + controller.featureList[index]; + return itemView( + isDark, + context, + dineBookingModel, + ); }, ) : controller.historyList.isEmpty - ? Constant.showEmptyView(message: "History not found.".tr()) + ? Constant.showEmptyView( + message: "History not found.".tr(), + ) : ListView.builder( itemCount: controller.historyList.length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - DineInBookingModel dineBookingModel = controller.historyList[index]; - return itemView(isDark, context, dineBookingModel); + DineInBookingModel dineBookingModel = + controller.historyList[index]; + return itemView( + isDark, + context, + dineBookingModel, + ); }, ), ), @@ -150,15 +207,27 @@ class DineInBookingScreen extends StatelessWidget { ); } - InkWell itemView(isDark, BuildContext context, DineInBookingModel orderModel) { + InkWell itemView( + isDark, + BuildContext context, + DineInBookingModel orderModel, + ) { return InkWell( onTap: () { - Get.to(const DineInBookingDetails(), arguments: {"bookingModel": orderModel}); + Get.to( + const DineInBookingDetails(), + arguments: {"bookingModel": orderModel}, + ); }, child: Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -169,12 +238,24 @@ class DineInBookingScreen extends StatelessWidget { borderRadius: const BorderRadius.all(Radius.circular(16)), child: Stack( children: [ - NetworkImageWidget(imageUrl: orderModel.vendor!.photo.toString(), fit: BoxFit.cover, height: Responsive.height(10, context), width: Responsive.width(20, context)), + NetworkImageWidget( + imageUrl: orderModel.vendor!.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(10, context), + width: Responsive.width(20, context), + ), Container( height: Responsive.height(10, context), width: Responsive.width(20, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, 1.00), end: const Alignment(0, -1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(0.00, 1.00), + end: const Alignment(0, -1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), ], @@ -188,33 +269,79 @@ class DineInBookingScreen extends StatelessWidget { Text( orderModel.status.toString(), textAlign: TextAlign.right, - style: TextStyle(color: Constant.statusColor(status: orderModel.status.toString()), fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, fontSize: 12), + style: TextStyle( + color: Constant.statusColor( + status: orderModel.status.toString(), + ), + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + fontSize: 12, + ), ), const SizedBox(height: 5), Text( orderModel.vendor!.title.toString(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 5), Text( Constant.timestampToDateTime(orderModel.createdAt!), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), ), ], ), - Padding(padding: const EdgeInsets.symmetric(vertical: 14), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 14), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: Text("Name".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400))), + Expanded( + child: Text( + "Name".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), + ), + ), Expanded( child: Text( "${orderModel.guestFirstName} ${orderModel.guestLastName}", textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -224,18 +351,40 @@ class DineInBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( - child: Text("Guest Number".tr(), style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400)), + child: Text( + "Guest Number".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), + ), ), Expanded( child: Text( orderModel.totalGuest.toString(), textAlign: TextAlign.end, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ), ], ), - Padding(padding: const EdgeInsets.symmetric(vertical: 14), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 14), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -244,7 +393,14 @@ class DineInBookingScreen extends StatelessWidget { Expanded( child: Text( orderModel.vendor!.location.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart index 96da285..a8dcaf3 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../../controllers/theme_controller.dart'; @@ -27,8 +27,17 @@ class BookTableScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - title: Text("Book Table".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text( + "Book Table".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -37,25 +46,55 @@ class BookTableScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), child: Row( children: [ Expanded( child: Text( "Numbers of Guests".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), Container( height: Responsive.height(4, context), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(200), side: BorderSide(color: isDark ? AppThemeData.grey600 : AppThemeData.grey300)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(200), + side: BorderSide( + color: + isDark + ? AppThemeData.grey600 + : AppThemeData.grey300, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -69,7 +108,9 @@ class BookTableScreen extends StatelessWidget { child: const Icon(Icons.remove), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( controller.noOfQuantity.toString(), textAlign: TextAlign.start, @@ -79,7 +120,10 @@ class BookTableScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), @@ -87,7 +131,10 @@ class BookTableScreen extends StatelessWidget { onTap: () { controller.noOfQuantity.value += 1; }, - child: Icon(Icons.add, color: AppThemeData.primary300), + child: Icon( + Icons.add, + color: AppThemeData.primary300, + ), ), ], ), @@ -99,7 +146,13 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -107,12 +160,22 @@ class BookTableScreen extends StatelessWidget { children: [ Text( "When are you visiting?".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), SizedBox( height: 120, child: ListView.builder( - padding: const EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric( + horizontal: 8, + ), physics: const BouncingScrollPhysics(), itemCount: controller.dateList.length, scrollDirection: Axis.horizontal, @@ -120,11 +183,17 @@ class BookTableScreen extends StatelessWidget { return Stack( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 2.0, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 2.0, + vertical: 8, + ), child: GestureDetector( onTap: () { - controller.selectedDate.value = controller.dateList[index].date; - controller.timeSet(controller.dateList[index].date); + controller.selectedDate.value = + controller.dateList[index].date; + controller.timeSet( + controller.dateList[index].date, + ); }, child: Obx( () => Container( @@ -135,41 +204,93 @@ class BookTableScreen extends StatelessWidget { side: BorderSide( width: 1, color: - controller.selectedDate.value == controller.dateList[index].date - ? AppThemeData.primary300 + controller + .selectedDate + .value == + controller + .dateList[index] + .date + ? AppThemeData + .primary300 : isDark ? AppThemeData.grey800 - : AppThemeData.grey100, + : AppThemeData + .grey100, ), - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular(8), ), ), child: Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all( + 8.0, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Text( - Constant.calculateDifference(controller.dateList[index].date.toDate()) == 0 + Constant.calculateDifference( + controller + .dateList[index] + .date + .toDate(), + ) == + 0 ? "Today".tr() - : Constant.calculateDifference(controller.dateList[index].date.toDate()) == 1 + : Constant.calculateDifference( + controller + .dateList[index] + .date + .toDate(), + ) == + 1 ? "Tomorrow".tr() - : DateFormat('EEE').format(controller.dateList[index].date.toDate()), + : DateFormat( + 'EEE', + ).format( + controller + .dateList[index] + .date + .toDate(), + ), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w500, ), ), Text( - DateFormat('d MMM').format(controller.dateList[index].date.toDate()).toString(), + DateFormat('d MMM') + .format( + controller + .dateList[index] + .date + .toDate(), + ) + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -185,8 +306,10 @@ class BookTableScreen extends StatelessWidget { right: 0, child: Center( child: RoundedButtonFill( - borderRadius: 10.r, - title: "${controller.dateList[index].discountPer}%".tr(), + borderRadius: 10.r, + title: + "${controller.dateList[index].discountPer}%" + .tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, width: 12, @@ -203,30 +326,69 @@ class BookTableScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Select time slot and scroll to see offers".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( decoration: ShapeDecoration( - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey600 : AppThemeData.grey300), borderRadius: BorderRadius.circular(12)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey600 + : AppThemeData.grey300, + ), + borderRadius: BorderRadius.circular(12), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), child: Wrap( spacing: 5.0, children: [ ...controller.timeSlotList.map( (timeSlotList) => InputChip( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + ), side: BorderSide.none, - backgroundColor: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + backgroundColor: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, selectedColor: AppThemeData.primary300, - labelStyle: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + labelStyle: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), label: Text( - DateFormat('hh:mm a').format(timeSlotList.time!), + DateFormat( + 'hh:mm a', + ).format(timeSlotList.time!), style: TextStyle( color: - controller.selectedTimeSlot.value == DateFormat('hh:mm a').format(timeSlotList.time!) + controller + .selectedTimeSlot + .value == + DateFormat( + 'hh:mm a', + ).format( + timeSlotList.time!, + ) ? AppThemeData.grey50 : isDark ? AppThemeData.grey400 @@ -236,11 +398,22 @@ class BookTableScreen extends StatelessWidget { ), ), showCheckmark: false, - selected: controller.selectedTimeSlot.value == DateFormat('hh:mm a').format(timeSlotList.time!), + selected: + controller.selectedTimeSlot.value == + DateFormat( + 'hh:mm a', + ).format(timeSlotList.time!), onSelected: (value) { - controller.selectedTimeSlot.value = DateFormat('hh:mm a').format(timeSlotList.time!); - controller.selectedTimeDiscount.value = timeSlotList.discountPer!; - controller.selectedTimeDiscountType.value = timeSlotList.discountType!; + controller + .selectedTimeSlot + .value = DateFormat( + 'hh:mm a', + ).format(timeSlotList.time!); + controller.selectedTimeDiscount.value = + timeSlotList.discountPer!; + controller + .selectedTimeDiscountType + .value = timeSlotList.discountType!; }, ), ), @@ -258,55 +431,120 @@ class BookTableScreen extends StatelessWidget { Expanded( child: Text( "Special Occasion".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), InkWell( onTap: () { controller.selectedOccasion.value = ""; }, - child: Text("Clear".tr(), style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), + child: Text( + "Clear".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), + ), ), ], ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - for (int i = 0; i < controller.occasionList[i].length; i++) + for ( + int i = 0; + i < controller.occasionList[i].length; + i++ + ) ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 0.0, vertical: 0.0), - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + contentPadding: const EdgeInsets.symmetric( + horizontal: 0.0, + vertical: 0.0, + ), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), dense: true, title: Text( //'${controller.occasionList[i]}'.tr(), - controller.getLocalizedOccasion(controller.occasionList[i]), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + controller.getLocalizedOccasion( + controller.occasionList[i], + ), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), leading: Radio( - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), value: controller.occasionList[i], groupValue: controller.selectedOccasion.value, activeColor: AppThemeData.primary300, onChanged: (value) { - controller.selectedOccasion.value = controller.occasionList[i]; + controller.selectedOccasion.value = + controller.occasionList[i]; }, ), ), ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 0.0, vertical: 0.0), - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + contentPadding: const EdgeInsets.symmetric( + horizontal: 0.0, + vertical: 0.0, + ), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), dense: true, title: Text( 'Is this your first visit?'.tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), leading: Checkbox( - visualDensity: const VisualDensity(horizontal: 0, vertical: -4), + visualDensity: const VisualDensity( + horizontal: 0, + vertical: -4, + ), value: controller.firstVisit.value, activeColor: AppThemeData.primary300, onChanged: (value) { @@ -321,22 +559,44 @@ class BookTableScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Personal Details".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ ClipOval( child: NetworkImageWidget( - imageUrl: Constant.userModel!.profilePictureURL.toString(), + imageUrl: + Constant.userModel!.profilePictureURL + .toString(), width: 50, height: 50, - errorWidget: Image.asset(Constant.userPlaceHolder, fit: BoxFit.cover, width: 50, height: 50), + errorWidget: Image.asset( + Constant.userPlaceHolder, + fit: BoxFit.cover, + width: 50, + height: 50, + ), ), ), const SizedBox(width: 10), @@ -345,11 +605,27 @@ class BookTableScreen extends StatelessWidget { children: [ Text( Constant.userModel!.fullName(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( "${Constant.userModel!.email}", - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -360,10 +636,20 @@ class BookTableScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Additional Requests".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), - TextFieldWidget(controller: controller.additionRequestController.value, hintText: 'Add message here....'.tr(), maxLine: 5), + TextFieldWidget( + controller: controller.additionRequestController.value, + hintText: 'Add message here....'.tr(), + maxLine: 5, + ), const SizedBox(height: 20), ], ), @@ -375,7 +661,7 @@ class BookTableScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Book Now".tr(), height: 5.5, color: AppThemeData.primary300, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart index 19c048e..3912671 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart @@ -13,7 +13,7 @@ import '../restaurant_details_screen/restaurant_details_screen.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../review_list_screen/review_list_screen.dart'; import 'book_table_screen.dart'; @@ -30,7 +30,10 @@ class DineInDetailsScreen extends StatelessWidget { builder: (controller) { return Scaffold( body: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + headerSliverBuilder: ( + BuildContext context, + bool innerBoxIsScrolled, + ) { return [ SliverAppBar( expandedHeight: Responsive.height(30, context), @@ -44,26 +47,66 @@ class DineInDetailsScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + child: Icon( + Icons.arrow_back, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), const Expanded(child: SizedBox()), InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == controller.vendorModel.value.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == + controller.vendorModel.value.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg", colorFilter: const ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn)) - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + colorFilter: const ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ], @@ -71,18 +114,28 @@ class DineInDetailsScreen extends StatelessWidget { flexibleSpace: FlexibleSpaceBar( background: Stack( children: [ - controller.vendorModel.value.photos == null || controller.vendorModel.value.photos!.isEmpty + controller.vendorModel.value.photos == null || + controller.vendorModel.value.photos!.isEmpty ? Stack( children: [ NetworkImageWidget( - imageUrl: controller.vendorModel.value.photo.toString(), + imageUrl: + controller.vendorModel.value.photo + .toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context), ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -91,20 +144,34 @@ class DineInDetailsScreen extends StatelessWidget { physics: const BouncingScrollPhysics(), controller: controller.pageController.value, scrollDirection: Axis.horizontal, - itemCount: controller.vendorModel.value.photos!.length, + itemCount: + controller.vendorModel.value.photos!.length, padEnds: false, pageSnapping: true, onPageChanged: (value) { controller.currentPage.value = value; }, itemBuilder: (BuildContext context, int index) { - String image = controller.vendorModel.value.photos![index]; + String image = + controller.vendorModel.value.photos![index]; return Stack( children: [ - NetworkImageWidget(imageUrl: image.toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context)), + NetworkImageWidget( + imageUrl: image.toString(), + fit: BoxFit.cover, + width: Responsive.width(100, context), + height: Responsive.height(40, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -118,17 +185,26 @@ class DineInDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.vendorModel.value.photos!.length, (index) { - return Obx( - () => Container( - margin: const EdgeInsets.only(right: 5), - alignment: Alignment.centerLeft, - height: 9, - width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentPage.value == index ? AppThemeData.primary300 : AppThemeData.grey300), - ), - ); - }), + children: List.generate( + controller.vendorModel.value.photos!.length, + (index) { + return Obx( + () => Container( + margin: const EdgeInsets.only(right: 5), + alignment: Alignment.centerLeft, + height: 9, + width: 9, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentPage.value == index + ? AppThemeData.primary300 + : AppThemeData.grey300, + ), + ), + ); + }, + ), ), ), ], @@ -149,38 +225,64 @@ class DineInDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.vendorModel.value.title.toString(), + controller.vendorModel.value.title + .toString(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( fontSize: 22, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), SizedBox( - width: Responsive.width(78, context), + width: Responsive.width( + 78, + context, + ), child: Text( - controller.vendorModel.value.location.toString(), + controller + .vendorModel + .value + .location + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, + ), ), ), ], @@ -190,21 +292,59 @@ class DineInDetailsScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 4, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( Constant.calculateReview( - reviewCount: controller.vendorModel.value.reviewsCount!.toStringAsFixed(0), - reviewSum: controller.vendorModel.value.reviewsSum.toString(), + reviewCount: controller + .vendorModel + .value + .reviewsCount! + .toStringAsFixed(0), + reviewSum: + controller + .vendorModel + .value + .reviewsSum + .toString(), + ), + style: TextStyle( + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], ), @@ -213,11 +353,28 @@ class DineInDetailsScreen extends StatelessWidget { const SizedBox(height: 5), InkWell( onTap: () { - Get.to(const ReviewListScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const ReviewListScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); }, child: Text( "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", - style: TextStyle(decoration: TextDecoration.underline, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular), + style: TextStyle( + decoration: + TextDecoration.underline, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + fontFamily: + AppThemeData.regular, + ), ), ), ], @@ -227,7 +384,9 @@ class DineInDetailsScreen extends StatelessWidget { Row( children: [ Text( - controller.isOpen.value ? "Open".tr() : "Close".tr(), + controller.isOpen.value + ? "Open".tr() + : "Close".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -235,13 +394,31 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: controller.isOpen.value ? AppThemeData.success400 : AppThemeData.danger300, + color: + controller.isOpen.value + ? AppThemeData.success400 + : AppThemeData.danger300, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, ), ), - Padding(padding: const EdgeInsets.symmetric(horizontal: 10), child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500)), InkWell( onTap: () { - timeShowBottomSheet(context, controller); + timeShowBottomSheet( + context, + controller, + ); }, child: Text( "View Timings".tr(), @@ -249,18 +426,36 @@ class DineInDetailsScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 14, - decoration: TextDecoration.underline, - decorationColor: AppThemeData.ecommerce300, + decoration: + TextDecoration.underline, + decorationColor: + AppThemeData.ecommerce300, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, ), ), ), - Padding(padding: const EdgeInsets.symmetric(horizontal: 10), child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500)), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), + ), Text( - "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr()}".tr(), + "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr()}" + .tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -268,13 +463,17 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, ), ), ], ), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( @@ -286,62 +485,123 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), InkWell( onTap: () { if (Constant.userModel == null) { - ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr()); + ShowToastDialog.showToast( + "Please log in to the application. You are not logged in." + .tr(), + ); } else { - Get.to(const BookTableScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const BookTableScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); } }, child: Container( height: 80, clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - borderRadius: BorderRadius.circular(16), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + ), + borderRadius: + BorderRadius.circular(16), ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), + ), + child: Image.asset( + "assets/images/ic_table.gif", ), - child: Image.asset("assets/images/ic_table.gif"), ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "Table Booking".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), Text( - "Quick Conformations".tr(), + "Quick Conformations" + .tr(), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, ), ), ], @@ -356,52 +616,109 @@ class DineInDetailsScreen extends StatelessWidget { const SizedBox(height: 10), InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + controller.vendorModel.value, + }, + ); }, child: Container( height: 80, clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - borderRadius: BorderRadius.circular(16), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + ), + borderRadius: + BorderRadius.circular(16), ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all(4), + child: Image.asset( + "assets/images/food_delivery.gif", + ), ), - child: Padding(padding: const EdgeInsets.all(4), child: Image.asset("assets/images/food_delivery.gif")), ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - "Available food delivery".tr(), + "Available food delivery" + .tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), Text( "in 30-45 mins.".tr(), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, ), ), ], @@ -415,10 +732,20 @@ class DineInDetailsScreen extends StatelessWidget { ), ], ), - controller.vendorModel.value.restaurantMenuPhotos == null || controller.vendorModel.value.restaurantMenuPhotos!.isEmpty + controller + .vendorModel + .value + .restaurantMenuPhotos == + null || + controller + .vendorModel + .value + .restaurantMenuPhotos! + .isEmpty ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( @@ -430,28 +757,65 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), SizedBox( - height: Responsive.height(12, context), + height: Responsive.height( + 12, + context, + ), child: ListView.builder( - itemCount: controller.vendorModel.value.restaurantMenuPhotos!.length, + itemCount: + controller + .vendorModel + .value + .restaurantMenuPhotos! + .length, scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, itemBuilder: (context, index) { return InkWell( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: controller.vendorModel.value.restaurantMenuPhotos![index])); + Get.to( + FullScreenImageViewer( + imageUrl: + controller + .vendorModel + .value + .restaurantMenuPhotos![index], + ), + ); }, child: Padding( - padding: const EdgeInsets.all(6.0), + padding: + const EdgeInsets.all( + 6.0, + ), child: ClipRRect( - borderRadius: BorderRadius.circular(10), + borderRadius: + BorderRadius.circular( + 10, + ), child: NetworkImageWidget( - imageUrl: controller.vendorModel.value.restaurantMenuPhotos![index], - height: Responsive.height(12, context), - width: Responsive.height(12, context), + imageUrl: + controller + .vendorModel + .value + .restaurantMenuPhotos![index], + height: + Responsive.height( + 12, + context, + ), + width: + Responsive.height( + 12, + context, + ), fit: BoxFit.fill, ), ), @@ -464,7 +828,8 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Location, Timing & Costs".tr(), @@ -475,36 +840,64 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 20), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_location.svg"), + SvgPicture.asset( + "assets/icons/ic_location.svg", + ), const SizedBox(width: 14), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.vendorModel.value.location.toString(), + controller + .vendorModel + .value + .location + .toString(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.regular, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w400, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, ), ), InkWell( onTap: () { launchUrl( Constant.createCoordinatesUrl( - controller.vendorModel.value.latitude ?? 0.0, - controller.vendorModel.value.longitude ?? 0.0, - controller.vendorModel.value.title, + controller + .vendorModel + .value + .latitude ?? + 0.0, + controller + .vendorModel + .value + .longitude ?? + 0.0, + controller + .vendorModel + .value + .title, ), ); }, @@ -513,9 +906,16 @@ class DineInDetailsScreen extends StatelessWidget { textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -526,21 +926,31 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/icons/ic_alarm_clock.svg", height: 20), + SvgPicture.asset( + "assets/icons/ic_alarm_clock.svg", + height: 20, + ), const SizedBox(width: 14), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Timing".tr(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.regular, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w400, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, ), ), InkWell( @@ -550,9 +960,15 @@ class DineInDetailsScreen extends StatelessWidget { textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -562,25 +978,41 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - Constant.currencyModel!.symbol.toString(), + Constant.currencyModel!.symbol + .toString(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 24, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w400, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontSize: 24, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), const SizedBox(width: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Cost for Two".tr(), textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.regular, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w400, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, ), ), Text( @@ -588,9 +1020,15 @@ class DineInDetailsScreen extends StatelessWidget { textAlign: TextAlign.start, style: TextStyle( fontSize: 16, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ], @@ -601,7 +1039,8 @@ class DineInDetailsScreen extends StatelessWidget { ), const SizedBox(height: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Cuisines".tr(), @@ -612,7 +1051,10 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), @@ -621,10 +1063,21 @@ class DineInDetailsScreen extends StatelessWidget { children: [ ...controller.tags.map( (tag) => FilterChip( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(30), + ), side: BorderSide.none, - backgroundColor: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - labelStyle: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + backgroundColor: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + labelStyle: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), label: Text("$tag"), onSelected: (bool value) {}, ), @@ -646,12 +1099,17 @@ class DineInDetailsScreen extends StatelessWidget { ); } - Future timeShowBottomSheet(BuildContext context, DineInRestaurantDetailsController productModel) { + Future timeShowBottomSheet( + BuildContext context, + DineInRestaurantDetailsController productModel, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -661,7 +1119,8 @@ class DineInDetailsScreen extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -673,7 +1132,15 @@ class DineInDetailsScreen extends StatelessWidget { width: 134, height: 5, margin: const EdgeInsets.only(bottom: 6), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey50 : AppThemeData.grey800, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey800, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(3), + ), + ), ), ), ), @@ -681,11 +1148,22 @@ class DineInDetailsScreen extends StatelessWidget { child: ListView.builder( shrinkWrap: true, physics: const BouncingScrollPhysics(), - itemCount: productModel.vendorModel.value.workingHours!.length, + itemCount: + productModel + .vendorModel + .value + .workingHours! + .length, itemBuilder: (context, dayIndex) { - WorkingHours workingHours = productModel.vendorModel.value.workingHours![dayIndex]; + WorkingHours workingHours = + productModel + .vendorModel + .value + .workingHours![dayIndex]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -698,34 +1176,72 @@ class DineInDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), - workingHours.timeslot == null || workingHours.timeslot!.isEmpty + workingHours.timeslot == null || + workingHours.timeslot!.isEmpty ? const SizedBox() : ListView.builder( shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: workingHours.timeslot!.length, + physics: + const NeverScrollableScrollPhysics(), + itemCount: + workingHours.timeslot!.length, itemBuilder: (context, timeIndex) { - Timeslot timeSlotModel = workingHours.timeslot![timeIndex]; + Timeslot timeSlotModel = + workingHours + .timeslot![timeIndex]; return Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all( + 8.0, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.from.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.from + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), @@ -733,15 +1249,42 @@ class DineInDetailsScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.to.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.to + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart index e80c5a8..72ce204 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; @@ -119,40 +119,34 @@ class DineInRestaurantListScreen extends StatelessWidget { ) .isNotEmpty) { FavouriteModel - favouriteModel = - FavouriteModel( - restaurantId: - vendorModel.id, - userId: - FireStoreUtils - .getCurrentUid(), - ); + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); controller.favouriteList .removeWhere( (item) => item.restaurantId == vendorModel.id, ); - await FireStoreUtils - .removeFavouriteRestaurant( - favouriteModel, - ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { FavouriteModel - favouriteModel = - FavouriteModel( - restaurantId: - vendorModel.id, - userId: - FireStoreUtils - .getCurrentUid(), - ); + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); controller.favouriteList .add(favouriteModel); - await FireStoreUtils - .setFavouriteRestaurant( - favouriteModel, - ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index 11c9eeb..1fe7b07 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -14,7 +14,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/banner_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart index 9d4054f..a33b906 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../home_screen/category_restaurant_screen.dart'; @@ -18,55 +17,79 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return GetX( - init: ViewAllCategoryController(), - builder: (controller) { - return Scaffold( - appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - centerTitle: false, - titleSpacing: 0, - title: Text( - "Categories".tr(), - style: TextStyle( - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - ), + init: ViewAllCategoryController(), + builder: (controller) { + return Scaffold( + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + title: Text( + "Categories".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, ), ), - body: controller.isLoading.value - ? Constant.loader() - : Padding( + ), + body: + controller.isLoading.value + ? Constant.loader() + : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 3.5 / 6, crossAxisSpacing: 6), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 6, + ), itemCount: controller.vendorCategoryModel.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": true}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": true, + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 6, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( side: BorderSide( width: 1, strokeAlign: BorderSide.strokeAlignOutside, - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, ), borderRadius: BorderRadius.circular(100), ), ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( @@ -74,23 +97,31 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { height: 60, child: ClipOval( child: NetworkImageWidget( - imageUrl: vendorCategoryModel.photo.toString(), + imageUrl: + vendorCategoryModel.photo + .toString(), fit: BoxFit.cover, ), ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Text( '${vendorCategoryModel.title}', textAlign: TextAlign.center, maxLines: 2, style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, fontFamily: AppThemeData.medium, ), ), - ) + ), ], ), ), @@ -99,7 +130,8 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { }, ), ), - ); - }); + ); + }, + ); } } diff --git a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart index 33fa7e6..2811025 100644 --- a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../../../controllers/theme_controller.dart'; @@ -25,7 +25,12 @@ class EditProfileScreen extends StatelessWidget { init: EditProfileController(), builder: (controller) { return Scaffold( - appBar: AppBar(centerTitle: false, titleSpacing: 0, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface), + appBar: AppBar( + centerTitle: false, + titleSpacing: 0, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + ), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -34,11 +39,24 @@ class EditProfileScreen extends StatelessWidget { children: [ Text( "Profile Information".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "View and update your personal details, contact information, and preferences.".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "View and update your personal details, contact information, and preferences." + .tr(), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 20), Center( @@ -47,12 +65,25 @@ class EditProfileScreen extends StatelessWidget { controller.profileImage.isEmpty ? ClipRRect( borderRadius: BorderRadius.circular(60), - child: Image.asset(Constant.userPlaceHolder, height: Responsive.width(24, context), width: Responsive.width(24, context), fit: BoxFit.cover), + child: Image.asset( + Constant.userPlaceHolder, + height: Responsive.width(24, context), + width: Responsive.width(24, context), + fit: BoxFit.cover, + ), ) - : Constant().hasValidUrl(controller.profileImage.value) == false + : Constant().hasValidUrl( + controller.profileImage.value, + ) == + false ? ClipRRect( borderRadius: BorderRadius.circular(60), - child: Image.file(File(controller.profileImage.value), height: Responsive.width(24, context), width: Responsive.width(24, context), fit: BoxFit.cover), + child: Image.file( + File(controller.profileImage.value), + height: Responsive.width(24, context), + width: Responsive.width(24, context), + fit: BoxFit.cover, + ), ) : ClipRRect( borderRadius: BorderRadius.circular(60), @@ -61,7 +92,12 @@ class EditProfileScreen extends StatelessWidget { imageUrl: controller.profileImage.value, height: Responsive.width(24, context), width: Responsive.width(24, context), - errorWidget: Image.asset(Constant.userPlaceHolder, fit: BoxFit.cover, height: Responsive.width(24, context), width: Responsive.width(24, context)), + errorWidget: Image.asset( + Constant.userPlaceHolder, + fit: BoxFit.cover, + height: Responsive.width(24, context), + width: Responsive.width(24, context), + ), ), ), Positioned( @@ -80,13 +116,37 @@ class EditProfileScreen extends StatelessWidget { const SizedBox(height: 20), Row( children: [ - Expanded(child: TextFieldWidget(title: 'First Name'.tr(), controller: controller.firstNameController.value, hintText: 'First Name'.tr())), + Expanded( + child: TextFieldWidget( + title: 'First Name'.tr(), + controller: controller.firstNameController.value, + hintText: 'First Name'.tr(), + ), + ), const SizedBox(width: 10), - Expanded(child: TextFieldWidget(title: 'Last Name'.tr(), controller: controller.lastNameController.value, hintText: 'Last Name'.tr())), + Expanded( + child: TextFieldWidget( + title: 'Last Name'.tr(), + controller: controller.lastNameController.value, + hintText: 'Last Name'.tr(), + ), + ), ], ), - TextFieldWidget(title: 'Email'.tr(), textInputType: TextInputType.emailAddress, controller: controller.emailController.value, hintText: 'Email'.tr(), enable: false), - TextFieldWidget(title: 'Phone Number'.tr(), textInputType: TextInputType.emailAddress, controller: controller.phoneNumberController.value, hintText: 'Phone Number'.tr(), enable: false), + TextFieldWidget( + title: 'Email'.tr(), + textInputType: TextInputType.emailAddress, + controller: controller.emailController.value, + hintText: 'Email'.tr(), + enable: false, + ), + TextFieldWidget( + title: 'Phone Number'.tr(), + textInputType: TextInputType.emailAddress, + controller: controller.phoneNumberController.value, + hintText: 'Phone Number'.tr(), + enable: false, + ), ], ), ), @@ -97,7 +157,7 @@ class EditProfileScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - borderRadius: 10.r, + borderRadius: 10.r, title: "Save Details".tr(), height: 5.5, color: AppThemeData.primary300, @@ -114,7 +174,10 @@ class EditProfileScreen extends StatelessWidget { ); } - Future buildBottomSheet(BuildContext context, EditProfileController controller) { + Future buildBottomSheet( + BuildContext context, + EditProfileController controller, + ) { return showModalBottomSheet( context: context, builder: (context) { @@ -125,7 +188,16 @@ class EditProfileScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(top: 15), child: Text("please select".tr(), style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600))), + Padding( + padding: const EdgeInsets.only(top: 15), + child: Text( + "please select".tr(), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ), Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -135,8 +207,20 @@ class EditProfileScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.camera), icon: const Icon(Icons.camera_alt, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("camera".tr(), style: const TextStyle())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.camera, + ), + icon: const Icon(Icons.camera_alt, size: 32), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text( + "camera".tr(), + style: const TextStyle(), + ), + ), ], ), ), @@ -146,8 +230,23 @@ class EditProfileScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.gallery), icon: const Icon(Icons.photo_library_sharp, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("gallery".tr(), style: const TextStyle())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.gallery, + ), + icon: const Icon( + Icons.photo_library_sharp, + size: 32, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text( + "gallery".tr(), + style: const TextStyle(), + ), + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart index baa570c..4eb1bf0 100644 --- a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart +++ b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart @@ -12,7 +12,7 @@ import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; import '../../../widget/restaurant_image_view.dart'; @@ -30,12 +30,15 @@ class FavouriteScreen extends StatelessWidget { init: FavouriteController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: controller.isLoading.value ? Constant.loader() : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: Column( children: [ Padding( @@ -45,7 +48,15 @@ class FavouriteScreen extends StatelessWidget { Expanded( child: Text( "Your Favourites, All in One Place".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), //SvgPicture.asset("assets/images/ic_favourite.svg"), @@ -57,22 +68,44 @@ class FavouriteScreen extends StatelessWidget { child: Constant.userModel == null ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Image.asset("assets/images/login.gif", height: 120), + Image.asset( + "assets/images/login.gif", + height: 120, + ), const SizedBox(height: 12), Text( "Please Log In to Continue".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -91,11 +124,19 @@ class FavouriteScreen extends StatelessWidget { : Column( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -104,19 +145,50 @@ class FavouriteScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.favouriteRestaurant.value = true; + controller + .favouriteRestaurant + .value = true; }, child: Container( decoration: - controller.favouriteRestaurant.value == false + controller + .favouriteRestaurant + .value == + false ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: + AppThemeData + .grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( - "Favourite Store".tr(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + "Favourite Store" + .tr(), + textAlign: + TextAlign.center, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ), @@ -125,28 +197,57 @@ class FavouriteScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - controller.favouriteRestaurant.value = false; + controller + .favouriteRestaurant + .value = false; }, child: Container( decoration: - controller.favouriteRestaurant.value == true + controller + .favouriteRestaurant + .value == + true ? null - : ShapeDecoration(color: AppThemeData.grey900, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + : ShapeDecoration( + color: + AppThemeData + .grey900, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "Favourite Item".tr(), - textAlign: TextAlign.center, + textAlign: + TextAlign.center, style: TextStyle( - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData + .semiBold, color: - controller.favouriteRestaurant.value == true + controller + .favouriteRestaurant + .value == + true ? isDark - ? AppThemeData.grey400 - : AppThemeData.grey500 + ? AppThemeData + .grey400 + : AppThemeData + .grey500 : isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, + ? AppThemeData + .primary300 + : AppThemeData + .primary300, ), ), ), @@ -161,79 +262,190 @@ class FavouriteScreen extends StatelessWidget { const SizedBox(height: 20), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 18), + padding: const EdgeInsets.symmetric( + horizontal: 18, + ), child: - controller.favouriteRestaurant.value - ? controller.favouriteVendorList.isEmpty - ? Constant.showEmptyView(message: "Favourite Store not found.".tr()) + controller + .favouriteRestaurant + .value + ? controller + .favouriteVendorList + .isEmpty + ? Constant.showEmptyView( + message: + "Favourite Store not found." + .tr(), + ) : ListView.builder( shrinkWrap: true, - padding: EdgeInsets.zero, - scrollDirection: Axis.vertical, - itemCount: controller.favouriteVendorList.length, - itemBuilder: (BuildContext context, int index) { - VendorModel vendorModel = controller.favouriteVendorList[index]; + padding: + EdgeInsets.zero, + scrollDirection: + Axis.vertical, + itemCount: + controller + .favouriteVendorList + .length, + itemBuilder: ( + BuildContext context, + int index, + ) { + VendorModel + vendorModel = + controller + .favouriteVendorList[index]; return InkWell( onTap: () { ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + vendorModel, + }, + ); // Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); }, child: Padding( - padding: const EdgeInsets.only(bottom: 20), + padding: + const EdgeInsets.only( + bottom: 20, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular( + 16, + ), + topRight: Radius.circular( + 16, + ), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: + vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black.withOpacity( + 0, + ), + const Color( + 0xFF111827, + ), + ], ), ), ), Positioned( - right: 10, - top: 10, + right: + 10, + top: + 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { + if (controller.favouriteList + .where( + ( + p0, + ) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty) { FavouriteModel favouriteModel = FavouriteModel( - restaurantId: vendorModel.id, - userId: FireStoreUtils.getCurrentUid(), + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + ( + item, + ) => + item.restaurantId == + vendorModel.id, + ); + controller.favouriteVendorList.removeAt( + index, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, ); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - controller.favouriteVendorList.removeAt(index); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); } else { FavouriteModel favouriteModel = FavouriteModel( - restaurantId: vendorModel.id, - userId: FireStoreUtils.getCurrentUid(), + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, ); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + ( + p0, + ) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -241,86 +453,171 @@ class FavouriteScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width( + -3, + context, + ), + Responsive.height( + 17.5, + context, + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData.success300, + borderRadius: BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: + 5, + ), Text( "Free Delivery".tr(), style: TextStyle( - fontSize: 14, - color: AppThemeData.success600, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 14, + color: + AppThemeData.success600, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: + 6, + ), ], ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ SvgPicture.asset( "assets/icons/ic_star.svg", - colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: + 6, + ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: + 10, + vertical: + 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.ecommerce600 + : AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ SvgPicture.asset( "assets/icons/ic_map_distance.svg", - colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppThemeData.ecommerce300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( - fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 14, + color: + isDark + ? AppThemeData.ecommerce300 + : AppThemeData.ecommerce300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -331,38 +628,64 @@ class FavouriteScreen extends StatelessWidget { ), ], ), - const SizedBox(height: 15), + const SizedBox( + height: + 15, + ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: + 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), - textAlign: TextAlign.start, - maxLines: 1, + textAlign: + TextAlign.start, + maxLines: + 1, style: TextStyle( - fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontSize: + 18, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), Text( vendorModel.location.toString(), - textAlign: TextAlign.start, - maxLines: 1, + textAlign: + TextAlign.start, + maxLines: + 1, style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, + fontWeight: + FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], ), ), - const SizedBox(height: 10), + const SizedBox( + height: + 10, + ), ], ), ), @@ -370,114 +693,249 @@ class FavouriteScreen extends StatelessWidget { ); }, ) - : controller.favouriteFoodList.isEmpty - ? Constant.showEmptyView(message: "Favourite Item not found.".tr()) + : controller + .favouriteFoodList + .isEmpty + ? Constant.showEmptyView( + message: + "Favourite Item not found." + .tr(), + ) : ListView.builder( - itemCount: controller.favouriteFoodList.length, + itemCount: + controller + .favouriteFoodList + .length, shrinkWrap: true, padding: EdgeInsets.zero, - itemBuilder: (context, index) { - ProductModel productModel = controller.favouriteFoodList[index]; + itemBuilder: ( + context, + index, + ) { + ProductModel + productModel = + controller + .favouriteFoodList[index]; return FutureBuilder( - future: getPrice(productModel), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + future: getPrice( + productModel, + ), + builder: ( + context, + snapshot, + ) { + if (snapshot + .connectionState == + ConnectionState + .waiting) { return Constant.loader(); } else { - if (snapshot.hasError) { - return Center(child: Text('${"error".tr()}: ${snapshot.error}')); - } else if (snapshot.data == null) { + if (snapshot + .hasError) { + return Center( + child: Text( + '${"error".tr()}: ${snapshot.error}', + ), + ); + } else if (snapshot + .data == + null) { return const SizedBox(); } else { - Map map = snapshot.data!; - String price = map['price']; - String disPrice = map['disPrice']; + Map< + String, + dynamic + > + map = + snapshot + .data!; + String price = + map['price']; + String disPrice = + map['disPrice']; return InkWell( onTap: () async { - await FireStoreUtils.getVendorById(productModel.vendorID.toString()).then((value) { - if (value != null) { + await FireStoreUtils.getVendorById( + productModel + .vendorID + .toString(), + ).then(( + value, + ) { + if (value != + null) { ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": + value, + }, + ); // Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); } }); }, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: + const EdgeInsets.symmetric( + vertical: + 5, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: + 14, + vertical: + 14, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ - productModel.nonveg == true - ? SvgPicture.asset("assets/icons/ic_nonveg.svg") - : SvgPicture.asset("assets/icons/ic_veg.svg"), - const SizedBox(width: 5), + productModel.nonveg == + true + ? SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_veg.svg", + ), + const SizedBox( + width: + 5, + ), Text( - productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), + productModel.nonveg == + true + ? "Non Veg.".tr() + : "Pure veg.".tr(), style: TextStyle( - color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + productModel.nonveg == + true + ? AppThemeData.danger300 + : AppThemeData.success400, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), - const SizedBox(height: 5), + const SizedBox( + height: + 5, + ), Text( productModel.name.toString(), style: TextStyle( - fontSize: 18, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), - double.parse(disPrice) <= 0 + double.parse( + disPrice, + ) <= + 0 ? Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: + price, + ), style: TextStyle( - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: disPrice), + Constant.amountShow( + amount: + disPrice, + ), style: TextStyle( - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: + 5, + ), Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: + price, + ), style: TextStyle( - fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontSize: + 14, + decoration: + TextDecoration.lineThrough, + decorationColor: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -486,83 +944,177 @@ class FavouriteScreen extends StatelessWidget { children: [ SvgPicture.asset( "assets/icons/ic_star.svg", - colorFilter: const ColorFilter.mode(AppThemeData.warning300, BlendMode.srcIn), + colorFilter: const ColorFilter.mode( + AppThemeData.warning300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: + 5, ), - const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w500, ), ), ], ), Text( "${productModel.description}", - maxLines: 2, + maxLines: + 2, style: TextStyle( - overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, + overflow: + TextOverflow.ellipsis, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w400, ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: + 6, + ), ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular( + 16, + ), + ), child: Stack( children: [ NetworkImageWidget( - imageUrl: productModel.photo.toString(), - fit: BoxFit.cover, - height: Responsive.height(16, context), - width: Responsive.width(34, context), + imageUrl: + productModel.photo.toString(), + fit: + BoxFit.cover, + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), ), Container( - height: Responsive.height(16, context), - width: Responsive.width(34, context), + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black.withOpacity( + 0, + ), + const Color( + 0xFF111827, + ), + ], ), ), ), Positioned( - right: 10, - top: 10, + right: + 10, + top: + 10, child: InkWell( onTap: () async { - if (controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty) { + if (controller.favouriteItemList + .where( + ( + p0, + ) => + p0.productId == + productModel.id, + ) + .isNotEmpty) { FavouriteItemModel favouriteModel = FavouriteItemModel( - productId: productModel.id, - storeId: productModel.vendorID, - userId: FireStoreUtils.getCurrentUid(), + productId: + productModel.id, + storeId: + productModel.vendorID, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.removeWhere( + ( + item, + ) => + item.productId == + productModel.id, + ); + controller.favouriteFoodList.removeAt( + index, + ); + await FireStoreUtils.removeFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.removeWhere((item) => item.productId == productModel.id); - controller.favouriteFoodList.removeAt(index); - await FireStoreUtils.removeFavouriteItem(favouriteModel); } else { FavouriteItemModel favouriteModel = FavouriteItemModel( - productId: productModel.id, - storeId: productModel.vendorID, - userId: FireStoreUtils.getCurrentUid(), + productId: + productModel.id, + storeId: + productModel.vendorID, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.add( + favouriteModel, + ); + await FireStoreUtils.setFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.add(favouriteModel); - await FireStoreUtils.setFavouriteItem(favouriteModel); } }, child: Obx( () => - controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteItemList + .where( + ( + p0, + ) => + p0.productId == + productModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -605,24 +1157,56 @@ class FavouriteScreen extends StatelessWidget { print(productModel.price); print(productModel.disPrice); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel.vendorID.toString()); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ); if (productModel.itemAttribute != null) { if (productModel.itemAttribute!.attributes!.isNotEmpty) { for (var element in productModel.itemAttribute!.attributes!) { if (element.attributeOptions!.isNotEmpty) { - selectedVariants.add(productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString()); - selectedIndexVariants.add('${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}'); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedVariants.add( + productModel + .itemAttribute! + .attributes![productModel.itemAttribute!.attributes!.indexOf( + element, + )] + .attributeOptions![0] + .toString(), + ); + selectedIndexVariants.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { - price = Constant.productCommissionPrice(vendorModel!, productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0'); + if (productModel.itemAttribute!.variants! + .where((element) => element.variantSku == selectedVariants.join('-')) + .isNotEmpty) { + price = Constant.productCommissionPrice( + vendorModel!, + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', + ); disPrice = Constant.productCommissionPrice(vendorModel, '0'); } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return {'price': price, 'disPrice': disPrice}; diff --git a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart index e70da70..cc6bef3 100644 --- a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart +++ b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/text_field_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -21,14 +20,31 @@ class ForgotPasswordScreen extends StatelessWidget { init: ForgotPasswordController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Forgot Password".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 22, fontFamily: AppThemeData.semiBold)), - Text("No worries!! We’ll send you reset instructions".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.regular)), + Text( + "Forgot Password".tr(), + style: TextStyle( + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), + Text( + "No worries!! We’ll send you reset instructions".tr(), + style: TextStyle( + color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.regular, + ), + ), const SizedBox(height: 32), TextFieldWidget( title: 'Email Address'.tr(), @@ -36,7 +52,13 @@ class ForgotPasswordScreen extends StatelessWidget { hintText: 'Enter email address'.tr(), prefix: Padding( padding: const EdgeInsets.all(12), - child: SvgPicture.asset("assets/icons/ic_mail.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey300 : AppThemeData.grey600, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_mail.svg", + colorFilter: ColorFilter.mode( + isDark ? AppThemeData.grey300 : AppThemeData.grey600, + BlendMode.srcIn, + ), + ), ), ), const SizedBox(height: 32), @@ -45,8 +67,12 @@ class ForgotPasswordScreen extends StatelessWidget { color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { - if (controller.emailEditingController.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter valid email".tr()); + if (controller.emailEditingController.value.text + .trim() + .isEmpty) { + ShowToastDialog.showToast( + "Please enter valid email".tr(), + ); } else { controller.forgotPassword(); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart index d4f2197..921276d 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart @@ -12,7 +12,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import 'history_gift_card.dart'; @@ -29,13 +29,18 @@ class GiftCardScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( "Customize Gift Card".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), actions: [ InkWell( @@ -69,26 +74,54 @@ class GiftCardScreen extends StatelessWidget { itemCount: controller.giftCardList.length, onPageChanged: (value) { controller.selectedPageIndex.value = value; - controller.selectedGiftCard.value = controller.giftCardList[controller.selectedPageIndex.value]; + controller.selectedGiftCard.value = + controller.giftCardList[controller + .selectedPageIndex + .value]; - controller.messageController.value.text = controller.giftCardList[controller.selectedPageIndex.value].message.toString(); + controller.messageController.value.text = + controller + .giftCardList[controller + .selectedPageIndex + .value] + .message + .toString(); }, scrollDirection: Axis.horizontal, controller: controller.pageController, itemBuilder: (context, index) { - GiftCardsModel giftCardModel = controller.giftCardList[index]; + GiftCardsModel giftCardModel = + controller.giftCardList[index]; return InkWell( onTap: () { - controller.selectedGiftCard.value = giftCardModel; - controller.messageController.value.text = controller.selectedGiftCard.value.message.toString(); + controller.selectedGiftCard.value = + giftCardModel; + controller.messageController.value.text = + controller + .selectedGiftCard + .value + .message + .toString(); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), border: Border.all(color: AppThemeData.primary300)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: AppThemeData.primary300, + ), + ), child: ClipRRect( borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: giftCardModel.image.toString(), width: Responsive.width(80, context), fit: BoxFit.cover), + child: NetworkImageWidget( + imageUrl: + giftCardModel.image.toString(), + width: Responsive.width(80, context), + fit: BoxFit.cover, + ), ), ), ), @@ -101,14 +134,32 @@ class GiftCardScreen extends StatelessWidget { title: 'Choose an amount'.tr(), controller: controller.amountController.value, hintText: 'Enter gift card amount'.tr(), - textInputType: const TextInputType.numberWithOptions(signed: true, decimal: true), + textInputType: + const TextInputType.numberWithOptions( + signed: true, + decimal: true, + ), textInputAction: TextInputAction.done, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp('[0-9]'), + ), + ], prefix: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), child: Text( Constant.currencyModel!.symbol.tr(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontSize: 18), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontSize: 18, + ), ), ), onchange: (value) { @@ -126,17 +177,25 @@ class GiftCardScreen extends StatelessWidget { return Obx( () => InkWell( onTap: () { - controller.selectedAmount.value = controller.amountList[index]; - controller.amountController.value.text = controller.amountList[index]; + controller.selectedAmount.value = + controller.amountList[index]; + controller.amountController.value.text = + controller.amountList[index]; }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + ), child: Container( decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(40)), + borderRadius: const BorderRadius.all( + Radius.circular(40), + ), border: Border.all( color: - controller.selectedAmount == controller.amountList[index] + controller.selectedAmount == + controller + .amountList[index] ? AppThemeData.primary300 : isDark ? AppThemeData.grey400 @@ -144,11 +203,24 @@ class GiftCardScreen extends StatelessWidget { ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Center( child: Text( - Constant.amountShow(amount: controller.amountList[index]), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + Constant.amountShow( + amount: + controller + .amountList[index], + ), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ), ), @@ -160,7 +232,12 @@ class GiftCardScreen extends StatelessWidget { ), ), const SizedBox(height: 40), - TextFieldWidget(title: 'Add Message (Optional)'.tr(), controller: controller.messageController.value, hintText: 'Add message here....'.tr(), maxLine: 6), + TextFieldWidget( + title: 'Add Message (Optional)'.tr(), + controller: controller.messageController.value, + hintText: 'Add message here....'.tr(), + maxLine: 6, + ), ], ), ), @@ -179,7 +256,10 @@ class GiftCardScreen extends StatelessWidget { onPress: () async { if (controller.amountController.value.text.isNotEmpty) { if (Constant.userModel == null) { - ShowToastDialog.showToast("Please log in to the application. You are not logged in.".tr()); + ShowToastDialog.showToast( + "Please log in to the application. You are not logged in." + .tr(), + ); } else { giftCardBottomSheet(context, controller); } @@ -195,12 +275,17 @@ class GiftCardScreen extends StatelessWidget { ); } - Future giftCardBottomSheet(BuildContext context, GiftCardController controller) { + Future giftCardBottomSheet( + BuildContext context, + GiftCardController controller, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -213,7 +298,10 @@ class GiftCardScreen extends StatelessWidget { () => Scaffold( body: SingleChildScrollView( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -221,17 +309,34 @@ class GiftCardScreen extends StatelessWidget { const SizedBox(height: 20), ClipRRect( borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: controller.selectedGiftCard.value.image.toString(), height: Responsive.height(20, context), width: Responsive.width(100, context)), + child: NetworkImageWidget( + imageUrl: + controller.selectedGiftCard.value.image + .toString(), + height: Responsive.height(20, context), + width: Responsive.width(100, context), + ), ), const SizedBox(height: 10), Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Container( padding: const EdgeInsets.all(8), - decoration: ShapeDecoration(color: AppThemeData.ecommerce50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: AppThemeData.ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Text( - 'Complete payment and share this e-gift card with loved ones using any app'.tr(), - style: TextStyle(color: AppThemeData.ecommerce300, fontSize: 14, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + 'Complete payment and share this e-gift card with loved ones using any app' + .tr(), + style: TextStyle( + color: AppThemeData.ecommerce300, + fontSize: 14, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ), ), @@ -241,48 +346,114 @@ class GiftCardScreen extends StatelessWidget { Text( "Bill Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Sub Total".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.amountController.value.text), + Constant.amountShow( + amount: + controller + .amountController + .value + .text, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Grand Total".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.amountController.value.text), + Constant.amountShow( + amount: + controller + .amountController + .value + .text, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -295,9 +466,17 @@ class GiftCardScreen extends StatelessWidget { const SizedBox(height: 20), Center( child: Text( - "${'Gift Card expire'.tr()} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr()}".tr(), + "${'Gift Card expire'.tr()} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr()}" + .tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + ), ), ), ], @@ -305,12 +484,17 @@ class GiftCardScreen extends StatelessWidget { ), ), bottomNavigationBar: Container( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "${'Pay'.tr()} ${Constant.amountShow(amount: controller.amountController.value.text)}", + title: + "${'Pay'.tr()} ${Constant.amountShow(amount: controller.amountController.value.text)}", height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart index 1322201..6d92fb3 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart @@ -4,7 +4,7 @@ import 'package:customer/models/gift_cards_order_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../widget/my_separator.dart'; @@ -19,7 +19,12 @@ class HistoryGiftCard extends StatelessWidget { init: HistoryGiftCardController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() @@ -27,61 +32,114 @@ class HistoryGiftCard extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16), child: controller.giftCardsOrderList.isEmpty - ? Constant.showEmptyView(message: "Purchased Gift card not found".tr()) + ? Constant.showEmptyView( + message: "Purchased Gift card not found".tr(), + ) : ListView.builder( itemCount: controller.giftCardsOrderList.length, shrinkWrap: true, itemBuilder: (context, index) { - GiftCardsOrderModel giftCardOrderModel = controller.giftCardsOrderList[index]; + GiftCardsOrderModel giftCardOrderModel = + controller.giftCardsOrderList[index]; return Container( - margin: const EdgeInsets.symmetric(vertical: 4), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + margin: const EdgeInsets.symmetric( + vertical: 4, + ), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(10), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( - giftCardOrderModel.giftTitle.toString(), + giftCardOrderModel.giftTitle + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), ), Text( - Constant.amountShow(amount: giftCardOrderModel.price.toString()), + Constant.amountShow( + amount: + giftCardOrderModel.price + .toString(), + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( children: [ Expanded( child: Text( "Gift Code".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontFamily: + AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), Text( - giftCardOrderModel.giftCode.toString().replaceAllMapped(RegExp(r".{4}"), (match) => "${match.group(0)} "), + giftCardOrderModel.giftCode + .toString() + .replaceAllMapped( + RegExp(r".{4}"), + (match) => + "${match.group(0)} ", + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), @@ -93,16 +151,33 @@ class HistoryGiftCard extends StatelessWidget { Expanded( child: Text( "Gift Pin".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontFamily: + AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), - giftCardOrderModel.isPasswordShow == true + giftCardOrderModel.isPasswordShow == + true ? Text( - giftCardOrderModel.giftPin.toString(), + giftCardOrderModel.giftPin + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ) @@ -110,60 +185,107 @@ class HistoryGiftCard extends StatelessWidget { "****", style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), const SizedBox(width: 10), - giftCardOrderModel.isPasswordShow == true + giftCardOrderModel.isPasswordShow == + true ? InkWell( onTap: () { - controller.updateList(index); + controller.updateList( + index, + ); controller.update(); }, - child: const Icon(Icons.visibility_off), + child: const Icon( + Icons.visibility_off, + ), ) : InkWell( onTap: () { - controller.updateList(index); + controller.updateList( + index, + ); controller.update(); }, - child: const Icon(Icons.remove_red_eye), + child: const Icon( + Icons.remove_red_eye, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( children: [ InkWell( onTap: () { controller.share( - giftCardOrderModel.giftCode.toString(), - giftCardOrderModel.giftPin.toString(), - giftCardOrderModel.message.toString(), - giftCardOrderModel.price.toString(), - giftCardOrderModel.expireDate!, + giftCardOrderModel.giftCode + .toString(), + giftCardOrderModel.giftPin + .toString(), + giftCardOrderModel.message + .toString(), + giftCardOrderModel.price + .toString(), + giftCardOrderModel + .expireDate!, ); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 6, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + color: + isDark + ? AppThemeData.grey700 + : AppThemeData + .grey200, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), child: Row( - mainAxisSize: MainAxisSize.min, + mainAxisSize: + MainAxisSize.min, children: [ Text( 'Share'.tr(), style: TextStyle( - color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, fontSize: 14, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, height: 0.11, ), ), @@ -175,11 +297,20 @@ class HistoryGiftCard extends StatelessWidget { ), const Expanded(child: SizedBox()), Text( - giftCardOrderModel.redeem == true ? "Redeemed".tr() : "Not Redeem".tr(), + giftCardOrderModel.redeem == true + ? "Redeemed".tr() + : "Not Redeem".tr(), style: TextStyle( fontSize: 16, - color: giftCardOrderModel.redeem == true ? AppThemeData.success400 : AppThemeData.danger300, - fontFamily: AppThemeData.semiBold, + color: + giftCardOrderModel.redeem == + true + ? AppThemeData + .success400 + : AppThemeData + .danger300, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w500, ), ), diff --git a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart index 0096cda..04bb55f 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart @@ -11,8 +11,7 @@ import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; import '../dash_board_screens/dash_board_screen.dart'; @@ -28,7 +27,12 @@ class RedeemGiftCardScreen extends StatelessWidget { init: RedeemGiftCardController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: InkWell( onTap: () { FocusScope.of(context).unfocus(); @@ -40,11 +44,24 @@ class RedeemGiftCardScreen extends StatelessWidget { children: [ Text( "Redeem Gift Card".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Enter your gift card code to enjoy discounts and special offers on your orders.".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Enter your gift card code to enjoy discounts and special offers on your orders." + .tr(), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 20), TextFieldWidget( @@ -52,14 +69,20 @@ class RedeemGiftCardScreen extends StatelessWidget { controller: controller.giftCodeController.value, hintText: 'Enter gift code'.tr(), textInputType: TextInputType.number, - prefix: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_gift_code.svg")), + prefix: Padding( + padding: const EdgeInsets.all(10), + child: SvgPicture.asset("assets/icons/ic_gift_code.svg"), + ), ), TextFieldWidget( title: 'Gift Pin'.tr(), controller: controller.giftPinController.value, hintText: 'Enter gift pin'.tr(), textInputType: TextInputType.number, - prefix: Padding(padding: const EdgeInsets.all(10), child: SvgPicture.asset("assets/icons/ic_gift_pin.svg")), + prefix: Padding( + padding: const EdgeInsets.all(10), + child: SvgPicture.asset("assets/icons/ic_gift_pin.svg"), + ), ), ], ), @@ -83,45 +106,73 @@ class RedeemGiftCardScreen extends StatelessWidget { ShowToastDialog.showToast("Please Enter Gift Pin".tr()); } else { ShowToastDialog.showLoader("Please wait...".tr()); - await FireStoreUtils.checkRedeemCode(controller.giftCodeController.value.text.replaceAll(" ", "")).then((value) async { + await FireStoreUtils.checkRedeemCode( + controller.giftCodeController.value.text.replaceAll( + " ", + "", + ), + ).then((value) async { if (value != null) { GiftCardsOrderModel giftCodeModel = value; if (giftCodeModel.redeem == true) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Gift voucher already redeemed".tr()); - } else if (giftCodeModel.giftPin != controller.giftPinController.value.text) { + ShowToastDialog.showToast( + "Gift voucher already redeemed".tr(), + ); + } else if (giftCodeModel.giftPin != + controller.giftPinController.value.text) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Gift Pin Invalid".tr()); - } else if (giftCodeModel.expireDate!.toDate().isBefore(DateTime.now())) { + } else if (giftCodeModel.expireDate!.toDate().isBefore( + DateTime.now(), + )) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Gift Voucher expire".tr()); } else { giftCodeModel.redeem = true; - WalletTransactionModel transactionModel = WalletTransactionModel( - id: Constant.getUuid(), - amount: double.parse(giftCodeModel.price.toString()), - date: Timestamp.now(), - paymentMethod: "Wallet", - transactionUser: "user", - userId: FireStoreUtils.getCurrentUid(), - isTopup: true, - note: "Gift Voucher", - paymentStatus: "success", - ); + WalletTransactionModel transactionModel = + WalletTransactionModel( + id: Constant.getUuid(), + amount: double.parse( + giftCodeModel.price.toString(), + ), + date: Timestamp.now(), + paymentMethod: "Wallet", + transactionUser: "user", + userId: FireStoreUtils.getCurrentUid(), + isTopup: true, + note: "Gift Voucher", + paymentStatus: "success", + ); - await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { + await FireStoreUtils.setWalletTransaction( + transactionModel, + ).then((value) async { if (value == true) { - await FireStoreUtils.updateUserWallet(amount: giftCodeModel.price.toString(), userId: FireStoreUtils.getCurrentUid()).then((value) async { - await FireStoreUtils.sendTopUpMail(paymentMethod: "Gift Voucher", amount: giftCodeModel.price.toString(), tractionId: transactionModel.id.toString()); - await FireStoreUtils.placeGiftCardOrder(giftCodeModel).then((value) { + await FireStoreUtils.updateUserWallet( + amount: giftCodeModel.price.toString(), + userId: FireStoreUtils.getCurrentUid(), + ).then((value) async { + await FireStoreUtils.sendTopUpMail( + paymentMethod: "Gift Voucher", + amount: giftCodeModel.price.toString(), + tractionId: transactionModel.id.toString(), + ); + await FireStoreUtils.placeGiftCardOrder( + giftCodeModel, + ).then((value) { ShowToastDialog.closeLoader(); if (Constant.walletSetting == true) { Get.offAll(const DashBoardScreen()); - DashBoardController controller = Get.put(DashBoardController()); + DashBoardController controller = Get.put( + DashBoardController(), + ); controller.selectedIndex.value = 2; } - ShowToastDialog.showToast("Voucher redeem successfully".tr()); + ShowToastDialog.showToast( + "Voucher redeem successfully".tr(), + ); }); }); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart index 9297be8..7309bca 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import '../wallet_screen/wallet_screen.dart'; @@ -22,12 +22,22 @@ class SelectGiftPaymentScreen extends StatelessWidget { init: GiftCardController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Payment Option".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Payment Option".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -38,7 +48,12 @@ class SelectGiftPaymentScreen extends StatelessWidget { Text( "Preferred Payment".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), const SizedBox(height: 10), if (controller.walletSettingModel.value.isEnabled == true) @@ -47,17 +62,39 @@ class SelectGiftPaymentScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), - shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 20, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + shadows: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 20, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), ], ), @@ -67,40 +104,143 @@ class SelectGiftPaymentScreen extends StatelessWidget { Text( "Other Payment Options".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), ], ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), - shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 20, offset: Offset(0, 0), spreadRadius: 0)], + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + shadows: const [ + BoxShadow( + color: Color(0x07000000), + blurRadius: 20, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.flutterWaveModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.paytmModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.paytmModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -110,7 +250,13 @@ class SelectGiftPaymentScreen extends StatelessWidget { ), ), bottomNavigationBar: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), child: Padding( padding: const EdgeInsets.only(bottom: 20), @@ -121,38 +267,89 @@ class SelectGiftPaymentScreen extends StatelessWidget { textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.amountController.value.text, context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.amountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.amountController.value.text, + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.amountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.amountController.value.text), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.amountController.value.text, orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.amountController.value.text, + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.amountController.value.text, + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } }, ), @@ -163,7 +360,12 @@ class SelectGiftPaymentScreen extends StatelessWidget { ); } - Obx cardDecoration(GiftCardController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + GiftCardController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -176,8 +378,16 @@ class SelectGiftPaymentScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -188,12 +398,32 @@ class SelectGiftPaymentScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == null + ? '0.0' + : controller.userModel.value.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -202,14 +432,20 @@ class SelectGiftPaymentScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart index 80ffc28..56c5e78 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -22,7 +22,12 @@ class CategoryRestaurantScreen extends StatelessWidget { init: CategoryRestaurantController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + ), body: controller.isLoading.value ? Constant.loader() @@ -34,33 +39,62 @@ class CategoryRestaurantScreen extends StatelessWidget { shrinkWrap: true, itemCount: controller.allNearestRestaurant.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.allNearestRestaurant[index]; + VendorModel vendorModel = + controller.allNearestRestaurant[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), + begin: const Alignment( + -0.00, + -1.00, + ), end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], ), ), ), @@ -68,28 +102,60 @@ class CategoryRestaurantScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData + .success300, + borderRadius: + BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: 5, + ), Text( "Free Delivery".tr(), - style: TextStyle(fontSize: 14, color: AppThemeData.success600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + AppThemeData + .success600, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -100,22 +166,52 @@ class CategoryRestaurantScreen extends StatelessWidget { ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -125,22 +221,52 @@ class CategoryRestaurantScreen extends StatelessWidget { const SizedBox(width: 6), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce600 + : AppThemeData + .ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -154,9 +280,12 @@ class CategoryRestaurantScreen extends StatelessWidget { ), const SizedBox(height: 15), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), @@ -166,7 +295,10 @@ class CategoryRestaurantScreen extends StatelessWidget { fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), Text( @@ -177,7 +309,10 @@ class CategoryRestaurantScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart index 05059fb..22ef568 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart @@ -9,7 +9,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -25,13 +25,18 @@ class DiscountRestaurantListScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( controller.title.value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: @@ -47,24 +52,60 @@ class DiscountRestaurantListScreen extends StatelessWidget { CouponModel offerModel = controller.couponList[index]; return InkWell( onTap: () { - Get.to(RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), bottomLeft: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + bottomLeft: Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(16, context), width: Responsive.width(28, context)), + NetworkImageWidget( + imageUrl: + vendorModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height( + 16, + context, + ), + width: Responsive.width(28, context), + ), Container( - height: Responsive.height(16, context), + height: Responsive.height( + 16, + context, + ), width: Responsive.width(28, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), Positioned( @@ -72,16 +113,37 @@ class DiscountRestaurantListScreen extends StatelessWidget { left: 10, child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 4, + ), child: Text( "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".toUpperCase().tr() : " off".toUpperCase().tr()}", textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -91,9 +153,12 @@ class DiscountRestaurantListScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -104,19 +169,45 @@ class DiscountRestaurantListScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, ), ), ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -124,18 +215,33 @@ class DiscountRestaurantListScreen extends StatelessWidget { ), const SizedBox(height: 5), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Icon(Icons.location_on, size: 18, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + Icon( + Icons.location_on, + size: 18, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + ), const SizedBox(width: 5), Expanded( child: Text( - vendorModel.location.toString(), + vendorModel.location + .toString(), style: TextStyle( - fontFamily: AppThemeData.medium, + fontFamily: + AppThemeData.medium, fontWeight: FontWeight.w500, fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey400, ), ), ), @@ -143,19 +249,45 @@ class DiscountRestaurantListScreen extends StatelessWidget { ), const SizedBox(height: 5), Container( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, child: DottedBorder( - options: RoundedRectDottedBorderOptions( - radius: const Radius.circular(6), - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - strokeWidth: 1, - ), + options: + RoundedRectDottedBorderOptions( + radius: + const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + strokeWidth: 1, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 2), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 2, + ), child: Text( "${offerModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ), diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index f8c9af2..03adfec 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -29,7 +29,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import 'package:url_launcher/url_launcher.dart'; @@ -705,7 +705,8 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "New Arrivals".tr(), + "New Arrivals" + .tr(), textAlign: TextAlign .start, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart index 27ccd52..7641c69 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart @@ -28,7 +28,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/banner_model.dart'; @@ -57,11 +57,13 @@ class HomeScreenTwo extends StatelessWidget { init: FoodHomeController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: controller.isLoading.value ? Constant.loader() - : Constant.isZoneAvailable == false || controller.allNearestRestaurant.isEmpty + : Constant.isZoneAvailable == false || + controller.allNearestRestaurant.isEmpty ? Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -70,12 +72,30 @@ class HomeScreenTwo extends StatelessWidget { children: [ Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "No Store Found in Your Area".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr(), + "Currently, there are no available store in your zone. Try changing your location to find nearby options." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -92,16 +112,21 @@ class HomeScreenTwo extends StatelessWidget { ), ) : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: controller.isListView.value == false ? const MapView() : Column( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -109,98 +134,215 @@ class HomeScreenTwo extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, size: 20), + child: Icon( + Icons.arrow_back, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + size: 20, + ), ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Constant.userModel == null ? InkWell( onTap: () { - Get.offAll(const LoginScreen()); + Get.offAll( + const LoginScreen(), + ); }, child: Text( "Login".tr(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + textAlign: + TextAlign.center, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 12, + ), ), ) : Text( - Constant.userModel!.fullName(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + Constant.userModel! + .fullName(), + textAlign: + TextAlign.center, + style: TextStyle( + fontFamily: + AppThemeData.medium, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 12, + ), ), InkWell( onTap: () async { - if (Constant.userModel != null) { - Get.to(AddressListScreen())!.then((value) { + if (Constant.userModel != + null) { + Get.to( + AddressListScreen(), + )!.then((value) { if (value != null) { - ShippingAddress shippingAddress = value; - Constant.selectedLocation = shippingAddress; + ShippingAddress + shippingAddress = + value; + Constant.selectedLocation = + shippingAddress; controller.getData(); } }); } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait..." + .tr(), + ); // ✅ declare once for whole method - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress + shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); await Geolocator.getCurrentPosition(); ShowToastDialog.closeLoader(); - if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); - if (result != null) { - final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - final address = firstPlace.address; + if (Constant + .selectedMapType == + 'osm') { + final result = + await Get.to( + () => + MapPickerPage(), + ); + if (result != + null) { + final firstPlace = + result; + final lat = + firstPlace + .coordinates + .latitude; + final lng = + firstPlace + .coordinates + .longitude; + final address = + firstPlace + .address; - shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); - Constant.selectedLocation = shippingAddress; - controller.getData(); + shippingAddress + .addressAs = + "Home"; + shippingAddress + .locality = + address + .toString(); + shippingAddress + .location = + UserLocation( + latitude: + lat, + longitude: + lng, + ); + Constant.selectedLocation = + shippingAddress; + controller + .getData(); Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { - if (value != null) { - SelectedLocationModel selectedLocationModel = value; + Get.to( + LocationPickerScreen(), + )!.then(( + value, + ) async { + if (value != + null) { + SelectedLocationModel + selectedLocationModel = + value; - shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation( - latitude: selectedLocationModel.latLng!.latitude, - longitude: selectedLocationModel.latLng!.longitude, + shippingAddress + .addressAs = + "Home"; + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, ); - shippingAddress.locality = "Picked from Map"; // You can reverse-geocode + shippingAddress + .locality = + "Picked from Map"; // You can reverse-geocode - Constant.selectedLocation = shippingAddress; - controller.getData(); + Constant.selectedLocation = + shippingAddress; + controller + .getData(); } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { - Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); - String currentLocation = + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then(( + valuePlaceMaker, + ) { + Placemark + placeMark = + valuePlaceMaker[0]; + shippingAddress + .addressAs = + "Home"; + shippingAddress + .location = + UserLocation( + latitude: + 19.228825, + longitude: + 72.854118, + ); + String + currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress + .locality = + currentLocation; }); - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; ShowToastDialog.closeLoader(); - controller.getData(); + controller + .getData(); } }, context: context, @@ -209,19 +351,36 @@ class HomeScreenTwo extends StatelessWidget { }, child: Text.rich( maxLines: 1, - overflow: TextOverflow.ellipsis, + overflow: + TextOverflow.ellipsis, TextSpan( children: [ TextSpan( - text: Constant.selectedLocation.getFullAddress(), + text: + Constant + .selectedLocation + .getFullAddress(), style: TextStyle( - fontFamily: AppThemeData.medium, - overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: + AppThemeData + .medium, + overflow: + TextOverflow + .ellipsis, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, fontSize: 14, ), ), - WidgetSpan(child: SvgPicture.asset("assets/icons/ic_down.svg")), + WidgetSpan( + child: SvgPicture.asset( + "assets/icons/ic_down.svg", + ), + ), ], ), ), @@ -232,16 +391,28 @@ class HomeScreenTwo extends StatelessWidget { const SizedBox(width: 5), InkWell( onTap: () async { - (await Get.to(const CartScreen())); + (await Get.to( + const CartScreen(), + )); controller.getCartData(); }, child: ClipOval( child: Container( - padding: const EdgeInsets.all(8.0), - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + padding: const EdgeInsets.all( + 8.0, + ), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, child: SvgPicture.asset( "assets/icons/ic_shoping_cart.svg", - colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey50 : AppThemeData.grey900, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + BlendMode.srcIn, + ), ), ), ), @@ -251,16 +422,39 @@ class HomeScreenTwo extends StatelessWidget { const SizedBox(height: 10), InkWell( onTap: () { - Get.to(const SearchScreen(), arguments: {"vendorList": controller.allNearestRestaurant}); + Get.to( + const SearchScreen(), + arguments: { + "vendorList": + controller + .allNearestRestaurant, + }, + ); }, child: TextFieldWidget( hintText: - Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true - ? 'Search the dish, foo and more...'.tr() - : 'Search the store, item and more...'.tr(), + Constant + .sectionConstantModel + ?.name + ?.toLowerCase() + .contains( + 'restaurants', + ) == + true + ? 'Search the dish, foo and more...' + .tr() + : 'Search the store, item and more...' + .tr(), controller: null, enable: false, - prefix: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg")), + prefix: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), + child: SvgPicture.asset( + "assets/icons/ic_search.svg", + ), + ), ), ), const SizedBox(height: 5), @@ -271,64 +465,185 @@ class HomeScreenTwo extends StatelessWidget { child: SingleChildScrollView( child: Column( children: [ - controller.bannerModel.isEmpty ? const SizedBox() : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: BannerView(controller: controller)), + controller.bannerModel.isEmpty + ? const SizedBox() + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: BannerView( + controller: controller, + ), + ), const SizedBox(height: 20), - Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: CategoryView(controller: controller)), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), + child: CategoryView( + controller: controller, + ), + ), controller.couponRestaurantList.isEmpty ? const SizedBox() - : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: Column(children: [const SizedBox(height: 20), OfferView(controller: controller)])), - controller.storyList.isEmpty || Constant.storyEnable == false + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: Column( + children: [ + const SizedBox(height: 20), + OfferView( + controller: controller, + ), + ], + ), + ), + controller.storyList.isEmpty || + Constant.storyEnable == false ? const SizedBox() - : Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: Column(children: [const SizedBox(height: 20), StoryView(controller: controller)])), + : Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), + child: Column( + children: [ + const SizedBox(height: 20), + StoryView( + controller: controller, + ), + ], + ), + ), Visibility( - visible: Constant.isEnableAdsFeature == true, + visible: + Constant.isEnableAdsFeature == + true, child: - controller.advertisementList.isEmpty + controller + .advertisementList + .isEmpty ? const SizedBox() : Column( children: [ - const SizedBox(height: 20), + const SizedBox( + height: 20, + ), Container( - margin: const EdgeInsets.symmetric(horizontal: 16), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(20), color: AppThemeData.primary300.withAlpha(40)), + margin: + const EdgeInsets.symmetric( + horizontal: 16, + ), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 16, + ), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 20, + ), + color: AppThemeData + .primary300 + .withAlpha(40), + ), child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( children: [ Expanded( child: Text( - "Highlights for you".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + "Highlights for you" + .tr(), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: + 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), InkWell( onTap: () { - Get.to(AllAdvertisementScreen())?.then((value) { - controller.getFavouriteRestaurant(); + Get.to( + AllAdvertisementScreen(), + )?.then(( + value, + ) { + controller + .getFavouriteRestaurant(); }); }, child: Text( - "See all".tr(), - textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + "See all" + .tr(), + textAlign: + TextAlign + .center, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], ), - const SizedBox(height: 16), + const SizedBox( + height: 16, + ), SizedBox( height: 220, child: ListView.builder( - physics: const BouncingScrollPhysics(), - scrollDirection: Axis.horizontal, - itemCount: controller.advertisementList.length >= 10 ? 10 : controller.advertisementList.length, - padding: EdgeInsets.all(0), - itemBuilder: (BuildContext context, int index) { - return AdvertisementHomeCard(controller: controller, model: controller.advertisementList[index]); + physics: + const BouncingScrollPhysics(), + scrollDirection: + Axis.horizontal, + itemCount: + controller.advertisementList.length >= + 10 + ? 10 + : controller + .advertisementList + .length, + padding: + EdgeInsets.all( + 0, + ), + itemBuilder: ( + BuildContext + context, + int index, + ) { + return AdvertisementHomeCard( + controller: + controller, + model: + controller + .advertisementList[index], + ); }, ), ), @@ -338,7 +653,16 @@ class HomeScreenTwo extends StatelessWidget { ], ), ), - controller.allNearestRestaurant.isEmpty ? const SizedBox() : Column(children: [const SizedBox(height: 20), RestaurantView(controller: controller)]), + controller.allNearestRestaurant.isEmpty + ? const SizedBox() + : Column( + children: [ + const SizedBox(height: 20), + RestaurantView( + controller: controller, + ), + ], + ), ], ), ), @@ -346,18 +670,29 @@ class HomeScreenTwo extends StatelessWidget { ], ), ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, + floatingActionButtonLocation: + FloatingActionButtonLocation.centerFloat, floatingActionButton: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, borderRadius: const BorderRadius.all(Radius.circular(30))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + borderRadius: const BorderRadius.all(Radius.circular(30)), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), child: Row( mainAxisSize: MainAxisSize.min, children: [ Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.all(Radius.circular(30))), + decoration: BoxDecoration( + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + borderRadius: const BorderRadius.all(Radius.circular(30)), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( children: [ InkWell( @@ -366,12 +701,22 @@ class HomeScreenTwo extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: controller.isListView.value ? AppThemeData.primary300 : null), + decoration: BoxDecoration( + color: + controller.isListView.value + ? AppThemeData.primary300 + : null, + ), child: Padding( padding: const EdgeInsets.all(8.0), child: SvgPicture.asset( "assets/icons/ic_view_grid_list.svg", - colorFilter: ColorFilter.mode(controller.isListView.value ? AppThemeData.grey50 : AppThemeData.grey500, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + controller.isListView.value + ? AppThemeData.grey50 + : AppThemeData.grey500, + BlendMode.srcIn, + ), ), ), ), @@ -384,12 +729,22 @@ class HomeScreenTwo extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: controller.isListView.value == false ? AppThemeData.primary300 : null), + decoration: BoxDecoration( + color: + controller.isListView.value == false + ? AppThemeData.primary300 + : null, + ), child: Padding( padding: const EdgeInsets.all(8.0), child: SvgPicture.asset( "assets/icons/ic_map_draw.svg", - colorFilter: ColorFilter.mode(controller.isListView.value == false ? AppThemeData.grey50 : AppThemeData.grey500, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + controller.isListView.value == false + ? AppThemeData.grey50 + : AppThemeData.grey500, + BlendMode.srcIn, + ), ), ), ), @@ -406,10 +761,23 @@ class HomeScreenTwo extends StatelessWidget { }, child: ClipOval( child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + ), child: Padding( padding: const EdgeInsets.all(10), - child: SvgPicture.asset("assets/icons/ic_scan_code.svg", colorFilter: ColorFilter.mode(isDark ? AppThemeData.grey400 : AppThemeData.grey500, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_scan_code.svg", + colorFilter: ColorFilter.mode( + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + BlendMode.srcIn, + ), + ), ), ), ), @@ -421,15 +789,30 @@ class HomeScreenTwo extends StatelessWidget { value: controller.selectedOrderTypeValue.value.tr(), icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr(), 'TakeAway'.tr()].map((String value) { + ['Delivery'.tr(), 'TakeAway'.tr()].map(( + String value, + ) { return DropdownMenuItem( value: value, - child: Text(value.tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + child: Text( + value.tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), ); }).toList(), onChanged: (value) async { if (cartItem.isEmpty) { - await Preferences.setString(Preferences.foodDeliveryType, value!); + await Preferences.setString( + Preferences.foodDeliveryType, + value!, + ); controller.selectedOrderTypeValue.value = value; controller.getData(); } else { @@ -438,11 +821,16 @@ class HomeScreenTwo extends StatelessWidget { builder: (BuildContext context) { return CustomDialogBox( title: "Alert".tr(), - descriptions: "Do you really want to change the delivery option? Your cart will be empty.".tr(), + descriptions: + "Do you really want to change the delivery option? Your cart will be empty." + .tr(), positiveString: "Ok".tr(), negativeString: "Cancel".tr(), positiveClick: () async { - await Preferences.setString(Preferences.foodDeliveryType, value!); + await Preferences.setString( + Preferences.foodDeliveryType, + value!, + ); controller.selectedOrderTypeValue.value = value; controller.getData(); DatabaseHelper.instance.deleteAllCartProducts(); @@ -480,7 +868,10 @@ class CategoryView extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Column( @@ -494,7 +885,19 @@ class CategoryView extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text("Our Categories".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded( + child: Text( + "Our Categories".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 18, + ), + ), + ), InkWell( onTap: () { Get.to(const ViewAllCategoryScreen()); @@ -502,15 +905,28 @@ class CategoryView extends StatelessWidget { child: Text( "See all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 14, + ), ), ), ], ), GradientText( 'Best Servings Food'.tr(), - style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), - gradient: LinearGradient(colors: [Color(0xFF3961F1), Color(0xFF11D0EA)]), + style: TextStyle( + fontSize: 24, + fontFamily: 'Inter Tight', + fontWeight: FontWeight.w800, + ), + gradient: LinearGradient( + colors: [Color(0xFF3961F1), Color(0xFF11D0EA)], + ), ), ], ), @@ -518,23 +934,52 @@ class CategoryView extends StatelessWidget { const SizedBox(height: 10), GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 5 / 6), - itemCount: controller.vendorCategoryModel.length >= 8 ? 8 : controller.vendorCategoryModel.length, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 5 / 6, + ), + itemCount: + controller.vendorCategoryModel.length >= 8 + ? 8 + : controller.vendorCategoryModel.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": false}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": false, + }, + ); }, child: Column( children: [ - ClipOval(child: SizedBox(width: 60, height: 60, child: NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), fit: BoxFit.cover))), + ClipOval( + child: SizedBox( + width: 60, + height: 60, + child: NetworkImageWidget( + imageUrl: vendorCategoryModel.photo.toString(), + fit: BoxFit.cover, + ), + ), + ), Text( "${vendorCategoryModel.title}", textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 12, + ), ), ], ), @@ -558,7 +1003,10 @@ class OfferView extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Column( @@ -572,26 +1020,55 @@ class OfferView extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text("Large Discounts".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded( + child: Text( + "Large Discounts".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 18, + ), + ), + ), InkWell( onTap: () { Get.to( const DiscountRestaurantListScreen(), - arguments: {"vendorList": controller.couponRestaurantList, "couponList": controller.couponList, "title": "Discounts Restaurants"}, + arguments: { + "vendorList": controller.couponRestaurantList, + "couponList": controller.couponList, + "title": "Discounts Restaurants", + }, ); }, child: Text( "See all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 14, + ), ), ), ], ), GradientText( 'Save Upto 50% Off'.tr(), - style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), - gradient: LinearGradient(colors: [Color(0xFF39F1C5), Color(0xFF97EA11)]), + style: TextStyle( + fontSize: 24, + fontFamily: 'Inter Tight', + fontWeight: FontWeight.w800, + ), + gradient: LinearGradient( + colors: [Color(0xFF39F1C5), Color(0xFF97EA11)], + ), ), ], ), @@ -604,47 +1081,82 @@ class OfferView extends StatelessWidget { shrinkWrap: true, scrollDirection: Axis.horizontal, physics: const BouncingScrollPhysics(), - itemCount: controller.couponRestaurantList.length >= 15 ? 15 : controller.couponRestaurantList.length, + itemCount: + controller.couponRestaurantList.length >= 15 + ? 15 + : controller.couponRestaurantList.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.couponRestaurantList[index]; + VendorModel vendorModel = + controller.couponRestaurantList[index]; CouponModel offerModel = controller.couponList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(right: 10), child: SizedBox( width: Responsive.width(34, context), child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), Align( alignment: Alignment.bottomCenter, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Text( vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), const SizedBox(height: 5), RoundedButtonFill( title: "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr() : "off".tr()}", - color: Colors.primaries[Random().nextInt(Colors.primaries.length)], + color: + Colors.primaries[Random().nextInt( + Colors.primaries.length, + )], textColor: AppThemeData.grey50, width: 20, height: 3.5, @@ -696,17 +1208,30 @@ class BannerView extends StatelessWidget { onTap: () async { if (bannerModel.redirect_type == "store") { ShowToastDialog.showLoader("Please wait...".tr()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(bannerModel.redirect_id.toString()); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + bannerModel.redirect_id.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "product") { ShowToastDialog.showLoader("Please wait...".tr()); - ProductModel? productModel = await FireStoreUtils.getProductById(bannerModel.redirect_id.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel!.vendorID.toString()); + ProductModel? productModel = + await FireStoreUtils.getProductById( + bannerModel.redirect_id.toString(), + ); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + productModel!.vendorID.toString(), + ); ShowToastDialog.closeLoader(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); } else if (bannerModel.redirect_type == "external_link") { final uri = Uri.parse(bannerModel.redirect_id.toString()); if (await canLaunchUrl(uri)) { @@ -718,7 +1243,13 @@ class BannerView extends StatelessWidget { }, child: Padding( padding: const EdgeInsets.only(right: 14), - child: ClipRRect(borderRadius: const BorderRadius.all(Radius.circular(12)), child: NetworkImageWidget(imageUrl: bannerModel.photo.toString(), fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: NetworkImageWidget( + imageUrl: bannerModel.photo.toString(), + fit: BoxFit.cover, + ), + ), ), ); }, @@ -738,7 +1269,13 @@ class StoryView extends StatelessWidget { final isDark = themeController.isDark.value; return Container( height: Responsive.height(32, context), - decoration: const BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(20)), image: DecorationImage(image: AssetImage("assets/images/story_bg.png"), fit: BoxFit.cover)), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20)), + image: DecorationImage( + image: AssetImage("assets/images/story_bg.png"), + fit: BoxFit.cover, + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -747,11 +1284,33 @@ class StoryView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row(children: [Expanded(child: Text("Stories".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 18)))]), + Row( + children: [ + Expanded( + child: Text( + "Stories".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 18, + ), + ), + ), + ], + ), GradientText( 'Best Food Stories Ever'.tr(), - style: TextStyle(fontSize: 24, fontFamily: 'Inter Tight', fontWeight: FontWeight.w800), - gradient: LinearGradient(colors: [Color(0xFFF1C839), Color(0xFFEA1111)]), + style: TextStyle( + fontSize: 24, + fontFamily: 'Inter Tight', + fontWeight: FontWeight.w800, + ), + gradient: LinearGradient( + colors: [Color(0xFFF1C839), Color(0xFFEA1111)], + ), ), ], ), @@ -769,56 +1328,116 @@ class StoryView extends StatelessWidget { padding: const EdgeInsets.only(right: 10), child: InkWell( onTap: () { - Navigator.of(context).push(MaterialPageRoute(builder: (context) => MoreStories(storyList: controller.storyList, index: index))); + Navigator.of(context).push( + MaterialPageRoute( + builder: + (context) => MoreStories( + storyList: controller.storyList, + index: index, + ), + ), + ); }, child: SizedBox( width: 134, child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: storyModel.videoThumbnail.toString(), fit: BoxFit.cover, height: Responsive.height(100, context), width: Responsive.width(100, context)), + NetworkImageWidget( + imageUrl: storyModel.videoThumbnail.toString(), + fit: BoxFit.cover, + height: Responsive.height(100, context), + width: Responsive.width(100, context), + ), Container(color: Colors.black.withOpacity(0.30)), Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 8, + ), child: FutureBuilder( - future: FireStoreUtils.getVendorById(storyModel.vendorID.toString()), + future: FireStoreUtils.getVendorById( + storyModel.vendorID.toString(), + ), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return Constant.loader(); } else { if (snapshot.hasError) { - return Center(child: Text('${"Error".tr()}: ${snapshot.error}')); + return Center( + child: Text( + '${"Error".tr()}: ${snapshot.error}', + ), + ); } else if (snapshot.data == null) { return const SizedBox(); } else { - VendorModel vendorModel = snapshot.data!; + VendorModel vendorModel = + snapshot.data!; return Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - ClipOval(child: NetworkImageWidget(imageUrl: vendorModel.photo.toString(), width: 30, height: 30, fit: BoxFit.cover)), + ClipOval( + child: NetworkImageWidget( + imageUrl: + vendorModel.photo + .toString(), + width: 30, + height: 30, + fit: BoxFit.cover, + ), + ), const SizedBox(width: 4), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - vendorModel.title.toString(), + vendorModel.title + .toString(), textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: Colors.white, fontSize: 12, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: Colors.white, + fontSize: 12, + overflow: + TextOverflow.ellipsis, + fontWeight: + FontWeight.w700, + ), ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg"), + SvgPicture.asset( + "assets/icons/ic_star.svg", + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum!.toStringAsFixed(0))} ${'reviews'.tr()}", - textAlign: TextAlign.center, + textAlign: + TextAlign.center, maxLines: 1, - style: const TextStyle(color: AppThemeData.warning300, fontSize: 10, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: + AppThemeData + .warning300, + fontSize: 10, + overflow: + TextOverflow + .ellipsis, + fontWeight: + FontWeight.w700, + ), ), ], ), @@ -870,15 +1489,38 @@ class RestaurantView extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), child: Row( children: [ - Expanded(child: Text("Best Restaurants".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18))), + Expanded( + child: Text( + "Best Restaurants".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontSize: 18, + ), + ), + ), InkWell( onTap: () { - Get.to(const RestaurantListScreen(), arguments: {"vendorList": controller.allNearestRestaurant, "title": "Best Restaurants"}); + Get.to( + const RestaurantListScreen(), + arguments: { + "vendorList": controller.allNearestRestaurant, + "title": "Best Restaurants", + }, + ); }, child: Text( "See all".tr(), textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 14), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontSize: 14, + ), ), ), ], @@ -894,36 +1536,65 @@ class RestaurantView extends StatelessWidget { scrollDirection: Axis.vertical, itemCount: controller.allNearestRestaurant.length, itemBuilder: (BuildContext context, int index) { - VendorModel vendorModel = controller.allNearestRestaurant[index]; + VendorModel vendorModel = + controller.allNearestRestaurant[index]; List tempList = []; List discountAmountTempList = []; for (var element in controller.couponList) { - if (vendorModel.id == element.vendorID && element.expiresAt!.toDate().isAfter(DateTime.now())) { + if (vendorModel.id == element.vendorID && + element.expiresAt!.toDate().isAfter(DateTime.now())) { tempList.add(element); - discountAmountTempList.add(double.parse(element.discount.toString())); + discountAmountTempList.add( + double.parse(element.discount.toString()), + ); } } return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(height: Responsive.height(14, context), width: Responsive.width(30, context), imageUrl: vendorModel.photo.toString(), fit: BoxFit.cover), + NetworkImageWidget( + height: Responsive.height(14, context), + width: Responsive.width(30, context), + imageUrl: vendorModel.photo.toString(), + fit: BoxFit.cover, + ), Container( height: Responsive.height(14, context), width: Responsive.width(30, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), discountAmountTempList.isEmpty @@ -933,31 +1604,47 @@ class RestaurantView extends StatelessWidget { left: 0, right: 0, child: Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only( + bottom: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Text( "Upto".tr(), textAlign: TextAlign.center, maxLines: 1, style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.regular, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.regular, fontWeight: FontWeight.w900, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, ), ), Text( - discountAmountTempList.reduce(min).toString() + "% OFF".tr(), + discountAmountTempList + .reduce(min) + .toString() + + "% OFF".tr(), textAlign: TextAlign.center, maxLines: 1, style: TextStyle( fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, ), ), ], @@ -977,7 +1664,15 @@ class RestaurantView extends StatelessWidget { vendorModel.title.toString(), textAlign: TextAlign.start, maxLines: 1, - style: TextStyle(fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( vendorModel.location.toString(), @@ -987,7 +1682,10 @@ class RestaurantView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), const SizedBox(height: 5), @@ -996,18 +1694,31 @@ class RestaurantView extends StatelessWidget { child: Row( children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg", width: 18), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + width: 18, + ), const SizedBox(width: 5), Text( "Free Delivery".tr(), style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, ), ), const SizedBox(width: 10), @@ -1017,8 +1728,18 @@ class RestaurantView extends StatelessWidget { Row( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: SvgPicture.asset("assets/icons/ic_star.svg", width: 18, colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), + child: SvgPicture.asset( + "assets/icons/ic_star.svg", + width: 18, + colorFilter: ColorFilter.mode( + AppThemeData.primary300, + BlendMode.srcIn, + ), + ), ), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", @@ -1028,7 +1749,10 @@ class RestaurantView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], @@ -1036,8 +1760,18 @@ class RestaurantView extends StatelessWidget { Row( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", @@ -1047,7 +1781,10 @@ class RestaurantView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart index d6282a4..0b80cd0 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart @@ -8,8 +8,7 @@ import 'package:easy_localization/easy_localization.dart'; import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -26,13 +25,18 @@ class RestaurantListScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( controller.title.value, textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), body: @@ -44,35 +48,64 @@ class RestaurantListScreen extends StatelessWidget { shrinkWrap: true, itemCount: controller.vendorSearchList.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.vendorSearchList[index]; + VendorModel vendorModel = + controller.vendorSearchList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel})?.then((v) { + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + )?.then((v) { controller.getFavouriteRestaurant(); }); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), + begin: const Alignment( + -0.00, + -1.00, + ), end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], ), ), ), @@ -81,21 +114,60 @@ class RestaurantListScreen extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == vendorModel.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel.id, + ) + .isNotEmpty) { + FavouriteModel + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList + .removeWhere( + (item) => + item.restaurantId == + vendorModel.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: vendorModel.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + FavouriteModel + favouriteModel = FavouriteModel( + restaurantId: + vendorModel.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList + .add(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == vendorModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + vendorModel + .id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), @@ -103,28 +175,60 @@ class RestaurantListScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height(17.5, context), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData + .success300, + borderRadius: + BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: 5, + ), Text( "Free Delivery".tr(), - style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 14, + color: + AppThemeData + .carRent600, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -134,22 +238,51 @@ class RestaurantListScreen extends StatelessWidget { ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -157,22 +290,51 @@ class RestaurantListScreen extends StatelessWidget { ), const SizedBox(width: 6), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce600 + : AppThemeData + .ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .ecommerce300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -185,9 +347,12 @@ class RestaurantListScreen extends StatelessWidget { ), const SizedBox(height: 15), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), @@ -197,7 +362,10 @@ class RestaurantListScreen extends StatelessWidget { fontSize: 18, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), Text( @@ -208,7 +376,10 @@ class RestaurantListScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey400, ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart index 5536d29..6850c56 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/story_view/utils.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../widget/story_view/widgets/story_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -71,9 +71,15 @@ class MoreStoriesState extends State { StoryView( key: ValueKey(widget.index), storyItems: - List.generate(widget.storyList[widget.index].videoUrl.length, (i) { - return StoryItem.pageVideo(widget.storyList[widget.index].videoUrl[i], controller: storyController); - }).toList(), + List.generate( + widget.storyList[widget.index].videoUrl.length, + (i) { + return StoryItem.pageVideo( + widget.storyList[widget.index].videoUrl[i], + controller: storyController, + ); + }, + ).toList(), onComplete: () { debugPrint("--------->"); debugPrint(widget.storyList.length.toString()); @@ -96,15 +102,23 @@ class MoreStoriesState extends State { }, ), Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top + 30, left: 16, right: 16), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top + 30, + left: 16, + right: 16, + ), child: FutureBuilder( - future: FireStoreUtils.getVendorById(widget.storyList[widget.index].vendorID.toString()), + future: FireStoreUtils.getVendorById( + widget.storyList[widget.index].vendorID.toString(), + ), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return SizedBox(); } else { if (snapshot.hasError) { - return Center(child: Text('${"Error".tr()}: ${snapshot.error}')); + return Center( + child: Text('${"Error".tr()}: ${snapshot.error}'), + ); return Center(child: Text('Error: ${snapshot.error}')); } else if (snapshot.data == null) { return const SizedBox(); @@ -112,13 +126,23 @@ class MoreStoriesState extends State { VendorModel vendorModel = snapshot.data!; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipOval(child: NetworkImageWidget(imageUrl: vendorModel.photo.toString(), width: 50, height: 50, fit: BoxFit.cover)), + ClipOval( + child: NetworkImageWidget( + imageUrl: vendorModel.photo.toString(), + width: 50, + height: 50, + fit: BoxFit.cover, + ), + ), const SizedBox(width: 10), Expanded( child: Column( @@ -129,17 +153,29 @@ class MoreStoriesState extends State { vendorModel.title.toString(), textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: Colors.white, fontSize: 16, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: Colors.white, + fontSize: 16, + overflow: TextOverflow.ellipsis, + fontWeight: FontWeight.w700, + ), ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg"), + SvgPicture.asset( + "assets/icons/ic_star.svg", + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} ${'reviews'.tr()}", textAlign: TextAlign.center, maxLines: 1, - style: const TextStyle(color: AppThemeData.warning300, fontSize: 12, overflow: TextOverflow.ellipsis, fontWeight: FontWeight.w700), + style: const TextStyle( + color: AppThemeData.warning300, + fontSize: 12, + overflow: TextOverflow.ellipsis, + fontWeight: FontWeight.w700, + ), ), ], ), @@ -152,8 +188,17 @@ class MoreStoriesState extends State { }, child: Container( padding: const EdgeInsets.all(10.0), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: Colors.grey), - child: SvgPicture.asset("assets/icons/ic_close.svg", colorFilter: ColorFilter.mode(AppThemeData.grey800, BlendMode.srcIn)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: Colors.grey, + ), + child: SvgPicture.asset( + "assets/icons/ic_close.svg", + colorFilter: ColorFilter.mode( + AppThemeData.grey800, + BlendMode.srcIn, + ), + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart index 06b516e..665f863 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import 'category_restaurant_screen.dart'; @@ -22,10 +21,19 @@ class ViewAllCategoryScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Categories".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text( + "Categories".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: controller.isLoading.value @@ -34,38 +42,84 @@ class ViewAllCategoryScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16), child: GridView.builder( padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 3.5 / 6, crossAxisSpacing: 6), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 3.5 / 6, + crossAxisSpacing: 6, + ), itemCount: controller.vendorCategoryModel.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryModel[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryModel[index]; return InkWell( onTap: () { - Get.to(const CategoryRestaurantScreen(), arguments: {"vendorCategoryModel": vendorCategoryModel, "dineIn": false}); + Get.to( + const CategoryRestaurantScreen(), + arguments: { + "vendorCategoryModel": vendorCategoryModel, + "dineIn": false, + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 6, + ), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, strokeAlign: BorderSide.strokeAlignOutside, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), + side: BorderSide( + width: 1, + strokeAlign: BorderSide.strokeAlignOutside, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, + ), borderRadius: BorderRadius.circular(100), ), ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox(width: 60, height: 60, child: ClipOval(child: NetworkImageWidget(imageUrl: vendorCategoryModel.photo.toString(), fit: BoxFit.cover))), + SizedBox( + width: 60, + height: 60, + child: ClipOval( + child: NetworkImageWidget( + imageUrl: + vendorCategoryModel.photo + .toString(), + fit: BoxFit.cover, + ), + ), + ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Text( '${vendorCategoryModel.title}', textAlign: TextAlign.center, maxLines: 2, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 12), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 12, + ), ), ), ], diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart index 9bf1d32..7c561fd 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart @@ -4,7 +4,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap; import '../../../controllers/theme_controller.dart'; @@ -24,17 +24,44 @@ class LiveTrackingScreen extends StatelessWidget { } return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text("Live Tracking".tr()), centerTitle: false), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text("Live Tracking".tr()), + centerTitle: false, + ), body: Constant.selectedMapType == 'osm' ? flutterMap.FlutterMap( mapController: controller.osmMapController, - options: flutterMap.MapOptions(initialCenter: controller.driverCurrent.value, initialZoom: 14), + options: flutterMap.MapOptions( + initialCenter: controller.driverCurrent.value, + initialZoom: 14, + ), children: [ - flutterMap.TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'felix.fondex.uz'), - if (controller.routePoints.isNotEmpty) flutterMap.PolylineLayer(polylines: [flutterMap.Polyline(points: controller.routePoints, strokeWidth: 5.0, color: Colors.blue)]), - flutterMap.MarkerLayer(markers: controller.orderModel.value.id == null ? [] : controller.osmMarkers), + flutterMap.TileLayer( + urlTemplate: + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'felix.fondex.uz', + ), + if (controller.routePoints.isNotEmpty) + flutterMap.PolylineLayer( + polylines: [ + flutterMap.Polyline( + points: controller.routePoints, + strokeWidth: 5.0, + color: Colors.blue, + ), + ], + ), + flutterMap.MarkerLayer( + markers: + controller.orderModel.value.id == null + ? [] + : controller.osmMarkers, + ), ], ) : gmap.GoogleMap( @@ -43,11 +70,18 @@ class LiveTrackingScreen extends StatelessWidget { }, myLocationEnabled: true, zoomControlsEnabled: false, - polylines: Set.of(controller.polyLines.values), + polylines: Set.of( + controller.polyLines.values, + ), markers: Set.of(controller.markers.values), initialCameraPosition: gmap.CameraPosition( zoom: 14, - target: gmap.LatLng(controller.driverUserModel.value.location?.latitude ?? 0.0, controller.driverUserModel.value.location?.longitude ?? 0.0), + target: gmap.LatLng( + controller.driverUserModel.value.location?.latitude ?? + 0.0, + controller.driverUserModel.value.location?.longitude ?? + 0.0, + ), ), ), ); diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart index ead2ca4..d322880 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart @@ -11,7 +11,7 @@ import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:timelines_plus/timelines_plus.dart'; import '../../../controllers/theme_controller.dart'; @@ -33,12 +33,22 @@ class OrderDetailsScreen extends StatelessWidget { init: OrderDetailsController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Order Details".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Order Details".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: controller.isLoading.value @@ -57,19 +67,38 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Order'.tr()} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}".tr(), + "${'Order'.tr()} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}" + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), ), RoundedButtonFill( - title: controller.orderModel.value.status.toString().tr(), - color: Constant.statusColor(status: controller.orderModel.value.status.toString()), + title: + controller.orderModel.value.status + .toString() + .tr(), + color: Constant.statusColor( + status: + controller.orderModel.value.status + .toString(), + ), width: 32, height: 4.5, - textColor: Constant.statusText(status: controller.orderModel.value.status.toString()), + textColor: Constant.statusText( + status: + controller.orderModel.value.status + .toString(), + ), onPress: () async {}, ), ], @@ -77,73 +106,177 @@ class OrderDetailsScreen extends StatelessWidget { const SizedBox(height: 14), controller.orderModel.value.takeAway == true ? Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${controller.orderModel.value.vendor!.title}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), Text( "${controller.orderModel.value.vendor!.location}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + ), ), ], ), ), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + controller.orderModel.value.status == + Constant.orderPlaced || + controller + .orderModel + .value + .status == + Constant.orderRejected || + controller + .orderModel + .value + .status == + Constant.orderCompleted ? const SizedBox() : InkWell( onTap: () { - Constant.makePhoneCall(controller.orderModel.value.vendor!.phonenumber.toString()); + Constant.makePhoneCall( + controller + .orderModel + .value + .vendor! + .phonenumber + .toString(), + ); }, child: Container( width: 42, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + controller.orderModel.value.status == + Constant.orderPlaced || + controller + .orderModel + .value + .status == + Constant.orderRejected || + controller + .orderModel + .value + .status == + Constant.orderCompleted ? const SizedBox() : InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.vendor!.author.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(restaurantUser!.vendorID.toString()); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .authorID + .toString(), + ); + UserModel? restaurantUser = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .vendor! + .author + .toString(), + ); + VendorModel? vendorModel = + await FireStoreUtils.getVendorById( + restaurantUser!.vendorID + .toString(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer!.fullName(), - "restaurantName": vendorModel!.title, - "orderId": controller.orderModel.value.id, - "restaurantId": restaurantUser.id, + "customerName": + customer!.fullName(), + "restaurantName": + vendorModel!.title, + "orderId": + controller + .orderModel + .value + .id, + "restaurantId": + restaurantUser.id, "customerId": customer.id, - "customerProfileImage": customer.profilePictureURL, - "restaurantProfileImage": vendorModel.photo, - "token": restaurantUser.fcmToken, + "customerProfileImage": + customer + .profilePictureURL, + "restaurantProfileImage": + vendorModel.photo, + "token": + restaurantUser.fcmToken, "chatType": "restaurant", }, ); @@ -153,11 +286,29 @@ class OrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -165,15 +316,26 @@ class OrderDetailsScreen extends StatelessWidget { ), ) : Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( children: [ Timeline.tileBuilder( shrinkWrap: true, padding: EdgeInsets.zero, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), theme: TimelineThemeData( nodePosition: 0, // indicatorPosition: 0, @@ -181,81 +343,219 @@ class OrderDetailsScreen extends StatelessWidget { builder: TimelineTileBuilder.connected( contentsAlign: ContentsAlign.basic, indicatorBuilder: (context, index) { - return SvgPicture.asset("assets/icons/ic_location.svg"); + return SvgPicture.asset( + "assets/icons/ic_location.svg", + ); }, - connectorBuilder: (context, index, connectorType) { - return const DashedLineConnector(color: AppThemeData.grey300, gap: 3); + connectorBuilder: ( + context, + index, + connectorType, + ) { + return const DashedLineConnector( + color: AppThemeData.grey300, + gap: 3, + ); }, contentsBuilder: (context, index) { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: index == 0 ? Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "${controller.orderModel.value.vendor!.title}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: + 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), Text( "${controller.orderModel.value.vendor!.location}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: + 14, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + ), ), ], ), ), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + controller + .orderModel + .value + .status == + Constant + .orderPlaced || + controller + .orderModel + .value + .status == + Constant + .orderRejected || + controller + .orderModel + .value + .status == + Constant + .orderCompleted ? const SizedBox() : InkWell( onTap: () { - Constant.makePhoneCall(controller.orderModel.value.vendor!.phonenumber.toString()); + Constant.makePhoneCall( + controller + .orderModel + .value + .vendor! + .phonenumber + .toString(), + ); }, child: Container( width: 42, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: + 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), - const SizedBox(width: 10), - controller.orderModel.value.status == Constant.orderPlaced || - controller.orderModel.value.status == Constant.orderRejected || - controller.orderModel.value.status == Constant.orderCompleted + const SizedBox( + width: 10, + ), + controller + .orderModel + .value + .status == + Constant + .orderPlaced || + controller + .orderModel + .value + .status == + Constant + .orderRejected || + controller + .orderModel + .value + .status == + Constant + .orderCompleted ? const SizedBox() : InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait..." + .tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.vendor!.author.toString()); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(restaurantUser!.vendorID.toString()); + UserModel? + customer = await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .authorID + .toString(), + ); + UserModel? + restaurantUser = await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .vendor! + .author + .toString(), + ); + VendorModel? + vendorModel = await FireStoreUtils.getVendorById( + restaurantUser! + .vendorID + .toString(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer!.fullName(), - "restaurantName": vendorModel!.title, - "orderId": controller.orderModel.value.id, - "restaurantId": restaurantUser.id, - "customerId": customer.id, - "customerProfileImage": customer.profilePictureURL, - "restaurantProfileImage": vendorModel.photo, - "token": restaurantUser.fcmToken, - "chatType": "restaurant", + "customerName": + customer! + .fullName(), + "restaurantName": + vendorModel! + .title, + "orderId": + controller + .orderModel + .value + .id, + "restaurantId": + restaurantUser + .id, + "customerId": + customer + .id, + "customerProfileImage": + customer + .profilePictureURL, + "restaurantProfileImage": + vendorModel + .photo, + "token": + restaurantUser + .fcmToken, + "chatType": + "restaurant", }, ); }, @@ -264,27 +564,75 @@ class OrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: + 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], ) : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "${controller.orderModel.value.address!.addressAs}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), Text( - controller.orderModel.value.address!.getFullAddress(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600), + controller + .orderModel + .value + .address! + .getFullAddress(), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + ), ), ], ), @@ -293,93 +641,215 @@ class OrderDetailsScreen extends StatelessWidget { itemCount: 2, ), ), - controller.orderModel.value.status == Constant.orderRejected + controller.orderModel.value.status == + Constant.orderRejected ? const SizedBox() : Column( children: [ - Padding(padding: const EdgeInsets.symmetric(vertical: 10), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), - controller.orderModel.value.status == Constant.orderCompleted && controller.orderModel.value.driver != null + Padding( + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData + .grey200, + ), + ), + controller + .orderModel + .value + .status == + Constant + .orderCompleted && + controller + .orderModel + .value + .driver != + null ? Row( children: [ - SvgPicture.asset("assets/icons/ic_check_small.svg"), + SvgPicture.asset( + "assets/icons/ic_check_small.svg", + ), const SizedBox(width: 5), Text( - controller.orderModel.value.driver!.fullName(), - textAlign: TextAlign.right, + controller + .orderModel + .value + .driver! + .fullName(), + textAlign: + TextAlign.right, style: TextStyle( - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w500, fontSize: 14, ), ), const SizedBox(width: 5), Text( "Order Delivered.".tr(), - textAlign: TextAlign.right, + textAlign: + TextAlign.right, style: TextStyle( - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight.w500, fontSize: 14, ), ), ], ) - : controller.orderModel.value.status == Constant.orderAccepted || controller.orderModel.value.status == Constant.driverPending + : controller + .orderModel + .value + .status == + Constant + .orderAccepted || + controller + .orderModel + .value + .status == + Constant.driverPending ? Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ - SvgPicture.asset("assets/icons/ic_timer.svg"), + SvgPicture.asset( + "assets/icons/ic_timer.svg", + ), const SizedBox(width: 5), Expanded( child: Text( "${'Your Order has been Preparing and assign to the driver'.tr()}\n${'Preparation Time'.tr()} ${controller.orderModel.value.estimatedTimeToPrepare}" .tr(), - textAlign: TextAlign.start, + textAlign: + TextAlign.start, style: TextStyle( - color: isDark ? AppThemeData.warning400 : AppThemeData.warning400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .warning400 + : AppThemeData + .warning400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w500, fontSize: 14, ), ), ), ], ) - : controller.orderModel.value.driver != null + : controller + .orderModel + .value + .driver != + null ? Row( children: [ ClipOval( child: NetworkImageWidget( - imageUrl: controller.orderModel.value.author!.profilePictureURL.toString(), + imageUrl: + controller + .orderModel + .value + .author! + .profilePictureURL + .toString(), fit: BoxFit.cover, - height: Responsive.height(5, context), - width: Responsive.width(10, context), + height: + Responsive.height( + 5, + context, + ), + width: + Responsive.width( + 10, + context, + ), ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - controller.orderModel.value.driver!.fullName().toString(), - textAlign: TextAlign.start, + controller + .orderModel + .value + .driver! + .fullName() + .toString(), + textAlign: + TextAlign + .start, style: TextStyle( - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, fontSize: 16, ), ), Text( - controller.orderModel.value.driver!.email.toString(), - textAlign: TextAlign.start, + controller + .orderModel + .value + .driver! + .email + .toString(), + textAlign: + TextAlign + .start, style: TextStyle( - color: isDark ? AppThemeData.success400 : AppThemeData.success400, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData + .success400 + : AppThemeData + .success400, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight + .w400, fontSize: 12, ), ), @@ -388,42 +858,104 @@ class OrderDetailsScreen extends StatelessWidget { ), InkWell( onTap: () { - Constant.makePhoneCall(controller.orderModel.value.driver!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .orderModel + .value + .driver! + .phoneNumber + .toString(), + ); }, child: Container( width: 42, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait..." + .tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.orderModel.value.authorID.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(controller.orderModel.value.driverID.toString()); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .authorID + .toString(), + ); + UserModel? + restaurantUser = + await FireStoreUtils.getUserProfile( + controller + .orderModel + .value + .driverID + .toString(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer!.fullName(), - "restaurantName": restaurantUser!.fullName(), - "orderId": controller.orderModel.value.id, - "restaurantId": restaurantUser.id, - "customerId": customer.id, - "customerProfileImage": customer.profilePictureURL, - "restaurantProfileImage": restaurantUser.profilePictureURL, - "token": restaurantUser.fcmToken, - "chatType": "Driver", + "customerName": + customer! + .fullName(), + "restaurantName": + restaurantUser! + .fullName(), + "orderId": + controller + .orderModel + .value + .id, + "restaurantId": + restaurantUser + .id, + "customerId": + customer.id, + "customerProfileImage": + customer + .profilePictureURL, + "restaurantProfileImage": + restaurantUser + .profilePictureURL, + "token": + restaurantUser + .fcmToken, + "chatType": + "Driver", }, ); }, @@ -432,11 +964,30 @@ class OrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -453,44 +1004,100 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Your Order".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.separated( shrinkWrap: true, padding: EdgeInsets.zero, - itemCount: controller.orderModel.value.products!.length, + itemCount: + controller + .orderModel + .value + .products! + .length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - CartProductModel cartProductModel = controller.orderModel.value.products![index]; + CartProductModel cartProductModel = + controller + .orderModel + .value + .products![index]; return Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(14)), + borderRadius: + const BorderRadius.all( + Radius.circular(14), + ), child: Stack( children: [ NetworkImageWidget( - imageUrl: cartProductModel.photo.toString(), - height: Responsive.height(8, context), - width: Responsive.width(16, context), + imageUrl: + cartProductModel.photo + .toString(), + height: Responsive.height( + 8, + context, + ), + width: Responsive.width( + 16, + context, + ), fit: BoxFit.cover, ), Container( - height: Responsive.height(8, context), - width: Responsive.width(16, context), + height: Responsive.height( + 8, + context, + ), + width: Responsive.width( + 16, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black + .withOpacity(0), + const Color(0xFF111827), + ], ), ), ), @@ -500,69 +1107,173 @@ class OrderDetailsScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( "${cartProductModel.name}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ), Text( "x ${cartProductModel.quantity}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .regular, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), - double.parse(cartProductModel.discountPrice == null || cartProductModel.discountPrice!.isEmpty ? "0.0" : cartProductModel.discountPrice.toString()) <= 0 + double.parse( + cartProductModel.discountPrice == + null || + cartProductModel + .discountPrice! + .isEmpty + ? "0.0" + : cartProductModel + .discountPrice + .toString(), + ) <= + 0 ? Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: cartProductModel.discountPrice.toString()), + Constant.amountShow( + amount: + cartProductModel + .discountPrice + .toString(), + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: 5, + ), Text( - Constant.amountShow(amount: cartProductModel.price), + Constant.amountShow( + amount: + cartProductModel + .price, + ), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + decoration: + TextDecoration + .lineThrough, + decorationColor: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], ), Align( - alignment: Alignment.centerRight, + alignment: + Alignment.centerRight, child: RoundedButtonFill( title: "Rate us".tr(), height: 3.8, width: 20, - color: isDark ? AppThemeData.warning300 : AppThemeData.warning300, - textColor: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData + .warning300 + : AppThemeData + .warning300, + textColor: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, onPress: () async { - Get.to(const RateProductScreen(), arguments: {"orderModel": controller.orderModel.value, "productId": cartProductModel.id}); + Get.to( + const RateProductScreen(), + arguments: { + "orderModel": + controller + .orderModel + .value, + "productId": + cartProductModel + .id, + }, + ); }, ), ), @@ -571,63 +1282,149 @@ class OrderDetailsScreen extends StatelessWidget { ), ], ), - cartProductModel.variantInfo == null || cartProductModel.variantInfo!.variantOptions!.isEmpty + cartProductModel.variantInfo == null || + cartProductModel + .variantInfo! + .variantOptions! + .isEmpty ? Container() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Variants".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), const SizedBox(height: 5), Wrap( spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.variantInfo!.variantOptions!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .variantInfo! + .variantOptions! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: 5, + ), + child: Text( + "${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}", + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), ), - cartProductModel.extras == null || cartProductModel.extras!.isEmpty + cartProductModel.extras == null || + cartProductModel.extras!.isEmpty ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( "Addons".tr(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + textAlign: + TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData + .semiBold, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( Constant.amountShow( - amount: (double.parse(cartProductModel.extrasPrice.toString()) * double.parse(cartProductModel.quantity.toString())).toString(), + amount: + (double.parse( + cartProductModel + .extrasPrice + .toString(), + ) * + double.parse( + cartProductModel + .quantity + .toString(), + )) + .toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontSize: 16, + ), ), ], ), @@ -635,22 +1432,56 @@ class OrderDetailsScreen extends StatelessWidget { spacing: 6.0, runSpacing: 6.0, children: - List.generate(cartProductModel.extras!.length, (i) { - return Container( - decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), - child: Text( - cartProductModel.extras![i].toString(), - textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.grey500 : AppThemeData.grey400), + List.generate( + cartProductModel + .extras! + .length, + (i) { + return Container( + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 8, + ), + ), ), - ), - ); - }).toList(), + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: + 16, + vertical: 5, + ), + child: Text( + cartProductModel + .extras![i] + .toString(), + textAlign: + TextAlign + .start, + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + ), + ), + ), + ); + }, + ).toList(), ), ], ), @@ -658,7 +1489,17 @@ class OrderDetailsScreen extends StatelessWidget { ); }, separatorBuilder: (context, index) { - return Padding(padding: const EdgeInsets.symmetric(vertical: 10), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)); + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + ); }, ), ), @@ -692,30 +1533,67 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Bill Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Item totals".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.subTotal.value.toString()), + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -723,67 +1601,160 @@ class OrderDetailsScreen extends StatelessWidget { controller.orderModel.value.takeAway == true ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Delivery Fee".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), - (controller.orderModel.value.vendor?.isSelfDelivery == true) - ? Text('Free Delivery'.tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.regular, color: AppThemeData.success400, fontSize: 16)) + (controller + .orderModel + .value + .vendor + ?.isSelfDelivery == + true) + ? Text( + 'Free Delivery'.tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + AppThemeData.success400, + fontSize: 16, + ), + ) : Text( Constant.amountShow( amount: - controller.orderModel.value.deliveryCharge == null || controller.orderModel.value.deliveryCharge!.isEmpty + controller + .orderModel + .value + .deliveryCharge == + null || + controller + .orderModel + .value + .deliveryCharge! + .isEmpty ? "0.0" - : controller.orderModel.value.deliveryCharge.toString(), + : controller + .orderModel + .value + .deliveryCharge + .toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Coupon Discount".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.orderModel.value.discount.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.danger300 + : AppThemeData.danger300, + fontSize: 16, + ), ), ], ), - controller.orderModel.value.specialDiscount != null && controller.orderModel.value.specialDiscount!['special_discount'] != null + controller.orderModel.value.specialDiscount != + null && + controller + .orderModel + .value + .specialDiscount!['special_discount'] != + null ? Column( children: [ const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Special Discount".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( "- (${Constant.amountShow(amount: controller.specialDiscountAmount.value.toString())})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .danger300 + : AppThemeData + .danger300, + fontSize: 16, + ), ), ], ), @@ -791,50 +1762,110 @@ class OrderDetailsScreen extends StatelessWidget { ) : const SizedBox(), const SizedBox(height: 10), - controller.orderModel.value.takeAway == true || controller.orderModel.value.vendor?.isSelfDelivery == true + controller.orderModel.value.takeAway == + true || + controller + .orderModel + .value + .vendor + ?.isSelfDelivery == + true ? const SizedBox() : Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Delivery Tips".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData + .grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ], ), ), Text( - Constant.amountShow(amount: controller.orderModel.value.tipAmount.toString()), + Constant.amountShow( + amount: + controller + .orderModel + .value + .tipAmount + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 10), ListView.builder( - itemCount: controller.orderModel.value.taxSetting!.length, + itemCount: + controller + .orderModel + .value + .taxSetting! + .length, shrinkWrap: true, padding: EdgeInsets.zero, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - TaxModel taxModel = controller.orderModel.value.taxSetting![index]; + TaxModel taxModel = + controller + .orderModel + .value + .taxSetting![index]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "${taxModel.title.toString()} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData + .grey600, + fontSize: 16, + ), ), ), Text( @@ -842,13 +1873,33 @@ class OrderDetailsScreen extends StatelessWidget { amount: Constant.calculateTax( amount: - (controller.subTotal.value - double.parse(controller.orderModel.value.discount.toString()) - controller.specialDiscountAmount.value) + (controller + .subTotal + .value - + double.parse( + controller + .orderModel + .value + .discount + .toString(), + ) - + controller + .specialDiscountAmount + .value) .toString(), taxModel: taxModel, ).toString(), ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -857,19 +1908,38 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "To Pay".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.amountShow(amount: controller.totalAmount.value.toString()), + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -881,37 +1951,72 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Order Details".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Column( children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Delivery type".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - controller.orderModel.value.takeAway == true + controller.orderModel.value.takeAway == + true ? "TakeAway".tr() - : controller.orderModel.value.scheduleTime == null + : controller + .orderModel + .value + .scheduleTime == + null ? "Standard".tr() : "Schedule".tr(), textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, color: - controller.orderModel.value.scheduleTime != null + controller + .orderModel + .value + .scheduleTime != + null ? AppThemeData.primary300 : isDark ? AppThemeData.grey50 @@ -923,60 +2028,121 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Payment Method".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - controller.orderModel.value.paymentMethod.toString(), + controller + .orderModel + .value + .paymentMethod + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Text( "Date and Time".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( - Constant.timestampToDateTime(controller.orderModel.value.createdAt!), + Constant.timestampToDateTime( + controller + .orderModel + .value + .createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ], ), const SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "Phone Number".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: + AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ], ), ), Text( - controller.orderModel.value.author!.phoneNumber.toString(), + controller + .orderModel + .value + .author! + .phoneNumber + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -986,7 +2152,8 @@ class OrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(height: 20), - controller.orderModel.value.notes == null || controller.orderModel.value.notes!.isEmpty + controller.orderModel.value.notes == null || + controller.orderModel.value.notes!.isEmpty ? const SizedBox() : Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -994,18 +2161,44 @@ class OrderDetailsScreen extends StatelessWidget { Text( "Remarks".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 14, + ), child: Text( - controller.orderModel.value.notes.toString(), + controller.orderModel.value.notes + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ), ), @@ -1017,22 +2210,35 @@ class OrderDetailsScreen extends StatelessWidget { ), bottomNavigationBar: controller.orderModel.value.status == Constant.orderShipped || - controller.orderModel.value.status == Constant.orderInTransit || - controller.orderModel.value.status == Constant.orderCompleted + controller.orderModel.value.status == + Constant.orderInTransit || + controller.orderModel.value.status == + Constant.orderCompleted ? Container( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Padding( padding: const EdgeInsets.only(bottom: 20), child: - controller.orderModel.value.status == Constant.orderShipped || controller.orderModel.value.status == Constant.orderInTransit + controller.orderModel.value.status == + Constant.orderShipped || + controller.orderModel.value.status == + Constant.orderInTransit ? RoundedButtonFill( title: "Track Order".tr(), height: 5.5, color: AppThemeData.warning300, textColor: AppThemeData.grey900, onPress: () async { - Get.to(const LiveTrackingScreen(), arguments: {"orderModel": controller.orderModel.value}); + Get.to( + const LiveTrackingScreen(), + arguments: { + "orderModel": controller.orderModel.value, + }, + ); }, ) : RoundedButtonFill( @@ -1041,9 +2247,17 @@ class OrderDetailsScreen extends StatelessWidget { color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { - for (var element in controller.orderModel.value.products!) { - controller.addToCart(cartProductModel: element); - ShowToastDialog.showToast("Item Added In a cart".tr()); + for (var element + in controller + .orderModel + .value + .products!) { + controller.addToCart( + cartProductModel: element, + ); + ShowToastDialog.showToast( + "Item Added In a cart".tr(), + ); } }, ), diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart index 871c7c4..5853553 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import '../../../widget/my_separator.dart'; @@ -28,7 +28,9 @@ class OrderScreen extends StatelessWidget { builder: (controller) { return Scaffold( body: Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: controller.isLoading.value ? Constant.loader() @@ -41,12 +43,30 @@ class OrderScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -72,15 +92,32 @@ class OrderScreen extends StatelessWidget { children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "My Order".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Keep track your delivered, In Progress and Rejected item all in just one place.".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Keep track your delivered, In Progress and Rejected item all in just one place." + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ), @@ -91,26 +128,51 @@ class OrderScreen extends StatelessWidget { const SizedBox(height: 10), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( children: [ Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 10), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120))), + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 10, + ), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 120, + ), + ), + ), child: TabBar( indicator: BoxDecoration( - borderRadius: BorderRadius.circular(50), // Creates border + borderRadius: BorderRadius.circular( + 50, + ), // Creates border color: AppThemeData.primary300, ), labelColor: AppThemeData.grey50, isScrollable: true, tabAlignment: TabAlignment.start, indicatorWeight: 0.5, - unselectedLabelColor: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + unselectedLabelColor: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, dividerColor: Colors.transparent, indicatorSize: TabBarIndicatorSize.tab, tabs: [ - Padding(padding: const EdgeInsets.symmetric(horizontal: 18), child: Tab(text: 'All'.tr())), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 18, + ), + child: Tab(text: 'All'.tr()), + ), Tab(text: 'In Progress'.tr()), Tab(text: 'Delivered'.tr()), Tab(text: 'Cancelled'.tr()), @@ -123,72 +185,134 @@ class OrderScreen extends StatelessWidget { child: TabBarView( children: [ controller.allList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.allList.length, + itemCount: + controller.allList.length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.allList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller.allList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.inProgressList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.inProgressList.length, + itemCount: + controller + .inProgressList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.inProgressList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .inProgressList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.deliveredList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.deliveredList.length, + itemCount: + controller + .deliveredList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.deliveredList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .deliveredList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.cancelledList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.cancelledList.length, + itemCount: + controller + .cancelledList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.cancelledList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .cancelledList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), controller.rejectedList.isEmpty - ? Constant.showEmptyView(message: "Order Not Found".tr()) + ? Constant.showEmptyView( + message: "Order Not Found".tr(), + ) : RefreshIndicator( - onRefresh: () => controller.getOrder(), + onRefresh: + () => controller.getOrder(), child: ListView.builder( - itemCount: controller.rejectedList.length, + itemCount: + controller + .rejectedList + .length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - OrderModel orderModel = controller.rejectedList[index]; - return itemView(isDark, context, orderModel, controller); + OrderModel orderModel = + controller + .rejectedList[index]; + return itemView( + isDark, + context, + orderModel, + controller, + ); }, ), ), @@ -208,11 +332,21 @@ class OrderScreen extends StatelessWidget { ); } - Padding itemView(isDark, BuildContext context, OrderModel orderModel, OrderController controller) { + Padding itemView( + isDark, + BuildContext context, + OrderModel orderModel, + OrderController controller, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -223,12 +357,24 @@ class OrderScreen extends StatelessWidget { borderRadius: const BorderRadius.all(Radius.circular(16)), child: Stack( children: [ - NetworkImageWidget(imageUrl: orderModel.vendor!.photo.toString(), fit: BoxFit.cover, height: Responsive.height(10, context), width: Responsive.width(20, context)), + NetworkImageWidget( + imageUrl: orderModel.vendor!.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(10, context), + width: Responsive.width(20, context), + ), Container( height: Responsive.height(10, context), width: Responsive.width(20, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, 1.00), end: const Alignment(0, -1), colors: [Colors.black.withOpacity(0), AppThemeData.grey900]), + gradient: LinearGradient( + begin: const Alignment(0.00, 1.00), + end: const Alignment(0, -1), + colors: [ + Colors.black.withOpacity(0), + AppThemeData.grey900, + ], + ), ), ), ], @@ -242,17 +388,39 @@ class OrderScreen extends StatelessWidget { Text( orderModel.status.toString(), textAlign: TextAlign.right, - style: TextStyle(color: Constant.statusColor(status: orderModel.status.toString()), fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, fontSize: 12), + style: TextStyle( + color: Constant.statusColor( + status: orderModel.status.toString(), + ), + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + fontSize: 12, + ), ), const SizedBox(height: 5), Text( orderModel.vendor!.title.toString(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w400), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 5), Text( Constant.timestampToDateTime(orderModel.createdAt!), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -272,23 +440,55 @@ class OrderScreen extends StatelessWidget { Expanded( child: Text( "${cartProduct.quantity} x ${cartProduct.name.toString()}", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ), Text( Constant.amountShow( amount: - double.parse(cartProduct.discountPrice.toString()) <= 0 - ? (double.parse('${cartProduct.price ?? 0}') * double.parse('${cartProduct.quantity ?? 0}')).toString() - : (double.parse('${cartProduct.discountPrice ?? 0}') * double.parse('${cartProduct.quantity ?? 0}')).toString(), + double.parse( + cartProduct.discountPrice.toString(), + ) <= + 0 + ? (double.parse('${cartProduct.price ?? 0}') * + double.parse( + '${cartProduct.quantity ?? 0}', + )) + .toString() + : (double.parse( + '${cartProduct.discountPrice ?? 0}', + ) * + double.parse( + '${cartProduct.quantity ?? 0}', + )) + .toString(), + ), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, ), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), ), ], ); }, ), - Padding(padding: const EdgeInsets.symmetric(vertical: 14), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 14), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), Row( children: [ orderModel.status == Constant.orderCompleted @@ -297,26 +497,48 @@ class OrderScreen extends StatelessWidget { onTap: () { for (var element in orderModel.products!) { controller.addToCart(cartProductModel: element); - ShowToastDialog.showToast("Item Added In a cart".tr()); + ShowToastDialog.showToast( + "Item Added In a cart".tr(), + ); } }, child: Text( "Reorder".tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 16, + ), ), ), ) - : orderModel.status == Constant.orderShipped || orderModel.status == Constant.orderInTransit + : orderModel.status == Constant.orderShipped || + orderModel.status == Constant.orderInTransit ? Expanded( child: InkWell( onTap: () { - Get.to(const LiveTrackingScreen(), arguments: {"orderModel": orderModel}); + Get.to( + const LiveTrackingScreen(), + arguments: {"orderModel": orderModel}, + ); }, child: Text( "Track Order".tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), + style: TextStyle( + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 16, + ), ), ), ) @@ -324,13 +546,24 @@ class OrderScreen extends StatelessWidget { Expanded( child: InkWell( onTap: () { - Get.to(const OrderDetailsScreen(), arguments: {"orderModel": orderModel}); + Get.to( + const OrderDetailsScreen(), + arguments: {"orderModel": orderModel}, + ); // Get.off(const OrderPlacingScreen(), arguments: {"orderModel": orderModel}); }, child: Text( "View Details".tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 16), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 16, + ), ), ), ), diff --git a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart index 81933b3..f725837 100644 --- a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart @@ -24,7 +24,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:share_plus/share_plus.dart'; import '../terms_and_condition/terms_and_condition_screen.dart'; @@ -44,7 +44,9 @@ class ProfileScreen extends StatelessWidget { return controller.isLoading.value ? Constant.loader() : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -53,41 +55,106 @@ class ProfileScreen extends StatelessWidget { children: [ Text( "My Profile".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Manage your personal information, preferences, and settings all in one place.".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Manage your personal information, preferences, and settings all in one place." + .tr(), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), const SizedBox(height: 20), Text( "General Information".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ Constant.userModel == null ? const SizedBox() - : cardDecoration(isDark, controller, "assets/images/ic_profile.svg", "Profile Information".tr(), () { - Get.to(const EditProfileScreen()); - }), - if (Constant.sectionConstantModel!.dineInActive == true) - cardDecoration(isDark, controller, "assets/images/ic_dinin.svg", "Dine-In".tr(), () { - Get.to(const DineInScreen()); - }), - cardDecoration(isDark, controller, "assets/images/ic_gift.svg", "Gift Card".tr(), () { - Get.to(const GiftCardScreen()); - }), + : cardDecoration( + isDark, + controller, + "assets/images/ic_profile.svg", + "Profile Information".tr(), + () { + Get.to(const EditProfileScreen()); + }, + ), + if (Constant + .sectionConstantModel! + .dineInActive == + true) + cardDecoration( + isDark, + controller, + "assets/images/ic_dinin.svg", + "Dine-In".tr(), + () { + Get.to(const DineInScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/images/ic_gift.svg", + "Gift Card".tr(), + () { + Get.to(const GiftCardScreen()); + }, + ), if (Constant.isCashbackActive == true) - cardDecoration(isDark, controller, "assets/icons/ic_cashback_Offer.svg", "Cashback Offers".tr(), () { - Get.to(const CashbackOffersListScreen()); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_cashback_Offer.svg", + "Cashback Offers".tr(), + () { + Get.to( + const CashbackOffersListScreen(), + ); + }, + ), ], ), ), @@ -99,19 +166,46 @@ class ProfileScreen extends StatelessWidget { children: [ Text( "Bookings Information".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_dinin_order.svg", "Dine-In Booking".tr(), () { - Get.to(const DineInBookingScreen()); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_dinin_order.svg", + "Dine-In Booking".tr(), + () { + Get.to( + const DineInBookingScreen(), + ); + }, + ), ], ), ), @@ -122,20 +216,51 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Preferences".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_change_language.svg", "Change Language".tr(), () { - Get.to(const ChangeLanguageScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_light_dark.svg", "Dark Mode".tr(), () {}), + cardDecoration( + isDark, + controller, + "assets/icons/ic_change_language.svg", + "Change Language".tr(), + () { + Get.to(const ChangeLanguageScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_light_dark.svg", + "Dark Mode".tr(), + () {}, + ), ], ), ), @@ -143,31 +268,69 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Social".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ Constant.userModel == null ? const SizedBox() - : cardDecoration(isDark, controller, "assets/icons/ic_refer.svg", "Refer a Friend".tr(), () { - Get.to(const ReferFriendScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_share.svg", "Share app".tr(), () { - Share.share( - '${'Check out Foodie, your ultimate food delivery application!'.tr()} \n\n${'Google Play:'.tr()} ${Constant.googlePlayLink} \n\n${'App Store:'.tr()} ${Constant.appStoreLink}', - subject: 'Look what I made!'.tr(), - ); - }), - cardDecoration(isDark, controller, "assets/icons/ic_rate.svg", "Rate the app".tr(), () { - final InAppReview inAppReview = InAppReview.instance; - inAppReview.requestReview(); - }), + : cardDecoration( + isDark, + controller, + "assets/icons/ic_refer.svg", + "Refer a Friend".tr(), + () { + Get.to(const ReferFriendScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_share.svg", + "Share app".tr(), + () { + Share.share( + '${'Check out Foodie, your ultimate food delivery application!'.tr()} \n\n${'Google Play:'.tr()} ${Constant.googlePlayLink} \n\n${'App Store:'.tr()} ${Constant.appStoreLink}', + subject: 'Look what I made!'.tr(), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_rate.svg", + "Rate the app".tr(), + () { + final InAppReview inAppReview = + InAppReview.instance; + inAppReview.requestReview(); + }, + ), ], ), ), @@ -180,28 +343,75 @@ class ProfileScreen extends StatelessWidget { children: [ Text( "Communication".tr(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Store Inbox".tr(), () { - Get.to(const RestaurantInboxScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Driver Inbox".tr(), () { - Get.to(const DriverInboxScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_chat.svg", "Provider Inbox".tr(), () { - Get.to(const ProviderInboxScreen()); - }), - cardDecoration(isDark, controller, "assets/icons/ic_restaurant_driver.svg", "Worker Inbox".tr(), () { - Get.to(const WorkerInboxScreen()); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_chat.svg", + "Store Inbox".tr(), + () { + Get.to( + const RestaurantInboxScreen(), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_driver.svg", + "Driver Inbox".tr(), + () { + Get.to(const DriverInboxScreen()); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_chat.svg", + "Provider Inbox".tr(), + () { + Get.to( + const ProviderInboxScreen(), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_restaurant_driver.svg", + "Worker Inbox".tr(), + () { + Get.to(const WorkerInboxScreen()); + }, + ), ], ), ), @@ -209,21 +419,63 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), ], ), - Text("Legal".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500)), + Text( + "Legal".tr(), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), + ), const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 8, + ), child: Column( children: [ - cardDecoration(isDark, controller, "assets/icons/ic_privacy_policy.svg", "Privacy Policy".tr(), () { - Get.to(const TermsAndConditionScreen(type: "privacy")); - }), - cardDecoration(isDark, controller, "assets/icons/ic_tearm_condition.svg", "Terms and Conditions".tr(), () { - Get.to(const TermsAndConditionScreen(type: "termAndCondition")); - }), + cardDecoration( + isDark, + controller, + "assets/icons/ic_privacy_policy.svg", + "Privacy Policy".tr(), + () { + Get.to( + const TermsAndConditionScreen( + type: "privacy", + ), + ); + }, + ), + cardDecoration( + isDark, + controller, + "assets/icons/ic_tearm_condition.svg", + "Terms and Conditions".tr(), + () { + Get.to( + const TermsAndConditionScreen( + type: "termAndCondition", + ), + ); + }, + ), ], ), ), @@ -232,39 +484,74 @@ class ProfileScreen extends StatelessWidget { const SizedBox(height: 10), Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), child: Column( children: [ Constant.userModel == null - ? cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log In".tr(), () { - Get.offAll(const LoginScreen()); - }) - : cardDecoration(isDark, controller, "assets/icons/ic_logout.svg", "Log out".tr(), () { - showDialog( - context: context, - builder: (BuildContext context) { - return CustomDialogBox( - title: "Log out".tr(), - descriptions: "Are you sure you want to log out? You will need to enter your credentials to log back in.".tr(), - positiveString: "Log out".tr(), - negativeString: "Cancel".tr(), - positiveClick: () async { - Constant.userModel!.fcmToken = ""; - await FireStoreUtils.updateUser(Constant.userModel!); - Constant.userModel = null; - await FirebaseAuth.instance.signOut(); - Get.offAll(const LoginScreen()); - }, - negativeClick: () { - Get.back(); - }, - img: Image.asset('assets/images/ic_logout.gif', height: 50, width: 50), - ); - }, - ); - }), + ? cardDecoration( + isDark, + controller, + "assets/icons/ic_logout.svg", + "Log In".tr(), + () { + Get.offAll(const LoginScreen()); + }, + ) + : cardDecoration( + isDark, + controller, + "assets/icons/ic_logout.svg", + "Log out".tr(), + () { + showDialog( + context: context, + builder: (BuildContext context) { + return CustomDialogBox( + title: "Log out".tr(), + descriptions: + "Are you sure you want to log out? You will need to enter your credentials to log back in." + .tr(), + positiveString: "Log out".tr(), + negativeString: "Cancel".tr(), + positiveClick: () async { + Constant.userModel!.fcmToken = + ""; + await FireStoreUtils.updateUser( + Constant.userModel!, + ); + Constant.userModel = null; + await FirebaseAuth.instance + .signOut(); + Get.offAll( + const LoginScreen(), + ); + }, + negativeClick: () { + Get.back(); + }, + img: Image.asset( + 'assets/images/ic_logout.gif', + height: 50, + width: 50, + ), + ); + }, + ); + }, + ), ], ), ), @@ -273,7 +560,9 @@ class ProfileScreen extends StatelessWidget { Constant.userModel == null ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(vertical: 20), + padding: const EdgeInsets.symmetric( + vertical: 20, + ), child: InkWell( onTap: () { showDialog( @@ -281,40 +570,66 @@ class ProfileScreen extends StatelessWidget { builder: (BuildContext context) { return CustomDialogBox( title: "Delete Account".tr(), - descriptions: "Are you sure you want to delete your account? This action is irreversible and will permanently remove all your data.".tr(), + descriptions: + "Are you sure you want to delete your account? This action is irreversible and will permanently remove all your data." + .tr(), positiveString: "Delete".tr(), negativeString: "Cancel".tr(), positiveClick: () async { - ShowToastDialog.showLoader("Please wait...".tr()); - await controller.deleteUserFromServer(); - await FireStoreUtils.deleteUser().then((value) { + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); + await controller + .deleteUserFromServer(); + await FireStoreUtils.deleteUser().then(( + value, + ) { ShowToastDialog.closeLoader(); if (value == true) { - ShowToastDialog.showToast("Account deleted successfully".tr()); + ShowToastDialog.showToast( + "Account deleted successfully" + .tr(), + ); Get.offAll(const LoginScreen()); } else { - ShowToastDialog.showToast("Contact Administrator".tr()); + ShowToastDialog.showToast( + "Contact Administrator".tr(), + ); } }); }, negativeClick: () { Get.back(); }, - img: Image.asset('assets/icons/delete_dialog.gif', height: 50, width: 50), + img: Image.asset( + 'assets/icons/delete_dialog.gif', + height: 50, + width: 50, + ), ); }, ); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_delete.svg"), + SvgPicture.asset( + "assets/icons/ic_delete.svg", + ), const SizedBox(width: 10), Text( "Delete Account".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.danger300 : AppThemeData.danger300), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.danger300 + : AppThemeData.danger300, + ), ), ], ), @@ -324,7 +639,14 @@ class ProfileScreen extends StatelessWidget { child: Text( "V : ${Constant.appVersion}", textAlign: TextAlign.center, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), ], @@ -338,7 +660,13 @@ class ProfileScreen extends StatelessWidget { ); } - Padding cardDecoration(bool isDark, MyProfileController controller, String image, String title, Function()? onPress) { + Padding cardDecoration( + bool isDark, + MyProfileController controller, + String image, + String title, + Function()? onPress, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: InkWell( @@ -348,7 +676,18 @@ class ProfileScreen extends StatelessWidget { }, child: Row( children: [ - SvgPicture.asset(image, colorFilter: title == "Log In".tr() || title == "Cashbacks".tr() ? const ColorFilter.mode(AppThemeData.success500, BlendMode.srcIn) : null, height: 24, width: 24), + SvgPicture.asset( + image, + colorFilter: + title == "Log In".tr() || title == "Cashbacks".tr() + ? const ColorFilter.mode( + AppThemeData.success500, + BlendMode.srcIn, + ) + : null, + height: 24, + width: 24, + ), const SizedBox(width: 10), Expanded( child: Text( @@ -362,16 +701,28 @@ class ProfileScreen extends StatelessWidget { ? AppThemeData.danger300 : title == "Log In".tr() ? AppThemeData.success500 - : (isDark ? AppThemeData.grey100 : AppThemeData.grey800), + : (isDark + ? AppThemeData.grey100 + : AppThemeData.grey800), ), ), ), title == "Dark Mode".tr() ? Transform.scale( scale: 0.8, - child: Obx(() => CupertinoSwitch(value: controller.isDarkModeSwitch.value, activeTrackColor: AppThemeData.primary300, onChanged: controller.toggleDarkMode)), + child: Obx( + () => CupertinoSwitch( + value: controller.isDarkModeSwitch.value, + activeTrackColor: AppThemeData.primary300, + onChanged: controller.toggleDarkMode, + ), + ), ) - : Icon(Icons.keyboard_arrow_right, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700), + : Icon( + Icons.keyboard_arrow_right, + color: + isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart index 840a7d1..3dfc208 100644 --- a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart +++ b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart @@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:image_picker/image_picker.dart'; import '../../../controllers/theme_controller.dart'; @@ -27,33 +27,75 @@ class RateProductScreen extends StatelessWidget { init: RateProductController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Rate the item".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Rate the item".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: SingleChildScrollView( child: Column( children: [ Container( width: Responsive.width(100, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 20, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Rate for".tr(), style: TextStyle(color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.medium)), Text( - "${controller.productModel.value.name}".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 18, fontFamily: AppThemeData.semiBold), + "Rate for".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.medium, + ), + ), + Text( + "${controller.productModel.value.name}" + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 18, + fontFamily: AppThemeData.semiBold, + ), ), const SizedBox(height: 10), RatingBar.builder( @@ -62,42 +104,109 @@ class RateProductScreen extends StatelessWidget { direction: Axis.horizontal, itemCount: 5, itemSize: 26, - unratedColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - itemPadding: const EdgeInsets.symmetric(horizontal: 6.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), + unratedColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + itemPadding: const EdgeInsets.symmetric( + horizontal: 6.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: AppThemeData.warning300, + ), onRatingUpdate: (double rate) { controller.ratings.value = rate; }, ), - Padding(padding: const EdgeInsets.symmetric(vertical: 20), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, + ), + child: MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + ), ListView.builder( - itemCount: controller.reviewAttributeList.length, + itemCount: + controller.reviewAttributeList.length, shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { return Padding( - padding: const EdgeInsets.symmetric(vertical: 2), + padding: const EdgeInsets.symmetric( + vertical: 2, + ), child: Row( children: [ Expanded( child: Text( - controller.reviewAttributeList[index].title.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontFamily: AppThemeData.semiBold), + controller + .reviewAttributeList[index] + .title + .toString(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, + fontSize: 16, + fontFamily: + AppThemeData.semiBold, + ), ), ), RatingBar.builder( initialRating: - controller.ratingModel.value.id == null ? 0.0 : controller.ratingModel.value.reviewAttributes?[controller.reviewAttributeList[index].id] ?? 0.0, + controller + .ratingModel + .value + .id == + null + ? 0.0 + : controller + .ratingModel + .value + .reviewAttributes?[controller + .reviewAttributeList[index] + .id] ?? + 0.0, minRating: 1, direction: Axis.horizontal, itemCount: 5, itemSize: 18, - unratedColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, - itemPadding: const EdgeInsets.symmetric(horizontal: 2.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), + unratedColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + itemPadding: + const EdgeInsets.symmetric( + horizontal: 2.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: + AppThemeData.warning300, + ), onRatingUpdate: (double rate) { - controller.reviewAttribute.addEntries([MapEntry(controller.reviewAttributeList[index].id.toString(), rate)]); + controller.reviewAttribute + .addEntries([ + MapEntry( + controller + .reviewAttributeList[index] + .id + .toString(), + rate, + ), + ]); }, ), ], @@ -110,34 +219,72 @@ class RateProductScreen extends StatelessWidget { options: RoundedRectDottedBorderOptions( radius: const Radius.circular(12), dashPattern: const [6, 6, 6, 6], - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, ), child: Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.all(Radius.circular(12))), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + borderRadius: const BorderRadius.all( + Radius.circular(12), + ), + ), child: SizedBox( height: Responsive.height(20, context), width: Responsive.width(90, context), child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ - SvgPicture.asset('assets/icons/ic_folder.svg'), + SvgPicture.asset( + 'assets/icons/ic_folder.svg', + ), const SizedBox(height: 10), Text( - "Choose a image and upload here".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.medium, fontSize: 16), + "Choose a image and upload here" + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontFamily: AppThemeData.medium, + fontSize: 16, + ), ), const SizedBox(height: 5), - Text("JPEG, PNG".tr(), style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular)), + Text( + "JPEG, PNG".tr(), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + fontFamily: + AppThemeData.regular, + ), + ), const SizedBox(height: 10), RoundedButtonFill( title: "Brows Image".tr(), color: AppThemeData.primary50, width: 30, height: 5, - textColor: AppThemeData.primary300, + textColor: + AppThemeData.primary300, onPress: () async { - buildBottomSheet(context, controller); + buildBottomSheet( + context, + controller, + ); }, ), ], @@ -154,21 +301,54 @@ class RateProductScreen extends StatelessWidget { children: [ Expanded( child: ListView.builder( - itemCount: controller.images.length, + itemCount: + controller.images.length, shrinkWrap: true, - scrollDirection: Axis.horizontal, + scrollDirection: + Axis.horizontal, // physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), + padding: + const EdgeInsets.symmetric( + horizontal: 5, + ), child: Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: + const BorderRadius.all( + Radius.circular( + 10, + ), + ), child: - (controller.images[index] is XFile) - ? Image.file(File((controller.images[index] as XFile).path), fit: BoxFit.cover, width: 80, height: 80) - : NetworkImageWidget(imageUrl: controller.images[index]?.toString() ?? '', fit: BoxFit.cover, width: 80, height: 80), + (controller.images[index] + is XFile) + ? Image.file( + File( + (controller.images[index] + as XFile) + .path, + ), + fit: + BoxFit + .cover, + width: 80, + height: 80, + ) + : NetworkImageWidget( + imageUrl: + controller + .images[index] + ?.toString() ?? + '', + fit: + BoxFit + .cover, + width: 80, + height: 80, + ), // controller.images[index].runtimeType == XFile // ? Image.file(File(controller.images[index].path), fit: BoxFit.cover, width: 80, height: 80) // : NetworkImageWidget(imageUrl: controller.images[index], fit: BoxFit.cover, width: 80, height: 80), @@ -180,9 +360,19 @@ class RateProductScreen extends StatelessWidget { right: 0, child: InkWell( onTap: () { - controller.images.removeAt(index); + controller.images + .removeAt( + index, + ); }, - child: const Icon(Icons.remove_circle, size: 28, color: AppThemeData.danger300), + child: const Icon( + Icons + .remove_circle, + size: 28, + color: + AppThemeData + .danger300, + ), ), ), ], @@ -199,26 +389,49 @@ class RateProductScreen extends StatelessWidget { options: RoundedRectDottedBorderOptions( radius: const Radius.circular(12), dashPattern: const [6, 6, 6, 6], - color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, ), child: TextFormField( keyboardType: TextInputType.text, - textCapitalization: TextCapitalization.sentences, - controller: controller.commentController.value, + textCapitalization: + TextCapitalization.sentences, + controller: + controller.commentController.value, maxLines: 4, textInputAction: TextInputAction.done, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + ), decoration: InputDecoration( - errorStyle: const TextStyle(color: Colors.red), + errorStyle: const TextStyle( + color: Colors.red, + ), filled: true, - fillColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + fillColor: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, disabledBorder: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, errorBorder: InputBorder.none, border: InputBorder.none, hintText: "Type comment".tr(), - hintStyle: TextStyle(fontSize: 14, color: isDark ? AppThemeData.grey600 : AppThemeData.grey400, fontFamily: AppThemeData.regular), + hintStyle: TextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.grey600 + : AppThemeData.grey400, + fontFamily: AppThemeData.regular, + ), ), ), ), @@ -251,7 +464,10 @@ class RateProductScreen extends StatelessWidget { ); } - Future buildBottomSheet(BuildContext context, RateProductController controller) { + Future buildBottomSheet( + BuildContext context, + RateProductController controller, + ) { return showModalBottomSheet( context: context, builder: (context) { @@ -266,7 +482,15 @@ class RateProductScreen extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 15), - child: Text("Please Select".tr(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.bold, fontSize: 16)), + child: Text( + "Please Select".tr(), + style: TextStyle( + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.bold, + fontSize: 16, + ), + ), ), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -277,8 +501,17 @@ class RateProductScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.camera), icon: const Icon(Icons.camera_alt, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("Camera".tr())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.camera, + ), + icon: const Icon(Icons.camera_alt, size: 32), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text("Camera".tr()), + ), ], ), ), @@ -288,8 +521,20 @@ class RateProductScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - IconButton(onPressed: () => controller.pickFile(source: ImageSource.gallery), icon: const Icon(Icons.photo_library_sharp, size: 32)), - Padding(padding: const EdgeInsets.only(top: 3), child: Text("Gallery".tr())), + IconButton( + onPressed: + () => controller.pickFile( + source: ImageSource.gallery, + ), + icon: const Icon( + Icons.photo_library_sharp, + size: 32, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text("Gallery".tr()), + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart index c8a1bbd..799ae8c 100644 --- a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart +++ b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart @@ -7,7 +7,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:share_plus/share_plus.dart'; import '../../../controllers/theme_controller.dart'; @@ -30,9 +30,16 @@ class ReferFriendScreen extends StatelessWidget { : Container( width: Responsive.width(100, context), height: Responsive.height(100, context), - decoration: const BoxDecoration(image: DecorationImage(image: AssetImage("assets/images/refer_friend.png"), fit: BoxFit.fill)), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/refer_friend.png"), + fit: BoxFit.fill, + ), + ), child: Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -42,30 +49,56 @@ class ReferFriendScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: const Icon(Icons.arrow_back, color: AppThemeData.grey50), + child: const Icon( + Icons.arrow_back, + color: AppThemeData.grey50, + ), ), Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ const SizedBox(height: 60), - Center(child: SvgPicture.asset("assets/images/referal_top.svg")), + Center( + child: SvgPicture.asset( + "assets/images/referal_top.svg", + ), + ), const SizedBox(height: 10), Text( "Refer your friend and earn".tr(), - style: TextStyle(fontSize: 22, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 22, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), const SizedBox(width: 4), Text( "${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'Each🎉'.tr()}", - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 32), Text( "Invite Friends & Businesses".tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData.ecommerceDark100, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, ), @@ -75,25 +108,60 @@ class ReferFriendScreen extends StatelessWidget { "${'Invite your friends to sign up with Foodie using your code, and you’ll earn'.tr()} ${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'after their Success the first order! 💸🍔'.tr()}" .tr(), textAlign: TextAlign.center, - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), const SizedBox(height: 40), Container( decoration: ShapeDecoration( - gradient: const LinearGradient(begin: Alignment(0.00, -1.00), end: Alignment(0, 1), colors: [Color(0xFF271366), Color(0xFF4826B2)]), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), - shadows: const [BoxShadow(color: Color(0x14FFFFFF), blurRadius: 120, offset: Offset(0, 0), spreadRadius: 0)], + gradient: const LinearGradient( + begin: Alignment(0.00, -1.00), + end: Alignment(0, 1), + colors: [ + Color(0xFF271366), + Color(0xFF4826B2), + ], + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(120), + ), + shadows: const [ + BoxShadow( + color: Color(0x14FFFFFF), + blurRadius: 120, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 80, vertical: 16), + padding: const EdgeInsets.symmetric( + horizontal: 80, + vertical: 16, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Text( - controller.referralModel.value.referralCode.toString(), + controller + .referralModel + .value + .referralCode + .toString(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500, ), @@ -101,34 +169,74 @@ class ReferFriendScreen extends StatelessWidget { const SizedBox(width: 10), InkWell( onTap: () { - Clipboard.setData(ClipboardData(text: controller.referralModel.value.referralCode.toString())); - ShowToastDialog.showToast("Copied".tr()); + Clipboard.setData( + ClipboardData( + text: + controller + .referralModel + .value + .referralCode + .toString(), + ), + ); + ShowToastDialog.showToast( + "Copied".tr(), + ); }, - child: const Icon(Icons.copy, color: AppThemeData.ecommerce100), + child: const Icon( + Icons.copy, + color: AppThemeData.ecommerce100, + ), ), ], ), ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 40), + padding: const EdgeInsets.symmetric( + horizontal: 40, + ), child: Row( children: [ - Expanded(child: Divider(thickness: 1, color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100)), + Expanded( + child: Divider( + thickness: 1, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, + ), + ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 30, + ), child: Text( "or".tr(), textAlign: TextAlign.center, style: TextStyle( - color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100, + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, fontSize: 12, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, ), ), ), - Expanded(child: Divider(color: isDark ? AppThemeData.ecommerce100 : AppThemeData.ecommerceDark100)), + Expanded( + child: Divider( + color: + isDark + ? AppThemeData.ecommerce100 + : AppThemeData + .ecommerceDark100, + ), + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart index 5f6f69e..0112d26 100644 --- a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart @@ -17,8 +17,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -52,14 +51,32 @@ class RestaurantDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('${cartItem.length} ${"items".tr()}', style: TextStyle(fontFamily: AppThemeData.medium, color: AppThemeData.grey50, fontSize: 16)), - Text('View Cart'.tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: AppThemeData.grey50, fontSize: 16, fontWeight: FontWeight.bold)), + Text( + '${cartItem.length} ${"items".tr()}', + style: TextStyle( + fontFamily: AppThemeData.medium, + color: AppThemeData.grey50, + fontSize: 16, + ), + ), + Text( + 'View Cart'.tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: AppThemeData.grey50, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), ], ), ), ), body: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + headerSliverBuilder: ( + BuildContext context, + bool innerBoxIsScrolled, + ) { return [ SliverAppBar( expandedHeight: Responsive.height(30, context), @@ -73,24 +90,48 @@ class RestaurantDetailsScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.arrow_back, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + child: Icon( + Icons.arrow_back, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), const Expanded(child: SizedBox()), Visibility( - visible: (controller.vendorModel.value.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (controller.vendorModel.value.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( color: AppThemeData.primary300, - borderRadius: BorderRadius.circular(120), // Optional + borderRadius: BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), const SizedBox(width: 5), - Text("Free Delivery".tr(), style: TextStyle(fontSize: 14, color: AppThemeData.carRent600, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600)), + Text( + "Free Delivery".tr(), + style: TextStyle( + fontSize: 14, + color: AppThemeData.carRent600, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), + ), ], ), ), @@ -100,21 +141,55 @@ class RestaurantDetailsScreen extends StatelessWidget { ), InkWell( onTap: () async { - if (controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty) { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); - controller.favouriteList.removeWhere((item) => item.restaurantId == controller.vendorModel.value.id); - await FireStoreUtils.removeFavouriteRestaurant(favouriteModel); + if (controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty) { + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); + controller.favouriteList.removeWhere( + (item) => + item.restaurantId == + controller.vendorModel.value.id, + ); + await FireStoreUtils.removeFavouriteRestaurant( + favouriteModel, + ); } else { - FavouriteModel favouriteModel = FavouriteModel(restaurantId: controller.vendorModel.value.id, userId: FireStoreUtils.getCurrentUid()); + FavouriteModel favouriteModel = FavouriteModel( + restaurantId: controller.vendorModel.value.id, + userId: FireStoreUtils.getCurrentUid(), + ); controller.favouriteList.add(favouriteModel); - await FireStoreUtils.setFavouriteRestaurant(favouriteModel); + await FireStoreUtils.setFavouriteRestaurant( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteList.where((p0) => p0.restaurantId == controller.vendorModel.value.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg", colorFilter: const ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn)) - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteList + .where( + (p0) => + p0.restaurantId == + controller.vendorModel.value.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + colorFilter: const ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), const SizedBox(width: 10), @@ -128,16 +203,30 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, ), ), - badgeStyle: badges.BadgeStyle(shape: badges.BadgeShape.circle, badgeColor: AppThemeData.ecommerce300), + badgeStyle: badges.BadgeStyle( + shape: badges.BadgeShape.circle, + badgeColor: AppThemeData.ecommerce300, + ), child: InkWell( onTap: () { Get.to(const CartScreen()); }, child: ClipOval( - child: SvgPicture.asset("assets/icons/ic_shoping_cart.svg", width: 24, height: 24, colorFilter: const ColorFilter.mode(AppThemeData.grey50, BlendMode.srcIn)), + child: SvgPicture.asset( + "assets/icons/ic_shoping_cart.svg", + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + AppThemeData.grey50, + BlendMode.srcIn, + ), + ), ), ), ), @@ -147,18 +236,28 @@ class RestaurantDetailsScreen extends StatelessWidget { flexibleSpace: FlexibleSpaceBar( background: Stack( children: [ - controller.vendorModel.value.photos == null || controller.vendorModel.value.photos!.isEmpty + controller.vendorModel.value.photos == null || + controller.vendorModel.value.photos!.isEmpty ? Stack( children: [ NetworkImageWidget( - imageUrl: controller.vendorModel.value.photo.toString(), + imageUrl: + controller.vendorModel.value.photo + .toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context), ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -167,18 +266,32 @@ class RestaurantDetailsScreen extends StatelessWidget { physics: const BouncingScrollPhysics(), controller: controller.pageController.value, scrollDirection: Axis.horizontal, - itemCount: controller.vendorModel.value.photos!.length, + itemCount: + controller.vendorModel.value.photos!.length, padEnds: false, pageSnapping: true, allowImplicitScrolling: true, itemBuilder: (BuildContext context, int index) { - String image = controller.vendorModel.value.photos![index]; + String image = + controller.vendorModel.value.photos![index]; return Stack( children: [ - NetworkImageWidget(imageUrl: image.toString(), fit: BoxFit.cover, width: Responsive.width(100, context), height: Responsive.height(40, context)), + NetworkImageWidget( + imageUrl: image.toString(), + fit: BoxFit.cover, + width: Responsive.width(100, context), + height: Responsive.height(40, context), + ), Container( decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), Colors.black]), + gradient: LinearGradient( + begin: const Alignment(0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + Colors.black, + ], + ), ), ), ], @@ -192,17 +305,26 @@ class RestaurantDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: List.generate(controller.vendorModel.value.photos!.length, (index) { - return Obx( - () => Container( - margin: const EdgeInsets.only(right: 5), - alignment: Alignment.centerLeft, - height: 9, - width: 9, - decoration: BoxDecoration(shape: BoxShape.circle, color: controller.currentPage.value == index ? AppThemeData.primary300 : AppThemeData.grey300), - ), - ); - }), + children: List.generate( + controller.vendorModel.value.photos!.length, + (index) { + return Obx( + () => Container( + margin: const EdgeInsets.only(right: 5), + alignment: Alignment.centerLeft, + height: 9, + width: 9, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + controller.currentPage.value == index + ? AppThemeData.primary300 + : AppThemeData.grey300, + ), + ), + ); + }, + ), ), ), ], @@ -223,38 +345,64 @@ class RestaurantDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.vendorModel.value.title.toString(), + controller.vendorModel.value.title + .toString(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( fontSize: 22, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), SizedBox( - width: Responsive.width(78, context), + width: Responsive.width( + 78, + context, + ), child: Text( - controller.vendorModel.value.location.toString(), + controller + .vendorModel + .value + .location + .toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey400 : AppThemeData.grey400), + style: TextStyle( + fontFamily: + AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, + ), ), ), ], @@ -264,21 +412,60 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData.primary600 + : AppThemeData.primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(120), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 4, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( Constant.calculateReview( - reviewCount: controller.vendorModel.value.reviewsCount.toString(), - reviewSum: controller.vendorModel.value.reviewsSum.toString(), + reviewCount: + controller + .vendorModel + .value + .reviewsCount + .toString(), + reviewSum: + controller + .vendorModel + .value + .reviewsSum + .toString(), + ), + style: TextStyle( + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, ), - style: TextStyle(color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), ), ], ), @@ -286,23 +473,45 @@ class RestaurantDetailsScreen extends StatelessWidget { ), InkWell( onTap: () { - Get.to(const ReviewListScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const ReviewListScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); }, child: Text( "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", - style: TextStyle(decoration: TextDecoration.underline, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700, fontFamily: AppThemeData.regular), + style: TextStyle( + decoration: + TextDecoration.underline, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + fontFamily: + AppThemeData.regular, + ), ), ), ], ), ], ), - Constant.sectionConstantModel!.serviceTypeFlag == "ecommerce-service" + Constant + .sectionConstantModel! + .serviceTypeFlag == + "ecommerce-service" ? SizedBox() : Row( children: [ Text( - controller.isOpen.value ? "Open".tr() : "Close".tr(), + controller.isOpen.value + ? "Open".tr() + : "Close".tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -310,16 +519,41 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: controller.isOpen.value ? AppThemeData.success400 : AppThemeData.danger300, + color: + controller.isOpen.value + ? AppThemeData.success400 + : AppThemeData.danger300, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), + child: Icon( + Icons.circle, + size: 5, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, ), ), - Padding(padding: const EdgeInsets.symmetric(horizontal: 10), child: Icon(Icons.circle, size: 5, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500)), InkWell( onTap: () { - if (controller.vendorModel.value.workingHours!.isEmpty) { - ShowToastDialog.showToast("Timing is not added by store".tr()); + if (controller + .vendorModel + .value + .workingHours! + .isEmpty) { + ShowToastDialog.showToast( + "Timing is not added by store" + .tr(), + ); } else { - timeShowBottomSheet(context, controller); + timeShowBottomSheet( + context, + controller, + ); } }, child: Text( @@ -328,24 +562,45 @@ class RestaurantDetailsScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 14, - decoration: TextDecoration.underline, - decorationColor: AppThemeData.ecommerce300, + decoration: + TextDecoration.underline, + decorationColor: + AppThemeData.ecommerce300, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, ), ), ), ], ), - controller.vendorModel.value.dineInActive == true || (controller.vendorModel.value.openDineTime != null && controller.vendorModel.value.openDineTime!.isNotEmpty) + controller.vendorModel.value.dineInActive == + true || + (controller + .vendorModel + .value + .openDineTime != + null && + controller + .vendorModel + .value + .openDineTime! + .isNotEmpty) ? Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( - "Also applicable on table booking".tr(), + "Also applicable on table booking" + .tr(), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -353,52 +608,106 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), InkWell( onTap: () { - Get.to(const DineInDetailsScreen(), arguments: {"vendorModel": controller.vendorModel.value}); + Get.to( + const DineInDetailsScreen(), + arguments: { + "vendorModel": + controller + .vendorModel + .value, + }, + ); }, child: Container( height: 80, clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), - borderRadius: BorderRadius.circular(16), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + ), + borderRadius: + BorderRadius.circular(16), ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Image.asset("assets/images/ic_table.gif"), + Image.asset( + "assets/images/ic_table.gif", + ), const SizedBox(width: 10), Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - "Table Booking".tr(), + "Table Booking" + .tr(), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), Text( - "Quick Conformations".tr(), + "Quick Conformations" + .tr(), style: TextStyle( fontSize: 12, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight + .w500, ), ), ], @@ -415,7 +724,8 @@ class RestaurantDetailsScreen extends StatelessWidget { controller.couponList.isEmpty ? const SizedBox() : Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ const SizedBox(height: 20), Text( @@ -427,11 +737,16 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), - CouponListView(controller: controller), + CouponListView( + controller: controller, + ), ], ), const SizedBox(height: 20), @@ -444,26 +759,42 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), TextFieldWidget( - controller: controller.searchEditingController.value, - hintText: 'Search the item and more...'.tr(), + controller: + controller + .searchEditingController + .value, + hintText: + 'Search the item and more...'.tr(), onchange: (value) { controller.searchProduct(value); }, - prefix: Padding(padding: const EdgeInsets.all(12), child: SvgPicture.asset("assets/icons/ic_search.svg")), + prefix: Padding( + padding: const EdgeInsets.all(12), + child: SvgPicture.asset( + "assets/icons/ic_search.svg", + ), + ), ), const SizedBox(height: 10), - Constant.sectionConstantModel!.isProductDetails == false + Constant + .sectionConstantModel! + .isProductDetails == + false ? SizedBox() : Row( children: [ InkWell( onTap: () { - if (controller.isVag.value == true) { + if (controller.isVag.value == + true) { controller.isVag.value = false; } else { controller.isVag.value = true; @@ -471,30 +802,83 @@ class RestaurantDetailsScreen extends StatelessWidget { controller.filterRecord(); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), decoration: controller.isVag.value ? ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppThemeData.primary300), borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + AppThemeData + .primary300, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), ) : ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), ), ), child: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_veg.svg", height: 20, width: 20), + SvgPicture.asset( + "assets/icons/ic_veg.svg", + height: 20, + width: 20, + ), const SizedBox(width: 8), Text( 'Veg'.tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -503,38 +887,94 @@ class RestaurantDetailsScreen extends StatelessWidget { const SizedBox(width: 10), InkWell( onTap: () { - if (controller.isNonVag.value == true) { - controller.isNonVag.value = false; + if (controller.isNonVag.value == + true) { + controller.isNonVag.value = + false; } else { - controller.isNonVag.value = true; + controller.isNonVag.value = + true; } controller.filterRecord(); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: + const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), decoration: controller.isNonVag.value ? ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppThemeData.primary300), borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + AppThemeData + .primary300, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), ) : ShapeDecoration( - color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + color: + isDark + ? AppThemeData + .grey800 + : AppThemeData + .grey100, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), ), ), child: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_nonveg.svg", height: 20, width: 20), + SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + height: 20, + width: 20, + ), const SizedBox(width: 8), Text( 'Non Veg'.tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey100 + : AppThemeData + .grey800, + fontFamily: + AppThemeData.semiBold, + fontWeight: + FontWeight.w600, + ), ), ], ), @@ -631,12 +1071,17 @@ class RestaurantDetailsScreen extends StatelessWidget { ); } - Future timeShowBottomSheet(BuildContext context, RestaurantDetailsController productModel) { + Future timeShowBottomSheet( + BuildContext context, + RestaurantDetailsController productModel, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -646,7 +1091,8 @@ class RestaurantDetailsScreen extends StatelessWidget { final themeController = Get.find(); final isDark = themeController.isDark.value; return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -658,7 +1104,15 @@ class RestaurantDetailsScreen extends StatelessWidget { width: 134, height: 5, margin: const EdgeInsets.only(bottom: 6), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey50 : AppThemeData.grey800, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey800, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(3), + ), + ), ), ), ), @@ -666,11 +1120,22 @@ class RestaurantDetailsScreen extends StatelessWidget { child: ListView.builder( shrinkWrap: true, physics: const BouncingScrollPhysics(), - itemCount: productModel.vendorModel.value.workingHours!.length, + itemCount: + productModel + .vendorModel + .value + .workingHours! + .length, itemBuilder: (context, dayIndex) { - WorkingHours workingHours = productModel.vendorModel.value.workingHours![dayIndex]; + WorkingHours workingHours = + productModel + .vendorModel + .value + .workingHours![dayIndex]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -683,34 +1148,72 @@ class RestaurantDetailsScreen extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), const SizedBox(height: 10), - workingHours.timeslot == null || workingHours.timeslot!.isEmpty + workingHours.timeslot == null || + workingHours.timeslot!.isEmpty ? const SizedBox() : ListView.builder( shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: workingHours.timeslot!.length, + physics: + const NeverScrollableScrollPhysics(), + itemCount: + workingHours.timeslot!.length, itemBuilder: (context, timeIndex) { - Timeslot timeSlotModel = workingHours.timeslot![timeIndex]; + Timeslot timeSlotModel = + workingHours + .timeslot![timeIndex]; return Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all( + 8.0, + ), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.from.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.from + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), @@ -718,15 +1221,42 @@ class RestaurantDetailsScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Container( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(12)), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey200), + borderRadius: + const BorderRadius.all( + Radius.circular( + 12, + ), + ), + border: Border.all( + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey200, + ), ), child: Center( child: Text( - timeSlotModel.to.toString(), - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + timeSlotModel.to + .toString(), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + fontSize: 14, + color: + isDark + ? AppThemeData + .grey400 + : AppThemeData + .grey500, + ), ), ), ), @@ -775,10 +1305,19 @@ class CouponListView extends StatelessWidget { clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), borderRadius: BorderRadius.circular(16)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: isDark ? AppThemeData.grey800 : AppThemeData.grey100, + ), + borderRadius: BorderRadius.circular(16), + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: SizedBox( width: Responsive.width(80, context), child: Row( @@ -786,11 +1325,28 @@ class CouponListView extends StatelessWidget { children: [ Container( width: 60, - decoration: const BoxDecoration(image: DecorationImage(image: AssetImage("assets/images/offer_gif.gif"), fit: BoxFit.fill)), + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/offer_gif.gif"), + fit: BoxFit.fill, + ), + ), child: Center( child: Text( - offerModel.discountType == "Fix Price" ? Constant.amountShow(amount: offerModel.discount) : "${offerModel.discount}%", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, fontSize: 12), + offerModel.discountType == "Fix Price" + ? Constant.amountShow( + amount: offerModel.discount, + ) + : "${offerModel.discount}%", + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + fontSize: 12, + ), ), ), ), @@ -801,11 +1357,21 @@ class CouponListView extends StatelessWidget { children: [ Text( offerModel.description.toString(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), InkWell( onTap: () { - Clipboard.setData(ClipboardData(text: offerModel.code.toString())).then((value) { + Clipboard.setData( + ClipboardData(text: offerModel.code.toString()), + ).then((value) { ShowToastDialog.showToast("Copied".tr()); }); }, @@ -813,15 +1379,36 @@ class CouponListView extends StatelessWidget { children: [ Text( offerModel.code.toString(), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), const SizedBox(width: 5), SvgPicture.asset("assets/icons/ic_copy.svg"), - const SizedBox(height: 10, child: VerticalDivider()), + const SizedBox( + height: 10, + child: VerticalDivider(), + ), const SizedBox(width: 5), Text( - Constant.timestampToDateTime(offerModel.expiresAt!), - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + Constant.timestampToDateTime( + offerModel.expiresAt!, + ), + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), ], ), @@ -858,7 +1445,8 @@ class ProductListView extends StatelessWidget { itemCount: controller.vendorCategoryList.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { - VendorCategoryModel vendorCategoryModel = controller.vendorCategoryList[index]; + VendorCategoryModel vendorCategoryModel = + controller.vendorCategoryList[index]; return ExpansionTile( childrenPadding: EdgeInsets.zero, tilePadding: EdgeInsets.zero, @@ -866,17 +1454,33 @@ class ProductListView extends StatelessWidget { initiallyExpanded: true, title: Text( "${vendorCategoryModel.title.toString()} (${controller.productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList().length})", - style: TextStyle(fontSize: 18, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 18, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), children: [ Obx( () => ListView.builder( - itemCount: controller.productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList().length, + itemCount: + controller.productList + .where( + (p0) => p0.categoryID == vendorCategoryModel.id, + ) + .toList() + .length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { - ProductModel productModel = controller.productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList()[index]; + ProductModel productModel = + controller.productList + .where( + (p0) => p0.categoryID == vendorCategoryModel.id, + ) + .toList()[index]; String price = "0.0"; String disPrice = "0.0"; @@ -885,24 +1489,61 @@ class ProductListView extends StatelessWidget { List selectedIndexArray = []; if (productModel.itemAttribute != null) { if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { + for (var element + in productModel.itemAttribute!.attributes!) { if (element.attributeOptions!.isNotEmpty) { - selectedVariants.add(productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString()); - selectedIndexVariants.add('${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}'); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedVariants.add( + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf(element)] + .attributeOptions![0] + .toString(), + ); + selectedIndexVariants.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { + if (productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .isNotEmpty) { price = Constant.productCommissionPrice( controller.vendorModel.value, - productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0', + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', ); disPrice = "0"; } } else { - price = Constant.productCommissionPrice(controller.vendorModel.value, productModel.price.toString()); - disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(controller.vendorModel.value, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.price.toString(), + ); + disPrice = + double.parse(productModel.disPrice.toString()) <= 0 + ? "0" + : Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.disPrice.toString(), + ); } return Padding( padding: const EdgeInsets.only(bottom: 20), @@ -915,16 +1556,30 @@ class ProductListView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Constant.sectionConstantModel!.isProductDetails == false + Constant + .sectionConstantModel! + .isProductDetails == + false ? SizedBox() : Row( children: [ - productModel.nonveg == true ? SvgPicture.asset("assets/icons/ic_nonveg.svg") : SvgPicture.asset("assets/icons/ic_veg.svg"), + productModel.nonveg == true + ? SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_veg.svg", + ), const SizedBox(width: 5), Text( - productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), + productModel.nonveg == true + ? "Non Veg.".tr() + : "Pure veg.".tr(), style: TextStyle( - color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, + color: + productModel.nonveg == true + ? AppThemeData.danger300 + : AppThemeData.success400, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, ), @@ -934,27 +1589,58 @@ class ProductListView extends StatelessWidget { const SizedBox(height: 5), Text( productModel.name.toString(), - style: TextStyle(fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), double.parse(disPrice) <= 0 ? Text( Constant.amountShow(amount: price), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ) : Row( children: [ Text( Constant.amountShow(amount: disPrice), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), const SizedBox(width: 5), Text( Constant.amountShow(amount: price), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, + decoration: + TextDecoration.lineThrough, + decorationColor: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, ), @@ -963,11 +1649,24 @@ class ProductListView extends StatelessWidget { ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: const ColorFilter.mode(AppThemeData.warning300, BlendMode.srcIn)), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: const ColorFilter.mode( + AppThemeData.warning300, + BlendMode.srcIn, + ), + ), const SizedBox(width: 5), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -976,7 +1675,10 @@ class ProductListView extends StatelessWidget { maxLines: 2, style: TextStyle( overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, ), @@ -987,13 +1689,24 @@ class ProductListView extends StatelessWidget { showDialog( context: context, builder: (BuildContext context) { - return infoDialog(controller, isDark, productModel); + return infoDialog( + controller, + isDark, + productModel, + ); }, ); }, child: Row( children: [ - Icon(Icons.info, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, size: 18), + Icon( + Icons.info, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + size: 18, + ), const SizedBox(width: 8), Text( "Info".tr(), @@ -1001,7 +1714,10 @@ class ProductListView extends StatelessWidget { style: TextStyle( overflow: TextOverflow.ellipsis, fontSize: 16, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, ), @@ -1013,15 +1729,29 @@ class ProductListView extends StatelessWidget { ), ), ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: productModel.photo.toString(), fit: BoxFit.cover, height: Responsive.height(16, context), width: Responsive.width(34, context)), + NetworkImageWidget( + imageUrl: productModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(16, context), + width: Responsive.width(34, context), + ), Container( height: Responsive.height(16, context), width: Responsive.width(34, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), Positioned( @@ -1029,159 +1759,381 @@ class ProductListView extends StatelessWidget { top: 10, child: InkWell( onTap: () async { - if (controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty) { - FavouriteItemModel favouriteModel = FavouriteItemModel( + if (controller.favouriteItemList + .where( + (p0) => + p0.productId == productModel.id, + ) + .isNotEmpty) { + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList + .removeWhere( + (item) => + item.productId == + productModel.id, + ); + await FireStoreUtils.removeFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.removeWhere((item) => item.productId == productModel.id); - await FireStoreUtils.removeFavouriteItem(favouriteModel); } else { - FavouriteItemModel favouriteModel = FavouriteItemModel( + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.add( + favouriteModel, ); - controller.favouriteItemList.add(favouriteModel); - await FireStoreUtils.setFavouriteItem(favouriteModel); + await FireStoreUtils.setFavouriteItem( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg"), + controller.favouriteItemList + .where( + (p0) => + p0.productId == + productModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), ), ), ), - controller.isOpen.value == false || Constant.userModel == null + controller.isOpen.value == false || + Constant.userModel == null ? const SizedBox() : Positioned( bottom: 10, left: 20, right: 20, child: - selectedVariants.isNotEmpty || (productModel.addOnsTitle != null && productModel.addOnsTitle!.isNotEmpty) + selectedVariants.isNotEmpty || + (productModel.addOnsTitle != + null && + productModel + .addOnsTitle! + .isNotEmpty) ? RoundedButtonFill( title: "Add".tr(), width: 10, height: 4, - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - textColor: AppThemeData.primary300, + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + textColor: + AppThemeData.primary300, onPress: () async { - controller.selectedVariants.clear(); - controller.selectedIndexVariants.clear(); - controller.selectedIndexArray.clear(); - controller.selectedAddOns.clear(); + controller.selectedVariants + .clear(); + controller + .selectedIndexVariants + .clear(); + controller.selectedIndexArray + .clear(); + controller.selectedAddOns + .clear(); controller.quantity.value = 1; - if (productModel.itemAttribute != null) { - if (productModel.itemAttribute!.attributes!.isNotEmpty) { - for (var element in productModel.itemAttribute!.attributes!) { - if (element.attributeOptions!.isNotEmpty) { + if (productModel + .itemAttribute != + null) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel + .itemAttribute! + .attributes!) { + if (element + .attributeOptions! + .isNotEmpty) { controller.selectedVariants.add( - productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString(), + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf( + element, + )] + .attributeOptions![0] + .toString(), ); - controller.selectedIndexVariants.add( - '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', - ); - controller.selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + controller + .selectedIndexVariants + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + controller + .selectedIndexArray + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - final bool productIsInList = cartItem.any( + final bool + productIsInList = cartItem.any( (product) => product.id == "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", ); if (productIsInList) { - CartProductModel element = cartItem.firstWhere( - (product) => - product.id == - "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", - ); - controller.quantity.value = element.quantity!; - if (element.extras != null) { - for (var element in element.extras!) { - controller.selectedAddOns.add(element); + CartProductModel element = + cartItem.firstWhere( + (product) => + product.id == + "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", + ); + controller + .quantity + .value = + element.quantity!; + if (element.extras != + null) { + for (var element + in element + .extras!) { + controller + .selectedAddOns + .add(element); } } } } else { - if (cartItem.where((product) => product.id == "${productModel.id}").isNotEmpty) { - CartProductModel element = cartItem.firstWhere((product) => product.id == "${productModel.id}"); - controller.quantity.value = element.quantity!; - if (element.extras != null) { - for (var element in element.extras!) { - controller.selectedAddOns.add(element); + if (cartItem + .where( + (product) => + product.id == + "${productModel.id}", + ) + .isNotEmpty) { + CartProductModel element = + cartItem.firstWhere( + (product) => + product.id == + "${productModel.id}", + ); + controller + .quantity + .value = + element.quantity!; + if (element.extras != + null) { + for (var element + in element + .extras!) { + controller + .selectedAddOns + .add(element); } } } } controller.update(); - controller.calculatePrice(productModel); - productDetailsBottomSheet(context, productModel); + controller.calculatePrice( + productModel, + ); + productDetailsBottomSheet( + context, + productModel, + ); }, ) : Obx( () => - cartItem.where((p0) => p0.id == productModel.id).isNotEmpty + cartItem + .where( + (p0) => + p0.id == + productModel + .id, + ) + .isNotEmpty ? Container( - width: Responsive.width(100, context), - height: Responsive.height(4, context), + width: + Responsive.width( + 100, + context, + ), + height: + Responsive.height( + 4, + context, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(200)), + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 200, + ), + ), ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ InkWell( onTap: () { controller.addToCart( - productModel: productModel, - price: price, - discountPrice: disPrice, - isIncrement: false, - quantity: cartItem.where((p0) => p0.id == productModel.id).first.quantity! - 1, + productModel: + productModel, + price: + price, + discountPrice: + disPrice, + isIncrement: + false, + quantity: + cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity! - + 1, ); }, - child: Icon(Icons.remove, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50), + child: Icon( + Icons.remove, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .greyDark50, + ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 14), + padding: + const EdgeInsets.symmetric( + horizontal: + 14, + ), child: Text( - cartItem.where((p0) => p0.id == productModel.id).first.quantity.toString(), - textAlign: TextAlign.start, + cartItem + .where( + (p0) => + p0.id == + productModel.id, + ) + .first + .quantity + .toString(), + textAlign: + TextAlign + .start, maxLines: 1, style: TextStyle( - fontSize: 16, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + fontSize: + 16, + overflow: + TextOverflow + .ellipsis, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight + .w500, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), InkWell( onTap: () { - if ((cartItem.where((p0) => p0.id == productModel.id).first.quantity ?? 0) < (productModel.quantity ?? 0) || - (productModel.quantity ?? 0) == -1) { + if ((cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity ?? + 0) < + (productModel.quantity ?? + 0) || + (productModel.quantity ?? + 0) == + -1) { controller.addToCart( - productModel: productModel, - price: price, - discountPrice: disPrice, - isIncrement: true, - quantity: cartItem.where((p0) => p0.id == productModel.id).first.quantity! + 1, + productModel: + productModel, + price: + price, + discountPrice: + disPrice, + isIncrement: + true, + quantity: + cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity! + + 1, ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } }, - child: Icon(Icons.add, color: isDark ? AppThemeData.grey50 : AppThemeData.greyDark50), + child: Icon( + Icons.add, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .greyDark50, + ), ), ], ), @@ -1190,13 +2142,39 @@ class ProductListView extends StatelessWidget { title: "Add".tr(), width: 10, height: 4, - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - textColor: AppThemeData.primary300, + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + textColor: + AppThemeData + .primary300, onPress: () async { - if (1 <= (productModel.quantity ?? 0) || (productModel.quantity ?? 0) == -1) { - controller.addToCart(productModel: productModel, price: price, discountPrice: disPrice, isIncrement: true, quantity: 1); + if (1 <= + (productModel + .quantity ?? + 0) || + (productModel + .quantity ?? + 0) == + -1) { + controller.addToCart( + productModel: + productModel, + price: price, + discountPrice: + disPrice, + isIncrement: + true, + quantity: 1, + ); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock" + .tr(), + ); } }, ), @@ -1218,12 +2196,17 @@ class ProductListView extends StatelessWidget { ); } - Future productDetailsBottomSheet(BuildContext context, ProductModel productModel) { + Future productDetailsBottomSheet( + BuildContext context, + ProductModel productModel, + ) { return showModalBottomSheet( context: context, isScrollControlled: true, isDismissible: true, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(30))), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (context) => FractionallySizedBox( @@ -1237,7 +2220,11 @@ class ProductListView extends StatelessWidget { ); } - Dialog infoDialog(RestaurantDetailsController controller, isDark, ProductModel productModel) { + Dialog infoDialog( + RestaurantDetailsController controller, + isDark, + ProductModel productModel, + ) { return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), insetPadding: const EdgeInsets.all(10), @@ -1260,17 +2247,33 @@ class ProductListView extends StatelessWidget { Text( "Product Information's".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, fontWeight: FontWeight.w700, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + fontWeight: FontWeight.w700, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), Text( productModel.description.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), ), - productModel.grams == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.grams == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1281,18 +2284,33 @@ class ProductListView extends StatelessWidget { child: Text( "Gram".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.grams.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.calories == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.calories == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1303,18 +2321,33 @@ class ProductListView extends StatelessWidget { child: Text( "Calories".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.calories.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.proteins == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.proteins == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1325,18 +2358,33 @@ class ProductListView extends StatelessWidget { child: Text( "Proteins".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.proteins.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.fats == 0 && Constant.sectionConstantModel!.isProductDetails == false + productModel.fats == 0 && + Constant.sectionConstantModel!.isProductDetails == false ? SizedBox.shrink() : Padding( padding: const EdgeInsets.only(bottom: 10), @@ -1347,19 +2395,34 @@ class ProductListView extends StatelessWidget { child: Text( "Fats".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), ), Text( productModel.fats.toString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), ), - productModel.productSpecification != null && productModel.productSpecification!.isNotEmpty + productModel.productSpecification != null && + productModel.productSpecification!.isNotEmpty ? Padding( padding: const EdgeInsets.only(top: 10), child: Column( @@ -1368,11 +2431,20 @@ class ProductListView extends StatelessWidget { Text( "Specification".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w700, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w700, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), SizedBox(height: 8), ListView.builder( - itemCount: productModel.productSpecification!.length, + itemCount: + productModel.productSpecification!.length, shrinkWrap: true, padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), @@ -1383,14 +2455,30 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - productModel.productSpecification!.keys.elementAt(index), + productModel.productSpecification!.keys + .elementAt(index), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.regular, + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 16, + ), ), Text( - productModel.productSpecification!.values.elementAt(index), + productModel.productSpecification!.values + .elementAt(index), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -1411,13 +2499,28 @@ class ProductListView extends StatelessWidget { Text( "Brand".tr(), textAlign: TextAlign.start, - style: TextStyle(fontWeight: FontWeight.w700, fontFamily: AppThemeData.bold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontWeight: FontWeight.w700, + fontFamily: AppThemeData.bold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), SizedBox(height: 5), Text( controller.getBrandName(productModel.brandId!), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + ), ), ], ), @@ -1454,7 +2557,8 @@ class ProductDetailsView extends StatelessWidget { init: RestaurantDetailsController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -1463,19 +2567,36 @@ class ProductDetailsView extends StatelessWidget { Container( color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ - NetworkImageWidget(imageUrl: productModel.photo.toString(), height: Responsive.height(11, context), width: Responsive.width(22, context), fit: BoxFit.cover), + NetworkImageWidget( + imageUrl: productModel.photo.toString(), + height: Responsive.height(11, context), + width: Responsive.width(22, context), + fit: BoxFit.cover, + ), Container( height: Responsive.height(11, context), width: Responsive.width(22, context), decoration: BoxDecoration( - gradient: LinearGradient(begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [Colors.black.withOpacity(0), const Color(0xFF111827)]), + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), ], @@ -1498,36 +2619,76 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), ), InkWell( onTap: () async { - if (controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty) { - FavouriteItemModel favouriteModel = FavouriteItemModel( + if (controller.favouriteItemList + .where( + (p0) => + p0.productId == productModel.id, + ) + .isNotEmpty) { + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList + .removeWhere( + (item) => + item.productId == + productModel.id, + ); + await FireStoreUtils.removeFavouriteItem( + favouriteModel, ); - controller.favouriteItemList.removeWhere((item) => item.productId == productModel.id); - await FireStoreUtils.removeFavouriteItem(favouriteModel); } else { - FavouriteItemModel favouriteModel = FavouriteItemModel( + FavouriteItemModel + favouriteModel = FavouriteItemModel( productId: productModel.id, - storeId: controller.vendorModel.value.id, - userId: FireStoreUtils.getCurrentUid(), + storeId: + controller.vendorModel.value.id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.add( + favouriteModel, ); - controller.favouriteItemList.add(favouriteModel); - await FireStoreUtils.setFavouriteItem(favouriteModel); + await FireStoreUtils.setFavouriteItem( + favouriteModel, + ); } }, child: Obx( () => - controller.favouriteItemList.where((p0) => p0.productId == productModel.id).isNotEmpty - ? SvgPicture.asset("assets/icons/ic_like_fill.svg") - : SvgPicture.asset("assets/icons/ic_like.svg", colorFilter: const ColorFilter.mode(AppThemeData.grey500, BlendMode.srcIn)), + controller.favouriteItemList + .where( + (p0) => + p0.productId == + productModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + colorFilter: + const ColorFilter.mode( + AppThemeData.grey500, + BlendMode.srcIn, + ), + ), ), ), ], @@ -1535,7 +2696,15 @@ class ProductDetailsView extends StatelessWidget { Text( productModel.description.toString(), textAlign: TextAlign.start, - style: TextStyle(fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), @@ -1545,7 +2714,8 @@ class ProductDetailsView extends StatelessWidget { ), ), const SizedBox(height: 10), - productModel.itemAttribute == null || productModel.itemAttribute!.attributes!.isEmpty + productModel.itemAttribute == null || + productModel.itemAttribute!.attributes!.isEmpty ? const SizedBox() : ListView.builder( itemCount: productModel.itemAttribute!.attributes!.length, @@ -1555,129 +2725,275 @@ class ProductDetailsView extends StatelessWidget { itemBuilder: (context, index) { String title = ""; for (var element in controller.attributesList) { - if (productModel.itemAttribute!.attributes![index].attributeId == element.id) { + if (productModel + .itemAttribute! + .attributes![index] + .attributeId == + element.id) { title = element.title.toString(); } } return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 5, + ), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - productModel.itemAttribute!.attributes![index].attributeOptions!.isNotEmpty + productModel + .itemAttribute! + .attributes![index] + .attributeOptions! + .isNotEmpty ? Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( title, style: TextStyle( fontSize: 16, overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, + fontFamily: + AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Text( - "Required • Select any 1 option".tr(), + "Required • Select any 1 option" + .tr(), style: TextStyle( fontSize: 12, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey500, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, ), ), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), + const Padding( + padding: EdgeInsets.symmetric( + vertical: 10, + ), + child: Divider(), + ), ], ) : Offstage(), Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + ), child: Wrap( spacing: 6.0, runSpacing: 6.0, children: - List.generate(productModel.itemAttribute!.attributes![index].attributeOptions!.length, (i) { - return InkWell( - onTap: () async { - if (controller.selectedIndexVariants.where((element) => element.contains('$index _')).isEmpty) { - controller.selectedVariants.insert(index, productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()); - controller.selectedIndexVariants.add('$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}'); - controller.selectedIndexArray.add('${index}_$i'); - } else { - controller.selectedIndexArray.remove( - '${index}_${productModel.itemAttribute!.attributes![index].attributeOptions?.indexOf(controller.selectedIndexVariants.where((element) => element.contains('$index _')).first.replaceAll('$index _', ''))}', - ); - controller.selectedVariants.removeAt(index); - controller.selectedIndexVariants.remove(controller.selectedIndexVariants.where((element) => element.contains('$index _')).first); - controller.selectedVariants.insert(index, productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()); - controller.selectedIndexVariants.add('$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}'); - controller.selectedIndexArray.add('${index}_$i'); - } + List.generate( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions! + .length, + (i) { + return InkWell( + onTap: () async { + if (controller + .selectedIndexVariants + .where( + (element) => + element.contains( + '$index _', + ), + ) + .isEmpty) { + controller.selectedVariants + .insert( + index, + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ); + controller + .selectedIndexVariants + .add( + '$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}', + ); + controller + .selectedIndexArray + .add('${index}_$i'); + } else { + controller + .selectedIndexArray + .remove( + '${index}_${productModel.itemAttribute!.attributes![index].attributeOptions?.indexOf(controller.selectedIndexVariants.where((element) => element.contains('$index _')).first.replaceAll('$index _', ''))}', + ); + controller.selectedVariants + .removeAt(index); + controller + .selectedIndexVariants + .remove( + controller + .selectedIndexVariants + .where( + ( + element, + ) => element + .contains( + '$index _', + ), + ) + .first, + ); + controller.selectedVariants + .insert( + index, + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ); + controller + .selectedIndexVariants + .add( + '$index _${productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()}', + ); + controller + .selectedIndexArray + .add('${index}_$i'); + } - final bool productIsInList = cartItem.any( - (product) => - product.id == - "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", - ); - if (productIsInList) { - CartProductModel element = cartItem.firstWhere( + final bool + productIsInList = cartItem.any( (product) => product.id == "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", ); - controller.quantity.value = element.quantity!; - } else { - controller.quantity.value = 1; - } + if (productIsInList) { + CartProductModel + element = cartItem.firstWhere( + (product) => + product.id == + "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", + ); + controller.quantity.value = + element.quantity!; + } else { + controller.quantity.value = + 1; + } - controller.update(); - controller.calculatePrice(productModel); - }, - child: Chip( - shape: const RoundedRectangleBorder(side: BorderSide(color: Colors.transparent), borderRadius: BorderRadius.all(Radius.circular(20))), - label: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - productModel.itemAttribute!.attributes![index].attributeOptions![i].toString(), - style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w500, - color: - controller.selectedVariants.contains(productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()) - ? Colors.white - : isDark - ? AppThemeData.greyDark800 - : AppThemeData.grey800, + controller.update(); + controller.calculatePrice( + productModel, + ); + }, + child: Chip( + shape: + const RoundedRectangleBorder( + side: BorderSide( + color: + Colors + .transparent, + ), + borderRadius: + BorderRadius.all( + Radius.circular( + 20, + ), + ), ), - ), - ], + label: Row( + mainAxisSize: + MainAxisSize.min, + children: [ + Text( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + style: TextStyle( + overflow: + TextOverflow + .ellipsis, + fontFamily: + AppThemeData + .medium, + fontWeight: + FontWeight.w500, + color: + controller.selectedVariants.contains( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ) + ? Colors.white + : isDark + ? AppThemeData + .greyDark800 + : AppThemeData + .grey800, + ), + ), + ], + ), + backgroundColor: + controller.selectedVariants.contains( + productModel + .itemAttribute! + .attributes![index] + .attributeOptions![i] + .toString(), + ) + ? AppThemeData + .primary300 + : isDark + ? AppThemeData.grey800 + : AppThemeData + .grey100, + elevation: 6.0, + padding: const EdgeInsets.all( + 8.0, + ), ), - backgroundColor: - controller.selectedVariants.contains(productModel.itemAttribute!.attributes![index].attributeOptions![i].toString()) - ? AppThemeData.primary300 - : isDark - ? AppThemeData.grey800 - : AppThemeData.grey100, - elevation: 6.0, - padding: const EdgeInsets.all(8.0), - ), - ); - }).toList(), + ); + }, + ).toList(), ), ), ], @@ -1687,19 +3003,33 @@ class ProductDetailsView extends StatelessWidget { ); }, ), - productModel.addOnsTitle == null || productModel.addOnsTitle!.isEmpty + productModel.addOnsTitle == null || + productModel.addOnsTitle!.isEmpty ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 5, + ), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), + padding: const EdgeInsets.symmetric( + horizontal: 12, + ), child: Text( "Addons".tr(), style: TextStyle( @@ -1707,21 +3037,32 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10), + child: Divider(), + ), ListView.builder( itemCount: productModel.addOnsTitle!.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - String title = productModel.addOnsTitle![index]; - String price = productModel.addOnsPrice![index]; + String title = + productModel.addOnsTitle![index]; + String price = + productModel.addOnsPrice![index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( children: [ Expanded( @@ -1734,12 +3075,21 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), Text( - Constant.amountShow(amount: Constant.productCommissionPrice(controller.vendorModel.value, price)), + Constant.amountShow( + amount: + Constant.productCommissionPrice( + controller.vendorModel.value, + price, + ), + ), textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -1747,7 +3097,10 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), const SizedBox(width: 10), @@ -1756,14 +3109,18 @@ class ProductDetailsView extends StatelessWidget { height: 24.0, width: 24.0, child: Checkbox( - value: controller.selectedAddOns.contains(title), - activeColor: AppThemeData.primary300, + value: controller.selectedAddOns + .contains(title), + activeColor: + AppThemeData.primary300, onChanged: (value) { if (value != null) { if (value == true) { - controller.selectedAddOns.add(title); + controller.selectedAddOns + .add(title); } else { - controller.selectedAddOns.remove(title); + controller.selectedAddOns + .remove(title); } controller.update(); } @@ -1795,7 +3152,15 @@ class ProductDetailsView extends StatelessWidget { child: Container( width: Responsive.width(100, context), height: Responsive.height(5.5, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(200))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(200), + ), + ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -1807,7 +3172,13 @@ class ProductDetailsView extends StatelessWidget { controller.update(); } }, - child: Icon(Icons.remove, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.remove, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -1820,32 +3191,58 @@ class ProductDetailsView extends StatelessWidget { overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, ), ), ), InkWell( onTap: () { if (productModel.itemAttribute == null) { - if (controller.quantity.value < (productModel.quantity ?? 0) || (productModel.quantity ?? 0) == -1) { + if (controller.quantity.value < + (productModel.quantity ?? 0) || + (productModel.quantity ?? 0) == -1) { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock".tr(), + ); } } else { int totalQuantity = int.parse( - productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantQuantity.toString(), + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == + controller.selectedVariants.join( + '-', + ), + ) + .first + .variantQuantity + .toString(), ); - if (controller.quantity.value < totalQuantity || totalQuantity == -1) { + if (controller.quantity.value < totalQuantity || + totalQuantity == -1) { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast("Out of stock".tr()); + ShowToastDialog.showToast( + "Out of stock".tr(), + ); } } }, - child: Icon(Icons.add, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + child: Icon( + Icons.add, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ], ), @@ -1855,7 +3252,9 @@ class ProductDetailsView extends StatelessWidget { Expanded( flex: 2, child: RoundedButtonFill( - title: "${'Add item'.tr()} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}".tr(), + title: + "${'Add item'.tr()} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}" + .tr(), height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -1864,36 +3263,94 @@ class ProductDetailsView extends StatelessWidget { if (productModel.itemAttribute == null) { await controller.addToCart( productModel: productModel, - price: Constant.productCommissionPrice(controller.vendorModel.value, productModel.price.toString()), - discountPrice: double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(controller.vendorModel.value, productModel.disPrice.toString()), + price: Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.price.toString(), + ), + discountPrice: + double.parse( + productModel.disPrice.toString(), + ) <= + 0 + ? "0" + : Constant.productCommissionPrice( + controller.vendorModel.value, + productModel.disPrice.toString(), + ), isIncrement: true, quantity: controller.quantity.value, ); } else { String variantPrice = "0"; - if (productModel.itemAttribute!.variants!.any((e) => e.variantSku == controller.selectedVariants.join('-'))) { + if (productModel.itemAttribute!.variants!.any( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + )) { variantPrice = Constant.productCommissionPrice( controller.vendorModel.value, - productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantPrice ?? '0', + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join( + '-', + ), + ) + .variantPrice ?? + '0', ); } Map mapData = {}; - for (var element in productModel.itemAttribute!.attributes!) { + for (var element + in productModel.itemAttribute!.attributes!) { mapData.addEntries([ MapEntry( - controller.attributesList.firstWhere((e) => e.id == element.attributeId).title.toString(), - controller.selectedVariants[productModel.itemAttribute!.attributes!.indexOf(element)], + controller.attributesList + .firstWhere( + (e) => e.id == element.attributeId, + ) + .title + .toString(), + controller.selectedVariants[productModel + .itemAttribute! + .attributes! + .indexOf(element)], ), ]); } VariantInfo variantInfo = VariantInfo( - variantPrice: productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantPrice ?? '0', + variantPrice: + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + ) + .variantPrice ?? + '0', variantSku: controller.selectedVariants.join('-'), variantOptions: mapData, - variantImage: productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantImage ?? '', - variantId: productModel.itemAttribute!.variants!.firstWhere((e) => e.variantSku == controller.selectedVariants.join('-')).variantId ?? '0', + variantImage: + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + ) + .variantImage ?? + '', + variantId: + productModel.itemAttribute!.variants! + .firstWhere( + (e) => + e.variantSku == + controller.selectedVariants.join('-'), + ) + .variantId ?? + '0', ); await controller.addToCart( diff --git a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart index 3cbab3d..27fa696 100644 --- a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart @@ -11,8 +11,7 @@ import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../chat_screens/full_screen_image_viewer.dart'; @@ -27,12 +26,22 @@ class ReviewListScreen extends StatelessWidget { init: ReviewListController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Reviews".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Reviews".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: controller.isLoading.value @@ -40,7 +49,10 @@ class ReviewListScreen extends StatelessWidget { : controller.ratingList.isEmpty ? Constant.showEmptyView(message: "No Review found".tr()) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.builder( itemCount: controller.ratingList.length, itemBuilder: (context, index) { @@ -49,21 +61,54 @@ class ReviewListScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 5), child: Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), borderRadius: BorderRadius.circular(12)), + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), + borderRadius: BorderRadius.circular(12), + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(ratingModel.uname.toString(), style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 18, fontFamily: AppThemeData.semiBold)), + Text( + ratingModel.uname.toString(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 18, + fontFamily: AppThemeData.semiBold, + ), + ), Visibility( visible: ratingModel.productId != null, child: FutureBuilder( - future: FireStoreUtils.fireStore.collection(CollectionName.vendorProducts).doc(ratingModel.productId?.split('~').first).get(), + future: + FireStoreUtils.fireStore + .collection( + CollectionName.vendorProducts, + ) + .doc( + ratingModel.productId + ?.split('~') + .first, + ) + .get(), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return const Text(''); } else { if (snapshot.hasError) { @@ -71,10 +116,21 @@ class ReviewListScreen extends StatelessWidget { } else if (snapshot.data == null) { return const Text(''); } else if (snapshot.data != null) { - ProductModel model = ProductModel.fromJson(snapshot.data!.data()!); + ProductModel model = + ProductModel.fromJson( + snapshot.data!.data()!, + ); return Text( '${'Rate for'.tr()} - ${model.name ?? ''}', - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 14, fontFamily: AppThemeData.semiBold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 14, + fontFamily: + AppThemeData.semiBold, + ), ); } else { return const Text(''); @@ -91,50 +147,101 @@ class ReviewListScreen extends StatelessWidget { direction: Axis.horizontal, itemCount: 5, itemSize: 18, - itemPadding: const EdgeInsets.symmetric(horizontal: 2.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), + itemPadding: const EdgeInsets.symmetric( + horizontal: 2.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: AppThemeData.warning300, + ), unratedColor: AppThemeData.grey400, onRatingUpdate: (double rate) {}, ), const SizedBox(height: 5), Visibility( - visible: ratingModel.comment != '' && ratingModel.comment != null, + visible: + ratingModel.comment != '' && + ratingModel.comment != null, child: Text( ratingModel.comment.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontFamily: AppThemeData.medium), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontSize: 16, + fontFamily: AppThemeData.medium, + ), ), ), const SizedBox(height: 5), Visibility( - visible: ratingModel.reviewAttributes != null, + visible: + ratingModel.reviewAttributes != null, child: ListView.builder( - itemCount: ratingModel.reviewAttributes!.length, + itemCount: + ratingModel.reviewAttributes!.length, shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), + physics: + const NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (context, index) { - String key = ratingModel.reviewAttributes!.keys.elementAt(index); - dynamic value = ratingModel.reviewAttributes![key]; + String key = ratingModel + .reviewAttributes! + .keys + .elementAt(index); + dynamic value = + ratingModel.reviewAttributes![key]; return Padding( - padding: const EdgeInsets.symmetric(vertical: 2), + padding: const EdgeInsets.symmetric( + vertical: 2, + ), child: Row( children: [ FutureBuilder( - future: FireStoreUtils.fireStore.collection(CollectionName.reviewAttributes).doc(key).get(), + future: + FireStoreUtils.fireStore + .collection( + CollectionName + .reviewAttributes, + ) + .doc(key) + .get(), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot + .connectionState == + ConnectionState.waiting) { return const Text(''); } else { if (snapshot.hasError) { return const Text(''); - } else if (snapshot.data == null) { + } else if (snapshot.data == + null) { return const Text(''); } else { - ReviewAttributeModel model = ReviewAttributeModel.fromJson(snapshot.data!.data()!); + ReviewAttributeModel + model = + ReviewAttributeModel.fromJson( + snapshot.data! + .data()!, + ); return Expanded( child: Text( - model.title.toString(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 16, fontFamily: AppThemeData.semiBold), + model.title + .toString(), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontSize: 16, + fontFamily: + AppThemeData + .semiBold, + ), ), ); } @@ -143,15 +250,29 @@ class ReviewListScreen extends StatelessWidget { ), RatingBar.builder( ignoreGestures: true, - initialRating: value == null ? 0.0 : value ?? 0.0, + initialRating: + value == null + ? 0.0 + : value ?? 0.0, minRating: 1, direction: Axis.horizontal, itemCount: 5, itemSize: 15, - unratedColor: AppThemeData.grey400, - itemPadding: const EdgeInsets.symmetric(horizontal: 2.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: AppThemeData.warning300), - onRatingUpdate: (double rate) {}, + unratedColor: + AppThemeData.grey400, + itemPadding: + const EdgeInsets.symmetric( + horizontal: 2.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: + AppThemeData + .warning300, + ), + onRatingUpdate: + (double rate) {}, ), ], ), @@ -169,16 +290,33 @@ class ReviewListScreen extends StatelessWidget { itemBuilder: (context, index) { return InkWell( onTap: () { - Get.to(FullScreenImageViewer(imageUrl: ratingModel.photos?[index])); + Get.to( + FullScreenImageViewer( + imageUrl: + ratingModel + .photos?[index], + ), + ); }, child: Padding( - padding: const EdgeInsets.all(6.0), + padding: const EdgeInsets.all( + 6.0, + ), child: ClipRRect( - borderRadius: BorderRadius.circular(10), + borderRadius: + BorderRadius.circular(10), child: NetworkImageWidget( - imageUrl: ratingModel.photos?[index], - height: Responsive.height(9, context), - width: Responsive.height(8, context), + imageUrl: + ratingModel + .photos?[index], + height: Responsive.height( + 9, + context, + ), + width: Responsive.height( + 8, + context, + ), fit: BoxFit.fill, ), ), @@ -189,8 +327,17 @@ class ReviewListScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - Constant.timestampToDateTime(ratingModel.createdAt!), - style: TextStyle(color: isDark ? AppThemeData.grey300 : AppThemeData.grey600, fontSize: 14, fontFamily: AppThemeData.medium), + Constant.timestampToDateTime( + ratingModel.createdAt!, + ), + style: TextStyle( + color: + isDark + ? AppThemeData.grey300 + : AppThemeData.grey600, + fontSize: 14, + fontFamily: AppThemeData.medium, + ), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart index 8d13806..2a63623 100644 --- a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart +++ b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart @@ -3,7 +3,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:qr_code_dart_scan/qr_code_dart_scan.dart'; import '../../../controllers/theme_controller.dart'; @@ -24,8 +24,17 @@ class ScanQrCodeScreen extends StatelessWidget { appBar: AppBar( centerTitle: false, titleSpacing: 0, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - title: Text("Scan QR Code".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + title: Text( + "Scan QR Code".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: QRCodeDartScanView( // enable scan invert qr code ( default = false) @@ -35,15 +44,21 @@ class ScanQrCodeScreen extends StatelessWidget { Get.back(); ShowToastDialog.showLoader("Please wait...".tr()); if (controller.allNearestRestaurant.isNotEmpty) { - if (controller.allNearestRestaurant.where((vendor) => vendor.id == result.text).isEmpty) { + if (controller.allNearestRestaurant + .where((vendor) => vendor.id == result.text) + .isEmpty) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Store is not available".tr()); return; } - VendorModel storeModel = controller.allNearestRestaurant.firstWhere((vendor) => vendor.id == result.text); + VendorModel storeModel = controller.allNearestRestaurant + .firstWhere((vendor) => vendor.id == result.text); ShowToastDialog.closeLoader(); Get.back(); - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": storeModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": storeModel}, + ); } else { Get.back(); ShowToastDialog.showToast("Store is not available".tr()); diff --git a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart index c7d6acd..0968a8b 100644 --- a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart +++ b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart @@ -10,8 +10,7 @@ import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -28,21 +27,40 @@ class SearchScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( - Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? "Find your favorite products and nearby stores" : "Search Item & Store".tr(), + Constant.sectionConstantModel?.name?.toLowerCase().contains( + 'restaurants', + ) == + true + ? "Find your favorite products and nearby stores" + : "Search Item & Store".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), bottom: PreferredSize( preferredSize: const Size.fromHeight(55), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: TextFieldWidget( - hintText: Constant.sectionConstantModel?.name?.toLowerCase().contains('restaurants') == true ? 'Find your favorite products and nearby stores'.tr() : 'Search the store and item'.tr(), - prefix: Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg")), + hintText: + Constant.sectionConstantModel?.name + ?.toLowerCase() + .contains('restaurants') == + true + ? 'Find your favorite products and nearby stores'.tr() + : 'Search the store and item'.tr(), + prefix: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: SvgPicture.asset("assets/icons/ic_search.svg"), + ), controller: null, onchange: (value) { controller.onSearchTextChanged(value); @@ -55,7 +73,10 @@ class SearchScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -68,9 +89,19 @@ class SearchScreen extends StatelessWidget { Text( "Store".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10), + child: Divider(), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), ], ), ListView.builder( @@ -78,33 +109,74 @@ class SearchScreen extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemCount: controller.vendorSearchList.length, itemBuilder: (context, index) { - VendorModel vendorModel = controller.vendorSearchList[index]; + VendorModel vendorModel = + controller.vendorSearchList[index]; return InkWell( onTap: () { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": vendorModel}); + Get.to( + const RestaurantDetailsScreen(), + arguments: {"vendorModel": vendorModel}, + ); }, child: Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Stack( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)), + borderRadius: + const BorderRadius.only( + topLeft: Radius.circular( + 16, + ), + topRight: Radius.circular( + 16, + ), + ), child: Stack( children: [ - RestaurantImageView(vendorModel: vendorModel), + RestaurantImageView( + vendorModel: vendorModel, + ), Container( - height: Responsive.height(20, context), - width: Responsive.width(100, context), + height: Responsive.height( + 20, + context, + ), + width: Responsive.width( + 100, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black + .withOpacity(0), + const Color( + 0xFF111827, + ), + ], ), ), ), @@ -112,53 +184,124 @@ class SearchScreen extends StatelessWidget { ), ), Transform.translate( - offset: Offset(Responsive.width(-3, context), Responsive.height(17.5, context)), + offset: Offset( + Responsive.width(-3, context), + Responsive.height( + 17.5, + context, + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, children: [ Visibility( - visible: (vendorModel.isSelfDelivery == true && Constant.isSelfDeliveryFeature == true), + visible: + (vendorModel.isSelfDelivery == + true && + Constant.isSelfDeliveryFeature == + true), child: Row( children: [ Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: BoxDecoration( - color: AppThemeData.success300, - borderRadius: BorderRadius.circular(120), // Optional + color: + AppThemeData + .success300, + borderRadius: + BorderRadius.circular( + 120, + ), // Optional ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_free_delivery.svg"), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_free_delivery.svg", + ), + const SizedBox( + width: 5, + ), Text( - "Free Delivery".tr(), - style: TextStyle(fontSize: 14, color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600), + "Free Delivery" + .tr(), + style: TextStyle( + fontSize: 14, + color: + AppThemeData + .success300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, + ), ), ], ), ), - const SizedBox(width: 6), + const SizedBox( + width: 6, + ), ], ), ), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.primary600 : AppThemeData.primary50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .primary600 + : AppThemeData + .primary50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .primary300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount!.toStringAsFixed(0), reviewSum: vendorModel.reviewsSum.toString())} (${vendorModel.reviewsCount!.toStringAsFixed(0)})", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -166,22 +309,54 @@ class SearchScreen extends StatelessWidget { ), const SizedBox(width: 6), Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 7, + ), decoration: ShapeDecoration( - color: isDark ? AppThemeData.ecommerce600 : AppThemeData.ecommerce50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(120)), + color: + isDark + ? AppThemeData + .ecommerce600 + : AppThemeData + .ecommerce50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 120, + ), + ), ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_map_distance.svg", colorFilter: ColorFilter.mode(AppThemeData.ecommerce300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_map_distance.svg", + colorFilter: + ColorFilter.mode( + AppThemeData + .ecommerce300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.getDistance(lat1: vendorModel.latitude.toString(), lng1: vendorModel.longitude.toString(), lat2: Constant.selectedLocation.location!.latitude.toString(), lng2: Constant.selectedLocation.location!.longitude.toString())} ${Constant.distanceType}", style: TextStyle( fontSize: 14, - color: isDark ? AppThemeData.ecommerce300 : AppThemeData.ecommerce300, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .ecommerce300 + : AppThemeData + .ecommerce300, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), ], @@ -194,9 +369,12 @@ class SearchScreen extends StatelessWidget { ), const SizedBox(height: 15), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( vendorModel.title.toString(), @@ -204,9 +382,15 @@ class SearchScreen extends StatelessWidget { maxLines: 1, style: TextStyle( fontSize: 18, - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.semiBold, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.semiBold, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData + .grey900, ), ), Text( @@ -214,10 +398,16 @@ class SearchScreen extends StatelessWidget { textAlign: TextAlign.start, maxLines: 1, style: TextStyle( - overflow: TextOverflow.ellipsis, - fontFamily: AppThemeData.medium, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, fontWeight: FontWeight.w500, - color: isDark ? AppThemeData.grey400 : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey400, ), ), ], @@ -239,9 +429,19 @@ class SearchScreen extends StatelessWidget { Text( "Items".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10), + child: Divider(), ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10), child: Divider()), ], ), ListView.builder( @@ -249,15 +449,19 @@ class SearchScreen extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemCount: controller.productSearchList.length, itemBuilder: (context, index) { - ProductModel productModel = controller.productSearchList[index]; + ProductModel productModel = + controller.productSearchList[index]; return FutureBuilder( future: getPrice(productModel), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == + ConnectionState.waiting) { return Constant.loader(); } else { if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); + return Center( + child: Text('Error: ${snapshot.error}'), + ); } else if (snapshot.data == null) { return const SizedBox(); } else { @@ -266,36 +470,79 @@ class SearchScreen extends StatelessWidget { String disPrice = map['disPrice']; return InkWell( onTap: () async { - await FireStoreUtils.getVendorById(productModel.vendorID.toString()).then((value) { + await FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ).then((value) { if (value != null) { - Get.to(const RestaurantDetailsScreen(), arguments: {"vendorModel": value}); + Get.to( + const RestaurantDetailsScreen(), + arguments: { + "vendorModel": value, + }, + ); } }); }, child: Padding( - padding: const EdgeInsets.only(bottom: 20), + padding: const EdgeInsets.only( + bottom: 20, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Expanded( child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Constant.sectionConstantModel!.isProductDetails == false + Constant + .sectionConstantModel! + .isProductDetails == + false ? SizedBox() - : productModel.nonveg == true || productModel.veg == true + : productModel.nonveg == + true || + productModel.veg == + true ? Row( children: [ - productModel.nonveg == true ? SvgPicture.asset("assets/icons/ic_nonveg.svg") : SvgPicture.asset("assets/icons/ic_veg.svg"), - const SizedBox(width: 5), + productModel.nonveg == + true + ? SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_veg.svg", + ), + const SizedBox( + width: 5, + ), Text( - productModel.nonveg == true ? "Non Veg.".tr() : "Pure veg.".tr(), + productModel.nonveg == + true + ? "Non Veg." + .tr() + : "Pure veg." + .tr(), style: TextStyle( - color: productModel.nonveg == true ? AppThemeData.danger300 : AppThemeData.success400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + productModel.nonveg == + true + ? AppThemeData + .danger300 + : AppThemeData + .success400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], @@ -303,56 +550,129 @@ class SearchScreen extends StatelessWidget { : SizedBox(), const SizedBox(height: 5), Text( - productModel.name.toString(), + productModel.name + .toString(), style: TextStyle( fontSize: 18, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ), double.parse(disPrice) <= 0 ? Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: price, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight.w600, ), ) : Row( children: [ Text( - Constant.amountShow(amount: disPrice), + Constant.amountShow( + amount: + disPrice, + ), style: TextStyle( fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), - const SizedBox(width: 5), + const SizedBox( + width: 5, + ), Text( - Constant.amountShow(amount: price), + Constant.amountShow( + amount: price, + ), style: TextStyle( fontSize: 14, - decoration: TextDecoration.lineThrough, - decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - color: isDark ? AppThemeData.grey500 : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + decoration: + TextDecoration + .lineThrough, + decorationColor: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + color: + isDark + ? AppThemeData + .grey500 + : AppThemeData + .grey400, + fontFamily: + AppThemeData + .semiBold, + fontWeight: + FontWeight + .w600, ), ), ], ), Row( children: [ - SvgPicture.asset("assets/icons/ic_star.svg", colorFilter: const ColorFilter.mode(AppThemeData.warning300, BlendMode.srcIn)), - const SizedBox(width: 5), + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: + const ColorFilter.mode( + AppThemeData + .warning300, + BlendMode.srcIn, + ), + ), + const SizedBox( + width: 5, + ), Text( "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight.w500, + ), ), ], ), @@ -360,33 +680,73 @@ class SearchScreen extends StatelessWidget { "${productModel.description}", maxLines: 2, style: TextStyle( - overflow: TextOverflow.ellipsis, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, + overflow: + TextOverflow + .ellipsis, + color: + isDark + ? AppThemeData + .grey50 + : AppThemeData + .grey900, + fontFamily: + AppThemeData + .regular, + fontWeight: + FontWeight.w400, ), ), ], ), ), ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(16)), + borderRadius: + const BorderRadius.all( + Radius.circular(16), + ), child: Stack( children: [ NetworkImageWidget( - imageUrl: productModel.photo.toString(), + imageUrl: + productModel.photo + .toString(), fit: BoxFit.cover, - height: Responsive.height(16, context), - width: Responsive.width(34, context), + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), ), Container( - height: Responsive.height(16, context), - width: Responsive.width(34, context), + height: Responsive.height( + 16, + context, + ), + width: Responsive.width( + 34, + context, + ), decoration: BoxDecoration( gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [Colors.black.withOpacity(0), const Color(0xFF111827)], + begin: + const Alignment( + -0.00, + -1.00, + ), + end: const Alignment( + 0, + 1, + ), + colors: [ + Colors.black + .withOpacity(0), + const Color( + 0xFF111827, + ), + ], ), ), ), @@ -423,24 +783,56 @@ class SearchScreen extends StatelessWidget { print(productModel.price); print(productModel.disPrice); - VendorModel? vendorModel = await FireStoreUtils.getVendorById(productModel.vendorID.toString()); + VendorModel? vendorModel = await FireStoreUtils.getVendorById( + productModel.vendorID.toString(), + ); if (productModel.itemAttribute != null) { if (productModel.itemAttribute!.attributes!.isNotEmpty) { for (var element in productModel.itemAttribute!.attributes!) { if (element.attributeOptions!.isNotEmpty) { - selectedVariants.add(productModel.itemAttribute!.attributes![productModel.itemAttribute!.attributes!.indexOf(element)].attributeOptions![0].toString()); - selectedIndexVariants.add('${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}'); - selectedIndexArray.add('${productModel.itemAttribute!.attributes!.indexOf(element)}_0'); + selectedVariants.add( + productModel + .itemAttribute! + .attributes![productModel.itemAttribute!.attributes!.indexOf( + element, + )] + .attributeOptions![0] + .toString(), + ); + selectedIndexVariants.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + selectedIndexArray.add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); } } } - if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) { - price = Constant.productCommissionPrice(vendorModel!, productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0'); + if (productModel.itemAttribute!.variants! + .where((element) => element.variantSku == selectedVariants.join('-')) + .isNotEmpty) { + price = Constant.productCommissionPrice( + vendorModel!, + productModel.itemAttribute!.variants! + .where( + (element) => + element.variantSku == selectedVariants.join('-'), + ) + .first + .variantPrice ?? + '0', + ); disPrice = Constant.productCommissionPrice(vendorModel, '0'); } } else { - price = Constant.productCommissionPrice(vendorModel!, productModel.price.toString()); - disPrice = Constant.productCommissionPrice(vendorModel, productModel.disPrice.toString()); + price = Constant.productCommissionPrice( + vendorModel!, + productModel.price.toString(), + ); + disPrice = Constant.productCommissionPrice( + vendorModel, + productModel.disPrice.toString(), + ); } return {'price': price, 'disPrice': disPrice}; diff --git a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart index a23577b..f1ded87 100644 --- a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart +++ b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:flutter_html/flutter_html.dart'; import '../../../controllers/theme_controller.dart'; @@ -26,18 +26,39 @@ class TermsAndConditionScreen extends StatelessWidget { onTap: () { Get.back(); }, - child: Icon(Icons.chevron_left_outlined, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + child: Icon( + Icons.chevron_left_outlined, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), title: Text( type == "privacy" ? "Privacy Policy".tr() : "Terms & Conditions".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.bold, fontSize: 18), + style: TextStyle( + color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, + fontFamily: AppThemeData.bold, + fontSize: 18, + ), ), elevation: 0, - bottom: PreferredSize(preferredSize: const Size.fromHeight(4.0), child: Container(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, height: 4.0)), + bottom: PreferredSize( + preferredSize: const Size.fromHeight(4.0), + child: Container( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + height: 4.0, + ), + ), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), - child: SingleChildScrollView(child: Html(shrinkWrap: true, data: type == "privacy" ? Constant.privacyPolicy : Constant.termsAndConditions)), + child: SingleChildScrollView( + child: Html( + shrinkWrap: true, + data: + type == "privacy" + ? Constant.privacyPolicy + : Constant.termsAndConditions, + ), + ), ), ); } diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart index a59d6ee..6178b1d 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/text_field_widget.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +25,19 @@ class PaymentListScreen extends StatelessWidget { builder: (controller) { return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Top up Wallet".tr(), style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500)), + title: Text( + "Top up Wallet".tr(), + style: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + ), + ), ), body: SingleChildScrollView( child: Column( @@ -40,40 +49,152 @@ class PaymentListScreen extends StatelessWidget { title: 'Amount'.tr(), hintText: 'Enter Amount'.tr(), controller: controller.topUpAmountController.value, - textInputType: const TextInputType.numberWithOptions(decimal: true, signed: true), - prefix: Padding(padding: const EdgeInsets.all(12.0), child: Text(Constant.currencyModel!.symbol.toString(), style: const TextStyle(fontSize: 20, color: AppThemeData.grey800))), - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]'))], + textInputType: const TextInputType.numberWithOptions( + decimal: true, + signed: true, + ), + prefix: Padding( + padding: const EdgeInsets.all(12.0), + child: Text( + Constant.currencyModel!.symbol.toString(), + style: const TextStyle( + fontSize: 20, + color: AppThemeData.grey800, + ), + ), + ), + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + ], ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Text( "Select Top up Options".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Container( - decoration: BoxDecoration(borderRadius: const BorderRadius.all(Radius.circular(20)), color: isDark ? AppThemeData.grey900 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(20)), + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + ), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), + ), + Visibility( + visible: + controller.payStackModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), - Visibility(visible: controller.orangeMoneyModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png")), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -96,40 +217,101 @@ class PaymentListScreen extends StatelessWidget { if (controller.topUpAmountController.value.text.isEmpty) { ShowToastDialog.showToast("Please Enter Amount".tr()); } else { - if (double.parse(controller.topUpAmountController.value.text) >= double.parse(Constant.minimumAmountToDeposit.toString())) { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.topUpAmountController.value.text, context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.topUpAmountController.value.text); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.topUpAmountController.value.text), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.topUpAmountController.value.text, orderId: result.id); - } - }); + if (double.parse( + controller.topUpAmountController.value.text, + ) >= + double.parse( + Constant.minimumAmountToDeposit.toString(), + )) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.topUpAmountController.value.text, + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.topUpAmountController.value.text, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.topUpAmountController.value.text, + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: + controller + .topUpAmountController + .value + .text, + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } } else { - ShowToastDialog.showToast("${'Please Enter minimum amount of'.tr()} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}"); + ShowToastDialog.showToast( + "${'Please Enter minimum amount of'.tr()} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}", + ); } } }, @@ -141,7 +323,12 @@ class PaymentListScreen extends StatelessWidget { ); } - Obx cardDecoration(WalletController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + WalletController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), @@ -154,22 +341,35 @@ class PaymentListScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: Image.asset(image), + ), ), const SizedBox(width: 10), Expanded( child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart index 959eb23..ffa4627 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart @@ -23,7 +23,7 @@ import '../../rental_service/rental_order_details_screen.dart'; import '../order_list_screen/order_details_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class WalletScreen extends StatelessWidget { const WalletScreen({super.key}); @@ -36,7 +36,8 @@ class WalletScreen extends StatelessWidget { init: WalletController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, body: controller.isLoading.value ? Constant.loader() @@ -49,12 +50,30 @@ class WalletScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -71,7 +90,9 @@ class WalletScreen extends StatelessWidget { ), ) : Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top), + padding: EdgeInsets.only( + top: MediaQuery.of(context).viewPadding.top, + ), child: Column( children: [ Column( @@ -79,20 +100,39 @@ class WalletScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Row( children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "My Wallet".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), ), Text( - "Keep track of your balance, transactions, and payment methods all in one place.".tr(), - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), + "Keep track of your balance, transactions, and payment methods all in one place." + .tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), ), ], ), @@ -102,34 +142,66 @@ class WalletScreen extends StatelessWidget { ), const SizedBox(height: 20), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), child: Container( decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20)), - image: DecorationImage(image: AssetImage("assets/images/wallet.png"), fit: BoxFit.fill), + borderRadius: BorderRadius.all( + Radius.circular(20), + ), + image: DecorationImage( + image: AssetImage( + "assets/images/wallet.png", + ), + fit: BoxFit.fill, + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Column( children: [ Text( "My Wallet".tr(), maxLines: 1, style: TextStyle( - color: isDark ? AppThemeData.primary100 : AppThemeData.primary100, + color: + isDark + ? AppThemeData.primary100 + : AppThemeData.primary100, fontSize: 16, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.regular, ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller + .userModel + .value + .walletAmount + .toString(), + ), maxLines: 1, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey50, fontSize: 40, overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + fontSize: 40, + overflow: TextOverflow.ellipsis, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), Padding( - padding: const EdgeInsets.symmetric(horizontal: 80), + padding: const EdgeInsets.symmetric( + horizontal: 80, + ), child: RoundedButtonFill( title: "Top up".tr(), color: AppThemeData.warning300, @@ -149,15 +221,30 @@ class WalletScreen extends StatelessWidget { Expanded( child: controller.walletTransactionList.isEmpty - ? Constant.showEmptyView(message: "Transaction not found".tr()) + ? Constant.showEmptyView( + message: "Transaction not found".tr(), + ) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.builder( padding: EdgeInsets.zero, - itemCount: controller.walletTransactionList.length, + itemCount: + controller + .walletTransactionList + .length, itemBuilder: (context, index) { - WalletTransactionModel walletTractionModel = controller.walletTransactionList[index]; - return transactionCard(controller, isDark, walletTractionModel); + WalletTransactionModel + walletTractionModel = + controller + .walletTransactionList[index]; + return transactionCard( + controller, + isDark, + walletTractionModel, + ); }, ), ), @@ -170,32 +257,54 @@ class WalletScreen extends StatelessWidget { ); } - Column transactionCard(WalletController controller, isDark, WalletTransactionModel transactionModel) { + Column transactionCard( + WalletController controller, + isDark, + WalletTransactionModel transactionModel, + ) { return Column( children: [ InkWell( onTap: () async { final orderId = transactionModel.orderId.toString(); - final orderData = await FireStoreUtils.getOrderByIdFromAllCollections(orderId); + final orderData = + await FireStoreUtils.getOrderByIdFromAllCollections(orderId); if (orderData != null) { final collection = orderData['collection_name']; switch (collection) { case CollectionName.parcelOrders: - Get.to(const ParcelOrderDetails(), arguments: ParcelOrderModel.fromJson(orderData)); + Get.to( + const ParcelOrderDetails(), + arguments: ParcelOrderModel.fromJson(orderData), + ); break; case CollectionName.providerOrders: - Get.to(const OnDemandOrderDetailsScreen(), arguments: OnProviderOrderModel.fromJson(orderData)); + Get.to( + const OnDemandOrderDetailsScreen(), + arguments: OnProviderOrderModel.fromJson(orderData), + ); break; case CollectionName.rentalOrders: - Get.to(() => RentalOrderDetailsScreen(), arguments: RentalOrderModel.fromJson(orderData)); + Get.to( + () => RentalOrderDetailsScreen(), + arguments: RentalOrderModel.fromJson(orderData), + ); break; case CollectionName.rides: - Get.to(const CabOrderDetails(), arguments: {"cabOrderModel": CabOrderModel.fromJson(orderData)}); + Get.to( + const CabOrderDetails(), + arguments: { + "cabOrderModel": CabOrderModel.fromJson(orderData), + }, + ); break; case CollectionName.vendorOrders: - Get.to(const OrderDetailsScreen(), arguments: {"orderModel": OrderModel.fromJson(orderData)}); + Get.to( + const OrderDetailsScreen(), + arguments: {"orderModel": OrderModel.fromJson(orderData)}, + ); break; default: ShowToastDialog.showToast("Order details not available".tr()); @@ -220,14 +329,31 @@ class WalletScreen extends StatelessWidget { children: [ Container( decoration: ShapeDecoration( - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: isDark ? AppThemeData.grey800 : AppThemeData.grey100), borderRadius: BorderRadius.circular(8)), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData.grey800 + : AppThemeData.grey100, + ), + borderRadius: BorderRadius.circular(8), + ), ), child: Padding( padding: const EdgeInsets.all(16), child: transactionModel.isTopup == false - ? SvgPicture.asset("assets/icons/ic_debit.svg", height: 16, width: 16) - : SvgPicture.asset("assets/icons/ic_credit.svg", height: 16, width: 16), + ? SvgPicture.asset( + "assets/icons/ic_debit.svg", + height: 16, + width: 16, + ) + : SvgPicture.asset( + "assets/icons/ic_credit.svg", + height: 16, + width: 16, + ), ), ), const SizedBox(width: 10), @@ -240,19 +366,44 @@ class WalletScreen extends StatelessWidget { Expanded( child: Text( transactionModel.note.toString(), - style: TextStyle(fontSize: 16, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w600, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontSize: 16, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.amountShow(amount: transactionModel.amount.toString()), - style: TextStyle(fontSize: 16, fontFamily: AppThemeData.medium, color: transactionModel.isTopup == true ? AppThemeData.success400 : AppThemeData.danger300), + Constant.amountShow( + amount: transactionModel.amount.toString(), + ), + style: TextStyle( + fontSize: 16, + fontFamily: AppThemeData.medium, + color: + transactionModel.isTopup == true + ? AppThemeData.success400 + : AppThemeData.danger300, + ), ), ], ), const SizedBox(height: 2), Text( Constant.timestampToDateTime(transactionModel.date!), - style: TextStyle(fontSize: 12, fontFamily: AppThemeData.medium, fontWeight: FontWeight.w500, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontSize: 12, + fontFamily: AppThemeData.medium, + fontWeight: FontWeight.w500, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -261,10 +412,30 @@ class WalletScreen extends StatelessWidget { ), ), ), - Padding(padding: const EdgeInsets.symmetric(vertical: 5), child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200)), + Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: MySeparator( + color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, + ), + ), ], ); } } -enum PaymentGateway {payme, click, payFast, mercadoPago, paypal, stripe, flutterWave, payStack, razorpay, cod, wallet, midTrans, orangeMoney, xendit } +enum PaymentGateway { + payme, + click, + payFast, + mercadoPago, + paypal, + stripe, + flutterWave, + payStack, + razorpay, + cod, + wallet, + midTrans, + orangeMoney, + xendit, +} diff --git a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart index e693647..1f87e22 100644 --- a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart +++ b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/assets.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/on_boarding_controller.dart'; import '../../themes/app_them_data.dart'; import '../../utils/network_image_widget.dart'; @@ -25,7 +25,10 @@ class OnboardingScreen extends StatelessWidget { Image.asset(AppAssets.onBoardingBG, fit: BoxFit.cover), SafeArea( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 20, + ), child: Column( children: [ const SizedBox(height: 20), @@ -35,8 +38,18 @@ class OnboardingScreen extends StatelessWidget { text: TextSpan( style: AppThemeData.regularTextStyle(fontSize: 14), children: [ - TextSpan(text: "${controller.currentPage.value + 1}", style: AppThemeData.regularTextStyle(color: AppThemeData.grey800)), - TextSpan(text: "/$pageCount", style: AppThemeData.regularTextStyle(color: AppThemeData.grey400)), + TextSpan( + text: "${controller.currentPage.value + 1}", + style: AppThemeData.regularTextStyle( + color: AppThemeData.grey800, + ), + ), + TextSpan( + text: "/$pageCount", + style: AppThemeData.regularTextStyle( + color: AppThemeData.grey400, + ), + ), ], ), ), @@ -52,11 +65,28 @@ class OnboardingScreen extends StatelessWidget { return SingleChildScrollView( child: Column( children: [ - Text(item.title ?? '', style: AppThemeData.boldTextStyle(color: AppThemeData.grey900), textAlign: TextAlign.center), + Text( + item.title ?? '', + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + ), + textAlign: TextAlign.center, + ), const SizedBox(height: 5), - Text(item.description ?? '', style: AppThemeData.boldTextStyle(color: AppThemeData.grey500, fontSize: 14), textAlign: TextAlign.center), + Text( + item.description ?? '', + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey500, + fontSize: 14, + ), + textAlign: TextAlign.center, + ), const SizedBox(height: 40), - NetworkImageWidget(imageUrl: item.image ?? '', width: double.infinity, height: 500), + NetworkImageWidget( + imageUrl: item.image ?? '', + width: double.infinity, + height: 500, + ), ], ), ); @@ -74,7 +104,14 @@ class OnboardingScreen extends StatelessWidget { ) : Row( children: [ - Expanded(child: RoundedButtonFill(title: "Skip".tr(), onPress: () => _finish(), color: AppThemeData.grey50, textColor: AppThemeData.grey900)), + Expanded( + child: RoundedButtonFill( + title: "Skip".tr(), + onPress: () => _finish(), + color: AppThemeData.grey50, + textColor: AppThemeData.grey900, + ), + ), const SizedBox(width: 20), Expanded( child: RoundedButtonFill( diff --git a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart index 527dfbf..e9fe212 100644 --- a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart +++ b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart @@ -11,7 +11,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class FavouriteOndemandScreen extends StatelessWidget { const FavouriteOndemandScreen({super.key}); @@ -24,7 +24,8 @@ class FavouriteOndemandScreen extends StatelessWidget { init: FavouriteOndemmandController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.onDemand300, @@ -33,7 +34,15 @@ class FavouriteOndemandScreen extends StatelessWidget { child: Row( children: [ const SizedBox(width: 10), - Text("Favourite Services".tr(), style: TextStyle(fontFamily: AppThemeData.semiBold, color: isDark ? AppThemeData.grey900 : AppThemeData.grey900, fontSize: 20)), + Text( + "Favourite Services".tr(), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey900, + fontSize: 20, + ), + ), ], ), ), @@ -50,12 +59,30 @@ class FavouriteOndemandScreen extends StatelessWidget { children: [ Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -72,10 +99,15 @@ class FavouriteOndemandScreen extends StatelessWidget { ), ) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: controller.lstFav.isEmpty - ? Constant.showEmptyView(message: "Favourite Service not found.".tr()) + ? Constant.showEmptyView( + message: "Favourite Service not found.".tr(), + ) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, @@ -83,86 +115,231 @@ class FavouriteOndemandScreen extends StatelessWidget { physics: const BouncingScrollPhysics(), itemCount: controller.lstFav.length, itemBuilder: (context, index) { - return FutureBuilder>( - future: FireStoreUtils.getCurrentProviderService(controller.lstFav[index]), + return FutureBuilder< + List + >( + future: + FireStoreUtils.getCurrentProviderService( + controller.lstFav[index], + ), builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); + if (snapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator(), + ); } - if (!snapshot.hasData || snapshot.data == null || snapshot.data!.isEmpty) { + if (!snapshot.hasData || + snapshot.data == null || + snapshot.data!.isEmpty) { return const SizedBox(); // or a placeholder widget } - final provider = snapshot.data!.first; // safer way than [0] + final provider = + snapshot + .data! + .first; // safer way than [0] return GestureDetector( onTap: () { - Get.to(() => OnDemandDetailsScreen(), arguments: {'providerModel': provider}); + Get.to( + () => OnDemandDetailsScreen(), + arguments: { + 'providerModel': provider, + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Container( - height: MediaQuery.of(context).size.height * 0.16, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), - color: isDark ? AppThemeData.grey900 : Colors.white, + borderRadius: BorderRadius.circular( + 10, + ), + border: Border.all( + color: + isDark + ? AppThemeData.grey500 + : Colors.grey.shade100, + width: 1, + ), + color: + isDark + ? AppThemeData.grey900 + : Colors.white, ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(10), topLeft: Radius.circular(10)), + borderRadius: + const BorderRadius.only( + bottomLeft: + Radius.circular(10), + topLeft: Radius.circular( + 10, + ), + ), child: CachedNetworkImage( - imageUrl: provider.photos.isNotEmpty ? provider.photos.first : Constant.placeHolderImage, - height: MediaQuery.of(context).size.height * 0.16, + imageUrl: + provider.photos.isNotEmpty + ? provider + .photos + .first + : Constant + .placeHolderImage, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, width: 110, fit: BoxFit.cover, - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + ( + context, + url, + error, + ) => Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + ), ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Expanded( child: Text( - provider.title ?? "", + provider.title ?? + "", maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + overflow: + TextOverflow + .ellipsis, + style: TextStyle( + fontSize: 18, + fontWeight: + FontWeight + .bold, + color: + isDark + ? Colors + .white + : Colors + .black, + ), ), ), Obx( () => GestureDetector( - onTap: () => controller.toggleFavourite(provider), + onTap: + () => controller + .toggleFavourite( + provider, + ), child: Icon( - controller.lstFav.where((element) => element.service_id == provider.id).isNotEmpty ? Icons.favorite : Icons.favorite_border, + controller + .lstFav + .where( + ( + element, + ) => + element.service_id == + provider.id, + ) + .isNotEmpty + ? Icons + .favorite + : Icons + .favorite_border, size: 24, color: - controller.lstFav.where((element) => element.service_id == provider.id).isNotEmpty - ? AppThemeData.primary300 - : (isDark ? Colors.white38 : Colors.black38), + controller + .lstFav + .where( + ( + element, + ) => + element.service_id == + provider.id, + ) + .isNotEmpty + ? AppThemeData + .primary300 + : (isDark + ? Colors.white38 + : Colors.black38), ), ), ), ], ), - FutureBuilder( - future: controller.getCategory(provider.categoryId ?? ""), + FutureBuilder< + CategoryModel? + >( + future: controller + .getCategory( + provider.categoryId ?? + "", + ), builder: (ctx, snap) { - if (!snap.hasData) return const SizedBox(); - return Text(snap.data?.title ?? "", style: TextStyle(fontSize: 14, color: isDark ? Colors.white : Colors.black)); + if (!snap.hasData) + return const SizedBox(); + return Text( + snap.data?.title ?? + "", + style: TextStyle( + fontSize: 14, + color: + isDark + ? Colors + .white + : Colors + .black, + ), + ); }, ), - _buildPrice(provider, isDark: isDark), + _buildPrice( + provider, + isDark: isDark, + ), _buildRating(provider), ], ), @@ -176,79 +353,231 @@ class FavouriteOndemandScreen extends StatelessWidget { }, ); FutureBuilder>( - future: FireStoreUtils.getCurrentProviderService(controller.lstFav[index]), + future: + FireStoreUtils.getCurrentProviderService( + controller.lstFav[index], + ), builder: (context, snapshot) { return snapshot.data != null ? GestureDetector( onTap: () { - Get.to(() => OnDemandDetailsScreen(), arguments: {'providerModel': snapshot.data![0]}); + Get.to( + () => OnDemandDetailsScreen(), + arguments: { + 'providerModel': + snapshot.data![0], + }, + ); }, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), child: Container( - height: MediaQuery.of(context).size.height * 0.16, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), - color: isDark ? AppThemeData.grey900 : Colors.white, + borderRadius: + BorderRadius.circular(10), + border: Border.all( + color: + isDark + ? AppThemeData.grey500 + : Colors + .grey + .shade100, + width: 1, + ), + color: + isDark + ? AppThemeData.grey900 + : Colors.white, ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(10), topLeft: Radius.circular(10)), + borderRadius: + const BorderRadius.only( + bottomLeft: + Radius.circular( + 10, + ), + topLeft: + Radius.circular( + 10, + ), + ), child: CachedNetworkImage( - imageUrl: snapshot.data![0].photos.isNotEmpty ? snapshot.data![0].photos[0] : Constant.placeHolderImage, - height: MediaQuery.of(context).size.height * 0.16, + imageUrl: + snapshot + .data![0] + .photos + .isNotEmpty + ? snapshot + .data![0] + .photos[0] + : Constant + .placeHolderImage, + height: + MediaQuery.of( + context, + ).size.height * + 0.16, width: 110, fit: BoxFit.cover, - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + placeholder: + ( + context, + url, + ) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + ( + context, + url, + error, + ) => Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + ), ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Expanded( child: Text( - snapshot.data![0].title ?? "", + snapshot + .data![0] + .title ?? + "", maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + overflow: + TextOverflow + .ellipsis, + style: TextStyle( + fontSize: + 18, + fontWeight: + FontWeight + .bold, + color: + isDark + ? Colors.white + : Colors.black, + ), ), ), Obx( () => GestureDetector( - onTap: () => controller.toggleFavourite(snapshot.data![0]), + onTap: + () => controller.toggleFavourite( + snapshot + .data![0], + ), child: Icon( - controller.lstFav.where((element) => element.service_id == snapshot.data![0].id).isNotEmpty - ? Icons.favorite - : Icons.favorite_border, + controller + .lstFav + .where( + ( + element, + ) => + element.service_id == + snapshot.data![0].id, + ) + .isNotEmpty + ? Icons + .favorite + : Icons + .favorite_border, size: 24, color: - controller.lstFav.where((element) => element.service_id == snapshot.data![0].id).isNotEmpty + controller.lstFav + .where( + ( + element, + ) => + element.service_id == + snapshot.data![0].id, + ) + .isNotEmpty ? AppThemeData.primary300 - : (isDark ? Colors.white38 : Colors.black38), + : (isDark + ? Colors.white38 + : Colors.black38), ), ), ), ], ), - FutureBuilder( - future: controller.getCategory(snapshot.data![0].categoryId ?? ""), - builder: (ctx, snap) { - if (!snap.hasData) return const SizedBox(); - return Text(snap.data?.title ?? "", style: TextStyle(fontSize: 14, color: isDark ? Colors.white : Colors.black)); + FutureBuilder< + CategoryModel? + >( + future: controller + .getCategory( + snapshot + .data![0] + .categoryId ?? + "", + ), + builder: ( + ctx, + snap, + ) { + if (!snap.hasData) + return const SizedBox(); + return Text( + snap + .data + ?.title ?? + "", + style: TextStyle( + fontSize: 14, + color: + isDark + ? Colors + .white + : Colors + .black, + ), + ); }, ), - _buildPrice(snapshot.data![0], isDark: isDark), - _buildRating(snapshot.data![0]), + _buildPrice( + snapshot.data![0], + isDark: isDark, + ), + _buildRating( + snapshot.data![0], + ), ], ), ), @@ -272,20 +601,38 @@ class FavouriteOndemandScreen extends StatelessWidget { Widget _buildPrice(ProviderServiceModel provider, {bool isDark = false}) { if (provider.disPrice == "" || provider.disPrice == "0") { return Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ); } else { return Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.disPrice ?? '0') + : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ), const SizedBox(width: 5), Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', - style: const TextStyle(fontSize: 12, color: Colors.grey, decoration: TextDecoration.lineThrough), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + decoration: TextDecoration.lineThrough, + ), ), ], ); @@ -298,14 +645,24 @@ class FavouriteOndemandScreen extends StatelessWidget { rating = (provider.reviewsSum ?? 0) / (provider.reviewsCount ?? 1); } return Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(16), + ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), child: Row( mainAxisSize: MainAxisSize.min, children: [ const Icon(Icons.star, size: 16, color: Colors.white), const SizedBox(width: 3), - Text(rating.toStringAsFixed(1), style: const TextStyle(letterSpacing: 0.5, fontSize: 12, color: Colors.white)), + Text( + rating.toStringAsFixed(1), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + color: Colors.white, + ), + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart index 5b61b49..24eae6e 100644 --- a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart +++ b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart @@ -1,7 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../constant/constant.dart'; import '../../controllers/my_booking_on_demand_controller.dart'; @@ -24,13 +24,24 @@ class MyBookingOnDemandScreen extends StatelessWidget { builder: (controller) { return DefaultTabController( length: controller.tabTitles.length, - initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), + initialIndex: controller.tabTitles.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, centerTitle: false, - title: Padding(padding: const EdgeInsets.only(bottom: 10), child: Text("Booking History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))), + title: Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text( + "Booking History".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ), bottom: PreferredSize( preferredSize: const Size.fromHeight(48), child: TabBar( @@ -41,8 +52,15 @@ class MyBookingOnDemandScreen extends StatelessWidget { labelColor: AppThemeData.grey900, unselectedLabelColor: AppThemeData.grey900, labelStyle: AppThemeData.boldTextStyle(fontSize: 16), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 16), - tabs: controller.tabTitles.map((title) => Tab(child: Center(child: Text(title)))).toList(), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 16, + ), + tabs: + controller.tabTitles + .map( + (title) => Tab(child: Center(child: Text(title))), + ) + .toList(), ), ), ), @@ -55,78 +73,217 @@ class MyBookingOnDemandScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No ride found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + "No ride found".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( padding: const EdgeInsets.all(16), itemCount: orders.length, itemBuilder: (context, index) { - OnProviderOrderModel onProviderOrder = orders[index]; - WorkerModel? worker = controller.getWorker(onProviderOrder.workerId); + OnProviderOrderModel onProviderOrder = + orders[index]; + WorkerModel? worker = controller.getWorker( + onProviderOrder.workerId, + ); return InkWell( onTap: () { - Get.to(() => OnDemandOrderDetailsScreen(), arguments: onProviderOrder); + Get.to( + () => OnDemandOrderDetailsScreen(), + arguments: onProviderOrder, + ); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), margin: const EdgeInsets.only(bottom: 15), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), - color: isDark ? AppThemeData.grey500 : Colors.white, + border: Border.all( + color: + isDark + ? AppThemeData.grey500 + : Colors.grey.shade100, + width: 1, + ), + color: + isDark + ? AppThemeData.grey500 + : Colors.white, ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: CachedNetworkImage( - imageUrl: onProviderOrder.provider.photos.first, + imageUrl: + onProviderOrder + .provider + .photos + .first, height: 80, width: 80, imageBuilder: - (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), + ( + context, + imageProvider, + ) => Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), errorWidget: - (context, url, error) => ClipRRect( - borderRadius: BorderRadius.circular(10), - child: Image.network(Constant.placeHolderImage, fit: BoxFit.cover, cacheHeight: 80, cacheWidth: 80), + ( + context, + url, + error, + ) => ClipRRect( + borderRadius: + BorderRadius.circular( + 10, + ), + child: Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + cacheHeight: 80, + cacheWidth: 80, + ), ), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: + const EdgeInsets.symmetric( + horizontal: 20, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - decoration: BoxDecoration(color: AppThemeData.info50, border: Border.all(color: AppThemeData.info300), borderRadius: BorderRadius.circular(12)), - child: Text(onProviderOrder.status, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.info500)), - ), - Padding( - padding: const EdgeInsets.only(top: 6), + padding: + const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), + decoration: BoxDecoration( + color: + AppThemeData.info50, + border: Border.all( + color: + AppThemeData + .info300, + ), + borderRadius: + BorderRadius.circular( + 12, + ), + ), child: Text( - onProviderOrder.provider.title.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + onProviderOrder.status, + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + AppThemeData + .info500, + ), + ), + ), + Padding( + padding: + const EdgeInsets.only( + top: 6, + ), + child: Text( + onProviderOrder + .provider + .title + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), + ), + Padding( + padding: + const EdgeInsets.only( + top: 6, + ), + child: buildPriceText( + onProviderOrder, ), ), - Padding(padding: const EdgeInsets.only(top: 6), child: buildPriceText(onProviderOrder)), const SizedBox(height: 6), - if (onProviderOrder.status != Constant.orderCompleted && - onProviderOrder.status != Constant.orderCancelled && - onProviderOrder.otp != null && - onProviderOrder.otp!.isNotEmpty) + if (onProviderOrder + .status != + Constant + .orderCompleted && + onProviderOrder + .status != + Constant + .orderCancelled && + onProviderOrder.otp != + null && + onProviderOrder + .otp! + .isNotEmpty) Text( "${'OTP :'.tr()} ${onProviderOrder.otp}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -136,7 +293,12 @@ class MyBookingOnDemandScreen extends StatelessWidget { ), /// Bottom Details (Date, Provider, Worker) - buildBottomDetails(context, onProviderOrder, isDark, worker), + buildBottomDetails( + context, + onProviderOrder, + isDark, + worker, + ), ], ), ), @@ -152,37 +314,81 @@ class MyBookingOnDemandScreen extends StatelessWidget { } Widget buildPriceText(OnProviderOrderModel order) { - final hasDiscount = order.provider.disPrice != "" && order.provider.disPrice != "0"; - final price = hasDiscount ? order.provider.disPrice.toString() : order.provider.price.toString(); + final hasDiscount = + order.provider.disPrice != "" && order.provider.disPrice != "0"; + final price = + hasDiscount + ? order.provider.disPrice.toString() + : order.provider.price.toString(); return Text( - order.provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: price) : "${Constant.amountShow(amount: price)}/${'hr'.tr()}", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.primary300), + order.provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: price) + : "${Constant.amountShow(amount: price)}/${'hr'.tr()}", + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: AppThemeData.primary300, + ), ); } - Widget buildBottomDetails(BuildContext context, OnProviderOrderModel order, bool isDark, WorkerModel? worker) { + Widget buildBottomDetails( + BuildContext context, + OnProviderOrderModel order, + bool isDark, + WorkerModel? worker, + ) { return Container( margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey400 : AppThemeData.grey100, width: 1), + border: Border.all( + color: isDark ? AppThemeData.grey400 : AppThemeData.grey100, + width: 1, + ), color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( children: [ - detailRow("Date & Time", DateFormat('dd-MMM-yyyy hh:mm a').format(order.scheduleDateTime!.toDate()), isDark), + detailRow( + "Date & Time", + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format(order.scheduleDateTime!.toDate()), + isDark, + ), const Divider(thickness: 1), detailRow("Provider", order.provider.authorName.toString(), isDark), if (order.provider.priceUnit == "Hourly") ...[ - if (order.startTime != null) ...[const Divider(thickness: 1), detailRow("Start Time", DateFormat('dd-MMM-yyyy hh:mm a').format(order.startTime!.toDate()), isDark)], - if (order.endTime != null) ...[const Divider(thickness: 1), detailRow("End Time", DateFormat('dd-MMM-yyyy hh:mm a').format(order.endTime!.toDate()), isDark)], + if (order.startTime != null) ...[ + const Divider(thickness: 1), + detailRow( + "Start Time", + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format(order.startTime!.toDate()), + isDark, + ), + ], + if (order.endTime != null) ...[ + const Divider(thickness: 1), + detailRow( + "End Time", + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format(order.endTime!.toDate()), + isDark, + ), + ], ], - if (worker != null) ...[const Divider(thickness: 1), detailRow("Worker", worker.fullName().toString(), isDark)], + if (worker != null) ...[ + const Divider(thickness: 1), + detailRow("Worker", worker.fullName().toString(), isDark), + ], ], ), ), @@ -195,8 +401,20 @@ class MyBookingOnDemandScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(label.tr(), style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value.tr(), style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + label.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + value.tr(), + style: AppThemeData.regularTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart index d073c77..db6fa1b 100644 --- a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart @@ -4,7 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/on_demand_booking_controller.dart'; @@ -42,12 +42,30 @@ class OnDemandBookingScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Book Service".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Book Service".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -58,13 +76,28 @@ class OnDemandBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ // Services Section - Text("Services".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Services".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 10), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), padding: const EdgeInsets.all(8), child: Row( @@ -73,18 +106,60 @@ class OnDemandBookingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(controller.provider.value?.title ?? '', style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + controller.provider.value?.title ?? '', + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 5), - Text(controller.categoryTitle.value, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - if (controller.provider.value?.priceUnit == "Fixed") ...[ + Text( + controller.categoryTitle.value, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + if (controller.provider.value?.priceUnit == + "Fixed") ...[ const SizedBox(height: 20), Row( children: [ - GestureDetector(onTap: controller.decrementQuantity, child: Icon(Icons.remove_circle_outline, color: AppThemeData.primary300, size: 30)), + GestureDetector( + onTap: controller.decrementQuantity, + child: Icon( + Icons.remove_circle_outline, + color: AppThemeData.primary300, + size: 30, + ), + ), const SizedBox(width: 10), - Text('${controller.quantity.value}', style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + '${controller.quantity.value}', + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(width: 10), - GestureDetector(onTap: controller.incrementQuantity, child: Icon(Icons.add_circle_outline, color: AppThemeData.primary300, size: 30)), + GestureDetector( + onTap: controller.incrementQuantity, + child: Icon( + Icons.add_circle_outline, + color: AppThemeData.primary300, + size: 30, + ), + ), ], ), ], @@ -98,7 +173,15 @@ class OnDemandBookingScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(20), color: Colors.grey.shade300, - image: controller.provider.value!.photos.isNotEmpty ? DecorationImage(image: NetworkImage(controller.provider.value?.photos.first), fit: BoxFit.cover) : null, + image: + controller.provider.value!.photos.isNotEmpty + ? DecorationImage( + image: NetworkImage( + controller.provider.value?.photos.first, + ), + fit: BoxFit.cover, + ) + : null, ), ), ], @@ -109,8 +192,14 @@ class OnDemandBookingScreen extends StatelessWidget { padding: const EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -119,7 +208,16 @@ class OnDemandBookingScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Address".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Address".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), SizedBox(height: 5), InkWell( onTap: () async { @@ -127,20 +225,32 @@ class OnDemandBookingScreen extends StatelessWidget { Get.to(AddressListScreen())!.then((value) { if (value != null) { ShippingAddress shippingAddress = value; - if (Constant.checkZoneCheck(shippingAddress.location!.latitude ?? 0.0, shippingAddress.location!.longitude ?? 0.0)) { - controller.selectedAddress.value = shippingAddress; + if (Constant.checkZoneCheck( + shippingAddress.location!.latitude ?? + 0.0, + shippingAddress.location!.longitude ?? + 0.0, + )) { + controller.selectedAddress.value = + shippingAddress; controller.calculatePrice(); } else { - ShowToastDialog.showToast("Service not available in this area".tr()); + ShowToastDialog.showToast( + "Service not available in this area" + .tr(), + ); } } }); } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); @@ -148,43 +258,81 @@ class OnDemandBookingScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace + .coordinates + .longitude; final address = firstPlace.address; shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); + shippingAddress.locality = + address.toString(); + shippingAddress + .location = UserLocation( + latitude: lat, + longitude: lng, + ); - controller.selectedAddress.value = shippingAddress; + controller.selectedAddress.value = + shippingAddress; Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; + shippingAddress.addressAs = + "Home"; + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); + shippingAddress.locality = + "Picked from Map"; - controller.selectedAddress.value = shippingAddress; + controller.selectedAddress.value = + shippingAddress; } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { - Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { + Placemark placeMark = + valuePlaceMaker[0]; + shippingAddress + .location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress.locality = + currentLocation; }); - controller.selectedAddress.value = shippingAddress; + controller.selectedAddress.value = + shippingAddress; ShowToastDialog.closeLoader(); } }, @@ -193,10 +341,17 @@ class OnDemandBookingScreen extends StatelessWidget { } }, child: Text( - controller.selectedAddress.value.getFullAddress(), + controller.selectedAddress.value + .getFullAddress(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), ], @@ -206,7 +361,12 @@ class OnDemandBookingScreen extends StatelessWidget { ), ), const SizedBox(height: 15), - TextFieldWidget(title: "Description".tr(), hintText: "Enter Description".tr(), controller: controller.descriptionController.value, maxLine: 5), + TextFieldWidget( + title: "Description".tr(), + hintText: "Enter Description".tr(), + controller: controller.descriptionController.value, + maxLine: 5, + ), const SizedBox(height: 10), GestureDetector( onTap: () { @@ -220,13 +380,36 @@ class OnDemandBookingScreen extends StatelessWidget { buttonSingleColor: AppThemeData.primary300, buttonPadding: 10, buttonWidth: 70, - pickerTitle: Text("", style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - backgroundColor: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - pickerTextStyle: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + pickerTitle: Text( + "", + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + backgroundColor: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + pickerTextStyle: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), closeIconColor: isDark ? Colors.white : Colors.black, ).show(context); }, - child: TextFieldWidget(title: "Booking Date & Slot".tr(), hintText: "Choose Date and Time".tr(), controller: controller.dateTimeController.value, enable: false), + child: TextFieldWidget( + title: "Booking Date & Slot".tr(), + hintText: "Choose Date and Time".tr(), + controller: controller.dateTimeController.value, + enable: false, + ), ), const SizedBox(height: 15), controller.provider.value?.priceUnit == "Fixed" @@ -241,7 +424,14 @@ class OnDemandBookingScreen extends StatelessWidget { scrollDirection: Axis.horizontal, itemBuilder: (context, index) { final coupon = controller.couponList[index]; - return GestureDetector(onTap: () => controller.applyCoupon(coupon), child: buildOfferItem(controller, index, isDark)); + return GestureDetector( + onTap: () => controller.applyCoupon(coupon), + child: buildOfferItem( + controller, + index, + isDark, + ), + ); }, ), ) @@ -249,7 +439,16 @@ class OnDemandBookingScreen extends StatelessWidget { buildPromoCode(controller, isDark), Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Price Detail".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), priceTotalRow(controller, isDark), ], @@ -260,14 +459,23 @@ class OnDemandBookingScreen extends StatelessWidget { ), bottomNavigationBar: Padding( padding: const EdgeInsets.all(20.0), - child: RoundedButtonFill(title: "Confirm".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.confirmBooking(context)), + child: RoundedButtonFill( + title: "Confirm".tr(), + color: AppThemeData.primary300, + textColor: AppThemeData.grey50, + onPress: () => controller.confirmBooking(context), + ), ), ); }, ); } - Widget buildOfferItem(OnDemandBookingController controller, int index, bool isDark) { + Widget buildOfferItem( + OnDemandBookingController controller, + int index, + bool isDark, + ) { return Obx(() { final coupon = controller.couponList[index]; @@ -275,7 +483,11 @@ class OnDemandBookingScreen extends StatelessWidget { margin: const EdgeInsets.fromLTRB(7, 10, 7, 10), height: 85, child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: AppThemeData.primary300, + ), child: Padding( padding: const EdgeInsets.fromLTRB(12, 5, 12, 0), child: Column( @@ -284,13 +496,26 @@ class OnDemandBookingScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Image(image: AssetImage('assets/images/offer_icon.png'), height: 25, width: 25), + const Image( + image: AssetImage('assets/images/offer_icon.png'), + height: 25, + width: 25, + ), const SizedBox(width: 10), Container( margin: const EdgeInsets.only(top: 3), child: Text( - coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" : "${coupon.discount} ${'% Off'.tr()}", - style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 0.7, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.discountType == "Fix Price" + ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" + : "${coupon.discount} ${'% Off'.tr()}", + style: TextStyle( + fontWeight: FontWeight.bold, + letterSpacing: 0.7, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), ], @@ -299,11 +524,36 @@ class OnDemandBookingScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(coupon.code ?? '', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, letterSpacing: 0.5, color: Colors.orange)), - Container(margin: const EdgeInsets.only(left: 15, right: 15, top: 3), width: 1, color: AppThemeData.grey50), Text( - "valid till ".tr() + controller.getDate(coupon.expiresAt!.toDate().toString()), - style: TextStyle(letterSpacing: 0.5, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.code ?? '', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + letterSpacing: 0.5, + color: Colors.orange, + ), + ), + Container( + margin: const EdgeInsets.only( + left: 15, + right: 15, + top: 3, + ), + width: 1, + color: AppThemeData.grey50, + ), + Text( + "valid till ".tr() + + controller.getDate( + coupon.expiresAt!.toDate().toString(), + ), + style: TextStyle( + letterSpacing: 0.5, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -321,7 +571,9 @@ class OnDemandBookingScreen extends StatelessWidget { margin: const EdgeInsets.only(top: 10, bottom: 13), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Padding( @@ -332,17 +584,37 @@ class OnDemandBookingScreen extends StatelessWidget { Expanded( child: Row( children: [ - Image.asset("assets/images/reedem.png", height: 50, width: 50), + Image.asset( + "assets/images/reedem.png", + height: 50, + width: 50, + ), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Promo Code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), + Text( + "Promo Code".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + overflow: TextOverflow.ellipsis, + ), const SizedBox(height: 5), Text( "Apply promo code".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), overflow: TextOverflow.ellipsis, ), ], @@ -353,7 +625,13 @@ class OnDemandBookingScreen extends StatelessWidget { ), FloatingActionButton( onPressed: () { - Get.bottomSheet(promoCodeSheet(controller, isDark), isScrollControlled: true, isDismissible: true, backgroundColor: Colors.transparent, enableDrag: true); + Get.bottomSheet( + promoCodeSheet(controller, isDark), + isScrollControlled: true, + isDismissible: true, + backgroundColor: Colors.transparent, + enableDrag: true, + ); }, mini: true, backgroundColor: Colors.blueGrey.shade50, @@ -371,7 +649,10 @@ class OnDemandBookingScreen extends StatelessWidget { return Container( padding: EdgeInsets.only(bottom: Get.height / 4.3, left: 25, right: 25), height: Get.height * 0.88, - decoration: BoxDecoration(color: Colors.transparent, border: Border.all(style: BorderStyle.none)), + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all(style: BorderStyle.none), + ), child: Column( children: [ InkWell( @@ -379,14 +660,21 @@ class OnDemandBookingScreen extends StatelessWidget { child: Container( height: 45, decoration: BoxDecoration( - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, width: 0.3), + border: Border.all( + color: + isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + width: 0.3, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, shape: BoxShape.circle, ), child: Center( child: Icon( Icons.close, - color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, // ✅ visible color + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, // ✅ visible color size: 28, ), ), @@ -395,40 +683,93 @@ class OnDemandBookingScreen extends StatelessWidget { const SizedBox(height: 25), Expanded( child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + ), alignment: Alignment.center, child: SingleChildScrollView( child: Column( children: [ - Container(padding: const EdgeInsets.only(top: 30), child: const Image(image: AssetImage('assets/images/redeem_coupon.png'), width: 100)), Container( - padding: const EdgeInsets.only(top: 20), - child: Text('Redeem Your Coupons'.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), - ), - Center( - child: Container( - padding: const EdgeInsets.only(top: 10, left: 22, right: 22), - child: Text("Voucher or Coupon code".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only(top: 30), + child: const Image( + image: AssetImage('assets/images/redeem_coupon.png'), + width: 100, ), ), Container( - padding: const EdgeInsets.only(left: 20, right: 20, top: 20), + padding: const EdgeInsets.only(top: 20), + child: Text( + 'Redeem Your Coupons'.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), + Center( + child: Container( + padding: const EdgeInsets.only( + top: 10, + left: 22, + right: 22, + ), + child: Text( + "Voucher or Coupon code".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), + ), + Container( + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 20, + ), child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(12), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(12), + color: AppThemeData.primary300, + ), child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(12)), + borderRadius: const BorderRadius.all( + Radius.circular(12), + ), child: Container( padding: const EdgeInsets.all(20), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, alignment: Alignment.center, child: TextFormField( textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, hintText: "Write Coupon Code".tr(), - hintStyle: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400), + hintStyle: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + ), ), ), ), @@ -436,21 +777,34 @@ class OnDemandBookingScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(top: 30, bottom: 30, left: 15, right: 15), + padding: const EdgeInsets.only( + top: 30, + bottom: 30, + left: 15, + right: 15, + ), child: RoundedButtonFill( title: "REDEEM NOW".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { - final inputCode = controller.couponTextController.value.text.trim().toLowerCase(); + final inputCode = + controller.couponTextController.value.text + .trim() + .toLowerCase(); - final matchingCoupon = controller.couponList.firstWhereOrNull((c) => c.code?.toLowerCase() == inputCode); + final matchingCoupon = controller.couponList + .firstWhereOrNull( + (c) => c.code?.toLowerCase() == inputCode, + ); if (matchingCoupon != null) { controller.applyCoupon(matchingCoupon); Get.back(); } else { - ShowToastDialog.showToast("Applied coupon not valid.".tr()); + ShowToastDialog.showToast( + "Applied coupon not valid.".tr(), + ); } }, ), @@ -470,14 +824,22 @@ class OnDemandBookingScreen extends StatelessWidget { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Column( children: [ const SizedBox(height: 5), - rowText("Price".tr(), Constant.amountShow(amount: controller.price.value.toString()), isDark), - controller.discountAmount.value != 0 ? const Divider() : const SizedBox(), + rowText( + "Price".tr(), + Constant.amountShow(amount: controller.price.value.toString()), + isDark, + ), + controller.discountAmount.value != 0 + ? const Divider() + : const SizedBox(), controller.discountAmount.value != 0 ? Padding( padding: const EdgeInsets.symmetric(horizontal: 10), @@ -490,19 +852,39 @@ class OnDemandBookingScreen extends StatelessWidget { children: [ Text( "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", - style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller.offerCode.value, + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), - Text(controller.offerCode.value, style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ), ), - Text("(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", style: const TextStyle(color: Colors.red)), + Text( + "(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", + style: const TextStyle(color: Colors.red), + ), ], ), ) : const SizedBox(), const Divider(), - rowText("SubTotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + rowText( + "SubTotal".tr(), + Constant.amountShow(amount: controller.subTotal.value.toString()), + isDark, + ), const Divider(), ListView.builder( itemCount: Constant.taxList.length, @@ -513,19 +895,39 @@ class OnDemandBookingScreen extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 8, + horizontal: 10, + ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( "${taxModel.title} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Text( - Constant.amountShow(amount: Constant.getTaxValue(amount: controller.subTotal.value.toString(), taxModel: taxModel).toString()), - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + controller.subTotal.value.toString(), + taxModel: taxModel, + ).toString(), + ), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -535,7 +937,13 @@ class OnDemandBookingScreen extends StatelessWidget { ); }, ), - rowText("Total Amount".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + rowText( + "Total Amount".tr(), + Constant.amountShow( + amount: controller.totalAmount.value.toString(), + ), + isDark, + ), const SizedBox(height: 5), ], ), @@ -549,8 +957,18 @@ class OnDemandBookingScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title.tr(), + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + value.tr(), + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart index 80daba8..a5e20c6 100644 --- a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart @@ -2,7 +2,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/screen_ui/on_demand_service/view_category_service_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/on_demand_category_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -33,8 +33,20 @@ class OnDemandCategoryScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -42,12 +54,22 @@ class OnDemandCategoryScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Explore services".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), Text( - "Explore services tailored for you—quick, easy, and personalized.".tr(), + "Explore services".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + Text( + "Explore services tailored for you—quick, easy, and personalized." + .tr(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), ), ], ), @@ -60,7 +82,10 @@ class OnDemandCategoryScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + padding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 15, + ), child: SingleChildScrollView( child: Column( children: [ @@ -71,9 +96,17 @@ class OnDemandCategoryScreen extends StatelessWidget { itemCount: controller.categories.length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3), + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + ), itemBuilder: (context, index) { - return categoriesCell(context, controller.categories[index], index, isDark); + return categoriesCell( + context, + controller.categories[index], + index, + isDark, + ); }, ), ], @@ -85,16 +118,42 @@ class OnDemandCategoryScreen extends StatelessWidget { ); } - Widget categoriesCell(BuildContext context, CategoryModel category, int index, bool isDark) { + Widget categoriesCell( + BuildContext context, + CategoryModel category, + int index, + bool isDark, + ) { return GestureDetector( onTap: () { - Get.to(() => ViewCategoryServiceListScreen(), arguments: {'categoryId': category.id, 'categoryTitle': category.title}); + Get.to( + () => ViewCategoryServiceListScreen(), + arguments: { + 'categoryId': category.id, + 'categoryTitle': category.title, + }, + ); }, child: Column( children: [ - ClipRRect(borderRadius: BorderRadius.circular(12), child: CachedNetworkImage(imageUrl: category.image ?? "", height: 60, width: 60, fit: BoxFit.cover)), + ClipRRect( + borderRadius: BorderRadius.circular(12), + child: CachedNetworkImage( + imageUrl: category.image ?? "", + height: 60, + width: 60, + fit: BoxFit.cover, + ), + ), const SizedBox(height: 5), - Text(category.title ?? "", style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), textAlign: TextAlign.center), + Text( + category.title ?? "", + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + textAlign: TextAlign.center, + ), ], ), ); diff --git a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart index 47b5f9a..60749e6 100644 --- a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart @@ -5,8 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../controllers/on_demand_dashboard_controller.dart'; class OnDemandDashboardScreen extends StatelessWidget { @@ -27,12 +26,19 @@ class OnDemandDashboardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(CabDashboardController()); @@ -42,18 +48,72 @@ class OnDemandDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", label: 'Favourites'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_fav.svg", + label: 'Favourites'.tr(), + controller: controller, + ), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_wallet_cab.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 4, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -62,7 +122,13 @@ class OnDemandDashboardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required OnDemandDashboardController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required OnDemandDashboardController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart index 31b8c6c..dcfbca1 100644 --- a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart @@ -4,7 +4,7 @@ import 'package:customer/screen_ui/on_demand_service/provider_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../controllers/theme_controller.dart'; import '../../models/provider_serivce_model.dart'; @@ -25,7 +25,13 @@ class OnDemandDetailsScreen extends StatelessWidget { init: OnDemandDetailsController(), builder: (controller) { return Scaffold( - body: buildSliverScrollView(context, controller, controller.provider, controller.userModel, isDark), + body: buildSliverScrollView( + context, + controller, + controller.provider, + controller.userModel, + isDark, + ), bottomNavigationBar: controller.isOpen.value == false ? SizedBox() @@ -43,9 +49,20 @@ class OnDemandDetailsScreen extends StatelessWidget { if (Constant.userModel == null) { Get.offAll(const LoginScreen()); } else { - print("providerModel ::::::::${controller.provider.title ?? 'No provider'}"); - print("categoryTitle ::::::: ${controller.categoryTitle.value}"); - Get.to(() => OnDemandBookingScreen(), arguments: {'providerModel': controller.provider, 'categoryTitle': controller.categoryTitle.value}); + print( + "providerModel ::::::::${controller.provider.title ?? 'No provider'}", + ); + print( + "categoryTitle ::::::: ${controller.categoryTitle.value}", + ); + Get.to( + () => OnDemandBookingScreen(), + arguments: { + 'providerModel': controller.provider, + 'categoryTitle': + controller.categoryTitle.value, + }, + ); } }, ), @@ -57,7 +74,13 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - SingleChildScrollView buildSliverScrollView(BuildContext context, OnDemandDetailsController controller, ProviderServiceModel provider, user, isDark) { + SingleChildScrollView buildSliverScrollView( + BuildContext context, + OnDemandDetailsController controller, + ProviderServiceModel provider, + user, + isDark, + ) { final width = MediaQuery.of(context).size.width; final height = MediaQuery.of(context).size.height; @@ -68,21 +91,54 @@ class OnDemandDetailsScreen extends StatelessWidget { Stack( children: [ CachedNetworkImage( - imageUrl: provider.photos.isNotEmpty ? provider.photos.first : "", - placeholder: (context, url) => Center(child: CircularProgressIndicator(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.fitWidth), + imageUrl: + provider.photos.isNotEmpty ? provider.photos.first : "", + placeholder: + (context, url) => Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), + errorWidget: + (context, url, error) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.fitWidth, + ), fit: BoxFit.fitWidth, width: width, height: height * 0.45, ), - Positioned(top: height * 0.05, left: width * 0.03, child: _circleButton(context, icon: Icons.arrow_back, onTap: () => Get.back())), + Positioned( + top: height * 0.05, + left: width * 0.03, + child: _circleButton( + context, + icon: Icons.arrow_back, + onTap: () => Get.back(), + ), + ), Positioned( top: height * 0.05, right: width * 0.03, child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(40), color: controller.isOpen.value ? Colors.green : Colors.red), - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(controller.isOpen.value ? "Open".tr() : "Close".tr(), style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.white, fontSize: 14)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(40), + color: controller.isOpen.value ? Colors.green : Colors.red, + ), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + controller.isOpen.value ? "Open".tr() : "Close".tr(), + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 14, + ), + ), ), ), ], @@ -105,27 +161,66 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: Text( provider.title.toString(), - style: TextStyle(fontSize: 20, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 20, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : Colors.black, + ), ), ), Row( children: [ provider.disPrice == "" || provider.disPrice == "0" ? Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', - style: TextStyle(fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow( + amount: provider.price ?? '0', + ) + : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', + style: TextStyle( + fontSize: 18, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.bold, + color: + isDark + ? Colors.white + : AppThemeData.primary300, + ), ) : Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr()}', - style: TextStyle(fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow( + amount: provider.disPrice ?? '0', + ) + : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr()}', + style: TextStyle( + fontSize: 18, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.bold, + color: + isDark + ? Colors.white + : AppThemeData.primary300, + ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price ?? '0') : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', - style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.grey, decoration: TextDecoration.lineThrough), + provider.priceUnit == 'Fixed' + ? Constant.amountShow( + amount: provider.price ?? '0', + ) + : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.grey, + decoration: + TextDecoration.lineThrough, + ), ), ), ], @@ -139,23 +234,51 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: Padding( padding: const EdgeInsets.symmetric(vertical: 5), - child: Text(categoryTitle, style: TextStyle(fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? Colors.white : Colors.black)), + child: Text( + categoryTitle, + style: TextStyle( + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: isDark ? Colors.white : Colors.black, + ), + ), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Row( children: [ - const Icon(Icons.star, size: 16, color: AppThemeData.warning400), + const Icon( + Icons.star, + size: 16, + color: AppThemeData.warning400, + ), const SizedBox(width: 3), Text( - provider.reviewsCount != 0 ? ((provider.reviewsSum ?? 0.0) / (provider.reviewsCount ?? 0.0)).toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: AppThemeData.warning400), + provider.reviewsCount != 0 + ? ((provider.reviewsSum ?? 0.0) / + (provider.reviewsCount ?? 0.0)) + .toStringAsFixed(1) + : '0', + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: AppThemeData.warning400, + ), ), const SizedBox(width: 10), Text( "(${provider.reviewsCount} ${'Reviews'.tr()})", - style: TextStyle(letterSpacing: 0.5, fontSize: 16, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + letterSpacing: 0.5, + fontSize: 16, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: isDark ? Colors.white : Colors.black, + ), ), ], ), @@ -168,18 +291,40 @@ class OnDemandDetailsScreen extends StatelessWidget { children: [ subCategoryTitle.isNotEmpty ? Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppThemeData.primary300.withOpacity(0.20)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppThemeData.primary300.withOpacity( + 0.20, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: Text(subCategoryTitle, style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + child: Text( + subCategoryTitle, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: AppThemeData.regular, + color: AppThemeData.primary300, + ), + ), ), ) : Container(), const SizedBox(width: 10), Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: Colors.green.withOpacity(0.20)), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.green.withOpacity(0.20), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: InkWell( onTap: () { showModalBottomSheet( @@ -188,10 +333,22 @@ class OnDemandDetailsScreen extends StatelessWidget { context: context, backgroundColor: Colors.transparent, enableDrag: true, - builder: (context) => showTiming(context, controller, isDark), + builder: + (context) => showTiming( + context, + controller, + isDark, + ), ); }, - child: Text("View Timing".tr(), style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.green, letterSpacing: 0.5)), + child: Text( + "View Timing".tr(), + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.green, + letterSpacing: 0.5, + ), + ), ), ), ), @@ -201,14 +358,22 @@ class OnDemandDetailsScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon(Icons.location_on_outlined, color: isDark ? Colors.white : Colors.black, size: 20), + Icon( + Icons.location_on_outlined, + color: isDark ? Colors.white : Colors.black, + size: 20, + ), const SizedBox(width: 5), Expanded( child: Text( provider.address.toString(), maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle(fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + color: isDark ? Colors.white : Colors.black, + ), ), ), ], @@ -219,7 +384,11 @@ class OnDemandDetailsScreen extends StatelessWidget { _tabBar(controller), Obx(() { if (controller.tabString.value == "About") { - return aboutTabViewWidget(controller, controller.provider, isDark); + return aboutTabViewWidget( + controller, + controller.provider, + isDark, + ); } else if (controller.tabString.value == "Gallery") { return galleryTabViewWidget(controller); } else { @@ -237,14 +406,35 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget _circleButton(BuildContext context, {required IconData icon, required VoidCallback onTap}) { + Widget _circleButton( + BuildContext context, { + required IconData icon, + required VoidCallback onTap, + }) { return ClipOval( - child: Container(color: Colors.black.withOpacity(0.7), child: InkWell(onTap: onTap, child: Padding(padding: const EdgeInsets.all(8.0), child: Icon(icon, size: 30, color: Colors.white)))), + child: Container( + color: Colors.black.withOpacity(0.7), + child: InkWell( + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(icon, size: 30, color: Colors.white), + ), + ), + ), ); } Widget _tabBar(OnDemandDetailsController controller) { - return Obx(() => Row(children: [_tabItem("About", controller), _tabItem("Gallery", controller), _tabItem("Review", controller)])); + return Obx( + () => Row( + children: [ + _tabItem("About", controller), + _tabItem("Gallery", controller), + _tabItem("Review", controller), + ], + ), + ); } Widget _tabItem(String title, OnDemandDetailsController controller) { @@ -253,33 +443,67 @@ class OnDemandDetailsScreen extends StatelessWidget { child: Container( margin: const EdgeInsets.only(right: 10), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - decoration: BoxDecoration(color: controller.tabString.value == title ? AppThemeData.primary300 : Colors.grey.shade200, borderRadius: BorderRadius.circular(10)), - child: Text(title.tr(), style: TextStyle(fontWeight: FontWeight.bold, color: controller.tabString.value == title ? Colors.white : Colors.black)), + decoration: BoxDecoration( + color: + controller.tabString.value == title + ? AppThemeData.primary300 + : Colors.grey.shade200, + borderRadius: BorderRadius.circular(10), + ), + child: Text( + title.tr(), + style: TextStyle( + fontWeight: FontWeight.bold, + color: + controller.tabString.value == title + ? Colors.white + : Colors.black, + ), + ), ), ); } - Widget aboutTabViewWidget(OnDemandDetailsController controller, ProviderServiceModel providerModel, bool isDark) { + Widget aboutTabViewWidget( + OnDemandDetailsController controller, + ProviderServiceModel providerModel, + bool isDark, + ) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text((providerModel.description ?? '').tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), + Text( + (providerModel.description ?? '').tr(), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), + ), const SizedBox(height: 10), Obx(() { final user = controller.userModel.value; if (user == null) return const SizedBox(); return InkWell( onTap: () { - Get.to(() => ProviderScreen(), arguments: {'providerId': user.id}); + Get.to( + () => ProviderScreen(), + arguments: {'providerId': user.id}, + ); }, child: Padding( padding: const EdgeInsets.symmetric(vertical: 2), child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade100, width: 1), + border: Border.all( + color: + isDark ? AppThemeData.grey500 : Colors.grey.shade100, + width: 1, + ), color: isDark ? AppThemeData.grey500 : Colors.white, ), child: Padding( @@ -289,30 +513,86 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: Row( children: [ - CircleAvatar(radius: 30, backgroundImage: NetworkImage(user.profilePictureURL?.isNotEmpty == true ? user.profilePictureURL! : Constant.placeHolderImage)), + CircleAvatar( + radius: 30, + backgroundImage: NetworkImage( + user.profilePictureURL?.isNotEmpty == true + ? user.profilePictureURL! + : Constant.placeHolderImage, + ), + ), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(user.fullName(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.bold)), + Text( + user.fullName(), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), const SizedBox(height: 5), - Text(user.email ?? '', style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14)), + Text( + user.email ?? '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + ), + ), const SizedBox(height: 10), // Rating Box Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(16), + ), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( - double.parse(user.reviewsCount.toString()) != 0 - ? (double.parse(user.reviewsSum.toString()) / double.parse(user.reviewsCount.toString())).toStringAsFixed(1) + double.parse( + user.reviewsCount + .toString(), + ) != + 0 + ? (double.parse( + user.reviewsSum + .toString(), + ) / + double.parse( + user.reviewsCount + .toString(), + )) + .toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -348,7 +628,12 @@ class OnDemandDetailsScreen extends StatelessWidget { shrinkWrap: true, padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, mainAxisSpacing: 0, crossAxisSpacing: 8, mainAxisExtent: 180), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 0, + crossAxisSpacing: 8, + mainAxisExtent: 180, + ), itemBuilder: (context, index) { final imageUrl = photos[index]; return Padding( @@ -359,9 +644,29 @@ class OnDemandDetailsScreen extends StatelessWidget { imageUrl: imageUrl, height: 60, width: 60, - imageBuilder: (context, imageProvider) => Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + imageBuilder: + (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), + errorWidget: + (context, url, error) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + ), fit: BoxFit.cover, ), ), @@ -370,11 +675,24 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget reviewTabViewWidget(OnDemandDetailsController controller, bool isDark) { + Widget reviewTabViewWidget( + OnDemandDetailsController controller, + bool isDark, + ) { final reviews = controller.ratingService; if (reviews.isEmpty) { - return SizedBox(height: 200, child: Center(child: Text("No review Found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)))); + return SizedBox( + height: 200, + child: Center( + child: Text( + "No review Found".tr(), + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + ), + ); } return ListView.builder( @@ -390,8 +708,17 @@ class OnDemandDetailsScreen extends StatelessWidget { clipBehavior: Clip.antiAlias, decoration: ShapeDecoration( color: isDark ? AppThemeData.grey700 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - shadows: const [BoxShadow(color: Color(0x0A000000), blurRadius: 32, offset: Offset(0, 0), spreadRadius: 0)], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + shadows: const [ + BoxShadow( + color: Color(0x0A000000), + blurRadius: 32, + offset: Offset(0, 0), + spreadRadius: 0, + ), + ], ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -401,26 +728,58 @@ class OnDemandDetailsScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(review.uname ?? '', style: TextStyle(fontSize: 16, letterSpacing: 1, fontWeight: FontWeight.w600, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - review.createdAt != null ? DateFormat('dd MMM').format(review.createdAt!.toDate()) : '', - style: TextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + review.uname ?? '', + style: TextStyle( + fontSize: 16, + letterSpacing: 1, + fontWeight: FontWeight.w600, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + review.createdAt != null + ? DateFormat( + 'dd MMM', + ).format(review.createdAt!.toDate()) + : '', + style: TextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), const SizedBox(height: 4), RatingBar.builder( - initialRating: double.tryParse(review.rating.toString()) ?? 0, + initialRating: + double.tryParse(review.rating.toString()) ?? 0, direction: Axis.horizontal, itemSize: 20, ignoreGestures: true, itemPadding: const EdgeInsets.symmetric(horizontal: 4.0), - itemBuilder: (context, _) => Icon(Icons.star, color: AppThemeData.primary300), + itemBuilder: + (context, _) => + Icon(Icons.star, color: AppThemeData.primary300), onRatingUpdate: (rate) {}, ), const Divider(), const SizedBox(height: 5), - Text(review.comment ?? '', style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + review.comment ?? '', + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ], ), ), @@ -430,31 +789,71 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget showTiming(BuildContext context, OnDemandDetailsController controller, bool isDark) { + Widget showTiming( + BuildContext context, + OnDemandDetailsController controller, + bool isDark, + ) { final provider = controller.provider; return Container( - decoration: BoxDecoration(color: isDark ? AppThemeData.grey300 : Colors.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey300 : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - child: Text("Service Timing".tr(), style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + child: Text( + "Service Timing".tr(), + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + fontFamily: AppThemeData.regular, + color: AppThemeData.primary300, + ), + ), ), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), child: Row( children: [ - Expanded(child: _timeCard(context, "Start Time : ".tr(), provider.startTime.toString(), isDark)), + Expanded( + child: _timeCard( + context, + "Start Time : ".tr(), + provider.startTime.toString(), + isDark, + ), + ), const SizedBox(width: 10), - Expanded(child: _timeCard(context, "End Time : ".tr(), provider.endTime.toString(), isDark)), + Expanded( + child: _timeCard( + context, + "End Time : ".tr(), + provider.endTime.toString(), + isDark, + ), + ), ], ), ), Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - child: Text("Service Days".tr(), style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, fontFamily: AppThemeData.regular, color: AppThemeData.primary300)), + child: Text( + "Service Days".tr(), + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + fontFamily: AppThemeData.regular, + color: AppThemeData.primary300, + ), + ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -466,10 +865,30 @@ class OnDemandDetailsScreen extends StatelessWidget { .map( (day) => Card( elevation: 2, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6), side: BorderSide(color: isDark ? const Color(0XFF3c3a2e) : const Color(0XFFC3C5D1), width: 1)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + side: BorderSide( + color: + isDark + ? const Color(0XFF3c3a2e) + : const Color(0XFFC3C5D1), + width: 1, + ), + ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 7, horizontal: 20), - child: Text(day, style: TextStyle(color: isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D))), + padding: const EdgeInsets.symmetric( + vertical: 7, + horizontal: 20, + ), + child: Text( + day, + style: TextStyle( + color: + isDark + ? const Color(0XFFa5a292) + : const Color(0XFF5A5D6D), + ), + ), ), ), ) @@ -482,16 +901,39 @@ class OnDemandDetailsScreen extends StatelessWidget { ); } - Widget _timeCard(BuildContext context, String title, String value, bool isDark) { + Widget _timeCard( + BuildContext context, + String title, + String value, + bool isDark, + ) { return Card( elevation: 2, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6), side: BorderSide(color: isDark ? const Color(0XFF3c3a2e) : const Color(0XFFC3C5D1), width: 1)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + side: BorderSide( + color: isDark ? const Color(0XFF3c3a2e) : const Color(0XFFC3C5D1), + width: 1, + ), + ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 7, horizontal: 20), child: Row( children: [ - Text(title, style: TextStyle(color: isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D))), - Text(value, style: TextStyle(color: isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D))), + Text( + title, + style: TextStyle( + color: + isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D), + ), + ), + Text( + value, + style: TextStyle( + color: + isDark ? const Color(0XFFa5a292) : const Color(0XFF5A5D6D), + ), + ), ], ), ), diff --git a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart index fbe5aa6..0fea656 100644 --- a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart @@ -20,7 +20,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/on_demand_home_controller.dart'; import '../../models/category_model.dart'; import '../../models/provider_serivce_model.dart'; @@ -51,8 +51,20 @@ class OnDemandHomeScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: const BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: const Center(child: Padding(padding: EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: const Center( + child: Padding( + padding: EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -61,8 +73,23 @@ class OnDemandHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Constant.userModel == null - ? InkWell(onTap: () => Get.offAll(const LoginScreen()), child: Text("Login".tr(), style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12))) - : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(color: AppThemeData.grey900, fontSize: 12)), + ? InkWell( + onTap: () => Get.offAll(const LoginScreen()), + child: Text( + "Login".tr(), + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + fontSize: 12, + ), + ), + ) + : Text( + Constant.userModel!.fullName(), + style: AppThemeData.boldTextStyle( + color: AppThemeData.grey900, + fontSize: 12, + ), + ), InkWell( onTap: () async { if (Constant.userModel != null) { @@ -76,10 +103,13 @@ class OnDemandHomeScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); // ✅ declare it once here! - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); @@ -87,41 +117,72 @@ class OnDemandHomeScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); - Constant.selectedLocation = shippingAddress; + shippingAddress.locality = + address.toString(); + shippingAddress.location = UserLocation( + latitude: lat, + longitude: lng, + ); + Constant.selectedLocation = + shippingAddress; controller.getData(); Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; // You can reverse-geocode + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); + shippingAddress.locality = + "Picked from Map"; // You can reverse-geocode - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; controller.getData(); } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + shippingAddress.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress.locality = + currentLocation; }); Constant.selectedLocation = shippingAddress; @@ -139,10 +200,21 @@ class OnDemandHomeScreen extends StatelessWidget { TextSpan( children: [ TextSpan( - text: Constant.selectedLocation.getFullAddress(), - style: TextStyle(fontFamily: AppThemeData.medium, overflow: TextOverflow.ellipsis, color: AppThemeData.grey900, fontSize: 14), + text: + Constant.selectedLocation + .getFullAddress(), + style: TextStyle( + fontFamily: AppThemeData.medium, + overflow: TextOverflow.ellipsis, + color: AppThemeData.grey900, + fontSize: 14, + ), + ), + WidgetSpan( + child: SvgPicture.asset( + "assets/icons/ic_down.svg", + ), ), - WidgetSpan(child: SvgPicture.asset("assets/icons/ic_down.svg")), ], ), ), @@ -157,7 +229,8 @@ class OnDemandHomeScreen extends StatelessWidget { body: controller.isLoading.value ? Constant.loader() - : Constant.isZoneAvailable == false || controller.providerList.isEmpty + : Constant.isZoneAvailable == false || + controller.providerList.isEmpty ? Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( @@ -166,12 +239,30 @@ class OnDemandHomeScreen extends StatelessWidget { children: [ Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), - Text("No Store Found in Your Area".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "No Store Found in Your Area".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "Currently, there are no available store in your zone. Try changing your location to find nearby options.".tr(), + "Currently, there are no available store in your zone. Try changing your location to find nearby options." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -188,7 +279,10 @@ class OnDemandHomeScreen extends StatelessWidget { ), ) : Padding( - padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + padding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 15, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -199,42 +293,95 @@ class OnDemandHomeScreen extends StatelessWidget { height: MediaQuery.of(context).size.height * 0.12, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark600 : AppThemeData.greyDark600, width: 1), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.greyDark600, + width: 1, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: controller.categories.isEmpty - ? Constant.showEmptyView(message: "No Categories".tr()) + ? Constant.showEmptyView( + message: "No Categories".tr(), + ) : Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: ListView.builder( - itemCount: controller.categories.length > 3 ? 3 : controller.categories.length, + itemCount: + controller.categories.length > + 3 + ? 3 + : controller + .categories + .length, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { - final category = controller.categories[index]; + final category = + controller + .categories[index]; return InkWell( onTap: () { - Get.to(() => ViewCategoryServiceListScreen(), arguments: {'categoryId': category.id, 'categoryTitle': category.title}); + Get.to( + () => + ViewCategoryServiceListScreen(), + arguments: { + 'categoryId': + category.id, + 'categoryTitle': + category.title, + }, + ); }, - child: CategoryView(category: category, index: index, isDark: isDark), + child: CategoryView( + category: category, + index: index, + isDark: isDark, + ), ); }, ), ), if (controller.categories.length > 3) Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ InkWell( onTap: () { - Get.to(() => const OnDemandCategoryScreen()); + Get.to( + () => + const OnDemandCategoryScreen(), + ); }, - child: ClipOval(child: Container(width: 50, height: 50, color: AppThemeData.grey200, child: const Center(child: Icon(Icons.chevron_right)))), + child: ClipOval( + child: Container( + width: 50, + height: 50, + color: + AppThemeData + .grey200, + child: const Center( + child: Icon( + Icons.chevron_right, + ), + ), + ), + ), ), const SizedBox(height: 5), SizedBox( @@ -242,9 +389,17 @@ class OnDemandHomeScreen extends StatelessWidget { child: Center( child: Text( "View All".tr(), - textAlign: TextAlign.center, + textAlign: + TextAlign.center, maxLines: 1, - style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), ), @@ -262,14 +417,28 @@ class OnDemandHomeScreen extends StatelessWidget { Expanded( child: Text( "Most Popular services".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 18, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w600), + style: TextStyle( + color: + isDark ? Colors.white : Colors.black, + fontSize: 18, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w600, + ), ), ), InkWell( onTap: () { Get.to(() => ViewAllPopularServiceScreen()); }, - child: Text("View all".tr(), style: TextStyle(color: AppThemeData.primary300, fontSize: 14, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w600)), + child: Text( + "View all".tr(), + style: TextStyle( + color: AppThemeData.primary300, + fontSize: 14, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w600, + ), + ), ), ], ), @@ -280,9 +449,16 @@ class OnDemandHomeScreen extends StatelessWidget { shrinkWrap: true, padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), - itemCount: controller.providerList.length >= 6 ? 6 : controller.providerList.length, + itemCount: + controller.providerList.length >= 6 + ? 6 + : controller.providerList.length, itemBuilder: (_, index) { - return ServiceView(provider: controller.providerList[index], controller: controller, isDark: isDark); + return ServiceView( + provider: controller.providerList[index], + controller: controller, + isDark: isDark, + ); }, ), ], @@ -334,7 +510,13 @@ class BannerView extends StatelessWidget { final banner = bannerList[index]; return ClipRRect( borderRadius: BorderRadius.circular(15), - child: SizedBox(width: MediaQuery.of(context).size.width * 0.8, child: NetworkImageWidget(imageUrl: banner.photo ?? '', fit: BoxFit.cover)), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.8, + child: NetworkImageWidget( + imageUrl: banner.photo ?? '', + fit: BoxFit.cover, + ), + ), ); }, ), @@ -344,7 +526,18 @@ class BannerView extends StatelessWidget { return Row( children: List.generate(bannerList.length, (index) { bool isSelected = currentPage.value == index; - return Expanded(child: Container(height: 4, decoration: BoxDecoration(color: isSelected ? AppThemeData.grey300 : AppThemeData.grey100, borderRadius: BorderRadius.circular(5)))); + return Expanded( + child: Container( + height: 4, + decoration: BoxDecoration( + color: + isSelected + ? AppThemeData.grey300 + : AppThemeData.grey100, + borderRadius: BorderRadius.circular(5), + ), + ), + ); }), ); }), @@ -358,7 +551,12 @@ class CategoryView extends StatelessWidget { final int index; final bool isDark; - const CategoryView({super.key, required this.category, required this.index, required this.isDark}); + const CategoryView({ + super.key, + required this.category, + required this.index, + required this.isDark, + }); @override Widget build(BuildContext context) { @@ -370,11 +568,21 @@ class CategoryView extends StatelessWidget { Container( height: 55, width: 55, - decoration: BoxDecoration(color: Constant.colorList[index % Constant.colorList.length], borderRadius: BorderRadius.circular(50)), + decoration: BoxDecoration( + color: Constant.colorList[index % Constant.colorList.length], + borderRadius: BorderRadius.circular(50), + ), child: ClipOval( child: Padding( padding: const EdgeInsets.all(14.0), - child: CachedNetworkImage(imageUrl: category.image.toString(), errorWidget: (_, __, ___) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover)), + child: CachedNetworkImage( + imageUrl: category.image.toString(), + errorWidget: + (_, __, ___) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + ), + ), ), ), ), @@ -382,7 +590,15 @@ class CategoryView extends StatelessWidget { SizedBox( width: 70, child: Center( - child: Text(category.title ?? "", textAlign: TextAlign.center, maxLines: 1, style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + category.title ?? "", + textAlign: TextAlign.center, + maxLines: 1, + style: AppThemeData.semiBoldTextStyle( + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ), ), ], @@ -396,40 +612,70 @@ class ServiceView extends StatelessWidget { final bool isDark; final OnDemandHomeController? controller; - const ServiceView({super.key, required this.provider, this.isDark = false, this.controller}); + const ServiceView({ + super.key, + required this.provider, + this.isDark = false, + this.controller, + }); @override Widget build(BuildContext context) { return GestureDetector( onTap: () { - Get.to(() => OnDemandDetailsScreen(), arguments: {'providerModel': provider}); + Get.to( + () => OnDemandDetailsScreen(), + arguments: {'providerModel': provider}, + ); }, child: Container( margin: const EdgeInsets.symmetric(vertical: 5), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.grey500 : Colors.grey.shade200), + border: Border.all( + color: isDark ? AppThemeData.grey500 : Colors.grey.shade200, + ), color: isDark ? AppThemeData.grey900 : Colors.white, ), child: Row( children: [ // --- Left Image --- ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: CachedNetworkImage( - imageUrl: provider.photos.isNotEmpty ? provider.photos[0] : Constant.placeHolderImage, + imageUrl: + provider.photos.isNotEmpty + ? provider.photos[0] + : Constant.placeHolderImage, width: 110, height: MediaQuery.of(context).size.height * 0.16, fit: BoxFit.cover, - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: AlwaysStoppedAnimation( + AppThemeData.primary300, + ), + ), + ), + errorWidget: + (context, url, error) => Image.network( + Constant.placeHolderImage, + fit: BoxFit.cover, + ), ), ), // --- Right Content --- Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 10, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -442,17 +688,40 @@ class ServiceView extends StatelessWidget { provider.title ?? "", maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : Colors.black, + ), ), ), if (controller != null) Obx( () => GestureDetector( - onTap: () => controller!.toggleFavourite(provider), + onTap: + () => controller!.toggleFavourite(provider), child: Icon( - controller!.lstFav.where((element) => element.service_id == provider.id).isNotEmpty ? Icons.favorite : Icons.favorite_border, + controller!.lstFav + .where( + (element) => + element.service_id == provider.id, + ) + .isNotEmpty + ? Icons.favorite + : Icons.favorite_border, size: 24, - color: controller!.lstFav.where((element) => element.service_id == provider.id).isNotEmpty ? AppThemeData.primary300 : (isDark ? Colors.white38 : Colors.black38), + color: + controller!.lstFav + .where( + (element) => + element.service_id == + provider.id, + ) + .isNotEmpty + ? AppThemeData.primary300 + : (isDark + ? Colors.white38 + : Colors.black38), ), ), ), @@ -464,10 +733,18 @@ class ServiceView extends StatelessWidget { // Category if (controller != null) FutureBuilder( - future: controller!.getCategory(provider.categoryId ?? ""), + future: controller!.getCategory( + provider.categoryId ?? "", + ), builder: (ctx, snap) { if (!snap.hasData) return const SizedBox.shrink(); - return Text(snap.data?.title ?? "", style: TextStyle(fontSize: 13, color: isDark ? Colors.white70 : Colors.black54)); + return Text( + snap.data?.title ?? "", + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white70 : Colors.black54, + ), + ); }, ), @@ -493,21 +770,39 @@ class ServiceView extends StatelessWidget { Widget _buildPrice() { if (provider.disPrice == "" || provider.disPrice == "0") { return Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ); } else { return Row( children: [ Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', - style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: isDark ? Colors.white : AppThemeData.primary300), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.disPrice ?? '0') + : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppThemeData.primary300, + ), ), const SizedBox(width: 6), Flexible( child: Text( - provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) : '${Constant.amountShow(amount: provider.price ?? "0")}/hr', - style: const TextStyle(fontSize: 12, color: Colors.grey, decoration: TextDecoration.lineThrough), + provider.priceUnit == 'Fixed' + ? Constant.amountShow(amount: provider.price) + : '${Constant.amountShow(amount: provider.price ?? "0")}/hr', + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + decoration: TextDecoration.lineThrough, + ), overflow: TextOverflow.ellipsis, ), ), @@ -522,11 +817,21 @@ class ServiceView extends StatelessWidget { rating = (provider.reviewsSum ?? 0) / (provider.reviewsCount ?? 1); } return Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(12), + ), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Row( mainAxisSize: MainAxisSize.min, - children: [const Icon(Icons.star, size: 14, color: Colors.white), const SizedBox(width: 3), Text(rating.toStringAsFixed(1), style: const TextStyle(fontSize: 12, color: Colors.white))], + children: [ + const Icon(Icons.star, size: 14, color: Colors.white), + const SizedBox(width: 3), + Text( + rating.toStringAsFixed(1), + style: const TextStyle(fontSize: 12, color: Colors.white), + ), + ], ), ); } diff --git a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart index 95c1555..9db13d4 100644 --- a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart @@ -2,7 +2,7 @@ import 'package:clipboard/clipboard.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import '../../controllers/on_demand_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -38,12 +38,30 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Order Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -56,63 +74,147 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - (controller.onProviderOrder.value?.status ?? '') == Constant.orderCancelled + (controller.onProviderOrder.value?.status ?? '') == + Constant.orderCancelled ? Container( width: MediaQuery.of(context).size.width, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + padding: EdgeInsets.symmetric( + vertical: 8, + horizontal: 8, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Cancel Reason'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(controller.onProviderOrder.value?.reason ?? '', style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.danger300)), + Text( + 'Cancel Reason'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller + .onProviderOrder + .value + ?.reason ?? + '', + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.danger300, + ), + ), ], ), ), ) : Container(), - (controller.onProviderOrder.value?.status ?? '') == Constant.orderCancelled ? SizedBox(height: 10) : SizedBox.shrink(), + (controller.onProviderOrder.value?.status ?? '') == + Constant.orderCancelled + ? SizedBox(height: 10) + : SizedBox.shrink(), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( - padding: EdgeInsets.symmetric(vertical: 15, horizontal: 10), + padding: EdgeInsets.symmetric( + vertical: 15, + horizontal: 10, + ), child: Column( children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text('Booking ID'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + 'Booking ID'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), InkWell( onTap: () { - FlutterClipboard.copy(controller.onProviderOrder.value?.id ?? '').then((value) { + FlutterClipboard.copy( + controller + .onProviderOrder + .value + ?.id ?? + '', + ).then((value) { SnackBar snackBar = SnackBar( content: Text( "Booking ID Copied".tr(), textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), backgroundColor: Colors.black38, ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); + ScaffoldMessenger.of( + context, + ).showSnackBar(snackBar); }); }, - child: Text('# ${controller.onProviderOrder.value?.id ?? ''}', style: AppThemeData.mediumTextStyle(fontSize: 15, color: AppThemeData.primary300)), + child: Text( + '# ${controller.onProviderOrder.value?.id ?? ''}', + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: AppThemeData.primary300, + ), + ), ), ], ), SizedBox(height: 10), Text( "${'Booking Address :'.tr()} ${controller.onProviderOrder.value?.address?.getFullAddress()}", - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -122,8 +224,16 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Row( children: [ @@ -136,8 +246,20 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { borderRadius: BorderRadius.circular(10), image: DecorationImage( image: NetworkImage( - (controller.onProviderOrder.value != null && controller.onProviderOrder.value!.provider.photos.isNotEmpty) - ? controller.onProviderOrder.value!.provider.photos.first + (controller.onProviderOrder.value != + null && + controller + .onProviderOrder + .value! + .provider + .photos + .isNotEmpty) + ? controller + .onProviderOrder + .value! + .provider + .photos + .first : Constant.placeHolderImage, ), fit: BoxFit.cover, @@ -152,23 +274,71 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 6), child: Text( - controller.onProviderOrder.value?.provider.title ?? "", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .onProviderOrder + .value + ?.provider + .title ?? + "", + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Row( children: [ Padding( - padding: const EdgeInsets.only(top: 6), - child: Text('${'Date:'.tr()} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only( + top: 6, + ), + child: Text( + '${'Date:'.tr()} ', + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ), Padding( - padding: const EdgeInsets.only(top: 6), + padding: const EdgeInsets.only( + top: 6, + ), child: Text( - controller.onProviderOrder.value?.scheduleDateTime != null - ? DateFormat('dd-MMM-yyyy').format(controller.onProviderOrder.value!.scheduleDateTime!.toDate()) + controller + .onProviderOrder + .value + ?.scheduleDateTime != + null + ? DateFormat( + 'dd-MMM-yyyy', + ).format( + controller + .onProviderOrder + .value! + .scheduleDateTime! + .toDate(), + ) : "", - style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), ], @@ -176,16 +346,51 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( children: [ Padding( - padding: const EdgeInsets.only(top: 6), - child: Text('${'Time:'.tr()} ', style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only( + top: 6, + ), + child: Text( + '${'Time:'.tr()} ', + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ), Padding( - padding: const EdgeInsets.only(top: 6), + padding: const EdgeInsets.only( + top: 6, + ), child: Text( - controller.onProviderOrder.value?.scheduleDateTime != null - ? DateFormat('hh:mm a').format(controller.onProviderOrder.value!.scheduleDateTime!.toDate()) + controller + .onProviderOrder + .value + ?.scheduleDateTime != + null + ? DateFormat('hh:mm a').format( + controller + .onProviderOrder + .value! + .scheduleDateTime! + .toDate(), + ) : "", - style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), ], @@ -196,23 +401,50 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ], ), ), - (controller.onProviderOrder.value?.status == Constant.orderAccepted || - controller.onProviderOrder.value?.status == Constant.orderAssigned || - controller.onProviderOrder.value?.status == Constant.orderOngoing || - controller.onProviderOrder.value?.status == Constant.orderCompleted) && - (controller.onProviderOrder.value?.workerId != null && controller.onProviderOrder.value!.workerId!.isNotEmpty) + (controller.onProviderOrder.value?.status == + Constant.orderAccepted || + controller.onProviderOrder.value?.status == + Constant.orderAssigned || + controller.onProviderOrder.value?.status == + Constant.orderOngoing || + controller.onProviderOrder.value?.status == + Constant.orderCompleted) && + (controller.onProviderOrder.value?.workerId != + null && + controller + .onProviderOrder + .value! + .workerId! + .isNotEmpty) ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text('About Worker'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + 'About Worker'.tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -226,35 +458,99 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { CircleAvatar( radius: 30, backgroundImage: NetworkImage( - controller.worker.value?.profilePictureURL.isNotEmpty == true ? controller.worker.value!.profilePictureURL : Constant.placeHolderImage, + controller + .worker + .value + ?.profilePictureURL + .isNotEmpty == + true + ? controller + .worker + .value! + .profilePictureURL + : Constant + .placeHolderImage, ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - controller.worker.value?.fullName() ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.bold), + controller + .worker + .value + ?.fullName() ?? + '', + style: TextStyle( + color: + isDark + ? Colors + .white + : Colors + .black, + fontFamily: + AppThemeData + .regular, + fontSize: 14, + fontWeight: + FontWeight.bold, + ), + ), + const SizedBox( + height: 5, ), - const SizedBox(height: 5), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Padding( - padding: const EdgeInsets.only(top: 3), - child: Icon(Icons.location_on_outlined, size: 15, color: isDark ? Colors.white : Colors.black), + padding: + const EdgeInsets.only( + top: 3, + ), + child: Icon( + Icons + .location_on_outlined, + size: 15, + color: + isDark + ? Colors + .white + : Colors + .black, + ), ), Expanded( child: Text( - controller.worker.value?.address ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14), + controller + .worker + .value + ?.address ?? + '', + style: TextStyle( + color: + isDark + ? Colors + .white + : Colors + .black, + fontFamily: + AppThemeData + .regular, + fontSize: 14, + ), ), ), ], ), - const SizedBox(height: 10), + const SizedBox( + height: 10, + ), ], ), ), @@ -264,19 +560,61 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { SizedBox(width: 10), // Rating Box Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: + BorderRadius.circular(16), + ), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( - (controller.worker.value != null && double.parse(controller.worker.value!.reviewsCount.toString()) != 0) - ? (double.parse(controller.worker.value!.reviewsSum.toString()) / double.parse(controller.worker.value!.reviewsCount.toString())) + (controller.worker.value != + null && + double.parse( + controller + .worker + .value! + .reviewsCount + .toString(), + ) != + 0) + ? (double.parse( + controller + .worker + .value! + .reviewsSum + .toString(), + ) / + double.parse( + controller + .worker + .value! + .reviewsCount + .toString(), + )) .toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: + AppThemeData.regular, + fontWeight: + FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -284,17 +622,40 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ], ), Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderCompleted ? true : false, + visible: + controller + .onProviderOrder + .value + ?.status == + Constant.orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: SizedBox( - width: MediaQuery.of(context).size.width, + width: + MediaQuery.of( + context, + ).size.width, child: ElevatedButton( // onPressed: () async { // Get.to(() => OnDemandReviewScreen(), arguments: {'order': controller.onProviderOrder.value, 'reviewFor': "Worker"}); // }, onPressed: () async { - final result = await Get.to(() => OnDemandReviewScreen(), arguments: {'order': controller.onProviderOrder.value, 'reviewFor': "Worker"}); + final result = await Get.to( + () => + OnDemandReviewScreen(), + arguments: { + 'order': + controller + .onProviderOrder + .value, + 'reviewFor': "Worker", + }, + ); // If review was submitted successfully if (result == true) { @@ -302,33 +663,105 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { } }, - style: ElevatedButton.styleFrom(backgroundColor: Colors.orange, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), - child: Text('Add Review'.tr(), style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + style: ElevatedButton.styleFrom( + backgroundColor: + Colors.orange, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), + child: Text( + 'Add Review'.tr(), + style: + AppThemeData.regularTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + ), ), ), ), ), - controller.onProviderOrder.value?.status == Constant.orderAccepted || - controller.onProviderOrder.value?.status == Constant.orderOngoing || - controller.onProviderOrder.value?.status == Constant.orderAssigned + controller + .onProviderOrder + .value + ?.status == + Constant.orderAccepted || + controller + .onProviderOrder + .value + ?.status == + Constant.orderOngoing || + controller + .onProviderOrder + .value + ?.status == + Constant.orderAssigned ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, children: [ Expanded( child: ElevatedButton( onPressed: () async { - Constant.makePhoneCall(controller.worker.value!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .worker + .value! + .phoneNumber + .toString(), + ); }, - style: ElevatedButton.styleFrom(backgroundColor: Color(0xFFFF6839), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: Color( + 0xFFFF6839, + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ - Icon(Icons.call, color: AppThemeData.grey50), + Icon( + Icons.call, + color: + AppThemeData + .grey50, + ), SizedBox(width: 10), - Text('Call'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Call'.tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), @@ -337,32 +770,88 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Expanded( child: ElevatedButton( onPressed: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": Constant.userModel?.fullName(), - "restaurantName": "${controller.worker.value?.firstName ?? ''} ${controller.worker.value?.lastName ?? ''}", - "orderId": controller.onProviderOrder.value?.id, - "restaurantId": controller.worker.value?.id, - "customerId": Constant.userModel?.id, - "customerProfileImage": Constant.userModel?.profilePictureURL, - "restaurantProfileImage": controller.worker.value?.profilePictureURL, - "token": controller.worker.value?.fcmToken, - "chatType": 'worker', + "customerName": + Constant + .userModel + ?.fullName(), + "restaurantName": + "${controller.worker.value?.firstName ?? ''} ${controller.worker.value?.lastName ?? ''}", + "orderId": + controller + .onProviderOrder + .value + ?.id, + "restaurantId": + controller + .worker + .value + ?.id, + "customerId": + Constant + .userModel + ?.id, + "customerProfileImage": + Constant + .userModel + ?.profilePictureURL, + "restaurantProfileImage": + controller + .worker + .value + ?.profilePictureURL, + "token": + controller + .worker + .value + ?.fcmToken, + "chatType": + 'worker', }, ); }, - style: ElevatedButton.styleFrom(backgroundColor: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: + AppThemeData + .primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, children: [ - Icon(Icons.chat_bubble, color: AppThemeData.grey50), + Icon( + Icons.chat_bubble, + color: + AppThemeData + .grey50, + ), SizedBox(width: 10), - Text('Chat'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Chat'.tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), @@ -380,13 +869,30 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : SizedBox(), Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("About provider".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "About provider".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( padding: const EdgeInsets.all(8.0), @@ -400,22 +906,56 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { CircleAvatar( radius: 30, backgroundImage: NetworkImage( - controller.providerUser.value?.profilePictureURL?.isNotEmpty == true ? controller.providerUser.value!.profilePictureURL! : Constant.placeHolderImage, + controller + .providerUser + .value + ?.profilePictureURL + ?.isNotEmpty == + true + ? controller + .providerUser + .value! + .profilePictureURL! + : Constant.placeHolderImage, ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.providerUser.value?.fullName() ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.bold), + controller.providerUser.value + ?.fullName() ?? + '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.bold, + ), ), const SizedBox(height: 5), Text( - controller.providerUser.value?.email ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14), + controller + .providerUser + .value + ?.email ?? + '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontSize: 14, + ), ), const SizedBox(height: 10), ], @@ -426,19 +966,57 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), // Rating Box Container( - decoration: BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.circular(16)), - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.circular(16), + ), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( - (controller.providerUser.value != null && double.parse(controller.providerUser.value!.reviewsCount.toString()) != 0) - ? (double.parse(controller.providerUser.value!.reviewsSum.toString()) / double.parse(controller.providerUser.value!.reviewsCount.toString())) + (controller.providerUser.value != + null && + double.parse( + controller + .providerUser + .value! + .reviewsCount + .toString(), + ) != + 0) + ? (double.parse( + controller + .providerUser + .value! + .reviewsSum + .toString(), + ) / + double.parse( + controller + .providerUser + .value! + .reviewsCount + .toString(), + )) .toStringAsFixed(1) : '0', - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -446,86 +1024,251 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ], ), Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderCompleted ? true : false, + visible: + controller + .onProviderOrder + .value + ?.status == + Constant.orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: SizedBox( width: MediaQuery.of(context).size.width, child: ElevatedButton( onPressed: () async { - final result = await Get.to(() => OnDemandReviewScreen(), arguments: {'order': controller.onProviderOrder.value, 'reviewFor': "Provider"}); + final result = await Get.to( + () => OnDemandReviewScreen(), + arguments: { + 'order': + controller + .onProviderOrder + .value, + 'reviewFor': "Provider", + }, + ); if (result == true) { await controller.getData(); } }, - style: ElevatedButton.styleFrom(backgroundColor: Colors.orange, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), - child: Text('Add Review'.tr(), style: AppThemeData.regularTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.orange, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 16, + ), + ), + ), + child: Text( + 'Add Review'.tr(), + style: AppThemeData.regularTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), ), ), ), - controller.onProviderOrder.value?.status == Constant.orderAccepted || - controller.onProviderOrder.value?.status == Constant.orderOngoing || - controller.onProviderOrder.value?.status == Constant.orderAssigned + controller.onProviderOrder.value?.status == + Constant.orderAccepted || + controller + .onProviderOrder + .value + ?.status == + Constant.orderOngoing || + controller + .onProviderOrder + .value + ?.status == + Constant.orderAssigned ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: ElevatedButton( onPressed: () async { - Constant.makePhoneCall(controller.providerUser.value!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .providerUser + .value! + .phoneNumber + .toString(), + ); }, - style: ElevatedButton.styleFrom(backgroundColor: Color(0xFFFF6839), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: Color( + 0xFFFF6839, + ), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(16), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Icon(Icons.call, color: AppThemeData.grey50), + Icon( + Icons.call, + color: AppThemeData.grey50, + ), SizedBox(width: 10), - Text('Call'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Call'.tr(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), ), - if ((Constant.isSubscriptionModelApplied == false && Constant.sectionConstantModel?.adminCommision?.isEnabled == false) || - ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && - controller.onProviderOrder.value?.provider.subscriptionPlan?.features?.chat == true)) + if ((Constant.isSubscriptionModelApplied == + false && + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + false) || + ((Constant.isSubscriptionModelApplied == + true || + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + true) && + controller + .onProviderOrder + .value + ?.provider + .subscriptionPlan + ?.features + ?.chat == + true)) const SizedBox(width: 10), - if ((Constant.isSubscriptionModelApplied == false && Constant.sectionConstantModel?.adminCommision?.isEnabled == false) || - ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && - controller.onProviderOrder.value?.provider.subscriptionPlan?.features?.chat == true)) + if ((Constant.isSubscriptionModelApplied == + false && + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + false) || + ((Constant.isSubscriptionModelApplied == + true || + Constant + .sectionConstantModel + ?.adminCommision + ?.isEnabled == + true) && + controller + .onProviderOrder + .value + ?.provider + .subscriptionPlan + ?.features + ?.chat == + true)) Expanded( child: ElevatedButton( onPressed: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": Constant.userModel?.fullName(), - "restaurantName": "${controller.providerUser.value?.firstName ?? ''} ${controller.providerUser.value?.lastName ?? ''}", - "orderId": controller.onProviderOrder.value?.id, - "restaurantId": controller.providerUser.value?.id, - "customerId": Constant.userModel?.id, - "customerProfileImage": Constant.userModel?.profilePictureURL, - "restaurantProfileImage": controller.providerUser.value?.profilePictureURL, - "token": controller.providerUser.value?.fcmToken, + "customerName": + Constant.userModel + ?.fullName(), + "restaurantName": + "${controller.providerUser.value?.firstName ?? ''} ${controller.providerUser.value?.lastName ?? ''}", + "orderId": + controller + .onProviderOrder + .value + ?.id, + "restaurantId": + controller + .providerUser + .value + ?.id, + "customerId": + Constant + .userModel + ?.id, + "customerProfileImage": + Constant + .userModel + ?.profilePictureURL, + "restaurantProfileImage": + controller + .providerUser + .value + ?.profilePictureURL, + "token": + controller + .providerUser + .value + ?.fcmToken, "chatType": 'Provider', }, ); }, - style: ElevatedButton.styleFrom(backgroundColor: AppThemeData.primary300, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16))), + style: ElevatedButton.styleFrom( + backgroundColor: + AppThemeData.primary300, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 16, + ), + ), + ), child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ - Icon(Icons.chat_bubble, color: AppThemeData.grey50), + Icon( + Icons.chat_bubble, + color: + AppThemeData.grey50, + ), SizedBox(width: 10), - Text('Chat'.tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: AppThemeData.grey50)), + Text( + 'Chat'.tr(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + AppThemeData + .grey50, + ), + ), ], ), ), @@ -538,14 +1281,31 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), ), - (controller.onProviderOrder.value?.status != Constant.orderCompleted || controller.onProviderOrder.value?.status != Constant.orderCancelled) && - controller.onProviderOrder.value?.provider.priceUnit == "Fixed" + (controller.onProviderOrder.value?.status != + Constant.orderCompleted || + controller.onProviderOrder.value?.status != + Constant.orderCancelled) && + controller + .onProviderOrder + .value + ?.provider + .priceUnit == + "Fixed" ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.symmetric(vertical: 10), - child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Price Detail".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), priceTotalRow(controller, isDark), ], @@ -553,18 +1313,44 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - controller.onProviderOrder.value?.paymentStatus == false || controller.onProviderOrder.value?.extraPaymentStatus == false + controller + .onProviderOrder + .value + ?.paymentStatus == + false || + controller + .onProviderOrder + .value + ?.extraPaymentStatus == + false ? Column( children: [ controller.couponList.isNotEmpty ? SizedBox( height: 85, child: ListView.builder( - itemCount: controller.couponList.length, - scrollDirection: Axis.horizontal, + itemCount: + controller + .couponList + .length, + scrollDirection: + Axis.horizontal, itemBuilder: (context, index) { - final coupon = controller.couponList[index]; - return GestureDetector(onTap: () => controller.applyCoupon(coupon), child: buildOfferItem(controller, index, isDark)); + final coupon = + controller + .couponList[index]; + return GestureDetector( + onTap: + () => controller + .applyCoupon( + coupon, + ), + child: buildOfferItem( + controller, + index, + isDark, + ), + ); }, ), ) @@ -575,46 +1361,112 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : Offstage(), Padding( padding: EdgeInsets.symmetric(vertical: 16), - child: Text("Price Detail".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + child: Text( + "Price Detail".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), ), priceTotalRow(controller, isDark), ], ), - controller.onProviderOrder.value?.extraCharges.toString() != "" + controller.onProviderOrder.value?.extraCharges + .toString() != + "" ? Container( margin: EdgeInsets.symmetric(vertical: 10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Container( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 10), + padding: EdgeInsets.symmetric( + vertical: 8, + horizontal: 10, + ), child: Column( children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Total Extra Charges : ".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), Text( - Constant.amountShow(amount: controller.onProviderOrder.value?.extraCharges.toString()), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + "Total Extra Charges : ".tr(), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), + ), + Text( + Constant.amountShow( + amount: + controller + .onProviderOrder + .value + ?.extraCharges + .toString(), + ), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ), SizedBox(height: 5), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( "Extra charge Notes : ".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ), Text( - controller.onProviderOrder.value?.extraChargesDescription ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + controller + .onProviderOrder + .value + ?.extraChargesDescription ?? + '', + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ), @@ -625,39 +1477,101 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : SizedBox(), SizedBox(height: 10), Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderPlaced || controller.onProviderOrder.value?.newScheduleDateTime != null ? true : false, + visible: + controller.onProviderOrder.value?.status == + Constant.orderPlaced || + controller + .onProviderOrder + .value + ?.newScheduleDateTime != + null + ? true + : false, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey100, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, ), child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), child: Column( children: [ - controller.onProviderOrder.value?.newScheduleDateTime != null + controller + .onProviderOrder + .value + ?.newScheduleDateTime != + null ? Row( children: [ - Text("New Date : ".tr(), style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500)), Text( - DateFormat('dd-MMM-yyyy hh:mm a').format(controller.onProviderOrder.value!.newScheduleDateTime!.toDate()), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500), + "New Date : ".tr(), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontWeight: FontWeight.w500, + ), + ), + Text( + DateFormat( + 'dd-MMM-yyyy hh:mm a', + ).format( + controller + .onProviderOrder + .value! + .newScheduleDateTime! + .toDate(), + ), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black, + fontFamily: + AppThemeData.regular, + fontWeight: FontWeight.w500, + ), ), ], ) : SizedBox(), - controller.onProviderOrder.value?.status == Constant.orderPlaced || controller.onProviderOrder.value?.status == Constant.orderAccepted + controller.onProviderOrder.value?.status == + Constant.orderPlaced || + controller + .onProviderOrder + .value + ?.status == + Constant.orderAccepted ? Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( title: "Cancel Booking".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { - showCancelBookingDialog(controller, isDark); + showCancelBookingDialog( + controller, + isDark, + ); }, ), ) @@ -669,7 +1583,10 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(height: 20), - controller.onProviderOrder.value?.extraPaymentStatus == false && controller.onProviderOrder.value?.status == Constant.orderOngoing + controller.onProviderOrder.value?.extraPaymentStatus == + false && + controller.onProviderOrder.value?.status == + Constant.orderOngoing ? Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( @@ -678,17 +1595,43 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { textColor: AppThemeData.grey50, onPress: () async { double finalTotalAmount = 0.0; - finalTotalAmount = double.parse(controller.onProviderOrder.value!.extraCharges.toString()); - Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': controller.onProviderOrder, 'totalAmount': finalTotalAmount, 'isExtra': true}); + finalTotalAmount = double.parse( + controller + .onProviderOrder + .value! + .extraCharges + .toString(), + ); + Get.to( + () => OnDemandPaymentScreen(), + arguments: { + 'onDemandOrderModel': + controller.onProviderOrder, + 'totalAmount': finalTotalAmount, + 'isExtra': true, + }, + ); }, ), ) : SizedBox(), - controller.onProviderOrder.value?.provider.priceUnit != "Fixed" && controller.onProviderOrder.value?.paymentStatus == false + controller.onProviderOrder.value?.provider.priceUnit != + "Fixed" && + controller + .onProviderOrder + .value + ?.paymentStatus == + false ? Visibility( - visible: controller.onProviderOrder.value?.status == Constant.orderOngoing ? true : false, + visible: + controller.onProviderOrder.value?.status == + Constant.orderOngoing + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( title: 'Pay Now'.tr(), color: AppThemeData.primary300, @@ -697,13 +1640,46 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { double finalTotalAmount = 0.0; finalTotalAmount = controller.totalAmount.value + - double.parse(controller.onProviderOrder.value!.extraCharges!.isNotEmpty ? controller.onProviderOrder.value!.extraCharges.toString() : "0.0"); - controller.onProviderOrder.value?.discount = controller.discountAmount.toString(); - controller.onProviderOrder.value?.discountType = controller.discountType.toString(); - controller.onProviderOrder.value?.discountLabel = controller.discountLabel.toString(); - controller.onProviderOrder.value?.couponCode = controller.offerCode.toString(); + double.parse( + controller + .onProviderOrder + .value! + .extraCharges! + .isNotEmpty + ? controller + .onProviderOrder + .value! + .extraCharges + .toString() + : "0.0", + ); + controller.onProviderOrder.value?.discount = + controller.discountAmount.toString(); + controller + .onProviderOrder + .value + ?.discountType = + controller.discountType.toString(); + controller + .onProviderOrder + .value + ?.discountLabel = + controller.discountLabel.toString(); + controller + .onProviderOrder + .value + ?.couponCode = + controller.offerCode.toString(); - Get.to(() => OnDemandPaymentScreen(), arguments: {'onDemandOrderModel': controller.onProviderOrder, 'totalAmount': finalTotalAmount, 'isExtra': false}); + Get.to( + () => OnDemandPaymentScreen(), + arguments: { + 'onDemandOrderModel': + controller.onProviderOrder, + 'totalAmount': finalTotalAmount, + 'isExtra': false, + }, + ); }, ), ), @@ -717,7 +1693,11 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ); } - Widget buildOfferItem(OnDemandOrderDetailsController controller, int index, bool isDark) { + Widget buildOfferItem( + OnDemandOrderDetailsController controller, + int index, + bool isDark, + ) { return Obx(() { final coupon = controller.couponList[index]; @@ -725,7 +1705,11 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { margin: const EdgeInsets.fromLTRB(7, 10, 7, 10), height: 85, child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: AppThemeData.primary300, + ), child: Padding( padding: const EdgeInsets.fromLTRB(12, 5, 12, 0), child: Column( @@ -734,13 +1718,26 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Image(image: AssetImage('assets/images/offer_icon.png'), height: 25, width: 25), + const Image( + image: AssetImage('assets/images/offer_icon.png'), + height: 25, + width: 25, + ), const SizedBox(width: 10), Container( margin: const EdgeInsets.only(top: 3), child: Text( - coupon.discountType == "Fix Price" ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" : "${coupon.discount} ${'% Off'.tr()}", - style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 0.7, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.discountType == "Fix Price" + ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" + : "${coupon.discount} ${'% Off'.tr()}", + style: TextStyle( + fontWeight: FontWeight.bold, + letterSpacing: 0.7, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), ], @@ -749,11 +1746,36 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(coupon.code ?? '', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, letterSpacing: 0.5, color: Colors.orange)), - Container(margin: const EdgeInsets.only(left: 15, right: 15, top: 3), width: 1, color: AppThemeData.grey50), Text( - "valid till ".tr() + controller.getDate(coupon.expiresAt!.toDate().toString()), - style: TextStyle(letterSpacing: 0.5, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + coupon.code ?? '', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + letterSpacing: 0.5, + color: Colors.orange, + ), + ), + Container( + margin: const EdgeInsets.only( + left: 15, + right: 15, + top: 3, + ), + width: 1, + color: AppThemeData.grey50, + ), + Text( + "valid till ".tr() + + controller.getDate( + coupon.expiresAt!.toDate().toString(), + ), + style: TextStyle( + letterSpacing: 0.5, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -765,13 +1787,19 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { }); } - Widget buildPromoCode(OnDemandOrderDetailsController controller, bool isDark) { + Widget buildPromoCode( + OnDemandOrderDetailsController controller, + bool isDark, + ) { return GestureDetector( child: Container( margin: const EdgeInsets.only(top: 10, bottom: 13), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, width: 0.3), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + width: 0.3, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Padding( @@ -782,17 +1810,37 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Expanded( child: Row( children: [ - Image.asset("assets/images/reedem.png", height: 50, width: 50), + Image.asset( + "assets/images/reedem.png", + height: 50, + width: 50, + ), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Promo Code".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), overflow: TextOverflow.ellipsis), + Text( + "Promo Code".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + overflow: TextOverflow.ellipsis, + ), const SizedBox(height: 5), Text( "Apply promo code".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), overflow: TextOverflow.ellipsis, ), ], @@ -803,7 +1851,13 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), FloatingActionButton( onPressed: () { - Get.bottomSheet(promoCodeSheet(controller, isDark), isScrollControlled: true, isDismissible: true, backgroundColor: Colors.transparent, enableDrag: true); + Get.bottomSheet( + promoCodeSheet(controller, isDark), + isScrollControlled: true, + isDismissible: true, + backgroundColor: Colors.transparent, + enableDrag: true, + ); }, mini: true, backgroundColor: Colors.blueGrey.shade50, @@ -817,11 +1871,17 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ); } - Widget promoCodeSheet(OnDemandOrderDetailsController controller, bool isDark) { + Widget promoCodeSheet( + OnDemandOrderDetailsController controller, + bool isDark, + ) { return Container( padding: EdgeInsets.only(bottom: Get.height / 4.3, left: 25, right: 25), height: Get.height * 0.88, - decoration: BoxDecoration(color: Colors.transparent, border: Border.all(style: BorderStyle.none)), + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all(style: BorderStyle.none), + ), child: Column( children: [ InkWell( @@ -829,50 +1889,114 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Container( height: 45, decoration: BoxDecoration( - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, width: 0.3), + border: Border.all( + color: + isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + width: 0.3, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, shape: BoxShape.circle, ), - child: Center(child: Icon(Icons.close, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, size: 28)), + child: Center( + child: Icon( + Icons.close, + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + size: 28, + ), + ), ), ), const SizedBox(height: 25), Expanded( child: Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + ), alignment: Alignment.center, child: SingleChildScrollView( child: Column( children: [ - Container(padding: const EdgeInsets.only(top: 30), child: const Image(image: AssetImage('assets/images/redeem_coupon.png'), width: 100)), Container( - padding: const EdgeInsets.only(top: 20), - child: Text('Redeem Your Coupons'.tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16)), - ), - Center( - child: Container( - padding: const EdgeInsets.only(top: 10, left: 22, right: 22), - child: Text("Voucher or Coupon code".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + padding: const EdgeInsets.only(top: 30), + child: const Image( + image: AssetImage('assets/images/redeem_coupon.png'), + width: 100, ), ), Container( - padding: const EdgeInsets.only(left: 20, right: 20, top: 20), + padding: const EdgeInsets.only(top: 20), + child: Text( + 'Redeem Your Coupons'.tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), + Center( + child: Container( + padding: const EdgeInsets.only( + top: 10, + left: 22, + right: 22, + ), + child: Text( + "Voucher or Coupon code".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), + ), + Container( + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 20, + ), child: DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(12), color: AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(12), + color: AppThemeData.primary300, + ), child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(12)), + borderRadius: const BorderRadius.all( + Radius.circular(12), + ), child: Container( padding: const EdgeInsets.all(20), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, alignment: Alignment.center, child: TextFormField( textAlign: TextAlign.center, - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, hintText: "Write Coupon Code".tr(), - hintStyle: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400), + hintStyle: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + ), ), ), ), @@ -880,27 +2004,47 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(top: 30, bottom: 30, left: 15, right: 15), + padding: const EdgeInsets.only( + top: 30, + bottom: 30, + left: 15, + right: 15, + ), child: RoundedButtonFill( title: "REDEEM NOW".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { - final inputCode = controller.couponTextController.value.text.trim().toLowerCase(); + final inputCode = + controller.couponTextController.value.text + .trim() + .toLowerCase(); print("Entered code: $inputCode"); - print("Available coupons: ${controller.couponList.map((e) => e.code).toList()}"); + print( + "Available coupons: ${controller.couponList.map((e) => e.code).toList()}", + ); - final matchingCoupon = controller.couponList.firstWhereOrNull((c) => (c.code ?? '').trim().toLowerCase() == inputCode); + final matchingCoupon = controller.couponList + .firstWhereOrNull( + (c) => + (c.code ?? '').trim().toLowerCase() == + inputCode, + ); if (matchingCoupon != null) { print("✅ Coupon matched: ${matchingCoupon.code}"); controller.applyCoupon(matchingCoupon); - Future.delayed(const Duration(milliseconds: 300), () { - Get.back(); - }); + Future.delayed( + const Duration(milliseconds: 300), + () { + Get.back(); + }, + ); } else { print("❌ No matching coupon found"); - ShowToastDialog.showToast("Applied coupon not valid.".tr()); + ShowToastDialog.showToast( + "Applied coupon not valid.".tr(), + ); } }, ), @@ -920,7 +2064,9 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - border: Border.all(color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100), + border: Border.all( + color: isDark ? AppThemeData.greyDark400 : AppThemeData.grey100, + ), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, ), child: Column( @@ -929,12 +2075,15 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { rowText( "Price".tr(), //Constant.amountShow(amount: controller.price.value.toString()), - controller.onProviderOrder.value?.provider.disPrice == "" || controller.onProviderOrder.value?.provider.disPrice == "0" + controller.onProviderOrder.value?.provider.disPrice == "" || + controller.onProviderOrder.value?.provider.disPrice == "0" ? "${Constant.amountShow(amount: controller.onProviderOrder.value?.provider.price.toString())} × ${controller.onProviderOrder.value?.quantity.toStringAsFixed(2)} ${Constant.amountShow(amount: controller.price.value.toString())}" : "${Constant.amountShow(amount: controller.onProviderOrder.value?.provider.disPrice.toString())} × ${controller.onProviderOrder.value?.quantity.toStringAsFixed(2)} ${Constant.amountShow(amount: controller.price.value.toString())}", isDark, ), - controller.discountAmount.value != 0 ? const Divider() : const SizedBox(), + controller.discountAmount.value != 0 + ? const Divider() + : const SizedBox(), controller.discountAmount.value != 0 ? Padding( padding: const EdgeInsets.symmetric(horizontal: 10), @@ -947,19 +2096,39 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Text( "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", - style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller.offerCode.value, + style: TextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), - Text(controller.offerCode.value, style: TextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ), ), - Text("(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", style: const TextStyle(color: Colors.red)), + Text( + "(-${Constant.amountShow(amount: controller.discountAmount.value.toString())})", + style: const TextStyle(color: Colors.red), + ), ], ), ) : const SizedBox(), const Divider(), - rowText("SubTotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + rowText( + "SubTotal".tr(), + Constant.amountShow(amount: controller.subTotal.value.toString()), + isDark, + ), const Divider(), ListView.builder( itemCount: Constant.taxList.length, @@ -970,19 +2139,39 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 8, + horizontal: 10, + ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( "${taxModel.title} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})", - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ), Text( - Constant.amountShow(amount: Constant.getTaxValue(amount: controller.subTotal.value.toString(), taxModel: taxModel).toString()), - style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + controller.subTotal.value.toString(), + taxModel: taxModel, + ).toString(), + ), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -993,7 +2182,13 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { }, ), // Total Amount - rowText("Total Amount".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + rowText( + "Total Amount".tr(), + Constant.amountShow( + amount: controller.totalAmount.value.toString(), + ), + isDark, + ), const SizedBox(height: 5), ], ), @@ -1007,28 +2202,55 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(value, style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + value, + style: AppThemeData.mediumTextStyle( + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); } - Future showCancelBookingDialog(OnDemandOrderDetailsController controller, bool isDark) { + Future showCancelBookingDialog( + OnDemandOrderDetailsController controller, + bool isDark, + ) { return Get.dialog( AlertDialog( backgroundColor: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - title: Text('Please give reason for canceling this Booking'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + title: Text( + 'Please give reason for canceling this Booking'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), content: TextFormField( controller: controller.cancelBookingController.value, maxLines: 5, - decoration: InputDecoration(hintText: "Specify your reason here".tr(), border: OutlineInputBorder(borderRadius: BorderRadius.circular(7))), + decoration: InputDecoration( + hintText: "Specify your reason here".tr(), + border: OutlineInputBorder(borderRadius: BorderRadius.circular(7)), + ), ), actions: [ - TextButton(onPressed: () => Get.back(), child: Text('Cancel'.tr(), style: TextStyle(color: Colors.red))), + TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr(), style: TextStyle(color: Colors.red)), + ), TextButton( onPressed: () async { - if (controller.cancelBookingController.value.text.trim().isEmpty) { + if (controller.cancelBookingController.value.text + .trim() + .isEmpty) { ShowToastDialog.showToast("Please enter reason".tr()); } else { await controller.cancelBooking(); diff --git a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart index dd6854a..c99539a 100644 --- a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/0n_demand_payment_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../payment/createRazorPayOrderModel.dart'; @@ -35,12 +35,30 @@ class OnDemandPaymentScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Select Payment Method".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -49,45 +67,106 @@ class OnDemandPaymentScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark200 : Colors.white), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), + decoration: BoxDecoration( + color: isDark ? AppThemeData.greyDark200 : Colors.white, + ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == + true || + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true) Column( children: [ const SizedBox(height: 10), Text( "Other Payment Options".tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -95,38 +174,155 @@ class OnDemandPaymentScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), Visibility( - visible: controller.payStackModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png"), + visible: + controller + .stripeModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller + .payPalModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller + .payStackModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), Visibility( - visible: controller.razorPayModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + visible: + controller + .mercadoPagoModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), ), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller + .flutterWaveModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller + .payFastModel + .value + .isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller + .razorPayModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller + .orangeMoneyModel + .value + .enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -137,55 +333,151 @@ class OnDemandPaymentScreen extends StatelessWidget { color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { - print("getTotalAmount :::::::: ${"${controller.totalAmount.value}"}"); + print( + "getTotalAmount :::::::: ${"${controller.totalAmount.value}"}", + ); if (controller.isOrderPlaced.value == false) { controller.isOrderPlaced.value = true; - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet("${controller.totalAmount.value}", context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment("${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - double totalAmount = double.parse("${controller.totalAmount.value}"); - double walletAmount = double.tryParse(Constant.userModel?.walletAmount?.toString() ?? "0") ?? 0; + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + "${controller.totalAmount.value}", + context, + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name) { + double totalAmount = double.parse( + "${controller.totalAmount.value}", + ); + double walletAmount = + double.tryParse( + Constant.userModel?.walletAmount + ?.toString() ?? + "0", + ) ?? + 0; if (walletAmount == 0) { - ShowToastDialog.showToast("Wallet balance is 0. Please recharge wallet.".tr()); + ShowToastDialog.showToast( + "Wallet balance is 0. Please recharge wallet." + .tr(), + ); } else if (walletAmount < totalAmount) { - ShowToastDialog.showToast("Insufficient wallet balance. Please add funds.".tr()); + ShowToastDialog.showToast( + "Insufficient wallet balance. Please add funds." + .tr(), + ); } else { controller.placeOrder(); } - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.cod.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.wallet.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, "${controller.totalAmount.value}"); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse("${controller.totalAmount.value}"), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: "${controller.totalAmount.value}", orderId: result.id); - } - }); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + "${controller.totalAmount.value}", + ); + } else if (controller + .selectedPaymentMethod + .value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + "${controller.totalAmount.value}", + ), + razorpayModel: + controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = + value; + controller.openCheckout( + amount: + "${controller.totalAmount.value}", + orderId: result.id, + ); + } + }); } else { controller.isOrderPlaced.value = false; - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } controller.isOrderPlaced.value = false; } @@ -215,8 +507,21 @@ class OnDemandPaymentScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -227,12 +532,30 @@ class OnDemandPaymentScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel?.walletAmount == null ? '0.0' : Constant.userModel?.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel?.walletAmount == null + ? '0.0' + : Constant.userModel?.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -241,14 +564,23 @@ class OnDemandPaymentScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart index f108a20..0b7a998 100644 --- a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/on_demand_review_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -34,61 +34,139 @@ class OnDemandReviewScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text(controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + controller.ratingModel.value != null + ? "Update Review".tr() + : "Add Review".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), ), body: Obx( () => - (controller.reviewFor.value == "Worker" && controller.workerModel.value == null) || (controller.reviewFor.value == "Provider" && controller.provider.value == null) + (controller.reviewFor.value == "Worker" && + controller.workerModel.value == null) || + (controller.reviewFor.value == "Provider" && + controller.provider.value == null) ? Constant.loader() : Padding( padding: const EdgeInsets.only(top: 50.0), child: Stack( children: [ Padding( - padding: const EdgeInsets.only(left: 20, right: 20, top: 42, bottom: 20), + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 42, + bottom: 20, + ), child: Card( elevation: 2, - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 65), child: Column( children: [ - Text('Rate for'.tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), Text( - controller.reviewFor.value == "Provider" ? controller.order.value!.provider.authorName ?? "" : controller.workerModel.value!.fullName(), - style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + 'Rate for'.tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Text( + controller.reviewFor.value == "Provider" + ? controller + .order + .value! + .provider + .authorName ?? + "" + : controller.workerModel.value! + .fullName(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), Padding( padding: const EdgeInsets.only(top: 10), child: RatingBar.builder( - initialRating: controller.ratings.value, + initialRating: + controller.ratings.value, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, - itemPadding: const EdgeInsets.symmetric(horizontal: 4.0), - itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), - unratedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, + itemPadding: + const EdgeInsets.symmetric( + horizontal: 4.0, + ), + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, onRatingUpdate: (rating) { controller.ratings.value = rating; }, ), ), - Padding(padding: EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr(), controller: controller.comment, maxLine: 5)), + Padding( + padding: EdgeInsets.all(20.0), + child: TextFieldWidget( + hintText: "Type comment....".tr(), + controller: controller.comment, + maxLine: 5, + ), + ), Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), + title: + controller.ratingModel.value != + null + ? "Update Review".tr() + : "Add Review".tr(), color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: controller.submitReview, @@ -105,7 +183,19 @@ class OnDemandReviewScreen extends StatelessWidget { child: ClipRRect( borderRadius: BorderRadius.circular(50), child: NetworkImageWidget( - imageUrl: controller.reviewFor.value == "Provider" ? controller.order.value?.provider.authorProfilePic ?? '' : controller.workerModel.value?.profilePictureURL ?? '', + imageUrl: + controller.reviewFor.value == "Provider" + ? controller + .order + .value + ?.provider + .authorProfilePic ?? + '' + : controller + .workerModel + .value + ?.profilePictureURL ?? + '', fit: BoxFit.cover, height: 100, width: 100, diff --git a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart index d582fc2..c0474bd 100644 --- a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart @@ -10,8 +10,7 @@ import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dar import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +24,19 @@ class ProviderInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Provider Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Provider Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -40,8 +48,12 @@ class ProviderInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); ShowToastDialog.closeLoader(); Get.to( @@ -62,15 +74,23 @@ class ProviderInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -87,13 +107,29 @@ class ProviderInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -101,7 +137,14 @@ class ProviderInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -116,7 +159,10 @@ class ProviderInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_provider').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_provider') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/on_demand_service/provider_screen.dart b/lib/screen_ui/on_demand_service/provider_screen.dart index 02e9936..e38223b 100644 --- a/lib/screen_ui/on_demand_service/provider_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_screen.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart' import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/provider_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/provider_serivce_model.dart'; @@ -26,58 +26,114 @@ class ProviderScreen extends StatelessWidget { controller.isLoading.value ? Center(child: Constant.loader()) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 50), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 50, + ), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ Center( child: - (controller.userModel.value?.profilePictureURL ?? "").isNotEmpty - ? CircleAvatar(backgroundImage: NetworkImage(controller.userModel.value?.profilePictureURL ?? ''), radius: 50.0) - : CircleAvatar(backgroundImage: NetworkImage(Constant.placeHolderImage), radius: 50.0), + (controller.userModel.value?.profilePictureURL ?? + "") + .isNotEmpty + ? CircleAvatar( + backgroundImage: NetworkImage( + controller + .userModel + .value + ?.profilePictureURL ?? + '', + ), + radius: 50.0, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + Constant.placeHolderImage, + ), + radius: 50.0, + ), ), const SizedBox(height: 10), Text( controller.userModel.value?.fullName() ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 20, fontWeight: FontWeight.w900), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 20, + fontWeight: FontWeight.w900, + ), ), const SizedBox(height: 5), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_mail.svg", color: isDark ? Colors.white : Colors.black), + SvgPicture.asset( + "assets/icons/ic_mail.svg", + color: isDark ? Colors.white : Colors.black, + ), const SizedBox(width: 6), Text( controller.userModel.value?.email ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.w500), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.w500, + ), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_mobile.svg", color: isDark ? Colors.white : Colors.black), + SvgPicture.asset( + "assets/icons/ic_mobile.svg", + color: isDark ? Colors.white : Colors.black, + ), const SizedBox(width: 6), Text( controller.userModel.value?.phoneNumber ?? '', - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontFamily: AppThemeData.regular, fontSize: 14, fontWeight: FontWeight.w500), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontFamily: AppThemeData.regular, + fontSize: 14, + fontWeight: FontWeight.w500, + ), ), ], ), const SizedBox(height: 10), Container( - decoration: const BoxDecoration(color: AppThemeData.warning400, borderRadius: BorderRadius.all(Radius.circular(16))), + decoration: const BoxDecoration( + color: AppThemeData.warning400, + borderRadius: BorderRadius.all(Radius.circular(16)), + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 5, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, size: 16, color: Colors.white), + const Icon( + Icons.star, + size: 16, + color: Colors.white, + ), const SizedBox(width: 3), Text( _getRating(controller), - style: const TextStyle(letterSpacing: 0.5, fontSize: 12, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w500, color: Colors.white), + style: const TextStyle( + letterSpacing: 0.5, + fontSize: 12, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w500, + color: Colors.white, + ), ), ], ), @@ -93,8 +149,14 @@ class ProviderScreen extends StatelessWidget { itemCount: controller.providerList.length, padding: EdgeInsets.zero, itemBuilder: (context, index) { - ProviderServiceModel data = controller.providerList[index]; - return ServiceView(provider: data, isDark: isDark, controller: controller.onDemandHomeController.value); + ProviderServiceModel data = + controller.providerList[index]; + return ServiceView( + provider: data, + isDark: isDark, + controller: + controller.onDemandHomeController.value, + ); }, ), ), @@ -107,8 +169,16 @@ class ProviderScreen extends StatelessWidget { } String _getRating(ProviderController controller) { - final reviewsCount = double.tryParse(controller.userModel.value?.reviewsCount?.toString() ?? "0") ?? 0; - final reviewsSum = double.tryParse(controller.userModel.value?.reviewsSum?.toString() ?? "0") ?? 0; + final reviewsCount = + double.tryParse( + controller.userModel.value?.reviewsCount?.toString() ?? "0", + ) ?? + 0; + final reviewsSum = + double.tryParse( + controller.userModel.value?.reviewsSum?.toString() ?? "0", + ) ?? + 0; if (reviewsCount == 0) return "0"; final avg = reviewsSum / reviewsCount; diff --git a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart index b180048..287ddba 100644 --- a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/view_all_popular_service_controller.dart'; @@ -32,12 +32,30 @@ class ViewAllPopularServiceScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("All Services".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "All Services".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -46,13 +64,29 @@ class ViewAllPopularServiceScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : Padding( - padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + padding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 15, + ), child: Column( children: [ - TextFieldWidget(hintText: "Search Service".tr(), controller: controller.searchTextFiledController.value, onchange: (value) => controller.getFilterData(value.toString())), + TextFieldWidget( + hintText: "Search Service".tr(), + controller: + controller.searchTextFiledController.value, + onchange: + (value) => + controller.getFilterData(value.toString()), + ), const SizedBox(height: 15), controller.providerList.isEmpty - ? Expanded(child: Center(child: Constant.showEmptyView(message: "No service Found".tr()))) + ? Expanded( + child: Center( + child: Constant.showEmptyView( + message: "No service Found".tr(), + ), + ), + ) : Expanded( child: ListView.builder( itemCount: controller.providerList.length, @@ -60,8 +94,14 @@ class ViewAllPopularServiceScreen extends StatelessWidget { padding: EdgeInsets.zero, scrollDirection: Axis.vertical, itemBuilder: (context, index) { - ProviderServiceModel data = controller.providerList[index]; - return ServiceView(provider: data, isDark: isDark, controller: controller.onDemandHomeController.value); + ProviderServiceModel data = + controller.providerList[index]; + return ServiceView( + provider: data, + isDark: isDark, + controller: + controller.onDemandHomeController.value, + ); }, ), ), diff --git a/lib/screen_ui/on_demand_service/view_category_service_screen.dart b/lib/screen_ui/on_demand_service/view_category_service_screen.dart index e86e7d9..467d535 100644 --- a/lib/screen_ui/on_demand_service/view_category_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_category_service_screen.dart @@ -1,6 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/view_category_service_controller.dart'; @@ -32,12 +32,30 @@ class ViewCategoryServiceListScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text(controller.categoryTitle.value, style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + controller.categoryTitle.value, + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -48,14 +66,22 @@ class ViewCategoryServiceListScreen extends StatelessWidget { : controller.providerList.isEmpty ? Constant.showEmptyView(message: "No Service Found".tr()) : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: ListView.builder( itemCount: controller.providerList.length, shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { - ProviderServiceModel providerModel = controller.providerList[index]; - return ServiceView(isDark: isDark, provider: providerModel, controller: controller.onDemandHomeController.value); + ProviderServiceModel providerModel = + controller.providerList[index]; + return ServiceView( + isDark: isDark, + provider: providerModel, + controller: controller.onDemandHomeController.value, + ); }, ), ), diff --git a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart index 4b32e36..e74599c 100644 --- a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart @@ -10,8 +10,7 @@ import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dar import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -25,10 +24,19 @@ class WorkerInboxScreen extends StatelessWidget { final isDark = themeController.isDark.value; return Scaffold( appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - title: Text("Worker Inbox".tr(), textAlign: TextAlign.start, style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900)), + title: Text( + "Worker Inbox".tr(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), + ), ), body: FirestorePagination( //item builder type is compulsory. @@ -40,11 +48,17 @@ class WorkerInboxScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader("Please wait...".tr()); - UserModel? customer = await FireStoreUtils.getUserProfile(inboxModel.customerId.toString()); - UserModel? restaurantUser = await FireStoreUtils.getUserProfile(inboxModel.restaurantId.toString()); + UserModel? customer = await FireStoreUtils.getUserProfile( + inboxModel.customerId.toString(), + ); + UserModel? restaurantUser = await FireStoreUtils.getUserProfile( + inboxModel.restaurantId.toString(), + ); ShowToastDialog.closeLoader(); - print("customerId: ${inboxModel.customerId}, restaurantId: ${inboxModel.restaurantId}"); + print( + "customerId: ${inboxModel.customerId}, restaurantId: ${inboxModel.restaurantId}", + ); Get.to( const ChatScreen(), arguments: { @@ -63,15 +77,23 @@ class WorkerInboxScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5), child: Container( - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), + decoration: ShapeDecoration( + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), child: Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(10)), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), child: NetworkImageWidget( - imageUrl: inboxModel.restaurantProfileImage.toString(), + imageUrl: + inboxModel.restaurantProfileImage.toString(), fit: BoxFit.cover, height: Responsive.height(6, context), width: Responsive.width(12, context), @@ -88,13 +110,29 @@ class WorkerInboxScreen extends StatelessWidget { child: Text( "${inboxModel.restaurantName}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey100 : AppThemeData.grey800), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), ), ), Text( - Constant.timestampToDate(inboxModel.createdAt!), + Constant.timestampToDate( + inboxModel.createdAt!, + ), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.regular, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: AppThemeData.regular, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData.grey500, + ), ), ], ), @@ -102,7 +140,14 @@ class WorkerInboxScreen extends StatelessWidget { Text( "${inboxModel.lastMessage}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 14, color: isDark ? AppThemeData.grey200 : AppThemeData.grey700), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 14, + color: + isDark + ? AppThemeData.grey200 + : AppThemeData.grey700, + ), ), ], ), @@ -117,7 +162,10 @@ class WorkerInboxScreen extends StatelessWidget { shrinkWrap: true, onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), // orderBy is compulsory to enable pagination - query: FirebaseFirestore.instance.collection('chat_worker').where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()).orderBy('createdAt', descending: true), + query: FirebaseFirestore.instance + .collection('chat_worker') + .where("customerId", isEqualTo: FireStoreUtils.getCurrentUid()) + .orderBy('createdAt', descending: true), //Change types customerId viewType: ViewType.list, initialLoader: Constant.loader(), diff --git a/lib/screen_ui/parcel_service/book_parcel_screen.dart b/lib/screen_ui/parcel_service/book_parcel_screen.dart index e60a814..cc14c4e 100644 --- a/lib/screen_ui/parcel_service/book_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/book_parcel_screen.dart @@ -8,7 +8,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/book_parcel_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -43,8 +43,20 @@ class BookParcelScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -52,12 +64,21 @@ class BookParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Book Your Document Delivery".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Book Your Document Delivery".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), Text( "Schedule a secure and timely pickup & delivery".tr(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.mediumTextStyle(fontSize: 12, color: AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 12, + color: AppThemeData.grey900, + ), ), ], ), @@ -84,7 +105,8 @@ class BookParcelScreen extends StatelessWidget { nameController: controller.senderNameController.value, mobileController: controller.senderMobileController.value, noteController: controller.senderNoteController.value, - countryCodeController: controller.senderCountryCodeController.value, + countryCodeController: + controller.senderCountryCodeController.value, showWeight: true, isDark: isDark, context: context, @@ -95,14 +117,25 @@ class BookParcelScreen extends StatelessWidget { if (result != null) { final firstPlace = result; - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final address = firstPlace.address; final lat = firstPlace.coordinates.latitude; final lng = firstPlace.coordinates.longitude; - controller.senderLocationController.value.text = address; // ✅ - controller.senderLocation.value = UserLocation(latitude: lat, longitude: lng); // ✅ <-- Add this + controller.senderLocationController.value.text = + address; // ✅ + controller.senderLocation.value = UserLocation( + latitude: lat, + longitude: lng, + ); // ✅ <-- Add this } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } } else { @@ -110,11 +143,27 @@ class BookParcelScreen extends StatelessWidget { if (value != null) { SelectedLocationModel selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.senderLocationController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.senderLocation.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); + if (Constant.checkZoneCheck( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ) == + true) { + controller + .senderLocationController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.senderLocation.value = UserLocation( + latitude: selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } // ✅ <-- Add this } @@ -125,11 +174,13 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 16), buildInfoSectionView( title: "Receiver Information".tr(), - locationController: controller.receiverLocationController.value, + locationController: + controller.receiverLocationController.value, nameController: controller.receiverNameController.value, mobileController: controller.receiverMobileController.value, noteController: controller.receiverNoteController.value, - countryCodeController: controller.receiverCountryCodeController.value, + countryCodeController: + controller.receiverCountryCodeController.value, showWeight: false, isDark: isDark, context: context, @@ -140,15 +191,26 @@ class BookParcelScreen extends StatelessWidget { if (result != null) { final firstPlace = result; - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final lat = firstPlace.coordinates.latitude; final lng = firstPlace.coordinates.longitude; final address = firstPlace.address; - controller.receiverLocationController.value.text = address; // ✅ - controller.receiverLocation.value = UserLocation(latitude: lat, longitude: lng); + controller.receiverLocationController.value.text = + address; // ✅ + controller.receiverLocation.value = UserLocation( + latitude: lat, + longitude: lng, + ); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } } else { @@ -156,11 +218,27 @@ class BookParcelScreen extends StatelessWidget { if (value != null) { SelectedLocationModel selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.receiverLocationController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.receiverLocation.value = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); // ✅ <-- Add this + if (Constant.checkZoneCheck( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ) == + true) { + controller + .receiverLocationController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller.receiverLocation.value = UserLocation( + latitude: selectedLocationModel.latLng!.latitude, + longitude: + selectedLocationModel.latLng!.longitude, + ); // ✅ <-- Add this } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } }); @@ -187,18 +265,30 @@ class BookParcelScreen extends StatelessWidget { ); } - Widget selectDeliveryTypeView(BookParcelController controller, bool isDark, BuildContext context) { + Widget selectDeliveryTypeView( + BookParcelController controller, + bool isDark, + BuildContext context, + ) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + ), ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Select delivery type".tr(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text( + "Select delivery type".tr(), + style: AppThemeData.boldTextStyle( + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + fontSize: 13, + ), + ), const SizedBox(height: 10), InkWell( onTap: () { @@ -207,12 +297,34 @@ class BookParcelScreen extends StatelessWidget { }, child: Row( children: [ - Image.asset("assets/images/image_parcel.png", height: 38, width: 38), + Image.asset( + "assets/images/image_parcel.png", + height: 38, + width: 38, + ), const SizedBox(width: 20), - Expanded(child: Text("As soon as possible".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), + Expanded( + child: Text( + "As soon as possible".tr(), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), Icon( - controller.selectedDeliveryType.value == 'now' ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.selectedDeliveryType.value == 'now' ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.selectedDeliveryType.value == 'now' + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.selectedDeliveryType.value == 'now' + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), ], @@ -228,12 +340,34 @@ class BookParcelScreen extends StatelessWidget { children: [ Row( children: [ - Image.asset("assets/images/image_parcel_scheduled.png", height: 38, width: 38), + Image.asset( + "assets/images/image_parcel_scheduled.png", + height: 38, + width: 38, + ), const SizedBox(width: 20), - Expanded(child: Text("Scheduled".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), + Expanded( + child: Text( + "Scheduled".tr(), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), Icon( - controller.selectedDeliveryType.value == 'later' ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.selectedDeliveryType.value == 'later' ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.selectedDeliveryType.value == 'later' + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.selectedDeliveryType.value == 'later' + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), ], @@ -246,9 +380,18 @@ class BookParcelScreen extends StatelessWidget { hintText: "When to pickup at this address".tr(), controller: controller.scheduledDateController.value, enable: false, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - suffix: const Padding(padding: EdgeInsets.only(right: 10), child: Icon(Icons.calendar_month_outlined)), + backgroundColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + suffix: const Padding( + padding: EdgeInsets.only(right: 10), + child: Icon(Icons.calendar_month_outlined), + ), ), ), const SizedBox(height: 10), @@ -259,9 +402,18 @@ class BookParcelScreen extends StatelessWidget { controller: controller.scheduledTimeController.value, enable: false, // onchange: (v) => controller.pickScheduledTime(context), - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - suffix: const Padding(padding: EdgeInsets.only(right: 10), child: Icon(Icons.access_time)), + backgroundColor: + isDark + ? AppThemeData.surfaceDark + : AppThemeData.surface, + borderColor: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + suffix: const Padding( + padding: EdgeInsets.only(right: 10), + child: Icon(Icons.access_time), + ), ), ), ], @@ -278,29 +430,75 @@ class BookParcelScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + ), ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Upload parcel image".tr(), style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text( + "Upload parcel image".tr(), + style: AppThemeData.boldTextStyle( + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + fontSize: 13, + ), + ), const SizedBox(height: 10), DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300, + ), child: Container( alignment: Alignment.center, - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + ), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 50), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - SvgPicture.asset("assets/icons/ic_upload_parcel.svg", height: 40, width: 40), + SvgPicture.asset( + "assets/icons/ic_upload_parcel.svg", + height: 40, + width: 40, + ), const SizedBox(height: 10), - Text("Upload Parcel Image".tr(), style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Upload Parcel Image".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 4), - Text("Supported: .jpg, .jpeg, .png".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text("Max size 1MB".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Supported: .jpg, .jpeg, .png".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), + Text( + "Max size 1MB".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), const SizedBox(height: 8), RoundedButtonFill( title: "Browse Image".tr(), @@ -326,7 +524,15 @@ class BookParcelScreen extends StatelessWidget { children: [ Container( padding: const EdgeInsets.only(top: 20, right: 20), - child: ClipRRect(borderRadius: BorderRadius.circular(8), child: Image.file(File(image.path), width: 70, height: 70, fit: BoxFit.cover)), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.file( + File(image.path), + width: 70, + height: 70, + fit: BoxFit.cover, + ), + ), ), Positioned.fill( top: 0, @@ -334,7 +540,11 @@ class BookParcelScreen extends StatelessWidget { child: Align( alignment: Alignment.topRight, child: IconButton( - icon: const Icon(Icons.cancel, color: AppThemeData.danger300, size: 20), + icon: const Icon( + Icons.cancel, + color: AppThemeData.danger300, + size: 20, + ), onPressed: () { controller.images.remove(image); }, @@ -367,13 +577,21 @@ class BookParcelScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + ), ), padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(title, style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13)), + Text( + title, + style: AppThemeData.boldTextStyle( + color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + fontSize: 13, + ), + ), const SizedBox(height: 10), GestureDetector( @@ -382,9 +600,14 @@ class BookParcelScreen extends StatelessWidget { hintText: "Your Location".tr(), controller: locationController, - suffix: const Padding(padding: EdgeInsets.only(right: 10), child: Icon(Icons.location_on_outlined)), - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + suffix: const Padding( + padding: EdgeInsets.only(right: 10), + child: Icon(Icons.location_on_outlined), + ), + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, enable: false, ), ), @@ -393,8 +616,10 @@ class BookParcelScreen extends StatelessWidget { TextFieldWidget( hintText: "Name".tr(), controller: nameController, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, ), const SizedBox(height: 10), @@ -402,24 +627,49 @@ class BookParcelScreen extends StatelessWidget { hintText: "Enter Mobile number".tr(), controller: mobileController, textInputType: TextInputType.number, - inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9]')), LengthLimitingTextInputFormatter(10)], - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + LengthLimitingTextInputFormatter(10), + ], + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, prefix: Row( mainAxisSize: MainAxisSize.min, children: [ CountryCodePicker( onChanged: (value) { - countryCodeController.text = value.dialCode ?? Constant.defaultCountryCode; + countryCodeController.text = + value.dialCode ?? Constant.defaultCountryCode; }, - initialSelection: countryCodeController.text.isNotEmpty ? countryCodeController.text : Constant.defaultCountryCode, + initialSelection: + countryCodeController.text.isNotEmpty + ? countryCodeController.text + : Constant.defaultCountryCode, showCountryOnly: false, showOnlyCountryWhenClosed: false, alignLeft: false, - textStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : Colors.black), - dialogTextStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - searchStyle: TextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - dialogBackgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + textStyle: TextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : Colors.black, + ), + dialogTextStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + searchStyle: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + dialogBackgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, padding: EdgeInsets.zero, ), // const Icon(Icons.keyboard_arrow_down_rounded, size: 24, color: AppThemeData.grey400), @@ -437,19 +687,37 @@ class BookParcelScreen extends StatelessWidget { enableSearch: false, textFieldDecoration: InputDecoration( hintText: "Select parcel Weight".tr(), - hintStyle: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.grey400 : AppThemeData.greyDark400), + hintStyle: AppThemeData.regularTextStyle( + fontSize: 14, + color: + isDark ? AppThemeData.grey400 : AppThemeData.greyDark400, + ), filled: true, - fillColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - border: OutlineInputBorder(borderRadius: BorderRadius.circular(10), borderSide: BorderSide(color: AppThemeData.grey200)), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(10), borderSide: BorderSide(color: AppThemeData.grey200)), - focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(10), borderSide: BorderSide(color: AppThemeData.grey200)), + fillColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 12, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide(color: AppThemeData.grey200), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide(color: AppThemeData.grey200), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide(color: AppThemeData.grey200), + ), ), dropDownList: controller.parcelWeight.map((e) { return DropDownValueModel( name: e.title ?? 'Normal'.tr(), - value: e.title ?? 'Normal'.tr(), // safer to use title string + value: + e.title ?? 'Normal'.tr(), // safer to use title string ); }).toList(), onChanged: (val) { @@ -457,7 +725,8 @@ class BookParcelScreen extends StatelessWidget { controller.senderWeightController.value.setDropDown(val); // Link it to the selectedWeight object - controller.selectedWeight = controller.parcelWeight.firstWhereOrNull((e) => e.title == val.value); + controller.selectedWeight = controller.parcelWeight + .firstWhereOrNull((e) => e.title == val.value); } }, ), @@ -467,8 +736,10 @@ class BookParcelScreen extends StatelessWidget { TextFieldWidget( hintText: "Notes (Optional)".tr(), controller: noteController, - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - borderColor: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + borderColor: + isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, ), ], ), diff --git a/lib/screen_ui/parcel_service/home_parcel_screen.dart b/lib/screen_ui/parcel_service/home_parcel_screen.dart index 16e2437..b9ad4e1 100644 --- a/lib/screen_ui/parcel_service/home_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/home_parcel_screen.dart @@ -3,7 +3,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/home_parcel_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/banner_model.dart'; @@ -46,8 +46,20 @@ class HomeParcelScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -60,9 +72,21 @@ class HomeParcelScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + child: Text( + "Login".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), ) - : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + : Text( + Constant.userModel!.fullName(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), InkWell( onTap: () async { if (Constant.userModel != null) { @@ -75,9 +99,12 @@ class HomeParcelScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - ShippingAddress shippingAddress = ShippingAddress(); + ShippingAddress shippingAddress = + ShippingAddress(); try { await Geolocator.requestPermission(); @@ -85,40 +112,71 @@ class HomeParcelScreen extends StatelessWidget { ShowToastDialog.closeLoader(); if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; + final lat = + firstPlace.coordinates.latitude; + final lng = + firstPlace.coordinates.longitude; final address = firstPlace.address; shippingAddress.addressAs = "Home"; - shippingAddress.locality = address.toString(); - shippingAddress.location = UserLocation(latitude: lat, longitude: lng); + shippingAddress.locality = + address.toString(); + shippingAddress.location = UserLocation( + latitude: lat, + longitude: lng, + ); - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; Get.back(); } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; shippingAddress.addressAs = "Home"; - shippingAddress.location = UserLocation(latitude: selectedLocationModel.latLng!.latitude, longitude: selectedLocationModel.latLng!.longitude); - shippingAddress.locality = "Picked from Map"; + shippingAddress + .location = UserLocation( + latitude: + selectedLocationModel + .latLng! + .latitude, + longitude: + selectedLocationModel + .latLng! + .longitude, + ); + shippingAddress.locality = + "Picked from Map"; - Constant.selectedLocation = shippingAddress; + Constant.selectedLocation = + shippingAddress; } }); } } catch (e) { - await placemarkFromCoordinates(19.228825, 72.854118).then((valuePlaceMaker) { + await placemarkFromCoordinates( + 19.228825, + 72.854118, + ).then((valuePlaceMaker) { Placemark placeMark = valuePlaceMaker[0]; - shippingAddress.location = UserLocation(latitude: 19.228825, longitude: 72.854118); + shippingAddress.location = UserLocation( + latitude: 19.228825, + longitude: 72.854118, + ); String currentLocation = "${placeMark.name}, ${placeMark.subLocality}, ${placeMark.locality}, ${placeMark.administrativeArea}, ${placeMark.postalCode}, ${placeMark.country}"; - shippingAddress.locality = currentLocation; + shippingAddress.locality = + currentLocation; }); Constant.selectedLocation = shippingAddress; @@ -133,7 +191,10 @@ class HomeParcelScreen extends StatelessWidget { Constant.selectedLocation.getFullAddress(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), ), ), ], @@ -160,22 +221,46 @@ class HomeParcelScreen extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("What are you sending?".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "What are you sending?".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(height: 12), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, ), - padding: const EdgeInsets.symmetric(horizontal: 20), child: ListView.builder( itemCount: controller.parcelCategory.length, shrinkWrap: true, physics: const ScrollPhysics(), - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), itemBuilder: (context, index) { - return buildItems(item: controller.parcelCategory[index], isDark: isDark); + return buildItems( + item: controller.parcelCategory[index], + isDark: isDark, + ); }, ), ), @@ -199,16 +284,36 @@ class HomeParcelScreen extends StatelessWidget { if (Constant.userModel == null) { Get.to(const LoginScreen()); } else { - Get.to(const BookParcelScreen(), arguments: {'parcelCategory': item}); + Get.to( + const BookParcelScreen(), + arguments: {'parcelCategory': item}, + ); } }, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - NetworkImageWidget(imageUrl: item.image ?? '', height: 38, width: 38), + NetworkImageWidget( + imageUrl: item.image ?? '', + height: 38, + width: 38, + ), const SizedBox(width: 20), - Expanded(child: Text(item.title ?? '', style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 16))), - Icon(Icons.arrow_forward_ios, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, size: 20), + Expanded( + child: Text( + item.title ?? '', + style: AppThemeData.semiBoldTextStyle( + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + fontSize: 16, + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + size: 20, + ), ], ), ), @@ -256,7 +361,13 @@ class BannerView extends StatelessWidget { final banner = bannerList[index]; return ClipRRect( borderRadius: BorderRadius.circular(15), - child: SizedBox(width: MediaQuery.of(context).size.width * 0.8, child: NetworkImageWidget(imageUrl: banner.photo ?? '', fit: BoxFit.cover)), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.8, + child: NetworkImageWidget( + imageUrl: banner.photo ?? '', + fit: BoxFit.cover, + ), + ), ); }, ), @@ -266,7 +377,18 @@ class BannerView extends StatelessWidget { return Row( children: List.generate(bannerList.length, (index) { bool isSelected = currentPage.value == index; - return Expanded(child: Container(height: 4, decoration: BoxDecoration(color: isSelected ? AppThemeData.grey300 : AppThemeData.grey100, borderRadius: BorderRadius.circular(5)))); + return Expanded( + child: Container( + height: 4, + decoration: BoxDecoration( + color: + isSelected + ? AppThemeData.grey300 + : AppThemeData.grey100, + borderRadius: BorderRadius.circular(5), + ), + ), + ); }), ); }), diff --git a/lib/screen_ui/parcel_service/my_booking_screen.dart b/lib/screen_ui/parcel_service/my_booking_screen.dart index c1f00d5..25c4509 100644 --- a/lib/screen_ui/parcel_service/my_booking_screen.dart +++ b/lib/screen_ui/parcel_service/my_booking_screen.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/parcel_service/parcel_order_details.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/parcel_my_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -23,14 +23,27 @@ class MyBookingScreen extends StatelessWidget { builder: (controller) { return DefaultTabController( length: controller.tabTitles.length, - initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), + initialIndex: controller.tabTitles.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text("Parcel History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row( + children: [ + const SizedBox(width: 10), + Text( + "Parcel History".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ], + ), ), bottom: TabBar( // don't re-subscribe onTap — just update selectedTab (optional) @@ -41,8 +54,13 @@ class MyBookingScreen extends StatelessWidget { labelColor: AppThemeData.parcelService500, unselectedLabelColor: AppThemeData.parcelService500, labelStyle: AppThemeData.boldTextStyle(fontSize: 15), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 15), - tabs: controller.tabTitles.map((title) => Tab(child: Center(child: Text(title)))).toList(), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 15, + ), + tabs: + controller.tabTitles + .map((title) => Tab(child: Center(child: Text(title)))) + .toList(), ), ), @@ -56,12 +74,30 @@ class MyBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -83,7 +119,17 @@ class MyBookingScreen extends StatelessWidget { final orders = controller.getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No orders found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + "No orders found".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( @@ -93,55 +139,98 @@ class MyBookingScreen extends StatelessWidget { final order = orders[index]; return GestureDetector( onTap: () { - Get.to(() => const ParcelOrderDetails(), arguments: order); + Get.to( + () => const ParcelOrderDetails(), + arguments: order, + ); }, child: Container( margin: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, borderRadius: BorderRadius.circular(15), - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.only(bottom: 8.0), + padding: const EdgeInsets.only( + bottom: 8.0, + ), child: Text( "${'Order Date:'.tr()}${order.isSchedule == true ? controller.formatDate(order.createdAt!) : controller.formatDate(order.senderPickupDateTime!)}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.info400, + ), ), ), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Column( children: [ - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), - DottedBorder( - options: CustomPathDottedBorderOptions( - color: Colors.grey.shade400, - strokeWidth: 2, - dashPattern: [4, 4], - customPath: - (size) => - Path() - ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), - ), - child: const SizedBox(width: 20, height: 95), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), + DottedBorder( + options: + CustomPathDottedBorderOptions( + color: + Colors + .grey + .shade400, + strokeWidth: 2, + dashPattern: [4, 4], + customPath: + (size) => + Path() + ..moveTo( + size.width / + 2, + 0, + ) + ..lineTo( + size.width / + 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 95, + ), + ), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, ), - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), ], ), const SizedBox(width: 12), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ _infoSection( - "Pickup Address (Sender):".tr(), + "Pickup Address (Sender):" + .tr(), order.sender?.name ?? '', order.sender?.address ?? '', order.sender?.phone ?? '', @@ -153,9 +242,11 @@ class MyBookingScreen extends StatelessWidget { ), const SizedBox(height: 16), _infoSection( - "Delivery Address (Receiver):".tr(), + "Delivery Address (Receiver):" + .tr(), order.receiver?.name ?? '', - order.receiver?.address ?? '', + order.receiver?.address ?? + '', order.receiver?.phone ?? '', // order.receiverPickupDateTime != null // ? "Delivery Time: ${controller.formatDate(order.receiverPickupDateTime!)}" @@ -182,27 +273,74 @@ class MyBookingScreen extends StatelessWidget { ); } - Widget _infoSection(String title, String name, String address, String phone, String? status, bool isDark) { + Widget _infoSection( + String title, + String name, + String address, + String phone, + String? status, + bool isDark, + ) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( - child: Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), maxLines: 1, overflow: TextOverflow.ellipsis), + child: Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), ), if (status != null) ...[ Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - decoration: BoxDecoration(color: AppThemeData.info50, border: Border.all(color: AppThemeData.info300), borderRadius: BorderRadius.circular(12)), - child: Text(status, style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.info500)), + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), + decoration: BoxDecoration( + color: AppThemeData.info50, + border: Border.all(color: AppThemeData.info300), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + status, + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.info500, + ), + ), ), ], ], ), - Text(name, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(address, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(phone, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + name, + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + address, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + phone, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), //Text(time, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ); diff --git a/lib/screen_ui/parcel_service/order_successfully_placed.dart b/lib/screen_ui/parcel_service/order_successfully_placed.dart index a4ff870..cbccb86 100644 --- a/lib/screen_ui/parcel_service/order_successfully_placed.dart +++ b/lib/screen_ui/parcel_service/order_successfully_placed.dart @@ -1,7 +1,7 @@ import 'package:customer/screen_ui/parcel_service/parcel_dashboard_screen.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import '../../controllers/parcel_dashboard_controller.dart'; @@ -24,13 +24,21 @@ class OrderSuccessfullyPlaced extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset("assets/images/parcel_order_successfully_placed.png"), + Image.asset( + "assets/images/parcel_order_successfully_placed.png", + ), const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( "Your Order Has Been Placed!".tr(), - style: AppThemeData.boldTextStyle(fontSize: 22, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.boldTextStyle( + fontSize: 22, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), textAlign: TextAlign.center, ), ), @@ -38,8 +46,15 @@ class OrderSuccessfullyPlaced extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - "We’ve received your parcel booking and it’s now being processed. You can track its status in real time.".tr(), - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + "We’ve received your parcel booking and it’s now being processed. You can track its status in real time." + .tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), textAlign: TextAlign.center, ), ), @@ -50,7 +65,9 @@ class OrderSuccessfullyPlaced extends StatelessWidget { print("Tracking Order: $parcelOrder"); //Get.to(() => TrackOrderScreen(), arguments: {'order': parcelOrder}); Get.offAll(const ParcelDashboardScreen()); - ParcelDashboardController controller = Get.put(ParcelDashboardController()); + ParcelDashboardController controller = Get.put( + ParcelDashboardController(), + ); controller.selectedIndex.value = 1; }, color: AppThemeData.primary300, diff --git a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart index 7c372ae..5393cc6 100644 --- a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ParcelCouponScreen extends StatelessWidget { const ParcelCouponScreen({super.key}); @@ -33,12 +33,30 @@ class ParcelCouponScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Coupon".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Coupon".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -54,17 +72,35 @@ class ParcelCouponScreen extends StatelessWidget { itemBuilder: (context, index) { CouponModel couponModel = controller.cabCouponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -74,7 +110,14 @@ class ParcelCouponScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -84,24 +127,53 @@ class ParcelCouponScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: + RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ), ), - const Expanded(child: SizedBox(height: 10)), + const Expanded( + child: SizedBox(height: 10), + ), InkWell( onTap: () { Get.back(result: couponModel); @@ -109,18 +181,38 @@ class ParcelCouponScreen extends StatelessWidget { child: Text( "Tap To Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart index 97744c2..2fe7a4a 100644 --- a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart @@ -5,7 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class ParcelDashboardScreen extends StatelessWidget { const ParcelDashboardScreen({super.key}); @@ -25,12 +25,21 @@ class ParcelDashboardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.parcelServiceDark300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark + ? AppThemeData.parcelServiceDark300 + : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, onTap: (int index) { if (index == 0) { Get.put(ParcelDashboardController()); @@ -40,15 +49,57 @@ class ParcelDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_parcel.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_mybooking_parcel.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_profile_parcel.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_parcel.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile_parcel.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_parcel.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_mybooking_parcel.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet_parcel.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile_parcel.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -57,7 +108,13 @@ class ParcelDashboardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required ParcelDashboardController controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required ParcelDashboardController controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart index a53ea1a..1d76a34 100644 --- a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart +++ b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart @@ -4,7 +4,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/parcel_order_confirmation_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -38,12 +38,30 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Order Confirmation".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Order Confirmation".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -60,8 +78,16 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Row( @@ -70,7 +96,11 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Timeline with icons and line Column( children: [ - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), DottedBorder( options: CustomPathDottedBorderOptions( color: Colors.grey.shade400, @@ -80,11 +110,21 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 95, ), - child: const SizedBox(width: 20, height: 95), ), - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), ], ), const SizedBox(width: 12), @@ -95,9 +135,24 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { children: [ _infoSection( "Pickup Address (Sender):".tr(), - controller.parcelOrder.value.sender?.name ?? '', - controller.parcelOrder.value.sender?.address ?? '', - controller.parcelOrder.value.sender?.phone ?? '', + controller + .parcelOrder + .value + .sender + ?.name ?? + '', + controller + .parcelOrder + .value + .sender + ?.address ?? + '', + controller + .parcelOrder + .value + .sender + ?.phone ?? + '', // controller.parcelOrder.value.senderPickupDateTime != null // ? "Pickup Time: ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}" // : '', @@ -106,9 +161,24 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { const SizedBox(height: 16), _infoSection( "Delivery Address (Receiver):".tr(), - controller.parcelOrder.value.receiver?.name ?? '', - controller.parcelOrder.value.receiver?.address ?? '', - controller.parcelOrder.value.receiver?.phone ?? '', + controller + .parcelOrder + .value + .receiver + ?.name ?? + '', + controller + .parcelOrder + .value + .receiver + ?.address ?? + '', + controller + .parcelOrder + .value + .receiver + ?.phone ?? + '', // controller.parcelOrder.value.receiverPickupDateTime != null // ? "Delivery Time: ${controller.formatDate(controller.parcelOrder.value.receiverPickupDateTime!)}" // : '', @@ -125,16 +195,42 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: EdgeInsets.all(16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr()}", "Distance".tr(), "assets/icons/ic_distance_parcel.svg", isDark), - _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr(), "assets/icons/ic_weight_parcel.svg", isDark), - _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr(), "assets/icons/ic_rate_parcel.svg", isDark), + _iconTile( + "${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr()}", + "Distance".tr(), + "assets/icons/ic_distance_parcel.svg", + isDark, + ), + _iconTile( + controller.parcelOrder.value.parcelWeight ?? + '--', + "Weight".tr(), + "assets/icons/ic_weight_parcel.svg", + isDark, + ), + _iconTile( + Constant.amountShow( + amount: controller.parcelOrder.value.subTotal, + ), + "Rate".tr(), + "assets/icons/ic_rate_parcel.svg", + isDark, + ), ], ), ), @@ -143,24 +239,53 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text("Coupons".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded( + child: Text( + "Coupons".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { Get.to(ParcelCouponScreen())!.then((value) { if (value != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: value); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = value; + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: value, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + value; controller.calculatePrice(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } }); }, child: Text( "View All".tr(), - style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.boldTextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], @@ -169,21 +294,45 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Coupon input DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: isDark ? AppThemeData.parcelServiceDark300 : AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: + isDark + ? AppThemeData.parcelServiceDark300 + : AppThemeData.primary300, + ), child: Container( - decoration: BoxDecoration(color: AppThemeData.parcelService50, borderRadius: BorderRadius.circular(10)), - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: AppThemeData.parcelService50, + borderRadius: BorderRadius.circular(10), + ), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_coupon_parcel.svg", height: 28, width: 28), + SvgPicture.asset( + "assets/icons/ic_coupon_parcel.svg", + height: 28, + width: 28, + ), SizedBox(width: 15), Expanded( child: TextField( - controller: controller.couponController.value, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.parcelService500, fontSize: 16), + controller: + controller.couponController.value, + style: AppThemeData.semiBoldTextStyle( + color: AppThemeData.parcelService500, + fontSize: 16, + ), decoration: InputDecoration( hintText: "Write coupon code".tr(), - hintStyle: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.parcelService500), + hintStyle: AppThemeData.mediumTextStyle( + fontSize: 16, + color: AppThemeData.parcelService500, + ), border: InputBorder.none, ), ), @@ -191,22 +340,60 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { RoundedButtonFill( title: "Redeem now".tr(), onPress: () { - if (controller.couponList.where((element) => element.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()).isNotEmpty) { - CouponModel couponModel = controller.couponList.firstWhere((p0) => p0.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()); - if (couponModel.expiresAt!.toDate().isAfter(DateTime.now())) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; + if (controller.couponList + .where( + (element) => + element.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ) + .isNotEmpty) { + CouponModel couponModel = controller + .couponList + .firstWhere( + (p0) => + p0.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ); + if (couponModel.expiresAt! + .toDate() + .isAfter(DateTime.now())) { + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: couponModel, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + couponModel; controller.calculatePrice(); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr()); + ShowToastDialog.showToast( + "This coupon code has been expired" + .tr(), + ); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr()); + ShowToastDialog.showToast( + "Invalid coupon code".tr(), + ); } }, borderRadius: 10, @@ -224,35 +411,84 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: controller.subTotal.value.toString(), + ), + isDark, + null, + ), // Discount - _summaryTile("Discount".tr(), "-${Constant.amountShow(amount: controller.discount.value.toString())}", isDark, AppThemeData.dangerDark300), + _summaryTile( + "Discount".tr(), + "-${Constant.amountShow(amount: controller.discount.value.toString())}", + isDark, + AppThemeData.dangerDark300, + ), // Tax List - ...List.generate(Constant.taxList.length, (index) { + ...List.generate(Constant.taxList.length, ( + index, + ) { final taxModel = Constant.taxList[index]; - final taxTitle = "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; - final taxAmount = Constant.getTaxValue(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString(); + final taxTitle = + "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; + final taxAmount = + Constant.getTaxValue( + amount: + (controller.subTotal.value - + controller.discount.value) + .toString(), + taxModel: taxModel, + ).toString(); - return _summaryTile(taxTitle, Constant.amountShow(amount: taxAmount), isDark, null); + return _summaryTile( + taxTitle, + Constant.amountShow(amount: taxAmount), + isDark, + null, + ); }), const Divider(), // Total - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value.toString(), + ), + isDark, + null, + ), ], ), ), @@ -260,15 +496,32 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Title - Text("Payment by".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Payment by".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 12), // Row with Sender and Receiver options @@ -276,16 +529,36 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { children: [ // Sender GestureDetector( - onTap: () => controller.paymentBy.value = "Sender", + onTap: + () => + controller.paymentBy.value = + "Sender", child: Row( children: [ Icon( - controller.paymentBy.value == "Sender" ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.paymentBy.value == "Sender" ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.paymentBy.value == "Sender" + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.paymentBy.value == + "Sender" + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), const SizedBox(width: 6), - Text("Sender".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Sender".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), ], ), ), @@ -294,16 +567,37 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Receiver GestureDetector( - onTap: () => controller.paymentBy.value = "Receiver", + onTap: + () => + controller.paymentBy.value = + "Receiver", child: Row( children: [ Icon( - controller.paymentBy.value == "Receiver" ? Icons.radio_button_checked : Icons.radio_button_off, - color: controller.paymentBy.value == "Receiver" ? AppThemeData.primary300 : (isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + controller.paymentBy.value == + "Receiver" + ? Icons.radio_button_checked + : Icons.radio_button_off, + color: + controller.paymentBy.value == + "Receiver" + ? AppThemeData.primary300 + : (isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500), size: 20, ), const SizedBox(width: 6), - Text("Receiver".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Receiver".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), ], ), ), @@ -317,13 +611,23 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Continue button RoundedButtonFill( - title: controller.paymentBy.value == "Sender" ? "Select Payment Method".tr() : "Continue".tr(), + title: + controller.paymentBy.value == "Sender" + ? "Select Payment Method".tr() + : "Continue".tr(), onPress: () async { if (controller.paymentBy.value == "Sender") { Get.bottomSheet( - paymentBottomSheet(context, controller, isDark), // your widget - isScrollControlled: true, // ✅ allows full drag scrolling - backgroundColor: Colors.transparent, // so your rounded corners are visible + paymentBottomSheet( + context, + controller, + isDark, + ), // your widget + isScrollControlled: + true, // ✅ allows full drag scrolling + backgroundColor: + Colors + .transparent, // so your rounded corners are visible ); } else { controller.placeOrder(); @@ -340,14 +644,44 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ); } - Widget _infoSection(String title, String name, String address, String phone, bool isDark) { + Widget _infoSection( + String title, + String name, + String address, + String phone, + bool isDark, + ) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(name, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(address, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(phone, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + name, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + address, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + phone, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), // Text(time, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ); @@ -357,11 +691,28 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { return Column( children: [ // Icon(icon, color: AppThemeData.primary300), - SvgPicture.asset(icon, height: 28, width: 28, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + SvgPicture.asset( + icon, + height: 28, + width: 28, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), const SizedBox(height: 6), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), const SizedBox(height: 6), - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ); } @@ -372,14 +723,32 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total" ? 18 : 16, color: colors ?? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total" ? 18 : 16, + color: + colors ?? + (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ), + ), ], ), ); } - Widget paymentBottomSheet(BuildContext context, ParcelOrderConfirmationController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + ParcelOrderConfirmationController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, minChildSize: 0.30, @@ -388,14 +757,26 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); @@ -409,63 +790,213 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: ListView( controller: scrollController, children: [ - Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) const SizedBox(height: 10), - Text("Other Payment Options".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) + const SizedBox(height: 10), + Text( + "Other Payment Options".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -479,25 +1010,59 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { color: AppThemeData.taxiBooking300, textColor: AppThemeData.grey900, onPress: () async { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.placeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - double walletBalance = double.tryParse(controller.userModel.value.walletAmount.toString()) ?? 0.0; - double amountToPay = double.tryParse(controller.totalAmount.value.toString()) ?? 0.0; + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { + double walletBalance = + double.tryParse( + controller.userModel.value.walletAmount.toString(), + ) ?? + 0.0; + double amountToPay = + double.tryParse( + controller.totalAmount.value.toString(), + ) ?? + 0.0; if (walletBalance < amountToPay) { - ShowToastDialog.showToast("Insufficient wallet balance".tr()); + ShowToastDialog.showToast( + "Insufficient wallet balance".tr(), + ); return; } controller.placeOrder(); @@ -505,24 +1070,52 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { // controller.placeOrder(); // } - else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.totalAmount.value.toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } }, ), @@ -546,8 +1139,16 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -558,12 +1159,30 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel?.walletAmount == null ? '0.0' : Constant.userModel?.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel?.walletAmount == null + ? '0.0' + : Constant.userModel?.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -572,13 +1191,18 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, + ), ), ), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/parcel_service/parcel_order_details.dart b/lib/screen_ui/parcel_service/parcel_order_details.dart index 8c75859..9a801bd 100644 --- a/lib/screen_ui/parcel_service/parcel_order_details.dart +++ b/lib/screen_ui/parcel_service/parcel_order_details.dart @@ -3,7 +3,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/parcel_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -40,8 +40,20 @@ class ParcelOrderDetails extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -49,12 +61,22 @@ class ParcelOrderDetails extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), Text( - "Your parcel is on the way. Track it in real time below.".tr(), + "Order Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + Text( + "Your parcel is on the way. Track it in real time below." + .tr(), maxLines: 1, overflow: TextOverflow.ellipsis, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey900), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), ), ], ), @@ -74,23 +96,47 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), width: double.infinity, padding: const EdgeInsets.all(16), child: Text( - "${'Order Id:'.tr()} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}".tr(), + "${'Order Id:'.tr()} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}" + .tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 18, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const SizedBox(height: 16), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( @@ -102,7 +148,11 @@ class ParcelOrderDetails extends StatelessWidget { // Timeline with icons and line Column( children: [ - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), DottedBorder( options: CustomPathDottedBorderOptions( color: Colors.grey.shade400, @@ -112,24 +162,50 @@ class ParcelOrderDetails extends StatelessWidget { (size) => Path() ..moveTo(size.width / 2, 0) - ..lineTo(size.width / 2, size.height), + ..lineTo( + size.width / 2, + size.height, + ), + ), + child: const SizedBox( + width: 20, + height: 95, ), - child: const SizedBox(width: 20, height: 95), ), - Image.asset("assets/images/image_parcel.png", height: 32, width: 32), + Image.asset( + "assets/images/image_parcel.png", + height: 32, + width: 32, + ), ], ), const SizedBox(width: 12), // Address Details Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ _infoSection( "Pickup Address (Sender):".tr(), - controller.parcelOrder.value.sender?.name ?? '', - controller.parcelOrder.value.sender?.address ?? '', - controller.parcelOrder.value.sender?.phone ?? '', + controller + .parcelOrder + .value + .sender + ?.name ?? + '', + controller + .parcelOrder + .value + .sender + ?.address ?? + '', + controller + .parcelOrder + .value + .sender + ?.phone ?? + '', // controller.parcelOrder.value.senderPickupDateTime != null // ? "Pickup Time: ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}" // : '', @@ -138,9 +214,24 @@ class ParcelOrderDetails extends StatelessWidget { const SizedBox(height: 16), _infoSection( "Delivery Address (Receiver):".tr(), - controller.parcelOrder.value.receiver?.name ?? '', - controller.parcelOrder.value.receiver?.address ?? '', - controller.parcelOrder.value.receiver?.phone ?? '', + controller + .parcelOrder + .value + .receiver + ?.name ?? + '', + controller + .parcelOrder + .value + .receiver + ?.address ?? + '', + controller + .parcelOrder + .value + .receiver + ?.phone ?? + '', // controller.parcelOrder.value.receiverPickupDateTime != null // ? "Delivery Time: ${controller.formatDate(controller.parcelOrder.value.receiverPickupDateTime!)}" // : '', @@ -154,12 +245,16 @@ class ParcelOrderDetails extends StatelessWidget { const Divider(), - if (controller.parcelOrder.value.isSchedule == true) + if (controller.parcelOrder.value.isSchedule == + true) Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( "${'Schedule Pickup time:'.tr()} ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.info400, + ), ), ), @@ -167,23 +262,61 @@ class ParcelOrderDetails extends StatelessWidget { padding: const EdgeInsets.only(bottom: 8.0), child: Text( "${'Order Date:'.tr()}${controller.parcelOrder.value.isSchedule == true ? controller.formatDate(controller.parcelOrder.value.createdAt!) : controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.info400), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.info400, + ), ), ), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Text("Parcel Type:".tr(), style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + "Parcel Type:".tr(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), + ), Row( children: [ Text( - controller.parcelOrder.value.parcelType ?? '', - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + controller + .parcelOrder + .value + .parcelType ?? + '', + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark800 + : AppThemeData.grey800, + ), ), const SizedBox(width: 8), - if (controller.getSelectedCategory()?.image != null && controller.getSelectedCategory()!.image!.isNotEmpty) - NetworkImageWidget(imageUrl: controller.getSelectedCategory()?.image ?? '', height: 20, width: 20), + if (controller + .getSelectedCategory() + ?.image != + null && + controller + .getSelectedCategory()! + .image! + .isNotEmpty) + NetworkImageWidget( + imageUrl: + controller + .getSelectedCategory() + ?.image ?? + '', + height: 20, + width: 20, + ), ], ), ], @@ -193,15 +326,31 @@ class ParcelOrderDetails extends StatelessWidget { : SizedBox( height: 120, child: ListView.builder( - itemCount: controller.parcelOrder.value.parcelImages!.length, + itemCount: + controller + .parcelOrder + .value + .parcelImages! + .length, shrinkWrap: true, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { return Padding( padding: const EdgeInsets.all(8.0), child: ClipRRect( - borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: controller.parcelOrder.value.parcelImages![index], width: 100, fit: BoxFit.cover, borderRadius: 10), + borderRadius: BorderRadius.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .parcelOrder + .value + .parcelImages![index], + width: 100, + fit: BoxFit.cover, + borderRadius: 10, + ), ), ); }, @@ -215,16 +364,42 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: EdgeInsets.all(16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _iconTile("${controller.parcelOrder.value.distance ?? '--'} ${Constant.distanceType}", "Distance".tr(), "assets/icons/ic_distance_parcel.svg", isDark), - _iconTile(controller.parcelOrder.value.parcelWeight ?? '--', "Weight".tr(), "assets/icons/ic_weight_parcel.svg", isDark), - _iconTile(Constant.amountShow(amount: controller.parcelOrder.value.subTotal), "Rate".tr(), "assets/icons/ic_rate_parcel.svg", isDark), + _iconTile( + "${controller.parcelOrder.value.distance ?? '--'} ${Constant.distanceType}", + "Distance".tr(), + "assets/icons/ic_distance_parcel.svg", + isDark, + ), + _iconTile( + controller.parcelOrder.value.parcelWeight ?? + '--', + "Weight".tr(), + "assets/icons/ic_weight_parcel.svg", + isDark, + ), + _iconTile( + Constant.amountShow( + amount: controller.parcelOrder.value.subTotal, + ), + "Rate".tr(), + "assets/icons/ic_rate_parcel.svg", + isDark, + ), ], ), ), @@ -235,18 +410,37 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("About Driver".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "About Driver".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Row( children: [ @@ -254,19 +448,48 @@ class ParcelOrderDetails extends StatelessWidget { width: 52, height: 52, child: ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.driverUser.value?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + borderRadius: + BorderRadiusGeometry.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .driverUser + .value + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), ), SizedBox(width: 20), Text( - controller.parcelOrder.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller + .parcelOrder + .value + .driver + ?.fullName() ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData.grey900, + fontSize: 18, + ), ), ], ), RoundedButtonBorder( - title: controller.driverUser.value!.averageRating.toStringAsFixed(1), + title: controller + .driverUser + .value! + .averageRating + .toStringAsFixed(1), width: 20, height: 3.5, radius: 10, @@ -275,72 +498,155 @@ class ParcelOrderDetails extends StatelessWidget { textColor: AppThemeData.warning400, borderColor: AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), ], ), Visibility( - visible: controller.parcelOrder.value.status == Constant.orderCompleted ? true : false, + visible: + controller.parcelOrder.value.status == + Constant.orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( - title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr() : 'Add Review'.tr(), + title: + controller.ratingModel.value.id != + null && + controller + .ratingModel + .value + .id! + .isNotEmpty + ? 'Update Review'.tr() + : 'Add Review'.tr(), onPress: () async { - final result = await Get.to(() => ParcelReviewScreen(), arguments: {'order': controller.parcelOrder.value}); + final result = await Get.to( + () => ParcelReviewScreen(), + arguments: { + 'order': + controller + .parcelOrder + .value, + }, + ); // If review was submitted successfully if (result == true) { - await controller.fetchDriverDetails(); + await controller + .fetchDriverDetails(); } }, height: 5, borderRadius: 15, color: Colors.orange, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, ), ), ), - if (controller.parcelOrder.value.status != Constant.orderCompleted) + if (controller.parcelOrder.value.status != + Constant.orderCompleted) Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ InkWell( onTap: () { - Constant.makePhoneCall(controller.parcelOrder.value.driver!.phoneNumber.toString()); + Constant.makePhoneCall( + controller + .parcelOrder + .value + .driver! + .phoneNumber + .toString(), + ); }, child: Container( width: 150, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.parcelOrder.value.authorID ?? ''); - UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.parcelOrder.value.driverId ?? ''); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .parcelOrder + .value + .authorID ?? + '', + ); + UserModel? driverUser = + await FireStoreUtils.getUserProfile( + controller + .parcelOrder + .value + .driverId ?? + '', + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer?.fullName(), - "restaurantName": driverUser?.fullName(), - "orderId": controller.parcelOrder.value.id, - "restaurantId": driverUser?.id, + "customerName": + customer?.fullName(), + "restaurantName": + driverUser?.fullName(), + "orderId": + controller + .parcelOrder + .value + .id, + "restaurantId": + driverUser?.id, "customerId": customer?.id, - "customerProfileImage": customer?.profilePictureURL, - "restaurantProfileImage": driverUser?.profilePictureURL, + "customerProfileImage": + customer + ?.profilePictureURL, + "restaurantProfileImage": + driverUser + ?.profilePictureURL, "token": driverUser?.fcmToken, "chatType": "Driver", }, @@ -351,11 +657,29 @@ class ParcelOrderDetails extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -369,43 +693,98 @@ class ParcelOrderDetails extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: controller.subTotal.value.toString(), + ), + isDark, + ), // Discount - _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark), + _summaryTile( + "Discount".tr(), + Constant.amountShow( + amount: controller.discount.value.toString(), + ), + isDark, + ), // Tax List - ...List.generate(controller.parcelOrder.value.taxSetting!.length, (index) { - return _summaryTile( - "${controller.parcelOrder.value.taxSetting![index].title} ${controller.parcelOrder.value.taxSetting![index].type == 'fix' ? '' : '(${controller.parcelOrder.value.taxSetting![index].tax}%)'}", - Constant.amountShow( - amount: - Constant.getTaxValue( - amount: - ((double.tryParse(controller.parcelOrder.value.subTotal.toString()) ?? 0.0) - (double.tryParse(controller.parcelOrder.value.discount.toString()) ?? 0.0)) - .toString(), - taxModel: controller.parcelOrder.value.taxSetting![index], - ).toString(), - ), - isDark, - ); - }), + ...List.generate( + controller.parcelOrder.value.taxSetting!.length, + (index) { + return _summaryTile( + "${controller.parcelOrder.value.taxSetting![index].title} ${controller.parcelOrder.value.taxSetting![index].type == 'fix' ? '' : '(${controller.parcelOrder.value.taxSetting![index].tax}%)'}", + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + ((double.tryParse( + controller + .parcelOrder + .value + .subTotal + .toString(), + ) ?? + 0.0) - + (double.tryParse( + controller + .parcelOrder + .value + .discount + .toString(), + ) ?? + 0.0)) + .toString(), + taxModel: + controller + .parcelOrder + .value + .taxSetting![index], + ).toString(), + ), + isDark, + ); + }, + ), const Divider(), // Total - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value.toString(), + ), + isDark, + ), ], ), ), @@ -424,7 +803,10 @@ class ParcelOrderDetails extends StatelessWidget { height: 5, borderRadius: 15, color: AppThemeData.primary300, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, ), ) : SizedBox(), @@ -433,7 +815,11 @@ class ParcelOrderDetails extends StatelessWidget { ); } - Widget statusBottomSheet(BuildContext context, ParcelOrderDetailsController controller, bool isDark) { + Widget statusBottomSheet( + BuildContext context, + ParcelOrderDetailsController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.30, minChildSize: 0.20, @@ -442,23 +828,46 @@ class ParcelOrderDetails extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: SingleChildScrollView( controller: scrollController, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Parcel Status Timeline".tr(), style: AppThemeData.semiBoldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18)), + Text( + "Parcel Status Timeline".tr(), + style: AppThemeData.semiBoldTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + fontSize: 18, + ), + ), const SizedBox(height: 8), // Dynamic List Obx(() { - final history = controller.parcelOrder.value.statusHistory ?? []; + final history = + controller.parcelOrder.value.statusHistory ?? []; if (history.isEmpty) { return SizedBox( height: 80, - child: Center(child: Text("No status updates yet".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + child: Center( + child: Text( + "No status updates yet".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), ); } @@ -476,12 +885,26 @@ class ParcelOrderDetails extends StatelessWidget { child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset(isCompleted ? "assets/images/image_status_timeline.png" : "assets/images/image_timeline.png", height: 48, width: 48), + Image.asset( + isCompleted + ? "assets/images/image_status_timeline.png" + : "assets/images/image_timeline.png", + height: 48, + width: 48, + ), const SizedBox(width: 20), Expanded( child: Text( statusUpdate.status ?? '', - style: AppThemeData.semiBoldTextStyle(color: isCompleted ? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900) : AppThemeData.grey500, fontSize: 18), + style: AppThemeData.semiBoldTextStyle( + color: + isCompleted + ? (isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900) + : AppThemeData.grey500, + fontSize: 18, + ), ), ), ], @@ -499,14 +922,44 @@ class ParcelOrderDetails extends StatelessWidget { ); } - Widget _infoSection(String title, String name, String address, String phone, bool isDark) { + Widget _infoSection( + String title, + String name, + String address, + String phone, + bool isDark, + ) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(name, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(address, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Text(phone, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + name, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + address, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), + Text( + phone, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), // Text(time, style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), ], ); @@ -516,11 +969,28 @@ class ParcelOrderDetails extends StatelessWidget { return Column( children: [ // Icon(icon, color: AppThemeData.primary300), - SvgPicture.asset(icon, height: 28, width: 28, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800), + SvgPicture.asset( + icon, + height: 28, + width: 28, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), const SizedBox(height: 6), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), const SizedBox(height: 6), - Text(title, style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ); } @@ -531,8 +1001,20 @@ class ParcelOrderDetails extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total".tr() ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total".tr() ? 18 : 16, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), ], ), ); diff --git a/lib/screen_ui/parcel_service/parcel_review_screen.dart b/lib/screen_ui/parcel_service/parcel_review_screen.dart index 3464b07..8a829c4 100644 --- a/lib/screen_ui/parcel_service/parcel_review_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_review_screen.dart @@ -2,7 +2,7 @@ import 'package:customer/controllers/parcel_review_controller.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -26,10 +26,22 @@ class ParcelReviewScreen extends StatelessWidget { centerTitle: true, elevation: 0, backgroundColor: AppThemeData.primary300, - leading: GestureDetector(onTap: () => Get.back(), child: Icon(Icons.arrow_back_ios, color: isDark ? Colors.white : Colors.black)), + leading: GestureDetector( + onTap: () => Get.back(), + child: Icon( + Icons.arrow_back_ios, + color: isDark ? Colors.white : Colors.black, + ), + ), title: Text( - controller.ratingModel.value != null && controller.ratingModel.value!.id!.isNotEmpty ? "Update Review".tr() : "Add Review".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16), + controller.ratingModel.value != null && + controller.ratingModel.value!.id!.isNotEmpty + ? "Update Review".tr() + : "Add Review".tr(), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontSize: 16, + ), ), ), body: Obx( @@ -41,11 +53,21 @@ class ParcelReviewScreen extends StatelessWidget { child: Stack( children: [ Padding( - padding: const EdgeInsets.only(left: 20, right: 20, top: 50, bottom: 20), + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 50, + bottom: 20, + ), child: Card( elevation: 2, - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 65), @@ -53,65 +75,148 @@ class ParcelReviewScreen extends StatelessWidget { children: [ // Driver Name Padding( - padding: const EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.only( + top: 8.0, + ), child: Text( - controller.order.value!.driver?.fullName() ?? "", - style: TextStyle(color: isDark ? Colors.white : Colors.black87, fontFamily: AppThemeData.medium, fontSize: 18), + controller.order.value!.driver + ?.fullName() ?? + "", + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black87, + fontFamily: AppThemeData.medium, + fontSize: 18, + ), ), ), // Car info - const Padding(padding: EdgeInsets.symmetric(vertical: 12), child: Divider(color: Colors.grey)), + const Padding( + padding: EdgeInsets.symmetric( + vertical: 12, + ), + child: Divider(color: Colors.grey), + ), // Title Padding( padding: const EdgeInsets.only(top: 16), - child: Text('How is your trip?'.tr(), style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2)), + child: Text( + 'How is your trip?'.tr(), + style: TextStyle( + fontSize: 18, + color: + isDark + ? Colors.white + : Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 2, + ), + ), ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( - 'Your feedback will help us improve \n driving experience better'.tr(), + 'Your feedback will help us improve \n driving experience better' + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8), + style: TextStyle( + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), + letterSpacing: 0.8, + ), ), ), // Rating Padding( padding: const EdgeInsets.only(top: 20), - child: Text('Rate for'.tr(), style: TextStyle(fontSize: 16, color: isDark ? Colors.white : Colors.black.withOpacity(0.60), letterSpacing: 0.8)), + child: Text( + 'Rate for'.tr(), + style: TextStyle( + fontSize: 16, + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), + letterSpacing: 0.8, + ), + ), ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( - controller.order.value!.driver?.fullName() ?? "", - style: TextStyle(fontSize: 18, color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2), + controller.order.value!.driver + ?.fullName() ?? + "", + style: TextStyle( + fontSize: 18, + color: + isDark + ? Colors.white + : Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 2, + ), ), ), Padding( padding: const EdgeInsets.only(top: 10), child: RatingBar.builder( - initialRating: controller.ratings.value, + initialRating: + controller.ratings.value, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, - itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), - unratedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, - onRatingUpdate: (rating) => controller.ratings.value = rating, + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + onRatingUpdate: + (rating) => + controller.ratings.value = + rating, ), ), // Comment - Padding(padding: const EdgeInsets.all(20.0), child: TextFieldWidget(hintText: "Type comment....".tr(), controller: controller.comment.value, maxLine: 5)), + Padding( + padding: const EdgeInsets.all(20.0), + child: TextFieldWidget( + hintText: "Type comment....".tr(), + controller: controller.comment.value, + maxLine: 5, + ), + ), // Submit Button Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), + title: + controller.ratingModel.value != + null + ? "Update Review".tr() + : "Add Review".tr(), color: AppThemeData.primary300, - textColor: isDark ? Colors.white : Colors.black, + textColor: + isDark + ? Colors.white + : Colors.black, onPress: controller.submitReview, ), ), @@ -127,11 +232,28 @@ class ParcelReviewScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(60), color: Colors.white, - boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.15), blurRadius: 8, spreadRadius: 6)], + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.15), + blurRadius: 8, + spreadRadius: 6, + ), + ], ), child: ClipRRect( borderRadius: BorderRadius.circular(60), - child: NetworkImageWidget(imageUrl: controller.order.value?.driver?.profilePictureURL ?? '', fit: BoxFit.cover, height: 110, width: 110), + child: NetworkImageWidget( + imageUrl: + controller + .order + .value + ?.driver + ?.profilePictureURL ?? + '', + fit: BoxFit.cover, + height: 110, + width: 110, + ), ), ), ), diff --git a/lib/screen_ui/rental_service/my_rental_booking_screen.dart b/lib/screen_ui/rental_service/my_rental_booking_screen.dart index 072d05a..11c5f77 100644 --- a/lib/screen_ui/rental_service/my_rental_booking_screen.dart +++ b/lib/screen_ui/rental_service/my_rental_booking_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/screen_ui/rental_service/rental_order_details_screen.da import 'package:customer/themes/round_button_fill.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/my_rental_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -25,14 +25,27 @@ class MyRentalBookingScreen extends StatelessWidget { builder: (controller) { return DefaultTabController( length: controller.tabTitles.length, - initialIndex: controller.tabTitles.indexOf(controller.selectedTab.value), + initialIndex: controller.tabTitles.indexOf( + controller.selectedTab.value, + ), child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppThemeData.primary300, title: Padding( padding: const EdgeInsets.only(bottom: 10), - child: Row(children: [const SizedBox(width: 10), Text("Rental History".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900))]), + child: Row( + children: [ + const SizedBox(width: 10), + Text( + "Rental History".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), + ], + ), ), bottom: TabBar( onTap: (index) { @@ -42,8 +55,13 @@ class MyRentalBookingScreen extends StatelessWidget { labelColor: AppThemeData.parcelService500, unselectedLabelColor: AppThemeData.parcelService500, labelStyle: AppThemeData.boldTextStyle(fontSize: 13), - unselectedLabelStyle: AppThemeData.mediumTextStyle(fontSize: 13), - tabs: controller.tabTitles.map((title) => Tab(child: Center(child: Text(title)))).toList(), + unselectedLabelStyle: AppThemeData.mediumTextStyle( + fontSize: 13, + ), + tabs: + controller.tabTitles + .map((title) => Tab(child: Center(child: Text(title)))) + .toList(), ), ), body: @@ -56,12 +74,30 @@ class MyRentalBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Please Log In to Continue".tr(), style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold)), + Text( + "Please Log In to Continue".tr(), + style: TextStyle( + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + fontSize: 22, + fontFamily: AppThemeData.semiBold, + ), + ), const SizedBox(height: 5), Text( - "You’re not logged in. Please sign in to access your account and explore all features.".tr(), + "You’re not logged in. Please sign in to access your account and explore all features." + .tr(), textAlign: TextAlign.center, - style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold), + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey500, + fontSize: 16, + fontFamily: AppThemeData.bold, + ), ), const SizedBox(height: 20), RoundedButtonFill( @@ -80,71 +116,154 @@ class MyRentalBookingScreen extends StatelessWidget { : TabBarView( children: controller.tabTitles.map((title) { - List orders = controller.getOrdersForTab(title); + List orders = controller + .getOrdersForTab(title); if (orders.isEmpty) { - return Center(child: Text("No orders found".tr(), style: AppThemeData.mediumTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))); + return Center( + child: Text( + "No orders found".tr(), + style: AppThemeData.mediumTextStyle( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ); } return ListView.builder( padding: const EdgeInsets.all(16), itemCount: orders.length, itemBuilder: (context, index) { - RentalOrderModel order = orders[index]; //use this + RentalOrderModel order = + orders[index]; //use this return InkWell( onTap: () { - Get.to(() => RentalOrderDetailsScreen(), arguments: order); + Get.to( + () => RentalOrderDetailsScreen(), + arguments: order, + ); }, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), margin: const EdgeInsets.only(bottom: 10), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Padding(padding: const EdgeInsets.only(top: 5), child: Image.asset("assets/icons/pickup.png", height: 18, width: 18)), + Padding( + padding: const EdgeInsets.only( + top: 5, + ), + child: Image.asset( + "assets/icons/pickup.png", + height: 18, + width: 18, + ), + ), const SizedBox(width: 10), Expanded( //prevents overflow child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Expanded( //text wraps if too long child: Text( - order.sourceLocationName ?? "-", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), - overflow: TextOverflow.ellipsis, //safe cutoff + order.sourceLocationName ?? + "-", + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), + overflow: + TextOverflow + .ellipsis, //safe cutoff maxLines: 2, ), ), - if (order.status != null) ...[ - const SizedBox(width: 8), + if (order.status != + null) ...[ + const SizedBox( + width: 8, + ), Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), + padding: + const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), decoration: BoxDecoration( - color: AppThemeData.info50, - border: Border.all(color: AppThemeData.info300), - borderRadius: BorderRadius.circular(12), + color: + AppThemeData + .info50, + border: Border.all( + color: + AppThemeData + .info300, + ), + borderRadius: + BorderRadius.circular( + 12, + ), + ), + child: Text( + order.status ?? '', + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + AppThemeData + .info500, + ), ), - child: Text(order.status ?? '', style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.info500)), ), ], ], ), - if (order.bookingDateTime != null) + if (order.bookingDateTime != + null) Text( - Constant.timestampToDateTime(order.bookingDateTime!), - style: AppThemeData.mediumTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + Constant.timestampToDateTime( + order.bookingDateTime!, + ), + style: AppThemeData.mediumTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), @@ -152,41 +271,112 @@ class MyRentalBookingScreen extends StatelessWidget { ], ), const SizedBox(height: 12), - Text("Vehicle Type :".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Vehicle Type :".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( children: [ ClipRRect( //borderRadius: BorderRadius.circular(10), child: CachedNetworkImage( - imageUrl: order.rentalVehicleType!.rentalVehicleIcon.toString(), + imageUrl: + order + .rentalVehicleType! + .rentalVehicleIcon + .toString(), height: 60, width: 60, imageBuilder: - (context, imageProvider) => Container( - decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover)), + ( + context, + imageProvider, + ) => Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: + imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + ( + context, + url, + error, + ) => Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, ), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( "${order.rentalVehicleType!.name}", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), Padding( - padding: const EdgeInsets.only(top: 2.0), + padding: + const EdgeInsets.only( + top: 2.0, + ), child: Text( "${order.rentalVehicleType!.shortDescription}", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ), ], @@ -196,60 +386,143 @@ class MyRentalBookingScreen extends StatelessWidget { ], ), ), - Text("Package info :".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Package info :".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - order.rentalPackageModel!.name.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + order + .rentalPackageModel! + .name + .toString(), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), const SizedBox(height: 4), Text( - order.rentalPackageModel!.description.toString(), - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + order + .rentalPackageModel! + .description + .toString(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), ), SizedBox(width: 10), Text( - Constant.amountShow(amount: order.rentalPackageModel!.baseFare.toString()), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + order + .rentalPackageModel! + .baseFare + .toString(), + ), + style: + AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), - if (Constant.isEnableOTPTripStartForRental == true) - Text("${'OTP :'.tr()} ${order.otpCode}", style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + if (Constant + .isEnableOTPTripStartForRental == + true) + Text( + "${'OTP :'.tr()} ${order.otpCode}", + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), SizedBox(height: 10), Row( children: [ - order.status == Constant.orderInTransit && order.paymentStatus == false + order.status == + Constant + .orderInTransit && + order.paymentStatus == false ? Expanded( child: RoundedButtonFill( title: "Pay Now", onPress: () { - Get.to(() => RentalOrderDetailsScreen(), arguments: order); + Get.to( + () => + RentalOrderDetailsScreen(), + arguments: order, + ); }, - color: AppThemeData.primary300, - textColor: AppThemeData.grey900, + color: + AppThemeData.primary300, + textColor: + AppThemeData.grey900, ), ) : SizedBox(), - order.status == Constant.orderPlaced || order.status == Constant.driverAccepted + order.status == + Constant.orderPlaced || + order.status == + Constant.driverAccepted ? Expanded( child: RoundedButtonFill( title: "Cancel Booking", - onPress: () => controller.cancelRentalRequest(order, taxList: order.taxSetting), - color: AppThemeData.danger300, - textColor: AppThemeData.surface, + onPress: + () => controller + .cancelRentalRequest( + order, + taxList: + order + .taxSetting, + ), + color: + AppThemeData.danger300, + textColor: + AppThemeData.surface, ), ) : SizedBox(), @@ -269,7 +542,12 @@ class MyRentalBookingScreen extends StatelessWidget { ); } - Obx cardDecoration(MyRentalBookingController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + MyRentalBookingController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -284,8 +562,21 @@ class MyRentalBookingScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -296,12 +587,30 @@ class MyRentalBookingScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel!.walletAmount == null ? '0.0' : Constant.userModel!.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel!.walletAmount == null + ? '0.0' + : Constant.userModel!.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -310,14 +619,23 @@ class MyRentalBookingScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/rental_service/rental_conformation_screen.dart b/lib/screen_ui/rental_service/rental_conformation_screen.dart index 1c2419c..92ac2a1 100644 --- a/lib/screen_ui/rental_service/rental_conformation_screen.dart +++ b/lib/screen_ui/rental_service/rental_conformation_screen.dart @@ -7,7 +7,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/rental_conformation_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -38,12 +38,30 @@ class RentalConformationScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Confirm Rent a Car".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Confirm Rent a Car".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -61,26 +79,56 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset("assets/icons/pickup.png", height: 15, width: 15), + Image.asset( + "assets/icons/pickup.png", + height: 15, + width: 15, + ), SizedBox(width: 15), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${controller.rentalOrderModel.value.sourceLocationName}", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), Text( - Constant.timestampToDate(controller.rentalOrderModel.value.bookingDateTime!), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + Constant.timestampToDate( + controller + .rentalOrderModel + .value + .bookingDateTime!, + ), + style: AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), ], ), @@ -92,38 +140,96 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Your Preference".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Your Preference".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.rentalOrderModel.value.rentalPackageModel!.name.toString(), - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .rentalOrderModel + .value + .rentalPackageModel! + .name + .toString(), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), const SizedBox(height: 4), Text( - controller.rentalOrderModel.value.rentalPackageModel!.description.toString(), - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + controller + .rentalOrderModel + .value + .rentalPackageModel! + .description + .toString(), + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), ], ), ), SizedBox(width: 10), Text( - Constant.amountShow(amount: controller.rentalOrderModel.value.rentalPackageModel!.baseFare.toString()), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + controller + .rentalOrderModel + .value + .rentalPackageModel! + .baseFare + .toString(), + ), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -134,35 +240,81 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Vehicle Type".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.rentalOrderModel.value.rentalVehicleType!.rentalVehicleIcon.toString(), height: 50, width: 50, borderRadius: 10), + borderRadius: + BorderRadiusGeometry.circular(10), + child: NetworkImageWidget( + imageUrl: + controller + .rentalOrderModel + .value + .rentalVehicleType! + .rentalVehicleIcon + .toString(), + height: 50, + width: 50, + borderRadius: 10, + ), ), SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${controller.rentalOrderModel.value.rentalVehicleType!.name}", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), Text( "${controller.rentalOrderModel.value.rentalVehicleType!.shortDescription}", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark600 + : AppThemeData.grey600, + ), ), ], ), @@ -176,24 +328,53 @@ class RentalConformationScreen extends StatelessWidget { Row( children: [ - Expanded(child: Text("Coupons".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Expanded( + child: Text( + "Coupons".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + ), InkWell( onTap: () { Get.to(RentalCouponScreen())!.then((value) { if (value != null) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: value); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = value; + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: value, + ); + if (couponAmount < + controller.subTotal.value) { + controller.selectedCouponModel.value = + value; controller.calculateAmount(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } }); }, child: Text( "View All".tr(), - style: AppThemeData.boldTextStyle(decoration: TextDecoration.underline, fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.boldTextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ), ], @@ -202,21 +383,44 @@ class RentalConformationScreen extends StatelessWidget { // Coupon input DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(10), color: isDark ? AppThemeData.parcelServiceDark300 : AppThemeData.primary300), + options: RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular(10), + color: + isDark + ? AppThemeData.parcelServiceDark300 + : AppThemeData.primary300, + ), child: Container( - decoration: BoxDecoration(color: AppThemeData.parcelService50, borderRadius: BorderRadius.circular(10)), - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: AppThemeData.parcelService50, + borderRadius: BorderRadius.circular(10), + ), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), child: Row( children: [ - SvgPicture.asset("assets/icons/ic_coupon_parcel.svg", height: 28, width: 28), + SvgPicture.asset( + "assets/icons/ic_coupon_parcel.svg", + height: 28, + width: 28, + ), SizedBox(width: 15), Expanded( child: TextFormField( - controller: controller.couponController.value, - style: AppThemeData.semiBoldTextStyle(color: AppThemeData.grey900), + controller: + controller.couponController.value, + style: AppThemeData.semiBoldTextStyle( + color: AppThemeData.grey900, + ), decoration: InputDecoration( hintText: "Write coupon code".tr(), - hintStyle: AppThemeData.mediumTextStyle(fontSize: 16, color: AppThemeData.parcelService500), + hintStyle: AppThemeData.mediumTextStyle( + fontSize: 16, + color: AppThemeData.parcelService500, + ), border: InputBorder.none, ), ), @@ -224,22 +428,61 @@ class RentalConformationScreen extends StatelessWidget { RoundedButtonFill( title: "Redeem now".tr(), onPress: () { - if (controller.couponList.where((element) => element.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()).isNotEmpty) { - CouponModel couponModel = controller.couponList.firstWhere((p0) => p0.code!.toLowerCase() == controller.couponController.value.text.toLowerCase()); - if (couponModel.expiresAt!.toDate().isAfter(DateTime.now())) { - double couponAmount = Constant.calculateDiscount(amount: controller.subTotal.value.toString(), offerModel: couponModel); - if (couponAmount < controller.subTotal.value) { - controller.selectedCouponModel.value = couponModel; + if (controller.couponList + .where( + (element) => + element.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ) + .isNotEmpty) { + CouponModel couponModel = controller + .couponList + .firstWhere( + (p0) => + p0.code!.toLowerCase() == + controller + .couponController + .value + .text + .toLowerCase(), + ); + if (couponModel.expiresAt! + .toDate() + .isAfter(DateTime.now())) { + double couponAmount = + Constant.calculateDiscount( + amount: + controller.subTotal.value + .toString(), + offerModel: couponModel, + ); + if (couponAmount < + controller.subTotal.value) { + controller + .selectedCouponModel + .value = couponModel; controller.calculateAmount(); controller.update(); } else { - ShowToastDialog.showToast("This offer not eligible for this booking".tr()); + ShowToastDialog.showToast( + "This offer not eligible for this booking" + .tr(), + ); } } else { - ShowToastDialog.showToast("This coupon code has been expired".tr()); + ShowToastDialog.showToast( + "This coupon code has been expired" + .tr(), + ); } } else { - ShowToastDialog.showToast("Invalid coupon code".tr()); + ShowToastDialog.showToast( + "Invalid coupon code".tr(), + ); } }, borderRadius: 10, @@ -257,45 +500,104 @@ class RentalConformationScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), // Subtotal - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: + controller.subTotal.value.toString(), + ), + isDark, + null, + ), // Discount - _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), + _summaryTile( + "Discount".tr(), + Constant.amountShow( + amount: + controller.discount.value.toString(), + ), + isDark, + AppThemeData.dangerDark300, + ), // Tax List - ...List.generate(controller.rentalOrderModel.value.taxSetting!.length, (index) { - final taxModel = controller.rentalOrderModel.value.taxSetting![index]; - final taxTitle = "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; + ...List.generate( + controller + .rentalOrderModel + .value + .taxSetting! + .length, + (index) { + final taxModel = + controller + .rentalOrderModel + .value + .taxSetting![index]; + final taxTitle = + "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; - return _summaryTile( - taxTitle, - Constant.amountShow( - amount: - Constant.getTaxValue( - amount: (controller.subTotal.value - controller.discount.value).toString(), - taxModel: controller.rentalOrderModel.value.taxSetting![index], - ).toString(), - ), - isDark, - null, - ); - }), + return _summaryTile( + taxTitle, + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + (controller.subTotal.value - + controller + .discount + .value) + .toString(), + taxModel: + controller + .rentalOrderModel + .value + .taxSetting![index], + ).toString(), + ), + isDark, + null, + ); + }, + ), const Divider(), // Total - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value.toString(), + ), + isDark, + null, + ), ], ), ), @@ -324,8 +626,22 @@ class RentalConformationScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total" ? 18 : 16, color: colors ?? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total" ? 18 : 16, + color: + colors ?? + (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ), + ), ], ), ); diff --git a/lib/screen_ui/rental_service/rental_coupon_screen.dart b/lib/screen_ui/rental_service/rental_coupon_screen.dart index 2ce13d3..c1e2c6b 100644 --- a/lib/screen_ui/rental_service/rental_coupon_screen.dart +++ b/lib/screen_ui/rental_service/rental_coupon_screen.dart @@ -8,7 +8,7 @@ import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; class RentalCouponScreen extends StatelessWidget { const RentalCouponScreen({super.key}); @@ -33,12 +33,30 @@ class RentalCouponScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Coupon".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Coupon".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -54,17 +72,35 @@ class RentalCouponScreen extends StatelessWidget { itemBuilder: (context, index) { CouponModel couponModel = controller.cabCouponList[index]; return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Container( height: Responsive.height(16, context), - decoration: ShapeDecoration(color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData.grey900 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), child: Row( children: [ ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(10), bottomLeft: Radius.circular(10)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + ), child: Stack( children: [ - Image.asset("assets/images/ic_coupon_image.png", height: Responsive.height(16, context), fit: BoxFit.fill), + Image.asset( + "assets/images/ic_coupon_image.png", + height: Responsive.height(16, context), + fit: BoxFit.fill, + ), Padding( padding: const EdgeInsets.only(left: 10), child: Align( @@ -74,7 +110,14 @@ class RentalCouponScreen extends StatelessWidget { child: Text( "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey50), + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey50, + ), ), ), ), @@ -84,24 +127,53 @@ class RentalCouponScreen extends StatelessWidget { ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 18), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ DottedBorder( - options: RoundedRectDottedBorderOptions(strokeWidth: 1, radius: const Radius.circular(6), color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + options: + RoundedRectDottedBorderOptions( + strokeWidth: 1, + radius: const Radius.circular( + 6, + ), + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: + const EdgeInsets.symmetric( + horizontal: 16, + ), child: Text( "${couponModel.code}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.semiBold, fontSize: 16, color: isDark ? AppThemeData.grey400 : AppThemeData.grey500), + style: TextStyle( + fontFamily: + AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.grey400 + : AppThemeData + .grey500, + ), ), ), ), - const Expanded(child: SizedBox(height: 10)), + const Expanded( + child: SizedBox(height: 10), + ), InkWell( onTap: () { Get.back(result: couponModel); @@ -109,18 +181,38 @@ class RentalCouponScreen extends StatelessWidget { child: Text( "Tap To Apply".tr(), textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: TextStyle( + fontFamily: AppThemeData.medium, + color: + isDark + ? AppThemeData + .primary300 + : AppThemeData + .primary300, + ), ), ), ], ), const SizedBox(height: 20), - MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), + MySeparator( + color: + isDark + ? AppThemeData.grey700 + : AppThemeData.grey200, + ), const SizedBox(height: 20), Text( "${couponModel.description}", textAlign: TextAlign.start, - style: TextStyle(fontFamily: AppThemeData.medium, fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ], ), diff --git a/lib/screen_ui/rental_service/rental_dashboard_screen.dart b/lib/screen_ui/rental_service/rental_dashboard_screen.dart index ae0e79f..549f827 100644 --- a/lib/screen_ui/rental_service/rental_dashboard_screen.dart +++ b/lib/screen_ui/rental_service/rental_dashboard_screen.dart @@ -5,7 +5,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/cab_rental_dashboard_controllers.dart'; class RentalDashboardScreen extends StatelessWidget { @@ -26,12 +26,19 @@ class RentalDashboardScreen extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, selectedFontSize: 12, - selectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), - unselectedLabelStyle: const TextStyle(fontFamily: AppThemeData.bold), + selectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), + unselectedLabelStyle: const TextStyle( + fontFamily: AppThemeData.bold, + ), currentIndex: controller.selectedIndex.value, - backgroundColor: isDark ? AppThemeData.grey900 : AppThemeData.grey50, - selectedItemColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - unselectedItemColor: isDark ? AppThemeData.grey300 : AppThemeData.grey600, + backgroundColor: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, + selectedItemColor: + isDark ? AppThemeData.primary300 : AppThemeData.primary300, + unselectedItemColor: + isDark ? AppThemeData.grey300 : AppThemeData.grey600, onTap: (int index) { if (index == 0) { Get.put(CabDashboardController()); @@ -41,15 +48,57 @@ class RentalDashboardScreen extends StatelessWidget { items: Constant.walletSetting == false ? [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ] : [ - navigationBarItem(isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", label: 'Home'.tr(), controller: controller), - navigationBarItem(isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", label: 'My Bookings'.tr(), controller: controller), - navigationBarItem(isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", label: 'Wallet'.tr(), controller: controller), - navigationBarItem(isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", label: 'Profile'.tr(), controller: controller), + navigationBarItem( + isDark, + index: 0, + assetIcon: "assets/icons/ic_home_cab.svg", + label: 'Home'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 1, + assetIcon: "assets/icons/ic_booking_cab.svg", + label: 'My Bookings'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 2, + assetIcon: "assets/icons/ic_wallet_cab.svg", + label: 'Wallet'.tr(), + controller: controller, + ), + navigationBarItem( + isDark, + index: 3, + assetIcon: "assets/icons/ic_profile.svg", + label: 'Profile'.tr(), + controller: controller, + ), ], ), ); @@ -58,7 +107,13 @@ class RentalDashboardScreen extends StatelessWidget { }); } - BottomNavigationBarItem navigationBarItem(isDark, {required int index, required String label, required String assetIcon, required CabRentalDashboardControllers controller}) { + BottomNavigationBarItem navigationBarItem( + isDark, { + required int index, + required String label, + required String assetIcon, + required CabRentalDashboardControllers controller, + }) { return BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.symmetric(vertical: 5), diff --git a/lib/screen_ui/rental_service/rental_home_screen.dart b/lib/screen_ui/rental_service/rental_home_screen.dart index 30f7ca1..0ba3a0d 100644 --- a/lib/screen_ui/rental_service/rental_home_screen.dart +++ b/lib/screen_ui/rental_service/rental_home_screen.dart @@ -2,7 +2,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/constant/constant.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/rental_home_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/rental_vehicle_type.dart'; @@ -44,8 +44,20 @@ class RentalHomeScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), @@ -58,9 +70,21 @@ class RentalHomeScreen extends StatelessWidget { onTap: () { Get.offAll(const LoginScreen()); }, - child: Text("Login".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + child: Text( + "Login".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), ) - : Text(Constant.userModel!.fullName(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey900)), + : Text( + Constant.userModel!.fullName(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -82,30 +106,69 @@ class RentalHomeScreen extends StatelessWidget { InkWell( onTap: () async { if (Constant.selectedMapType == 'osm') { - final result = await Get.to(() => MapPickerPage()); + final result = await Get.to( + () => MapPickerPage(), + ); if (result != null) { final firstPlace = result; - if (Constant.checkZoneCheck(firstPlace.coordinates.latitude, firstPlace.coordinates.longitude) == true) { + if (Constant.checkZoneCheck( + firstPlace.coordinates.latitude, + firstPlace.coordinates.longitude, + ) == + true) { final address = firstPlace.address; final lat = firstPlace.coordinates.latitude; - final lng = firstPlace.coordinates.longitude; - controller.sourceTextEditController.value.text = address; - controller.departureLatLongOsm.value = latlong.LatLng(lat, lng); + final lng = + firstPlace.coordinates.longitude; + controller + .sourceTextEditController + .value + .text = address; + controller + .departureLatLongOsm + .value = latlong.LatLng(lat, lng); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } } else { - Get.to(LocationPickerScreen())!.then((value) async { + Get.to(LocationPickerScreen())!.then(( + value, + ) async { if (value != null) { - SelectedLocationModel selectedLocationModel = value; + SelectedLocationModel + selectedLocationModel = value; - if (Constant.checkZoneCheck(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude) == true) { - controller.sourceTextEditController.value.text = Utils.formatAddress(selectedLocation: selectedLocationModel); - controller.departureLatLong.value = latlong.LatLng(selectedLocationModel.latLng!.latitude, selectedLocationModel.latLng!.longitude); + if (Constant.checkZoneCheck( + selectedLocationModel + .latLng! + .latitude, + selectedLocationModel + .latLng! + .longitude, + ) == + true) { + controller + .sourceTextEditController + .value + .text = Utils.formatAddress( + selectedLocation: selectedLocationModel, + ); + controller + .departureLatLong + .value = latlong.LatLng( + selectedLocationModel.latLng!.latitude, + selectedLocationModel.latLng!.longitude, + ); } else { - ShowToastDialog.showToast("Service is unavailable at the selected address.".tr()); + ShowToastDialog.showToast( + "Service is unavailable at the selected address." + .tr(), + ); } } }); @@ -113,11 +176,18 @@ class RentalHomeScreen extends StatelessWidget { }, hoverColor: Colors.transparent, child: TextFieldWidget( - controller: controller.sourceTextEditController.value, + controller: + controller.sourceTextEditController.value, hintText: "Your current location".tr(), title: "Pickup Location".tr(), enable: false, - prefix: Padding(padding: EdgeInsets.only(left: 10, right: 10), child: Icon(Icons.stop_circle_outlined, color: Colors.green)), + prefix: Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Icon( + Icons.stop_circle_outlined, + color: Colors.green, + ), + ), ), ), const SizedBox(height: 25), @@ -125,7 +195,16 @@ class RentalHomeScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text("Select Your Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Select Your Vehicle Type".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), const SizedBox(width: 10), GestureDetector( onTap: () => controller.pickDate(context), @@ -133,7 +212,13 @@ class RentalHomeScreen extends StatelessWidget { children: [ Text( "${controller.selectedDate.value.day}-${controller.selectedDate.value.month}-${controller.selectedDate.value.year}", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), ), const SizedBox(width: 5), const Icon(Icons.date_range, size: 20), @@ -150,11 +235,13 @@ class RentalHomeScreen extends StatelessWidget { physics: NeverScrollableScrollPhysics(), scrollDirection: Axis.vertical, itemBuilder: (context, index) { - RentalVehicleType vehicleType = controller.vehicleTypes[index]; + RentalVehicleType vehicleType = + controller.vehicleTypes[index]; return Obx( () => InkWell( onTap: () { - controller.selectedVehicleType.value = controller.vehicleTypes[index]; + controller.selectedVehicleType.value = + controller.vehicleTypes[index]; }, child: Padding( padding: const EdgeInsets.only(bottom: 10), @@ -164,72 +251,144 @@ class RentalHomeScreen extends StatelessWidget { border: Border.all( color: isDark - ? controller.selectedVehicleType.value?.id == vehicleType.id - ? AppThemeData.carRentDark300 + ? controller + .selectedVehicleType + .value + ?.id == + vehicleType.id + ? AppThemeData + .carRentDark300 : Colors.transparent - : controller.selectedVehicleType.value?.id == vehicleType.id + : controller + .selectedVehicleType + .value + ?.id == + vehicleType.id ? AppThemeData.carRent300 : Colors.transparent, width: 1, ), color: - controller.selectedVehicleType.value?.id == vehicleType.id + controller + .selectedVehicleType + .value + ?.id == + vehicleType.id ? AppThemeData.carRent50 : isDark ? AppThemeData.carRentDark50 : Colors.white, ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), child: Row( children: [ ClipRRect( //borderRadius: BorderRadius.circular(10), child: CachedNetworkImage( - imageUrl: vehicleType.rentalVehicleIcon.toString(), + imageUrl: + vehicleType + .rentalVehicleIcon + .toString(), height: 60, width: 60, imageBuilder: - (context, imageProvider) => - Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), image: DecorationImage(image: imageProvider, fit: BoxFit.cover))), - placeholder: (context, url) => Center(child: CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppThemeData.primary300))), - errorWidget: (context, url, error) => Image.network(Constant.placeHolderImage, fit: BoxFit.cover), + ( + context, + imageProvider, + ) => Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 10, + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + placeholder: + (context, url) => Center( + child: CircularProgressIndicator.adaptive( + valueColor: + AlwaysStoppedAnimation( + AppThemeData + .primary300, + ), + ), + ), + errorWidget: + (context, url, error) => + Image.network( + Constant + .placeHolderImage, + fit: BoxFit.cover, + ), fit: BoxFit.cover, ), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), + padding: + const EdgeInsets.symmetric( + horizontal: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( "${vehicleType.name}", style: TextStyle( fontSize: 16, - fontWeight: FontWeight.bold, + fontWeight: + FontWeight.bold, letterSpacing: 1, color: isDark - ? controller.selectedVehicleType.value?.id == vehicleType.id - ? AppThemeData.greyDark50 - : AppThemeData.grey50 - : AppThemeData.greyDark50, + ? controller + .selectedVehicleType + .value + ?.id == + vehicleType + .id + ? AppThemeData + .greyDark50 + : AppThemeData + .grey50 + : AppThemeData + .greyDark50, ), ), Padding( - padding: const EdgeInsets.only(top: 2.0), + padding: + const EdgeInsets.only( + top: 2.0, + ), child: Text( "${vehicleType.description}", style: TextStyle( - fontWeight: FontWeight.w400, + fontWeight: + FontWeight.w400, letterSpacing: 1, color: isDark - ? controller.selectedVehicleType.value?.id == vehicleType.id - ? AppThemeData.greyDark50 - : AppThemeData.grey50 - : AppThemeData.greyDark50, + ? controller + .selectedVehicleType + .value + ?.id == + vehicleType + .id + ? AppThemeData + .greyDark50 + : AppThemeData + .grey50 + : AppThemeData + .greyDark50, ), ), ), @@ -250,30 +409,46 @@ class RentalHomeScreen extends StatelessWidget { RoundedButtonFill( title: "Continue".tr(), onPress: () async { - final sourceText = controller.sourceTextEditController.value.text.trim(); + final sourceText = + controller.sourceTextEditController.value.text + .trim(); if (Constant.userModel == null) { - ShowToastDialog.showToast("Please login to continue".tr()); + ShowToastDialog.showToast( + "Please login to continue".tr(), + ); return; } if (sourceText.isEmpty) { - ShowToastDialog.showToast("Please select source location".tr()); + ShowToastDialog.showToast( + "Please select source location".tr(), + ); return; } - if (controller.selectedVehicleType.value == null) { - ShowToastDialog.showToast("Please select a vehicle type".tr()); + if (controller.selectedVehicleType.value == + null) { + ShowToastDialog.showToast( + "Please select a vehicle type".tr(), + ); return; } await controller.getRentalPackage(); if (controller.rentalPackages.isEmpty) { - ShowToastDialog.showToast("No preference available for the selected vehicle type".tr()); + ShowToastDialog.showToast( + "No preference available for the selected vehicle type" + .tr(), + ); return; } // Open bottom sheet if packages exist - Get.bottomSheet(selectPreferences(context, controller, isDark), isScrollControlled: true, backgroundColor: Colors.transparent); + Get.bottomSheet( + selectPreferences(context, controller, isDark), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -289,7 +464,11 @@ class RentalHomeScreen extends StatelessWidget { ); } - Widget selectPreferences(BuildContext context, RentalHomeController controller, bool isDark) { + Widget selectPreferences( + BuildContext context, + RentalHomeController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.40, minChildSize: 0.40, @@ -297,19 +476,39 @@ class RentalHomeScreen extends StatelessWidget { expand: false, builder: (context, scrollController) { return Container( - decoration: BoxDecoration(color: isDark ? Colors.black : Colors.white, borderRadius: const BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? Colors.black : Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + ), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10), child: Column( children: [ // handle bar - Container(height: 4, width: 33, decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: Colors.grey.shade400)), + Container( + height: 4, + width: 33, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.grey.shade400, + ), + ), Align( alignment: Alignment.topLeft, child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), - child: Text("Select Preferences".tr(), style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18, color: isDark ? Colors.white : Colors.black)), + child: Text( + "Select Preferences".tr(), + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: isDark ? Colors.white : Colors.black, + ), + ), ), ), @@ -321,30 +520,43 @@ class RentalHomeScreen extends StatelessWidget { final package = controller.rentalPackages[index]; return Obx( () => InkWell( - onTap: () => controller.selectedPackage.value = package, + onTap: + () => controller.selectedPackage.value = package, child: Container( margin: const EdgeInsets.symmetric(vertical: 6), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), border: Border.all( - color: controller.selectedPackage.value?.id == package.id ? (isDark ? AppThemeData.carRentDark300 : AppThemeData.carRent300) : Colors.transparent, + color: + controller.selectedPackage.value?.id == + package.id + ? (isDark + ? AppThemeData.carRentDark300 + : AppThemeData.carRent300) + : Colors.transparent, width: 1, ), color: - controller.selectedPackage.value?.id == package.id + controller.selectedPackage.value?.id == + package.id ? AppThemeData.carRent50 : isDark ? AppThemeData.carRentDark50 : Colors.white, ), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 12), + padding: const EdgeInsets.symmetric( + vertical: 15, + horizontal: 12, + ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( package.name ?? "", @@ -352,8 +564,13 @@ class RentalHomeScreen extends StatelessWidget { fontSize: 18, color: isDark - ? controller.selectedPackage.value?.id == package.id - ? AppThemeData.greyDark50 + ? controller + .selectedPackage + .value + ?.id == + package.id + ? AppThemeData + .greyDark50 : AppThemeData.grey50 : AppThemeData.greyDark50, ), @@ -365,8 +582,13 @@ class RentalHomeScreen extends StatelessWidget { fontSize: 14, color: isDark - ? controller.selectedPackage.value?.id == package.id - ? AppThemeData.greyDark50 + ? controller + .selectedPackage + .value + ?.id == + package.id + ? AppThemeData + .greyDark50 : AppThemeData.grey50 : AppThemeData.greyDark50, ), @@ -375,12 +597,18 @@ class RentalHomeScreen extends StatelessWidget { ), ), Text( - Constant.amountShow(amount: package.baseFare.toString()), + Constant.amountShow( + amount: package.baseFare.toString(), + ), style: AppThemeData.boldTextStyle( fontSize: 18, color: isDark - ? controller.selectedPackage.value?.id == package.id + ? controller + .selectedPackage + .value + ?.id == + package.id ? AppThemeData.greyDark50 : AppThemeData.grey50 : AppThemeData.greyDark50, @@ -401,7 +629,11 @@ class RentalHomeScreen extends StatelessWidget { RoundedButtonFill( title: "Continue".tr(), onPress: () { - Get.bottomSheet(paymentBottomSheet(context, controller, isDark), isScrollControlled: true, backgroundColor: Colors.transparent); + Get.bottomSheet( + paymentBottomSheet(context, controller, isDark), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, @@ -414,7 +646,11 @@ class RentalHomeScreen extends StatelessWidget { ); } - Widget paymentBottomSheet(BuildContext context, RentalHomeController controller, bool isDark) { + Widget paymentBottomSheet( + BuildContext context, + RentalHomeController controller, + bool isDark, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, // Start height @@ -427,7 +663,10 @@ class RentalHomeScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: const BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -435,8 +674,20 @@ class RentalHomeScreen extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - GestureDetector(onTap: () => Get.back(), child: const Icon(Icons.close)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + GestureDetector( + onTap: () => Get.back(), + child: const Icon(Icons.close), + ), ], ), const SizedBox(height: 20), @@ -447,39 +698,89 @@ class RentalHomeScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr(), style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 10), - Text("Other Payment Options".tr(), style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Other Payment Options".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), ], ), @@ -488,32 +789,129 @@ class RentalHomeScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -530,17 +928,28 @@ class RentalHomeScreen extends StatelessWidget { textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr()); + ShowToastDialog.showToast( + "Please select a payment method".tr(), + ); return; } // Only check wallet if payment method is wallet if (controller.selectedPaymentMethod.value == "wallet") { - num walletAmount = controller.userModel.value.walletAmount ?? 0; - num baseFare = double.tryParse(controller.selectedPackage.value?.baseFare.toString() ?? "0") ?? 0; + num walletAmount = + controller.userModel.value.walletAmount ?? 0; + num baseFare = + double.tryParse( + controller.selectedPackage.value?.baseFare + .toString() ?? + "0", + ) ?? + 0; if (walletAmount < baseFare) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr()); + ShowToastDialog.showToast( + "You do not have sufficient wallet balance".tr(), + ); return; } } @@ -555,7 +964,12 @@ class RentalHomeScreen extends StatelessWidget { ); } - Obx cardDecoration(RentalHomeController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + RentalHomeController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -570,8 +984,21 @@ class RentalHomeScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -582,12 +1009,34 @@ class RentalHomeScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == + null + ? '0.0' + : controller + .userModel + .value + .walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -596,14 +1045,23 @@ class RentalHomeScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/rental_service/rental_order_details_screen.dart b/lib/screen_ui/rental_service/rental_order_details_screen.dart index 9b6129a..a6c0821 100644 --- a/lib/screen_ui/rental_service/rental_order_details_screen.dart +++ b/lib/screen_ui/rental_service/rental_order_details_screen.dart @@ -11,7 +11,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/rental_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/user_model.dart'; @@ -46,12 +46,30 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Container( height: 42, width: 42, - decoration: BoxDecoration(shape: BoxShape.circle, color: AppThemeData.grey50), - child: Center(child: Padding(padding: const EdgeInsets.only(left: 5), child: Icon(Icons.arrow_back_ios, color: AppThemeData.grey900, size: 20))), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppThemeData.grey50, + ), + child: Center( + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Icon( + Icons.arrow_back_ios, + color: AppThemeData.grey900, + size: 20, + ), + ), + ), ), ), const SizedBox(width: 10), - Text("Order Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 18, color: AppThemeData.grey900)), + Text( + "Order Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: AppThemeData.grey900, + ), + ), ], ), ), @@ -64,7 +82,10 @@ class RentalOrderDetailsScreen extends StatelessWidget { Expanded( child: SingleChildScrollView( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 20, + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -72,8 +93,16 @@ class RentalOrderDetailsScreen extends StatelessWidget { padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( children: [ @@ -81,15 +110,32 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "${'Booking Id :'.tr()} ${controller.order.value.id}", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + ), ), ), InkWell( onTap: () { - Clipboard.setData(ClipboardData(text: controller.order.value.id.toString())); - ShowToastDialog.showToast("Booking ID copied to clipboard".tr()); + Clipboard.setData( + ClipboardData( + text: + controller.order.value.id + .toString(), + ), + ); + ShowToastDialog.showToast( + "Booking ID copied to clipboard" + .tr(), + ); }, child: Icon(Icons.copy), ), @@ -97,22 +143,64 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), SizedBox(height: 10), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Padding(padding: const EdgeInsets.only(top: 5), child: Image.asset("assets/icons/pickup.png", height: 15, width: 15)), + Padding( + padding: const EdgeInsets.only( + top: 5, + ), + child: Image.asset( + "assets/icons/pickup.png", + height: 15, + width: 15, + ), + ), const SizedBox(width: 15), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.order.value.sourceLocationName ?? "-", - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .order + .value + .sourceLocationName ?? + "-", + style: + AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), - if (controller.order.value.bookingDateTime != null) + if (controller + .order + .value + .bookingDateTime != + null) Text( - Constant.timestampToDate(controller.order.value.bookingDateTime!), - style: AppThemeData.semiBoldTextStyle(fontSize: 12, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + Constant.timestampToDate( + controller + .order + .value + .bookingDateTime!, + ), + style: + AppThemeData.semiBoldTextStyle( + fontSize: 12, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), @@ -123,43 +211,107 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), const SizedBox(height: 15), - if (controller.order.value.rentalPackageModel != null) + if (controller.order.value.rentalPackageModel != + null) Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Your Preference".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Your Preference".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.order.value.rentalPackageModel!.name ?? "-", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .order + .value + .rentalPackageModel! + .name ?? + "-", + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), const SizedBox(height: 4), Text( - controller.order.value.rentalPackageModel!.description ?? "", - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + controller + .order + .value + .rentalPackageModel! + .description ?? + "", + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), ), const SizedBox(width: 10), Text( - Constant.amountShow(amount: controller.order.value.rentalPackageModel!.baseFare.toString()), - style: AppThemeData.boldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + Constant.amountShow( + amount: + controller + .order + .value + .rentalPackageModel! + .baseFare + .toString(), + ), + style: AppThemeData.boldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData.grey900, + ), ), ], ), @@ -172,19 +324,43 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + borderRadius: BorderRadius.circular( + 15, + ), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), padding: const EdgeInsets.all(16), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("About Driver".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "About Driver".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 8), Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Row( children: [ @@ -192,109 +368,277 @@ class RentalOrderDetailsScreen extends StatelessWidget { width: 52, height: 52, child: ClipRRect( - borderRadius: BorderRadiusGeometry.circular(10), - child: NetworkImageWidget(imageUrl: controller.driverUser.value?.profilePictureURL ?? '', height: 70, width: 70, borderRadius: 35), + borderRadius: + BorderRadiusGeometry.circular( + 10, + ), + child: NetworkImageWidget( + imageUrl: + controller + .driverUser + .value + ?.profilePictureURL ?? + '', + height: 70, + width: 70, + borderRadius: 35, + ), ), ), SizedBox(width: 20), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment + .start, children: [ Text( - controller.order.value.driver?.fullName() ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, fontSize: 18), + controller + .order + .value + .driver + ?.fullName() ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + fontSize: 18, + ), ), Text( "${controller.order.value.driver?.vehicleType ?? ''} | ${controller.order.value.driver?.carMakes.toString()}", - style: TextStyle(fontFamily: AppThemeData.medium, color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 14), + style: TextStyle( + fontFamily: + AppThemeData + .medium, + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + fontSize: 14, + ), ), Text( - controller.order.value.driver?.carNumber ?? '', - style: AppThemeData.boldTextStyle(color: isDark ? AppThemeData.greyDark700 : AppThemeData.grey700, fontSize: 16), + controller + .order + .value + .driver + ?.carNumber ?? + '', + style: AppThemeData.boldTextStyle( + color: + isDark + ? AppThemeData + .greyDark700 + : AppThemeData + .grey700, + fontSize: 16, + ), ), ], ), ], ), RoundedButtonBorder( - title: controller.driverUser.value?.averageRating.toString() ?? '', + title: + controller + .driverUser + .value + ?.averageRating + .toString() ?? + '', width: 20, height: 3.5, radius: 10, isRight: false, isCenter: true, - textColor: AppThemeData.warning400, - borderColor: AppThemeData.warning400, + textColor: + AppThemeData.warning400, + borderColor: + AppThemeData.warning400, color: AppThemeData.warning50, - icon: SvgPicture.asset("assets/icons/ic_start.svg"), + icon: SvgPicture.asset( + "assets/icons/ic_start.svg", + ), onPress: () {}, ), ], ), Visibility( - visible: controller.order.value.status == Constant.orderCompleted ? true : false, + visible: + controller + .order + .value + .status == + Constant + .orderCompleted + ? true + : false, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: RoundedButtonFill( - title: controller.ratingModel.value.id != null && controller.ratingModel.value.id!.isNotEmpty ? 'Update Review'.tr() : 'Add Review'.tr(), + title: + controller + .ratingModel + .value + .id != + null && + controller + .ratingModel + .value + .id! + .isNotEmpty + ? 'Update Review'.tr() + : 'Add Review'.tr(), onPress: () async { - final result = await Get.to(() => RentalReviewScreen(), arguments: {'order': controller.order.value}); + final result = await Get.to( + () => + RentalReviewScreen(), + arguments: { + 'order': + controller + .order + .value, + }, + ); // If review was submitted successfully if (result == true) { - await controller.fetchDriverDetails(); + await controller + .fetchDriverDetails(); } }, height: 5, borderRadius: 15, color: Colors.orange, - textColor: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + textColor: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, ), ), ), - controller.order.value.status == Constant.orderCompleted || controller.order.value.status == Constant.orderCancelled + controller.order.value.status == + Constant + .orderCompleted || + controller + .order + .value + .status == + Constant.orderCancelled ? SizedBox() : Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, children: [ InkWell( onTap: () { - Constant.makePhoneCall(controller.order.value.driver!.phoneNumber ?? ''); + Constant.makePhoneCall( + controller + .order + .value + .driver! + .phoneNumber ?? + '', + ); }, child: Container( width: 150, height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_phone_call.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_phone_call.svg")), ), ), const SizedBox(width: 10), InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader( + "Please wait...".tr(), + ); - UserModel? customer = await FireStoreUtils.getUserProfile(controller.order.value.authorID ?? ''); - UserModel? driverUser = await FireStoreUtils.getUserProfile(controller.order.value.driverId ?? ''); + UserModel? customer = + await FireStoreUtils.getUserProfile( + controller + .order + .value + .authorID ?? + '', + ); + UserModel? driverUser = + await FireStoreUtils.getUserProfile( + controller + .order + .value + .driverId ?? + '', + ); ShowToastDialog.closeLoader(); Get.to( const ChatScreen(), arguments: { - "customerName": customer?.fullName(), - "restaurantName": driverUser?.fullName(), - "orderId": controller.order.value.id, - "restaurantId": driverUser?.id, - "customerId": customer?.id, - "customerProfileImage": customer?.profilePictureURL, - "restaurantProfileImage": driverUser?.profilePictureURL, - "token": driverUser?.fcmToken, - "chatType": "Driver", + "customerName": + customer + ?.fullName(), + "restaurantName": + driverUser + ?.fullName(), + "orderId": + controller + .order + .value + .id, + "restaurantId": + driverUser?.id, + "customerId": + customer?.id, + "customerProfileImage": + customer + ?.profilePictureURL, + "restaurantProfileImage": + driverUser + ?.profilePictureURL, + "token": + driverUser + ?.fcmToken, + "chatType": + "Driver", }, ); }, @@ -303,11 +647,30 @@ class RentalOrderDetailsScreen extends StatelessWidget { height: 42, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200), - borderRadius: BorderRadius.circular(120), + side: BorderSide( + width: 1, + color: + isDark + ? AppThemeData + .grey700 + : AppThemeData + .grey200, + ), + borderRadius: + BorderRadius.circular( + 120, + ), + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 8.0, + ), + child: SvgPicture.asset( + "assets/icons/ic_wechat.svg", ), ), - child: Padding(padding: const EdgeInsets.all(8.0), child: SvgPicture.asset("assets/icons/ic_wechat.svg")), ), ), ], @@ -318,37 +681,96 @@ class RentalOrderDetailsScreen extends StatelessWidget { const SizedBox(height: 15), ], ), - if (controller.order.value.rentalVehicleType != null) + if (controller.order.value.rentalVehicleType != + null) Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Vehicle Type".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Vehicle Type".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), SizedBox(height: 10), Row( children: [ ClipRRect( - borderRadius: BorderRadius.circular(10), - child: NetworkImageWidget(imageUrl: controller.order.value.rentalVehicleType!.rentalVehicleIcon ?? "", height: 50, width: 50), + borderRadius: + BorderRadius.circular(10), + child: NetworkImageWidget( + imageUrl: + controller + .order + .value + .rentalVehicleType! + .rentalVehicleIcon ?? + "", + height: 50, + width: 50, + ), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( - controller.order.value.rentalVehicleType!.name ?? "", - style: AppThemeData.semiBoldTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + controller + .order + .value + .rentalVehicleType! + .name ?? + "", + style: + AppThemeData.semiBoldTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), Text( - controller.order.value.rentalVehicleType!.shortDescription ?? "", - style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark600 : AppThemeData.grey600), + controller + .order + .value + .rentalVehicleType! + .shortDescription ?? + "", + style: + AppThemeData.mediumTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData + .greyDark600 + : AppThemeData + .grey600, + ), ), ], ), @@ -365,107 +787,249 @@ class RentalOrderDetailsScreen extends StatelessWidget { width: Responsive.width(100, context), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Rental Details".tr(), style: AppThemeData.boldTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), - Divider(color: isDark ? AppThemeData.greyDark300 : AppThemeData.grey300), + Text( + "Rental Details".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), + Divider( + color: + isDark + ? AppThemeData.greyDark300 + : AppThemeData.grey300, + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Rental Package'.tr(), textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - controller.order.value.rentalPackageModel!.name.toString().tr(), + controller + .order + .value + .rentalPackageModel! + .name + .toString() + .tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Rental Package Price'.tr(), textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - Constant.amountShow(amount: controller.order.value.rentalPackageModel!.baseFare.toString()).tr(), + Constant.amountShow( + amount: + controller + .order + .value + .rentalPackageModel! + .baseFare + .toString(), + ).tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( '${'Including'.tr()} ${Constant.distanceType.tr()}', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - "${controller.order.value.rentalPackageModel!.includedDistance.toString()} ${Constant.distanceType}".tr(), + "${controller.order.value.rentalPackageModel!.includedDistance.toString()} ${Constant.distanceType}" + .tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Including Hours'.tr(), textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( - "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr()}".tr(), + "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr()}" + .tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), ), Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( '${'Extra'.tr()} ${Constant.distanceType}', textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( controller.getExtraKm(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -493,20 +1057,41 @@ class RentalOrderDetailsScreen extends StatelessWidget { controller.order.value.endTime == null ? SizedBox() : Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: + const EdgeInsets.symmetric( + vertical: 10, + ), child: Row( children: [ Expanded( child: Text( 'Extra Minutes'.tr(), - textAlign: TextAlign.start, - style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + textAlign: + TextAlign.start, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ), Text( "${controller.order.value.endTime == null ? "0" : (((controller.order.value.endTime!.toDate().difference(controller.order.value.startTime!.toDate()).inMinutes) - (int.parse(controller.order.value.rentalPackageModel!.includedHours.toString()) * 60)).clamp(0, double.infinity).toInt().toString())} ${'Min'.tr()}", textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + style: + AppThemeData.boldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData + .greyDark900 + : AppThemeData + .grey900, + ), ), ], ), @@ -520,31 +1105,99 @@ class RentalOrderDetailsScreen extends StatelessWidget { padding: const EdgeInsets.all(16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - Text("Order Summary".tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: AppThemeData.grey500)), + Text( + "Order Summary".tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: AppThemeData.grey500, + ), + ), const SizedBox(height: 8), - _summaryTile("Subtotal".tr(), Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, null), - _summaryTile("Discount".tr(), Constant.amountShow(amount: controller.discount.value.toString()), isDark, AppThemeData.dangerDark300), + _summaryTile( + "Subtotal".tr(), + Constant.amountShow( + amount: + controller.subTotal.value + .toString(), + ), + isDark, + null, + ), + _summaryTile( + "Discount".tr(), + Constant.amountShow( + amount: + controller.discount.value + .toString(), + ), + isDark, + AppThemeData.dangerDark300, + ), - ...List.generate(controller.order.value.taxSetting?.length ?? 0, (index) { - final taxModel = controller.order.value.taxSetting![index]; - final taxTitle = "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; - return _summaryTile( - taxTitle, - Constant.amountShow(amount: Constant.getTaxValue(amount: (controller.subTotal.value - controller.discount.value).toString(), taxModel: taxModel).toString()), - isDark, - null, - ); - }), + ...List.generate( + controller + .order + .value + .taxSetting + ?.length ?? + 0, + (index) { + final taxModel = + controller + .order + .value + .taxSetting![index]; + final taxTitle = + "${taxModel.title} ${taxModel.type == 'fix' ? '(${Constant.amountShow(amount: taxModel.tax)})' : '(${taxModel.tax}%)'}"; + return _summaryTile( + taxTitle, + Constant.amountShow( + amount: + Constant.getTaxValue( + amount: + (controller + .subTotal + .value - + controller + .discount + .value) + .toString(), + taxModel: taxModel, + ).toString(), + ), + isDark, + null, + ); + }, + ), const Divider(), - _summaryTile("Order Total".tr(), Constant.amountShow(amount: controller.totalAmount.value.toString()), isDark, null), + _summaryTile( + "Order Total".tr(), + Constant.amountShow( + amount: + controller.totalAmount.value + .toString(), + ), + isDark, + null, + ), ], ), ), @@ -554,32 +1207,66 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), child: Row( children: [ - if (controller.order.value.status == Constant.orderInTransit && controller.order.value.paymentStatus == false) + if (controller.order.value.status == + Constant.orderInTransit && + controller.order.value.paymentStatus == false) Expanded( child: RoundedButtonFill( title: "Pay Now", onPress: () { - if (controller.order.value.endKitoMetersReading == null || - controller.order.value.endKitoMetersReading == "0.0" || - controller.order.value.endKitoMetersReading!.isEmpty) { - ShowToastDialog.showToast("You are not able to pay now until driver adds kilometer".tr()); + if (controller + .order + .value + .endKitoMetersReading == + null || + controller + .order + .value + .endKitoMetersReading == + "0.0" || + controller + .order + .value + .endKitoMetersReading! + .isEmpty) { + ShowToastDialog.showToast( + "You are not able to pay now until driver adds kilometer" + .tr(), + ); } else { - Get.bottomSheet(paymentBottomSheet(context, controller, isDark, controller.order.value), isScrollControlled: true, backgroundColor: Colors.transparent); + Get.bottomSheet( + paymentBottomSheet( + context, + controller, + isDark, + controller.order.value, + ), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); } }, color: AppThemeData.primary300, textColor: AppThemeData.grey900, ), ), - if (controller.order.value.status == Constant.orderPlaced || controller.order.value.status == Constant.driverAccepted) + if (controller.order.value.status == + Constant.orderPlaced || + controller.order.value.status == + Constant.driverAccepted) Expanded( child: RoundedButtonFill( title: "Cancel Booking", onPress: () { - controller.cancelRentalRequest(controller.order.value); + controller.cancelRentalRequest( + controller.order.value, + ); }, color: AppThemeData.danger300, textColor: AppThemeData.surface, @@ -601,14 +1288,33 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(title, style: AppThemeData.mediumTextStyle(fontSize: 16, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), - Text(value, style: AppThemeData.semiBoldTextStyle(fontSize: title == "Order Total" ? 18 : 16, color: colors ?? (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900))), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), + Text( + value, + style: AppThemeData.semiBoldTextStyle( + fontSize: title == "Order Total" ? 18 : 16, + color: + colors ?? + (isDark ? AppThemeData.greyDark900 : AppThemeData.grey900), + ), + ), ], ), ); } - Widget paymentBottomSheet(BuildContext context, RentalOrderDetailsController controller, bool isDark, RentalOrderModel orderModel) { + Widget paymentBottomSheet( + BuildContext context, + RentalOrderDetailsController controller, + bool isDark, + RentalOrderModel orderModel, + ) { return DraggableScrollableSheet( initialChildSize: 0.70, // Start height @@ -621,14 +1327,26 @@ class RentalOrderDetailsScreen extends StatelessWidget { builder: (context, scrollController) { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), - decoration: BoxDecoration(color: isDark ? AppThemeData.grey500 : Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(24))), + decoration: BoxDecoration( + color: isDark ? AppThemeData.grey500 : Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Select Payment Method".tr(), style: AppThemeData.mediumTextStyle(fontSize: 18, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + "Select Payment Method".tr(), + style: AppThemeData.mediumTextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + ), + ), GestureDetector( onTap: () { Get.back(); @@ -643,32 +1361,74 @@ class RentalOrderDetailsScreen extends StatelessWidget { padding: EdgeInsets.zero, controller: scrollController, children: [ - Text("Preferred Payment".tr(), textAlign: TextAlign.start, style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500)), + Text( + "Preferred Payment".tr(), + textAlign: TextAlign.start, + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), + ), const SizedBox(height: 10), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -676,7 +1436,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { Text( "Other Payment Options".tr(), textAlign: TextAlign.start, - style: AppThemeData.boldTextStyle(fontSize: 15, color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500), + style: AppThemeData.boldTextStyle( + fontSize: 15, + color: + isDark + ? AppThemeData.greyDark500 + : AppThemeData.grey500, + ), ), const SizedBox(height: 10), ], @@ -684,32 +1450,129 @@ class RentalOrderDetailsScreen extends StatelessWidget { Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - border: Border.all(color: isDark ? AppThemeData.greyDark200 : AppThemeData.grey200), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + border: Border.all( + color: + isDark + ? AppThemeData.greyDark200 + : AppThemeData.grey200, + ), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - Visibility(visible: controller.stripeModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png")), - Visibility(visible: controller.payPalModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png")), - Visibility(visible: controller.payStackModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png")), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.stripeModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.payPalModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), - Visibility(visible: controller.payFastModel.value.isEnable == true, child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png")), - Visibility(visible: controller.razorPayModel.value.isEnabled == true, child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png")), - Visibility(visible: controller.midTransModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png")), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.payStackModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), + ), + Visibility( + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), + ), + Visibility( + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), + ), + Visibility( + visible: + controller.payFastModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), + ), + Visibility( + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), + ), + Visibility( + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), + ), + Visibility( + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), + ), + Visibility( + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), - Visibility(visible: controller.xenditModel.value.enable == true, child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png")), ], ), ), @@ -724,48 +1587,107 @@ class RentalOrderDetailsScreen extends StatelessWidget { textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { - ShowToastDialog.showToast("Please select a payment method".tr()); + ShowToastDialog.showToast( + "Please select a payment method".tr(), + ); } else { - if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { - controller.stripeMakePayment(amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.paypal.name) { - controller.paypalPaymentSheet(controller.totalAmount.value.toString(), context); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payStack.name) { - controller.payStackPayment(controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.mercadoPago.name) { - controller.mercadoPagoMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.flutterWave.name) { - controller.flutterWaveInitiatePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.payFast.name) { - controller.payFastPayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + if (controller.selectedPaymentMethod.value == + PaymentGateway.stripe.name) { + controller.stripeMakePayment( + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.paypal.name) { + controller.paypalPaymentSheet( + controller.totalAmount.value.toString(), + context, + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payStack.name) { + controller.payStackPayment( + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.mercadoPago.name) { + controller.mercadoPagoMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.flutterWave.name) { + controller.flutterWaveInitiatePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.payFast.name) { + controller.payFastPayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.wallet.name) { - if (Constant.userModel!.walletAmount == null || Constant.userModel!.walletAmount! < controller.totalAmount.value) { - ShowToastDialog.showToast("You do not have sufficient wallet balance".tr()); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.wallet.name) { + if (Constant.userModel!.walletAmount == null || + Constant.userModel!.walletAmount! < + controller.totalAmount.value) { + ShowToastDialog.showToast( + "You do not have sufficient wallet balance".tr(), + ); } else { controller.completeOrder(); } - } else if (controller.selectedPaymentMethod.value == PaymentGateway.cod.name) { + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.cod.name) { controller.completeOrder(); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.midTrans.name) { - controller.midtransMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.orangeMoney.name) { - controller.orangeMakePayment(context: context, amount: controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.xendit.name) { - controller.xenditPayment(context, controller.totalAmount.value.toString()); - } else if (controller.selectedPaymentMethod.value == PaymentGateway.razorpay.name) { - RazorPayController().createOrderRazorPay(amount: double.parse(controller.totalAmount.value.toString()), razorpayModel: controller.razorPayModel.value).then((value) { - if (value == null) { - Get.back(); - ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); - } else { - CreateRazorPayOrderModel result = value; - controller.openCheckout(amount: controller.totalAmount.value.toString(), orderId: result.id); - } - }); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.midTrans.name) { + controller.midtransMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.orangeMoney.name) { + controller.orangeMakePayment( + context: context, + amount: controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.xendit.name) { + controller.xenditPayment( + context, + controller.totalAmount.value.toString(), + ); + } else if (controller.selectedPaymentMethod.value == + PaymentGateway.razorpay.name) { + RazorPayController() + .createOrderRazorPay( + amount: double.parse( + controller.totalAmount.value.toString(), + ), + razorpayModel: controller.razorPayModel.value, + ) + .then((value) { + if (value == null) { + Get.back(); + ShowToastDialog.showToast( + "Something went wrong, please contact admin." + .tr(), + ); + } else { + CreateRazorPayOrderModel result = value; + controller.openCheckout( + amount: controller.totalAmount.value.toString(), + orderId: result.id, + ); + } + }); } else { - ShowToastDialog.showToast("Please select payment method".tr()); + ShowToastDialog.showToast( + "Please select payment method".tr(), + ); } } }, @@ -777,7 +1699,12 @@ class RentalOrderDetailsScreen extends StatelessWidget { ); } - Obx cardDecoration(RentalOrderDetailsController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + RentalOrderDetailsController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -792,8 +1719,21 @@ class RentalOrderDetailsScreen extends StatelessWidget { Container( width: 50, height: 50, - decoration: ShapeDecoration(shape: RoundedRectangleBorder(side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), borderRadius: BorderRadius.circular(8))), - child: Padding(padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), child: Image.asset(image)), + decoration: ShapeDecoration( + shape: RoundedRectangleBorder( + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, + ), + child: Image.asset(image), + ), ), const SizedBox(width: 10), value.name == "wallet" @@ -804,12 +1744,30 @@ class RentalOrderDetailsScreen extends StatelessWidget { Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), Text( - Constant.amountShow(amount: Constant.userModel!.walletAmount == null ? '0.0' : Constant.userModel!.walletAmount.toString()), + Constant.amountShow( + amount: + Constant.userModel!.walletAmount == null + ? '0.0' + : Constant.userModel!.walletAmount + .toString(), + ), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 14, color: isDark ? AppThemeData.primary300 : AppThemeData.primary300), + style: AppThemeData.semiBoldTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), ), ], ), @@ -818,14 +1776,23 @@ class RentalOrderDetailsScreen extends StatelessWidget { child: Text( value.name.capitalizeString(), textAlign: TextAlign.start, - style: AppThemeData.semiBoldTextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900), + style: AppThemeData.semiBoldTextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + ), ), ), const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, diff --git a/lib/screen_ui/rental_service/rental_review_screen.dart b/lib/screen_ui/rental_service/rental_review_screen.dart index 486ea7a..d5fd8fb 100644 --- a/lib/screen_ui/rental_service/rental_review_screen.dart +++ b/lib/screen_ui/rental_service/rental_review_screen.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/constant.dart'; import '../../controllers/rental_review_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -28,11 +28,19 @@ class RentalReviewScreen extends StatelessWidget { backgroundColor: AppThemeData.primary300, leading: GestureDetector( onTap: () => Get.back(), - child: Icon(Icons.arrow_back_ios, color: isDark ? Colors.white : Colors.black), + child: Icon( + Icons.arrow_back_ios, + color: isDark ? Colors.white : Colors.black, + ), ), title: Text( - controller.ratingModel.value != null ? "Update Review".tr() : "Add Review".tr(), - style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16), + controller.ratingModel.value != null + ? "Update Review".tr() + : "Add Review".tr(), + style: TextStyle( + color: isDark ? Colors.white : Colors.black, + fontSize: 16, + ), ), ), body: Obx( @@ -44,11 +52,21 @@ class RentalReviewScreen extends StatelessWidget { child: Stack( children: [ Padding( - padding: const EdgeInsets.only(left: 20, right: 20, top: 50, bottom: 20), + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 50, + bottom: 20, + ), child: Card( elevation: 2, - color: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: + isDark + ? AppThemeData.greyDark50 + : AppThemeData.grey50, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(top: 65), @@ -56,11 +74,18 @@ class RentalReviewScreen extends StatelessWidget { children: [ // Driver Name Padding( - padding: const EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.only( + top: 8.0, + ), child: Text( - controller.order.value!.driver?.fullName() ?? "", + controller.order.value!.driver + ?.fullName() ?? + "", style: TextStyle( - color: isDark ? Colors.white : Colors.black87, + color: + isDark + ? Colors.white + : Colors.black87, fontFamily: AppThemeData.medium, fontSize: 18, ), @@ -68,12 +93,21 @@ class RentalReviewScreen extends StatelessWidget { ), // Car info Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ Text( - controller.driverUser.value?.carNumber?.toUpperCase() ?? '', + controller + .driverUser + .value + ?.carNumber + ?.toUpperCase() ?? + '', style: TextStyle( - color: isDark ? Colors.white : Colors.black87, + color: + isDark + ? Colors.white + : Colors.black87, fontFamily: AppThemeData.medium, ), ), @@ -81,14 +115,22 @@ class RentalReviewScreen extends StatelessWidget { Text( "${controller.driverUser.value?.carName} ${controller.driverUser.value?.carMakes}", style: TextStyle( - color: isDark ? Colors.white : Colors.black38, + color: + isDark + ? Colors.white + : Colors.black38, fontFamily: AppThemeData.medium, ), ), ], ), - const Padding(padding: EdgeInsets.symmetric(vertical: 12), child: Divider(color: Colors.grey)), + const Padding( + padding: EdgeInsets.symmetric( + vertical: 12, + ), + child: Divider(color: Colors.grey), + ), // Title Padding( @@ -97,7 +139,10 @@ class RentalReviewScreen extends StatelessWidget { 'How is your trip?'.tr(), style: TextStyle( fontSize: 18, - color: isDark ? Colors.white : Colors.black, + color: + isDark + ? Colors.white + : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2, ), @@ -106,10 +151,16 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - 'Your feedback will help us improve \n driving experience better'.tr(), + 'Your feedback will help us improve \n driving experience better' + .tr(), textAlign: TextAlign.center, style: TextStyle( - color: isDark ? Colors.white : Colors.black.withOpacity(0.60), + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), letterSpacing: 0.8, ), ), @@ -122,7 +173,12 @@ class RentalReviewScreen extends StatelessWidget { 'Rate for'.tr(), style: TextStyle( fontSize: 16, - color: isDark ? Colors.white : Colors.black.withOpacity(0.60), + color: + isDark + ? Colors.white + : Colors.black.withOpacity( + 0.60, + ), letterSpacing: 0.8, ), ), @@ -130,10 +186,15 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - controller.order.value!.driver?.fullName() ?? "", + controller.order.value!.driver + ?.fullName() ?? + "", style: TextStyle( fontSize: 18, - color: isDark ? Colors.white : Colors.black, + color: + isDark + ? Colors.white + : Colors.black, fontWeight: FontWeight.bold, letterSpacing: 2, ), @@ -142,14 +203,25 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 10), child: RatingBar.builder( - initialRating: controller.ratings.value, + initialRating: + controller.ratings.value, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, - itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), - unratedColor: isDark ? AppThemeData.greyDark400 : AppThemeData.grey400, - onRatingUpdate: (rating) => controller.ratings.value = rating, + itemBuilder: + (context, _) => const Icon( + Icons.star, + color: Colors.amber, + ), + unratedColor: + isDark + ? AppThemeData.greyDark400 + : AppThemeData.grey400, + onRatingUpdate: + (rating) => + controller.ratings.value = + rating, ), ), @@ -167,9 +239,16 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: controller.ratingModel.value != null ? "Update Review" : "Add Review", + title: + controller.ratingModel.value != + null + ? "Update Review" + : "Add Review", color: AppThemeData.primary300, - textColor: isDark ? Colors.white : Colors.black, + textColor: + isDark + ? Colors.white + : Colors.black, onPress: controller.submitReview, ), ), @@ -185,12 +264,24 @@ class RentalReviewScreen extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(60), color: Colors.white, - boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.15), blurRadius: 8, spreadRadius: 6)], + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.15), + blurRadius: 8, + spreadRadius: 6, + ), + ], ), child: ClipRRect( borderRadius: BorderRadius.circular(60), child: NetworkImageWidget( - imageUrl: controller.order.value?.driver?.profilePictureURL ?? '', + imageUrl: + controller + .order + .value + ?.driver + ?.profilePictureURL ?? + '', fit: BoxFit.cover, height: 110, width: 110, diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index c9528bb..5de8a4d 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -2,7 +2,7 @@ import 'dart:developer'; import 'package:customer/models/section_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../controllers/service_list_controller.dart'; import '../../themes/app_them_data.dart'; import '../../utils/network_image_widget.dart'; @@ -66,7 +66,7 @@ class ServiceListScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(horizontal: 16.r), child: Text( - "Другие услуги", + "Other Services", style: TextStyle( fontFamily: AppThemeData.bold, fontWeight: FontWeight.w700, @@ -75,7 +75,6 @@ class ServiceListScreen extends StatelessWidget { ), ), ), - SizedBox(height: 10.h), // Other Services Section @@ -99,7 +98,6 @@ class ServiceListScreen extends StatelessWidget { title: "Продукты питания", subtitle: "Более 1000 товаров", ), - SizedBox(height: 45.h), ], ), @@ -209,7 +207,7 @@ class ServiceListScreen extends StatelessWidget { spacing: 12.r, children: [ _mainCardsMaker( - title: "Еда и доставка", + title: "Food Delivery", image: "assets/images/food_img.png", // onTap: () { // log("Main Card Tapped"); @@ -227,7 +225,7 @@ class ServiceListScreen extends StatelessWidget { // }, ), _mainCardsMaker( - title: "Курьерская доставка", + title: "Delivery", image: "assets/images/delivery_img.png", onTap: () { log("Main Card Tapped"); @@ -276,7 +274,7 @@ class ServiceListScreen extends StatelessWidget { Expanded( child: Text( maxLines: 2, - "Позвать такси", + "Booking Taxi", style: TextStyle( overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.bold, diff --git a/lib/screen_ui/splash_screen/splash_screen.dart b/lib/screen_ui/splash_screen/splash_screen.dart index 652d0e0..64ef3b4 100644 --- a/lib/screen_ui/splash_screen/splash_screen.dart +++ b/lib/screen_ui/splash_screen/splash_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../../constant/assets.dart'; import '../../controllers/splash_controller.dart'; import '../../themes/app_them_data.dart'; @@ -12,7 +12,12 @@ class SplashScreen extends StatelessWidget { return GetBuilder( init: SplashController(), builder: (controller) { - return Scaffold(backgroundColor: AppThemeData.surface, body: Center(child: Image.asset(AppAssets.icAppLogo, width: 120, height: 120))); + return Scaffold( + backgroundColor: AppThemeData.mainColor, + body: Center( + child: Image.asset("assets/images/fondex_logo_main.png", width: 120, height: 120), + ), + ); }, ); } diff --git a/lib/service/cart_provider.dart b/lib/service/cart_provider.dart index 4868e0a..bc2ccdb 100644 --- a/lib/service/cart_provider.dart +++ b/lib/service/cart_provider.dart @@ -5,12 +5,12 @@ import 'package:customer/models/cart_product_model.dart'; import 'package:customer/themes/custom_dialog_box.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - +import 'package:get/get.dart' hide Trans; import 'database_helper.dart'; class CartProvider with ChangeNotifier { - final _cartStreamController = StreamController>.broadcast(); + final _cartStreamController = + StreamController>.broadcast(); List _cartItems = []; Stream> get cartStream => _cartStreamController.stream; @@ -24,7 +24,11 @@ class CartProvider with ChangeNotifier { _cartStreamController.sink.add(_cartItems); } - Future addToCart(BuildContext context, CartProductModel product, int quantity) async { + Future addToCart( + BuildContext context, + CartProductModel product, + int quantity, + ) async { _cartItems = await DatabaseHelper.instance.fetchCartProducts(); if ((_cartItems.where((item) => item.id == product.id)).isNotEmpty) { var index = _cartItems.indexWhere((item) => item.id == product.id); @@ -38,7 +42,10 @@ class CartProvider with ChangeNotifier { } await DatabaseHelper.instance.updateCartProduct(_cartItems[index]); } else { - if (_cartItems.isEmpty || _cartItems.where((item) => item.vendorID == product.vendorID).isNotEmpty) { + if (_cartItems.isEmpty || + _cartItems + .where((item) => item.vendorID == product.vendorID) + .isNotEmpty) { product.quantity = quantity; _cartItems.add(product); cartItem.add(product); @@ -50,7 +57,9 @@ class CartProvider with ChangeNotifier { builder: (BuildContext context) { return CustomDialogBox( title: "Alert".tr(), - descriptions: "Your cart already contains items from another restaurant. Would you like to replace them with items from this restaurant instead?".tr(), + descriptions: + "Your cart already contains items from another restaurant. Would you like to replace them with items from this restaurant instead?" + .tr(), positiveString: "Add".tr(), negativeString: "Cancel".tr(), positiveClick: () async { diff --git a/lib/service/fire_store_utils.dart b/lib/service/fire_store_utils.dart index ad3e445..d5d0d23 100644 --- a/lib/service/fire_store_utils.dart +++ b/lib/service/fire_store_utils.dart @@ -14,7 +14,7 @@ import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/cupertino.dart'; import 'package:geocoding/geocoding.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:intl/intl.dart'; import 'package:uuid/uuid.dart'; import 'package:video_compress/video_compress.dart'; @@ -85,7 +85,7 @@ class FireStoreUtils { static String getCurrentUid() { final user = auth.FirebaseAuth.instance.currentUser; - if(user != null){ + if (user != null) { return user.uid; } return "hello"; diff --git a/lib/service/localization_service.dart b/lib/service/localization_service.dart index b3040e7..92cfb47 100644 --- a/lib/service/localization_service.dart +++ b/lib/service/localization_service.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../lang/app_en.dart'; class LocalizationService extends Translations { diff --git a/lib/themes/custom_dialog_box.dart b/lib/themes/custom_dialog_box.dart index e2ff4d6..9b3d6da 100644 --- a/lib/themes/custom_dialog_box.dart +++ b/lib/themes/custom_dialog_box.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../controllers/theme_controller.dart'; import 'app_them_data.dart'; @@ -29,23 +29,46 @@ class CustomDialogBox extends StatelessWidget { return Obx(() { final isDark = themeController.isDark.value; - return Dialog(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), elevation: 0, backgroundColor: Colors.transparent, child: contentBox(context, isDark)); + return Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + elevation: 0, + backgroundColor: Colors.transparent, + child: contentBox(context, isDark), + ); }); } Widget contentBox(BuildContext context, bool isDark) { return Container( padding: const EdgeInsets.all(20), - decoration: BoxDecoration(shape: BoxShape.rectangle, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, borderRadius: BorderRadius.circular(20)), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, + borderRadius: BorderRadius.circular(20), + ), child: Column( mainAxisSize: MainAxisSize.min, children: [ img ?? const SizedBox(), const SizedBox(height: 20), - if (title.isNotEmpty) Text(title.tr(), style: AppThemeData.boldTextStyle(fontSize: 20, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + if (title.isNotEmpty) + Text( + title.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 20, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), const SizedBox(height: 5), if (descriptions.isNotEmpty) - Text(descriptions.tr(), textAlign: TextAlign.center, style: AppThemeData.regularTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900)), + Text( + descriptions.tr(), + textAlign: TextAlign.center, + style: AppThemeData.regularTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, + ), + ), const SizedBox(height: 20), Row( children: [ @@ -55,9 +78,25 @@ class CustomDialogBox extends StatelessWidget { child: Container( width: Responsive.width(100, context), height: Responsive.height(5, context), - decoration: BoxDecoration(color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, borderRadius: BorderRadius.circular(200)), + decoration: BoxDecoration( + color: + isDark + ? AppThemeData.greyDark900 + : AppThemeData.grey900, + borderRadius: BorderRadius.circular(200), + ), child: Center( - child: Text(negativeString.tr(), textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark100 : AppThemeData.grey100)), + child: Text( + negativeString.tr(), + textAlign: TextAlign.center, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: + isDark + ? AppThemeData.greyDark100 + : AppThemeData.grey100, + ), + ), ), ), ), @@ -69,8 +108,20 @@ class CustomDialogBox extends StatelessWidget { child: Container( width: Responsive.width(100, context), height: Responsive.height(5, context), - decoration: BoxDecoration(color: AppThemeData.success300, borderRadius: BorderRadius.circular(200)), - child: Center(child: Text('Confirm'.tr(), textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle(fontSize: 14, color: AppThemeData.grey100))), + decoration: BoxDecoration( + color: AppThemeData.success300, + borderRadius: BorderRadius.circular(200), + ), + child: Center( + child: Text( + 'Confirm'.tr(), + textAlign: TextAlign.center, + style: AppThemeData.mediumTextStyle( + fontSize: 14, + color: AppThemeData.grey100, + ), + ), + ), ), ), ), diff --git a/lib/themes/easy_loading_config.dart b/lib/themes/easy_loading_config.dart index a48db16..6735481 100644 --- a/lib/themes/easy_loading_config.dart +++ b/lib/themes/easy_loading_config.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../controllers/theme_controller.dart'; Future configEasyLoading() async { diff --git a/lib/themes/round_button_border.dart b/lib/themes/round_button_border.dart index a46e769..3b1eb2c 100644 --- a/lib/themes/round_button_border.dart +++ b/lib/themes/round_button_border.dart @@ -2,7 +2,7 @@ import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'app_them_data.dart'; class RoundedButtonBorder extends StatelessWidget { @@ -49,26 +49,51 @@ class RoundedButtonBorder extends StatelessWidget { height: Responsive.height(height ?? 6, context), decoration: ShapeDecoration( color: color ?? Colors.transparent, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(radius ?? 50), side: BorderSide(color: borderColor ?? AppThemeData.danger300)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(radius ?? 50), + side: BorderSide(color: borderColor ?? AppThemeData.danger300), + ), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - if (isRight == false) Padding(padding: const EdgeInsets.only(right: 10, left: 0), child: icon), + if (isRight == false) + Padding( + padding: const EdgeInsets.only(right: 10, left: 0), + child: icon, + ), isCenter == true - ? Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 14, color: textColor ?? AppThemeData.grey800)) + ? Text( + title.tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 14, + color: textColor ?? AppThemeData.grey800, + ), + ) : Expanded( child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), child: Text( title.tr(), textAlign: TextAlign.center, - style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 14, color: textColor ?? (isDark ? AppThemeData.grey100 : AppThemeData.grey700)), + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 14, + color: + textColor ?? + (isDark + ? AppThemeData.grey100 + : AppThemeData.grey700), + ), ), ), ), - if (isRight == true) Padding(padding: const EdgeInsets.only(left: 10, right: 20), child: icon), + if (isRight == true) + Padding( + padding: const EdgeInsets.only(left: 10, right: 20), + child: icon, + ), ], ), ), diff --git a/lib/themes/round_button_fill.dart b/lib/themes/round_button_fill.dart index 8f61cbe..4b50524 100644 --- a/lib/themes/round_button_fill.dart +++ b/lib/themes/round_button_fill.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/responsive.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'app_them_data.dart'; class RoundedButtonFill extends StatelessWidget { @@ -45,21 +45,48 @@ class RoundedButtonFill extends StatelessWidget { child: Container( width: Responsive.width(width ?? 100, context), height: Responsive.height(height ?? 6, context), - decoration: ShapeDecoration(color: color, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius ?? 50))), + decoration: ShapeDecoration( + color: color, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(borderRadius ?? 50), + ), + ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - if (isRight == false) Padding(padding: const EdgeInsets.only(right: 10, left: 10), child: icon), + if (isRight == false) + Padding( + padding: const EdgeInsets.only(right: 10, left: 10), + child: icon, + ), isCenter == true - ? Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)) + ? Text( + title.tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 16, + color: textColor ?? AppThemeData.grey50, + ), + ) : Expanded( child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), - child: Text(title.tr(), textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle(fontSize: fontSizes ?? 16, color: textColor ?? AppThemeData.grey50)), + child: Text( + title.tr(), + textAlign: TextAlign.center, + style: AppThemeData.semiBoldTextStyle( + fontSize: fontSizes ?? 16, + color: textColor ?? AppThemeData.grey50, + ), + ), ), ), - if (isRight == true) Padding(padding: const EdgeInsets.only(left: 10, right: 10), child: icon), + if (isRight == true) + Padding( + padding: const EdgeInsets.only(left: 10, right: 10), + child: icon, + ), ], ), ), diff --git a/lib/themes/text_field_widget.dart b/lib/themes/text_field_widget.dart index 7e87544..44c3e57 100644 --- a/lib/themes/text_field_widget.dart +++ b/lib/themes/text_field_widget.dart @@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../controllers/theme_controller.dart'; import 'app_them_data.dart'; @@ -77,20 +77,39 @@ class _TextFieldWidgetState extends State { final themeController = Get.find(); final isDark = themeController.isDark.value; - final borderColor = widget.borderColor ?? (_focusNode.hasFocus ? (isDark ? AppThemeData.greyDark400 : AppThemeData.grey400) : (isDark ? AppThemeData.greyDark200 : AppThemeData.grey200)); + final borderColor = + widget.borderColor ?? + (_focusNode.hasFocus + ? (isDark ? AppThemeData.greyDark400 : AppThemeData.grey400) + : (isDark ? AppThemeData.greyDark200 : AppThemeData.grey200)); final fillColor = - widget.backgroundColor ?? (isDark ? (_focusNode.hasFocus ? AppThemeData.greyDark50 : AppThemeData.greyDark100) : (_focusNode.hasFocus ? AppThemeData.grey100 : Colors.transparent)); + widget.backgroundColor ?? + (isDark + ? (_focusNode.hasFocus + ? AppThemeData.greyDark50 + : AppThemeData.greyDark100) + : (_focusNode.hasFocus + ? AppThemeData.grey100 + : Colors.transparent)); final textColor = isDark ? AppThemeData.greyDark900 : AppThemeData.grey900; - final hintColor = widget.hintColor ?? (isDark ? AppThemeData.grey400 : AppThemeData.greyDark400); + final hintColor = + widget.hintColor ?? + (isDark ? AppThemeData.grey400 : AppThemeData.greyDark400); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.title != null) ...[ - Text(widget.title!.tr(), style: AppThemeData.boldTextStyle(fontSize: 14, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800)), + Text( + widget.title!.tr(), + style: AppThemeData.boldTextStyle( + fontSize: 14, + color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, + ), + ), const SizedBox(height: 5), ], TextFormField( @@ -112,18 +131,46 @@ class _TextFieldWidgetState extends State { filled: true, enabled: widget.enable ?? true, fillColor: fillColor, - contentPadding: EdgeInsets.symmetric(vertical: widget.title == null ? 15 : (widget.enable == false ? 13 : 8), horizontal: 10), + contentPadding: EdgeInsets.symmetric( + vertical: + widget.title == null ? 15 : (widget.enable == false ? 13 : 8), + horizontal: 10, + ), prefixIcon: widget.prefix, suffixIcon: widget.suffix, - prefixIconConstraints: const BoxConstraints(minHeight: 20, minWidth: 20), - suffixIconConstraints: const BoxConstraints(minHeight: 20, minWidth: 20), - border: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), - focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor, width: 1.2)), - errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: const BorderSide(color: Colors.red)), - disabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor)), + prefixIconConstraints: const BoxConstraints( + minHeight: 20, + minWidth: 20, + ), + suffixIconConstraints: const BoxConstraints( + minHeight: 20, + minWidth: 20, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor, width: 1.2), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: const BorderSide(color: Colors.red), + ), + disabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor), + ), hintText: widget.hintText.tr(), - hintStyle: AppThemeData.regularTextStyle(fontSize: 14.sp, color: hintColor), + hintStyle: AppThemeData.regularTextStyle( + fontSize: 14.sp, + color: hintColor, + ), ), ), ], diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index a7c6398..8b44e86 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get_utils/src/extensions/internacionalization.dart'; + import 'package:map_launcher/map_launcher.dart'; import '../themes/show_toast_dialog.dart'; import 'package:geocoding/geocoding.dart'; diff --git a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart index 844cd6d..576c3e6 100644 --- a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart +++ b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart @@ -1,7 +1,7 @@ // Flutter Packages import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; /// A [Widget] to show when there is no data to display. class EmptyScreen extends StatelessWidget { @@ -10,8 +10,6 @@ class EmptyScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return Center( - child: Text('Nothing found here...'.tr()), - ); + return Center(child: Text('Nothing found here...'.tr())); } } diff --git a/lib/widget/osm_map/map_controller.dart b/lib/widget/osm_map/map_controller.dart index 182b786..d08d846 100644 --- a/lib/widget/osm_map/map_controller.dart +++ b/lib/widget/osm_map/map_controller.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:customer/widget/osm_map/place_model.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:http/http.dart' as http; import '../../utils/utils.dart'; import 'package:latlong2/latlong.dart'; @@ -20,11 +20,15 @@ class OSMMapController extends GetxController { } final url = Uri.parse( - 'https://nominatim.openstreetmap.org/search?q=$query&format=json&addressdetails=1&limit=10'); + 'https://nominatim.openstreetmap.org/search?q=$query&format=json&addressdetails=1&limit=10', + ); - final response = await http.get(url, headers: { - 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', - }); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { final data = json.decode(response.body); @@ -52,11 +56,15 @@ class OSMMapController extends GetxController { Future _getAddressFromLatLng(LatLng coords) async { final url = Uri.parse( - 'https://nominatim.openstreetmap.org/reverse?lat=${coords.latitude}&lon=${coords.longitude}&format=json'); + 'https://nominatim.openstreetmap.org/reverse?lat=${coords.latitude}&lon=${coords.longitude}&format=json', + ); - final response = await http.get(url, headers: { - 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', - }); + final response = await http.get( + url, + headers: { + 'User-Agent': 'FlutterMapApp/1.0 (menil.siddhiinfosoft@gmail.com)', + }, + ); if (response.statusCode == 200) { final data = json.decode(response.body); @@ -79,10 +87,13 @@ class OSMMapController extends GetxController { Future getCurrentLocation() async { Position? location = await Utils.getCurrentLocation(); - LatLng latlng = - LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0); + LatLng latlng = LatLng( + location?.latitude ?? 0.0, + location?.longitude ?? 0.0, + ); addLatLngOnly( - LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0)); + LatLng(location?.latitude ?? 0.0, location?.longitude ?? 0.0), + ); mapController.move(latlng, mapController.camera.zoom); } } diff --git a/lib/widget/osm_map/map_picker_page.dart b/lib/widget/osm_map/map_picker_page.dart index a05628d..6b65246 100644 --- a/lib/widget/osm_map/map_picker_page.dart +++ b/lib/widget/osm_map/map_picker_page.dart @@ -7,7 +7,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:latlong2/latlong.dart'; import '../../controllers/theme_controller.dart'; diff --git a/lib/widget/permission_dialog.dart b/lib/widget/permission_dialog.dart index 701275b..e499e38 100644 --- a/lib/widget/permission_dialog.dart +++ b/lib/widget/permission_dialog.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import '../themes/app_them_data.dart'; import '../themes/round_button_fill.dart'; @@ -21,10 +21,15 @@ class PermissionDialog extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.add_location_alt_rounded, color: Theme.of(context).primaryColor, size: 100), + Icon( + Icons.add_location_alt_rounded, + color: Theme.of(context).primaryColor, + size: 100, + ), const SizedBox(height: 20), Text( - 'You denied location permission forever. Please allow location permission from your app settings and receive more accurate delivery.'.tr(), + 'You denied location permission forever. Please allow location permission from your app settings and receive more accurate delivery.' + .tr(), textAlign: TextAlign.center, style: TextStyle(fontSize: 18), ), @@ -34,7 +39,13 @@ class PermissionDialog extends StatelessWidget { Expanded( child: TextButton( style: TextButton.styleFrom( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30), side: BorderSide(width: 2, color: Theme.of(context).primaryColor)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + side: BorderSide( + width: 2, + color: Theme.of(context).primaryColor, + ), + ), minimumSize: const Size(1, 50), ), child: Text('close'.tr()), diff --git a/lib/widget/place_picker/location_controller.dart b/lib/widget/place_picker/location_controller.dart index c9eb0d6..70a4ab8 100644 --- a/lib/widget/place_picker/location_controller.dart +++ b/lib/widget/place_picker/location_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:geolocator/geolocator.dart'; import 'package:geocoding/geocoding.dart'; @@ -34,11 +34,15 @@ class LocationController extends GetxController { Future getCurrentLocation() async { try { - Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); + Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high, + ); selectedLocation.value = LatLng(position.latitude, position.longitude); if (mapController != null) { - mapController!.animateCamera(CameraUpdate.newLatLngZoom(selectedLocation.value!, 15)); + mapController!.animateCamera( + CameraUpdate.newLatLngZoom(selectedLocation.value!, 15), + ); } await getAddressFromLatLng(selectedLocation.value!); @@ -49,11 +53,15 @@ class LocationController extends GetxController { Future getAddressFromLatLng(LatLng latLng) async { try { - List placemarks = await placemarkFromCoordinates(latLng.latitude, latLng.longitude); + List placemarks = await placemarkFromCoordinates( + latLng.latitude, + latLng.longitude, + ); if (placemarks.isNotEmpty) { Placemark place = placemarks.first; selectedPlaceAddress.value = place; - address.value = "${place.street}, ${place.locality}, ${place.administrativeArea}, ${place.country}"; + address.value = + "${place.street}, ${place.locality}, ${place.administrativeArea}, ${place.country}"; } else { address.value = "Address not found"; } @@ -71,7 +79,10 @@ class LocationController extends GetxController { try { List locations = await locationFromAddress(zipCode); if (locations.isNotEmpty) { - selectedLocation.value = LatLng(locations.first.latitude, locations.first.longitude); + selectedLocation.value = LatLng( + locations.first.latitude, + locations.first.longitude, + ); } } catch (e) { print("Error getting coordinates for ZIP code: $e"); @@ -80,7 +91,10 @@ class LocationController extends GetxController { void confirmLocation() { if (selectedLocation.value != null) { - SelectedLocationModel selectedLocationModel = SelectedLocationModel(address: selectedPlaceAddress.value, latLng: selectedLocation.value); + SelectedLocationModel selectedLocationModel = SelectedLocationModel( + address: selectedPlaceAddress.value, + latLng: selectedLocation.value, + ); Get.back(result: selectedLocationModel); } } diff --git a/lib/widget/place_picker/location_picker_screen.dart b/lib/widget/place_picker/location_picker_screen.dart index 4c0c96d..e00f665 100644 --- a/lib/widget/place_picker/location_picker_screen.dart +++ b/lib/widget/place_picker/location_picker_screen.dart @@ -8,7 +8,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_google_places_hoc081098/flutter_google_places_hoc081098.dart'; import 'package:flutter_google_places_hoc081098/google_maps_webservice_places.dart'; -import 'package:get/get.dart'; +import 'package:get/get.dart' hide Trans; import 'package:google_maps_flutter/google_maps_flutter.dart'; final GoogleMapsPlaces _places = GoogleMapsPlaces(apiKey: Constant.mapAPIKey); diff --git a/lib/widget/story_view/widgets/story_image.dart b/lib/widget/story_view/widgets/story_image.dart index ce6308f..9a193a5 100644 --- a/lib/widget/story_view/widgets/story_image.dart +++ b/lib/widget/story_view/widgets/story_image.dart @@ -4,8 +4,6 @@ import 'dart:ui' as ui; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:get/get_utils/src/extensions/internacionalization.dart'; - import '../controller/story_controller.dart'; import '../utils.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 2be1d69..f0da5ca 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: customer description: "A new Flutter project." -version: 1.0.0+3 +version: 1.0.0+4 environment: sdk: ^3.7.2 -- 2.49.1 From 841cdf8c212540fab2fb53a09e028b470d9e0da8 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Thu, 4 Dec 2025 11:19:11 +0500 Subject: [PATCH 21/30] MINOR-FIX: Localization Problem Resolve. --- assets/translations/en-US.json | 21 ++++++++-- lib/constant/const_texts.dart | 39 ++++++++++--------- lib/main.dart | 3 +- lib/screen_ui/auth_screens/login_screen.dart | 2 +- .../auth_screens/mobile_login_screen.dart | 2 +- .../auth_screens/otp_verification_screen.dart | 2 +- .../location_permission_screen.dart | 20 +++++----- .../service_list_screen.dart | 28 ++++++------- .../splash_screen/splash_screen.dart | 1 - 9 files changed, 69 insertions(+), 49 deletions(-) diff --git a/assets/translations/en-US.json b/assets/translations/en-US.json index bdb591d..dbf4e89 100644 --- a/assets/translations/en-US.json +++ b/assets/translations/en-US.json @@ -6,8 +6,6 @@ "forgotPassword": "Forgot Password", "login": "Log in", "orContinueWith": "or continue with", - - "withGoogle": "with Google", "withApple": "with Apple", "dontHaveAccount": "Didn't have an account?", @@ -104,5 +102,22 @@ "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", "noOrderfound": "No order found", "reset_password_link_sent": "A reset link has been sent to {email}", - "pay_amount": "Pay Amount: {amount}" + "pay_amount": "Pay Amount: {amount}", + "otherServices": "Other Services", + "foodDelivery": "Food Delivery", + "delivery": "Delivery", + "bookingTaxi": "Booking \nTaxi", + "updateYourWardrobe": "Update your wardrobe", + "weDeliverSafely": "We deliver safely", + "rent": "Rent", + "hugeSelectionOfAds": "Huge selection of ads!", + "cosmetics": "Cosmetics", + "moreThan1000Products": "More than 1000 products", + "foodProducts": "Food products", + "enableLocation": "Enable Location for a Personalized Experience", + "allowLocation": "Allow location access to discover beauty stores and services near you.", + "useCurrentLocation": "Use current location", + "setFromMap": "Set from map", + "enterManuallyLocation": "Enter Manually location" + } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 2649715..b86ab87 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -1,5 +1,5 @@ class ConstTexts { - static String loginToExplore = "logintoExplore"; + static String loginToExplore = "loginToExplore"; static String emailAddress = "emailAddress"; static String password = "password"; static String enterPassword = "enterPassword"; @@ -60,9 +60,11 @@ class ConstTexts { static String pleaseWait = "pleaseWait"; static String change = "change"; static String yourSosRequest = "yourSosRequest"; - static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; + static String yourSosrequestAlreadySubmitted = + "yourSosrequestAlreadySubmitted"; static String payNow = "payNow"; - static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + static String youDoNothaveSufficientwalletBalance = + "youDoNothaveSufficientwalletBalance"; static String somethingWentWrong = "somethingWentWrong"; static String cash = "cash"; static String coupon = "coupon"; @@ -102,21 +104,22 @@ class ConstTexts { static String plsLoginToAcc = "plsLoginToAcc"; static String youAreNotLoggedIn = "youAreNotLoggedIn"; static String noOrderfound = "noOrderfound"; - // static String yourSosrequestAlreadySubmitted = "yourSosrequestAlreadySubmitted"; - // static String payNow = "payNow"; - // static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; - // static String somethingWentWrong = "somethingWentWrong"; - // static String cash = "cash"; - // static String coupon = "coupon"; - // static String couponNotFound = "couponNotFound"; - // static String tapToApply = "tapToApply"; - // static String home = "home"; - // static String myBookings = "myBookings"; - // static String profile = "profile"; - // static String wallet = "wallet"; - // static String cabServiceType = "cabServiceType"; - // static String everyRideVerified = "everyRideVerified"; - // static String allDriversIDCheck = "allDriversIDCheck"; + static String otherServices = "otherServices"; + static String foodDelivery = "foodDelivery"; + static String delivery = "delivery"; + static String bookingTaxi = "bookingTaxi"; + static String updateYourWardrobe = "updateYourWardrobe"; + static String weDeliverSafely = "weDeliverSafely"; + static String rent = "rent"; + static String hugeSelectionOfAds = "hugeSelectionOfAds"; + static String cosmetics = "cosmetics"; + static String moreThan1000Products = "moreThan1000Products"; + static String foodProducts = "foodProducts"; + static String enableLocation = "enableLocation"; + static String allowLocation = "allowLocation"; + static String useCurrentLocation = "useCurrentLocation"; + static String setFromMap = "setFromMap"; + static String enterManuallyLocation = "enterManuallyLocation"; // static String intercity = "intercity"; // static String aroundTheCity = "aroundTheCity"; // static String rideDetails = "rideDetails"; diff --git a/lib/main.dart b/lib/main.dart index 94ab4a6..b8944f8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,8 +13,6 @@ import 'controllers/global_setting_controller.dart'; import 'controllers/theme_controller.dart'; import 'firebase_options.dart'; - - void main() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); @@ -30,6 +28,7 @@ void main() async { runApp( EasyLocalization( + startLocale: Locale('en', 'US'), supportedLocales: [ Locale('en', 'US'), Locale('uz', 'UZ'), diff --git a/lib/screen_ui/auth_screens/login_screen.dart b/lib/screen_ui/auth_screens/login_screen.dart index 620ffc7..832426a 100644 --- a/lib/screen_ui/auth_screens/login_screen.dart +++ b/lib/screen_ui/auth_screens/login_screen.dart @@ -273,7 +273,7 @@ class LoginScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: ConstTexts.dontHaveAccount.tr(), + text: "${ConstTexts.dontHaveAccount.tr()} ", style: AppThemeData.mediumTextStyle( color: isDark diff --git a/lib/screen_ui/auth_screens/mobile_login_screen.dart b/lib/screen_ui/auth_screens/mobile_login_screen.dart index 7a04934..9c9c368 100644 --- a/lib/screen_ui/auth_screens/mobile_login_screen.dart +++ b/lib/screen_ui/auth_screens/mobile_login_screen.dart @@ -257,7 +257,7 @@ class MobileLoginScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: ConstTexts.dontHaveAccount.tr(), + text: "${ConstTexts.dontHaveAccount.tr()} ", style: AppThemeData.mediumTextStyle( color: isDark diff --git a/lib/screen_ui/auth_screens/otp_verification_screen.dart b/lib/screen_ui/auth_screens/otp_verification_screen.dart index 251e952..0def8c1 100644 --- a/lib/screen_ui/auth_screens/otp_verification_screen.dart +++ b/lib/screen_ui/auth_screens/otp_verification_screen.dart @@ -200,7 +200,7 @@ class OtpVerificationScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: ConstTexts.dontHaveAccount.tr(), + text: "${ConstTexts.dontHaveAccount.tr()} ", style: AppThemeData.mediumTextStyle( color: isDark diff --git a/lib/screen_ui/location_enable_screens/location_permission_screen.dart b/lib/screen_ui/location_enable_screens/location_permission_screen.dart index 7577eea..dd6adaf 100644 --- a/lib/screen_ui/location_enable_screens/location_permission_screen.dart +++ b/lib/screen_ui/location_enable_screens/location_permission_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/models/user_model.dart'; @@ -39,9 +40,9 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( - "Enable Location for a Personalized Experience".tr(), + ConstTexts.enableLocation.tr(), style: AppThemeData.boldTextStyle( - fontSize: 24, + fontSize: 24.sp, color: isDark ? AppThemeData.greyDark900 @@ -54,10 +55,9 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - "Allow location access to discover beauty stores and services near you." - .tr(), + ConstTexts.allowLocation.tr(), style: AppThemeData.mediumTextStyle( - fontSize: 14, + fontSize: 16.sp, color: isDark ? AppThemeData.greyDark600 @@ -69,7 +69,8 @@ class LocationPermissionScreen extends StatelessWidget { const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: "Use current location".tr(), + fontSizes: 14.sp, + title: ConstTexts.useCurrentLocation.tr(), onPress: () async { Constant.checkPermission( context: context, @@ -137,7 +138,8 @@ class LocationPermissionScreen extends StatelessWidget { const SizedBox(height: 10), RoundedButtonFill( borderRadius: 10.r, - title: "Set from map".tr(), + fontSizes: 14.sp, + title: ConstTexts.setFromMap.tr(), onPress: () async { Constant.checkPermission( context: context, @@ -230,9 +232,9 @@ class LocationPermissionScreen extends StatelessWidget { }); }, child: Text( - "Enter Manually location".tr(), + ConstTexts.enterManuallyLocation.tr(), style: AppThemeData.semiBoldTextStyle( - fontSize: 16, + fontSize: 16.sp, color: isDark ? AppThemeData.greyDark900 diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index 5de8a4d..6b45339 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -1,5 +1,7 @@ import 'dart:developer'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/models/section_model.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart' hide Trans; @@ -66,7 +68,7 @@ class ServiceListScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(horizontal: 16.r), child: Text( - "Other Services", + ConstTexts.otherServices.tr(), style: TextStyle( fontFamily: AppThemeData.bold, fontWeight: FontWeight.w700, @@ -80,23 +82,23 @@ class ServiceListScreen extends StatelessWidget { // Other Services Section _otherServicesCardMaker( image: "assets/images/garderob_img.png", - title: "Обновить гардероб", - subtitle: "Доставляем безопасно", + title: ConstTexts.updateYourWardrobe.tr(), + subtitle: ConstTexts.weDeliverSafely.tr(), ), _otherServicesCardMaker( image: "assets/images/keys_img.png", - title: "Аренда", - subtitle: "Огромный выбор объявлений!", + title: ConstTexts.rent.tr(), + subtitle: ConstTexts.hugeSelectionOfAds.tr(), ), _otherServicesCardMaker( image: "assets/images/cosmetics_img.png", - title: "Косметика", - subtitle: "Более 1000 товаров", + title: ConstTexts.cosmetics.tr(), + subtitle: ConstTexts.moreThan1000Products.tr(), ), _otherServicesCardMaker( image: "assets/images/products_img.png", - title: "Продукты питания", - subtitle: "Более 1000 товаров", + title: ConstTexts.foodProducts.tr(), + subtitle: ConstTexts.moreThan1000Products.tr(), ), SizedBox(height: 45.h), ], @@ -207,7 +209,7 @@ class ServiceListScreen extends StatelessWidget { spacing: 12.r, children: [ _mainCardsMaker( - title: "Food Delivery", + title: ConstTexts.foodDelivery.tr(), image: "assets/images/food_img.png", // onTap: () { // log("Main Card Tapped"); @@ -225,7 +227,7 @@ class ServiceListScreen extends StatelessWidget { // }, ), _mainCardsMaker( - title: "Delivery", + title: ConstTexts.delivery.tr(), image: "assets/images/delivery_img.png", onTap: () { log("Main Card Tapped"); @@ -274,7 +276,7 @@ class ServiceListScreen extends StatelessWidget { Expanded( child: Text( maxLines: 2, - "Booking Taxi", + ConstTexts.bookingTaxi.tr(), style: TextStyle( overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.bold, @@ -348,7 +350,7 @@ class ServiceListScreen extends StatelessWidget { style: TextStyle( overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.bold, - fontSize: 14.sp, + fontSize: 15.sp, fontWeight: FontWeight.w700, color: AppThemeData.darkGrey, ), diff --git a/lib/screen_ui/splash_screen/splash_screen.dart b/lib/screen_ui/splash_screen/splash_screen.dart index 64ef3b4..126a387 100644 --- a/lib/screen_ui/splash_screen/splash_screen.dart +++ b/lib/screen_ui/splash_screen/splash_screen.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart' hide Trans; -import '../../constant/assets.dart'; import '../../controllers/splash_controller.dart'; import '../../themes/app_them_data.dart'; -- 2.49.1 From 157545f1c047636221a47a90c4470ddea6b994c0 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Thu, 4 Dec 2025 15:20:19 +0500 Subject: [PATCH 22/30] BASE: Create AppRouter Util. --- assets/translations/en-US.json | 6 +- assets/translations/ru-RU.json | 230 ++++++++------- assets/translations/uz-UZ.json | 230 ++++++++------- lib/constant/const_texts.dart | 17 +- lib/controllers/splash_controller.dart | 14 +- lib/main.dart | 12 +- .../change_language_screen.dart | 268 +++++++++++++----- .../splash_screen/splash_screen.dart | 8 +- lib/utils/app_router.dart | 42 +++ pubspec.lock | 48 ++++ pubspec.yaml | 3 + 11 files changed, 580 insertions(+), 298 deletions(-) create mode 100644 lib/utils/app_router.dart diff --git a/assets/translations/en-US.json b/assets/translations/en-US.json index dbf4e89..57288de 100644 --- a/assets/translations/en-US.json +++ b/assets/translations/en-US.json @@ -118,6 +118,10 @@ "allowLocation": "Allow location access to discover beauty stores and services near you.", "useCurrentLocation": "Use current location", "setFromMap": "Set from map", - "enterManuallyLocation": "Enter Manually location" + "enterManuallyLocation": "Enter Manually location", + + + "changeLanguage": "Change Language", + "selectPrefferedLanguage": "Select your preferred language for a personalized app experience." } \ No newline at end of file diff --git a/assets/translations/ru-RU.json b/assets/translations/ru-RU.json index bdb591d..cf45701 100644 --- a/assets/translations/ru-RU.json +++ b/assets/translations/ru-RU.json @@ -1,108 +1,124 @@ { - "loginToExplore" : "Log in to explore your all in one vendor app favourites and shop effortlessly.", - "emailAddress": "Email Address*", - "password": "Password*", - "enterPassword": "Enter password", - "forgotPassword": "Forgot Password", - "login": "Log in", - "orContinueWith": "or continue with", - - - "withGoogle": "with Google", - "withApple": "with Apple", - "dontHaveAccount": "Didn't have an account?", - "signUp": "Sign up", - "skip": "Skip", - "signUpToExplore": "Sign up to explore all our services and start shopping, riding, and more.", - "firstName": "First Name*", - "lastName": "Last Name*", - "enterMobileNumber": "Enter Mobile number", - "confirmPassword": "Confirm Password*", - "enterConfirmPassword": "Enter confirm password", - "referralCode": "Referral Code", - "enterReferralCode": "Enter referral code", - "alreadyHaveAccount":"Already have an account?", - "enterYourregisteredEmail": "Enter your registered email to receive a reset link.", - "sendLink": "Send Link", - "rememberPassword": "Remember Password?", - "enterOtpSent": "Enter the OTP sent to your mobile", - "resendOTP": "Resend OTP", - "verify": "Verify", - "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", - "sendCode":"Send Code", - "serviceIsUnavailable": "Service is unavailable at the selected address.", - "pickUpLocation": "Pickup Location", - "destinationLocation": "Destination Location", - "continueT":"Continue", - "plsSelectSourceLocation": "Please select source location", - "plsSelectDestinationLocations": "Please select destination location", - "selectVehicleType": "Select Your Vehicle Type", - "plsSelectVehicleTypeFirst": "Please select a vehicle type first.", - "plsSelectPaymentMethod": "Please select a payment method", - "insufficientWallet": "Insufficient wallet balance. Please select another payment method.", - "promoCode": "Promo code", - "thisOfferNotEligible": "This offer not eligible for this booking", - "viewAll": "View All", - "writeCoupon": "Write coupon Code", - "redeemNow": "Redeem now", - "plsEnterCouponCode":"Please enter a coupon code", - "couponApplied": "Coupon applied successfully", - "couponExpired": "This coupon code has been expired", - "invalidCouponCode": "Invalid coupon code", - "orderSummary": "Order Summary", - "subtotal": "Subtotal", - "discount": "Discount", - "orderTotal": "Order Total", - "confirmBooking": "Confirm Booking", - "waitingForDriver": "Waiting for driver....", - "cancelRide": "Cancel Ride", - "riderCancelledSucces": "Ride cancelled successfully", - "failedToCancel": "Failed to cancel ride", - "pleaseWait": "Please wait...", - "change": "Change", - "yourSosRequest": "Your SOS request has been submitted to admin", - "yourSosrequestAlreadySubmitted": "Your SOS request is already submitted", - "payNow": "Pay Now", - "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", - "somethingWentWrong": "Something went wrong, please contact admin.", - "cash": "Cash", - "coupon": "Coupon", - "couponNotFound": "Coupon not found.", - "tapToApply": "Tap To Apply", - "home": "Home", - "myBookings": "My Bookings", - "profile": "profile", - "wallet": "Wallet", - "cabServiceType": "Cab Service Type", - "everyRideVerified": "Every Ride. Every Driver. Verified.", - "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", - "intercity": "Intercity", - "aroundTheCity": "Around the city", - "rideDetails": "Ride Details", - "orderId": "Order Id:", - "bookingData": "Booking Date:", - "rideAndFareSummary": "Ride & Fare Summary", - "updateReview": "Update Review", - "addReview": "Add Review", - "complain": "Complain", - "distance": "Distance", - "km": "KM", - "duration": "Duration", - "howWasTrip": "How was your trip?", - "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", - "rateFor": "Rate for", - "typeComment": "Type comment....", - "title": "Title", - "typeDescription": "Type Description...", - "save": "Save", - "popularDestinations": "Popular Destinations", - "selectPaymentMethod": "Select Payment Method", - "prefferedPayment": "Preferred Payment", - "otherPaymentOptions": "Other Payment Options", - "rideHistory": "Ride History", - "plsLoginToAcc": "Please Log In to Continue", - "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", - "noOrderfound": "No order found", - "reset_password_link_sent": "A reset link has been sent to {email}", - "pay_amount": "Pay Amount: {amount}" -} \ No newline at end of file + "loginToExplore" : "Войдите, чтобы исследовать наш универсальный сервис и делать покупки с удобством.", + "emailAddress": "Адрес электронной почты*", + "password": "Пароль*", + "enterPassword": "Введите пароль", + "forgotPassword": "Забыли пароль", + "login": "Войти", + "orContinueWith": "или продолжить с", + "withGoogle": "с Google", + "withApple": "с Apple", + "dontHaveAccount": "Нет аккаунта?", + "signUp": "Зарегистрироваться", + "skip": "Пропустить", + "signUpToExplore": "Зарегистрируйтесь, чтобы получить доступ ко всем нашим услугам и начать делать покупки, поездки и многое другое.", + "firstName": "Имя*", + "lastName": "Фамилия*", + "enterMobileNumber": "Введите номер телефона", + "confirmPassword": "Подтвердите пароль*", + "enterConfirmPassword": "Введите подтверждение пароля", + "referralCode": "Реферальный код", + "enterReferralCode": "Введите реферальный код", + "alreadyHaveAccount": "Уже есть аккаунт?", + "enterYourregisteredEmail": "Введите свою зарегистрированную почту, чтобы получить ссылку для сброса.", + "sendLink": "Отправить ссылку", + "rememberPassword": "Вспомнили пароль?", + "enterOtpSent": "Введите код, отправленный на ваш телефон", + "resendOTP": "Отправить код повторно", + "verify": "Подтвердить", + "useYourMobileNumber": "Используйте номер телефона для быстрого и безопасного входа.", + "sendCode": "Отправить код", + "serviceIsUnavailable": "Услуга недоступна по выбранному адресу.", + "pickUpLocation": "Место отправления", + "destinationLocation": "Место назначения", + "continueT": "Продолжить", + "plsSelectSourceLocation": "Пожалуйста, выберите место отправления", + "plsSelectDestinationLocations": "Пожалуйста, выберите место назначения", + "selectVehicleType": "Выберите тип транспорта", + "plsSelectVehicleTypeFirst": "Сначала выберите тип транспорта.", + "plsSelectPaymentMethod": "Пожалуйста, выберите способ оплаты", + "insufficientWallet": "Недостаточно средств в кошельке. Пожалуйста, выберите другой способ оплаты.", + "promoCode": "Промокод", + "thisOfferNotEligible": "Это предложение недоступно для данного заказа", + "viewAll": "Показать все", + "writeCoupon": "Введите промокод", + "redeemNow": "Применить", + "plsEnterCouponCode": "Пожалуйста, введите промокод", + "couponApplied": "Промокод успешно применён", + "couponExpired": "Срок действия этого промокода истёк", + "invalidCouponCode": "Неверный промокод", + "orderSummary": "Сводка заказа", + "subtotal": "Промежуточный итог", + "discount": "Скидка", + "orderTotal": "Итого", + "confirmBooking": "Подтвердить заказ", + "waitingForDriver": "Ожидание водителя....", + "cancelRide": "Отменить поездку", + "riderCancelledSucces": "Поездка успешно отменена", + "failedToCancel": "Не удалось отменить поездку", + "pleaseWait": "Пожалуйста, подождите...", + "change": "Изменить", + "yourSosRequest": "Ваш SOS-запрос отправлен администратору", + "yourSosrequestAlreadySubmitted": "Ваш SOS-запрос уже отправлен", + "payNow": "Оплатить сейчас", + "youDoNothaveSufficientwalletBalance": "Недостаточно средств в кошельке", + "somethingWentWrong": "Произошла ошибка, пожалуйста, свяжитесь с администратором.", + "cash": "Наличные", + "coupon": "Промокод", + "couponNotFound": "Промокод не найден.", + "tapToApply": "Нажмите, чтобы применить", + "home": "Главная", + "myBookings": "Мои заказы", + "profile": "Профиль", + "wallet": "Кошелёк", + "cabServiceType": "Тип такси", + "everyRideVerified": "Каждая поездка. Каждый водитель. Проверены.", + "allDriversIDCheck": "Все водители проходят проверку документов и биографии для вашей безопасности.", + "intercity": "Междугородние", + "aroundTheCity": "По городу", + "rideDetails": "Детали поездки", + "orderId": "ID заказа:", + "bookingData": "Дата заказа:", + "rideAndFareSummary": "Детали поездки и стоимость", + "updateReview": "Обновить отзыв", + "addReview": "Добавить отзыв", + "complain": "Жалоба", + "distance": "Расстояние", + "km": "км", + "duration": "Продолжительность", + "howWasTrip": "Как прошла поездка?", + "yourFeedbackWillHelp": "Ваш отзыв поможет нам улучшить \n качество поездок", + "rateFor": "Оценка для", + "typeComment": "Введите комментарий....", + "title": "Заголовок", + "typeDescription": "Введите описание...", + "save": "Сохранить", + "popularDestinations": "Популярные направления", + "selectPaymentMethod": "Выберите способ оплаты", + "prefferedPayment": "Предпочтительный способ оплаты", + "otherPaymentOptions": "Другие способы оплаты", + "rideHistory": "История поездок", + "plsLoginToAcc": "Пожалуйста, войдите, чтобы продолжить", + "youAreNotLoggedIn": "Вы не вошли в систему. Пожалуйста, войдите, чтобы получить доступ к аккаунту и функциям.", + "noOrderfound": "Заказов не найдено", + "reset_password_link_sent": "Ссылка для сброса отправлена на {email}", + "pay_amount": "Сумма к оплате: {amount}", + "otherServices": "Другие услуги", + "foodDelivery": "Доставка еды", + "delivery": "Доставка", + "bookingTaxi": "Заказ \nТакси", + "updateYourWardrobe": "Обновите гардероб", + "weDeliverSafely": "Мы доставляем безопасно", + "rent": "Аренда", + "hugeSelectionOfAds": "Огромный выбор объявлений!", + "cosmetics": "Косметика", + "moreThan1000Products": "Более 1000 товаров", + "foodProducts": "Продукты питания", + "enableLocation": "Включите геолокацию", + "allowLocation": "Разрешите доступ к геолокации, чтобы найти магазины и услуги рядом с вами.", + "useCurrentLocation": "Использовать текущую геолокацию", + "setFromMap": "Выбрать на карте", + "enterManuallyLocation": "Введите адрес вручную", + "changeLanguage": "Изменить язык", + "selectPrefferedLanguage": "Выберите предпочитаемый язык для персонализированного использования приложения." +} diff --git a/assets/translations/uz-UZ.json b/assets/translations/uz-UZ.json index bdb591d..e8c3ee2 100644 --- a/assets/translations/uz-UZ.json +++ b/assets/translations/uz-UZ.json @@ -1,108 +1,124 @@ { - "loginToExplore" : "Log in to explore your all in one vendor app favourites and shop effortlessly.", - "emailAddress": "Email Address*", - "password": "Password*", - "enterPassword": "Enter password", - "forgotPassword": "Forgot Password", - "login": "Log in", - "orContinueWith": "or continue with", - - - "withGoogle": "with Google", - "withApple": "with Apple", - "dontHaveAccount": "Didn't have an account?", - "signUp": "Sign up", - "skip": "Skip", - "signUpToExplore": "Sign up to explore all our services and start shopping, riding, and more.", - "firstName": "First Name*", - "lastName": "Last Name*", - "enterMobileNumber": "Enter Mobile number", - "confirmPassword": "Confirm Password*", - "enterConfirmPassword": "Enter confirm password", - "referralCode": "Referral Code", - "enterReferralCode": "Enter referral code", - "alreadyHaveAccount":"Already have an account?", - "enterYourregisteredEmail": "Enter your registered email to receive a reset link.", - "sendLink": "Send Link", - "rememberPassword": "Remember Password?", - "enterOtpSent": "Enter the OTP sent to your mobile", - "resendOTP": "Resend OTP", - "verify": "Verify", - "useYourMobileNumber": "Use your mobile number to Log in easily and securely.", - "sendCode":"Send Code", - "serviceIsUnavailable": "Service is unavailable at the selected address.", - "pickUpLocation": "Pickup Location", - "destinationLocation": "Destination Location", - "continueT":"Continue", - "plsSelectSourceLocation": "Please select source location", - "plsSelectDestinationLocations": "Please select destination location", - "selectVehicleType": "Select Your Vehicle Type", - "plsSelectVehicleTypeFirst": "Please select a vehicle type first.", - "plsSelectPaymentMethod": "Please select a payment method", - "insufficientWallet": "Insufficient wallet balance. Please select another payment method.", - "promoCode": "Promo code", - "thisOfferNotEligible": "This offer not eligible for this booking", - "viewAll": "View All", - "writeCoupon": "Write coupon Code", - "redeemNow": "Redeem now", - "plsEnterCouponCode":"Please enter a coupon code", - "couponApplied": "Coupon applied successfully", - "couponExpired": "This coupon code has been expired", - "invalidCouponCode": "Invalid coupon code", - "orderSummary": "Order Summary", - "subtotal": "Subtotal", - "discount": "Discount", - "orderTotal": "Order Total", - "confirmBooking": "Confirm Booking", - "waitingForDriver": "Waiting for driver....", - "cancelRide": "Cancel Ride", - "riderCancelledSucces": "Ride cancelled successfully", - "failedToCancel": "Failed to cancel ride", - "pleaseWait": "Please wait...", - "change": "Change", - "yourSosRequest": "Your SOS request has been submitted to admin", - "yourSosrequestAlreadySubmitted": "Your SOS request is already submitted", - "payNow": "Pay Now", - "youDoNothaveSufficientwalletBalance": "You do not have sufficient wallet balance", - "somethingWentWrong": "Something went wrong, please contact admin.", - "cash": "Cash", - "coupon": "Coupon", - "couponNotFound": "Coupon not found.", - "tapToApply": "Tap To Apply", - "home": "Home", - "myBookings": "My Bookings", - "profile": "profile", - "wallet": "Wallet", - "cabServiceType": "Cab Service Type", - "everyRideVerified": "Every Ride. Every Driver. Verified.", - "allDriversIDCheck": "All drivers go through ID checks and background verification for your safety.", - "intercity": "Intercity", - "aroundTheCity": "Around the city", - "rideDetails": "Ride Details", - "orderId": "Order Id:", - "bookingData": "Booking Date:", - "rideAndFareSummary": "Ride & Fare Summary", - "updateReview": "Update Review", - "addReview": "Add Review", - "complain": "Complain", - "distance": "Distance", - "km": "KM", - "duration": "Duration", - "howWasTrip": "How was your trip?", - "yourFeedbackWillHelp": "Your feedback will help us improve \n driving experience better", - "rateFor": "Rate for", - "typeComment": "Type comment....", - "title": "Title", - "typeDescription": "Type Description...", - "save": "Save", - "popularDestinations": "Popular Destinations", - "selectPaymentMethod": "Select Payment Method", - "prefferedPayment": "Preferred Payment", - "otherPaymentOptions": "Other Payment Options", - "rideHistory": "Ride History", - "plsLoginToAcc": "Please Log In to Continue", - "youAreNotLoggedIn": "You’re not logged in. Please sign in to access your account and explore all features.", - "noOrderfound": "No order found", - "reset_password_link_sent": "A reset link has been sent to {email}", - "pay_amount": "Pay Amount: {amount}" -} \ No newline at end of file + "loginToExplore" : "Barcha xizmatlarimizdan foydalanish va qulay xarid qilish uchun tizimga kiring.", + "emailAddress": "Email manzil*", + "password": "Parol*", + "enterPassword": "Parolni kiriting", + "forgotPassword": "Parolni unutdingizmi", + "login": "Kirish", + "orContinueWith": "yoki davom eting", + "withGoogle": "Google orqali", + "withApple": "Apple orqali", + "dontHaveAccount": "Hisobingiz yo‘qmi?", + "signUp": "Ro‘yxatdan o‘tish", + "skip": "O‘tkazib yuborish", + "signUpToExplore": "Ro‘yxatdan o‘ting va barcha xizmatlarimizdan foydalanishni boshlang.", + "firstName": "Ism*", + "lastName": "Familiya*", + "enterMobileNumber": "Telefon raqamini kiriting", + "confirmPassword": "Parolni tasdiqlang*", + "enterConfirmPassword": "Tasdiqlash parolini kiriting", + "referralCode": "Referal kod", + "enterReferralCode": "Referal kodni kiriting", + "alreadyHaveAccount": "Hisobingiz bormi?", + "enterYourregisteredEmail": "Email manzilingizni kiriting — sizga parolni tiklash havolasi yuboriladi.", + "sendLink": "Havolani yuborish", + "rememberPassword": "Parol esingizga tushdimi?", + "enterOtpSent": "Telefoningizga yuborilgan kodni kiriting", + "resendOTP": "Kod qayta yuborilsin", + "verify": "Tasdiqlash", + "useYourMobileNumber": "Telefon raqamingiz orqali oson va xavfsiz kirishingiz mumkin.", + "sendCode": "Kod yuborish", + "serviceIsUnavailable": "Tanlangan manzilda xizmat mavjud emas.", + "pickUpLocation": "Jo‘nash manzili", + "destinationLocation": "Borish manzili", + "continueT": "Davom etish", + "plsSelectSourceLocation": "Iltimos, jo‘nash manzilini tanlang", + "plsSelectDestinationLocations": "Iltimos, borish manzilini tanlang", + "selectVehicleType": "Transport turini tanlang", + "plsSelectVehicleTypeFirst": "Avval transport turini tanlang.", + "plsSelectPaymentMethod": "Iltimos, to‘lov usulini tanlang", + "insufficientWallet": "Hamyonda mablag‘ yetarli emas. Boshqa to‘lov usulini tanlang.", + "promoCode": "Promo kod", + "thisOfferNotEligible": "Bu taklif ushbu buyurtma uchun amal qilmaydi", + "viewAll": "Barchasini ko‘rish", + "writeCoupon": "Promo kodni kiriting", + "redeemNow": "Qo‘llash", + "plsEnterCouponCode": "Iltimos, promo kodni kiriting", + "couponApplied": "Promo kod muvaffaqiyatli qo‘llandi", + "couponExpired": "Ushbu promo kodning muddati tugagan", + "invalidCouponCode": "Noto‘g‘ri promo kod", + "orderSummary": "Buyurtma tafsilotlari", + "subtotal": "Oraliq summa", + "discount": "Chegirma", + "orderTotal": "Umumiy summa", + "confirmBooking": "Buyurtmani tasdiqlash", + "waitingForDriver": "Haydovchi kutilmoqda....", + "cancelRide": "Safarni bekor qilish", + "riderCancelledSucces": "Safar muvaffaqiyatli bekor qilindi", + "failedToCancel": "Safarni bekor qilish amalga oshmadi", + "pleaseWait": "Iltimos, kuting...", + "change": "O‘zgartirish", + "yourSosRequest": "Sizning SOS so‘rovingiz administratorga yuborildi", + "yourSosrequestAlreadySubmitted": "SOS so‘rovi allaqachon yuborilgan", + "payNow": "Hozir to‘lash", + "youDoNothaveSufficientwalletBalance": "Hamyonda mablag‘ yetarli emas", + "somethingWentWrong": "Xatolik yuz berdi, administrator bilan bog‘laning.", + "cash": "Naqd", + "coupon": "Promo kod", + "couponNotFound": "Promo kod topilmadi.", + "tapToApply": "Qo‘llash uchun bosing", + "home": "Bosh sahifa", + "myBookings": "Buyurtmalarim", + "profile": "Profil", + "wallet": "Hamyon", + "cabServiceType": "Taksi xizmati turi", + "everyRideVerified": "Har bir safar. Har bir haydovchi. Tasdiqlangan.", + "allDriversIDCheck": "Barcha haydovchilar hujjat va tekshiruvdan o‘tadi — xavfsizligingiz uchun.", + "intercity": "Shaharlararo", + "aroundTheCity": "Shahar bo‘ylab", + "rideDetails": "Safar tafsilotlari", + "orderId": "Buyurtma ID:", + "bookingData": "Buyurtma sanasi:", + "rideAndFareSummary": "Safar va to‘lov tafsilotlari", + "updateReview": "Sharhni yangilash", + "addReview": "Sharh qoldirish", + "complain": "Shikoyat", + "distance": "Masofa", + "km": "km", + "duration": "Davomiylik", + "howWasTrip": "Safar qanday o‘tdi?", + "yourFeedbackWillHelp": "Fikringiz safar sifatini yanada yaxshilashga yordam beradi", + "rateFor": "Baholash:", + "typeComment": "Izoh yozing....", + "title": "Sarlavha", + "typeDescription": "Tavsif yozing...", + "save": "Saqlash", + "popularDestinations": "Mashhur yo‘nalishlar", + "selectPaymentMethod": "To‘lov usulini tanlang", + "prefferedPayment": "Afzal to‘lov usuli", + "otherPaymentOptions": "Boshqa to‘lov usullari", + "rideHistory": "Safar tarixi", + "plsLoginToAcc": "Davom etish uchun tizimga kiring", + "youAreNotLoggedIn": "Siz tizimga kirmagansiz. Hisobingizga kirib barcha funksiyalardan foydalaning.", + "noOrderfound": "Buyurtmalar topilmadi", + "reset_password_link_sent": "Parol tiklash havolasi {email} manziliga yuborildi", + "pay_amount": "To‘lanadigan summa: {amount}", + "otherServices": "Boshqa xizmatlar", + "foodDelivery": "Oziq-ovqat yetkazib berish", + "delivery": "Yetkazib berish", + "bookingTaxi": "Taksi \nBuyurtma", + "updateYourWardrobe": "Garderobingizni yangilang", + "weDeliverSafely": "Biz xavfsiz yetkazib beramiz", + "rent": "Ijara", + "hugeSelectionOfAds": "Keng e’lonlar tanlovi!", + "cosmetics": "Kosmetika", + "moreThan1000Products": "1000 dan ortiq mahsulotlar", + "foodProducts": "Oziq-ovqat mahsulotlari", + "enableLocation": "Shaxsiylashtirilgan tajriba uchun geolokatsiyani yoqing", + "allowLocation": "Yaqin atrofdagi do‘kon va xizmatlarni topish uchun geolokatsiyaga ruxsat bering.", + "useCurrentLocation": "Joriy manzildan foydalanish", + "setFromMap": "Xaritadan tanlash", + "enterManuallyLocation": "Manzilni qo‘lda kiriting", + "changeLanguage": "Tilni o‘zgartirish", + "selectPrefferedLanguage": "Shaxsiylashtirilgan tajriba uchun afzal tilni tanlang." +} diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index b86ab87..408d0bb 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -120,7 +120,22 @@ class ConstTexts { static String useCurrentLocation = "useCurrentLocation"; static String setFromMap = "setFromMap"; static String enterManuallyLocation = "enterManuallyLocation"; - // static String intercity = "intercity"; + static String changeLanguage = "changeLanguage"; + static String selectPrefferedLanguage = "selectPrefferedLanguage"; + // static String rideDetails = "rideDetails"; + // static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; + // static String somethingWentWrong = "somethingWentWrong"; + // static String cash = "cash"; + // static String hugeSelectionOfAds = "hugeSelectionOfAds"; + // static String cosmetics = "cosmetics"; + // static String moreThan1000Products = "moreThan1000Products"; + // static String foodProducts = "foodProducts"; + // static String enableLocation = "enableLocation"; + // static String allowLocation = "allowLocation"; + // static String useCurrentLocation = "useCurrentLocation"; + // static String setFromMap = "setFromMap"; + // static String enterManuallyLocation = "enterManuallyLocation"; + // static String changeLanguage = "changeLanguage"; // static String aroundTheCity = "aroundTheCity"; // static String rideDetails = "rideDetails"; // static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; diff --git a/lib/controllers/splash_controller.dart b/lib/controllers/splash_controller.dart index 3143267..53f95e8 100644 --- a/lib/controllers/splash_controller.dart +++ b/lib/controllers/splash_controller.dart @@ -7,6 +7,7 @@ import 'package:customer/screen_ui/service_home_screen/service_list_screen.dart' import 'package:customer/utils/notification_service.dart'; import 'package:customer/utils/preferences.dart'; import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart' hide Trans; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/location_enable_screens/location_permission_screen.dart'; @@ -14,9 +15,13 @@ import '../screen_ui/on_boarding_screen/on_boarding_screen.dart'; import '../service/fire_store_utils.dart'; class SplashController extends GetxController { + final BuildContext context; + + SplashController({required this.context}); + @override void onInit() { - Timer(const Duration(seconds: 3), () => redirectScreen()); + Timer(const Duration(seconds: 2), () => redirectScreen()); super.onInit(); } @@ -73,4 +78,11 @@ class SplashController extends GetxController { } } } + + void _navigateAndRemoveAll(Widget screen) { + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (_) => screen), + (route) => false, + ); + } } diff --git a/lib/main.dart b/lib/main.dart index b8944f8..7dae675 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,11 +2,13 @@ import 'package:customer/screen_ui/splash_screen/splash_screen.dart'; import 'package:customer/service/localization_service.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/easy_loading_config.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/preferences.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_phoenix/flutter_phoenix.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'controllers/global_setting_controller.dart'; @@ -28,14 +30,14 @@ void main() async { runApp( EasyLocalization( - startLocale: Locale('en', 'US'), + startLocale: Locale('uz', 'UZ'), supportedLocales: [ Locale('en', 'US'), Locale('uz', 'UZ'), Locale('ru', 'RU'), ], path: 'assets/translations', - fallbackLocale: Locale('en', 'US'), + fallbackLocale: Locale('uz', 'UZ'), child: MyApp(), ), ); @@ -54,7 +56,8 @@ class MyApp extends StatelessWidget { designSize: Size(375, 812), minTextAdapt: true, splitScreenMode: true, - child: GetMaterialApp( + child: MaterialApp( + navigatorKey: AppRouter.navigatorKey, localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, @@ -66,8 +69,7 @@ class MyApp extends StatelessWidget { child: EasyLoading.init()(context, child), ); }, - translations: LocalizationService(), - fallbackLocale: LocalizationService.locale, + // fallbackLocale: LocalizationService.locale, themeMode: themeController.themeMode, theme: ThemeData( scaffoldBackgroundColor: AppThemeData.surface, diff --git a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart index 537a753..a78a3fc 100644 --- a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart +++ b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart @@ -1,13 +1,15 @@ -import 'dart:convert'; + import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/change_language_controller.dart'; +import 'package:customer/screen_ui/splash_screen/splash_screen.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:customer/utils/network_image_widget.dart'; -import 'package:customer/utils/preferences.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:flag/flag_enum.dart'; +import 'package:flag/flag_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans;import '../../../controllers/theme_controller.dart'; -import '../../../service/localization_service.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart' hide Trans; +import '../../../controllers/theme_controller.dart'; class ChangeLanguageScreen extends StatelessWidget { const ChangeLanguageScreen({super.key}); @@ -20,81 +22,199 @@ class ChangeLanguageScreen extends StatelessWidget { init: ChangeLanguageController(), builder: (controller) { return Scaffold( - appBar: AppBar(backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0), + appBar: AppBar( + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + centerTitle: false, + titleSpacing: 0, + leading: InkWell( + onTap: () { + // Get.back(); + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute(builder: (context) => SplashScreen()), + (route) => false, + ); + }, + child: Icon(Icons.arrow_back), + ), + ), body: controller.isLoading.value ? Constant.loader() - : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Change Language".tr(), - style: TextStyle(fontSize: 24, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.semiBold, fontWeight: FontWeight.w500), - ), - Text( - "Select your preferred language for a personalized app experience.".tr(), - style: TextStyle(fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontFamily: AppThemeData.regular, fontWeight: FontWeight.w400), - ), - const SizedBox(height: 20), - Expanded( - child: GridView.count( - crossAxisCount: 2, - childAspectRatio: (1.1 / 1), - crossAxisSpacing: 5, - mainAxisSpacing: 1, - children: - controller.languageList - .map( - (data) => Obx( - () => GestureDetector( - onTap: () { - LocalizationService().changeLocale(data.slug.toString()); - Preferences.setString(Preferences.languageCodeKey, jsonEncode(data)); - controller.selectedLanguage.value = data; - }, - child: Container( - padding: const EdgeInsets.all(16), - child: Column( - children: [ - NetworkImageWidget(imageUrl: data.image.toString(), height: 80, width: 80), - // SvgPicture.network( - // data.image.toString(), - // height: 80, - // width: 80, - // fit: BoxFit.contain, - // placeholderBuilder: (context) => const Center(child: CircularProgressIndicator(strokeWidth: 1.5)), - // ), - const SizedBox(height: 5), - Text( - "${data.title}", - style: TextStyle( - fontSize: 16, - color: - controller.selectedLanguage.value.slug == data.slug - ? AppThemeData.primary300 - : isDark - ? AppThemeData.grey400 - : AppThemeData.grey500, - fontFamily: AppThemeData.medium, - fontWeight: FontWeight.w400, - ), - ), - ], - ), - ), - ), - ), - ) - .toList(), - ), - ), - ], - ), + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Padding( + // padding: const EdgeInsets.symmetric(horizontal: 16), + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Text( + // ConstTexts.changeLanguage.tr(), + // style: TextStyle( + // fontSize: 24, + // color: + // isDark + // ? AppThemeData.grey50 + // : AppThemeData.grey900, + // fontFamily: AppThemeData.semiBold, + // fontWeight: FontWeight.w500, + // ), + // ), + // Text( + // ConstTexts.selectPrefferedLanguage.tr(), + // style: TextStyle( + // fontSize: 16, + // color: + // isDark + // ? AppThemeData.grey50 + // : AppThemeData.grey900, + // fontFamily: AppThemeData.regular, + // fontWeight: FontWeight.w400, + // ), + // ), + // ], + // ), + // ), + _buildLanguageButton( + isActive: context.locale == Locale("uz", "UZ"), + flagCode: FlagsCode.UZ, + title: "O'zbekcha", + onTap: () async { + await context.setLocale(Locale("uz", "UZ")); + Get.forceAppUpdate(); + }, + ), + _buildDivider(), + _buildLanguageButton( + isActive: context.locale == Locale("ru", "RU"), + flagCode: FlagsCode.RU, + title: "Русский", + onTap: () async { + await context.setLocale(Locale("ru", "RU")); + Get.forceAppUpdate(); + }, + ), + _buildDivider(), + _buildLanguageButton( + isActive: context.locale == Locale("en", "US"), + flagCode: FlagsCode.US, + title: "English", + onTap: () async { + await context.setLocale(Locale("en", "US")); + Get.forceAppUpdate(); + }, + ), + + // Expanded( + // child: GridView.count( + // crossAxisCount: 2, + // childAspectRatio: (1.1 / 1), + // crossAxisSpacing: 5, + // mainAxisSpacing: 1, + // children: + // controller.languageList + // .map( + // (data) => Obx( + // () => GestureDetector( + // onTap: () { + // LocalizationService().changeLocale(data.slug.toString()); + // Preferences.setString(Preferences.languageCodeKey, jsonEncode(data)); + // controller.selectedLanguage.value = data; + // }, + // child: Container( + // padding: const EdgeInsets.all(16), + // child: Column( + // children: [ + // NetworkImageWidget(imageUrl: data.image.toString(), height: 80, width: 80), + // // SvgPicture.network( + // // data.image.toString(), + // // height: 80, + // // width: 80, + // // fit: BoxFit.contain, + // // placeholderBuilder: (context) => const Center(child: CircularProgressIndicator(strokeWidth: 1.5)), + // // ), + // const SizedBox(height: 5), + // Text( + // "${data.title}", + // style: TextStyle( + // fontSize: 16, + // color: + // controller.selectedLanguage.value.slug == data.slug + // ? AppThemeData.primary300 + // : isDark + // ? AppThemeData.grey400 + // : AppThemeData.grey500, + // fontFamily: AppThemeData.medium, + // fontWeight: FontWeight.w400, + // ), + // ), + // ], + // ), + // ), + // ), + // ), + // ) + // .toList(), + // ), + // ), + ], ), ); }, ); } + + Widget _buildDivider() => Padding( + padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), + child: Divider(thickness: 1.2.r), + ); + + InkWell _buildLanguageButton({ + required bool isActive, + required VoidCallback onTap, + required String title, + required FlagsCode flagCode, + }) { + return InkWell( + hoverColor: Colors.transparent, + splashColor: Colors.transparent, + overlayColor: WidgetStatePropertyAll(Colors.transparent), + onTap: onTap, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 15.r).copyWith(right: 16.r), + + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Flag.fromCode( + flagCode, + height: 40.h, + width: 90.w, + borderRadius: 12.r, + ), + Text( + title, + style: AppThemeData.mediumTextStyle( + fontSize: 16.sp, + color: AppThemeData.darkGrey, + ), + ), + ], + ), + isActive + ? Icon( + Icons.circle, + color: AppThemeData.darkGrey.withValues(alpha: 0.6), + size: 15.r, + ) + : SizedBox.shrink(), + ], + ), + ), + ); + } } diff --git a/lib/screen_ui/splash_screen/splash_screen.dart b/lib/screen_ui/splash_screen/splash_screen.dart index 126a387..3e6951f 100644 --- a/lib/screen_ui/splash_screen/splash_screen.dart +++ b/lib/screen_ui/splash_screen/splash_screen.dart @@ -9,12 +9,16 @@ class SplashScreen extends StatelessWidget { @override Widget build(BuildContext context) { return GetBuilder( - init: SplashController(), + init: SplashController(context: context), builder: (controller) { return Scaffold( backgroundColor: AppThemeData.mainColor, body: Center( - child: Image.asset("assets/images/fondex_logo_main.png", width: 120, height: 120), + child: Image.asset( + "assets/images/fondex_logo_main.png", + width: 120, + height: 120, + ), ), ); }, diff --git a/lib/utils/app_router.dart b/lib/utils/app_router.dart new file mode 100644 index 0000000..95b05e1 --- /dev/null +++ b/lib/utils/app_router.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +class AppRouter { + static final GlobalKey navigatorKey = + GlobalKey(); + + static void close() { + if (navigatorKey.currentState?.canPop() ?? false) { + navigatorKey.currentState!.pop(); + } + } + + static void go(Widget page) { + navigatorKey.currentState?.push(_createRoute(page)); + } + + static void open(Widget page) { + navigatorKey.currentState?.pushAndRemoveUntil( + _createRoute(page), + (Route route) => false, + ); + } + + static PageRouteBuilder _createRoute(Widget page) { + return PageRouteBuilder( + transitionDuration: const Duration(milliseconds: 200), + reverseTransitionDuration: const Duration(milliseconds: 100), + pageBuilder: (context, animation, secondaryAnimation) => page, + transitionsBuilder: (context, animation, secondaryAnimation, child) { + final curvedAnimation = CurvedAnimation( + parent: animation, + curve: Curves.ease, + ); + return ScaleTransition( + alignment: Alignment.center, + scale: Tween(begin: 0.950, end: 1).animate(curvedAnimation), + child: child, + ); + }, + ); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index c69f970..c0f8f59 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -209,6 +209,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.4.1" + country_flags: + dependency: "direct main" + description: + name: country_flags + sha256: "714f2d415e74828eb08787d552a05e94cdf2cbe0607a5656f3e70087cd7bb7e0" + url: "https://pub.dev" + source: hosted + version: "4.1.0" cross_file: dependency: transitive description: @@ -337,6 +345,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.0.2" + enum_to_string: + dependency: transitive + description: + name: enum_to_string + sha256: "93b75963d3b0c9f6a90c095b3af153e1feccb79f6f08282d3274ff8d9eea52bc" + url: "https://pub.dev" + source: hosted + version: "2.2.1" equatable: dependency: transitive description: @@ -537,6 +553,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + flag: + dependency: "direct main" + description: + name: flag + sha256: "69e3e1d47453349ef72e2ebf4234b88024c0d57f9bcfaa7cc7facec49cd8561f" + url: "https://pub.dev" + source: hosted + version: "7.0.2" flutter: dependency: "direct main" description: flutter @@ -683,6 +707,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" + flutter_phoenix: + dependency: "direct main" + description: + name: flutter_phoenix + sha256: "39589dac934ea476d0e43fb60c1ddfba58f14960743640c8250dea11c4333378" + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -1133,6 +1165,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" + jovial_misc: + dependency: transitive + description: + name: jovial_misc + sha256: "4301011027d87b8b919cb862db84071a34448eadbb32cc8d40fe505424dfe69a" + url: "https://pub.dev" + source: hosted + version: "0.9.2" + jovial_svg: + dependency: transitive + description: + name: jovial_svg + sha256: "08dd24b800d48796c9c0227acb96eb00c6cacccb1d7de58d79fc924090049868" + url: "https://pub.dev" + source: hosted + version: "1.1.28" json_annotation: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f0da5ca..bce9ddd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -90,6 +90,9 @@ dependencies: flutter_hooks: ^0.21.3+1 easy_localization: ^3.0.8 flutter_localization: ^0.3.3 + country_flags: ^4.1.0 + flag: ^7.0.2 + flutter_phoenix: ^1.1.1 dependency_overrides: webview_flutter: ^4.9.0 -- 2.49.1 From bf1d07a0489c25da7ae15cf46bd8f507e50f4eeb Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Thu, 4 Dec 2025 16:56:39 +0500 Subject: [PATCH 23/30] BASE: Switch From EasyLocalization To GetX Localization. --- assets/translations/{en-US.json => en.json} | 0 assets/translations/{ru-RU.json => ru.json} | 0 assets/translations/{uz-UZ.json => uz.json} | 0 lib/constant/constant.dart | 2 +- .../0n_demand_payment_controller.dart | 81 ++--- .../Intercity_home_controller.dart | 76 ++--- lib/controllers/address_list_controller.dart | 2 +- .../advertisement_list_controller.dart | 2 +- .../all_brand_product_controller.dart | 2 +- .../all_category_product_controller.dart | 2 +- lib/controllers/book_parcel_controller.dart | 36 +- lib/controllers/cab_booking_controller.dart | 74 ++-- .../cab_coupon_code_controller.dart | 2 +- lib/controllers/cab_dashboard_controller.dart | 2 +- lib/controllers/cab_home_controller.dart | 2 +- .../cab_order_details_controller.dart | 2 +- .../cab_rental_dashboard_controllers.dart | 2 +- lib/controllers/cab_review_controller.dart | 8 +- lib/controllers/cart_controller.dart | 68 ++-- lib/controllers/cashback_controller.dart | 2 +- .../category_restaurant_controller.dart | 2 +- .../change_language_controller.dart | 2 +- lib/controllers/chat_controller.dart | 12 +- lib/controllers/complain_controller.dart | 17 +- lib/controllers/dash_board_controller.dart | 2 +- .../dash_board_ecommarce_controller.dart | 2 +- .../dine_in_booking_controller.dart | 2 +- .../dine_in_booking_details_controller.dart | 2 +- lib/controllers/dine_in_controller.dart | 2 +- ...dine_in_restaurant_details_controller.dart | 12 +- .../discount_restaurant_list_controller.dart | 2 +- lib/controllers/edit_profile_controller.dart | 8 +- .../enter_manually_location_controller.dart | 12 +- lib/controllers/favourite_controller.dart | 2 +- .../favourite_ondemmand_controller.dart | 2 +- lib/controllers/food_home_controller.dart | 6 +- .../forgot_password_controller.dart | 18 +- lib/controllers/gift_card_controller.dart | 66 ++-- .../global_setting_controller.dart | 2 +- .../history_gift_card_controller.dart | 6 +- .../home_e_commerce_controller.dart | 2 +- lib/controllers/home_parcel_controller.dart | 2 +- lib/controllers/live_tracking_controller.dart | 2 +- lib/controllers/login_controller.dart | 59 ++-- lib/controllers/map_view_controller.dart | 2 +- lib/controllers/mobile_login_controller.dart | 16 +- .../my_booking_on_demand_controller.dart | 2 +- .../my_cab_booking_controller.dart | 74 ++-- lib/controllers/my_profile_controller.dart | 2 +- .../my_rental_booking_controller.dart | 20 +- lib/controllers/on_boarding_controller.dart | 2 +- .../on_demand_booking_controller.dart | 13 +- .../on_demand_category_controller.dart | 2 +- .../on_demand_dashboard_controller.dart | 2 +- .../on_demand_details_controller.dart | 2 +- .../on_demand_home_controller.dart | 2 +- .../on_demand_order_details_controller.dart | 16 +- .../on_demand_review_controller.dart | 8 +- lib/controllers/order_controller.dart | 2 +- lib/controllers/order_details_controller.dart | 2 +- lib/controllers/order_placing_controller.dart | 2 +- .../osm_search_place_controller.dart | 2 +- .../otp_verification_controller.dart | 23 +- lib/controllers/parcel_coupon_controller.dart | 2 +- .../parcel_dashboard_controller.dart | 2 +- .../parcel_my_booking_controller.dart | 10 +- .../parcel_order_confirmation_controller.dart | 76 ++--- .../parcel_order_details_controller.dart | 8 +- lib/controllers/parcel_review_controller.dart | 8 +- lib/controllers/provider_controller.dart | 2 +- lib/controllers/rate_product_controller.dart | 10 +- .../redeem_gift_card_controller.dart | 2 +- lib/controllers/refer_friend_controller.dart | 2 +- .../rental_conformation_controller.dart | 11 +- lib/controllers/rental_coupon_controller.dart | 2 +- lib/controllers/rental_home_controller.dart | 6 +- .../rental_order_details_controller.dart | 68 ++-- lib/controllers/rental_review_controller.dart | 8 +- .../restaurant_details_controller.dart | 2 +- .../restaurant_list_controller.dart | 2 +- lib/controllers/review_list_controller.dart | 2 +- lib/controllers/scan_qr_code_controller.dart | 2 +- lib/controllers/search_controller.dart | 2 +- lib/controllers/service_list_controller.dart | 15 +- lib/controllers/sign_up_controller.dart | 37 +- lib/controllers/splash_controller.dart | 3 +- lib/controllers/theme_controller.dart | 2 +- .../view_all_category_controller.dart | 2 +- .../view_all_popular_service_controller.dart | 2 +- .../view_category_service_controller.dart | 2 +- lib/controllers/wallet_controller.dart | 60 ++-- lib/main.dart | 28 +- lib/payment/MercadoPagoScreen.dart | 14 +- lib/payment/PayFastScreen.dart | 10 +- lib/payment/midtrans_screen.dart | 11 +- lib/payment/orangePayScreen.dart | 22 +- lib/payment/paystack/pay_stack_screen.dart | 6 +- lib/payment/xenditScreen.dart | 12 +- .../auth_screens/forgot_password_screen.dart | 19 +- lib/screen_ui/auth_screens/login_screen.dart | 33 +- .../auth_screens/mobile_login_screen.dart | 25 +- .../auth_screens/otp_verification_screen.dart | 22 +- .../auth_screens/sign_up_screen.dart | 43 +-- .../Intercity_home_screen.dart | 108 +++--- .../cab_booking_screen.dart | 143 ++++---- .../cab_coupon_code_screen.dart | 10 +- .../cab_dashboard_screen.dart | 18 +- .../cab_service_screens/cab_home_screen.dart | 17 +- .../cab_order_details.dart | 40 +-- .../cab_review_screen.dart | 20 +- .../cab_service_screens/complain_screen.dart | 16 +- .../my_cab_booking_screen.dart | 33 +- .../ecommarce/all_brand_product_screen.dart | 2 +- .../all_category_product_screen.dart | 2 +- .../dash_board_e_commerce_screen.dart | 22 +- .../ecommarce/home_e_commerce_screen.dart | 51 +-- .../address_list_screen.dart | 12 +- .../enter_manually_location.dart | 42 ++- .../location_permission_screen.dart | 19 +- .../maintenance_mode_screen.dart | 8 +- .../all_advertisement_screen.dart | 10 +- .../cart_screen/cart_screen.dart | 100 +++--- .../cart_screen/coupon_list_screen.dart | 22 +- .../cart_screen/oder_placing_screens.dart | 27 +- .../cart_screen/select_payment_screen.dart | 315 ++++++++++++------ .../cashback_screen/cashback_offers_list.dart | 10 +- .../change_language_screen.dart | 31 +- .../chat_screens/chat_screen.dart | 20 +- .../chat_screens/driver_inbox_screen.dart | 10 +- .../chat_screens/restaurant_inbox_screen.dart | 10 +- .../dash_board_screens/dash_board_screen.dart | 22 +- .../dine_in_booking_details.dart | 26 +- .../dine_in_booking_screen.dart | 18 +- .../dine_in_screeen/book_table_screen.dart | 34 +- .../dine_in_details_screen.dart | 44 +-- .../dine_in_restaurant_list_screen.dart | 2 +- .../dine_in_screeen/dine_in_screen.dart | 33 +- .../view_all_category_dine_in_screen.dart | 6 +- .../edit_profile_screen.dart | 32 +- .../favourite_screens/favourite_screen.dart | 30 +- .../forgot_password_screen.dart | 18 +- .../gift_card/gift_card_screen.dart | 36 +- .../gift_card/history_gift_card.dart | 16 +- .../gift_card/redeem_gift_card_screen.dart | 35 +- .../gift_card/select_gift_payment_screen.dart | 17 +- .../category_restaurant_screen.dart | 8 +- .../discount_restaurant_list_screen.dart | 6 +- .../home_screen/home_screen.dart | 76 ++--- .../home_screen/home_screen_two.dart | 76 ++--- .../home_screen/restaurant_list_screen.dart | 6 +- .../home_screen/story_view.dart | 8 +- .../home_screen/view_all_category_screen.dart | 6 +- .../live_tracking_screen.dart | 6 +- .../order_details_screen.dart | 75 ++--- .../order_list_screen/order_screen.dart | 43 +-- .../profile_screen/profile_screen.dart | 95 +++--- .../rate_us_screen/rate_product_screen.dart | 27 +- .../refer_friend_screen.dart | 22 +- .../restaurant_details_screen.dart | 86 +++-- .../review_list_screen.dart | 10 +- .../scan_qr_code_screen.dart | 12 +- .../search_screen/search_screen.dart | 20 +- .../terms_and_condition_screen.dart | 6 +- .../wallet_screen/payment_list_screen.dart | 22 +- .../wallet_screen/wallet_screen.dart | 23 +- .../on_boarding_screen.dart | 13 +- .../favourite_ondemand_screen.dart | 21 +- .../my_booking_on_demand_screen.dart | 16 +- .../on_demand_booking_screen.dart | 58 ++-- .../on_demand_category_screen.dart | 10 +- .../on_demand_dashboard_screen.dart | 22 +- .../on_demand_details_screen.dart | 35 +- .../on_demand_home_screen.dart | 29 +- .../on_demand_order_details_screen.dart | 92 ++--- .../on_demand_payment_screen.dart | 20 +- .../on_demand_review_screen.dart | 15 +- .../provider_inbox_screen.dart | 10 +- .../on_demand_service/provider_screen.dart | 6 +- .../view_all_popular_service_screen.dart | 10 +- .../view_category_service_screen.dart | 5 +- .../worker_inbox_screen.dart | 10 +- .../parcel_service/book_parcel_screen.dart | 56 ++-- .../parcel_service/home_parcel_screen.dart | 9 +- .../parcel_service/my_booking_screen.dart | 21 +- .../order_successfully_placed.dart | 11 +- .../parcel_service/parcel_coupon_screen.dart | 12 +- .../parcel_dashboard_screen.dart | 22 +- .../parcel_order_confirmation.dart | 67 ++-- .../parcel_service/parcel_order_details.dart | 52 +-- .../parcel_service/parcel_review_screen.dart | 20 +- .../my_rental_booking_screen.dart | 21 +- .../rental_conformation_screen.dart | 36 +- .../rental_service/rental_coupon_screen.dart | 12 +- .../rental_dashboard_screen.dart | 18 +- .../rental_service/rental_home_screen.dart | 43 +-- .../rental_order_details_screen.dart | 74 ++-- .../rental_service/rental_review_screen.dart | 15 +- .../service_list_screen.dart | 28 +- .../splash_screen/splash_screen.dart | 2 +- lib/service/cart_provider.dart | 12 +- lib/service/fire_store_utils.dart | 20 +- lib/service/localization_service.dart | 39 ++- lib/themes/custom_dialog_box.dart | 12 +- lib/themes/easy_loading_config.dart | 2 +- lib/themes/round_button_border.dart | 8 +- lib/themes/round_button_fill.dart | 8 +- lib/themes/text_field_widget.dart | 7 +- lib/utils/notification_service.dart | 86 +++-- lib/utils/utils.dart | 118 +++++-- .../src/widgets/defaults/empty_screen.dart | 6 +- lib/widget/osm_map/map_controller.dart | 2 +- lib/widget/osm_map/map_picker_page.dart | 14 +- lib/widget/permission_dialog.dart | 9 +- .../place_picker/location_controller.dart | 2 +- .../place_picker/location_picker_screen.dart | 6 +- .../story_view/widgets/story_image.dart | 61 ++-- pubspec.lock | 24 -- pubspec.yaml | 3 +- 218 files changed, 2535 insertions(+), 2313 deletions(-) rename assets/translations/{en-US.json => en.json} (100%) rename assets/translations/{ru-RU.json => ru.json} (100%) rename assets/translations/{uz-UZ.json => uz.json} (100%) diff --git a/assets/translations/en-US.json b/assets/translations/en.json similarity index 100% rename from assets/translations/en-US.json rename to assets/translations/en.json diff --git a/assets/translations/ru-RU.json b/assets/translations/ru.json similarity index 100% rename from assets/translations/ru-RU.json rename to assets/translations/ru.json diff --git a/assets/translations/uz-UZ.json b/assets/translations/uz.json similarity index 100% rename from assets/translations/uz-UZ.json rename to assets/translations/uz.json diff --git a/lib/constant/constant.dart b/lib/constant/constant.dart index 6becfc0..10c4e2e 100644 --- a/lib/constant/constant.dart +++ b/lib/constant/constant.dart @@ -19,7 +19,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:geolocator/geolocator.dart' as geolocator; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:intl/intl.dart'; import 'package:mailer/mailer.dart'; diff --git a/lib/controllers/0n_demand_payment_controller.dart b/lib/controllers/0n_demand_payment_controller.dart index e53d848..069ee50 100644 --- a/lib/controllers/0n_demand_payment_controller.dart +++ b/lib/controllers/0n_demand_payment_controller.dart @@ -1,7 +1,8 @@ import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:customer/utils/app_router.dart'; + +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import '../../models/onprovider_order_model.dart'; import '../models/wallet_transaction_model.dart'; @@ -75,7 +76,7 @@ class OnDemandPaymentController extends GetxController { Future placeOrder() async { if (!isExtra) { // Normal Order - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); onDemandOrderModel.value?.payment_method = selectedPaymentMethod.value; onDemandOrderModel.value?.paymentStatus = @@ -111,7 +112,7 @@ class OnDemandPaymentController extends GetxController { ); } - ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); + ShowToastDialog.showToast("OnDemand Service successfully booked".tr); } if (selectedPaymentMethod.value == PaymentGateway.wallet.name) { WalletTransactionModel transactionModel = WalletTransactionModel( @@ -123,8 +124,8 @@ class OnDemandPaymentController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: onDemandOrderModel.value!.id, - note: "Booking Amount debited".tr(), - paymentStatus: "success".tr(), + note: "Booking Amount debited".tr, + paymentStatus: "success".tr, ); await FireStoreUtils.setWalletTransaction(transactionModel).then(( @@ -161,7 +162,7 @@ class OnDemandPaymentController extends GetxController { isTopup: false, orderId: onDemandOrderModel.value!.id, note: "Booking Extra charge debited", - paymentStatus: "success".tr(), + paymentStatus: "success".tr, ); await FireStoreUtils.setWalletTransaction(transactionModel).then(( @@ -189,7 +190,7 @@ class OnDemandPaymentController extends GetxController { isTopup: true, orderId: onDemandOrderModel.value?.id, note: 'Extra Charge Amount Credited', - paymentStatus: "success".tr(), + paymentStatus: "success".tr, ); await FireStoreUtils.setWalletTransaction(transactionModel).then(( @@ -321,7 +322,7 @@ class OnDemandPaymentController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -354,7 +355,7 @@ class OnDemandPaymentController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); }); } on StripeException catch (e) { @@ -437,10 +438,10 @@ class OnDemandPaymentController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -472,15 +473,15 @@ class OnDemandPaymentController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -507,15 +508,15 @@ class OnDemandPaymentController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -557,10 +558,10 @@ class OnDemandPaymentController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -594,11 +595,11 @@ class OnDemandPaymentController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -743,7 +744,7 @@ class OnDemandPaymentController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -780,18 +781,18 @@ class OnDemandPaymentController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -809,10 +810,10 @@ class OnDemandPaymentController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -853,7 +854,7 @@ class OnDemandPaymentController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -901,12 +902,12 @@ class OnDemandPaymentController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -934,7 +935,7 @@ class OnDemandPaymentController extends GetxController { accessToken = responseData['access_token'] ?? ''; if (accessToken.isEmpty) { - ShowToastDialog.showToast("Failed to get access token".tr()); + ShowToastDialog.showToast("Failed to get access token".tr); return ''; } @@ -946,7 +947,7 @@ class OnDemandPaymentController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1001,7 +1002,7 @@ class OnDemandPaymentController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1029,13 +1030,13 @@ class OnDemandPaymentController extends GetxController { // () => OrangeMoneyScreen(initialURl: paymentURL, accessToken: accessToken, amount: amount, orangePay: orangeMoneyModel.value, orderId: orderId, payToken: payToken), // )!.then((value) { // if (value == true) { - // ShowToastDialog.showToast("Payment Successful!!".tr()); + // ShowToastDialog.showToast("Payment Successful!!".tr); // placeOrder(); // (); // } // }); // } else { - // ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + // ShowToastDialog.showToast("Payment Unsuccessful!!".tr); // } // } // @@ -1058,7 +1059,7 @@ class OnDemandPaymentController extends GetxController { // // ignore: use_build_context_synchronously // return await webpayment(context: context, amountData: amount, currency: currency, orderIdData: orderId); // } else { - // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); // return ''; // } // } @@ -1099,7 +1100,7 @@ class OnDemandPaymentController extends GetxController { // return ''; // } // } else { - // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr()); + // ShowToastDialog.showToast("Something went wrong, please contact admin.".tr); // return ''; // } // } @@ -1124,11 +1125,11 @@ class OnDemandPaymentController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/Intercity_home_controller.dart b/lib/controllers/Intercity_home_controller.dart index ba768de..5528c5e 100644 --- a/lib/controllers/Intercity_home_controller.dart +++ b/lib/controllers/Intercity_home_controller.dart @@ -42,13 +42,13 @@ import 'package:customer/payment/xenditScreen.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:http/http.dart' as http; import 'package:latlong2/latlong.dart' as latlong; @@ -402,7 +402,7 @@ class IntercityHomeController extends GetxController { Marker( markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), - infoWindow: InfoWindow(title: "Pickup Location".tr()), + infoWindow: InfoWindow(title: "Pickup Location".tr), icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue( @@ -412,7 +412,7 @@ class IntercityHomeController extends GetxController { Marker( markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), - infoWindow: InfoWindow(title: "Driver at Pickup".tr()), + infoWindow: InfoWindow(title: "Driver at Pickup".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), ]); @@ -421,7 +421,7 @@ class IntercityHomeController extends GetxController { Marker( markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), - infoWindow: InfoWindow(title: "Destination Location".tr()), + infoWindow: InfoWindow(title: "Destination Location".tr), icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue( @@ -431,7 +431,7 @@ class IntercityHomeController extends GetxController { Marker( markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), - infoWindow: InfoWindow(title: "Driver Location".tr()), + infoWindow: InfoWindow(title: "Driver Location".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), ]); @@ -536,7 +536,7 @@ class IntercityHomeController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { currentOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr()); + ShowToastDialog.showToast("Payment method changed".tr); Get.back(); Get.back(); }); @@ -557,8 +557,8 @@ class IntercityHomeController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: currentOrder.value.id, - note: "Cab Amount debited".tr(), - paymentStatus: "success".tr(), + note: "Cab Amount debited".tr, + paymentStatus: "success".tr, serviceType: Constant.parcelServiceType, ); @@ -575,7 +575,7 @@ class IntercityHomeController extends GetxController { } await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); Get.back(); }); } @@ -743,7 +743,7 @@ class IntercityHomeController extends GetxController { final LatLng pos = LatLng(lat, lng); final markerId = MarkerId(isDeparture ? 'Departure' : 'Destination'); final icon = isDeparture ? departureIcon! : destinationIcon!; - final title = isDeparture ? 'Departure'.tr() : 'Destination'.tr(); + final title = isDeparture ? 'Departure'.tr : 'Destination'.tr; if (isDeparture) { departureLatLong.value = pos; @@ -1371,7 +1371,7 @@ class IntercityHomeController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -1404,7 +1404,7 @@ class IntercityHomeController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); }); } on StripeException catch (e) { @@ -1487,10 +1487,10 @@ class IntercityHomeController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -1522,15 +1522,15 @@ class IntercityHomeController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -1557,15 +1557,15 @@ class IntercityHomeController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -1607,10 +1607,10 @@ class IntercityHomeController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -1644,11 +1644,11 @@ class IntercityHomeController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -1776,7 +1776,7 @@ class IntercityHomeController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -1813,18 +1813,18 @@ class IntercityHomeController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -1842,10 +1842,10 @@ class IntercityHomeController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -1886,7 +1886,7 @@ class IntercityHomeController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -1929,13 +1929,13 @@ class IntercityHomeController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -1973,7 +1973,7 @@ class IntercityHomeController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -2024,7 +2024,7 @@ class IntercityHomeController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -2050,11 +2050,11 @@ class IntercityHomeController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/address_list_controller.dart b/lib/controllers/address_list_controller.dart index ef1b6a2..7efd69a 100644 --- a/lib/controllers/address_list_controller.dart +++ b/lib/controllers/address_list_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/models/user_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/constant.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/advertisement_list_controller.dart b/lib/controllers/advertisement_list_controller.dart index a8f0e65..56ae63b 100644 --- a/lib/controllers/advertisement_list_controller.dart +++ b/lib/controllers/advertisement_list_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/advertisement_model.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class AdvertisementListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/all_brand_product_controller.dart b/lib/controllers/all_brand_product_controller.dart index 8a8867a..f167094 100644 --- a/lib/controllers/all_brand_product_controller.dart +++ b/lib/controllers/all_brand_product_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/brands_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class AllBrandProductController extends GetxController { RxList productList = [].obs; diff --git a/lib/controllers/all_category_product_controller.dart b/lib/controllers/all_category_product_controller.dart index d609ade..a1fe34f 100644 --- a/lib/controllers/all_category_product_controller.dart +++ b/lib/controllers/all_category_product_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class AllCategoryProductController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/book_parcel_controller.dart b/lib/controllers/book_parcel_controller.dart index e7d25e1..3dcf92f 100644 --- a/lib/controllers/book_parcel_controller.dart +++ b/lib/controllers/book_parcel_controller.dart @@ -3,12 +3,12 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart'; import 'package:dropdown_textfield/dropdown_textfield.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart' as latlong; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; @@ -124,12 +124,12 @@ class BookParcelController extends GetxController { void onCameraClick(BuildContext context) { final action = CupertinoActionSheet( message: Text( - 'Add your parcel image.'.tr(), + 'Add your parcel image.'.tr, style: const TextStyle(fontSize: 15.0), ), actions: [ CupertinoActionSheetAction( - child: Text('Choose image from gallery'.tr()), + child: Text('Choose image from gallery'.tr), onPressed: () async { Navigator.pop(context); final imageList = await _picker.pickMultiImage(); @@ -139,7 +139,7 @@ class BookParcelController extends GetxController { }, ), CupertinoActionSheetAction( - child: Text('Take a picture'.tr()), + child: Text('Take a picture'.tr), onPressed: () async { Navigator.pop(context); final XFile? photo = await _picker.pickImage( @@ -152,7 +152,7 @@ class BookParcelController extends GetxController { ), ], cancelButton: CupertinoActionSheetAction( - child: Text('Cancel'.tr()), + child: Text('Cancel'.tr), onPressed: () => Navigator.pop(context), ), ); @@ -184,39 +184,39 @@ class BookParcelController extends GetxController { bool validateFields() { if (senderNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter sender name".tr()); + ShowToastDialog.showToast("Please enter sender name".tr); return false; } else if (senderMobileController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter sender mobile".tr()); + ShowToastDialog.showToast("Please enter sender mobile".tr); return false; } else if (senderLocationController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter sender address".tr()); + ShowToastDialog.showToast("Please enter sender address".tr); return false; } else if (receiverNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter receiver name".tr()); + ShowToastDialog.showToast("Please enter receiver name".tr); return false; } else if (receiverMobileController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter receiver mobile".tr()); + ShowToastDialog.showToast("Please enter receiver mobile".tr); return false; } else if (receiverLocationController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter receiver address".tr()); + ShowToastDialog.showToast("Please enter receiver address".tr); return false; } else if (isScheduled.value) { if (scheduledDate.value.isEmpty) { - ShowToastDialog.showToast("Please select scheduled date".tr()); + ShowToastDialog.showToast("Please select scheduled date".tr); return false; } else if (scheduledTime.value.isEmpty) { - ShowToastDialog.showToast("Please select scheduled time".tr()); + ShowToastDialog.showToast("Please select scheduled time".tr); return false; } } if (selectedWeight == null) { - ShowToastDialog.showToast("Please select parcel weight".tr()); + ShowToastDialog.showToast("Please select parcel weight".tr); return false; } else if (senderLocation.value == null || receiverLocation.value == null) { ShowToastDialog.showToast( - "Please select both sender and receiver locations".tr(), + "Please select both sender and receiver locations".tr, ); return false; } @@ -254,7 +254,7 @@ class BookParcelController extends GetxController { if (distance.value < 0.5) { ShowToastDialog.showToast( "Sender's location to receiver's location should be more than 1 km." - .tr(), + .tr, ); return; } @@ -264,7 +264,7 @@ class BookParcelController extends GetxController { double.parse(selectedWeight!.deliveryCharge.toString())); goToCart(); } catch (e) { - ShowToastDialog.showToast("Something went wrong while booking.".tr()); + ShowToastDialog.showToast("Something went wrong while booking.".tr); debugPrint("bookNow error: $e"); } } diff --git a/lib/controllers/cab_booking_controller.dart b/lib/controllers/cab_booking_controller.dart index ccd500c..f894af3 100644 --- a/lib/controllers/cab_booking_controller.dart +++ b/lib/controllers/cab_booking_controller.dart @@ -40,13 +40,13 @@ import 'package:customer/payment/xenditScreen.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:http/http.dart' as http; import 'package:latlong2/latlong.dart' as latlong; @@ -393,7 +393,7 @@ class CabBookingController extends GetxController { Marker( markerId: const MarkerId("pickup"), position: LatLng(pickupLat, pickupLng), - infoWindow: InfoWindow(title: "Pickup Location".tr()), + infoWindow: InfoWindow(title: "Pickup Location".tr), icon: departureIcon ?? BitmapDescriptor.defaultMarkerWithHue( @@ -403,7 +403,7 @@ class CabBookingController extends GetxController { Marker( markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), - infoWindow: InfoWindow(title: "Driver at Pickup".tr()), + infoWindow: InfoWindow(title: "Driver at Pickup".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), ]); @@ -412,7 +412,7 @@ class CabBookingController extends GetxController { Marker( markerId: const MarkerId("destination"), position: LatLng(destLat, destLng), - infoWindow: InfoWindow(title: "Destination Location".tr()), + infoWindow: InfoWindow(title: "Destination Location".tr), icon: destinationIcon ?? BitmapDescriptor.defaultMarkerWithHue( @@ -422,7 +422,7 @@ class CabBookingController extends GetxController { Marker( markerId: const MarkerId("driver"), position: LatLng(driverLat, driverLng), - infoWindow: InfoWindow(title: "Driver Location".tr()), + infoWindow: InfoWindow(title: "Driver Location".tr), icon: taxiIcon ?? BitmapDescriptor.defaultMarker, ), ]); @@ -527,7 +527,7 @@ class CabBookingController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { currentOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr()); + ShowToastDialog.showToast("Payment method changed".tr); Get.back(); Get.back(); }); @@ -566,7 +566,7 @@ class CabBookingController extends GetxController { } await FireStoreUtils.cabOrderPlace(currentOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); Get.back(); }); } @@ -699,7 +699,7 @@ class CabBookingController extends GetxController { Marker( markerId: markerId, infoWindow: InfoWindow( - title: '${'Stop'.tr()} ${String.fromCharCode(index + 65)}', + title: '${'Stop'.tr} ${String.fromCharCode(index + 65)}', ), position: LatLng(lat, lng), icon: stopIcon!, @@ -734,7 +734,7 @@ class CabBookingController extends GetxController { final LatLng pos = LatLng(lat, lng); final markerId = MarkerId(isDeparture ? 'Departure' : 'Destination'); final icon = isDeparture ? departureIcon! : destinationIcon!; - final title = isDeparture ? 'Departure'.tr() : 'Destination'.tr(); + final title = isDeparture ? 'Departure'.tr : 'Destination'.tr; if (isDeparture) { departureLatLong.value = pos; @@ -1362,7 +1362,7 @@ class CabBookingController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -1395,7 +1395,7 @@ class CabBookingController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); }); } on StripeException catch (e) { @@ -1478,10 +1478,10 @@ class CabBookingController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -1513,15 +1513,15 @@ class CabBookingController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -1548,15 +1548,15 @@ class CabBookingController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -1598,10 +1598,10 @@ class CabBookingController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -1635,11 +1635,11 @@ class CabBookingController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -1767,7 +1767,7 @@ class CabBookingController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -1804,18 +1804,18 @@ class CabBookingController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -1833,10 +1833,10 @@ class CabBookingController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -1877,7 +1877,7 @@ class CabBookingController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -1920,13 +1920,13 @@ class CabBookingController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -1964,7 +1964,7 @@ class CabBookingController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -2015,7 +2015,7 @@ class CabBookingController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -2041,11 +2041,11 @@ class CabBookingController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/cab_coupon_code_controller.dart b/lib/controllers/cab_coupon_code_controller.dart index 2da0007..12dc0e1 100644 --- a/lib/controllers/cab_coupon_code_controller.dart +++ b/lib/controllers/cab_coupon_code_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class CabCouponCodeController extends GetxController { // Add your methods and properties here diff --git a/lib/controllers/cab_dashboard_controller.dart b/lib/controllers/cab_dashboard_controller.dart index 24e33cf..dc8e92a 100644 --- a/lib/controllers/cab_dashboard_controller.dart +++ b/lib/controllers/cab_dashboard_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/cab_service_screens/cab_home_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../screen_ui/cab_service_screens/my_cab_booking_screen.dart'; class CabDashboardController extends GetxController { diff --git a/lib/controllers/cab_home_controller.dart b/lib/controllers/cab_home_controller.dart index 8ece16f..ba4361c 100644 --- a/lib/controllers/cab_home_controller.dart +++ b/lib/controllers/cab_home_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/banner_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class CabHomeController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/cab_order_details_controller.dart b/lib/controllers/cab_order_details_controller.dart index e2f5e3b..a16cdfd 100644 --- a/lib/controllers/cab_order_details_controller.dart +++ b/lib/controllers/cab_order_details_controller.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/rating_model.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap; import 'package:latlong2/latlong.dart' as osm; diff --git a/lib/controllers/cab_rental_dashboard_controllers.dart b/lib/controllers/cab_rental_dashboard_controllers.dart index 1e0eda6..c7f5b95 100644 --- a/lib/controllers/cab_rental_dashboard_controllers.dart +++ b/lib/controllers/cab_rental_dashboard_controllers.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/rental_service/rental_home_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../screen_ui/rental_service/my_rental_booking_screen.dart'; class CabRentalDashboardControllers extends GetxController { diff --git a/lib/controllers/cab_review_controller.dart b/lib/controllers/cab_review_controller.dart index e5218bb..baa473b 100644 --- a/lib/controllers/cab_review_controller.dart +++ b/lib/controllers/cab_review_controller.dart @@ -1,8 +1,8 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/cab_order_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/collection_name.dart'; import '../models/rating_model.dart'; import '../models/user_model.dart'; @@ -73,11 +73,11 @@ class CabReviewController extends GetxController { /// Save / update review Future submitReview() async { if (comment.value.text.trim().isEmpty || ratings.value == 0) { - ShowToastDialog.showToast("Please provide rating and comment".tr()); + ShowToastDialog.showToast("Please provide rating and comment".tr); return; } - ShowToastDialog.showLoader("Submit in...".tr()); + ShowToastDialog.showLoader("Submit in...".tr); final user = await FireStoreUtils.getUserProfile( order.value?.driverId ?? '', diff --git a/lib/controllers/cart_controller.dart b/lib/controllers/cart_controller.dart index 5dc45ff..28f87e3 100644 --- a/lib/controllers/cart_controller.dart +++ b/lib/controllers/cart_controller.dart @@ -13,11 +13,11 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -416,7 +416,7 @@ class CartController extends GetxController { setOrder(); } else { ShowToastDialog.showToast( - "You don't have sufficient wallet balance to place order".tr(), + "You don't have sufficient wallet balance to place order".tr, ); } } else { @@ -425,7 +425,7 @@ class CartController extends GetxController { } Future setOrder() async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && @@ -438,7 +438,7 @@ class CartController extends GetxController { ShowToastDialog.closeLoader(); ShowToastDialog.showToast( "This vendor has reached their maximum order capacity. Please select a different vendor or try again later." - .tr(), + .tr, ); return; } @@ -508,8 +508,8 @@ class CartController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: orderModel.id, - note: "Order Amount debited".tr(), - paymentStatus: "success".tr(), + note: "Order Amount debited".tr, + paymentStatus: "success".tr, ); await FireStoreUtils.setWalletTransaction(transactionModel).then(( @@ -712,7 +712,7 @@ class CartController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -745,7 +745,7 @@ class CartController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); }); } on StripeException catch (e) { @@ -828,10 +828,10 @@ class CartController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -863,15 +863,15 @@ class CartController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -898,15 +898,15 @@ class CartController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -948,10 +948,10 @@ class CartController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -985,11 +985,11 @@ class CartController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -1134,7 +1134,7 @@ class CartController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -1170,18 +1170,18 @@ class CartController extends GetxController { } void handlePaymentSuccess(PaymentSuccessResponse response) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -1199,10 +1199,10 @@ class CartController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -1243,7 +1243,7 @@ class CartController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -1286,13 +1286,13 @@ class CartController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -1330,7 +1330,7 @@ class CartController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1381,7 +1381,7 @@ class CartController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1407,11 +1407,11 @@ class CartController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/cashback_controller.dart b/lib/controllers/cashback_controller.dart index 786fa55..43aa518 100644 --- a/lib/controllers/cashback_controller.dart +++ b/lib/controllers/cashback_controller.dart @@ -1,5 +1,5 @@ import '../models/cashback_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../service/fire_store_utils.dart'; class CashbackController extends GetxController { diff --git a/lib/controllers/category_restaurant_controller.dart b/lib/controllers/category_restaurant_controller.dart index a80b92b..dbf3077 100644 --- a/lib/controllers/category_restaurant_controller.dart +++ b/lib/controllers/category_restaurant_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/vendor_category_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class CategoryRestaurantController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/change_language_controller.dart b/lib/controllers/change_language_controller.dart index 82be122..2b89879 100644 --- a/lib/controllers/change_language_controller.dart +++ b/lib/controllers/change_language_controller.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/language_model.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/collection_name.dart'; class ChangeLanguageController extends GetxController { diff --git a/lib/controllers/chat_controller.dart b/lib/controllers/chat_controller.dart index c0e2925..1923bef 100644 --- a/lib/controllers/chat_controller.dart +++ b/lib/controllers/chat_controller.dart @@ -1,13 +1,13 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:image_picker/image_picker.dart'; import '../models/conversation_model.dart'; import '../models/inbox_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:uuid/uuid.dart'; import '../service/send_notification.dart'; @@ -104,11 +104,11 @@ class ChatController extends GetxController { if (url != null) { if (url.mime.contains('image')) { - conversationModel.message = "sent a message".tr(); + conversationModel.message = "sent a message".tr; } else if (url.mime.contains('video')) { - conversationModel.message = "Sent a video".tr(); + conversationModel.message = "Sent a video".tr; } else if (url.mime.contains('audio')) { - conversationModel.message = "Sent a audio".tr(); + conversationModel.message = "Sent a audio".tr; } } @@ -152,7 +152,7 @@ class ChatController extends GetxController { // sendMessage('', url, '', 'image'); // Get.back(); // } on PlatformException catch (e) { - // ShowToastDialog.showToast("${"failed_to_pick".tr()} : \n $e"); + // ShowToastDialog.showToast("${"failed_to_pick".tr} : \n $e"); // } // } } diff --git a/lib/controllers/complain_controller.dart b/lib/controllers/complain_controller.dart index 45367eb..5fa362e 100644 --- a/lib/controllers/complain_controller.dart +++ b/lib/controllers/complain_controller.dart @@ -1,6 +1,5 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/cab_order_model.dart'; import '../service/fire_store_utils.dart'; import '../themes/show_toast_dialog.dart'; @@ -22,7 +21,7 @@ class ComplainController extends GetxController { order.value = args['order'] as CabOrderModel; getComplain(); } else { - ShowToastDialog.showToast("Order data not found".tr()); + ShowToastDialog.showToast("Order data not found".tr); Get.back(); } } @@ -38,7 +37,7 @@ class ComplainController extends GetxController { comment.value.text = data['description'] ?? ''; } } catch (e) { - ShowToastDialog.showToast("Failed to load complaint".tr()); + ShowToastDialog.showToast("Failed to load complaint".tr); } finally { isLoading.value = false; } @@ -47,12 +46,12 @@ class ComplainController extends GetxController { Future submitComplain() async { // Validation if (title.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter complaint title".tr()); + ShowToastDialog.showToast("Please enter complaint title".tr); return; } if (comment.value.text.trim().isEmpty) { - ShowToastDialog.showToast("Please enter complaint description".tr()); + ShowToastDialog.showToast("Please enter complaint description".tr); return; } @@ -82,16 +81,16 @@ class ComplainController extends GetxController { ShowToastDialog.closeLoader(); ShowToastDialog.showToast( - "Your complaint has been submitted to admin".tr(), + "Your complaint has been submitted to admin".tr, ); Get.back(); } else { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Your complaint is already submitted".tr()); + ShowToastDialog.showToast("Your complaint is already submitted".tr); } } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong, please try again".tr()); + ShowToastDialog.showToast("Something went wrong, please try again".tr); } finally { isLoading.value = false; } diff --git a/lib/controllers/dash_board_controller.dart b/lib/controllers/dash_board_controller.dart index 405df62..f336ca5 100644 --- a/lib/controllers/dash_board_controller.dart +++ b/lib/controllers/dash_board_controller.dart @@ -6,7 +6,7 @@ import '../screen_ui/multi_vendor_service/order_list_screen/order_screen.dart'; import '../screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class DashBoardController extends GetxController { RxInt selectedIndex = 0.obs; diff --git a/lib/controllers/dash_board_ecommarce_controller.dart b/lib/controllers/dash_board_ecommarce_controller.dart index 647f120..b690994 100644 --- a/lib/controllers/dash_board_ecommarce_controller.dart +++ b/lib/controllers/dash_board_ecommarce_controller.dart @@ -5,7 +5,7 @@ import '../screen_ui/multi_vendor_service/order_list_screen/order_screen.dart'; import '../screen_ui/multi_vendor_service/profile_screen/profile_screen.dart'; import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class DashBoardEcommerceController extends GetxController { RxInt selectedIndex = 0.obs; diff --git a/lib/controllers/dine_in_booking_controller.dart b/lib/controllers/dine_in_booking_controller.dart index 4f31c69..482e3cd 100644 --- a/lib/controllers/dine_in_booking_controller.dart +++ b/lib/controllers/dine_in_booking_controller.dart @@ -1,6 +1,6 @@ import '../models/dine_in_booking_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class DineInBookingController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/dine_in_booking_details_controller.dart b/lib/controllers/dine_in_booking_details_controller.dart index 9332e76..994420c 100644 --- a/lib/controllers/dine_in_booking_details_controller.dart +++ b/lib/controllers/dine_in_booking_details_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/models/dine_in_booking_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class DineInBookingDetailsController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/dine_in_controller.dart b/lib/controllers/dine_in_controller.dart index 57c6524..d4d5339 100644 --- a/lib/controllers/dine_in_controller.dart +++ b/lib/controllers/dine_in_controller.dart @@ -7,7 +7,7 @@ import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/banner_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class DineInController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/dine_in_restaurant_details_controller.dart b/lib/controllers/dine_in_restaurant_details_controller.dart index 5436203..a354e95 100644 --- a/lib/controllers/dine_in_restaurant_details_controller.dart +++ b/lib/controllers/dine_in_restaurant_details_controller.dart @@ -4,11 +4,11 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/dine_in_booking_model.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import '../screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../service/send_notification.dart'; @@ -37,9 +37,9 @@ class DineInRestaurantDetailsController extends GetxController { String getLocalizedOccasion(String key) { switch (key) { case "Birthday": - return "Birthday".tr(); + return "Birthday".tr; case "Anniversary": - return "Anniversary".tr(); + return "Anniversary".tr; default: return key; } @@ -65,7 +65,7 @@ class DineInRestaurantDetailsController extends GetxController { } Future orderBook() async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); DateTime dt = selectedDate.value.toDate(); String hour = DateFormat("kk:mm").format( @@ -118,7 +118,7 @@ class DineInRestaurantDetailsController extends GetxController { ShowToastDialog.closeLoader(); Get.back(); Get.to(const DineInBookingScreen()); - ShowToastDialog.showToast('Dine-In Request submitted successfully.'.tr()); + ShowToastDialog.showToast('Dine-In Request submitted successfully.'.tr); } void getRecord() { diff --git a/lib/controllers/discount_restaurant_list_controller.dart b/lib/controllers/discount_restaurant_list_controller.dart index bc5b12e..4b01083 100644 --- a/lib/controllers/discount_restaurant_list_controller.dart +++ b/lib/controllers/discount_restaurant_list_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/vendor_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class DiscountRestaurantListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/edit_profile_controller.dart b/lib/controllers/edit_profile_controller.dart index 6fc4203..12c2fd4 100644 --- a/lib/controllers/edit_profile_controller.dart +++ b/lib/controllers/edit_profile_controller.dart @@ -1,11 +1,11 @@ import 'dart:io'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import '../themes/show_toast_dialog.dart'; @@ -48,7 +48,7 @@ class EditProfileController extends GetxController { } Future saveData() async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); if (Constant().hasValidUrl(profileImage.value) == false && profileImage.value.isNotEmpty) { profileImage.value = await Constant.uploadUserImageToFireStorage( @@ -78,7 +78,7 @@ class EditProfileController extends GetxController { Get.back(); profileImage.value = image.path; } on PlatformException catch (e) { - ShowToastDialog.showToast("${"failed_to_pick".tr()} : \n $e"); + ShowToastDialog.showToast("${"failed_to_pick".tr} : \n $e"); } } } diff --git a/lib/controllers/enter_manually_location_controller.dart b/lib/controllers/enter_manually_location_controller.dart index 6a7382d..8711cc5 100644 --- a/lib/controllers/enter_manually_location_controller.dart +++ b/lib/controllers/enter_manually_location_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/service/fire_store_utils.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/user_model.dart'; class EnterManuallyLocationController extends GetxController { @@ -76,13 +76,13 @@ class EnterManuallyLocationController extends GetxController { String getLocalizedSaveAs(String key) { switch (key) { case 'Home': - return 'Home'.tr(); + return 'Home'.tr; case 'Work': - return 'Work'.tr(); + return 'Work'.tr; case 'Hotel': - return 'Hotel'.tr(); + return 'Hotel'.tr; case 'Other': - return 'Other'.tr(); + return 'Other'.tr; default: return key; } diff --git a/lib/controllers/favourite_controller.dart b/lib/controllers/favourite_controller.dart index b150298..e2c3b8c 100644 --- a/lib/controllers/favourite_controller.dart +++ b/lib/controllers/favourite_controller.dart @@ -5,7 +5,7 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class FavouriteController extends GetxController { RxBool favouriteRestaurant = true.obs; diff --git a/lib/controllers/favourite_ondemmand_controller.dart b/lib/controllers/favourite_ondemmand_controller.dart index 19174cf..5210822 100644 --- a/lib/controllers/favourite_ondemmand_controller.dart +++ b/lib/controllers/favourite_ondemmand_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/favorite_ondemand_service_model.dart'; import 'package:customer/models/provider_serivce_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class FavouriteOndemmandController extends GetxController { // Add your controller logic here diff --git a/lib/controllers/food_home_controller.dart b/lib/controllers/food_home_controller.dart index 2ffdf08..095a6e5 100644 --- a/lib/controllers/food_home_controller.dart +++ b/lib/controllers/food_home_controller.dart @@ -9,9 +9,9 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/banner_model.dart'; import '../models/story_model.dart'; @@ -33,7 +33,7 @@ class FoodHomeController extends GetxController { RxBool isLoading = true.obs; RxBool isListView = true.obs; RxBool isPopular = true.obs; - RxString selectedOrderTypeValue = "Delivery".tr().obs; + RxString selectedOrderTypeValue = "Delivery".tr.obs; Rx pageController = PageController(viewportFraction: 0.877).obs; diff --git a/lib/controllers/forgot_password_controller.dart b/lib/controllers/forgot_password_controller.dart index 4b84ad8..3936731 100644 --- a/lib/controllers/forgot_password_controller.dart +++ b/lib/controllers/forgot_password_controller.dart @@ -1,7 +1,6 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../themes/show_toast_dialog.dart'; class ForgotPasswordController extends GetxController { @@ -12,32 +11,29 @@ class ForgotPasswordController extends GetxController { final email = emailEditingController.value.text.trim(); if (email.isEmpty) { - ShowToastDialog.showToast("Please enter your email address.".tr()); + ShowToastDialog.showToast("Please enter your email address.".tr); return; } if (!GetUtils.isEmail(email)) { - ShowToastDialog.showToast("Please enter a valid email address.".tr()); + ShowToastDialog.showToast("Please enter a valid email address.".tr); return; } try { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); await FirebaseAuth.instance.sendPasswordResetEmail(email: email); ShowToastDialog.closeLoader(); ShowToastDialog.showToast( - 'reset_password_link_sent'.tr(namedArgs: {'email': email}) - + 'reset_password_link_sent'.trParams({'email': email}), ); Get.back(); } on FirebaseAuthException catch (e) { ShowToastDialog.closeLoader(); if (e.code == 'user-not-found') { - ShowToastDialog.showToast('No user found for that email.'.tr()); + ShowToastDialog.showToast('No user found for that email.'.tr); } else { - ShowToastDialog.showToast( - e.message?.tr() ?? "something_went_wrong".tr(), - ); + ShowToastDialog.showToast(e.message?.tr ?? "something_went_wrong".tr); } } } diff --git a/lib/controllers/gift_card_controller.dart b/lib/controllers/gift_card_controller.dart index 0acedfe..c724901 100644 --- a/lib/controllers/gift_card_controller.dart +++ b/lib/controllers/gift_card_controller.dart @@ -6,7 +6,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/gift_cards_model.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -42,7 +42,7 @@ import '../screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:uuid/uuid.dart'; @@ -99,7 +99,7 @@ class GiftCardController extends GetxController { setOrder(); } else { ShowToastDialog.showToast( - "You don't have sufficient wallet balance to purchase gift card".tr(), + "You don't have sufficient wallet balance to purchase gift card".tr, ); } } else { @@ -108,7 +108,7 @@ class GiftCardController extends GetxController { } Future setOrder() async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); GiftCardsOrderModel giftCardsOrderModel = GiftCardsOrderModel(); giftCardsOrderModel.id = const Uuid().v4(); giftCardsOrderModel.giftId = selectedGiftCard.value.id.toString(); @@ -136,8 +136,8 @@ class GiftCardController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: giftCardsOrderModel.id, - note: "Gift card purchase amount debited".tr(), - paymentStatus: "success".tr(), + note: "Gift card purchase amount debited".tr, + paymentStatus: "success".tr, ); await FireStoreUtils.setWalletTransaction(transactionModel).then(( @@ -154,7 +154,7 @@ class GiftCardController extends GetxController { await FireStoreUtils.placeGiftCardOrder(giftCardsOrderModel); ShowToastDialog.closeLoader(); Get.off(const HistoryGiftCard()); - ShowToastDialog.showToast("Gift card Purchases successfully".tr()); + ShowToastDialog.showToast("Gift card Purchases successfully".tr); } String generateGiftCode() { @@ -371,7 +371,7 @@ class GiftCardController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); }); } on StripeException catch (e) { @@ -454,10 +454,10 @@ class GiftCardController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -486,15 +486,15 @@ class GiftCardController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -536,10 +536,10 @@ class GiftCardController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -573,11 +573,11 @@ class GiftCardController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -605,15 +605,15 @@ class GiftCardController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -759,7 +759,7 @@ class GiftCardController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -796,18 +796,18 @@ class GiftCardController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } //Midtrans payment @@ -820,10 +820,10 @@ class GiftCardController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -864,7 +864,7 @@ class GiftCardController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -907,13 +907,13 @@ class GiftCardController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -951,7 +951,7 @@ class GiftCardController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1002,7 +1002,7 @@ class GiftCardController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1028,11 +1028,11 @@ class GiftCardController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/global_setting_controller.dart b/lib/controllers/global_setting_controller.dart index 0eba1f1..1efe160 100644 --- a/lib/controllers/global_setting_controller.dart +++ b/lib/controllers/global_setting_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/currency_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/utils/notification_service.dart'; import 'package:firebase_auth/firebase_auth.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/collection_name.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/history_gift_card_controller.dart b/lib/controllers/history_gift_card_controller.dart index d11c857..14d749c 100644 --- a/lib/controllers/history_gift_card_controller.dart +++ b/lib/controllers/history_gift_card_controller.dart @@ -1,10 +1,10 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/gift_cards_order_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:share_plus/share_plus.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class HistoryGiftCardController extends GetxController { RxList giftCardsOrderList = [].obs; @@ -40,7 +40,7 @@ class HistoryGiftCardController extends GetxController { Timestamp date, ) async { await Share.share( - "${'Gift Code :'.tr()} $giftCode\n${'Gift Pin :'.tr()} $giftPin\n${'Price :'.tr()} ${Constant.amountShow(amount: amount)}\n${'Expire Date :'.tr()} ${date.toDate()}\n\n${'Message'.tr()} : $msg", + "${'Gift Code :'.tr} $giftCode\n${'Gift Pin :'.tr} $giftPin\n${'Price :'.tr} ${Constant.amountShow(amount: amount)}\n${'Expire Date :'.tr} ${date.toDate()}\n\n${'Message'.tr} : $msg", ); } } diff --git a/lib/controllers/home_e_commerce_controller.dart b/lib/controllers/home_e_commerce_controller.dart index 95adb18..7571744 100644 --- a/lib/controllers/home_e_commerce_controller.dart +++ b/lib/controllers/home_e_commerce_controller.dart @@ -8,7 +8,7 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/service/cart_provider.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/constant.dart'; class HomeECommerceController extends GetxController { diff --git a/lib/controllers/home_parcel_controller.dart b/lib/controllers/home_parcel_controller.dart index f3e112f..aaccf75 100644 --- a/lib/controllers/home_parcel_controller.dart +++ b/lib/controllers/home_parcel_controller.dart @@ -1,6 +1,6 @@ import 'dart:developer'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/banner_model.dart'; import '../models/parcel_category.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/live_tracking_controller.dart b/lib/controllers/live_tracking_controller.dart index 9ec6f71..c347535 100644 --- a/lib/controllers/live_tracking_controller.dart +++ b/lib/controllers/live_tracking_controller.dart @@ -6,7 +6,7 @@ import 'package:customer/models/order_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import 'package:flutter_map/flutter_map.dart' as flutterMap; diff --git a/lib/controllers/login_controller.dart b/lib/controllers/login_controller.dart index 3af30c4..52dbfad 100644 --- a/lib/controllers/login_controller.dart +++ b/lib/controllers/login_controller.dart @@ -1,9 +1,10 @@ import 'dart:convert'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import '../constant/constant.dart'; @@ -33,18 +34,18 @@ class LoginController extends GetxController { final email = emailController.value.text.trim(); final password = passwordController.value.text.trim(); if (email.isEmpty || !email.contains('@')) { - ShowToastDialog.showToast("Please enter a valid email address".tr()); + ShowToastDialog.showToast("Please enter a valid email address".tr); return; } if (password.isEmpty) { - ShowToastDialog.showToast("Please enter your password".tr()); + ShowToastDialog.showToast("Please enter your password".tr); return; } try { isLoading.value = true; - ShowToastDialog.showLoader("Logging in...".tr()); + ShowToastDialog.showLoader("Logging in...".tr); final credential = await FirebaseAuth.instance.signInWithEmailAndPassword( email: email, @@ -69,34 +70,34 @@ class LoginController extends GetxController { Constant.selectedLocation = defaultAddress; - Get.offAll(() => const ServiceListScreen()); + Get.offAll(ServiceListScreen()); } else { - Get.offAll(() => const LocationPermissionScreen()); + Get.offAll(LocationPermissionScreen()); } } else { await FirebaseAuth.instance.signOut(); ShowToastDialog.showToast( - "This user is disabled. Please contact admin.".tr(), + "This user is disabled. Please contact admin.".tr, ); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); ShowToastDialog.showToast( - "This user does not exist in the customer app.".tr(), + "This user does not exist in the customer app.".tr, ); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } on FirebaseAuthException catch (e) { if (e.code == 'user-not-found') { - ShowToastDialog.showToast("No user found for that email.".tr()); + ShowToastDialog.showToast("No user found for that email.".tr); } else if (e.code == 'wrong-password') { - ShowToastDialog.showToast("Wrong password provided.".tr()); + ShowToastDialog.showToast("Wrong password provided.".tr); } else if (e.code == 'invalid-email') { - ShowToastDialog.showToast("Invalid email.".tr()); + ShowToastDialog.showToast("Invalid email.".tr); } else { ShowToastDialog.showToast( - e.message?.tr() ?? "Login failed. Please try again.".tr(), + e.message?.tr ?? "Login failed. Please try again.".tr, ); } } finally { @@ -106,7 +107,7 @@ class LoginController extends GetxController { } Future loginWithGoogle() async { - ShowToastDialog.showLoader("please wait...".tr()); + ShowToastDialog.showLoader("please wait...".tr); await signInWithGoogle().then((value) async { ShowToastDialog.closeLoader(); if (value != null) { @@ -148,23 +149,23 @@ class LoginController extends GetxController { Constant.selectedLocation = defaultAddress; - Get.offAll(() => const ServiceListScreen()); + Get.offAll(ServiceListScreen()); } else { - Get.offAll(() => const LocationPermissionScreen()); + Get.offAll(LocationPermissionScreen()); } } else { await FirebaseAuth.instance.signOut(); ShowToastDialog.showToast( - "This user is disabled. Please contact admin.".tr(), + "This user is disabled. Please contact admin.".tr, ); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); ShowToastDialog.showToast( - "This user does not exist in the customer app.".tr(), + "This user does not exist in the customer app.".tr, ); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } else { UserModel userModel = UserModel(); @@ -186,7 +187,7 @@ class LoginController extends GetxController { } Future loginWithApple() async { - ShowToastDialog.showLoader("please wait...".tr()); + ShowToastDialog.showLoader("please wait...".tr); await signInWithApple().then((value) async { ShowToastDialog.closeLoader(); if (value != null) { @@ -231,23 +232,23 @@ class LoginController extends GetxController { ); Constant.selectedLocation = defaultAddress; - Get.offAll(() => const ServiceListScreen()); + Get.offAll(ServiceListScreen()); } else { - Get.offAll(() => const LocationPermissionScreen()); + Get.offAll(LocationPermissionScreen()); } } else { await FirebaseAuth.instance.signOut(); ShowToastDialog.showToast( - "This user is disabled. Please contact admin.".tr(), + "This user is disabled. Please contact admin.".tr, ); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } else { await FirebaseAuth.instance.signOut(); ShowToastDialog.showToast( - "This user does not exist in the customer app.".tr(), + "This user does not exist in the customer app.".tr, ); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } else { // User not in DB → go to signup diff --git a/lib/controllers/map_view_controller.dart b/lib/controllers/map_view_controller.dart index efa346f..a7e148e 100644 --- a/lib/controllers/map_view_controller.dart +++ b/lib/controllers/map_view_controller.dart @@ -2,7 +2,7 @@ import 'dart:typed_data'; import 'package:customer/constant/constant.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import '../screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart'; diff --git a/lib/controllers/mobile_login_controller.dart b/lib/controllers/mobile_login_controller.dart index 5717b2c..5a1a048 100644 --- a/lib/controllers/mobile_login_controller.dart +++ b/lib/controllers/mobile_login_controller.dart @@ -1,8 +1,8 @@ import 'package:customer/themes/show_toast_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/constant.dart'; import '../screen_ui/auth_screens/otp_verification_screen.dart'; @@ -21,13 +21,13 @@ class MobileLoginController extends GetxController { if (mobile.isEmpty || mobile.length != 10) { ShowToastDialog.showToast( - "Please enter a valid 10-digit mobile number".tr(), + "Please enter a valid 10-digit mobile number".tr, ); return; } try { - ShowToastDialog.showLoader("Sending OTP...".tr()); + ShowToastDialog.showLoader("Sending OTP...".tr); await _auth.verifyPhoneNumber( phoneNumber: '$countryCode$mobile', @@ -37,10 +37,10 @@ class MobileLoginController extends GetxController { verificationFailed: (FirebaseAuthException e) { ShowToastDialog.closeLoader(); if (e.code == 'invalid-phone-number') { - ShowToastDialog.showToast("Invalid phone number".tr()); + ShowToastDialog.showToast("Invalid phone number".tr); } else { ShowToastDialog.showToast( - e.message ?? "OTP verification failed".tr(), + e.message ?? "OTP verification failed".tr, ); } }, @@ -57,13 +57,13 @@ class MobileLoginController extends GetxController { }, codeAutoRetrievalTimeout: (String verificationId) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("OTP timed out. Please try again.".tr()); + ShowToastDialog.showToast("OTP timed out. Please try again.".tr); // Optional: Handle timeout }, ); } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong. Please try again.".tr()); + ShowToastDialog.showToast("Something went wrong. Please try again.".tr); } } diff --git a/lib/controllers/my_booking_on_demand_controller.dart b/lib/controllers/my_booking_on_demand_controller.dart index 6fc60e6..20a7be3 100644 --- a/lib/controllers/my_booking_on_demand_controller.dart +++ b/lib/controllers/my_booking_on_demand_controller.dart @@ -1,4 +1,4 @@ -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/onprovider_order_model.dart'; import '../models/worker_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/my_cab_booking_controller.dart b/lib/controllers/my_cab_booking_controller.dart index 884a512..eee4f01 100644 --- a/lib/controllers/my_cab_booking_controller.dart +++ b/lib/controllers/my_cab_booking_controller.dart @@ -34,12 +34,12 @@ import 'package:customer/payment/xenditScreen.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -139,13 +139,13 @@ class MyCabBookingController extends GetxController { String getLocalizedTabTitle(String tabKey) { switch (tabKey) { case "New": - return "New".tr(); + return "New".tr; case "On Going": - return "On Going".tr(); + return "On Going".tr; case "Completed": - return "Completed".tr(); + return "Completed".tr; case "Cancelled": - return "Cancelled".tr(); + return "Cancelled".tr; default: return tabKey; } @@ -219,7 +219,7 @@ class MyCabBookingController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { selectedOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.cabOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr()); + ShowToastDialog.showToast("Payment method changed".tr); Get.back(); }); } else { @@ -237,8 +237,8 @@ class MyCabBookingController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: selectedOrder.value.id, - note: "Cab Amount debited".tr(), - paymentStatus: "success".tr(), + note: "Cab Amount debited".tr, + paymentStatus: "success".tr, serviceType: Constant.parcelServiceType, ); @@ -253,7 +253,7 @@ class MyCabBookingController extends GetxController { } selectedOrder.value.paymentStatus = true; await FireStoreUtils.cabOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); Get.back(); }); } @@ -348,7 +348,7 @@ class MyCabBookingController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -381,7 +381,7 @@ class MyCabBookingController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); }); } on StripeException catch (e) { @@ -464,10 +464,10 @@ class MyCabBookingController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -499,15 +499,15 @@ class MyCabBookingController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -534,15 +534,15 @@ class MyCabBookingController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -585,10 +585,10 @@ class MyCabBookingController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -622,11 +622,11 @@ class MyCabBookingController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -754,7 +754,7 @@ class MyCabBookingController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -791,18 +791,18 @@ class MyCabBookingController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -820,10 +820,10 @@ class MyCabBookingController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -864,7 +864,7 @@ class MyCabBookingController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -907,13 +907,13 @@ class MyCabBookingController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -951,7 +951,7 @@ class MyCabBookingController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1002,7 +1002,7 @@ class MyCabBookingController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1028,11 +1028,11 @@ class MyCabBookingController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/my_profile_controller.dart b/lib/controllers/my_profile_controller.dart index c6d7068..4546340 100644 --- a/lib/controllers/my_profile_controller.dart +++ b/lib/controllers/my_profile_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/theme_controller.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; class MyProfileController extends GetxController { diff --git a/lib/controllers/my_rental_booking_controller.dart b/lib/controllers/my_rental_booking_controller.dart index 3e595a7..35be194 100644 --- a/lib/controllers/my_rental_booking_controller.dart +++ b/lib/controllers/my_rental_booking_controller.dart @@ -4,8 +4,8 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart' hide Trans; + +import 'package:get/get.dart'; import '../models/rental_order_model.dart'; import '../models/tax_model.dart'; import '../service/fire_store_utils.dart'; @@ -157,7 +157,7 @@ class MyRentalBookingController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { selectedOrder.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.rentalOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr()); + ShowToastDialog.showToast("Payment method changed".tr); Get.back(); Get.back(); }); @@ -174,8 +174,8 @@ class MyRentalBookingController extends GetxController { userId: FireStoreUtils.getCurrentUid(), isTopup: false, orderId: selectedOrder.value.id, - note: "Rental Amount debited".tr(), - paymentStatus: "success".tr(), + note: "Rental Amount debited".tr, + paymentStatus: "success".tr, serviceType: Constant.parcelServiceType, ); @@ -192,7 +192,7 @@ class MyRentalBookingController extends GetxController { } await FireStoreUtils.rentalOrderPlace(selectedOrder.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); Get.back(); Get.back(); }); @@ -290,8 +290,8 @@ class MyRentalBookingController extends GetxController { isTopup: true, // refund orderId: order.id, - note: "Refund for cancelled booking".tr(), - paymentStatus: "success".tr(), + note: "Refund for cancelled booking".tr, + paymentStatus: "success".tr, serviceType: Constant.parcelServiceType, ); @@ -301,9 +301,9 @@ class MyRentalBookingController extends GetxController { userId: FireStoreUtils.getCurrentUid(), ); } - ShowToastDialog.showToast("Booking cancelled successfully".tr()); + ShowToastDialog.showToast("Booking cancelled successfully".tr); } catch (e) { - ShowToastDialog.showToast("Failed to cancel booking: $e".tr()); + ShowToastDialog.showToast("Failed to cancel booking: $e".tr); } finally { isLoading.value = false; } diff --git a/lib/controllers/on_boarding_controller.dart b/lib/controllers/on_boarding_controller.dart index eed931f..178fbaf 100644 --- a/lib/controllers/on_boarding_controller.dart +++ b/lib/controllers/on_boarding_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/on_boarding_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/on_demand_booking_controller.dart b/lib/controllers/on_demand_booking_controller.dart index dc73c5b..647c514 100644 --- a/lib/controllers/on_demand_booking_controller.dart +++ b/lib/controllers/on_demand_booking_controller.dart @@ -2,9 +2,10 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../models/onprovider_order_model.dart'; import '../models/provider_serivce_model.dart'; @@ -149,9 +150,9 @@ class OnDemandBookingController extends GetxController { Future confirmBooking(BuildContext context) async { if (selectedAddress.value.getFullAddress().isEmpty) { - ShowToastDialog.showToast("Please enter address".tr()); + ShowToastDialog.showToast("Please enter address".tr); } else if (dateTimeController.value.text.isEmpty) { - ShowToastDialog.showToast("Please select time slot.".tr()); + ShowToastDialog.showToast("Please select time slot.".tr); } else { UserModel? providerUser = await FireStoreUtils.getUserProfile( provider.value!.author!, @@ -201,7 +202,7 @@ class OnDemandBookingController extends GetxController { }, ); } else { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); OnProviderOrderModel onDemandOrder = OnProviderOrderModel( otp: Constant.getReferralCode(), authorID: FireStoreUtils.getCurrentUid(), @@ -254,7 +255,7 @@ class OnDemandBookingController extends GetxController { OnDemandDashboardController(), ); controller.selectedIndex.value = 2; - ShowToastDialog.showToast("OnDemand Service successfully booked".tr()); + ShowToastDialog.showToast("OnDemand Service successfully booked".tr); } } } diff --git a/lib/controllers/on_demand_category_controller.dart b/lib/controllers/on_demand_category_controller.dart index 1df529a..8b573c4 100644 --- a/lib/controllers/on_demand_category_controller.dart +++ b/lib/controllers/on_demand_category_controller.dart @@ -1,4 +1,4 @@ -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/category_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/on_demand_dashboard_controller.dart b/lib/controllers/on_demand_dashboard_controller.dart index a6f90f8..d7cf110 100644 --- a/lib/controllers/on_demand_dashboard_controller.dart +++ b/lib/controllers/on_demand_dashboard_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/on_demand_service/favourite_ondemand_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../screen_ui/on_demand_service/my_booking_on_demand_screen.dart'; import '../screen_ui/on_demand_service/on_demand_home_screen.dart'; diff --git a/lib/controllers/on_demand_details_controller.dart b/lib/controllers/on_demand_details_controller.dart index a569994..3064071 100644 --- a/lib/controllers/on_demand_details_controller.dart +++ b/lib/controllers/on_demand_details_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../models/favorite_ondemand_service_model.dart'; import '../models/provider_serivce_model.dart'; diff --git a/lib/controllers/on_demand_home_controller.dart b/lib/controllers/on_demand_home_controller.dart index 2b609a8..fc8764c 100644 --- a/lib/controllers/on_demand_home_controller.dart +++ b/lib/controllers/on_demand_home_controller.dart @@ -4,7 +4,7 @@ import 'package:customer/models/favorite_ondemand_service_model.dart'; import 'package:customer/models/provider_serivce_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../constant/constant.dart'; diff --git a/lib/controllers/on_demand_order_details_controller.dart b/lib/controllers/on_demand_order_details_controller.dart index afab172..c2c7ad1 100644 --- a/lib/controllers/on_demand_order_details_controller.dart +++ b/lib/controllers/on_demand_order_details_controller.dart @@ -2,9 +2,9 @@ import 'dart:developer'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/cupertino.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/constant.dart'; import '../models/onprovider_order_model.dart'; import '../models/wallet_transaction_model.dart'; @@ -172,7 +172,7 @@ class OnDemandOrderDetailsController extends GetxController { final order = onProviderOrder.value; if (order == null) return; - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); try { double total = 0.0; @@ -222,7 +222,7 @@ class OnDemandOrderDetailsController extends GetxController { isTopup: true, orderId: order.id, note: 'Booking Amount Refund', - paymentStatus: "success".tr(), + paymentStatus: "success".tr, ), ); @@ -240,7 +240,7 @@ class OnDemandOrderDetailsController extends GetxController { isTopup: false, orderId: order.id, note: 'Booking Amount Refund', - paymentStatus: "success".tr(), + paymentStatus: "success".tr, ), ); } @@ -260,7 +260,7 @@ class OnDemandOrderDetailsController extends GetxController { isTopup: true, orderId: order.id, note: 'Admin commission refund', - paymentStatus: "success".tr(), + paymentStatus: "success".tr, ), ); } @@ -289,11 +289,11 @@ class OnDemandOrderDetailsController extends GetxController { ShowToastDialog.closeLoader(); Get.back(); - ShowToastDialog.showToast("Booking cancelled successfully".tr()); + ShowToastDialog.showToast("Booking cancelled successfully".tr); } catch (e, st) { log("Cancel error: $e\n$st"); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong".tr()); + ShowToastDialog.showToast("Something went wrong".tr); } } } diff --git a/lib/controllers/on_demand_review_controller.dart b/lib/controllers/on_demand_review_controller.dart index a5ea0a0..9208286 100644 --- a/lib/controllers/on_demand_review_controller.dart +++ b/lib/controllers/on_demand_review_controller.dart @@ -1,7 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/collection_name.dart'; import '../models/onprovider_order_model.dart'; import '../models/provider_serivce_model.dart'; @@ -133,7 +133,7 @@ class OnDemandReviewController extends GetxController { } Future _providerReviewSubmit() async { - ShowToastDialog.showLoader("Submit in...".tr()); + ShowToastDialog.showLoader("Submit in...".tr); providerServiceModel.value!.reviewsCount = serviceReviewCount.value + 1; providerServiceModel.value!.reviewsSum = serviceReviewSum.value + ratings.value; @@ -171,7 +171,7 @@ class OnDemandReviewController extends GetxController { } Future _workerReviewSubmit() async { - ShowToastDialog.showLoader("Submit in...".tr()); + ShowToastDialog.showLoader("Submit in...".tr); workerModel.value!.reviewsCount = workerReviewCount.value + 1; workerModel.value!.reviewsSum = workerReviewSum.value + ratings.value; diff --git a/lib/controllers/order_controller.dart b/lib/controllers/order_controller.dart index 7c39996..aa16c62 100644 --- a/lib/controllers/order_controller.dart +++ b/lib/controllers/order_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/models/cart_product_model.dart'; import 'package:customer/models/order_model.dart'; import '../service/cart_provider.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class OrderController extends GetxController { RxList allList = [].obs; diff --git a/lib/controllers/order_details_controller.dart b/lib/controllers/order_details_controller.dart index e1a51fa..adf1e24 100644 --- a/lib/controllers/order_details_controller.dart +++ b/lib/controllers/order_details_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/cart_product_model.dart'; import 'package:customer/models/order_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../service/cart_provider.dart'; class OrderDetailsController extends GetxController { diff --git a/lib/controllers/order_placing_controller.dart b/lib/controllers/order_placing_controller.dart index 5fa8060..fa489d6 100644 --- a/lib/controllers/order_placing_controller.dart +++ b/lib/controllers/order_placing_controller.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'package:customer/models/order_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../service/database_helper.dart'; class OrderPlacingController extends GetxController { diff --git a/lib/controllers/osm_search_place_controller.dart b/lib/controllers/osm_search_place_controller.dart index be7afab..8902871 100644 --- a/lib/controllers/osm_search_place_controller.dart +++ b/lib/controllers/osm_search_place_controller.dart @@ -1,7 +1,7 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_osm_plugin/flutter_osm_plugin.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; class OsmSearchPlaceController extends GetxController { diff --git a/lib/controllers/otp_verification_controller.dart b/lib/controllers/otp_verification_controller.dart index 745082a..7c6712a 100644 --- a/lib/controllers/otp_verification_controller.dart +++ b/lib/controllers/otp_verification_controller.dart @@ -1,9 +1,10 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/constant.dart'; import '../models/user_model.dart'; import '../screen_ui/auth_screens/login_screen.dart'; @@ -43,7 +44,7 @@ class OtpVerifyController extends GetxController { codeSent: (String verificationId0, int? resendToken0) async { verificationId.value = verificationId0; resendToken.value = resendToken0!; - ShowToastDialog.showToast("OTP sent".tr()); + ShowToastDialog.showToast("OTP sent".tr); }, timeout: const Duration(seconds: 25), forceResendingToken: resendToken.value, @@ -56,12 +57,12 @@ class OtpVerifyController extends GetxController { void verifyOtp() async { if (otpController.value.text.length != 6) { - ShowToastDialog.showToast("Enter valid 6-digit OTP".tr()); + ShowToastDialog.showToast("Enter valid 6-digit OTP".tr); return; } try { - ShowToastDialog.showLoader("Verifying OTP...".tr()); + ShowToastDialog.showLoader("Verifying OTP...".tr); final credential = PhoneAuthProvider.credential( verificationId: verificationId.value, @@ -107,14 +108,14 @@ class OtpVerifyController extends GetxController { final userModel = await FireStoreUtils.getUserProfile(result.user!.uid); if (userModel == null || userModel.role != 'customer') { await _auth.signOut(); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); return; } if (userModel.active == false) { - ShowToastDialog.showToast("This user is disabled".tr()); + ShowToastDialog.showToast("This user is disabled".tr); await _auth.signOut(); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); return; } @@ -128,13 +129,13 @@ class OtpVerifyController extends GetxController { ); Constant.selectedLocation = defaultAddress; - Get.offAll(() => const ServiceListScreen()); + Get.offAll(ServiceListScreen()); } else { - Get.offAll(() => const LocationPermissionScreen()); + Get.offAll(LocationPermissionScreen()); } } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Invalid OTP or Verification Failed".tr()); + ShowToastDialog.showToast("Invalid OTP or Verification Failed".tr); } } diff --git a/lib/controllers/parcel_coupon_controller.dart b/lib/controllers/parcel_coupon_controller.dart index fe0c298..f01f03f 100644 --- a/lib/controllers/parcel_coupon_controller.dart +++ b/lib/controllers/parcel_coupon_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class ParcelCouponController extends GetxController { @override diff --git a/lib/controllers/parcel_dashboard_controller.dart b/lib/controllers/parcel_dashboard_controller.dart index 38a274e..bf7b2ce 100644 --- a/lib/controllers/parcel_dashboard_controller.dart +++ b/lib/controllers/parcel_dashboard_controller.dart @@ -3,7 +3,7 @@ import 'package:customer/screen_ui/multi_vendor_service/profile_screen/profile_s import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/parcel_service/home_parcel_screen.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../screen_ui/parcel_service/my_booking_screen.dart'; class ParcelDashboardController extends GetxController { diff --git a/lib/controllers/parcel_my_booking_controller.dart b/lib/controllers/parcel_my_booking_controller.dart index 742e67c..90c541e 100644 --- a/lib/controllers/parcel_my_booking_controller.dart +++ b/lib/controllers/parcel_my_booking_controller.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart' hide Trans; + +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../constant/constant.dart'; import '../models/parcel_order_model.dart'; @@ -106,7 +106,7 @@ class ParcelMyBookingController extends GetxController { isLoading.value = true; if (order.status != Constant.orderPlaced) { - ShowToastDialog.showToast("You can only cancel before pickup.".tr()); + ShowToastDialog.showToast("You can only cancel before pickup.".tr); return; } @@ -160,9 +160,9 @@ class ParcelMyBookingController extends GetxController { ); } - ShowToastDialog.showToast("Order cancelled successfully".tr()); + ShowToastDialog.showToast("Order cancelled successfully".tr); } catch (e) { - ShowToastDialog.showToast("${'Failed to cancel order:'.tr()} $e".tr()); + ShowToastDialog.showToast("${'Failed to cancel order:'.tr} $e".tr); } finally { isLoading.value = false; } diff --git a/lib/controllers/parcel_order_confirmation_controller.dart b/lib/controllers/parcel_order_confirmation_controller.dart index abbcef0..b76f4dd 100644 --- a/lib/controllers/parcel_order_confirmation_controller.dart +++ b/lib/controllers/parcel_order_confirmation_controller.dart @@ -5,11 +5,11 @@ import 'dart:math' as maths; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/wallet_transaction_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; @@ -136,7 +136,7 @@ class ParcelOrderConfirmationController extends GetxController { } Future placeOrder() async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); try { List parcelImages = []; @@ -207,7 +207,7 @@ class ParcelOrderConfirmationController extends GetxController { value, ) async { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Order placed successfully".tr()); + ShowToastDialog.showToast("Order placed successfully".tr); Get.offAll( () => OrderSuccessfullyPlaced(), arguments: {'parcelOrder': parcelOrder.value}, @@ -216,7 +216,7 @@ class ParcelOrderConfirmationController extends GetxController { }); } catch (e) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Something went wrong. Please try again.".tr()); + ShowToastDialog.showToast("Something went wrong. Please try again.".tr); } } @@ -324,7 +324,7 @@ class ParcelOrderConfirmationController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -357,7 +357,7 @@ class ParcelOrderConfirmationController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); }); } on StripeException catch (e) { @@ -440,10 +440,10 @@ class ParcelOrderConfirmationController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -480,17 +480,17 @@ class ParcelOrderConfirmationController extends GetxController { onSuccess: (Map params) async { debugPrint("✅ PayPal Payment Success: $params"); placeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { debugPrint("❌ PayPal Payment Error: $error"); Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { debugPrint("⚠️ PayPal Payment Canceled: $params"); Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -521,15 +521,15 @@ class ParcelOrderConfirmationController extends GetxController { // note: "Contact us for any questions on your order.", // onSuccess: (Map params) async { // placeOrder(); - // ShowToastDialog.showToast("Payment Successful!!".tr()); + // ShowToastDialog.showToast("Payment Successful!!".tr); // }, // onError: (error) { // Get.back(); - // ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + // ShowToastDialog.showToast("Payment UnSuccessful!!".tr); // }, // onCancel: (params) { // Get.back(); - // ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + // ShowToastDialog.showToast("Payment UnSuccessful!!".tr); // }, // ), // ), @@ -559,15 +559,15 @@ class ParcelOrderConfirmationController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -614,10 +614,10 @@ class ParcelOrderConfirmationController extends GetxController { bool isVerified = await verifyFlutterWavePayment(_ref!); if (isVerified) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); Get.back(); } }); @@ -676,11 +676,11 @@ class ParcelOrderConfirmationController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); placeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -833,7 +833,7 @@ class ParcelOrderConfirmationController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } @@ -866,7 +866,7 @@ class ParcelOrderConfirmationController extends GetxController { // final data = jsonDecode(response.body); // if (data["body"]["txnToken"] == null || data["body"]["txnToken"].toString().isEmpty) { // Get.back(); - // ShowToastDialog.showToast("something went wrong, please contact admin.".tr()); + // ShowToastDialog.showToast("something went wrong, please contact admin.".tr); // } // return GetPaymentTxtTokenModel.fromJson(data); // } @@ -902,18 +902,18 @@ class ParcelOrderConfirmationController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -931,10 +931,10 @@ class ParcelOrderConfirmationController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -975,7 +975,7 @@ class ParcelOrderConfirmationController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -1002,7 +1002,7 @@ class ParcelOrderConfirmationController extends GetxController { debugPrint('🟩 Starting OrangePay Payment...'); debugPrint('💰 Amount: $amount | 🆔 Order ID: $id'); - ShowToastDialog.showLoader("Initializing payment...".tr()); + ShowToastDialog.showLoader("Initializing payment...".tr); var paymentURL = await fetchToken( context: context, @@ -1027,20 +1027,20 @@ class ParcelOrderConfirmationController extends GetxController { ), )?.then((value) async { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); debugPrint('🎉 Payment Successful for Order ID: $orderId'); if (Get.isBottomSheetOpen ?? false) Get.back(); await placeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); debugPrint('⚠️ Payment flow closed without success.'); if (Get.isBottomSheetOpen ?? false) Get.back(); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); if (Get.isBottomSheetOpen ?? false) Get.back(); } } @@ -1086,7 +1086,7 @@ class ParcelOrderConfirmationController extends GetxController { } else { debugPrint('❌ Failed to fetch access token.'); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1152,7 +1152,7 @@ class ParcelOrderConfirmationController extends GetxController { } else { debugPrint('❌ Payment request failed.'); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1179,11 +1179,11 @@ class ParcelOrderConfirmationController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); placeOrder(); (); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/parcel_order_details_controller.dart b/lib/controllers/parcel_order_details_controller.dart index 6e9e83b..3d0b30e 100644 --- a/lib/controllers/parcel_order_details_controller.dart +++ b/lib/controllers/parcel_order_details_controller.dart @@ -3,8 +3,8 @@ import 'package:customer/models/rating_model.dart'; import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:get/get.dart' hide Trans; + +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../constant/constant.dart'; import '../models/parcel_category.dart'; @@ -108,7 +108,7 @@ class ParcelOrderDetailsController extends GetxController { } Future cancelParcelOrder() async { - ShowToastDialog.showLoader("Cancelling order...".tr()); + ShowToastDialog.showLoader("Cancelling order...".tr); parcelOrder.value.status = Constant.orderCancelled; if (parcelOrder.value.paymentMethod?.toLowerCase() != "cod") { WalletTransactionModel walletTransaction = WalletTransactionModel( @@ -137,7 +137,7 @@ class ParcelOrderDetailsController extends GetxController { await FireStoreUtils.parcelOrderPlace(parcelOrder.value); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Order cancelled successfully".tr()); + ShowToastDialog.showToast("Order cancelled successfully".tr); Get.back(result: true); } diff --git a/lib/controllers/parcel_review_controller.dart b/lib/controllers/parcel_review_controller.dart index 2ad0958..cf445c1 100644 --- a/lib/controllers/parcel_review_controller.dart +++ b/lib/controllers/parcel_review_controller.dart @@ -1,8 +1,8 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/parcel_order_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/rating_model.dart'; import '../models/user_model.dart'; import '../service/fire_store_utils.dart'; @@ -76,11 +76,11 @@ class ParcelReviewController extends GetxController { /// Save / update review Future submitReview() async { if (comment.value.text.trim().isEmpty || ratings.value == 0) { - ShowToastDialog.showToast("Please provide rating and comment".tr()); + ShowToastDialog.showToast("Please provide rating and comment".tr); return; } - ShowToastDialog.showLoader("Submit in...".tr()); + ShowToastDialog.showLoader("Submit in...".tr); final user = await FireStoreUtils.getUserProfile( order.value?.driverId ?? '', diff --git a/lib/controllers/provider_controller.dart b/lib/controllers/provider_controller.dart index ed6379e..2cde1b4 100644 --- a/lib/controllers/provider_controller.dart +++ b/lib/controllers/provider_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/provider_serivce_model.dart'; import '../models/user_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/rate_product_controller.dart b/lib/controllers/rate_product_controller.dart index ece8c88..d4d5d0c 100644 --- a/lib/controllers/rate_product_controller.dart +++ b/lib/controllers/rate_product_controller.dart @@ -6,13 +6,13 @@ import 'package:customer/models/order_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/models/vendor_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import '../models/rating_model.dart'; import '../models/review_attribute_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import '../themes/show_toast_dialog.dart'; @@ -142,7 +142,7 @@ class RateProductController extends GetxController { Future saveRating() async { if (ratings.value != 0.0) { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); productModel.value.reviewsCount = productReviewCount.value + 1; productModel.value.reviewsSum = productReviewSum.value + ratings.value; productModel.value.reviewAttributes = reviewProductAttributes; @@ -213,10 +213,10 @@ class RateProductController extends GetxController { await FireStoreUtils.updateVendor(vendorModel.value); await FireStoreUtils.setProduct(productModel.value); ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Rating saved successfully.".tr()); + ShowToastDialog.showToast("Rating saved successfully.".tr); Get.back(); } else { - ShowToastDialog.showToast("Please add rate for food item.".tr()); + ShowToastDialog.showToast("Please add rate for food item.".tr); } } diff --git a/lib/controllers/redeem_gift_card_controller.dart b/lib/controllers/redeem_gift_card_controller.dart index 8332496..d445e2f 100644 --- a/lib/controllers/redeem_gift_card_controller.dart +++ b/lib/controllers/redeem_gift_card_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class RedeemGiftCardController extends GetxController { Rx giftCodeController = TextEditingController().obs; diff --git a/lib/controllers/refer_friend_controller.dart b/lib/controllers/refer_friend_controller.dart index 66c3f7e..8b9cd87 100644 --- a/lib/controllers/refer_friend_controller.dart +++ b/lib/controllers/refer_friend_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/referral_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class ReferFriendController extends GetxController { Rx referralModel = ReferralModel().obs; diff --git a/lib/controllers/rental_conformation_controller.dart b/lib/controllers/rental_conformation_controller.dart index 49f838e..0c4c3e1 100644 --- a/lib/controllers/rental_conformation_controller.dart +++ b/lib/controllers/rental_conformation_controller.dart @@ -5,9 +5,10 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/rental_order_model.dart'; import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/show_toast_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../screen_ui/rental_service/rental_dashboard_screen.dart'; import 'cab_rental_dashboard_controllers.dart'; @@ -81,7 +82,7 @@ class RentalConformationController extends GetxController { } Future placeOrder() async { - ShowToastDialog.showLoader("Placing booking...".tr()); + ShowToastDialog.showLoader("Placing booking...".tr); rentalOrderModel.value.discount = discount.value.toString(); rentalOrderModel.value.couponCode = selectedCouponModel.value.code; rentalOrderModel.value.couponId = selectedCouponModel.value.id; @@ -92,8 +93,8 @@ class RentalConformationController extends GetxController { value, ) async { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Order placed successfully".tr()); - Get.offAll(const RentalDashboardScreen()); + ShowToastDialog.showToast("Order placed successfully".tr); + Get.offAll(RentalDashboardScreen()); CabRentalDashboardControllers controller = Get.put( CabRentalDashboardControllers(), ); diff --git a/lib/controllers/rental_coupon_controller.dart b/lib/controllers/rental_coupon_controller.dart index 4cb1292..e5ded68 100644 --- a/lib/controllers/rental_coupon_controller.dart +++ b/lib/controllers/rental_coupon_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class RentalCouponController extends GetxController { @override diff --git a/lib/controllers/rental_home_controller.dart b/lib/controllers/rental_home_controller.dart index 87b8181..621993b 100644 --- a/lib/controllers/rental_home_controller.dart +++ b/lib/controllers/rental_home_controller.dart @@ -7,10 +7,10 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/screen_ui/rental_service/rental_conformation_screen.dart'; import 'package:customer/widget/geoflutterfire/src/geoflutterfire.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart' as latlong; import '../constant/constant.dart'; import '../models/payment_model/cod_setting_model.dart'; @@ -92,7 +92,7 @@ class RentalHomeController extends GetxController { sourceTextEditController.value.text = address; } } catch (e) { - ShowToastDialog.showToast("Unable to fetch current location".tr()); + ShowToastDialog.showToast("Unable to fetch current location".tr); } } diff --git a/lib/controllers/rental_order_details_controller.dart b/lib/controllers/rental_order_details_controller.dart index 69bd57c..76f634b 100644 --- a/lib/controllers/rental_order_details_controller.dart +++ b/lib/controllers/rental_order_details_controller.dart @@ -35,11 +35,11 @@ import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_scr import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:razorpay_flutter/razorpay_flutter.dart'; import 'package:uuid/uuid.dart'; @@ -210,7 +210,7 @@ class RentalOrderDetailsController extends GetxController { totalAmount.value = (subTotal.value - discount.value) + taxAmount.value; } catch (e) { - ShowToastDialog.showToast("${'Failed to calculate total:'.tr()} $e"); + ShowToastDialog.showToast("${'Failed to calculate total:'.tr} $e"); } } @@ -218,7 +218,7 @@ class RentalOrderDetailsController extends GetxController { if (selectedPaymentMethod.value == PaymentGateway.cod.name) { order.value.paymentMethod = selectedPaymentMethod.value; await FireStoreUtils.rentalOrderPlace(order.value).then((value) { - ShowToastDialog.showToast("Payment method changed".tr()); + ShowToastDialog.showToast("Payment method changed".tr); Get.back(); Get.back(); }); @@ -253,7 +253,7 @@ class RentalOrderDetailsController extends GetxController { } await FireStoreUtils.rentalOrderPlace(order.value).then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); Get.back(); Get.back(); }); @@ -311,10 +311,10 @@ class RentalOrderDetailsController extends GetxController { userId: FireStoreUtils.getCurrentUid(), ); } - ShowToastDialog.showToast("Booking cancelled successfully".tr()); + ShowToastDialog.showToast("Booking cancelled successfully".tr); Get.back(); } catch (e) { - ShowToastDialog.showToast("${'Failed to cancel booking:'.tr()} $e".tr()); + ShowToastDialog.showToast("${'Failed to cancel booking:'.tr} $e".tr); } finally { isLoading.value = false; } @@ -424,7 +424,7 @@ class RentalOrderDetailsController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -457,7 +457,7 @@ class RentalOrderDetailsController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); }); } on StripeException catch (e) { @@ -540,10 +540,10 @@ class RentalOrderDetailsController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -575,15 +575,15 @@ class RentalOrderDetailsController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { completeOrder(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -610,15 +610,15 @@ class RentalOrderDetailsController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -661,10 +661,10 @@ class RentalOrderDetailsController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -698,11 +698,11 @@ class RentalOrderDetailsController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); completeOrder(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -830,7 +830,7 @@ class RentalOrderDetailsController extends GetxController { data["body"]["txnToken"].toString().isEmpty) { Get.back(); ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); } return GetPaymentTxtTokenModel.fromJson(data); @@ -867,18 +867,18 @@ class RentalOrderDetailsController extends GetxController { void handlePaymentSuccess(PaymentSuccessResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } bool isCurrentDateInRange(DateTime startDate, DateTime endDate) { @@ -896,10 +896,10 @@ class RentalOrderDetailsController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -940,7 +940,7 @@ class RentalOrderDetailsController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -983,13 +983,13 @@ class RentalOrderDetailsController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); (); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -1027,7 +1027,7 @@ class RentalOrderDetailsController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1078,7 +1078,7 @@ class RentalOrderDetailsController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -1103,10 +1103,10 @@ class RentalOrderDetailsController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); completeOrder(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/controllers/rental_review_controller.dart b/lib/controllers/rental_review_controller.dart index 88d06c3..58283ca 100644 --- a/lib/controllers/rental_review_controller.dart +++ b/lib/controllers/rental_review_controller.dart @@ -1,7 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../constant/collection_name.dart'; import '../models/rating_model.dart'; import '../models/rental_order_model.dart'; @@ -77,11 +77,11 @@ class RentalReviewController extends GetxController { /// Save / update review Future submitReview() async { if (comment.value.text.trim().isEmpty || ratings.value == 0) { - ShowToastDialog.showToast("Please provide rating and comment".tr()); + ShowToastDialog.showToast("Please provide rating and comment".tr); return; } - ShowToastDialog.showLoader("Submit in...".tr()); + ShowToastDialog.showLoader("Submit in...".tr); final user = await FireStoreUtils.getUserProfile( order.value?.driverId ?? '', diff --git a/lib/controllers/restaurant_details_controller.dart b/lib/controllers/restaurant_details_controller.dart index dcc56ac..6c7f50c 100644 --- a/lib/controllers/restaurant_details_controller.dart +++ b/lib/controllers/restaurant_details_controller.dart @@ -13,7 +13,7 @@ import '../models/attributes_model.dart'; import '../service/cart_provider.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; class RestaurantDetailsController extends GetxController { diff --git a/lib/controllers/restaurant_list_controller.dart b/lib/controllers/restaurant_list_controller.dart index bfe86f8..fe953e2 100644 --- a/lib/controllers/restaurant_list_controller.dart +++ b/lib/controllers/restaurant_list_controller.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class RestaurantListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/review_list_controller.dart b/lib/controllers/review_list_controller.dart index 659bfb5..540165c 100644 --- a/lib/controllers/review_list_controller.dart +++ b/lib/controllers/review_list_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/models/rating_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class ReviewListController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/scan_qr_code_controller.dart b/lib/controllers/scan_qr_code_controller.dart index 8c36a5b..066dcee 100644 --- a/lib/controllers/scan_qr_code_controller.dart +++ b/lib/controllers/scan_qr_code_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class ScanQrCodeController extends GetxController { @override diff --git a/lib/controllers/search_controller.dart b/lib/controllers/search_controller.dart index 01dee30..278c9da 100644 --- a/lib/controllers/search_controller.dart +++ b/lib/controllers/search_controller.dart @@ -2,7 +2,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class SearchScreenController extends GetxController { @override diff --git a/lib/controllers/service_list_controller.dart b/lib/controllers/service_list_controller.dart index e21ce0f..f107978 100644 --- a/lib/controllers/service_list_controller.dart +++ b/lib/controllers/service_list_controller.dart @@ -12,11 +12,12 @@ import 'package:customer/models/currency_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart'; import '../screen_ui/on_demand_service/on_demand_dashboard_screen.dart'; @@ -76,7 +77,7 @@ class ServiceListController extends GetxController { SectionModel sectionModel, ) async { try { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); Constant.sectionConstantModel = sectionModel; AppThemeData.primary300 = Color( int.tryParse(sectionModel.color?.replaceFirst("#", "0xff") ?? '') ?? @@ -92,7 +93,7 @@ class ServiceListController extends GetxController { await _navigate(sectionModel); } else { ShowToastDialog.closeLoader(); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } else { ShowToastDialog.closeLoader(); @@ -161,7 +162,7 @@ class ServiceListController extends GetxController { children: [ Text( "If you select this Section/Service, your previously added items will be removed from the cart." - .tr(), + .tr, textAlign: TextAlign.center, ), const SizedBox(height: 20), @@ -171,7 +172,7 @@ class ServiceListController extends GetxController { child: RoundedButtonFill( borderRadius: 10.r, height: 5.5, - title: "Cancel".tr(), + title: "Cancel".tr, onPress: () { Get.back(); }, @@ -183,7 +184,7 @@ class ServiceListController extends GetxController { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "OK".tr(), + title: "OK".tr, height: 5.5, onPress: () async { DatabaseHelper.instance.deleteAllCartProducts(); diff --git a/lib/controllers/sign_up_controller.dart b/lib/controllers/sign_up_controller.dart index bd990ba..8760fcd 100644 --- a/lib/controllers/sign_up_controller.dart +++ b/lib/controllers/sign_up_controller.dart @@ -1,9 +1,10 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:firebase_auth/firebase_auth.dart' as auth; import '../constant/constant.dart'; import '../models/referral_model.dart'; @@ -68,7 +69,7 @@ class SignUpController extends GetxController { try { if (!_validateInputs()) return; - ShowToastDialog.showLoader("Creating account...".tr()); + ShowToastDialog.showLoader("Creating account...".tr); if (type.value == "mobileNumber") { await _signUpWithMobile(); @@ -80,32 +81,32 @@ class SignUpController extends GetxController { } catch (e, st) { ShowToastDialog.closeLoader(); debugPrint("SIGNUP OUTER EXCEPTION: $e\n$st"); - ShowToastDialog.showToast("${'signup_failed'.tr()}: $e"); + ShowToastDialog.showToast("${'signup_failed'.tr}: $e"); } } /// Validation Logic bool _validateInputs() { if (firstNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter first name".tr()); + ShowToastDialog.showToast("Please enter first name".tr); return false; } else if (lastNameController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter last name".tr()); + ShowToastDialog.showToast("Please enter last name".tr); return false; } else if (emailController.value.text.isEmpty || !emailController.value.text.isEmail) { - ShowToastDialog.showToast("Please enter a valid email address".tr()); + ShowToastDialog.showToast("Please enter a valid email address".tr); return false; } else if (mobileController.value.text.isEmpty) { - ShowToastDialog.showToast("Please enter a valid phone number".tr()); + ShowToastDialog.showToast("Please enter a valid phone number".tr); return false; } else if (passwordController.value.text.length < 6) { - ShowToastDialog.showToast("Password must be at least 6 characters".tr()); + ShowToastDialog.showToast("Password must be at least 6 characters".tr); return false; } else if (passwordController.value.text != confirmPasswordController.value.text) { ShowToastDialog.showToast( - "Password and Confirm password do not match".tr(), + "Password and Confirm password do not match".tr, ); return false; } @@ -132,18 +133,18 @@ class SignUpController extends GetxController { "FirebaseAuthException caught: code=${e.code}, message=${e.message}", ); if (e.code == 'email-already-in-use') { - ShowToastDialog.showToast("Email already in use".tr()); + ShowToastDialog.showToast("Email already in use".tr); } else if (e.code == 'weak-password') { - ShowToastDialog.showToast("Password is too weak".tr()); + ShowToastDialog.showToast("Password is too weak".tr); } else if (e.code == 'invalid-email') { - ShowToastDialog.showToast("Invalid email address".tr()); + ShowToastDialog.showToast("Invalid email address".tr); } else { - ShowToastDialog.showToast(e.message ?? "signup_failed".tr()); + ShowToastDialog.showToast(e.message ?? "signup_failed".tr); } } catch (e) { debugPrint("Something went wrong: ${e.toString()}"); ShowToastDialog.showToast( - "${'something_went_wrong'.tr()}: ${e.toString()}", + "${'something_went_wrong'.tr}: ${e.toString()}", ); } } @@ -161,7 +162,7 @@ class SignUpController extends GetxController { _navigateBasedOnAddress(userModel.value); } catch (e) { - ShowToastDialog.showToast("${'signup_failed'.tr()}: $e"); + ShowToastDialog.showToast("${'signup_failed'.tr}: $e"); } } @@ -212,9 +213,9 @@ class SignUpController extends GetxController { /// Save the default address to global constant Constant.selectedLocation = defaultAddress; - Get.offAll(() => const ServiceListScreen()); + Get.offAll(ServiceListScreen()); } else { - Get.offAll(() => const LocationPermissionScreen()); + Get.offAll(LocationPermissionScreen()); } } } diff --git a/lib/controllers/splash_controller.dart b/lib/controllers/splash_controller.dart index 53f95e8..2052507 100644 --- a/lib/controllers/splash_controller.dart +++ b/lib/controllers/splash_controller.dart @@ -4,11 +4,12 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart'; import 'package:customer/screen_ui/service_home_screen/service_list_screen.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/notification_service.dart'; import 'package:customer/utils/preferences.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../screen_ui/auth_screens/login_screen.dart'; import '../screen_ui/location_enable_screens/location_permission_screen.dart'; import '../screen_ui/on_boarding_screen/on_boarding_screen.dart'; diff --git a/lib/controllers/theme_controller.dart b/lib/controllers/theme_controller.dart index 92ebb62..50efcc6 100644 --- a/lib/controllers/theme_controller.dart +++ b/lib/controllers/theme_controller.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../utils/preferences.dart'; class ThemeController extends GetxController { diff --git a/lib/controllers/view_all_category_controller.dart b/lib/controllers/view_all_category_controller.dart index 52ad4a4..49a61e5 100644 --- a/lib/controllers/view_all_category_controller.dart +++ b/lib/controllers/view_all_category_controller.dart @@ -1,7 +1,7 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/models/vendor_category_model.dart'; import '../service/fire_store_utils.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class ViewAllCategoryController extends GetxController { RxBool isLoading = true.obs; diff --git a/lib/controllers/view_all_popular_service_controller.dart b/lib/controllers/view_all_popular_service_controller.dart index 68379a6..5f2d604 100644 --- a/lib/controllers/view_all_popular_service_controller.dart +++ b/lib/controllers/view_all_popular_service_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:flutter/material.dart'; import '../models/favorite_ondemand_service_model.dart'; import '../models/provider_serivce_model.dart'; diff --git a/lib/controllers/view_category_service_controller.dart b/lib/controllers/view_category_service_controller.dart index 433bd2a..776ab42 100644 --- a/lib/controllers/view_category_service_controller.dart +++ b/lib/controllers/view_category_service_controller.dart @@ -1,6 +1,6 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/on_demand_home_controller.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../models/provider_serivce_model.dart'; import '../service/fire_store_utils.dart'; diff --git a/lib/controllers/wallet_controller.dart b/lib/controllers/wallet_controller.dart index 44518fb..afa1f11 100644 --- a/lib/controllers/wallet_controller.dart +++ b/lib/controllers/wallet_controller.dart @@ -17,7 +17,7 @@ import 'package:customer/models/payment_model/xendit.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter_paypal/flutter_paypal.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; import 'package:razorpay_flutter/razorpay_flutter.dart'; @@ -34,7 +34,7 @@ import '../payment/xenditScreen.dart'; import '../service/fire_store_utils.dart'; import 'package:customer/utils/preferences.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:uuid/uuid.dart'; @@ -160,7 +160,7 @@ class WalletController extends GetxController { } }); - ShowToastDialog.showToast("Amount Top-up successfully".tr()); + ShowToastDialog.showToast("Amount Top-up successfully".tr); } // Strip @@ -174,7 +174,7 @@ class WalletController extends GetxController { if (paymentIntentData!.containsKey("error")) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } else { await Stripe.instance.initPaymentSheet( @@ -207,7 +207,7 @@ class WalletController extends GetxController { Future displayStripePaymentSheet({required String amount}) async { try { await Stripe.instance.presentPaymentSheet().then((value) { - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); walletTopUp(); }); } on StripeException catch (e) { @@ -290,15 +290,15 @@ class WalletController extends GetxController { final data = jsonDecode(response.body); Get.to(MercadoPagoScreen(initialURl: data['init_point']))!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something want wrong please contact administrator".tr(), + "Something want wrong please contact administrator".tr, ); print('Error creating preference: ${response.body}'); return null; @@ -327,15 +327,15 @@ class WalletController extends GetxController { note: "Contact us for any questions on your order.", onSuccess: (Map params) async { walletTopUp(); - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); }, onError: (error) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, onCancel: (params) { Get.back(); - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); }, ), ), @@ -362,15 +362,15 @@ class WalletController extends GetxController { ), )!.then((value) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); } }); @@ -412,10 +412,10 @@ class WalletController extends GetxController { value, ) { if (value) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { - ShowToastDialog.showToast("Payment UnSuccessful!!".tr()); + ShowToastDialog.showToast("Payment UnSuccessful!!".tr); } }); } else { @@ -449,11 +449,11 @@ class WalletController extends GetxController { ); if (isDone) { Get.back(); - ShowToastDialog.showToast("Payment successfully".tr()); + ShowToastDialog.showToast("Payment successfully".tr); walletTopUp(); } else { Get.back(); - ShowToastDialog.showToast("Payment Failed".tr()); + ShowToastDialog.showToast("Payment Failed".tr); } }); } @@ -488,18 +488,18 @@ class WalletController extends GetxController { } void handlePaymentSuccess(PaymentSuccessResponse response) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } void handleExternalWaller(ExternalWalletResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Processing!! via".tr()); + ShowToastDialog.showToast("Payment Processing!! via".tr); } void handlePaymentError(PaymentFailureResponse response) { Get.back(); - ShowToastDialog.showToast("Payment Failed!!".tr()); + ShowToastDialog.showToast("Payment Failed!!".tr); } //Midtrans payment @@ -512,10 +512,10 @@ class WalletController extends GetxController { if (url != '') { Get.to(() => MidtransScreen(initialURl: url))!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } @@ -556,7 +556,7 @@ class WalletController extends GetxController { return responseData['payment_url']; } else { ShowToastDialog.showToast( - "something went wrong, please contact admin.".tr(), + "something went wrong, please contact admin.".tr, ); return ''; } @@ -599,12 +599,12 @@ class WalletController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } }); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } } @@ -639,7 +639,7 @@ class WalletController extends GetxController { ); } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -692,7 +692,7 @@ class WalletController extends GetxController { } } else { ShowToastDialog.showToast( - "Something went wrong, please contact admin.".tr(), + "Something went wrong, please contact admin.".tr, ); return ''; } @@ -718,10 +718,10 @@ class WalletController extends GetxController { ), )!.then((value) { if (value == true) { - ShowToastDialog.showToast("Payment Successful!!".tr()); + ShowToastDialog.showToast("Payment Successful!!".tr); walletTopUp(); } else { - ShowToastDialog.showToast("Payment Unsuccessful!!".tr()); + ShowToastDialog.showToast("Payment Unsuccessful!!".tr); } }); } diff --git a/lib/main.dart b/lib/main.dart index 7dae675..47b0a7e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,11 +4,10 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/easy_loading_config.dart'; import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/preferences.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:flutter_phoenix/flutter_phoenix.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'controllers/global_setting_controller.dart'; @@ -17,7 +16,7 @@ import 'firebase_options.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - await EasyLocalization.ensureInitialized(); + await LocalizationService.init(); await Firebase.initializeApp( name: 'default', options: DefaultFirebaseOptions.currentPlatform, @@ -28,19 +27,7 @@ void main() async { Get.put(ThemeController()); await configEasyLoading(); - runApp( - EasyLocalization( - startLocale: Locale('uz', 'UZ'), - supportedLocales: [ - Locale('en', 'US'), - Locale('uz', 'UZ'), - Locale('ru', 'RU'), - ], - path: 'assets/translations', - fallbackLocale: Locale('uz', 'UZ'), - child: MyApp(), - ), - ); + runApp(MyApp()); } class MyApp extends StatelessWidget { @@ -56,11 +43,12 @@ class MyApp extends StatelessWidget { designSize: Size(375, 812), minTextAdapt: true, splitScreenMode: true, - child: MaterialApp( + child: GetMaterialApp( + translations: LocalizationService(), + locale: const Locale('uz', 'UZ'), navigatorKey: AppRouter.navigatorKey, - localizationsDelegates: context.localizationDelegates, - supportedLocales: context.supportedLocales, - locale: context.locale, + fallbackLocale: const Locale('uz', 'UZ'), + supportedLocales: LocalizationService.supportedLocales, debugShowCheckedModeBanner: false, builder: (context, child) { return SafeArea( diff --git a/lib/payment/MercadoPagoScreen.dart b/lib/payment/MercadoPagoScreen.dart index 432e62c..c8ff28f 100644 --- a/lib/payment/MercadoPagoScreen.dart +++ b/lib/payment/MercadoPagoScreen.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:customer/constant/constant.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; class MercadoPagoScreen extends StatefulWidget { @@ -65,7 +65,7 @@ class _MercadoPagoScreenState extends State { }, child: Scaffold( appBar: AppBar( - title: Text("Payment".tr()), + title: Text("Payment".tr), centerTitle: false, leading: GestureDetector( onTap: () { @@ -85,12 +85,12 @@ class _MercadoPagoScreenState extends State { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr()), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), + title: Text('Cancel Payment'.tr), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), actions: [ TextButton( child: Text( - 'Cancel'.tr(), + 'Cancel'.tr, style: const TextStyle(color: Colors.red), ), onPressed: () { @@ -100,7 +100,7 @@ class _MercadoPagoScreenState extends State { ), TextButton( child: Text( - 'Continue'.tr(), + 'Continue'.tr, style: const TextStyle(color: Colors.green), ), onPressed: () { diff --git a/lib/payment/PayFastScreen.dart b/lib/payment/PayFastScreen.dart index d1cd451..d8bc2b5 100644 --- a/lib/payment/PayFastScreen.dart +++ b/lib/payment/PayFastScreen.dart @@ -3,10 +3,10 @@ import 'dart:developer'; import 'package:customer/models/payment_model/pay_fast_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; class PayFastScreen extends StatefulWidget { @@ -91,10 +91,10 @@ class _PayFastScreenState extends State { builder: (BuildContext context) { return AlertDialog( title: const Text('Cancel Payment'), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), actions: [ TextButton( - child: Text('Exit'.tr(), style: TextStyle(color: Colors.red)), + child: Text('Exit'.tr, style: TextStyle(color: Colors.red)), onPressed: () { Get.back(); Get.back(result: false); @@ -102,7 +102,7 @@ class _PayFastScreenState extends State { ), TextButton( child: Text( - 'Continue Payment'.tr(), + 'Continue Payment'.tr, style: TextStyle(color: Colors.green), ), onPressed: () { diff --git a/lib/payment/midtrans_screen.dart b/lib/payment/midtrans_screen.dart index 9c6c6c2..2ca9411 100644 --- a/lib/payment/midtrans_screen.dart +++ b/lib/payment/midtrans_screen.dart @@ -2,9 +2,8 @@ import 'dart:async'; import 'dart:developer'; import 'dart:io'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; class MidtransScreen extends StatefulWidget { @@ -104,12 +103,12 @@ class _MidtransScreenState extends State { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr()), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), + title: Text('Cancel Payment'.tr), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), actions: [ TextButton( child: Text( - 'Cancel'.tr(), + 'Cancel'.tr, style: const TextStyle(color: Colors.red), ), onPressed: () { @@ -119,7 +118,7 @@ class _MidtransScreenState extends State { ), TextButton( child: Text( - 'Continue'.tr(), + 'Continue'.tr, style: const TextStyle(color: Colors.green), ), onPressed: () { diff --git a/lib/payment/orangePayScreen.dart b/lib/payment/orangePayScreen.dart index 7d2bbd7..dd71bda 100644 --- a/lib/payment/orangePayScreen.dart +++ b/lib/payment/orangePayScreen.dart @@ -3,9 +3,9 @@ import 'dart:async'; import 'dart:convert'; import 'package:customer/models/payment_model/orange_money.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:webview_flutter/webview_flutter.dart'; @@ -140,7 +140,7 @@ class _OrangeMoneyScreenState extends State { icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: _showCancelDialog, ), - title: Text('Orange Money Payment'.tr()), + title: Text('Orange Money Payment'.tr), ), body: isLoading @@ -156,15 +156,15 @@ class _OrangeMoneyScreenState extends State { barrierDismissible: true, builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr()), - content: Text('Are you sure you want to cancel this payment?'.tr()), + title: Text('Cancel Payment'.tr), + content: Text('Are you sure you want to cancel this payment?'.tr), actions: [ TextButton( child: Text('No', style: TextStyle(color: Colors.green)), onPressed: () => Get.back(), ), TextButton( - child: Text('Yes'.tr(), style: TextStyle(color: Colors.red)), + child: Text('Yes'.tr, style: TextStyle(color: Colors.red)), onPressed: () { timer?.cancel(); Get.back(); // close dialog @@ -190,7 +190,7 @@ class _OrangeMoneyScreenState extends State { // import 'dart:convert'; // import 'package:customer/models/payment_model/orange_money.dart'; // import 'package:flutter/material.dart'; -// import 'package:get/get.dart' hide Trans;// import 'package:http/http.dart' as http; +// import 'package:get/get.dart';// import 'package:http/http.dart' as http; // import 'package:webview_flutter/webview_flutter.dart'; // // class OrangeMoneyScreen extends StatefulWidget { @@ -336,14 +336,14 @@ class _OrangeMoneyScreenState extends State { // barrierDismissible: true, // user must tap button! // builder: (BuildContext context) { // return AlertDialog( -// title: Text('Cancel Payment'.tr()), +// title: Text('Cancel Payment'.tr), // content: SingleChildScrollView( -// child: Text("cancelPayment?".tr()), +// child: Text("cancelPayment?".tr), // ), // actions: [ // TextButton( // child: Text( -// 'Cancel'.tr(), +// 'Cancel'.tr, // style: const TextStyle(color: Colors.red), // ), // onPressed: () { @@ -353,7 +353,7 @@ class _OrangeMoneyScreenState extends State { // ), // TextButton( // child: Text( -// 'Continue'.tr(), +// 'Continue'.tr, // style: const TextStyle(color: Colors.green), // ), // onPressed: () { diff --git a/lib/payment/paystack/pay_stack_screen.dart b/lib/payment/paystack/pay_stack_screen.dart index 51d3854..07786cc 100644 --- a/lib/payment/paystack/pay_stack_screen.dart +++ b/lib/payment/paystack/pay_stack_screen.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'package:customer/payment/paystack/paystack_url_genrater.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; class PayStackScreen extends StatefulWidget { @@ -95,7 +95,7 @@ class _PayStackScreenState extends State { child: Scaffold( appBar: AppBar( backgroundColor: AppThemeData.grey50, - title: Text("Payment".tr()), + title: Text("Payment".tr), centerTitle: false, leading: GestureDetector( onTap: () { diff --git a/lib/payment/xenditScreen.dart b/lib/payment/xenditScreen.dart index 0f3b178..84b058c 100644 --- a/lib/payment/xenditScreen.dart +++ b/lib/payment/xenditScreen.dart @@ -3,9 +3,9 @@ import 'dart:convert'; import 'dart:developer'; import 'package:customer/payment/xenditModel.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:webview_flutter/webview_flutter.dart'; @@ -127,12 +127,12 @@ class _XenditScreenState extends State { barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( - title: Text('Cancel Payment'.tr()), - content: SingleChildScrollView(child: Text("Cancel Payment?".tr())), + title: Text('Cancel Payment'.tr), + content: SingleChildScrollView(child: Text("Cancel Payment?".tr)), actions: [ TextButton( child: Text( - 'Cancel'.tr(), + 'Cancel'.tr, style: const TextStyle(color: Colors.red), ), onPressed: () { @@ -142,7 +142,7 @@ class _XenditScreenState extends State { ), TextButton( child: Text( - 'Continue'.tr(), + 'Continue'.tr, style: const TextStyle(color: Colors.green), ), onPressed: () { diff --git a/lib/screen_ui/auth_screens/forgot_password_screen.dart b/lib/screen_ui/auth_screens/forgot_password_screen.dart index e1ab3ad..24c08a0 100644 --- a/lib/screen_ui/auth_screens/forgot_password_screen.dart +++ b/lib/screen_ui/auth_screens/forgot_password_screen.dart @@ -1,9 +1,10 @@ import 'package:customer/constant/const_texts.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/forgot_password_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -38,7 +39,7 @@ class ForgotPasswordScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - ConstTexts.skip.tr(), + ConstTexts.skip.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -74,7 +75,7 @@ class ForgotPasswordScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.enterYourregisteredEmail.tr(), + ConstTexts.enterYourregisteredEmail.tr, style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -85,14 +86,14 @@ class ForgotPasswordScreen extends StatelessWidget { ), const SizedBox(height: 24), TextFieldWidget( - title: ConstTexts.emailAddress.tr(), + title: ConstTexts.emailAddress.tr, hintText: "abdusalom@gmail.com", controller: controller.emailEditingController.value, ), const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.sendLink.tr(), + title: ConstTexts.sendLink.tr, onPress: controller.forgotPassword, color: isDark @@ -112,7 +113,7 @@ class ForgotPasswordScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: ConstTexts.rememberPassword.tr(), + text: ConstTexts.rememberPassword.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -121,7 +122,7 @@ class ForgotPasswordScreen extends StatelessWidget { ), children: [ TextSpan( - text: ConstTexts.login.tr(), + text: ConstTexts.login.tr, style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, @@ -130,7 +131,7 @@ class ForgotPasswordScreen extends StatelessWidget { recognizer: TapGestureRecognizer() ..onTap = () { - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); }, ), ], diff --git a/lib/screen_ui/auth_screens/login_screen.dart b/lib/screen_ui/auth_screens/login_screen.dart index 832426a..c20f8b9 100644 --- a/lib/screen_ui/auth_screens/login_screen.dart +++ b/lib/screen_ui/auth_screens/login_screen.dart @@ -3,7 +3,8 @@ import 'dart:io'; import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -13,7 +14,7 @@ import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; import '../../themes/round_button_fill.dart'; import '../../themes/text_field_widget.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'forgot_password_screen.dart'; import 'mobile_login_screen.dart'; @@ -38,7 +39,7 @@ class LoginScreen extends StatelessWidget { child: Row( children: [ Text( - ConstTexts.skip.tr(), + ConstTexts.skip.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -72,7 +73,7 @@ class LoginScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - ConstTexts.loginToExplore.tr(), + ConstTexts.loginToExplore.tr, style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -83,15 +84,15 @@ class LoginScreen extends StatelessWidget { ), const SizedBox(height: 24), TextFieldWidget( - title: ConstTexts.emailAddress.tr(), + title: ConstTexts.emailAddress.tr, hintText: "abdusalom@gmail.com", controller: controller.emailController.value, focusNode: controller.emailFocusNode, ), const SizedBox(height: 15), TextFieldWidget( - title: ConstTexts.password.tr(), - hintText: ConstTexts.enterPassword.tr(), + title: ConstTexts.password.tr, + hintText: ConstTexts.enterPassword.tr, controller: controller.passwordController.value, obscureText: controller.passwordVisible.value, focusNode: controller.passwordFocusNode, @@ -133,7 +134,7 @@ class LoginScreen extends StatelessWidget { () => const ForgotPasswordScreen(), ), child: Text( - ConstTexts.forgotPassword.tr(), + ConstTexts.forgotPassword.tr, style: AppThemeData.semiBoldTextStyle( color: AppThemeData.info400, ), @@ -143,7 +144,7 @@ class LoginScreen extends StatelessWidget { const SizedBox(height: 20), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.login.tr(), + title: ConstTexts.login.tr, onPress: controller.loginWithEmail, color: isDark @@ -168,7 +169,7 @@ class LoginScreen extends StatelessWidget { ), const SizedBox(width: 15), Text( - ConstTexts.orContinueWith.tr(), + ConstTexts.orContinueWith.tr, style: AppThemeData.regularTextStyle( color: isDark @@ -192,7 +193,7 @@ class LoginScreen extends StatelessWidget { const SizedBox(height: 25), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.mobileNumber.tr(), + title: ConstTexts.mobileNumber.tr, onPress: () => Get.to(() => const MobileLoginScreen()), isRight: false, @@ -218,7 +219,7 @@ class LoginScreen extends StatelessWidget { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.withGoogle.tr(), + title: ConstTexts.withGoogle.tr, textColor: isDark ? AppThemeData.grey100 @@ -242,7 +243,7 @@ class LoginScreen extends StatelessWidget { ? Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.withApple.tr(), + title: ConstTexts.withApple.tr, isCenter: true, textColor: isDark @@ -273,7 +274,7 @@ class LoginScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "${ConstTexts.dontHaveAccount.tr()} ", + text: "${ConstTexts.dontHaveAccount.tr} ", style: AppThemeData.mediumTextStyle( color: isDark @@ -282,7 +283,7 @@ class LoginScreen extends StatelessWidget { ), children: [ TextSpan( - text: ConstTexts.signUp.tr(), + text: ConstTexts.signUp.tr, style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, @@ -290,7 +291,7 @@ class LoginScreen extends StatelessWidget { recognizer: TapGestureRecognizer() ..onTap = () { - Get.offAll(() => const SignUpScreen()); + Get.offAll(SignUpScreen()); }, ), ], diff --git a/lib/screen_ui/auth_screens/mobile_login_screen.dart b/lib/screen_ui/auth_screens/mobile_login_screen.dart index 9c9c368..bb60041 100644 --- a/lib/screen_ui/auth_screens/mobile_login_screen.dart +++ b/lib/screen_ui/auth_screens/mobile_login_screen.dart @@ -2,12 +2,13 @@ import 'package:country_code_picker/country_code_picker.dart'; import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/assets.dart'; import '../../constant/constant.dart'; import '../../controllers/mobile_login_controller.dart'; @@ -55,7 +56,7 @@ class MobileLoginScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - ConstTexts.skip.tr(), + ConstTexts.skip.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -91,7 +92,7 @@ class MobileLoginScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.useYourMobileNumber.tr(), + ConstTexts.useYourMobileNumber.tr, style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -102,8 +103,8 @@ class MobileLoginScreen extends StatelessWidget { ), const SizedBox(height: 25), TextFieldWidget( - title: ConstTexts.mobileNumber.tr(), - hintText: ConstTexts.enterMobileNumber.tr(), + title: ConstTexts.mobileNumber.tr, + hintText: ConstTexts.enterMobileNumber.tr, controller: controller.mobileController.value, textInputType: const TextInputType.numberWithOptions( @@ -182,7 +183,7 @@ class MobileLoginScreen extends StatelessWidget { const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.sendCode.tr(), + title: ConstTexts.sendCode.tr, onPress: controller.sendOtp, color: isDark @@ -207,7 +208,7 @@ class MobileLoginScreen extends StatelessWidget { ), const SizedBox(width: 15), Text( - ConstTexts.orContinueWith.tr(), + ConstTexts.orContinueWith.tr, style: AppThemeData.regularTextStyle( color: isDark @@ -229,7 +230,7 @@ class MobileLoginScreen extends StatelessWidget { const SizedBox(height: 25), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.emailAddress.tr(), + title: ConstTexts.emailAddress.tr, onPress: () => Get.to(() => const SignUpScreen()), isRight: false, isCenter: true, @@ -257,7 +258,7 @@ class MobileLoginScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "${ConstTexts.dontHaveAccount.tr()} ", + text: "${ConstTexts.dontHaveAccount.tr} ", style: AppThemeData.mediumTextStyle( color: isDark @@ -266,7 +267,7 @@ class MobileLoginScreen extends StatelessWidget { ), children: [ TextSpan( - text: ConstTexts.signUp.tr(), + text: ConstTexts.signUp.tr, style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, @@ -276,7 +277,7 @@ class MobileLoginScreen extends StatelessWidget { recognizer: TapGestureRecognizer() ..onTap = () { - Get.offAll(() => const SignUpScreen()); + Get.offAll(SignUpScreen()); }, ), ], diff --git a/lib/screen_ui/auth_screens/otp_verification_screen.dart b/lib/screen_ui/auth_screens/otp_verification_screen.dart index 0def8c1..54d4231 100644 --- a/lib/screen_ui/auth_screens/otp_verification_screen.dart +++ b/lib/screen_ui/auth_screens/otp_verification_screen.dart @@ -1,10 +1,11 @@ import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/auth_screens/sign_up_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; import '../../constant/assets.dart'; import '../../controllers/otp_verification_controller.dart'; @@ -51,7 +52,7 @@ class OtpVerificationScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - ConstTexts.skip.tr(), + ConstTexts.skip.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -87,7 +88,7 @@ class OtpVerificationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${ConstTexts.enterOtpSent.tr()} ${controller.countryCode} ${controller.maskPhoneNumber(controller.phoneNumber.value)}", + "${ConstTexts.enterOtpSent.tr} ${controller.countryCode} ${controller.maskPhoneNumber(controller.phoneNumber.value)}", style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -165,7 +166,7 @@ class OtpVerificationScreen extends StatelessWidget { controller.sendOTP(); }, child: Text( - ConstTexts.resendOTP.tr(), + ConstTexts.resendOTP.tr, style: AppThemeData.semiBoldTextStyle( color: AppThemeData.info400, fontSize: 16, @@ -180,7 +181,7 @@ class OtpVerificationScreen extends StatelessWidget { /// Verify Button RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.verify.tr(), + title: ConstTexts.verify.tr, onPress: controller.verifyOtp, color: isDark @@ -200,7 +201,7 @@ class OtpVerificationScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: "${ConstTexts.dontHaveAccount.tr()} ", + text: "${ConstTexts.dontHaveAccount.tr} ", style: AppThemeData.mediumTextStyle( color: isDark @@ -209,17 +210,14 @@ class OtpVerificationScreen extends StatelessWidget { ), children: [ TextSpan( - text: ConstTexts.signUp.tr(), + text: ConstTexts.signUp.tr, style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, ), recognizer: TapGestureRecognizer() - ..onTap = - () => Get.offAll( - () => const SignUpScreen(), - ), + ..onTap = () => Get.offAll(SignUpScreen()), ), ], ), diff --git a/lib/screen_ui/auth_screens/sign_up_screen.dart b/lib/screen_ui/auth_screens/sign_up_screen.dart index 9ea4b1f..a46a796 100644 --- a/lib/screen_ui/auth_screens/sign_up_screen.dart +++ b/lib/screen_ui/auth_screens/sign_up_screen.dart @@ -1,7 +1,8 @@ import 'package:country_code_picker/country_code_picker.dart'; import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/location_enable_screens/location_permission_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -13,7 +14,7 @@ import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; import '../../themes/round_button_fill.dart'; import '../../themes/text_field_widget.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'login_screen.dart'; import 'mobile_login_screen.dart'; @@ -45,7 +46,7 @@ class SignUpScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Text( - ConstTexts.skip.tr(), + ConstTexts.skip.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -78,7 +79,7 @@ class SignUpScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.signUpToExplore.tr(), + ConstTexts.signUpToExplore.tr, style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -93,7 +94,7 @@ class SignUpScreen extends StatelessWidget { children: [ Expanded( child: TextFieldWidget( - title: ConstTexts.firstName.tr(), + title: ConstTexts.firstName.tr, hintText: "Abdusalom", controller: controller.firstNameController.value, ), @@ -101,7 +102,7 @@ class SignUpScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: TextFieldWidget( - title: ConstTexts.lastName.tr(), + title: ConstTexts.lastName.tr, hintText: "G'ayratov", controller: controller.lastNameController.value, ), @@ -110,15 +111,15 @@ class SignUpScreen extends StatelessWidget { ), const SizedBox(height: 15), TextFieldWidget( - title: ConstTexts.emailAddress.tr(), + title: ConstTexts.emailAddress.tr, hintText: "abdusalom@gmail.com", controller: controller.emailController.value, focusNode: controller.emailFocusNode, ), const SizedBox(height: 15), TextFieldWidget( - title: ConstTexts.mobileNumber.tr(), - hintText: ConstTexts.enterMobileNumber.tr(), + title: ConstTexts.mobileNumber.tr, + hintText: ConstTexts.enterMobileNumber.tr, enable: controller.type.value == "mobileNumber" ? false @@ -195,8 +196,8 @@ class SignUpScreen extends StatelessWidget { ), const SizedBox(height: 15), TextFieldWidget( - title: ConstTexts.password.tr(), - hintText: ConstTexts.enterPassword.tr(), + title: ConstTexts.password.tr, + hintText: ConstTexts.enterPassword.tr, controller: controller.passwordController.value, obscureText: controller.passwordVisible.value, focusNode: controller.passwordFocusNode, @@ -232,8 +233,8 @@ class SignUpScreen extends StatelessWidget { ), const SizedBox(height: 15), TextFieldWidget( - title: ConstTexts.confirmPassword.tr(), - hintText: ConstTexts.enterConfirmPassword.tr(), + title: ConstTexts.confirmPassword.tr, + hintText: ConstTexts.enterConfirmPassword.tr, controller: controller.confirmPasswordController.value, obscureText: controller.conformPasswordVisible.value, suffix: Padding( @@ -268,14 +269,14 @@ class SignUpScreen extends StatelessWidget { ), const SizedBox(height: 15), TextFieldWidget( - title: ConstTexts.referralCode.tr(), - hintText: ConstTexts.enterReferralCode.tr(), + title: ConstTexts.referralCode.tr, + hintText: ConstTexts.enterReferralCode.tr, controller: controller.referralController.value, ), const SizedBox(height: 40), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.signUp.tr(), + title: ConstTexts.signUp.tr, onPress: () => controller.signUp(), color: isDark @@ -300,7 +301,7 @@ class SignUpScreen extends StatelessWidget { ), const SizedBox(width: 15), Text( - ConstTexts.orContinueWith.tr(), + ConstTexts.orContinueWith.tr, style: AppThemeData.regularTextStyle( color: isDark @@ -322,7 +323,7 @@ class SignUpScreen extends StatelessWidget { const SizedBox(height: 25), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.mobileNumber.tr(), + title: ConstTexts.mobileNumber.tr, onPress: () => Get.to(() => const MobileLoginScreen()), isRight: false, isCenter: true, @@ -347,7 +348,7 @@ class SignUpScreen extends StatelessWidget { child: Center( child: Text.rich( TextSpan( - text: ConstTexts.alreadyHaveAccount.tr(), + text: ConstTexts.alreadyHaveAccount.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -356,7 +357,7 @@ class SignUpScreen extends StatelessWidget { ), children: [ TextSpan( - text: ConstTexts.login.tr(), + text: ConstTexts.login.tr, style: AppThemeData.mediumTextStyle( color: AppThemeData.ecommerce300, decoration: TextDecoration.underline, @@ -366,7 +367,7 @@ class SignUpScreen extends StatelessWidget { recognizer: TapGestureRecognizer() ..onTap = () { - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); }, ), ], diff --git a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart index 33fcf94..3cf353d 100644 --- a/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/Intercity_home_screen.dart @@ -14,12 +14,12 @@ import 'package:customer/themes/round_button_border.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart' as get_cord_address; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:latlong2/latlong.dart' as latlong; @@ -280,7 +280,7 @@ class IntercityHomeScreen extends StatelessWidget { controller.setDepartureMarker(lat, lng); } else { ShowToastDialog.showToast( - ConstTexts.serviceIsUnavailable.tr(), + ConstTexts.serviceIsUnavailable.tr, ); } } @@ -313,7 +313,7 @@ class IntercityHomeScreen extends StatelessWidget { ); } else { ShowToastDialog.showToast( - ConstTexts.serviceIsUnavailable.tr(), + ConstTexts.serviceIsUnavailable.tr, ); } } @@ -323,7 +323,7 @@ class IntercityHomeScreen extends StatelessWidget { child: TextFieldWidget( controller: controller.sourceTextEditController.value, - hintText: ConstTexts.pickUpLocation.tr(), + hintText: ConstTexts.pickUpLocation.tr, enable: false, prefix: Padding( padding: EdgeInsets.only(left: 10, right: 10), @@ -387,7 +387,7 @@ class IntercityHomeScreen extends StatelessWidget { .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: ConstTexts.destinationLocation.tr, enable: false, prefix: const Padding( padding: EdgeInsets.only(left: 10, right: 10), @@ -424,7 +424,7 @@ class IntercityHomeScreen extends StatelessWidget { Align( alignment: Alignment.centerLeft, child: Text( - ConstTexts.popularDestinations.tr(), + ConstTexts.popularDestinations.tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: AppThemeData.grey900, @@ -576,7 +576,7 @@ class IntercityHomeScreen extends StatelessWidget { SizedBox(height: 10), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.continueT.tr(), + title: ConstTexts.continueT.tr, onPress: () { if (controller .sourceTextEditController @@ -584,7 +584,7 @@ class IntercityHomeScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsSelectSourceLocation.tr(), + ConstTexts.plsSelectSourceLocation.tr, ); } else if (controller .destinationTextEditController @@ -592,7 +592,7 @@ class IntercityHomeScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsSelectDestinationLocations.tr(), + ConstTexts.plsSelectDestinationLocations.tr, ); } else { controller.bottomSheetType.value = "vehicleSelection"; @@ -650,7 +650,7 @@ class IntercityHomeScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Text( - ConstTexts.selectVehicleType.tr(), + ConstTexts.selectVehicleType.tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: @@ -824,7 +824,7 @@ class IntercityHomeScreen extends StatelessWidget { Obx( () => RoundedButtonFill( borderRadius: 10.r, - title: 'pay_amount'.tr(namedArgs: { + title: 'pay_amount'.trParams({ 'amount': controller.selectedVehicleType.value.id == null ? Constant.amountShow(amount: "0.0") : Constant.amountShow( @@ -842,7 +842,7 @@ class IntercityHomeScreen extends StatelessWidget { controller.bottomSheetType.value = "payment"; } else { ShowToastDialog.showToast( - ConstTexts.plsSelectVehicleTypeFirst.tr(), + ConstTexts.plsSelectVehicleTypeFirst.tr, ); } }, @@ -884,7 +884,7 @@ class IntercityHomeScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.selectPaymentMethod.tr(), + ConstTexts.selectPaymentMethod.tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -914,7 +914,7 @@ class IntercityHomeScreen extends StatelessWidget { controller: scrollController, children: [ Text( - ConstTexts.prefferedPayment.tr(), + ConstTexts.prefferedPayment.tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -994,7 +994,7 @@ class IntercityHomeScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - ConstTexts.otherPaymentOptions.tr(), + ConstTexts.otherPaymentOptions.tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -1150,13 +1150,13 @@ class IntercityHomeScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.continueT.tr(), + title: ConstTexts.continueT.tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr, ); return; } @@ -1165,7 +1165,7 @@ class IntercityHomeScreen extends StatelessWidget { controller.userModel.value.walletAmount ?? 0; if (walletAmount <= 0) { ShowToastDialog.showToast( - ConstTexts.insufficientWallet.tr(), + ConstTexts.insufficientWallet.tr, ); return; } @@ -1321,7 +1321,7 @@ class IntercityHomeScreen extends StatelessWidget { .sourceTextEditController .value, hintText: - ConstTexts.pickUpLocation.tr(), + ConstTexts.pickUpLocation.tr, enable: false, prefix: const Padding( padding: EdgeInsets.only( @@ -1404,8 +1404,7 @@ class IntercityHomeScreen extends StatelessWidget { // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: - ConstTexts.destinationLocation - .tr(), + ConstTexts.destinationLocation.tr, enable: false, prefix: const Padding( padding: EdgeInsets.only( @@ -1453,7 +1452,7 @@ class IntercityHomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - ConstTexts.promoCode.tr(), + ConstTexts.promoCode.tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -1483,15 +1482,14 @@ class IntercityHomeScreen extends StatelessWidget { controller.calculateTotalAmount(); } else { ShowToastDialog.showToast( - ConstTexts.thisOfferNotEligible - .tr(), + ConstTexts.thisOfferNotEligible.tr, ); } } }); }, child: Text( - ConstTexts.viewAll.tr(), + ConstTexts.viewAll.tr, style: AppThemeData.boldTextStyle( decoration: TextDecoration.underline, fontSize: 14, @@ -1552,7 +1550,7 @@ class IntercityHomeScreen extends StatelessWidget { decoration: InputDecoration( border: InputBorder.none, hintText: - ConstTexts.writeCoupon.tr(), + ConstTexts.writeCoupon.tr, contentPadding: EdgeInsets.only( bottom: 10, ), @@ -1569,7 +1567,7 @@ class IntercityHomeScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.redeemNow.tr(), + title: ConstTexts.redeemNow.tr, width: 27.w, fontSizes: 14, @@ -1623,18 +1621,17 @@ class IntercityHomeScreen extends StatelessWidget { ShowToastDialog.showToast( ConstTexts .thisOfferNotEligible - .tr(), + .tr, ); } } else { ShowToastDialog.showToast( - ConstTexts.couponExpired.tr(), + ConstTexts.couponExpired.tr, ); } } else { ShowToastDialog.showToast( - ConstTexts.invalidCouponCode - .tr(), + ConstTexts.invalidCouponCode.tr, ); } }, @@ -1668,7 +1665,7 @@ class IntercityHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.orderSummary.tr(), + ConstTexts.orderSummary.tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -1688,7 +1685,7 @@ class IntercityHomeScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.subtotal.tr(), + ConstTexts.subtotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -1726,7 +1723,7 @@ class IntercityHomeScreen extends StatelessWidget { Row( children: [ Text( - ConstTexts.discount.tr(), + ConstTexts.discount.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, @@ -1845,7 +1842,7 @@ class IntercityHomeScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.orderTotal.tr(), + ConstTexts.orderTotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2035,7 +2032,7 @@ class IntercityHomeScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.confirmBooking.tr(), + title: ConstTexts.confirmBooking.tr, onPress: () async { controller.placeOrder(); }, @@ -2091,7 +2088,7 @@ class IntercityHomeScreen extends StatelessWidget { ), SizedBox(height: 30), Text( - ConstTexts.waitingForDriver.tr(), + ConstTexts.waitingForDriver.tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -2100,7 +2097,7 @@ class IntercityHomeScreen extends StatelessWidget { Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.cancelRide.tr(), + title: ConstTexts.cancelRide.tr, onPress: () async { try { // 1. Update current order status @@ -2150,7 +2147,7 @@ class IntercityHomeScreen extends StatelessWidget { // 5. Optional feedback ShowToastDialog.showToast( - ConstTexts.riderCancelledSucces.tr(), + ConstTexts.riderCancelledSucces.tr, ); Get.back(); CabDashboardController cabDashboardController = Get.put( @@ -2158,9 +2155,7 @@ class IntercityHomeScreen extends StatelessWidget { ); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast( - ConstTexts.failedToCancel.tr(), - ); + ShowToastDialog.showToast(ConstTexts.failedToCancel.tr); } }, color: AppThemeData.danger300, @@ -2258,7 +2253,7 @@ class IntercityHomeScreen extends StatelessWidget { controller .sourceTextEditController .value, - hintText: ConstTexts.pickUpLocation.tr(), + hintText: ConstTexts.pickUpLocation.tr, enable: false, readOnly: true, prefix: const Padding( @@ -2307,7 +2302,7 @@ class IntercityHomeScreen extends StatelessWidget { // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: - ConstTexts.destinationLocation.tr(), + ConstTexts.destinationLocation.tr, enable: false, readOnly: true, prefix: const Padding( @@ -2454,7 +2449,7 @@ class IntercityHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.orderSummary.tr(), + ConstTexts.orderSummary.tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -2474,7 +2469,7 @@ class IntercityHomeScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.subtotal.tr(), + ConstTexts.subtotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2510,7 +2505,7 @@ class IntercityHomeScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.discount.tr(), + ConstTexts.discount.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2599,7 +2594,7 @@ class IntercityHomeScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.orderTotal.tr(), + ConstTexts.orderTotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2775,7 +2770,7 @@ class IntercityHomeScreen extends StatelessWidget { icon: Icon(Icons.call, color: Colors.white), onPress: () async { ShowToastDialog.showLoader( - ConstTexts.pleaseWait.tr(), + ConstTexts.pleaseWait.tr, ); LocationData location = @@ -2802,8 +2797,9 @@ class IntercityHomeScreen extends StatelessWidget { content: Builder( builder: (context) { return Text( - ConstTexts.yourSosRequest - .tr(), + ConstTexts + .yourSosRequest + .tr, ); }, ), @@ -2825,7 +2821,7 @@ class IntercityHomeScreen extends StatelessWidget { return Text( ConstTexts .yourSosrequestAlreadySubmitted - .tr(), + .tr, ); }, ), @@ -2855,7 +2851,7 @@ class IntercityHomeScreen extends StatelessWidget { controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.payNow.tr(), + title: ConstTexts.payNow.tr, onPress: () async { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { @@ -2928,7 +2924,7 @@ class IntercityHomeScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - ConstTexts.somethingWentWrong.tr(), + ConstTexts.somethingWentWrong.tr, ); } else { CreateRazorPayOrderModel result = value; @@ -2942,7 +2938,7 @@ class IntercityHomeScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr, ); } }, diff --git a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart index 56de16c..93ed78c 100644 --- a/lib/screen_ui/cab_service_screens/cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_booking_screen.dart @@ -14,11 +14,10 @@ import 'package:customer/themes/round_button_border.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:latlong2/latlong.dart' as latlong; @@ -286,7 +285,7 @@ class CabBookingScreen extends StatelessWidget { controller.setDepartureMarker(lat, lng); } else { ShowToastDialog.showToast( - ConstTexts.serviceIsUnavailable.tr(), + ConstTexts.serviceIsUnavailable.tr, ); } } @@ -319,7 +318,7 @@ class CabBookingScreen extends StatelessWidget { ); } else { ShowToastDialog.showToast( - ConstTexts.serviceIsUnavailable.tr(), + ConstTexts.serviceIsUnavailable.tr, ); } } @@ -330,7 +329,7 @@ class CabBookingScreen extends StatelessWidget { controller: controller.sourceTextEditController.value, // backgroundColor: AppThemeData.cardColor, - hintText: ConstTexts.pickUpLocation.tr(), + hintText: ConstTexts.pickUpLocation.tr, enable: false, prefix: Padding( padding: EdgeInsets.only(left: 10, right: 10), @@ -394,7 +393,7 @@ class CabBookingScreen extends StatelessWidget { .value, // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, - hintText: ConstTexts.destinationLocation.tr(), + hintText: ConstTexts.destinationLocation.tr, // backgroundColor: AppThemeData.cardColor, enable: false, prefix: const Padding( @@ -431,7 +430,7 @@ class CabBookingScreen extends StatelessWidget { SizedBox(height: 15), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.continueT.tr(), + title: ConstTexts.continueT.tr, onPress: () { if (controller .sourceTextEditController @@ -439,7 +438,7 @@ class CabBookingScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsSelectSourceLocation.tr(), + ConstTexts.plsSelectSourceLocation.tr, ); } else if (controller .destinationTextEditController @@ -447,7 +446,7 @@ class CabBookingScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsSelectDestinationLocations.tr(), + ConstTexts.plsSelectDestinationLocations.tr, ); } else { controller.bottomSheetType.value = "vehicleSelection"; @@ -506,7 +505,7 @@ class CabBookingScreen extends StatelessWidget { Padding( padding: EdgeInsetsGeometry.symmetric(horizontal: 16.r), child: Text( - ConstTexts.selectVehicleType.tr(), + ConstTexts.selectVehicleType.tr, style: AppThemeData.boldTextStyle( fontSize: 18.sp, color: @@ -668,15 +667,21 @@ class CabBookingScreen extends StatelessWidget { child: Obx( () => RoundedButtonFill( borderRadius: 10.r, - title: 'pay_amount'.tr(namedArgs: { - 'amount': controller.selectedVehicleType.value.id == null - ? Constant.amountShow(amount: "0.0") - : Constant.amountShow( - amount: controller - .getAmount(controller.selectedVehicleType.value) - .toString(), - ), -}), + title: 'pay_amount'.trParams({ + 'amount': + controller.selectedVehicleType.value.id == null + ? Constant.amountShow(amount: "0.0") + : Constant.amountShow( + amount: + controller + .getAmount( + controller + .selectedVehicleType + .value, + ) + .toString(), + ), + }), onPress: () async { if (controller.selectedVehicleType.value.id != null) { @@ -684,7 +689,7 @@ class CabBookingScreen extends StatelessWidget { controller.bottomSheetType.value = "payment"; } else { ShowToastDialog.showToast( - ConstTexts.plsSelectVehicleTypeFirst.tr(), + ConstTexts.plsSelectVehicleTypeFirst.tr, ); } }, @@ -904,13 +909,13 @@ class CabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.continueT.tr(), + title: ConstTexts.continueT.tr, color: AppThemeData.mainColor, textColor: AppThemeData.grey50, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr, ); return; } @@ -919,7 +924,7 @@ class CabBookingScreen extends StatelessWidget { controller.userModel.value.walletAmount ?? 0; if (walletAmount <= 0) { ShowToastDialog.showToast( - ConstTexts.insufficientWallet.tr(), + ConstTexts.insufficientWallet.tr, ); return; } @@ -1059,7 +1064,7 @@ class CabBookingScreen extends StatelessWidget { .sourceTextEditController .value, hintText: - ConstTexts.pickUpLocation.tr(), + ConstTexts.pickUpLocation.tr, enable: false, prefix: const Padding( padding: EdgeInsets.only( @@ -1142,8 +1147,7 @@ class CabBookingScreen extends StatelessWidget { // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: - ConstTexts.destinationLocation - .tr(), + ConstTexts.destinationLocation.tr, enable: false, prefix: const Padding( padding: EdgeInsets.only( @@ -1190,7 +1194,7 @@ class CabBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - ConstTexts.promoCode.tr(), + ConstTexts.promoCode.tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -1224,15 +1228,14 @@ class CabBookingScreen extends StatelessWidget { controller.calculateTotalAmount(); } else { ShowToastDialog.showToast( - ConstTexts.thisOfferNotEligible - .tr(), + ConstTexts.thisOfferNotEligible.tr, ); } } }); }, child: Text( - ConstTexts.viewAll.tr(), + ConstTexts.viewAll.tr, style: AppThemeData.boldTextStyle( decoration: TextDecoration.underline, fontSize: 14, @@ -1293,7 +1296,7 @@ class CabBookingScreen extends StatelessWidget { decoration: InputDecoration( border: InputBorder.none, hintText: - ConstTexts.writeCoupon.tr(), + ConstTexts.writeCoupon.tr, contentPadding: EdgeInsets.only( bottom: 10, ), @@ -1310,7 +1313,7 @@ class CabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.redeemNow.tr(), + title: ConstTexts.redeemNow.tr, width: 27.w, fontSizes: 14, onPress: () async { @@ -1321,8 +1324,9 @@ class CabBookingScreen extends StatelessWidget { .trim() .isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsEnterCouponCode - .tr(), + ConstTexts + .plsEnterCouponCode + .tr, ); return; } @@ -1374,26 +1378,24 @@ class CabBookingScreen extends StatelessWidget { controller .calculateTotalAmount(); ShowToastDialog.showToast( - ConstTexts.couponApplied - .tr(), + ConstTexts.couponApplied.tr, ); controller.update(); } else { ShowToastDialog.showToast( ConstTexts .thisOfferNotEligible - .tr(), + .tr, ); } } else { ShowToastDialog.showToast( - ConstTexts.couponExpired.tr(), + ConstTexts.couponExpired.tr, ); } } else { ShowToastDialog.showToast( - ConstTexts.invalidCouponCode - .tr(), + ConstTexts.invalidCouponCode.tr, ); } }, @@ -1426,7 +1428,7 @@ class CabBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.orderSummary.tr(), + ConstTexts.orderSummary.tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -1446,7 +1448,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.subtotal.tr(), + ConstTexts.subtotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -1484,7 +1486,7 @@ class CabBookingScreen extends StatelessWidget { Row( children: [ Text( - ConstTexts.discount.tr(), + ConstTexts.discount.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, @@ -1603,7 +1605,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.orderTotal.tr(), + ConstTexts.orderTotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -1779,8 +1781,10 @@ class CabBookingScreen extends StatelessWidget { controller.selectedPaymentMethod.value == "cod" ? "Наличными" - : controller.selectedPaymentMethod.value - .tr(), + : controller + .selectedPaymentMethod + .value + .tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 16, @@ -1798,7 +1802,7 @@ class CabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.confirmBooking.tr(), + title: ConstTexts.confirmBooking.tr, onPress: () async { controller.placeOrder(); }, @@ -1854,7 +1858,7 @@ class CabBookingScreen extends StatelessWidget { ), SizedBox(height: 30), Text( - ConstTexts.waitingForDriver.tr(), + ConstTexts.waitingForDriver.tr, style: AppThemeData.boldTextStyle( fontSize: 18.sp, color: @@ -1866,7 +1870,7 @@ class CabBookingScreen extends StatelessWidget { Image.asset('assets/loader.gif', width: 250), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.cancelRide.tr(), + title: ConstTexts.cancelRide.tr, color: AppThemeData.mainColor, textColor: AppThemeData.surface, onPress: () async { @@ -1913,7 +1917,7 @@ class CabBookingScreen extends StatelessWidget { await FireStoreUtils.updateUser(Constant.userModel!); } ShowToastDialog.showToast( - ConstTexts.riderCancelledSucces.tr(), + ConstTexts.riderCancelledSucces.tr, ); // Get.offAll(const CabDashboardScreen()); Get.back(); @@ -1922,9 +1926,7 @@ class CabBookingScreen extends StatelessWidget { ); cabDashboardController.selectedIndex.value = 0; } catch (e) { - ShowToastDialog.showToast( - ConstTexts.failedToCancel.tr(), - ); + ShowToastDialog.showToast(ConstTexts.failedToCancel.tr); } }, ), @@ -2019,7 +2021,7 @@ class CabBookingScreen extends StatelessWidget { controller .sourceTextEditController .value, - hintText: ConstTexts.pickUpLocation.tr(), + hintText: ConstTexts.pickUpLocation.tr, enable: false, readOnly: true, prefix: const Padding( @@ -2067,7 +2069,7 @@ class CabBookingScreen extends StatelessWidget { // backgroundColor: AppThemeData.grey50, // borderColor: AppThemeData.grey50, hintText: - ConstTexts.destinationLocation.tr(), + ConstTexts.destinationLocation.tr, enable: false, readOnly: true, prefix: const Padding( @@ -2280,7 +2282,7 @@ class CabBookingScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - ConstTexts.pleaseWait.tr(), + ConstTexts.pleaseWait.tr, ); UserModel? customer = @@ -2491,7 +2493,7 @@ class CabBookingScreen extends StatelessWidget { ), ), Text( - ConstTexts.change.tr(), + ConstTexts.change.tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 16, @@ -2525,7 +2527,7 @@ class CabBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.orderSummary.tr(), + ConstTexts.orderSummary.tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -2545,7 +2547,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.subtotal.tr(), + ConstTexts.subtotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2581,7 +2583,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.discount.tr(), + ConstTexts.discount.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2670,7 +2672,7 @@ class CabBookingScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.orderTotal.tr(), + ConstTexts.orderTotal.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -2718,7 +2720,7 @@ class CabBookingScreen extends StatelessWidget { icon: const Icon(Icons.call, color: Colors.white), onPress: () async { ShowToastDialog.showLoader( - ConstTexts.pleaseWait.tr(), + ConstTexts.pleaseWait.tr, ); LocationData location = @@ -2740,7 +2742,7 @@ class CabBookingScreen extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - ConstTexts.yourSosRequest.tr(), + ConstTexts.yourSosRequest.tr, ), backgroundColor: Colors.green, duration: Duration(seconds: 3), @@ -2754,7 +2756,7 @@ class CabBookingScreen extends StatelessWidget { content: Text( ConstTexts .yourSosrequestAlreadySubmitted - .tr(), + .tr, ), backgroundColor: Colors.red, duration: Duration(seconds: 3), @@ -2777,7 +2779,7 @@ class CabBookingScreen extends StatelessWidget { controller.currentOrder.value.paymentStatus == false) { return RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.payNow.tr(), + title: ConstTexts.payNow.tr, onPress: () async { if (controller.selectedPaymentMethod.value == PaymentGateway.stripe.name) { @@ -2822,8 +2824,9 @@ class CabBookingScreen extends StatelessWidget { Constant.userModel!.walletAmount! < controller.totalAmount.value) { ShowToastDialog.showToast( - ConstTexts.youDoNothaveSufficientwalletBalance - .tr(), + ConstTexts + .youDoNothaveSufficientwalletBalance + .tr, ); } else { controller.completeOrder(); @@ -2859,7 +2862,7 @@ class CabBookingScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - ConstTexts.somethingWentWrong.tr(), + ConstTexts.somethingWentWrong.tr, ); } else { CreateRazorPayOrderModel result = value; @@ -2873,7 +2876,7 @@ class CabBookingScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr, ); } }, @@ -3007,7 +3010,7 @@ class CabBookingScreen extends StatelessWidget { : Expanded( child: Text( value.name == "cod" - ? ConstTexts.cash.tr() + ? ConstTexts.cash.tr : value.name.capitalizeString(), textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( diff --git a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart index c74bdb0..013c0fe 100644 --- a/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_coupon_code_screen.dart @@ -7,9 +7,9 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class CabCouponCodeScreen extends StatelessWidget { const CabCouponCodeScreen({super.key}); @@ -52,7 +52,7 @@ class CabCouponCodeScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - ConstTexts.coupon.tr(), + ConstTexts.coupon.tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -67,7 +67,7 @@ class CabCouponCodeScreen extends StatelessWidget { ? Constant.loader() : controller.cabCouponList.isEmpty ? Constant.showEmptyView( - message: ConstTexts.couponNotFound.tr(), + message: ConstTexts.couponNotFound.tr, ) : ListView.builder( shrinkWrap: true, @@ -182,7 +182,7 @@ class CabCouponCodeScreen extends StatelessWidget { Get.back(result: couponModel); }, child: Text( - ConstTexts.tapToApply.tr(), + ConstTexts.tapToApply.tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, diff --git a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart index 2e29d07..f591e5f 100644 --- a/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_dashboard_screen.dart @@ -3,11 +3,11 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class CabDashboardScreen extends StatelessWidget { const CabDashboardScreen({super.key}); @@ -52,21 +52,21 @@ class CabDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: ConstTexts.home.tr(), + label: ConstTexts.home.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", - label: ConstTexts.myBookings.tr(), + label: ConstTexts.myBookings.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", - label: ConstTexts.profile.tr(), + label: ConstTexts.profile.tr, controller: controller, ), ] @@ -75,28 +75,28 @@ class CabDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: ConstTexts.home.tr(), + label: ConstTexts.home.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", - label: ConstTexts.myBookings.tr(), + label: ConstTexts.myBookings.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", - label: ConstTexts.wallet.tr(), + label: ConstTexts.wallet.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", - label: ConstTexts.profile.tr(), + label: ConstTexts.profile.tr, controller: controller, ), ], diff --git a/lib/screen_ui/cab_service_screens/cab_home_screen.dart b/lib/screen_ui/cab_service_screens/cab_home_screen.dart index bf9e6d9..a498ceb 100644 --- a/lib/screen_ui/cab_service_screens/cab_home_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_home_screen.dart @@ -5,12 +5,13 @@ import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/models/banner_model.dart'; import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/themes/app_them_data.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'Intercity_home_screen.dart'; import 'cab_booking_screen.dart'; @@ -52,7 +53,7 @@ class CabHomeScreen extends HookWidget { Get.offAll(const LoginScreen()); }, child: Text( - ConstTexts.login.tr(), + ConstTexts.login.tr, textAlign: TextAlign.center, style: AppThemeData.boldTextStyle( color: AppThemeData.grey900, @@ -99,7 +100,7 @@ class CabHomeScreen extends HookWidget { children: [ SizedBox(height: 20), Text( - ConstTexts.cabServiceType.tr(), + ConstTexts.cabServiceType.tr, style: AppThemeData.boldTextStyle( color: isDark @@ -123,7 +124,7 @@ class CabHomeScreen extends HookWidget { CrossAxisAlignment.start, children: [ Text( - ConstTexts.everyRideVerified.tr(), + ConstTexts.everyRideVerified.tr, style: AppThemeData.boldTextStyle( color: isDark @@ -133,7 +134,7 @@ class CabHomeScreen extends HookWidget { ), ), Text( - ConstTexts.allDriversIDCheck.tr(), + ConstTexts.allDriversIDCheck.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -171,7 +172,7 @@ class CabHomeScreen extends HookWidget { Constant.sectionConstantModel!.rideType == "both" || Constant.sectionConstantModel!.rideType == "ride" ? _cabOptionMaker( - title: ConstTexts.aroundTheCity.tr(), + title: ConstTexts.aroundTheCity.tr, isMain: false, image: "assets/images/taxi_option.png", useGradient: false, @@ -182,7 +183,7 @@ class CabHomeScreen extends HookWidget { ) : Expanded(child: SizedBox()), _cabOptionMaker( - title: ConstTexts.intercity.tr(), + title: ConstTexts.intercity.tr, isMain: false, useGradient: false, image: "assets/images/outer_city_taxi_option.png", diff --git a/lib/screen_ui/cab_service_screens/cab_order_details.dart b/lib/screen_ui/cab_service_screens/cab_order_details.dart index 1e3b71a..2574520 100644 --- a/lib/screen_ui/cab_service_screens/cab_order_details.dart +++ b/lib/screen_ui/cab_service_screens/cab_order_details.dart @@ -1,10 +1,10 @@ import 'package:customer/constant/const_texts.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/cab_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -64,7 +64,7 @@ class CabOrderDetails extends StatelessWidget { ), const SizedBox(width: 10), Text( - ConstTexts.rideDetails.tr(), + ConstTexts.rideDetails.tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -98,7 +98,7 @@ class CabOrderDetails extends StatelessWidget { width: double.infinity, padding: const EdgeInsets.all(16), child: Text( - "${ConstTexts.orderId.tr()} ${Constant.orderId(orderId: controller.cabOrder.value.id.toString())}", + "${ConstTexts.orderId.tr} ${Constant.orderId(orderId: controller.cabOrder.value.id.toString())}", textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -131,7 +131,7 @@ class CabOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${ConstTexts.bookingData.tr()} ${controller.formatDate(controller.cabOrder.value.scheduleDateTime!)}", + "${ConstTexts.bookingData.tr} ${controller.formatDate(controller.cabOrder.value.scheduleDateTime!)}", textAlign: TextAlign.start, style: TextStyle( @@ -436,7 +436,7 @@ class CabOrderDetails extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - ConstTexts.rideAndFareSummary.tr(), + ConstTexts.rideAndFareSummary.tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -590,9 +590,10 @@ class CabOrderDetails extends StatelessWidget { .isNotEmpty ? ConstTexts .updateReview - .tr() - : ConstTexts.addReview - .tr(), + .tr + : ConstTexts + .addReview + .tr, onPress: () async { final result = await Get.to( () => CabReviewScreen(), @@ -642,8 +643,7 @@ class CabOrderDetails extends StatelessWidget { ), child: RoundedButtonFill( borderRadius: 10.r, - title: - ConstTexts.complain.tr(), + title: ConstTexts.complain.tr, onPress: () async { Get.to( () => ComplainScreen(), @@ -721,7 +721,7 @@ class CabOrderDetails extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - ConstTexts.pleaseWait.tr(), + ConstTexts.pleaseWait.tr, ); UserModel? customer = @@ -828,14 +828,14 @@ class CabOrderDetails extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _iconTile( - "${double.parse(controller.cabOrder.value.distance.toString()).toStringAsFixed(2)} ${ConstTexts.km.tr()}", - ConstTexts.distance.tr(), + "${double.parse(controller.cabOrder.value.distance.toString()).toStringAsFixed(2)} ${ConstTexts.km.tr}", + ConstTexts.distance.tr, "assets/icons/ic_distance_parcel.svg", isDark, ), _iconTile( controller.cabOrder.value.duration ?? '--', - ConstTexts.duration.tr(), + ConstTexts.duration.tr, "assets/icons/ic_duration.svg", isDark, ), @@ -870,7 +870,7 @@ class CabOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ConstTexts.orderSummary.tr(), + ConstTexts.orderSummary.tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey500, @@ -880,7 +880,7 @@ class CabOrderDetails extends StatelessWidget { // Subtotal _summaryTile( - ConstTexts.subtotal.tr(), + ConstTexts.subtotal.tr, Constant.amountShow( amount: controller.subTotal.value.toString(), ), @@ -889,7 +889,7 @@ class CabOrderDetails extends StatelessWidget { // Discount _summaryTile( - ConstTexts.discount.tr(), + ConstTexts.discount.tr, Constant.amountShow( amount: controller.discount.value.toString(), ), @@ -939,7 +939,7 @@ class CabOrderDetails extends StatelessWidget { // Total _summaryTile( - ConstTexts.orderTotal.tr(), + ConstTexts.orderTotal.tr, Constant.amountShow( amount: controller.totalAmount.value.toString(), @@ -1004,7 +1004,7 @@ class CabOrderDetails extends StatelessWidget { Text( value, style: AppThemeData.semiBoldTextStyle( - fontSize: title == ConstTexts.orderTotal.tr() ? 18 : 16, + fontSize: title == ConstTexts.orderTotal.tr ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, ), ), diff --git a/lib/screen_ui/cab_service_screens/cab_review_screen.dart b/lib/screen_ui/cab_service_screens/cab_review_screen.dart index ef6ee21..9ce4651 100644 --- a/lib/screen_ui/cab_service_screens/cab_review_screen.dart +++ b/lib/screen_ui/cab_service_screens/cab_review_screen.dart @@ -1,10 +1,10 @@ import 'package:customer/constant/const_texts.dart'; import 'package:customer/controllers/cab_review_controller.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -37,8 +37,8 @@ class CabReviewScreen extends StatelessWidget { ), title: Text( controller.ratingModel.value != null - ? ConstTexts.updateReview.tr() - : ConstTexts.addReview.tr(), + ? ConstTexts.updateReview.tr + : ConstTexts.addReview.tr, style: TextStyle( color: isDark ? Colors.white : Colors.black, fontSize: 16, @@ -138,7 +138,7 @@ class CabReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 16), child: Text( - ConstTexts.howWasTrip.tr(), + ConstTexts.howWasTrip.tr, style: TextStyle( fontSize: 18, color: @@ -153,7 +153,7 @@ class CabReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - ConstTexts.yourFeedbackWillHelp.tr(), + ConstTexts.yourFeedbackWillHelp.tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -171,7 +171,7 @@ class CabReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 20), child: Text( - ConstTexts.rateFor.tr(), + ConstTexts.rateFor.tr, style: TextStyle( fontSize: 16, color: @@ -230,7 +230,7 @@ class CabReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.all(20.0), child: TextFieldWidget( - hintText: ConstTexts.typeComment.tr(), + hintText: ConstTexts.typeComment.tr, controller: controller.comment.value, maxLine: 5, ), @@ -244,8 +244,8 @@ class CabReviewScreen extends StatelessWidget { title: controller.ratingModel.value != null - ? ConstTexts.updateReview.tr() - : ConstTexts.addReview.tr(), + ? ConstTexts.updateReview.tr + : ConstTexts.addReview.tr, color: AppThemeData.primary300, textColor: isDark diff --git a/lib/screen_ui/cab_service_screens/complain_screen.dart b/lib/screen_ui/cab_service_screens/complain_screen.dart index b3019ce..898bf8f 100644 --- a/lib/screen_ui/cab_service_screens/complain_screen.dart +++ b/lib/screen_ui/cab_service_screens/complain_screen.dart @@ -1,8 +1,8 @@ import 'package:customer/constant/const_texts.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/complain_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -50,7 +50,7 @@ class ComplainScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - ConstTexts.complain.tr(), + ConstTexts.complain.tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -69,16 +69,16 @@ class ComplainScreen extends StatelessWidget { children: [ Obx( () => TextFieldWidget( - title: ConstTexts.title.tr(), - hintText: ConstTexts.title.tr(), + title: ConstTexts.title.tr, + hintText: ConstTexts.title.tr, controller: controller.title.value, ), ), const SizedBox(height: 10), Obx( () => TextFieldWidget( - title: ConstTexts.complain.tr(), - hintText: ConstTexts.typeDescription.tr(), + title: ConstTexts.complain.tr, + hintText: ConstTexts.typeDescription.tr, controller: controller.comment.value, maxLine: 8, ), @@ -86,7 +86,7 @@ class ComplainScreen extends StatelessWidget { const SizedBox(height: 20), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.save.tr(), + title: ConstTexts.save.tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.submitComplain(), diff --git a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart index de98f82..5f427aa 100644 --- a/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart +++ b/lib/screen_ui/cab_service_screens/my_cab_booking_screen.dart @@ -6,10 +6,11 @@ import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/my_cab_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -46,7 +47,7 @@ class MyCabBookingScreen extends StatelessWidget { children: [ const SizedBox(width: 10), Text( - ConstTexts.rideHistory.tr(), + ConstTexts.rideHistory.tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -101,7 +102,7 @@ class MyCabBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - ConstTexts.plsLoginToAcc.tr(), + ConstTexts.plsLoginToAcc.tr, style: TextStyle( color: isDark @@ -113,7 +114,7 @@ class MyCabBookingScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - ConstTexts.youAreNotLoggedIn.tr(), + ConstTexts.youAreNotLoggedIn.tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -127,7 +128,7 @@ class MyCabBookingScreen extends StatelessWidget { const SizedBox(height: 20), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.login.tr(), + title: ConstTexts.login.tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -147,7 +148,7 @@ class MyCabBookingScreen extends StatelessWidget { if (orders.isEmpty) { return Center( child: Text( - ConstTexts.noOrderfound.tr(), + ConstTexts.noOrderfound.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -405,7 +406,7 @@ class MyCabBookingScreen extends StatelessWidget { order.paymentStatus == false ? RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.payNow.tr(), + title: ConstTexts.payNow.tr, onPress: () async { controller .selectedPaymentMethod @@ -471,7 +472,7 @@ class MyCabBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - ConstTexts.selectPaymentMethod.tr(), + ConstTexts.selectPaymentMethod.tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -495,7 +496,7 @@ class MyCabBookingScreen extends StatelessWidget { controller: scrollController, children: [ Text( - ConstTexts.prefferedPayment.tr(), + ConstTexts.prefferedPayment.tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -567,7 +568,7 @@ class MyCabBookingScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - ConstTexts.otherPaymentOptions.tr(), + ConstTexts.otherPaymentOptions.tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -716,13 +717,13 @@ class MyCabBookingScreen extends StatelessWidget { ), RoundedButtonFill( borderRadius: 10.r, - title: ConstTexts.continueT.tr(), + title: ConstTexts.continueT.tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr, ); } else { if (controller.selectedPaymentMethod.value == @@ -768,7 +769,7 @@ class MyCabBookingScreen extends StatelessWidget { Constant.userModel!.walletAmount! < controller.totalAmount.value) { ShowToastDialog.showToast( - ConstTexts.youDoNothaveSufficientwalletBalance.tr(), + ConstTexts.youDoNothaveSufficientwalletBalance.tr, ); } else { controller.completeOrder(); @@ -804,7 +805,7 @@ class MyCabBookingScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - ConstTexts.somethingWentWrong.tr(), + ConstTexts.somethingWentWrong.tr, ); } else { CreateRazorPayOrderModel result = value; @@ -816,7 +817,7 @@ class MyCabBookingScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - ConstTexts.plsSelectPaymentMethod.tr(), + ConstTexts.plsSelectPaymentMethod.tr, ); } } diff --git a/lib/screen_ui/ecommarce/all_brand_product_screen.dart b/lib/screen_ui/ecommarce/all_brand_product_screen.dart index 0545863..3cadbc7 100644 --- a/lib/screen_ui/ecommarce/all_brand_product_screen.dart +++ b/lib/screen_ui/ecommarce/all_brand_product_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class AllBrandProductScreen extends StatelessWidget { const AllBrandProductScreen({super.key}); diff --git a/lib/screen_ui/ecommarce/all_category_product_screen.dart b/lib/screen_ui/ecommarce/all_category_product_screen.dart index 30afacd..26e4825 100644 --- a/lib/screen_ui/ecommarce/all_category_product_screen.dart +++ b/lib/screen_ui/ecommarce/all_category_product_screen.dart @@ -9,7 +9,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class AllCategoryProductScreen extends StatelessWidget { const AllCategoryProductScreen({super.key}); diff --git a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart index dfdbdc0..8e42832 100644 --- a/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/dash_board_e_commerce_screen.dart @@ -2,10 +2,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dash_board_controller.dart'; import 'package:customer/controllers/dash_board_ecommarce_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/theme_controller.dart'; class DashBoardEcommerceScreen extends StatelessWidget { @@ -52,28 +52,28 @@ class DashBoardEcommerceScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr(), + label: 'Favourites'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", - label: 'Orders'.tr(), + label: 'Orders'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ] @@ -82,35 +82,35 @@ class DashBoardEcommerceScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr(), + label: 'Favourites'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", - label: 'Wallet'.tr(), + label: 'Wallet'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", - label: 'Orders'.tr(), + label: 'Orders'.tr, controller: controller, ), navigationBarItem( isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ], diff --git a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart index 7e4dae3..720d510 100644 --- a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart @@ -28,17 +28,18 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_border.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/themes/text_field_widget.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:customer/widget/video_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; class HomeECommerceScreen extends StatelessWidget { @@ -76,7 +77,7 @@ class HomeECommerceScreen extends StatelessWidget { Get.offAll(const LoginScreen()); }, child: Text( - "Login".tr(), + "Login".tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle( color: @@ -109,7 +110,7 @@ class HomeECommerceScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); // ✅ declare it once here! ShippingAddress shippingAddress = ShippingAddress(); @@ -296,7 +297,7 @@ class HomeECommerceScreen extends StatelessWidget { ); }, child: TextFieldWidget( - hintText: 'Search the store, item and more...'.tr(), + hintText: 'Search the store, item and more...'.tr, controller: null, enable: false, backgroundColor: AppThemeData.grey50, @@ -333,7 +334,7 @@ class HomeECommerceScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Category".tr(), + "Category".tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( color: @@ -349,7 +350,7 @@ class HomeECommerceScreen extends StatelessWidget { Get.to(const ViewAllCategoryScreen()); }, child: Text( - "View all".tr(), + "View all".tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( decoration: TextDecoration.underline, @@ -464,7 +465,7 @@ class HomeECommerceScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Highlights for you".tr(), + "Highlights for you".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -489,7 +490,7 @@ class HomeECommerceScreen extends StatelessWidget { }); }, child: Text( - "View all".tr(), + "View all".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: @@ -545,7 +546,7 @@ class HomeECommerceScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( - "New Arrivals".tr(), + "New Arrivals".tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( color: @@ -592,14 +593,14 @@ class HomeECommerceScreen extends StatelessWidget { isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - title: 'View All Arrivals'.tr(), + title: 'View All Arrivals'.tr, onPress: () { Get.to( RestaurantListScreen(), arguments: { "vendorList": controller.newArrivalRestaurantList, - "title": "New Arrivals".tr(), + "title": "New Arrivals".tr, }, ); }, @@ -612,7 +613,7 @@ class HomeECommerceScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Top Brands".tr(), + "Top Brands".tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( color: @@ -776,7 +777,7 @@ class HomeECommerceScreen extends StatelessWidget { ), Text( "Style up with the latest fits, now at unbeatable prices." - .tr(), + .tr, textAlign: TextAlign.start, style: AppThemeData.regularTextStyle( @@ -1168,7 +1169,7 @@ class HomeECommerceScreen extends StatelessWidget { // children: [ // Expanded( // child: Text( - // "Highlights for you".tr(), + // "Highlights for you".tr, // textAlign: TextAlign.start, // style: TextStyle( // fontFamily: AppThemeData.semiBold, @@ -1184,7 +1185,7 @@ class HomeECommerceScreen extends StatelessWidget { // }); // }, // child: Text( - // "View all".tr(), + // "View all".tr, // textAlign: TextAlign.center, // style: TextStyle( // fontFamily: AppThemeData.regular, @@ -1225,7 +1226,7 @@ class HomeECommerceScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "All Store".tr(), + "All Store".tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( color: @@ -1387,7 +1388,7 @@ class HomeECommerceScreen extends StatelessWidget { isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - title: 'View All Stores'.tr(), + title: 'View All Stores'.tr, onPress: () { Get.to( const RestaurantListScreen(), @@ -1526,7 +1527,7 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -1538,7 +1539,7 @@ class BannerView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -1558,7 +1559,7 @@ class BannerView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr()); + ShowToastDialog.showToast("Could not launch".tr); } } }, @@ -1632,7 +1633,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -1644,7 +1645,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -1664,7 +1665,7 @@ class BannerBottomView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr()); + ShowToastDialog.showToast("Could not launch".tr); } } }, @@ -1729,7 +1730,7 @@ class AdvertisementHomeCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( model.vendorId!, ); diff --git a/lib/screen_ui/location_enable_screens/address_list_screen.dart b/lib/screen_ui/location_enable_screens/address_list_screen.dart index f8eca2e..accfd1f 100644 --- a/lib/screen_ui/location_enable_screens/address_list_screen.dart +++ b/lib/screen_ui/location_enable_screens/address_list_screen.dart @@ -6,11 +6,11 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/screen_ui/location_enable_screens/enter_manually_location.dart'; import 'package:customer/themes/app_them_data.dart' show AppThemeData; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class AddressListScreen extends StatelessWidget { const AddressListScreen({super.key}); @@ -40,7 +40,7 @@ class AddressListScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "My Addresses".tr(), + "My Addresses".tr, style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -52,7 +52,7 @@ class AddressListScreen extends StatelessWidget { const SizedBox(height: 5), Text( "Allows users to view, manage, add, or edit delivery addresses." - .tr(), + .tr, style: AppThemeData.mediumTextStyle( fontSize: 14, color: AppThemeData.grey600, @@ -63,7 +63,7 @@ class AddressListScreen extends StatelessWidget { child: controller.shippingAddressList.isEmpty ? Constant.showEmptyView( - message: "Address not found".tr(), + message: "Address not found".tr, ) : ListView.separated( itemCount: @@ -143,7 +143,7 @@ class AddressListScreen extends StatelessWidget { vertical: 5, ), child: Text( - "Default".tr(), + "Default".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 12, color: diff --git a/lib/screen_ui/location_enable_screens/enter_manually_location.dart b/lib/screen_ui/location_enable_screens/enter_manually_location.dart index ff1f41e..d2d154a 100644 --- a/lib/screen_ui/location_enable_screens/enter_manually_location.dart +++ b/lib/screen_ui/location_enable_screens/enter_manually_location.dart @@ -6,10 +6,10 @@ import 'package:customer/utils/utils.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/enter_manually_location_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -49,8 +49,8 @@ class EnterManuallyLocationScreen extends StatelessWidget { children: [ Text( controller.mode == "Edit" - ? "Edit Address".tr() - : "Add a New Address".tr(), + ? "Edit Address".tr + : "Add a New Address".tr, style: AppThemeData.boldTextStyle( fontSize: 24, color: @@ -62,7 +62,7 @@ class EnterManuallyLocationScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Enter your location details so we can deliver your orders quickly and accurately." - .tr(), + .tr, style: AppThemeData.mediumTextStyle( fontSize: 14, color: AppThemeData.grey600, @@ -73,7 +73,7 @@ class EnterManuallyLocationScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Set as Default Address".tr(), + "Set as Default Address".tr, style: AppThemeData.mediumTextStyle( fontSize: 14, color: AppThemeData.grey600, @@ -154,8 +154,8 @@ class EnterManuallyLocationScreen extends StatelessWidget { ); }, child: TextFieldWidget( - title: "Choose Location".tr(), - hintText: "Choose Location".tr(), + title: "Choose Location".tr, + hintText: "Choose Location".tr, readOnly: true, enable: false, controller: null, @@ -234,8 +234,8 @@ class EnterManuallyLocationScreen extends StatelessWidget { ), const SizedBox(height: 15), TextFieldWidget( - title: "Flat/House/Floor/Building*".tr(), - hintText: "Enter address details".tr(), + title: "Flat/House/Floor/Building*".tr, + hintText: "Enter address details".tr, controller: controller .houseBuildingTextEditingController @@ -243,15 +243,15 @@ class EnterManuallyLocationScreen extends StatelessWidget { ), const SizedBox(height: 15), TextFieldWidget( - title: "Area/Sector/Locality*".tr(), - hintText: "Enter area/locality".tr(), + title: "Area/Sector/Locality*".tr, + hintText: "Enter area/locality".tr, controller: controller.localityEditingController.value, ), const SizedBox(height: 15), TextFieldWidget( - title: "Nearby Landmark".tr(), - hintText: "Add a landmark".tr(), + title: "Nearby Landmark".tr, + hintText: "Add a landmark".tr, controller: controller.landmarkEditingController.value, ), @@ -259,7 +259,7 @@ class EnterManuallyLocationScreen extends StatelessWidget { Container(height: 1, color: AppThemeData.grey200), const SizedBox(height: 25), Text( - "Save Address As".tr(), + "Save Address As".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey900, @@ -314,14 +314,14 @@ class EnterManuallyLocationScreen extends StatelessWidget { const SizedBox(height: 30), RoundedButtonFill( borderRadius: 10.r, - title: "Save Address".tr(), + title: "Save Address".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.location.value.latitude == null || controller.location.value.longitude == null) { ShowToastDialog.showToast( - "Please select Location".tr(), + "Please select Location".tr, ); } else if (controller .houseBuildingTextEditingController @@ -330,7 +330,7 @@ class EnterManuallyLocationScreen extends StatelessWidget { .isEmpty) { ShowToastDialog.showToast( "Please Enter Flat / House / Floor / Building" - .tr(), + .tr, ); } else if (controller .localityEditingController @@ -338,12 +338,10 @@ class EnterManuallyLocationScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - "Please Enter Area / Sector / Locality".tr(), + "Please Enter Area / Sector / Locality".tr, ); } else { - ShowToastDialog.showLoader( - "Please wait...".tr(), - ); + ShowToastDialog.showLoader("Please wait...".tr); //Common values controller.shippingModel.value.location = diff --git a/lib/screen_ui/location_enable_screens/location_permission_screen.dart b/lib/screen_ui/location_enable_screens/location_permission_screen.dart index dd6adaf..1491fa7 100644 --- a/lib/screen_ui/location_enable_screens/location_permission_screen.dart +++ b/lib/screen_ui/location_enable_screens/location_permission_screen.dart @@ -7,15 +7,16 @@ import 'package:customer/screen_ui/service_home_screen/service_list_screen.dart' import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/assets.dart'; import '../../utils/utils.dart'; @@ -40,7 +41,7 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( - ConstTexts.enableLocation.tr(), + ConstTexts.enableLocation.tr, style: AppThemeData.boldTextStyle( fontSize: 24.sp, color: @@ -55,7 +56,7 @@ class LocationPermissionScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( - ConstTexts.allowLocation.tr(), + ConstTexts.allowLocation.tr, style: AppThemeData.mediumTextStyle( fontSize: 16.sp, color: @@ -70,12 +71,12 @@ class LocationPermissionScreen extends StatelessWidget { RoundedButtonFill( borderRadius: 10.r, fontSizes: 14.sp, - title: ConstTexts.useCurrentLocation.tr(), + title: ConstTexts.useCurrentLocation.tr, onPress: () async { Constant.checkPermission( context: context, onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); @@ -139,12 +140,12 @@ class LocationPermissionScreen extends StatelessWidget { RoundedButtonFill( borderRadius: 10.r, fontSizes: 14.sp, - title: ConstTexts.setFromMap.tr(), + title: ConstTexts.setFromMap.tr, onPress: () async { Constant.checkPermission( context: context, onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); @@ -232,7 +233,7 @@ class LocationPermissionScreen extends StatelessWidget { }); }, child: Text( - ConstTexts.enterManuallyLocation.tr(), + ConstTexts.enterManuallyLocation.tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16.sp, color: diff --git a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart index 7a67cfc..188dc9e 100644 --- a/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart +++ b/lib/screen_ui/maintenance_mode_screen/maintenance_mode_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class MaintenanceModeScreen extends StatelessWidget { const MaintenanceModeScreen({super.key}); @@ -23,7 +23,7 @@ class MaintenanceModeScreen extends StatelessWidget { ), const SizedBox(height: 20), Text( - "We'll be back soon!".tr(), + "We'll be back soon!".tr, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), ), const SizedBox(height: 10), @@ -31,7 +31,7 @@ class MaintenanceModeScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Text( "Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!" - .tr(), + .tr, textAlign: TextAlign.center, style: const TextStyle(fontSize: 16), ), diff --git a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart index 8585299..720e34a 100644 --- a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart +++ b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart @@ -6,10 +6,10 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -34,7 +34,7 @@ class AllAdvertisementScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Highlights for you".tr(), + "Highlights for you".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -48,7 +48,7 @@ class AllAdvertisementScreen extends StatelessWidget { ? Constant.loader() : controller.advertisementList.isEmpty ? Constant.showEmptyView( - message: "Highlights for you not found.".tr(), + message: "Highlights for you not found.".tr, ) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), @@ -86,7 +86,7 @@ class AdvertisementCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( model.vendorId!, ); diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart index 85e802c..47499f8 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/cart_screen.dart @@ -14,12 +14,12 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/user_model.dart'; import '../../../service/fire_store_utils.dart'; @@ -48,7 +48,7 @@ class CartScreen extends StatelessWidget { ), body: cartItem.isEmpty - ? Constant.showEmptyView(message: "Item Not available".tr()) + ? Constant.showEmptyView(message: "Item Not available".tr) : SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -76,7 +76,7 @@ class CartScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service not available in this area" - .tr(), + .tr, ); } } @@ -501,7 +501,7 @@ class CartScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Out of stock" - .tr(), + .tr, ); } } else { @@ -527,7 +527,7 @@ class CartScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Out of stock" - .tr(), + .tr, ); } } @@ -554,7 +554,7 @@ class CartScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Out of stock" - .tr(), + .tr, ); } } @@ -597,7 +597,7 @@ class CartScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Variants".tr(), + "Variants".tr, textAlign: TextAlign.start, style: TextStyle( @@ -687,7 +687,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Addons".tr(), + "Addons".tr, textAlign: TextAlign.start, style: TextStyle( @@ -822,8 +822,8 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Delivery Type'.tr()} (${controller.selectedFoodType.value})" - .tr(), + "${'Delivery Type'.tr} (${controller.selectedFoodType.value})" + .tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -858,7 +858,7 @@ class CartScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Instant Delivery".tr(), + "Instant Delivery".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -874,7 +874,7 @@ class CartScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - "Standard".tr(), + "Standard".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -894,7 +894,7 @@ class CartScreen extends StatelessWidget { Radio( value: controller.deliveryType.value, - groupValue: "instant".tr(), + groupValue: "instant".tr, activeColor: AppThemeData.primary300, onChanged: (value) { @@ -928,7 +928,7 @@ class CartScreen extends StatelessWidget { }, minDateTime: DateTime.now(), displaySubmitButton: true, - pickerTitle: Text('Schedule Time'.tr()), + pickerTitle: Text('Schedule Time'.tr), buttonSingleColor: AppThemeData.primary300, ).show(context); @@ -943,7 +943,7 @@ class CartScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Schedule Time".tr(), + "Schedule Time".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -959,7 +959,7 @@ class CartScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - "${'Your preferred time'.tr()} ${controller.deliveryType.value == "schedule" ? Constant.timestampToDateTime(Timestamp.fromDate(controller.scheduleDateTime.value)) : ""}", + "${'Your preferred time'.tr} ${controller.deliveryType.value == "schedule" ? Constant.timestampToDateTime(Timestamp.fromDate(controller.scheduleDateTime.value)) : ""}", textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -977,7 +977,7 @@ class CartScreen extends StatelessWidget { ), Radio( value: controller.deliveryType.value, - groupValue: "schedule".tr(), + groupValue: "schedule".tr, activeColor: AppThemeData.primary300, onChanged: (value) { controller.deliveryType.value = @@ -998,7 +998,7 @@ class CartScreen extends StatelessWidget { .value, displaySubmitButton: true, pickerTitle: Text( - 'Schedule Time'.tr(), + 'Schedule Time'.tr, ), buttonSingleColor: AppThemeData.primary300, @@ -1020,7 +1020,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Offers & Benefits".tr(), + "Offers & Benefits".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -1066,7 +1066,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Apply Coupons".tr(), + "Apply Coupons".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -1095,7 +1095,7 @@ class CartScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Bill Details".tr(), + "Bill Details".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -1139,7 +1139,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Item totals".tr(), + "Item totals".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1180,7 +1180,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Delivery Fee".tr(), + "Delivery Fee".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1203,7 +1203,7 @@ class CartScreen extends StatelessWidget { Constant.isSelfDeliveryFeature == true) ? Text( - 'Free Delivery'.tr(), + 'Free Delivery'.tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1251,7 +1251,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Coupon Discount".tr(), + "Coupon Discount".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1294,7 +1294,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Special Discount".tr(), + "Special Discount".tr, textAlign: TextAlign.start, style: TextStyle( @@ -1352,7 +1352,7 @@ class CartScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Delivery Tips".tr(), + "Delivery Tips".tr, textAlign: TextAlign.start, style: TextStyle( @@ -1382,7 +1382,7 @@ class CartScreen extends StatelessWidget { .calculatePrice(); }, child: Text( - "Remove".tr(), + "Remove".tr, textAlign: TextAlign.start, style: TextStyle( @@ -1509,7 +1509,7 @@ class CartScreen extends StatelessWidget { children: [ Expanded( child: Text( - "To Pay".tr(), + "To Pay".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1561,7 +1561,7 @@ class CartScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Thanks with a tip!".tr(), + "Thanks with a tip!".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -1606,7 +1606,7 @@ class CartScreen extends StatelessWidget { Expanded( child: Text( "Around the clock, our delivery partners make it happen. Show gratitude with a tip.." - .tr(), + .tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1858,7 +1858,7 @@ class CartScreen extends StatelessWidget { ), child: Center( child: Text( - 'Other'.tr(), + 'Other'.tr, style: TextStyle( color: isDark @@ -1894,9 +1894,9 @@ class CartScreen extends StatelessWidget { child: Column( children: [ TextFieldWidget( - title: 'Remarks'.tr(), + title: 'Remarks'.tr, controller: controller.reMarkController.value, - hintText: 'Write remarks for the store'.tr(), + hintText: 'Write remarks for the store'.tr, maxLine: 4, ), ], @@ -1926,7 +1926,7 @@ class CartScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8), child: Text( - "Cashback Offer".tr(), + "Cashback Offer".tr, style: TextStyle( color: isDark @@ -1938,7 +1938,7 @@ class CartScreen extends StatelessWidget { ), ), Text( - "${"Cashback Name :".tr()} ${controller.bestCashback.value.title ?? ''}", + "${"Cashback Name :".tr} ${controller.bestCashback.value.title ?? ''}", style: TextStyle( color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, @@ -1946,7 +1946,7 @@ class CartScreen extends StatelessWidget { ), ), Text( - "${"You will get".tr()} ${Constant.amountShow(amount: controller.bestCashback.value.cashbackValue?.toStringAsFixed(2))} ${"cashback after completing the order.".tr()}", + "${"You will get".tr} ${Constant.amountShow(amount: controller.bestCashback.value.cashbackValue?.toStringAsFixed(2))} ${"cashback after completing the order.".tr}", style: TextStyle( color: AppThemeData.success300, fontFamily: AppThemeData.semiBold, @@ -2115,7 +2115,7 @@ class CartScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Pay Via".tr(), + "Pay Via".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -2176,7 +2176,7 @@ class CartScreen extends StatelessWidget { : isDark ? AppThemeData.grey800 : AppThemeData.grey100, - title: "Pay Now".tr(), + title: "Pay Now".tr, height: 5, color: controller.selectedPaymentMethod.value != @@ -2192,7 +2192,7 @@ class CartScreen extends StatelessWidget { controller.totalAmount.value)) { ShowToastDialog.showToast( "The total price must be greater than or equal to the coupon discount value for the code to apply. Please review your cart total." - .tr(), + .tr, ); return; } @@ -2206,7 +2206,7 @@ class CartScreen extends StatelessWidget { controller.totalAmount.value)) { ShowToastDialog.showToast( "The total price must be greater than or equal to the special discount value for the code to apply. Please review your cart total." - .tr(), + .tr, ); return; } @@ -2329,7 +2329,7 @@ class CartScreen extends StatelessWidget { Get.back(); ShowToastDialog.showToast( "Something went wrong, please contact admin." - .tr(), + .tr, ); } else { CreateRazorPayOrderModel @@ -2347,7 +2347,7 @@ class CartScreen extends StatelessWidget { } else { controller.isOrderPlaced.value = false; ShowToastDialog.showToast( - "Please select payment method".tr(), + "Please select payment method".tr, ); } controller.isOrderPlaced.value = false; @@ -2411,7 +2411,7 @@ class CartScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ TextFieldWidget( - title: 'Tips Amount'.tr(), + title: 'Tips Amount'.tr, controller: controller.tipsController.value, textInputType: const TextInputType.numberWithOptions( signed: true, @@ -2427,7 +2427,7 @@ class CartScreen extends StatelessWidget { vertical: 14, ), child: Text( - Constant.currencyModel!.symbol.tr(), + Constant.currencyModel!.symbol.tr, style: TextStyle( color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -2436,7 +2436,7 @@ class CartScreen extends StatelessWidget { ), ), ), - hintText: 'Enter Tips Amount'.tr(), + hintText: 'Enter Tips Amount'.tr, ), SizedBox(height: 10), Row( @@ -2444,7 +2444,7 @@ class CartScreen extends StatelessWidget { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "Cancel".tr(), + title: "Cancel".tr, color: isDark ? AppThemeData.grey700 : AppThemeData.grey200, textColor: @@ -2458,13 +2458,13 @@ class CartScreen extends StatelessWidget { Expanded( child: RoundedButtonFill( borderRadius: 10.r, - title: "Add".tr(), + title: "Add".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.tipsController.value.text.isEmpty) { ShowToastDialog.showToast( - "Please enter tips Amount".tr(), + "Please enter tips Amount".tr, ); } else { controller.deliveryTips.value = double.parse( diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart index 4e7a57e..0a31ba3 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/coupon_list_screen.dart @@ -6,9 +6,9 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -31,7 +31,7 @@ class CouponListScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Coupon Code".tr(), + "Coupon Code".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -44,7 +44,7 @@ class CouponListScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: TextFieldWidget( - hintText: 'Enter coupon code'.tr(), + hintText: 'Enter coupon code'.tr, controller: controller.couponCodeController.value, suffix: Padding( padding: const EdgeInsets.symmetric( @@ -59,7 +59,7 @@ class CouponListScreen extends StatelessWidget { .text .isEmpty) { ShowToastDialog.showToast( - "Please enter coupon code".tr(), + "Please enter coupon code".tr, ); return; } @@ -83,15 +83,15 @@ class CouponListScreen extends StatelessWidget { Get.back(); } else { ShowToastDialog.showToast( - "Coupon code not applied".tr(), + "Coupon code not applied".tr, ); } } else { - ShowToastDialog.showToast("Invalid Coupon".tr()); + ShowToastDialog.showToast("Invalid Coupon".tr); } }, child: Text( - "Apply".tr(), + "Apply".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -147,7 +147,7 @@ class CouponListScreen extends StatelessWidget { child: RotatedBox( quarterTurns: -1, child: Text( - "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", + "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -221,12 +221,12 @@ class CouponListScreen extends StatelessWidget { Get.back(); } else { ShowToastDialog.showToast( - "Coupon code not applied".tr(), + "Coupon code not applied".tr, ); } }, child: Text( - "Tap To Apply".tr(), + "Tap To Apply".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart index cf4d0bc..3b711ac 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/oder_placing_screens.dart @@ -6,11 +6,12 @@ import 'package:customer/models/cart_product_model.dart'; import 'package:customer/screen_ui/ecommarce/dash_board_e_commerce_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../dash_board_screens/dash_board_screen.dart'; @@ -44,7 +45,7 @@ class OrderPlacingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Placed".tr(), + "Order Placed".tr, textAlign: TextAlign.start, style: TextStyle( color: @@ -58,7 +59,7 @@ class OrderPlacingScreen extends StatelessWidget { ), Text( "Hang tight — your items are being delivered quickly and safely!" - .tr(), + .tr, textAlign: TextAlign.start, style: TextStyle( color: @@ -100,7 +101,7 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - "Order ID".tr(), + "Order ID".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -147,7 +148,7 @@ class OrderPlacingScreen extends StatelessWidget { ), const SizedBox(height: 20), Text( - "Placing your order".tr(), + "Placing your order".tr, textAlign: TextAlign.start, style: TextStyle( color: @@ -161,7 +162,7 @@ class OrderPlacingScreen extends StatelessWidget { ), Text( "Take a moment to review your order before proceeding to checkout." - .tr(), + .tr, textAlign: TextAlign.start, style: TextStyle( color: @@ -203,7 +204,7 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - "Delivery Address".tr(), + "Delivery Address".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -265,7 +266,7 @@ class OrderPlacingScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - "Order Summary".tr(), + "Order Summary".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -299,7 +300,7 @@ class OrderPlacingScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "${cartProductModel.quantity} x".tr(), + "${cartProductModel.quantity} x".tr, textAlign: TextAlign.start, style: TextStyle( color: @@ -312,7 +313,7 @@ class OrderPlacingScreen extends StatelessWidget { ), ), Text( - "${cartProductModel.name}".tr(), + "${cartProductModel.name}".tr, textAlign: TextAlign.start, style: TextStyle( color: @@ -344,7 +345,7 @@ class OrderPlacingScreen extends StatelessWidget { controller.isPlacing.value ? RoundedButtonFill( borderRadius: 10.r, - title: "Track Order".tr(), + title: "Track Order".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -368,7 +369,7 @@ class OrderPlacingScreen extends StatelessWidget { ) : RoundedButtonFill( borderRadius: 10.r, - title: "Track Order".tr(), + title: "Track Order".tr, height: 5.5, color: isDark diff --git a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart index 8817c3c..3b39149 100644 --- a/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/cart_screen/select_payment_screen.dart @@ -2,10 +2,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cart_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../wallet_screen/wallet_screen.dart'; @@ -20,13 +20,15 @@ class SelectPaymentScreen extends StatelessWidget { init: CartController(), builder: (controller) { return Scaffold( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, appBar: AppBar( - backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: + isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, title: Text( - "Payment Option".tr(), + "Payment Option".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -42,21 +44,23 @@ class SelectPaymentScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Preferred Payment".tr(), + "Preferred Payment".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark ? AppThemeData.grey50 : AppThemeData.grey900, ), ), - const SizedBox( - height: 10, - ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + const SizedBox(height: 10), + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), @@ -66,7 +70,7 @@ class SelectPaymentScreen extends StatelessWidget { blurRadius: 20, offset: Offset(0, 0), spreadRadius: 0, - ) + ), ], ), child: Padding( @@ -74,40 +78,62 @@ class SelectPaymentScreen extends StatelessWidget { child: Column( children: [ Visibility( - visible: controller.walletSettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.wallet, isDark, "assets/images/ic_wallet.png"), + visible: + controller + .walletSettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.wallet, + isDark, + "assets/images/ic_wallet.png", + ), ), Visibility( - visible: controller.cashOnDeliverySettingModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.cod, isDark, "assets/images/ic_cash.png"), + visible: + controller + .cashOnDeliverySettingModel + .value + .isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.cod, + isDark, + "assets/images/ic_cash.png", + ), ), ], ), ), ), - if (controller.walletSettingModel.value.isEnabled == true || controller.cashOnDeliverySettingModel.value.isEnabled == true) + if (controller.walletSettingModel.value.isEnabled == true || + controller.cashOnDeliverySettingModel.value.isEnabled == + true) Column( children: [ - const SizedBox( - height: 10, - ), + const SizedBox(height: 10), Text( - "Other Payment Options".tr(), + "Other Payment Options".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), - const SizedBox( - height: 10, - ), + const SizedBox(height: 10), ], ), Container( decoration: ShapeDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + color: + isDark ? AppThemeData.grey900 : AppThemeData.grey50, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), @@ -117,7 +143,7 @@ class SelectPaymentScreen extends StatelessWidget { blurRadius: 20, offset: Offset(0, 0), spreadRadius: 0, - ) + ), ], ), child: Padding( @@ -125,62 +151,133 @@ class SelectPaymentScreen extends StatelessWidget { child: Column( children: [ Visibility( - visible: controller.stripeModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.stripe, isDark, "assets/images/stripe.png"), + visible: + controller.stripeModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.stripe, + isDark, + "assets/images/stripe.png", + ), ), Visibility( - visible: controller.payPalModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.paypal, isDark, "assets/images/paypal.png"), + visible: + controller.payPalModel.value.isEnabled == true, + child: cardDecoration( + controller, + PaymentGateway.paypal, + isDark, + "assets/images/paypal.png", + ), ), Visibility( - visible: controller.payStackModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.payStack, isDark, "assets/images/paystack.png"), + visible: + controller.payStackModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payStack, + isDark, + "assets/images/paystack.png", + ), ), Visibility( - visible: controller.mercadoPagoModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.mercadoPago, isDark, "assets/images/mercado-pago.png"), + visible: + controller.mercadoPagoModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.mercadoPago, + isDark, + "assets/images/mercado-pago.png", + ), ), Visibility( - visible: controller.flutterWaveModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.flutterWave, isDark, "assets/images/flutterwave_logo.png"), + visible: + controller.flutterWaveModel.value.isEnable == + true, + child: cardDecoration( + controller, + PaymentGateway.flutterWave, + isDark, + "assets/images/flutterwave_logo.png", + ), ), Visibility( - visible: controller.payFastModel.value.isEnable == true, - child: cardDecoration(controller, PaymentGateway.payFast, isDark, "assets/images/payfast.png"), + visible: + controller.payFastModel.value.isEnable == true, + child: cardDecoration( + controller, + PaymentGateway.payFast, + isDark, + "assets/images/payfast.png", + ), ), Visibility( - visible: controller.razorPayModel.value.isEnabled == true, - child: cardDecoration(controller, PaymentGateway.razorpay, isDark, "assets/images/razorpay.png"), + visible: + controller.razorPayModel.value.isEnabled == + true, + child: cardDecoration( + controller, + PaymentGateway.razorpay, + isDark, + "assets/images/razorpay.png", + ), ), Visibility( - visible: controller.midTransModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.midTrans, isDark, "assets/images/midtrans.png"), + visible: + controller.midTransModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.midTrans, + isDark, + "assets/images/midtrans.png", + ), ), Visibility( - visible: controller.orangeMoneyModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.orangeMoney, isDark, "assets/images/orange_money.png"), + visible: + controller.orangeMoneyModel.value.enable == + true, + child: cardDecoration( + controller, + PaymentGateway.orangeMoney, + isDark, + "assets/images/orange_money.png", + ), ), Visibility( - visible: controller.xenditModel.value.enable == true, - child: cardDecoration(controller, PaymentGateway.xendit, isDark, "assets/images/xendit.png"), + visible: + controller.xenditModel.value.enable == true, + child: cardDecoration( + controller, + PaymentGateway.xendit, + isDark, + "assets/images/xendit.png", + ), ), ], ), ), - ) + ), ], ), ), ), bottomNavigationBar: Container( decoration: BoxDecoration( - color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, borderRadius: const BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20))), + color: isDark ? AppThemeData.grey900 : AppThemeData.grey50, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - borderRadius: 10.r, - title: "${'Pay Now'.tr()} | ${Constant.amountShow(amount: controller.totalAmount.value.toString())}".tr(), + borderRadius: 10.r, + title: + "${'Pay Now'.tr} | ${Constant.amountShow(amount: controller.totalAmount.value.toString())}" + .tr, height: 5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -196,7 +293,12 @@ class SelectPaymentScreen extends StatelessWidget { ); } - Obx cardDecoration(CartController controller, PaymentGateway value, isDark, String image) { + Obx cardDecoration( + CartController controller, + PaymentGateway value, + isDark, + String image, + ) { return Obx( () => Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -213,68 +315,89 @@ class SelectPaymentScreen extends StatelessWidget { height: 50, decoration: ShapeDecoration( shape: RoundedRectangleBorder( - side: const BorderSide(width: 1, color: Color(0xFFE5E7EB)), + side: const BorderSide( + width: 1, + color: Color(0xFFE5E7EB), + ), borderRadius: BorderRadius.circular(8), ), ), child: Padding( - padding: EdgeInsets.all(value.name == "payFast" ? 0 : 8.0), - child: Image.asset( - image, + padding: EdgeInsets.all( + value.name == "payFast" ? 0 : 8.0, ), + child: Image.asset(image), ), ), - const SizedBox( - width: 10, - ), + const SizedBox(width: 10), value.name == "wallet" ? Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - value.name.capitalizeString(), - textAlign: TextAlign.start, - style: TextStyle( - fontFamily: AppThemeData.medium, - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + value.name.capitalizeString(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), - Text( - Constant.amountShow(amount: controller.userModel.value.walletAmount == null ? '0.0' : controller.userModel.value.walletAmount.toString()), - textAlign: TextAlign.start, - style: TextStyle( - fontFamily: AppThemeData.semiBold, - fontSize: 16, - color: isDark ? AppThemeData.primary300 : AppThemeData.primary300, - ), - ), - ], - ), - ) - : Expanded( - child: Text( - value.name.capitalizeString(), - textAlign: TextAlign.start, - style: TextStyle( - fontFamily: AppThemeData.medium, - fontSize: 16, - color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, ), + Text( + Constant.amountShow( + amount: + controller.userModel.value.walletAmount == + null + ? '0.0' + : controller + .userModel + .value + .walletAmount + .toString(), + ), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.semiBold, + fontSize: 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + ), + ), + ], + ), + ) + : Expanded( + child: Text( + value.name.capitalizeString(), + textAlign: TextAlign.start, + style: TextStyle( + fontFamily: AppThemeData.medium, + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, ), ), - const Expanded( - child: SizedBox(), - ), + ), + const Expanded(child: SizedBox()), Radio( value: value.name, groupValue: controller.selectedPaymentMethod.value, - activeColor: isDark ? AppThemeData.primary300 : AppThemeData.primary300, + activeColor: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, onChanged: (value) { controller.selectedPaymentMethod.value = value.toString(); }, - ) + ), ], ), ), diff --git a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart index bc0aea5..f49f5fb 100644 --- a/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart +++ b/lib/screen_ui/multi_vendor_service/cashback_screen/cashback_offers_list.dart @@ -1,9 +1,9 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cashback_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; class CashbackOffersListScreen extends StatelessWidget { @@ -21,7 +21,7 @@ class CashbackOffersListScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Cashback Offers".tr(), + "Cashback Offers".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -95,7 +95,7 @@ class CashbackOffersListScreen extends StatelessWidget { ), const SizedBox(height: 6), Text( - "${"Min spent".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].minimumPurchaseAmount ?? 0.0}")} | ${"Valid till".tr()} ${Constant.timestampToDateTime2(controller.cashbackList[index].endDate!)}", + "${"Min spent".tr} ${Constant.amountShow(amount: "${controller.cashbackList[index].minimumPurchaseAmount ?? 0.0}")} | ${"Valid till".tr} ${Constant.timestampToDateTime2(controller.cashbackList[index].endDate!)}", style: TextStyle( color: isDark @@ -106,7 +106,7 @@ class CashbackOffersListScreen extends StatelessWidget { ), ), Text( - "${"Maximum cashback up to".tr()} ${Constant.amountShow(amount: "${controller.cashbackList[index].maximumDiscount ?? 0.0}")}", + "${"Maximum cashback up to".tr} ${Constant.amountShow(amount: "${controller.cashbackList[index].maximumDiscount ?? 0.0}")}", style: TextStyle( color: isDark diff --git a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart index a78a3fc..05cc06b 100644 --- a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart +++ b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart @@ -1,14 +1,14 @@ - import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/change_language_controller.dart'; import 'package:customer/screen_ui/splash_screen/splash_screen.dart'; +import 'package:customer/service/localization_service.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flag/flag_enum.dart'; import 'package:flag/flag_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; class ChangeLanguageScreen extends StatelessWidget { @@ -51,7 +51,7 @@ class ChangeLanguageScreen extends StatelessWidget { // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Text( - // ConstTexts.changeLanguage.tr(), + // ConstTexts.changeLanguage.tr, // style: TextStyle( // fontSize: 24, // color: @@ -63,7 +63,7 @@ class ChangeLanguageScreen extends StatelessWidget { // ), // ), // Text( - // ConstTexts.selectPrefferedLanguage.tr(), + // ConstTexts.selectPrefferedLanguage.tr, // style: TextStyle( // fontSize: 16, // color: @@ -78,32 +78,35 @@ class ChangeLanguageScreen extends StatelessWidget { // ), // ), _buildLanguageButton( - isActive: context.locale == Locale("uz", "UZ"), + isActive: Get.locale == const Locale("uz", "UZ"), flagCode: FlagsCode.UZ, title: "O'zbekcha", onTap: () async { - await context.setLocale(Locale("uz", "UZ")); - Get.forceAppUpdate(); + LocalizationService.changeLocale( + const Locale('uz', 'UZ'), + ); }, ), _buildDivider(), _buildLanguageButton( - isActive: context.locale == Locale("ru", "RU"), + isActive: Get.locale == const Locale('ru', 'RU'), flagCode: FlagsCode.RU, title: "Русский", onTap: () async { - await context.setLocale(Locale("ru", "RU")); - Get.forceAppUpdate(); + LocalizationService.changeLocale( + const Locale("ru", "RU"), + ); }, ), _buildDivider(), _buildLanguageButton( - isActive: context.locale == Locale("en", "US"), + isActive: Get.locale == const Locale("en", "US"), flagCode: FlagsCode.US, title: "English", onTap: () async { - await context.setLocale(Locale("en", "US")); - Get.forceAppUpdate(); + LocalizationService.changeLocale( + const Locale("en", "US"), + ); }, ), diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart index fc40a8a..0931a83 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/chat_screen.dart @@ -5,13 +5,13 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/chat_controller.dart'; import 'package:customer/models/conversation_model.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; import '../../../service/fire_store_utils.dart'; @@ -68,7 +68,7 @@ class ChatScreen extends StatelessWidget { ); }, onEmpty: Constant.showEmptyView( - message: "No Conversion found".tr(), + message: "No Conversion found".tr, ), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance @@ -128,7 +128,7 @@ class ChatScreen extends StatelessWidget { ), focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, - hintText: 'Type message here....'.tr(), + hintText: 'Type message here....'.tr, ), onSubmitted: (value) async { if (controller @@ -397,7 +397,7 @@ class ChatScreen extends StatelessWidget { void onCameraClick(BuildContext context, ChatController controller) { final action = CupertinoActionSheet( - message: Text('Send Media'.tr(), style: const TextStyle(fontSize: 15.0)), + message: Text('Send Media'.tr, style: const TextStyle(fontSize: 15.0)), actions: [ CupertinoActionSheetAction( isDefaultAction: false, @@ -414,7 +414,7 @@ class ChatScreen extends StatelessWidget { controller.sendMessage('', url, '', 'image'); } }, - child: Text("Choose image from gallery".tr()), + child: Text("Choose image from gallery".tr), ), CupertinoActionSheetAction( isDefaultAction: false, @@ -439,7 +439,7 @@ class ChatScreen extends StatelessWidget { } } }, - child: Text("Choose video from gallery".tr()), + child: Text("Choose video from gallery".tr), ), CupertinoActionSheetAction( isDestructiveAction: false, @@ -456,7 +456,7 @@ class ChatScreen extends StatelessWidget { controller.sendMessage('', url, '', 'image'); } }, - child: Text("Take a picture".tr()), + child: Text("Take a picture".tr), ), // CupertinoActionSheetAction( // isDestructiveAction: false, @@ -468,11 +468,11 @@ class ChatScreen extends StatelessWidget { // controller.sendMessage('', videoContainer.videoUrl, videoContainer.thumbnailUrl, 'video'); // } // }, - // child: Text("Record video".tr()), + // child: Text("Record video".tr), // ) ], cancelButton: CupertinoActionSheetAction( - child: Text('Cancel'.tr()), + child: Text('Cancel'.tr), onPressed: () { Get.back(); }, diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart index 39bf091..05ccb43 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart @@ -5,9 +5,9 @@ import 'package:customer/models/user_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -29,7 +29,7 @@ class DriverInboxScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Driver Inbox".tr(), + "Driver Inbox".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -46,7 +46,7 @@ class DriverInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), @@ -157,7 +157,7 @@ class DriverInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance .collection('chat_driver') diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart index a1d22b5..bdf6d90 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart @@ -8,9 +8,9 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dart'; import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -30,7 +30,7 @@ class RestaurantInboxScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Store Inbox".tr(), + "Store Inbox".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -47,7 +47,7 @@ class RestaurantInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), @@ -161,7 +161,7 @@ class RestaurantInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance .collection('chat_store') diff --git a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart index 0421c23..648c8d7 100644 --- a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart @@ -1,10 +1,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dash_board_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; class DashBoardScreen extends StatelessWidget { @@ -51,28 +51,28 @@ class DashBoardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr(), + label: 'Favourites'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", - label: 'Orders'.tr(), + label: 'Orders'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ] @@ -81,35 +81,35 @@ class DashBoardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr(), + label: 'Favourites'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", - label: 'Wallet'.tr(), + label: 'Wallet'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", - label: 'Orders'.tr(), + label: 'Orders'.tr, controller: controller, ), navigationBarItem( isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ], diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart index b19398c..bafde44 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_details.dart @@ -1,10 +1,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dine_in_booking_details_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; @@ -26,7 +26,7 @@ class DineInBookingDetails extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( - "Dine in Bookings".tr(), + "Dine in Bookings".tr, style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -50,7 +50,7 @@ class DineInBookingDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Order'.tr()} ${Constant.orderId(orderId: controller.bookingModel.value.id.toString())}", + "${'Order'.tr} ${Constant.orderId(orderId: controller.bookingModel.value.id.toString())}", style: TextStyle( fontSize: 18, color: @@ -62,7 +62,7 @@ class DineInBookingDetails extends StatelessWidget { ), ), Text( - "${controller.bookingModel.value.totalGuest} ${'Peoples'.tr()}", + "${controller.bookingModel.value.totalGuest} ${'Peoples'.tr}", style: TextStyle( fontSize: 14, color: @@ -200,7 +200,7 @@ class DineInBookingDetails extends StatelessWidget { ); }, child: Text( - "View in Map".tr(), + "View in Map".tr, style: TextStyle( fontSize: 16, color: @@ -245,7 +245,7 @@ class DineInBookingDetails extends StatelessWidget { } }, child: Text( - "Call Now".tr(), + "Call Now".tr, style: TextStyle( fontSize: 16, color: @@ -269,7 +269,7 @@ class DineInBookingDetails extends StatelessWidget { ), const SizedBox(height: 20), Text( - "Booking Details".tr(), + "Booking Details".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -300,7 +300,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Name".tr(), + "Name".tr, style: TextStyle( color: isDark @@ -333,7 +333,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Phone number".tr(), + "Phone number".tr, style: TextStyle( color: isDark @@ -366,7 +366,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Date and Time".tr(), + "Date and Time".tr, style: TextStyle( color: isDark @@ -401,7 +401,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Guest".tr(), + "Guest".tr, style: TextStyle( color: isDark @@ -434,7 +434,7 @@ class DineInBookingDetails extends StatelessWidget { children: [ Expanded( child: Text( - "Discount".tr(), + "Discount".tr, style: TextStyle( color: isDark diff --git a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart index 85e714c..8f45d83 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_booking/dine_in_booking_screen.dart @@ -3,10 +3,10 @@ import 'package:customer/controllers/dine_in_booking_controller.dart'; import 'package:customer/models/dine_in_booking_model.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../themes/app_them_data.dart'; import '../../../widget/my_separator.dart'; @@ -29,7 +29,7 @@ class DineInBookingScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( - "Dine in Bookings".tr(), + "Dine in Bookings".tr, style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -83,7 +83,7 @@ class DineInBookingScreen extends StatelessWidget { vertical: 10, ), child: Text( - "Upcoming".tr(), + "Upcoming".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -126,7 +126,7 @@ class DineInBookingScreen extends StatelessWidget { vertical: 10, ), child: Text( - "History".tr(), + "History".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -159,7 +159,7 @@ class DineInBookingScreen extends StatelessWidget { ? controller.featureList.isEmpty ? Constant.showEmptyView( message: - "Upcoming Booking not found.".tr(), + "Upcoming Booking not found.".tr, ) : ListView.builder( shrinkWrap: true, @@ -182,7 +182,7 @@ class DineInBookingScreen extends StatelessWidget { ) : controller.historyList.isEmpty ? Constant.showEmptyView( - message: "History not found.".tr(), + message: "History not found.".tr, ) : ListView.builder( itemCount: controller.historyList.length, @@ -319,7 +319,7 @@ class DineInBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Name".tr(), + "Name".tr, style: TextStyle( color: isDark @@ -352,7 +352,7 @@ class DineInBookingScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Guest Number".tr(), + "Guest Number".tr, style: TextStyle( color: isDark diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart index a8dcaf3..a029d40 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/book_table_screen.dart @@ -5,10 +5,10 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../../../controllers/theme_controller.dart'; @@ -30,7 +30,7 @@ class BookTableScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( - "Book Table".tr(), + "Book Table".tr, style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -62,7 +62,7 @@ class BookTableScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Numbers of Guests".tr(), + "Numbers of Guests".tr, style: TextStyle( fontSize: 16, color: @@ -159,7 +159,7 @@ class BookTableScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "When are you visiting?".tr(), + "When are you visiting?".tr, style: TextStyle( fontSize: 16, color: @@ -239,7 +239,7 @@ class BookTableScreen extends StatelessWidget { .toDate(), ) == 0 - ? "Today".tr() + ? "Today".tr : Constant.calculateDifference( controller .dateList[index] @@ -247,7 +247,7 @@ class BookTableScreen extends StatelessWidget { .toDate(), ) == 1 - ? "Tomorrow".tr() + ? "Tomorrow".tr : DateFormat( 'EEE', ).format( @@ -309,7 +309,7 @@ class BookTableScreen extends StatelessWidget { borderRadius: 10.r, title: "${controller.dateList[index].discountPer}%" - .tr(), + .tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, width: 12, @@ -325,7 +325,7 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Select time slot and scroll to see offers".tr(), + "Select time slot and scroll to see offers".tr, style: TextStyle( fontSize: 16, color: @@ -430,7 +430,7 @@ class BookTableScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Special Occasion".tr(), + "Special Occasion".tr, style: TextStyle( fontSize: 16, color: @@ -447,7 +447,7 @@ class BookTableScreen extends StatelessWidget { controller.selectedOccasion.value = ""; }, child: Text( - "Clear".tr(), + "Clear".tr, style: TextStyle( color: isDark @@ -490,7 +490,7 @@ class BookTableScreen extends StatelessWidget { ), dense: true, title: Text( - //'${controller.occasionList[i]}'.tr(), + //'${controller.occasionList[i]}'.tr, controller.getLocalizedOccasion( controller.occasionList[i], ), @@ -529,7 +529,7 @@ class BookTableScreen extends StatelessWidget { ), dense: true, title: Text( - 'Is this your first visit?'.tr(), + 'Is this your first visit?'.tr, style: TextStyle( fontSize: 16, color: @@ -558,7 +558,7 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Personal Details".tr(), + "Personal Details".tr, style: TextStyle( fontSize: 16, color: @@ -635,7 +635,7 @@ class BookTableScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Additional Requests".tr(), + "Additional Requests".tr, style: TextStyle( fontSize: 16, color: @@ -647,7 +647,7 @@ class BookTableScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( controller: controller.additionRequestController.value, - hintText: 'Add message here....'.tr(), + hintText: 'Add message here....'.tr, maxLine: 5, ), const SizedBox(height: 20), @@ -662,7 +662,7 @@ class BookTableScreen extends StatelessWidget { padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( borderRadius: 10.r, - title: "Book Now".tr(), + title: "Book Now".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart index 3912671..f4aa823 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_details_screen.dart @@ -4,7 +4,7 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; + import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -13,7 +13,7 @@ import '../restaurant_details_screen/restaurant_details_screen.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; import '../review_list_screen/review_list_screen.dart'; import 'book_table_screen.dart'; @@ -364,7 +364,7 @@ class DineInDetailsScreen extends StatelessWidget { ); }, child: Text( - "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", + "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr}", style: TextStyle( decoration: TextDecoration.underline, @@ -385,8 +385,8 @@ class DineInDetailsScreen extends StatelessWidget { children: [ Text( controller.isOpen.value - ? "Open".tr() - : "Close".tr(), + ? "Open".tr + : "Close".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -421,7 +421,7 @@ class DineInDetailsScreen extends StatelessWidget { ); }, child: Text( - "View Timings".tr(), + "View Timings".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -454,8 +454,8 @@ class DineInDetailsScreen extends StatelessWidget { ), ), Text( - "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr()}" - .tr(), + "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost)} ${'for two'.tr}" + .tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -477,7 +477,7 @@ class DineInDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Also applicable on food delivery".tr(), + "Also applicable on food delivery".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -497,7 +497,7 @@ class DineInDetailsScreen extends StatelessWidget { if (Constant.userModel == null) { ShowToastDialog.showToast( "Please log in to the application. You are not logged in." - .tr(), + .tr, ); } else { Get.to( @@ -570,7 +570,7 @@ class DineInDetailsScreen extends StatelessWidget { .start, children: [ Text( - "Table Booking".tr(), + "Table Booking".tr, style: TextStyle( fontSize: 16, color: @@ -588,7 +588,7 @@ class DineInDetailsScreen extends StatelessWidget { ), Text( "Quick Conformations" - .tr(), + .tr, style: TextStyle( fontSize: 12, color: @@ -688,7 +688,7 @@ class DineInDetailsScreen extends StatelessWidget { children: [ Text( "Available food delivery" - .tr(), + .tr, style: TextStyle( fontSize: 16, color: @@ -705,7 +705,7 @@ class DineInDetailsScreen extends StatelessWidget { ), ), Text( - "in 30-45 mins.".tr(), + "in 30-45 mins.".tr, style: TextStyle( fontSize: 12, color: @@ -749,7 +749,7 @@ class DineInDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Menu".tr(), + "Menu".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -832,7 +832,7 @@ class DineInDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Location, Timing & Costs".tr(), + "Location, Timing & Costs".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -902,7 +902,7 @@ class DineInDetailsScreen extends StatelessWidget { ); }, child: Text( - "View on Map".tr(), + "View on Map".tr, textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -939,7 +939,7 @@ class DineInDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Timing".tr(), + "Timing".tr, textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -956,7 +956,7 @@ class DineInDetailsScreen extends StatelessWidget { InkWell( onTap: () {}, child: Text( - "${controller.vendorModel.value.openDineTime == '' ? "10:00 AM" : controller.vendorModel.value.openDineTime.toString()} ${"To".tr()} ${controller.vendorModel.value.closeDineTime == '' ? "10:00 PM" : controller.vendorModel.value.closeDineTime.toString()}", + "${controller.vendorModel.value.openDineTime == '' ? "10:00 AM" : controller.vendorModel.value.openDineTime.toString()} ${"To".tr} ${controller.vendorModel.value.closeDineTime == '' ? "10:00 PM" : controller.vendorModel.value.closeDineTime.toString()}", textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -1001,7 +1001,7 @@ class DineInDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Cost for Two".tr(), + "Cost for Two".tr, textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -1016,7 +1016,7 @@ class DineInDetailsScreen extends StatelessWidget { ), ), Text( - "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost ?? "0.0")} ${'(approx)'.tr()}", + "${Constant.amountShow(amount: controller.vendorModel.value.restaurantCost ?? "0.0")} ${'(approx)'.tr}", textAlign: TextAlign.start, style: TextStyle( fontSize: 16, @@ -1043,7 +1043,7 @@ class DineInDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Cuisines".tr(), + "Cuisines".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart index 72ce204..a8651b3 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_restaurant_list_screen.dart @@ -6,7 +6,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index 1fe7b07..b2888cf 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -9,12 +9,13 @@ import 'package:customer/screen_ui/multi_vendor_service/dine_in_screeen/view_all import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/banner_model.dart'; @@ -81,7 +82,7 @@ class DineInScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Dine-In Reservations".tr(), + "Dine-In Reservations".tr, style: TextStyle( fontSize: 24, fontFamily: AppThemeData.semiBold, @@ -94,7 +95,7 @@ class DineInScreen extends StatelessWidget { ), Text( "Book a table at your favorite restaurant and enjoy a delightful dining experience." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( fontSize: 14, @@ -132,7 +133,7 @@ class DineInScreen extends StatelessWidget { ), const SizedBox(height: 12), Text( - "No Store Found in Your Area".tr(), + "No Store Found in Your Area".tr, style: TextStyle( color: isDark @@ -145,7 +146,7 @@ class DineInScreen extends StatelessWidget { const SizedBox(height: 5), Text( "Currently, there are no available store in your zone. Try changing your location to find nearby options." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -159,7 +160,7 @@ class DineInScreen extends StatelessWidget { const SizedBox(height: 20), RoundedButtonFill( borderRadius: 10.r, - title: "Change Zone".tr(), + title: "Change Zone".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -183,7 +184,7 @@ class DineInScreen extends StatelessWidget { const SizedBox(height: 10), titleView( isDark, - "Explore the Categories".tr(), + "Explore the Categories".tr, () { Get.to(const ViewAllCategoryDineInScreen()); }, @@ -219,7 +220,7 @@ class DineInScreen extends StatelessWidget { children: [ Expanded( child: Text( - "New Arrivals".tr(), + "New Arrivals".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -245,7 +246,7 @@ class DineInScreen extends StatelessWidget { ); }, child: Text( - "View all".tr(), + "View all".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: @@ -317,7 +318,7 @@ class DineInScreen extends StatelessWidget { vertical: 10, ), child: Text( - "Popular Stores".tr(), + "Popular Stores".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: @@ -358,7 +359,7 @@ class DineInScreen extends StatelessWidget { vertical: 10, ), child: Text( - "All Stores".tr(), + "All Stores".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: @@ -426,7 +427,7 @@ class DineInScreen extends StatelessWidget { onPress!(); }, child: Text( - "View all".tr(), + "View all".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1293,7 +1294,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -1305,7 +1306,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -1325,7 +1326,7 @@ class BannerBottomView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr()); + ShowToastDialog.showToast("Could not launch".tr); } } }, diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart index a33b906..538bb0d 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/view_all_category_dine_in_screen.dart @@ -3,9 +3,9 @@ import 'package:customer/controllers/view_all_category_controller.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../home_screen/category_restaurant_screen.dart'; @@ -26,7 +26,7 @@ class ViewAllCategoryDineInScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Categories".tr(), + "Categories".tr, style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, diff --git a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart index 2811025..2af3d63 100644 --- a/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/edit_profile_screen/edit_profile_screen.dart @@ -6,11 +6,11 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import '../../../controllers/theme_controller.dart'; @@ -38,7 +38,7 @@ class EditProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Profile Information".tr(), + "Profile Information".tr, style: TextStyle( fontSize: 24, color: @@ -49,7 +49,7 @@ class EditProfileScreen extends StatelessWidget { ), Text( "View and update your personal details, contact information, and preferences." - .tr(), + .tr, style: TextStyle( fontSize: 16, color: @@ -118,33 +118,33 @@ class EditProfileScreen extends StatelessWidget { children: [ Expanded( child: TextFieldWidget( - title: 'First Name'.tr(), + title: 'First Name'.tr, controller: controller.firstNameController.value, - hintText: 'First Name'.tr(), + hintText: 'First Name'.tr, ), ), const SizedBox(width: 10), Expanded( child: TextFieldWidget( - title: 'Last Name'.tr(), + title: 'Last Name'.tr, controller: controller.lastNameController.value, - hintText: 'Last Name'.tr(), + hintText: 'Last Name'.tr, ), ), ], ), TextFieldWidget( - title: 'Email'.tr(), + title: 'Email'.tr, textInputType: TextInputType.emailAddress, controller: controller.emailController.value, - hintText: 'Email'.tr(), + hintText: 'Email'.tr, enable: false, ), TextFieldWidget( - title: 'Phone Number'.tr(), + title: 'Phone Number'.tr, textInputType: TextInputType.emailAddress, controller: controller.phoneNumberController.value, - hintText: 'Phone Number'.tr(), + hintText: 'Phone Number'.tr, enable: false, ), ], @@ -158,7 +158,7 @@ class EditProfileScreen extends StatelessWidget { padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( borderRadius: 10.r, - title: "Save Details".tr(), + title: "Save Details".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -191,7 +191,7 @@ class EditProfileScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 15), child: Text( - "please select".tr(), + "please select".tr, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, @@ -217,7 +217,7 @@ class EditProfileScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 3), child: Text( - "camera".tr(), + "camera".tr, style: const TextStyle(), ), ), @@ -243,7 +243,7 @@ class EditProfileScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 3), child: Text( - "gallery".tr(), + "gallery".tr, style: const TextStyle(), ), ), diff --git a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart index 4eb1bf0..97cf5ba 100644 --- a/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart +++ b/lib/screen_ui/multi_vendor_service/favourite_screens/favourite_screen.dart @@ -7,12 +7,13 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; import '../../../widget/restaurant_image_view.dart'; @@ -47,7 +48,7 @@ class FavouriteScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Your Favourites, All in One Place".tr(), + "Your Favourites, All in One Place".tr, style: TextStyle( fontSize: 24, color: @@ -83,7 +84,7 @@ class FavouriteScreen extends StatelessWidget { ), const SizedBox(height: 12), Text( - "Please Log In to Continue".tr(), + "Please Log In to Continue".tr, style: TextStyle( color: isDark @@ -96,7 +97,7 @@ class FavouriteScreen extends StatelessWidget { const SizedBox(height: 5), Text( "You’re not logged in. Please sign in to access your account and explore all features." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -109,7 +110,7 @@ class FavouriteScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr(), + title: "Log in".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -174,8 +175,7 @@ class FavouriteScreen extends StatelessWidget { vertical: 10, ), child: Text( - "Favourite Store" - .tr(), + "Favourite Store".tr, textAlign: TextAlign.center, style: TextStyle( @@ -226,7 +226,7 @@ class FavouriteScreen extends StatelessWidget { vertical: 10, ), child: Text( - "Favourite Item".tr(), + "Favourite Item".tr, textAlign: TextAlign.center, style: TextStyle( @@ -275,7 +275,7 @@ class FavouriteScreen extends StatelessWidget { ? Constant.showEmptyView( message: "Favourite Store not found." - .tr(), + .tr, ) : ListView.builder( shrinkWrap: true, @@ -501,7 +501,7 @@ class FavouriteScreen extends StatelessWidget { 5, ), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( fontSize: 14, @@ -699,7 +699,7 @@ class FavouriteScreen extends StatelessWidget { ? Constant.showEmptyView( message: "Favourite Item not found." - .tr(), + .tr, ) : ListView.builder( itemCount: @@ -734,7 +734,7 @@ class FavouriteScreen extends StatelessWidget { .hasError) { return Center( child: Text( - '${"error".tr()}: ${snapshot.error}', + '${"error".tr}: ${snapshot.error}', ), ); } else if (snapshot @@ -833,8 +833,8 @@ class FavouriteScreen extends StatelessWidget { Text( productModel.nonveg == true - ? "Non Veg.".tr() - : "Pure veg.".tr(), + ? "Non Veg.".tr + : "Pure veg.".tr, style: TextStyle( color: productModel.nonveg == diff --git a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart index cc6bef3..c09dad0 100644 --- a/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart +++ b/lib/screen_ui/multi_vendor_service/forgot_password_screen/forgot_password_screen.dart @@ -2,10 +2,10 @@ import 'package:customer/controllers/forgot_password_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -30,7 +30,7 @@ class ForgotPasswordScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Forgot Password".tr(), + "Forgot Password".tr, style: TextStyle( color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, fontSize: 22, @@ -38,7 +38,7 @@ class ForgotPasswordScreen extends StatelessWidget { ), ), Text( - "No worries!! We’ll send you reset instructions".tr(), + "No worries!! We’ll send you reset instructions".tr, style: TextStyle( color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, @@ -47,9 +47,9 @@ class ForgotPasswordScreen extends StatelessWidget { ), const SizedBox(height: 32), TextFieldWidget( - title: 'Email Address'.tr(), + title: 'Email Address'.tr, controller: controller.emailEditingController.value, - hintText: 'Enter email address'.tr(), + hintText: 'Enter email address'.tr, prefix: Padding( padding: const EdgeInsets.all(12), child: SvgPicture.asset( @@ -63,16 +63,14 @@ class ForgotPasswordScreen extends StatelessWidget { ), const SizedBox(height: 32), RoundedButtonFill( - title: "Forgot Password".tr(), + title: "Forgot Password".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { if (controller.emailEditingController.value.text .trim() .isEmpty) { - ShowToastDialog.showToast( - "Please enter valid email".tr(), - ); + ShowToastDialog.showToast("Please enter valid email".tr); } else { controller.forgotPassword(); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart index 921276d..7476061 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/gift_card_screen.dart @@ -8,11 +8,11 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import 'history_gift_card.dart'; @@ -34,7 +34,7 @@ class GiftCardScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Customize Gift Card".tr(), + "Customize Gift Card".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -131,9 +131,9 @@ class GiftCardScreen extends StatelessWidget { ), const SizedBox(height: 20), TextFieldWidget( - title: 'Choose an amount'.tr(), + title: 'Choose an amount'.tr, controller: controller.amountController.value, - hintText: 'Enter gift card amount'.tr(), + hintText: 'Enter gift card amount'.tr, textInputType: const TextInputType.numberWithOptions( signed: true, @@ -151,7 +151,7 @@ class GiftCardScreen extends StatelessWidget { vertical: 14, ), child: Text( - Constant.currencyModel!.symbol.tr(), + Constant.currencyModel!.symbol.tr, style: TextStyle( color: isDark @@ -233,9 +233,9 @@ class GiftCardScreen extends StatelessWidget { ), const SizedBox(height: 40), TextFieldWidget( - title: 'Add Message (Optional)'.tr(), + title: 'Add Message (Optional)'.tr, controller: controller.messageController.value, - hintText: 'Add message here....'.tr(), + hintText: 'Add message here....'.tr, maxLine: 6, ), ], @@ -248,7 +248,7 @@ class GiftCardScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -258,13 +258,13 @@ class GiftCardScreen extends StatelessWidget { if (Constant.userModel == null) { ShowToastDialog.showToast( "Please log in to the application. You are not logged in." - .tr(), + .tr, ); } else { giftCardBottomSheet(context, controller); } } else { - ShowToastDialog.showToast("Please enter Amount".tr()); + ShowToastDialog.showToast("Please enter Amount".tr); } }, ), @@ -330,7 +330,7 @@ class GiftCardScreen extends StatelessWidget { ), child: Text( 'Complete payment and share this e-gift card with loved ones using any app' - .tr(), + .tr, style: TextStyle( color: AppThemeData.ecommerce300, fontSize: 14, @@ -344,7 +344,7 @@ class GiftCardScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Bill Details".tr(), + "Bill Details".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -380,7 +380,7 @@ class GiftCardScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Sub Total".tr(), + "Sub Total".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -422,7 +422,7 @@ class GiftCardScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Grand Total".tr(), + "Grand Total".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -466,8 +466,8 @@ class GiftCardScreen extends StatelessWidget { const SizedBox(height: 20), Center( child: Text( - "${'Gift Card expire'.tr()} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr()}" - .tr(), + "${'Gift Card expire'.tr} ${controller.selectedGiftCard.value.expiryDay} ${'days after purchase'.tr}" + .tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.medium, @@ -494,7 +494,7 @@ class GiftCardScreen extends StatelessWidget { padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( title: - "${'Pay'.tr()} ${Constant.amountShow(amount: controller.amountController.value.text)}", + "${'Pay'.tr} ${Constant.amountShow(amount: controller.amountController.value.text)}", height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart index 6d92fb3..9cc4e36 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/history_gift_card.dart @@ -2,9 +2,9 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/history_gift_card_controller.dart'; import 'package:customer/models/gift_cards_order_model.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../widget/my_separator.dart'; @@ -33,7 +33,7 @@ class HistoryGiftCard extends StatelessWidget { child: controller.giftCardsOrderList.isEmpty ? Constant.showEmptyView( - message: "Purchased Gift card not found".tr(), + message: "Purchased Gift card not found".tr, ) : ListView.builder( itemCount: controller.giftCardsOrderList.length, @@ -111,7 +111,7 @@ class HistoryGiftCard extends StatelessWidget { children: [ Expanded( child: Text( - "Gift Code".tr(), + "Gift Code".tr, style: TextStyle( color: isDark @@ -150,7 +150,7 @@ class HistoryGiftCard extends StatelessWidget { children: [ Expanded( child: Text( - "Gift Pin".tr(), + "Gift Pin".tr, style: TextStyle( color: isDark @@ -272,7 +272,7 @@ class HistoryGiftCard extends StatelessWidget { MainAxisSize.min, children: [ Text( - 'Share'.tr(), + 'Share'.tr, style: TextStyle( color: isDark @@ -298,8 +298,8 @@ class HistoryGiftCard extends StatelessWidget { const Expanded(child: SizedBox()), Text( giftCardOrderModel.redeem == true - ? "Redeemed".tr() - : "Not Redeem".tr(), + ? "Redeemed".tr + : "Not Redeem".tr, style: TextStyle( fontSize: 16, color: diff --git a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart index 04bb55f..b1ccdab 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart @@ -7,11 +7,12 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; import '../dash_board_screens/dash_board_screen.dart'; @@ -43,7 +44,7 @@ class RedeemGiftCardScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Redeem Gift Card".tr(), + "Redeem Gift Card".tr, style: TextStyle( fontSize: 24, color: @@ -54,7 +55,7 @@ class RedeemGiftCardScreen extends StatelessWidget { ), Text( "Enter your gift card code to enjoy discounts and special offers on your orders." - .tr(), + .tr, style: TextStyle( fontSize: 16, color: @@ -65,9 +66,9 @@ class RedeemGiftCardScreen extends StatelessWidget { ), const SizedBox(height: 20), TextFieldWidget( - title: 'Gift Code'.tr(), + title: 'Gift Code'.tr, controller: controller.giftCodeController.value, - hintText: 'Enter gift code'.tr(), + hintText: 'Enter gift code'.tr, textInputType: TextInputType.number, prefix: Padding( padding: const EdgeInsets.all(10), @@ -75,9 +76,9 @@ class RedeemGiftCardScreen extends StatelessWidget { ), ), TextFieldWidget( - title: 'Gift Pin'.tr(), + title: 'Gift Pin'.tr, controller: controller.giftPinController.value, - hintText: 'Enter gift pin'.tr(), + hintText: 'Enter gift pin'.tr, textInputType: TextInputType.number, prefix: Padding( padding: const EdgeInsets.all(10), @@ -94,18 +95,18 @@ class RedeemGiftCardScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Redeem".tr(), + title: "Redeem".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { if (controller.giftCodeController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Gift Code".tr()); + ShowToastDialog.showToast("Please Enter Gift Code".tr); } else if (controller.giftPinController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Gift Pin".tr()); + ShowToastDialog.showToast("Please Enter Gift Pin".tr); } else { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); await FireStoreUtils.checkRedeemCode( controller.giftCodeController.value.text.replaceAll( " ", @@ -117,17 +118,17 @@ class RedeemGiftCardScreen extends StatelessWidget { if (giftCodeModel.redeem == true) { ShowToastDialog.closeLoader(); ShowToastDialog.showToast( - "Gift voucher already redeemed".tr(), + "Gift voucher already redeemed".tr, ); } else if (giftCodeModel.giftPin != controller.giftPinController.value.text) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Gift Pin Invalid".tr()); + ShowToastDialog.showToast("Gift Pin Invalid".tr); } else if (giftCodeModel.expireDate!.toDate().isBefore( DateTime.now(), )) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Gift Voucher expire".tr()); + ShowToastDialog.showToast("Gift Voucher expire".tr); } else { giftCodeModel.redeem = true; @@ -171,7 +172,7 @@ class RedeemGiftCardScreen extends StatelessWidget { controller.selectedIndex.value = 2; } ShowToastDialog.showToast( - "Voucher redeem successfully".tr(), + "Voucher redeem successfully".tr, ); }); }); @@ -180,7 +181,7 @@ class RedeemGiftCardScreen extends StatelessWidget { } } else { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Invalid Gift Code".tr()); + ShowToastDialog.showToast("Invalid Gift Code".tr); } }); } diff --git a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart index 7309bca..01b6fc0 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/select_gift_payment_screen.dart @@ -4,9 +4,9 @@ import 'package:customer/payment/createRazorPayOrderModel.dart'; import 'package:customer/payment/rozorpayConroller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import '../wallet_screen/wallet_screen.dart'; @@ -30,7 +30,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Payment Option".tr(), + "Payment Option".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -46,7 +46,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Preferred Payment".tr(), + "Preferred Payment".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -102,7 +102,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Other Payment Options".tr(), + "Other Payment Options".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -261,7 +261,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Pay Now".tr(), + title: "Pay Now".tr, height: 5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -335,8 +335,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin." - .tr(), + "Something went wrong, please contact admin.".tr, ); } else { CreateRazorPayOrderModel result = value; @@ -348,7 +347,7 @@ class SelectGiftPaymentScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - "Please select payment method".tr(), + "Please select payment method".tr, ); } }, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart index 56c5e78..a951228 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/category_restaurant_screen.dart @@ -3,10 +3,10 @@ import 'package:customer/controllers/category_restaurant_controller.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -32,7 +32,7 @@ class CategoryRestaurantScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.allNearestRestaurant.isEmpty - ? Constant.showEmptyView(message: "No Restaurant found".tr()) + ? Constant.showEmptyView(message: "No Restaurant found".tr) : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: ListView.builder( @@ -144,7 +144,7 @@ class CategoryRestaurantScreen extends StatelessWidget { width: 5, ), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( fontSize: 14, color: diff --git a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart index 22ef568..2416330 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/discount_restaurant_list_screen.dart @@ -6,10 +6,10 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -131,7 +131,7 @@ class DiscountRestaurantListScreen extends StatelessWidget { vertical: 4, ), child: Text( - "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".toUpperCase().tr() : " off".toUpperCase().tr()}", + "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".toUpperCase().tr : " off".toUpperCase().tr}", textAlign: TextAlign.start, maxLines: 1, style: TextStyle( diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index 03adfec..579ab1d 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -17,19 +17,20 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/custom_dialog_box.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/preferences.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:latlong2/latlong.dart' as location; import 'package:url_launcher/url_launcher.dart'; @@ -93,7 +94,7 @@ class HomeScreen extends StatelessWidget { ), const SizedBox(height: 12), Text( - "No Store Found in Your Area".tr(), + "No Store Found in Your Area".tr, style: TextStyle( color: isDark @@ -106,7 +107,7 @@ class HomeScreen extends StatelessWidget { const SizedBox(height: 5), Text( "Currently, there are no available store in your zone. Try changing your location to find nearby options." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -119,7 +120,7 @@ class HomeScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Change Zone".tr(), + title: "Change Zone".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -230,7 +231,7 @@ class HomeScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader( "Please wait..." - .tr(), + .tr, ); // ✅ declare it once here! @@ -517,7 +518,7 @@ class HomeScreen extends StatelessWidget { true ? 'Искать что угодно' : 'Search the store, item and more...' - .tr(), + .tr, controller: null, enable: false, backgroundColor: @@ -705,8 +706,7 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "New Arrivals" - .tr(), + "New Arrivals".tr, textAlign: TextAlign .start, @@ -741,7 +741,7 @@ class HomeScreen extends StatelessWidget { }); }, child: Text( - "View all".tr(), + "View all".tr, textAlign: TextAlign .center, @@ -823,7 +823,7 @@ class HomeScreen extends StatelessWidget { Expanded( child: Text( "Highlights for you" - .tr(), + .tr, textAlign: TextAlign .start, @@ -853,7 +853,7 @@ class HomeScreen extends StatelessWidget { }, child: Text( "View all" - .tr(), + .tr, textAlign: TextAlign .center, @@ -969,7 +969,7 @@ class HomeScreen extends StatelessWidget { ), child: Text( "Popular Stores" - .tr(), + .tr, textAlign: TextAlign .center, @@ -1022,7 +1022,7 @@ class HomeScreen extends StatelessWidget { vertical: 10, ), child: Text( - "All Stores".tr(), + "All Stores".tr, textAlign: TextAlign .center, @@ -1210,16 +1210,16 @@ class HomeScreen extends StatelessWidget { isDark ? AppThemeData.greyDark100 : AppThemeData.grey100, - value: controller.selectedOrderTypeValue.value.tr(), + value: controller.selectedOrderTypeValue.value.tr, icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr(), 'TakeAway'.tr()].map(( + ['Delivery'.tr, 'TakeAway'.tr].map(( String value, ) { return DropdownMenuItem( value: value, child: Text( - value.tr(), + value.tr, style: TextStyle( fontFamily: AppThemeData.semiBold, fontSize: 16, @@ -1244,12 +1244,12 @@ class HomeScreen extends StatelessWidget { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Alert".tr(), + title: "Alert".tr, descriptions: "Do you really want to change the delivery option? Your cart will be empty." - .tr(), - positiveString: "Ok".tr(), - negativeString: "Cancel".tr(), + .tr, + positiveString: "Ok".tr, + negativeString: "Cancel".tr, positiveClick: () async { await Preferences.setString( Preferences.foodDeliveryType, @@ -1289,7 +1289,7 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - name.tr(), + name.tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.bold, @@ -1302,7 +1302,7 @@ class HomeScreen extends StatelessWidget { onPress!(); }, child: Text( - "View all".tr(), + "View all".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1476,7 +1476,7 @@ class PopularRestaurant extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -1781,7 +1781,7 @@ class AllRestaurant extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -2078,7 +2078,7 @@ class NewArrival extends StatelessWidget { ), const SizedBox(width: 4), Text( - "Free Delivery".tr(), + "Free Delivery".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2188,7 +2188,7 @@ class AdvertisementHomeCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( model.vendorId!, ); @@ -2501,7 +2501,7 @@ class OfferView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Upto".tr(), + "Upto".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2516,7 +2516,7 @@ class OfferView extends StatelessWidget { ), ), Text( - "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr() : "off".tr()}", + "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr : "off".tr}", textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2565,7 +2565,7 @@ class OfferView extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( fontSize: 12, overflow: TextOverflow.ellipsis, @@ -2651,7 +2651,7 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -2663,7 +2663,7 @@ class BannerView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -2683,7 +2683,7 @@ class BannerView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr()); + ShowToastDialog.showToast("Could not launch".tr); } } }, @@ -2757,7 +2757,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -2769,7 +2769,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -2789,7 +2789,7 @@ class BannerBottomView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr()); + ShowToastDialog.showToast("Could not launch".tr); } } }, @@ -2973,7 +2973,7 @@ class StoryView extends StatelessWidget { if (snapshot.hasError) { return Center( child: Text( - '${"Error".tr()}: ${snapshot.error}', + '${"Error".tr}: ${snapshot.error}', ), ); } else if (snapshot.data == null) { @@ -3401,7 +3401,7 @@ class MapView extends StatelessWidget { ), Text( "Free Delivery" - .tr(), + .tr, style: TextStyle( fontSize: 14, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart index 7641c69..d7cd033 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart @@ -18,17 +18,18 @@ import 'package:customer/themes/custom_dialog_box.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/utils/preferences.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/banner_model.dart'; @@ -73,7 +74,7 @@ class HomeScreenTwo extends StatelessWidget { Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), Text( - "No Store Found in Your Area".tr(), + "No Store Found in Your Area".tr, style: TextStyle( color: isDark @@ -86,7 +87,7 @@ class HomeScreenTwo extends StatelessWidget { const SizedBox(height: 5), Text( "Currently, there are no available store in your zone. Try changing your location to find nearby options." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -99,7 +100,7 @@ class HomeScreenTwo extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Change Zone".tr(), + title: "Change Zone".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -159,7 +160,7 @@ class HomeScreenTwo extends StatelessWidget { ); }, child: Text( - "Login".tr(), + "Login".tr, textAlign: TextAlign.center, style: TextStyle( @@ -213,8 +214,7 @@ class HomeScreenTwo extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait..." - .tr(), + "Please wait...".tr, ); // ✅ declare once for whole method @@ -442,9 +442,9 @@ class HomeScreenTwo extends StatelessWidget { ) == true ? 'Search the dish, foo and more...' - .tr() + .tr : 'Search the store, item and more...' - .tr(), + .tr, controller: null, enable: false, prefix: Padding( @@ -564,7 +564,7 @@ class HomeScreenTwo extends StatelessWidget { Expanded( child: Text( "Highlights for you" - .tr(), + .tr, textAlign: TextAlign .start, @@ -594,7 +594,7 @@ class HomeScreenTwo extends StatelessWidget { }, child: Text( "See all" - .tr(), + .tr, textAlign: TextAlign .center, @@ -786,16 +786,16 @@ class HomeScreenTwo extends StatelessWidget { DropdownButton( isDense: false, underline: const SizedBox(), - value: controller.selectedOrderTypeValue.value.tr(), + value: controller.selectedOrderTypeValue.value.tr, icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr(), 'TakeAway'.tr()].map(( + ['Delivery'.tr, 'TakeAway'.tr].map(( String value, ) { return DropdownMenuItem( value: value, child: Text( - value.tr(), + value.tr, style: TextStyle( fontFamily: AppThemeData.semiBold, fontSize: 16, @@ -820,12 +820,12 @@ class HomeScreenTwo extends StatelessWidget { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Alert".tr(), + title: "Alert".tr, descriptions: "Do you really want to change the delivery option? Your cart will be empty." - .tr(), - positiveString: "Ok".tr(), - negativeString: "Cancel".tr(), + .tr, + positiveString: "Ok".tr, + negativeString: "Cancel".tr, positiveClick: () async { await Preferences.setString( Preferences.foodDeliveryType, @@ -887,7 +887,7 @@ class CategoryView extends StatelessWidget { children: [ Expanded( child: Text( - "Our Categories".tr(), + "Our Categories".tr, style: TextStyle( fontFamily: AppThemeData.semiBold, color: @@ -903,7 +903,7 @@ class CategoryView extends StatelessWidget { Get.to(const ViewAllCategoryScreen()); }, child: Text( - "See all".tr(), + "See all".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.medium, @@ -918,7 +918,7 @@ class CategoryView extends StatelessWidget { ], ), GradientText( - 'Best Servings Food'.tr(), + 'Best Servings Food'.tr, style: TextStyle( fontSize: 24, fontFamily: 'Inter Tight', @@ -1022,7 +1022,7 @@ class OfferView extends StatelessWidget { children: [ Expanded( child: Text( - "Large Discounts".tr(), + "Large Discounts".tr, style: TextStyle( fontFamily: AppThemeData.semiBold, color: @@ -1045,7 +1045,7 @@ class OfferView extends StatelessWidget { ); }, child: Text( - "See all".tr(), + "See all".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.medium, @@ -1060,7 +1060,7 @@ class OfferView extends StatelessWidget { ], ), GradientText( - 'Save Upto 50% Off'.tr(), + 'Save Upto 50% Off'.tr, style: TextStyle( fontSize: 24, fontFamily: 'Inter Tight', @@ -1152,7 +1152,7 @@ class OfferView extends StatelessWidget { const SizedBox(height: 5), RoundedButtonFill( title: - "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr() : "off".tr()}", + "${offerModel.discountType == "Fix Price" ? Constant.currencyModel!.symbol : ""}${offerModel.discount}${offerModel.discountType == "Percentage" ? "% off".tr : "off".tr}", color: Colors.primaries[Random().nextInt( Colors.primaries.length, @@ -1207,7 +1207,7 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), ); @@ -1218,7 +1218,7 @@ class BannerView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -1237,7 +1237,7 @@ class BannerView extends StatelessWidget { if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { - ShowToastDialog.showToast("Could not launch".tr()); + ShowToastDialog.showToast("Could not launch".tr); } } }, @@ -1288,7 +1288,7 @@ class StoryView extends StatelessWidget { children: [ Expanded( child: Text( - "Stories".tr(), + "Stories".tr, style: TextStyle( fontFamily: AppThemeData.semiBold, color: @@ -1302,7 +1302,7 @@ class StoryView extends StatelessWidget { ], ), GradientText( - 'Best Food Stories Ever'.tr(), + 'Best Food Stories Ever'.tr, style: TextStyle( fontSize: 24, fontFamily: 'Inter Tight', @@ -1370,7 +1370,7 @@ class StoryView extends StatelessWidget { if (snapshot.hasError) { return Center( child: Text( - '${"Error".tr()}: ${snapshot.error}', + '${"Error".tr}: ${snapshot.error}', ), ); } else if (snapshot.data == null) { @@ -1423,7 +1423,7 @@ class StoryView extends StatelessWidget { ), const SizedBox(width: 5), Text( - "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum!.toStringAsFixed(0))} ${'reviews'.tr()}", + "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum!.toStringAsFixed(0))} ${'reviews'.tr}", textAlign: TextAlign.center, maxLines: 1, @@ -1491,7 +1491,7 @@ class RestaurantView extends StatelessWidget { children: [ Expanded( child: Text( - "Best Restaurants".tr(), + "Best Restaurants".tr, style: TextStyle( fontFamily: AppThemeData.semiBold, color: @@ -1511,7 +1511,7 @@ class RestaurantView extends StatelessWidget { ); }, child: Text( - "See all".tr(), + "See all".tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.medium, @@ -1613,7 +1613,7 @@ class RestaurantView extends StatelessWidget { CrossAxisAlignment.center, children: [ Text( - "Upto".tr(), + "Upto".tr, textAlign: TextAlign.center, maxLines: 1, style: TextStyle( @@ -1632,7 +1632,7 @@ class RestaurantView extends StatelessWidget { discountAmountTempList .reduce(min) .toString() + - "% OFF".tr(), + "% OFF".tr, textAlign: TextAlign.center, maxLines: 1, style: TextStyle( @@ -1707,7 +1707,7 @@ class RestaurantView extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( overflow: TextOverflow.ellipsis, diff --git a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart index 0b80cd0..706f226 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart @@ -4,11 +4,11 @@ import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; + import '../../../controllers/theme_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -217,7 +217,7 @@ class RestaurantListScreen extends StatelessWidget { width: 5, ), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( fontSize: 14, color: diff --git a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart index 6850c56..8374167 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/story_view.dart @@ -5,10 +5,10 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/story_view/controller/story_controller.dart'; import 'package:customer/widget/story_view/utils.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../service/fire_store_utils.dart'; import '../../../widget/story_view/widgets/story_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -117,7 +117,7 @@ class MoreStoriesState extends State { } else { if (snapshot.hasError) { return Center( - child: Text('${"Error".tr()}: ${snapshot.error}'), + child: Text('${"Error".tr}: ${snapshot.error}'), ); return Center(child: Text('Error: ${snapshot.error}')); } else if (snapshot.data == null) { @@ -167,7 +167,7 @@ class MoreStoriesState extends State { ), const SizedBox(width: 5), Text( - "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} ${'reviews'.tr()}", + "${Constant.calculateReview(reviewCount: vendorModel.reviewsCount.toString(), reviewSum: vendorModel.reviewsSum.toString())} ${'reviews'.tr}", textAlign: TextAlign.center, maxLines: 1, style: const TextStyle( diff --git a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart index 665f863..f0ddbab 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart @@ -3,9 +3,9 @@ import 'package:customer/controllers/view_all_category_controller.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import 'category_restaurant_screen.dart'; @@ -26,7 +26,7 @@ class ViewAllCategoryScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Categories".tr(), + "Categories".tr, style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart index 7c561fd..8ea6cf4 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/live_tracking_screen.dart @@ -1,10 +1,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/live_tracking_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart' as flutterMap; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart' as gmap; import '../../../controllers/theme_controller.dart'; @@ -29,7 +29,7 @@ class LiveTrackingScreen extends StatelessWidget { appBar: AppBar( backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, - title: Text("Live Tracking".tr()), + title: Text("Live Tracking".tr), centerTitle: false, ), body: diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart index d322880..e01712e 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart @@ -8,10 +8,10 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:timelines_plus/timelines_plus.dart'; import '../../../controllers/theme_controller.dart'; @@ -41,7 +41,7 @@ class OrderDetailsScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Order Details".tr(), + "Order Details".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -67,8 +67,8 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${'Order'.tr()} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}" - .tr(), + "${'Order'.tr} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}" + .tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -86,7 +86,7 @@ class OrderDetailsScreen extends StatelessWidget { title: controller.orderModel.value.status .toString() - .tr(), + .tr, color: Constant.statusColor( status: controller.orderModel.value.status @@ -228,7 +228,7 @@ class OrderDetailsScreen extends StatelessWidget { : InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); UserModel? customer = @@ -497,7 +497,7 @@ class OrderDetailsScreen extends StatelessWidget { onTap: () async { ShowToastDialog.showLoader( "Please wait..." - .tr(), + .tr, ); UserModel? @@ -701,7 +701,7 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Order Delivered.".tr(), + "Order Delivered.".tr, textAlign: TextAlign.right, style: TextStyle( @@ -743,8 +743,8 @@ class OrderDetailsScreen extends StatelessWidget { const SizedBox(width: 5), Expanded( child: Text( - "${'Your Order has been Preparing and assign to the driver'.tr()}\n${'Preparation Time'.tr()} ${controller.orderModel.value.estimatedTimeToPrepare}" - .tr(), + "${'Your Order has been Preparing and assign to the driver'.tr}\n${'Preparation Time'.tr} ${controller.orderModel.value.estimatedTimeToPrepare}" + .tr, textAlign: TextAlign.start, style: TextStyle( @@ -902,8 +902,7 @@ class OrderDetailsScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait..." - .tr(), + "Please wait...".tr, ); UserModel? customer = @@ -1002,7 +1001,7 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 14), Text( - "Your Order".tr(), + "Your Order".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -1246,7 +1245,7 @@ class OrderDetailsScreen extends StatelessWidget { alignment: Alignment.centerRight, child: RoundedButtonFill( - title: "Rate us".tr(), + title: "Rate us".tr, height: 3.8, width: 20, color: @@ -1298,7 +1297,7 @@ class OrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Variants".tr(), + "Variants".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1381,7 +1380,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Addons".tr(), + "Addons".tr, textAlign: TextAlign.start, style: TextStyle( @@ -1512,7 +1511,7 @@ class OrderDetailsScreen extends StatelessWidget { // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Text( - // "Delivery Man".tr(), + // "Delivery Man".tr, // textAlign: TextAlign.start, // style: TextStyle( // fontFamily: AppThemeData.semiBold, @@ -1531,7 +1530,7 @@ class OrderDetailsScreen extends StatelessWidget { // ], // ), Text( - "Bill Details".tr(), + "Bill Details".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -1567,7 +1566,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Item totals".tr(), + "Item totals".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1606,7 +1605,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Delivery Fee".tr(), + "Delivery Fee".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1626,7 +1625,7 @@ class OrderDetailsScreen extends StatelessWidget { ?.isSelfDelivery == true) ? Text( - 'Free Delivery'.tr(), + 'Free Delivery'.tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1684,7 +1683,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Coupon Discount".tr(), + "Coupon Discount".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1726,7 +1725,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Special Discount".tr(), + "Special Discount".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1781,7 +1780,7 @@ class OrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Delivery Tips".tr(), + "Delivery Tips".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -1913,7 +1912,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "To Pay".tr(), + "To Pay".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1949,7 +1948,7 @@ class OrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 14), Text( - "Order Details".tr(), + "Order Details".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -1985,7 +1984,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Delivery type".tr(), + "Delivery type".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -2000,14 +1999,14 @@ class OrderDetailsScreen extends StatelessWidget { Text( controller.orderModel.value.takeAway == true - ? "TakeAway".tr() + ? "TakeAway".tr : controller .orderModel .value .scheduleTime == null - ? "Standard".tr() - : "Schedule".tr(), + ? "Standard".tr + : "Schedule".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -2033,7 +2032,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Payment Method".tr(), + "Payment Method".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -2070,7 +2069,7 @@ class OrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Date and Time".tr(), + "Date and Time".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -2112,7 +2111,7 @@ class OrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Phone Number".tr(), + "Phone Number".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -2159,7 +2158,7 @@ class OrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Remarks".tr(), + "Remarks".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -2228,7 +2227,7 @@ class OrderDetailsScreen extends StatelessWidget { controller.orderModel.value.status == Constant.orderInTransit ? RoundedButtonFill( - title: "Track Order".tr(), + title: "Track Order".tr, height: 5.5, color: AppThemeData.warning300, textColor: AppThemeData.grey900, @@ -2242,7 +2241,7 @@ class OrderDetailsScreen extends StatelessWidget { }, ) : RoundedButtonFill( - title: "Reorder".tr(), + title: "Reorder".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -2256,7 +2255,7 @@ class OrderDetailsScreen extends StatelessWidget { cartProductModel: element, ); ShowToastDialog.showToast( - "Item Added In a cart".tr(), + "Item Added In a cart".tr, ); } }, diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart index 5853553..3e3cdaa 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_screen.dart @@ -5,10 +5,11 @@ import 'package:customer/models/order_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; import '../../../widget/my_separator.dart'; @@ -44,7 +45,7 @@ class OrderScreen extends StatelessWidget { Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), Text( - "Please Log In to Continue".tr(), + "Please Log In to Continue".tr, style: TextStyle( color: isDark @@ -57,7 +58,7 @@ class OrderScreen extends StatelessWidget { const SizedBox(height: 5), Text( "You’re not logged in. Please sign in to access your account and explore all features." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -70,7 +71,7 @@ class OrderScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr(), + title: "Log in".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -96,7 +97,7 @@ class OrderScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "My Order".tr(), + "My Order".tr, style: TextStyle( fontSize: 24, color: @@ -109,7 +110,7 @@ class OrderScreen extends StatelessWidget { ), Text( "Keep track your delivered, In Progress and Rejected item all in just one place." - .tr(), + .tr, style: TextStyle( color: isDark @@ -171,12 +172,12 @@ class OrderScreen extends StatelessWidget { padding: const EdgeInsets.symmetric( horizontal: 18, ), - child: Tab(text: 'All'.tr()), + child: Tab(text: 'All'.tr), ), - Tab(text: 'In Progress'.tr()), - Tab(text: 'Delivered'.tr()), - Tab(text: 'Cancelled'.tr()), - Tab(text: 'Rejected'.tr()), + Tab(text: 'In Progress'.tr), + Tab(text: 'Delivered'.tr), + Tab(text: 'Cancelled'.tr), + Tab(text: 'Rejected'.tr), ], ), ), @@ -186,7 +187,7 @@ class OrderScreen extends StatelessWidget { children: [ controller.allList.isEmpty ? Constant.showEmptyView( - message: "Order Not Found".tr(), + message: "Order Not Found".tr, ) : RefreshIndicator( onRefresh: @@ -210,7 +211,7 @@ class OrderScreen extends StatelessWidget { ), controller.inProgressList.isEmpty ? Constant.showEmptyView( - message: "Order Not Found".tr(), + message: "Order Not Found".tr, ) : RefreshIndicator( onRefresh: @@ -237,7 +238,7 @@ class OrderScreen extends StatelessWidget { ), controller.deliveredList.isEmpty ? Constant.showEmptyView( - message: "Order Not Found".tr(), + message: "Order Not Found".tr, ) : RefreshIndicator( onRefresh: @@ -264,7 +265,7 @@ class OrderScreen extends StatelessWidget { ), controller.cancelledList.isEmpty ? Constant.showEmptyView( - message: "Order Not Found".tr(), + message: "Order Not Found".tr, ) : RefreshIndicator( onRefresh: @@ -291,7 +292,7 @@ class OrderScreen extends StatelessWidget { ), controller.rejectedList.isEmpty ? Constant.showEmptyView( - message: "Order Not Found".tr(), + message: "Order Not Found".tr, ) : RefreshIndicator( onRefresh: @@ -498,12 +499,12 @@ class OrderScreen extends StatelessWidget { for (var element in orderModel.products!) { controller.addToCart(cartProductModel: element); ShowToastDialog.showToast( - "Item Added In a cart".tr(), + "Item Added In a cart".tr, ); } }, child: Text( - "Reorder".tr(), + "Reorder".tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -528,7 +529,7 @@ class OrderScreen extends StatelessWidget { ); }, child: Text( - "Track Order".tr(), + "Track Order".tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -553,7 +554,7 @@ class OrderScreen extends StatelessWidget { // Get.off(const OrderPlacingScreen(), arguments: {"orderModel": orderModel}); }, child: Text( - "View Details".tr(), + "View Details".tr, textAlign: TextAlign.center, style: TextStyle( color: diff --git a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart index f725837..5e73807 100644 --- a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart @@ -5,7 +5,8 @@ import 'package:customer/screen_ui/on_demand_service/worker_inbox_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/custom_dialog_box.dart'; import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:in_app_review/in_app_review.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; @@ -24,7 +25,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:share_plus/share_plus.dart'; import '../terms_and_condition/terms_and_condition_screen.dart'; @@ -54,7 +55,7 @@ class ProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "My Profile".tr(), + "My Profile".tr, style: TextStyle( fontSize: 24, color: @@ -67,7 +68,7 @@ class ProfileScreen extends StatelessWidget { ), Text( "Manage your personal information, preferences, and settings all in one place." - .tr(), + .tr, style: TextStyle( fontSize: 16, color: @@ -80,7 +81,7 @@ class ProfileScreen extends StatelessWidget { ), const SizedBox(height: 20), Text( - "General Information".tr(), + "General Information".tr, style: TextStyle( fontSize: 12, color: @@ -116,7 +117,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/images/ic_profile.svg", - "Profile Information".tr(), + "Profile Information".tr, () { Get.to(const EditProfileScreen()); }, @@ -129,7 +130,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/images/ic_dinin.svg", - "Dine-In".tr(), + "Dine-In".tr, () { Get.to(const DineInScreen()); }, @@ -138,7 +139,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/images/ic_gift.svg", - "Gift Card".tr(), + "Gift Card".tr, () { Get.to(const GiftCardScreen()); }, @@ -148,7 +149,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_cashback_Offer.svg", - "Cashback Offers".tr(), + "Cashback Offers".tr, () { Get.to( const CashbackOffersListScreen(), @@ -165,7 +166,7 @@ class ProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Bookings Information".tr(), + "Bookings Information".tr, style: TextStyle( fontSize: 12, color: @@ -199,7 +200,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_dinin_order.svg", - "Dine-In Booking".tr(), + "Dine-In Booking".tr, () { Get.to( const DineInBookingScreen(), @@ -215,7 +216,7 @@ class ProfileScreen extends StatelessWidget { : const SizedBox(), const SizedBox(height: 10), Text( - "Preferences".tr(), + "Preferences".tr, style: TextStyle( fontSize: 12, color: @@ -249,7 +250,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_change_language.svg", - "Change Language".tr(), + "Change Language".tr, () { Get.to(const ChangeLanguageScreen()); }, @@ -258,7 +259,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_light_dark.svg", - "Dark Mode".tr(), + "Dark Mode".tr, () {}, ), ], @@ -267,7 +268,7 @@ class ProfileScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Social".tr(), + "Social".tr, style: TextStyle( fontSize: 12, color: @@ -303,7 +304,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_refer.svg", - "Refer a Friend".tr(), + "Refer a Friend".tr, () { Get.to(const ReferFriendScreen()); }, @@ -312,11 +313,11 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_share.svg", - "Share app".tr(), + "Share app".tr, () { Share.share( - '${'Check out Foodie, your ultimate food delivery application!'.tr()} \n\n${'Google Play:'.tr()} ${Constant.googlePlayLink} \n\n${'App Store:'.tr()} ${Constant.appStoreLink}', - subject: 'Look what I made!'.tr(), + '${'Check out Foodie, your ultimate food delivery application!'.tr} \n\n${'Google Play:'.tr} ${Constant.googlePlayLink} \n\n${'App Store:'.tr} ${Constant.appStoreLink}', + subject: 'Look what I made!'.tr, ); }, ), @@ -324,7 +325,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_rate.svg", - "Rate the app".tr(), + "Rate the app".tr, () { final InAppReview inAppReview = InAppReview.instance; @@ -342,7 +343,7 @@ class ProfileScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Communication".tr(), + "Communication".tr, style: TextStyle( fontSize: 12, color: @@ -376,7 +377,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_restaurant_chat.svg", - "Store Inbox".tr(), + "Store Inbox".tr, () { Get.to( const RestaurantInboxScreen(), @@ -387,7 +388,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_restaurant_driver.svg", - "Driver Inbox".tr(), + "Driver Inbox".tr, () { Get.to(const DriverInboxScreen()); }, @@ -396,7 +397,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_restaurant_chat.svg", - "Provider Inbox".tr(), + "Provider Inbox".tr, () { Get.to( const ProviderInboxScreen(), @@ -407,7 +408,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_restaurant_driver.svg", - "Worker Inbox".tr(), + "Worker Inbox".tr, () { Get.to(const WorkerInboxScreen()); }, @@ -420,7 +421,7 @@ class ProfileScreen extends StatelessWidget { ], ), Text( - "Legal".tr(), + "Legal".tr, style: TextStyle( fontSize: 12, color: @@ -454,7 +455,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_privacy_policy.svg", - "Privacy Policy".tr(), + "Privacy Policy".tr, () { Get.to( const TermsAndConditionScreen( @@ -467,7 +468,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_tearm_condition.svg", - "Terms and Conditions".tr(), + "Terms and Conditions".tr, () { Get.to( const TermsAndConditionScreen( @@ -505,7 +506,7 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_logout.svg", - "Log In".tr(), + "Log In".tr, () { Get.offAll(const LoginScreen()); }, @@ -514,18 +515,18 @@ class ProfileScreen extends StatelessWidget { isDark, controller, "assets/icons/ic_logout.svg", - "Log out".tr(), + "Log out".tr, () { showDialog( context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Log out".tr(), + title: "Log out".tr, descriptions: "Are you sure you want to log out? You will need to enter your credentials to log back in." - .tr(), - positiveString: "Log out".tr(), - negativeString: "Cancel".tr(), + .tr, + positiveString: "Log out".tr, + negativeString: "Cancel".tr, positiveClick: () async { Constant.userModel!.fcmToken = ""; @@ -569,15 +570,15 @@ class ProfileScreen extends StatelessWidget { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Delete Account".tr(), + title: "Delete Account".tr, descriptions: "Are you sure you want to delete your account? This action is irreversible and will permanently remove all your data." - .tr(), - positiveString: "Delete".tr(), - negativeString: "Cancel".tr(), + .tr, + positiveString: "Delete".tr, + negativeString: "Cancel".tr, positiveClick: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); await controller .deleteUserFromServer(); @@ -588,12 +589,12 @@ class ProfileScreen extends StatelessWidget { if (value == true) { ShowToastDialog.showToast( "Account deleted successfully" - .tr(), + .tr, ); Get.offAll(const LoginScreen()); } else { ShowToastDialog.showToast( - "Contact Administrator".tr(), + "Contact Administrator".tr, ); } }); @@ -620,7 +621,7 @@ class ProfileScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Delete Account".tr(), + "Delete Account".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -679,7 +680,7 @@ class ProfileScreen extends StatelessWidget { SvgPicture.asset( image, colorFilter: - title == "Log In".tr() || title == "Cashbacks".tr() + title == "Log In".tr || title == "Cashbacks".tr ? const ColorFilter.mode( AppThemeData.success500, BlendMode.srcIn, @@ -691,15 +692,15 @@ class ProfileScreen extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - title.tr(), + title.tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, fontSize: 16, color: - title == "Log out".tr() + title == "Log out".tr ? AppThemeData.danger300 - : title == "Log In".tr() + : title == "Log In".tr ? AppThemeData.success500 : (isDark ? AppThemeData.grey100 @@ -707,7 +708,7 @@ class ProfileScreen extends StatelessWidget { ), ), ), - title == "Dark Mode".tr() + title == "Dark Mode".tr ? Transform.scale( scale: 0.8, child: Obx( diff --git a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart index 3dfc208..5902970 100644 --- a/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart +++ b/lib/screen_ui/multi_vendor_service/rate_us_screen/rate_product_screen.dart @@ -6,11 +6,11 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import '../../../controllers/theme_controller.dart'; @@ -35,7 +35,7 @@ class RateProductScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Rate the item".tr(), + "Rate the item".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -75,7 +75,7 @@ class RateProductScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Rate for".tr(), + "Rate for".tr, style: TextStyle( color: isDark @@ -86,8 +86,7 @@ class RateProductScreen extends StatelessWidget { ), ), Text( - "${controller.productModel.value.name}" - .tr(), + "${controller.productModel.value.name}".tr, style: TextStyle( color: isDark @@ -249,7 +248,7 @@ class RateProductScreen extends StatelessWidget { const SizedBox(height: 10), Text( "Choose a image and upload here" - .tr(), + .tr, style: TextStyle( color: isDark @@ -261,7 +260,7 @@ class RateProductScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - "JPEG, PNG".tr(), + "JPEG, PNG".tr, style: TextStyle( fontSize: 12, color: @@ -274,7 +273,7 @@ class RateProductScreen extends StatelessWidget { ), const SizedBox(height: 10), RoundedButtonFill( - title: "Brows Image".tr(), + title: "Brows Image".tr, color: AppThemeData.primary50, width: 30, height: 5, @@ -423,7 +422,7 @@ class RateProductScreen extends StatelessWidget { enabledBorder: InputBorder.none, errorBorder: InputBorder.none, border: InputBorder.none, - hintText: "Type comment".tr(), + hintText: "Type comment".tr, hintStyle: TextStyle( fontSize: 14, color: @@ -449,7 +448,7 @@ class RateProductScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Submit Review".tr(), + title: "Submit Review".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, @@ -483,7 +482,7 @@ class RateProductScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 15), child: Text( - "Please Select".tr(), + "Please Select".tr, style: TextStyle( color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -510,7 +509,7 @@ class RateProductScreen extends StatelessWidget { ), Padding( padding: const EdgeInsets.only(top: 3), - child: Text("Camera".tr()), + child: Text("Camera".tr), ), ], ), @@ -533,7 +532,7 @@ class RateProductScreen extends StatelessWidget { ), Padding( padding: const EdgeInsets.only(top: 3), - child: Text("Gallery".tr()), + child: Text("Gallery".tr), ), ], ), diff --git a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart index 799ae8c..f2ce0e2 100644 --- a/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart +++ b/lib/screen_ui/multi_vendor_service/refer_friend_screen/refer_friend_screen.dart @@ -3,11 +3,11 @@ import 'package:customer/controllers/refer_friend_controller.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:share_plus/share_plus.dart'; import '../../../controllers/theme_controller.dart'; @@ -66,7 +66,7 @@ class ReferFriendScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Refer your friend and earn".tr(), + "Refer your friend and earn".tr, style: TextStyle( fontSize: 22, color: @@ -79,7 +79,7 @@ class ReferFriendScreen extends StatelessWidget { ), const SizedBox(width: 4), Text( - "${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'Each🎉'.tr()}", + "${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'Each🎉'.tr}", style: TextStyle( fontSize: 24, color: @@ -92,7 +92,7 @@ class ReferFriendScreen extends StatelessWidget { ), const SizedBox(height: 32), Text( - "Invite Friends & Businesses".tr(), + "Invite Friends & Businesses".tr, style: TextStyle( fontSize: 16, color: @@ -105,8 +105,8 @@ class ReferFriendScreen extends StatelessWidget { ), const SizedBox(height: 8), Text( - "${'Invite your friends to sign up with Foodie using your code, and you’ll earn'.tr()} ${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'after their Success the first order! 💸🍔'.tr()}" - .tr(), + "${'Invite your friends to sign up with Foodie using your code, and you’ll earn'.tr} ${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount)} ${'after their Success the first order! 💸🍔'.tr}" + .tr, textAlign: TextAlign.center, style: TextStyle( fontSize: 16, @@ -180,7 +180,7 @@ class ReferFriendScreen extends StatelessWidget { ), ); ShowToastDialog.showToast( - "Copied".tr(), + "Copied".tr, ); }, child: const Icon( @@ -214,7 +214,7 @@ class ReferFriendScreen extends StatelessWidget { vertical: 30, ), child: Text( - "or".tr(), + "or".tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -241,13 +241,13 @@ class ReferFriendScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Share Code".tr(), + title: "Share Code".tr, width: 55, color: AppThemeData.ecommerce300, textColor: AppThemeData.grey50, onPress: () async { await Share.share( - "${"Hey there, thanks for choosing Foodie. Hope you love our product. If you do, share it with your friends using code".tr()} ${controller.referralModel.value.referralCode.toString()} ${"and get".tr()}${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount.toString())} ${"when order completed".tr()}", + "${"Hey there, thanks for choosing Foodie. Hope you love our product. If you do, share it with your friends using code".tr} ${controller.referralModel.value.referralCode.toString()} ${"and get".tr}${Constant.amountShow(amount: Constant.sectionConstantModel!.referralAmount.toString())} ${"when order completed".tr}", ); }, ), diff --git a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart index 0112d26..c7b9011 100644 --- a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart @@ -13,11 +13,11 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -52,7 +52,7 @@ class RestaurantDetailsScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${cartItem.length} ${"items".tr()}', + '${cartItem.length} ${"items".tr}', style: TextStyle( fontFamily: AppThemeData.medium, color: AppThemeData.grey50, @@ -60,7 +60,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), ), Text( - 'View Cart'.tr(), + 'View Cart'.tr, style: TextStyle( fontFamily: AppThemeData.semiBold, color: AppThemeData.grey50, @@ -124,7 +124,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr(), + "Free Delivery".tr, style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -484,7 +484,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ); }, child: Text( - "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr()}", + "${controller.vendorModel.value.reviewsCount} ${'Ratings'.tr}", style: TextStyle( decoration: TextDecoration.underline, @@ -510,8 +510,8 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ Text( controller.isOpen.value - ? "Open".tr() - : "Close".tr(), + ? "Open".tr + : "Close".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -547,7 +547,7 @@ class RestaurantDetailsScreen extends StatelessWidget { .isEmpty) { ShowToastDialog.showToast( "Timing is not added by store" - .tr(), + .tr, ); } else { timeShowBottomSheet( @@ -557,7 +557,7 @@ class RestaurantDetailsScreen extends StatelessWidget { } }, child: Text( - "View Timings".tr(), + "View Timings".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -600,7 +600,7 @@ class RestaurantDetailsScreen extends StatelessWidget { const SizedBox(height: 20), Text( "Also applicable on table booking" - .tr(), + .tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -673,8 +673,7 @@ class RestaurantDetailsScreen extends StatelessWidget { .start, children: [ Text( - "Table Booking" - .tr(), + "Table Booking".tr, style: TextStyle( fontSize: 16, color: @@ -693,7 +692,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), Text( "Quick Conformations" - .tr(), + .tr, style: TextStyle( fontSize: 12, color: @@ -729,7 +728,7 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Additional Offers".tr(), + "Additional Offers".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -751,7 +750,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(height: 20), Text( - "Menu".tr(), + "Menu".tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -771,8 +770,7 @@ class RestaurantDetailsScreen extends StatelessWidget { controller .searchEditingController .value, - hintText: - 'Search the item and more...'.tr(), + hintText: 'Search the item and more...'.tr, onchange: (value) { controller.searchProduct(value); }, @@ -866,7 +864,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(width: 8), Text( - 'Veg'.tr(), + 'Veg'.tr, style: TextStyle( color: isDark @@ -962,7 +960,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(width: 8), Text( - 'Non Veg'.tr(), + 'Non Veg'.tr, style: TextStyle( color: isDark @@ -1372,7 +1370,7 @@ class CouponListView extends StatelessWidget { Clipboard.setData( ClipboardData(text: offerModel.code.toString()), ).then((value) { - ShowToastDialog.showToast("Copied".tr()); + ShowToastDialog.showToast("Copied".tr); }); }, child: Row( @@ -1573,8 +1571,8 @@ class ProductListView extends StatelessWidget { const SizedBox(width: 5), Text( productModel.nonveg == true - ? "Non Veg.".tr() - : "Pure veg.".tr(), + ? "Non Veg.".tr + : "Pure veg.".tr, style: TextStyle( color: productModel.nonveg == true @@ -1709,7 +1707,7 @@ class ProductListView extends StatelessWidget { ), const SizedBox(width: 8), Text( - "Info".tr(), + "Info".tr, maxLines: 2, style: TextStyle( overflow: TextOverflow.ellipsis, @@ -1833,7 +1831,7 @@ class ProductListView extends StatelessWidget { .addOnsTitle! .isNotEmpty) ? RoundedButtonFill( - title: "Add".tr(), + title: "Add".tr, width: 10, height: 4, color: @@ -2121,7 +2119,7 @@ class ProductListView extends StatelessWidget { } else { ShowToastDialog.showToast( "Out of stock" - .tr(), + .tr, ); } }, @@ -2139,7 +2137,7 @@ class ProductListView extends StatelessWidget { ), ) : RoundedButtonFill( - title: "Add".tr(), + title: "Add".tr, width: 10, height: 4, color: @@ -2173,7 +2171,7 @@ class ProductListView extends StatelessWidget { } else { ShowToastDialog.showToast( "Out of stock" - .tr(), + .tr, ); } }, @@ -2245,7 +2243,7 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Product Information's".tr(), + "Product Information's".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.bold, @@ -2282,7 +2280,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Gram".tr(), + "Gram".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -2319,7 +2317,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Calories".tr(), + "Calories".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -2356,7 +2354,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Proteins".tr(), + "Proteins".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -2393,7 +2391,7 @@ class ProductListView extends StatelessWidget { children: [ Expanded( child: Text( - "Fats".tr(), + "Fats".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.regular, @@ -2429,7 +2427,7 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Specification".tr(), + "Specification".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -2497,7 +2495,7 @@ class ProductListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Brand".tr(), + "Brand".tr, textAlign: TextAlign.start, style: TextStyle( fontWeight: FontWeight.w700, @@ -2528,7 +2526,7 @@ class ProductListView extends StatelessWidget { : const SizedBox(), const SizedBox(height: 20), RoundedButtonFill( - title: "Back".tr(), + title: "Back".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -2788,7 +2786,7 @@ class ProductDetailsView extends StatelessWidget { ), child: Text( "Required • Select any 1 option" - .tr(), + .tr, style: TextStyle( fontSize: 12, overflow: TextOverflow.ellipsis, @@ -3031,7 +3029,7 @@ class ProductDetailsView extends StatelessWidget { horizontal: 12, ), child: Text( - "Addons".tr(), + "Addons".tr, style: TextStyle( fontSize: 16, overflow: TextOverflow.ellipsis, @@ -3207,9 +3205,7 @@ class ProductDetailsView extends StatelessWidget { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast( - "Out of stock".tr(), - ); + ShowToastDialog.showToast("Out of stock".tr); } } else { int totalQuantity = int.parse( @@ -3230,9 +3226,7 @@ class ProductDetailsView extends StatelessWidget { controller.quantity.value += 1; controller.update(); } else { - ShowToastDialog.showToast( - "Out of stock".tr(), - ); + ShowToastDialog.showToast("Out of stock".tr); } } }, @@ -3253,8 +3247,8 @@ class ProductDetailsView extends StatelessWidget { flex: 2, child: RoundedButtonFill( title: - "${'Add item'.tr()} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}" - .tr(), + "${'Add item'.tr} ${Constant.amountShow(amount: controller.calculatePrice(productModel))}" + .tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, diff --git a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart index 27fa696..0150348 100644 --- a/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/review_list_screen/review_list_screen.dart @@ -6,12 +6,12 @@ import 'package:customer/models/rating_model.dart'; import 'package:customer/models/review_attribute_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../service/fire_store_utils.dart'; import '../chat_screens/full_screen_image_viewer.dart'; @@ -34,7 +34,7 @@ class ReviewListScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Reviews".tr(), + "Reviews".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -47,7 +47,7 @@ class ReviewListScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.ratingList.isEmpty - ? Constant.showEmptyView(message: "No Review found".tr()) + ? Constant.showEmptyView(message: "No Review found".tr) : Padding( padding: const EdgeInsets.symmetric( horizontal: 16, @@ -121,7 +121,7 @@ class ReviewListScreen extends StatelessWidget { snapshot.data!.data()!, ); return Text( - '${'Rate for'.tr()} - ${model.name ?? ''}', + '${'Rate for'.tr} - ${model.name ?? ''}', style: TextStyle( color: isDark diff --git a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart index 2a63623..56ce1ca 100644 --- a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart +++ b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart @@ -1,9 +1,9 @@ import 'package:customer/controllers/scan_qr_code_controller.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:qr_code_dart_scan/qr_code_dart_scan.dart'; import '../../../controllers/theme_controller.dart'; @@ -27,7 +27,7 @@ class ScanQrCodeScreen extends StatelessWidget { backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, title: Text( - "Scan QR Code".tr(), + "Scan QR Code".tr, style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -42,13 +42,13 @@ class ScanQrCodeScreen extends StatelessWidget { // if TypeScan.takePicture will try decode when click to take a picture(default TypeScan.live) onCapture: (Result result) { Get.back(); - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); if (controller.allNearestRestaurant.isNotEmpty) { if (controller.allNearestRestaurant .where((vendor) => vendor.id == result.text) .isEmpty) { ShowToastDialog.closeLoader(); - ShowToastDialog.showToast("Store is not available".tr()); + ShowToastDialog.showToast("Store is not available".tr); return; } VendorModel storeModel = controller.allNearestRestaurant @@ -61,7 +61,7 @@ class ScanQrCodeScreen extends StatelessWidget { ); } else { Get.back(); - ShowToastDialog.showToast("Store is not available".tr()); + ShowToastDialog.showToast("Store is not available".tr); } }, ), diff --git a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart index 0968a8b..b1992ab 100644 --- a/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart +++ b/lib/screen_ui/multi_vendor_service/search_screen/search_screen.dart @@ -5,12 +5,12 @@ import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/text_field_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import '../../../controllers/theme_controller.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../service/fire_store_utils.dart'; import '../../../widget/restaurant_image_view.dart'; import '../restaurant_details_screen/restaurant_details_screen.dart'; @@ -37,7 +37,7 @@ class SearchScreen extends StatelessWidget { ) == true ? "Find your favorite products and nearby stores" - : "Search Item & Store".tr(), + : "Search Item & Store".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -55,8 +55,8 @@ class SearchScreen extends StatelessWidget { ?.toLowerCase() .contains('restaurants') == true - ? 'Find your favorite products and nearby stores'.tr() - : 'Search the store and item'.tr(), + ? 'Find your favorite products and nearby stores'.tr + : 'Search the store and item'.tr, prefix: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: SvgPicture.asset("assets/icons/ic_search.svg"), @@ -87,7 +87,7 @@ class SearchScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Store".tr(), + "Store".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -230,7 +230,7 @@ class SearchScreen extends StatelessWidget { ), Text( "Free Delivery" - .tr(), + .tr, style: TextStyle( fontSize: 14, color: @@ -427,7 +427,7 @@ class SearchScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Items".tr(), + "Items".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -526,9 +526,9 @@ class SearchScreen extends StatelessWidget { productModel.nonveg == true ? "Non Veg." - .tr() + .tr : "Pure veg." - .tr(), + .tr, style: TextStyle( color: productModel.nonveg == diff --git a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart index f1ded87..fab46d9 100644 --- a/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart +++ b/lib/screen_ui/multi_vendor_service/terms_and_condition/terms_and_condition_screen.dart @@ -1,8 +1,8 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:flutter_html/flutter_html.dart'; import '../../../controllers/theme_controller.dart'; @@ -32,7 +32,7 @@ class TermsAndConditionScreen extends StatelessWidget { ), ), title: Text( - type == "privacy" ? "Privacy Policy".tr() : "Terms & Conditions".tr(), + type == "privacy" ? "Privacy Policy".tr : "Terms & Conditions".tr, style: TextStyle( color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontFamily: AppThemeData.bold, diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart index 6178b1d..26caea8 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart @@ -6,10 +6,10 @@ import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_scr import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/text_field_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -30,7 +30,7 @@ class PaymentListScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Top up Wallet".tr(), + "Top up Wallet".tr, style: TextStyle( fontSize: 16, color: isDark ? AppThemeData.grey50 : AppThemeData.grey900, @@ -46,8 +46,8 @@ class PaymentListScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: TextFieldWidget( - title: 'Amount'.tr(), - hintText: 'Enter Amount'.tr(), + title: 'Amount'.tr, + hintText: 'Enter Amount'.tr, controller: controller.topUpAmountController.value, textInputType: const TextInputType.numberWithOptions( decimal: true, @@ -74,7 +74,7 @@ class PaymentListScreen extends StatelessWidget { vertical: 10, ), child: Text( - "Select Top up Options".tr(), + "Select Top up Options".tr, style: TextStyle( fontSize: 16, color: @@ -208,14 +208,14 @@ class PaymentListScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(bottom: 20), child: RoundedButtonFill( - title: "Top-up".tr(), + title: "Top-up".tr, height: 5.5, color: AppThemeData.primary300, textColor: AppThemeData.grey50, fontSizes: 16, onPress: () async { if (controller.topUpAmountController.value.text.isEmpty) { - ShowToastDialog.showToast("Please Enter Amount".tr()); + ShowToastDialog.showToast("Please Enter Amount".tr); } else { if (double.parse( controller.topUpAmountController.value.text, @@ -289,7 +289,7 @@ class PaymentListScreen extends StatelessWidget { Get.back(); ShowToastDialog.showToast( "Something went wrong, please contact admin." - .tr(), + .tr, ); } else { CreateRazorPayOrderModel result = value; @@ -305,12 +305,12 @@ class PaymentListScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - "Please select payment method".tr(), + "Please select payment method".tr, ); } } else { ShowToastDialog.showToast( - "${'Please Enter minimum amount of'.tr()} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}", + "${'Please Enter minimum amount of'.tr} ${Constant.amountShow(amount: Constant.minimumAmountToDeposit)}", ); } } diff --git a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart index ffa4627..832f7fa 100644 --- a/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart +++ b/lib/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart @@ -4,7 +4,8 @@ import 'package:customer/models/wallet_transaction_model.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/payment_list_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import '../../../constant/collection_name.dart'; import '../../../controllers/theme_controller.dart'; import '../../../models/cab_order_model.dart'; @@ -23,7 +24,7 @@ import '../../rental_service/rental_order_details_screen.dart'; import '../order_list_screen/order_details_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class WalletScreen extends StatelessWidget { const WalletScreen({super.key}); @@ -51,7 +52,7 @@ class WalletScreen extends StatelessWidget { Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), Text( - "Please Log In to Continue".tr(), + "Please Log In to Continue".tr, style: TextStyle( color: isDark @@ -64,7 +65,7 @@ class WalletScreen extends StatelessWidget { const SizedBox(height: 5), Text( "You’re not logged in. Please sign in to access your account and explore all features." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -77,7 +78,7 @@ class WalletScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr(), + title: "Log in".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -111,7 +112,7 @@ class WalletScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "My Wallet".tr(), + "My Wallet".tr, style: TextStyle( fontSize: 24, color: @@ -124,7 +125,7 @@ class WalletScreen extends StatelessWidget { ), Text( "Keep track of your balance, transactions, and payment methods all in one place." - .tr(), + .tr, style: TextStyle( color: isDark @@ -165,7 +166,7 @@ class WalletScreen extends StatelessWidget { child: Column( children: [ Text( - "My Wallet".tr(), + "My Wallet".tr, maxLines: 1, style: TextStyle( color: @@ -203,7 +204,7 @@ class WalletScreen extends StatelessWidget { horizontal: 80, ), child: RoundedButtonFill( - title: "Top up".tr(), + title: "Top up".tr, color: AppThemeData.warning300, textColor: AppThemeData.grey900, onPress: () { @@ -222,7 +223,7 @@ class WalletScreen extends StatelessWidget { child: controller.walletTransactionList.isEmpty ? Constant.showEmptyView( - message: "Transaction not found".tr(), + message: "Transaction not found".tr, ) : Padding( padding: const EdgeInsets.symmetric( @@ -307,7 +308,7 @@ class WalletScreen extends StatelessWidget { ); break; default: - ShowToastDialog.showToast("Order details not available".tr()); + ShowToastDialog.showToast("Order details not available".tr); } } }, diff --git a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart index 1f87e22..b549d97 100644 --- a/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart +++ b/lib/screen_ui/on_boarding_screen/on_boarding_screen.dart @@ -1,8 +1,9 @@ import 'package:customer/constant/assets.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/on_boarding_controller.dart'; import '../../themes/app_them_data.dart'; import '../../utils/network_image_widget.dart'; @@ -96,7 +97,7 @@ class OnboardingScreen extends StatelessWidget { const SizedBox(height: 20), controller.currentPage.value == pageCount - 1 ? RoundedButtonFill( - title: "Let’s Get Started".tr(), + title: "Let’s Get Started".tr, onPress: () { _finish(); }, @@ -106,7 +107,7 @@ class OnboardingScreen extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( - title: "Skip".tr(), + title: "Skip".tr, onPress: () => _finish(), color: AppThemeData.grey50, textColor: AppThemeData.grey900, @@ -115,7 +116,7 @@ class OnboardingScreen extends StatelessWidget { const SizedBox(width: 20), Expanded( child: RoundedButtonFill( - title: "Next".tr(), + title: "Next".tr, onPress: () { controller.nextPage(); }, @@ -137,6 +138,6 @@ class OnboardingScreen extends StatelessWidget { Future _finish() async { await Preferences.setBoolean(Preferences.isFinishOnBoardingKey, true); - Get.offAll(() => const LoginScreen()); + Get.offAll(LoginScreen()); } } diff --git a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart index e9fe212..4744a1c 100644 --- a/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart +++ b/lib/screen_ui/on_demand_service/favourite_ondemand_screen.dart @@ -9,9 +9,10 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_details_screen.da import 'package:customer/service/fire_store_utils.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class FavouriteOndemandScreen extends StatelessWidget { const FavouriteOndemandScreen({super.key}); @@ -35,7 +36,7 @@ class FavouriteOndemandScreen extends StatelessWidget { children: [ const SizedBox(width: 10), Text( - "Favourite Services".tr(), + "Favourite Services".tr, style: TextStyle( fontFamily: AppThemeData.semiBold, color: @@ -60,7 +61,7 @@ class FavouriteOndemandScreen extends StatelessWidget { Image.asset("assets/images/login.gif", height: 120), const SizedBox(height: 12), Text( - "Please Log In to Continue".tr(), + "Please Log In to Continue".tr, style: TextStyle( color: isDark @@ -73,7 +74,7 @@ class FavouriteOndemandScreen extends StatelessWidget { const SizedBox(height: 5), Text( "You’re not logged in. Please sign in to access your account and explore all features." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -86,7 +87,7 @@ class FavouriteOndemandScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr(), + title: "Log in".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -106,7 +107,7 @@ class FavouriteOndemandScreen extends StatelessWidget { child: controller.lstFav.isEmpty ? Constant.showEmptyView( - message: "Favourite Service not found.".tr(), + message: "Favourite Service not found.".tr, ) : ListView.builder( shrinkWrap: true, @@ -603,7 +604,7 @@ class FavouriteOndemandScreen extends StatelessWidget { return Text( provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) - : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr}', style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, @@ -616,7 +617,7 @@ class FavouriteOndemandScreen extends StatelessWidget { Text( provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') - : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr}', style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, @@ -627,7 +628,7 @@ class FavouriteOndemandScreen extends StatelessWidget { Text( provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) - : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr}', style: const TextStyle( fontSize: 12, color: Colors.grey, diff --git a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart index 24eae6e..655f22c 100644 --- a/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart +++ b/lib/screen_ui/on_demand_service/my_booking_on_demand_screen.dart @@ -1,7 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../../constant/constant.dart'; import '../../controllers/my_booking_on_demand_controller.dart'; @@ -35,7 +35,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { title: Padding( padding: const EdgeInsets.only(bottom: 10), child: Text( - "Booking History".tr(), + "Booking History".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -75,7 +75,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { if (orders.isEmpty) { return Center( child: Text( - "No ride found".tr(), + "No ride found".tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -274,7 +274,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { .otp! .isNotEmpty) Text( - "${'OTP :'.tr()} ${onProviderOrder.otp}", + "${'OTP :'.tr} ${onProviderOrder.otp}", style: AppThemeData.mediumTextStyle( fontSize: 14, color: @@ -324,7 +324,7 @@ class MyBookingOnDemandScreen extends StatelessWidget { return Text( order.provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: price) - : "${Constant.amountShow(amount: price)}/${'hr'.tr()}", + : "${Constant.amountShow(amount: price)}/${'hr'.tr}", style: AppThemeData.mediumTextStyle( fontSize: 16, color: AppThemeData.primary300, @@ -402,14 +402,14 @@ class MyBookingOnDemandScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - label.tr(), + label.tr, style: AppThemeData.mediumTextStyle( fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, ), ), Text( - value.tr(), + value.tr, style: AppThemeData.regularTextStyle( fontSize: 14, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, diff --git a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart index db6fa1b..a59f56c 100644 --- a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart @@ -1,10 +1,10 @@ import 'package:bottom_picker/bottom_picker.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/on_demand_booking_controller.dart'; @@ -60,7 +60,7 @@ class OnDemandBookingScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Book Service".tr(), + "Book Service".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -77,7 +77,7 @@ class OnDemandBookingScreen extends StatelessWidget { children: [ // Services Section Text( - "Services".tr(), + "Services".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 18, color: @@ -209,7 +209,7 @@ class OnDemandBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Address".tr(), + "Address".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 18, color: @@ -237,7 +237,7 @@ class OnDemandBookingScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service not available in this area" - .tr(), + .tr, ); } } @@ -246,7 +246,7 @@ class OnDemandBookingScreen extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); ShippingAddress shippingAddress = @@ -362,8 +362,8 @@ class OnDemandBookingScreen extends StatelessWidget { ), const SizedBox(height: 15), TextFieldWidget( - title: "Description".tr(), - hintText: "Enter Description".tr(), + title: "Description".tr, + hintText: "Enter Description".tr, controller: controller.descriptionController.value, maxLine: 5, ), @@ -405,8 +405,8 @@ class OnDemandBookingScreen extends StatelessWidget { ).show(context); }, child: TextFieldWidget( - title: "Booking Date & Slot".tr(), - hintText: "Choose Date and Time".tr(), + title: "Booking Date & Slot".tr, + hintText: "Choose Date and Time".tr, controller: controller.dateTimeController.value, enable: false, ), @@ -440,7 +440,7 @@ class OnDemandBookingScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(vertical: 10), child: Text( - "Price Detail".tr(), + "Price Detail".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -460,7 +460,7 @@ class OnDemandBookingScreen extends StatelessWidget { bottomNavigationBar: Padding( padding: const EdgeInsets.all(20.0), child: RoundedButtonFill( - title: "Confirm".tr(), + title: "Confirm".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () => controller.confirmBooking(context), @@ -506,8 +506,8 @@ class OnDemandBookingScreen extends StatelessWidget { margin: const EdgeInsets.only(top: 3), child: Text( coupon.discountType == "Fix Price" - ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" - : "${coupon.discount} ${'% Off'.tr()}", + ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr}" + : "${coupon.discount} ${'% Off'.tr}", style: TextStyle( fontWeight: FontWeight.bold, letterSpacing: 0.7, @@ -543,7 +543,7 @@ class OnDemandBookingScreen extends StatelessWidget { color: AppThemeData.grey50, ), Text( - "valid till ".tr() + + "valid till ".tr + controller.getDate( coupon.expiresAt!.toDate().toString(), ), @@ -595,7 +595,7 @@ class OnDemandBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Promo Code".tr(), + "Promo Code".tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -607,7 +607,7 @@ class OnDemandBookingScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - "Apply promo code".tr(), + "Apply promo code".tr, style: AppThemeData.mediumTextStyle( fontSize: 15, color: @@ -701,7 +701,7 @@ class OnDemandBookingScreen extends StatelessWidget { Container( padding: const EdgeInsets.only(top: 20), child: Text( - 'Redeem Your Coupons'.tr(), + 'Redeem Your Coupons'.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -719,7 +719,7 @@ class OnDemandBookingScreen extends StatelessWidget { right: 22, ), child: Text( - "Voucher or Coupon code".tr(), + "Voucher or Coupon code".tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -763,7 +763,7 @@ class OnDemandBookingScreen extends StatelessWidget { controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, - hintText: "Write Coupon Code".tr(), + hintText: "Write Coupon Code".tr, hintStyle: AppThemeData.mediumTextStyle( color: isDark @@ -784,7 +784,7 @@ class OnDemandBookingScreen extends StatelessWidget { right: 15, ), child: RoundedButtonFill( - title: "REDEEM NOW".tr(), + title: "REDEEM NOW".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { @@ -803,7 +803,7 @@ class OnDemandBookingScreen extends StatelessWidget { Get.back(); } else { ShowToastDialog.showToast( - "Applied coupon not valid.".tr(), + "Applied coupon not valid.".tr, ); } }, @@ -833,7 +833,7 @@ class OnDemandBookingScreen extends StatelessWidget { children: [ const SizedBox(height: 5), rowText( - "Price".tr(), + "Price".tr, Constant.amountShow(amount: controller.price.value.toString()), isDark, ), @@ -851,7 +851,7 @@ class OnDemandBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", + "${"Discount".tr} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", style: TextStyle( color: isDark @@ -881,7 +881,7 @@ class OnDemandBookingScreen extends StatelessWidget { : const SizedBox(), const Divider(), rowText( - "SubTotal".tr(), + "SubTotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, ), @@ -938,7 +938,7 @@ class OnDemandBookingScreen extends StatelessWidget { }, ), rowText( - "Total Amount".tr(), + "Total Amount".tr, Constant.amountShow( amount: controller.totalAmount.value.toString(), ), @@ -958,13 +958,13 @@ class OnDemandBookingScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - title.tr(), + title.tr, style: AppThemeData.mediumTextStyle( color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, ), ), Text( - value.tr(), + value.tr, style: AppThemeData.mediumTextStyle( color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, ), diff --git a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart index a5e20c6..afb4375 100644 --- a/lib/screen_ui/on_demand_service/on_demand_category_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_category_screen.dart @@ -1,8 +1,8 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/screen_ui/on_demand_service/view_category_service_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/on_demand_category_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -55,7 +55,7 @@ class OnDemandCategoryScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Explore services".tr(), + "Explore services".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -63,7 +63,7 @@ class OnDemandCategoryScreen extends StatelessWidget { ), Text( "Explore services tailored for you—quick, easy, and personalized." - .tr(), + .tr, maxLines: 1, overflow: TextOverflow.ellipsis, style: AppThemeData.boldTextStyle( @@ -90,7 +90,7 @@ class OnDemandCategoryScreen extends StatelessWidget { child: Column( children: [ controller.categories.isEmpty - ? Center(child: Text("No Categories".tr())) + ? Center(child: Text("No Categories".tr)) : GridView.builder( padding: const EdgeInsets.all(5), itemCount: controller.categories.length, diff --git a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart index 60749e6..bb7b781 100644 --- a/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_dashboard_screen.dart @@ -2,10 +2,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/on_demand_dashboard_controller.dart'; class OnDemandDashboardScreen extends StatelessWidget { @@ -52,28 +52,28 @@ class OnDemandDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr(), + label: 'Favourites'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", - label: 'My Bookings'.tr(), + label: 'My Bookings'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ] @@ -82,14 +82,14 @@ class OnDemandDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr(), + label: 'Favourites'.tr, controller: controller, ), @@ -97,21 +97,21 @@ class OnDemandDashboardScreen extends StatelessWidget { isDark, index: 2, assetIcon: "assets/icons/ic_booking_cab.svg", - label: 'My Bookings'.tr(), + label: 'My Bookings'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_wallet_cab.svg", - label: 'Wallet'.tr(), + label: 'Wallet'.tr, controller: controller, ), navigationBarItem( isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ], diff --git a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart index dcfbca1..b524540 100644 --- a/lib/screen_ui/on_demand_service/on_demand_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_details_screen.dart @@ -1,10 +1,11 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/screen_ui/on_demand_service/provider_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../../controllers/theme_controller.dart'; import '../../models/provider_serivce_model.dart'; @@ -42,7 +43,7 @@ class OnDemandDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ RoundedButtonFill( - title: "Book Now".tr(), + title: "Book Now".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -132,7 +133,7 @@ class OnDemandDetailsScreen extends StatelessWidget { vertical: 10, ), child: Text( - controller.isOpen.value ? "Open".tr() : "Close".tr(), + controller.isOpen.value ? "Open".tr : "Close".tr, style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.white, @@ -177,7 +178,7 @@ class OnDemandDetailsScreen extends StatelessWidget { ? Constant.amountShow( amount: provider.price ?? '0', ) - : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr}', style: TextStyle( fontSize: 18, fontFamily: AppThemeData.regular, @@ -195,7 +196,7 @@ class OnDemandDetailsScreen extends StatelessWidget { ? Constant.amountShow( amount: provider.disPrice ?? '0', ) - : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.disPrice ?? '0')}/${'hr'.tr}', style: TextStyle( fontSize: 18, fontFamily: AppThemeData.regular, @@ -213,7 +214,7 @@ class OnDemandDetailsScreen extends StatelessWidget { ? Constant.amountShow( amount: provider.price ?? '0', ) - : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.price ?? '0')}/${'hr'.tr}', style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 18, @@ -271,7 +272,7 @@ class OnDemandDetailsScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "(${provider.reviewsCount} ${'Reviews'.tr()})", + "(${provider.reviewsCount} ${'Reviews'.tr})", style: TextStyle( letterSpacing: 0.5, fontSize: 16, @@ -342,7 +343,7 @@ class OnDemandDetailsScreen extends StatelessWidget { ); }, child: Text( - "View Timing".tr(), + "View Timing".tr, style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.green, @@ -451,7 +452,7 @@ class OnDemandDetailsScreen extends StatelessWidget { borderRadius: BorderRadius.circular(10), ), child: Text( - title.tr(), + title.tr, style: TextStyle( fontWeight: FontWeight.bold, color: @@ -475,7 +476,7 @@ class OnDemandDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - (providerModel.description ?? '').tr(), + (providerModel.description ?? '').tr, style: TextStyle( color: isDark ? Colors.white : Colors.black, fontSize: 14, @@ -620,7 +621,7 @@ class OnDemandDetailsScreen extends StatelessWidget { final photos = controller.provider.photos; if (photos.isEmpty) { - return Center(child: Text("No Image Found".tr())); + return Center(child: Text("No Image Found".tr)); } return GridView.builder( @@ -686,7 +687,7 @@ class OnDemandDetailsScreen extends StatelessWidget { height: 200, child: Center( child: Text( - "No review Found".tr(), + "No review Found".tr, style: AppThemeData.mediumTextStyle( color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, ), @@ -810,7 +811,7 @@ class OnDemandDetailsScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), child: Text( - "Service Timing".tr(), + "Service Timing".tr, style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, @@ -826,7 +827,7 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: _timeCard( context, - "Start Time : ".tr(), + "Start Time : ".tr, provider.startTime.toString(), isDark, ), @@ -835,7 +836,7 @@ class OnDemandDetailsScreen extends StatelessWidget { Expanded( child: _timeCard( context, - "End Time : ".tr(), + "End Time : ".tr, provider.endTime.toString(), isDark, ), @@ -846,7 +847,7 @@ class OnDemandDetailsScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), child: Text( - "Service Days".tr(), + "Service Days".tr, style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, diff --git a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart index 0fea656..0391771 100644 --- a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart @@ -11,16 +11,17 @@ import 'package:customer/screen_ui/on_demand_service/view_category_service_scree import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/themes/show_toast_dialog.dart'; +import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/on_demand_home_controller.dart'; import '../../models/category_model.dart'; import '../../models/provider_serivce_model.dart'; @@ -76,7 +77,7 @@ class OnDemandHomeScreen extends StatelessWidget { ? InkWell( onTap: () => Get.offAll(const LoginScreen()), child: Text( - "Login".tr(), + "Login".tr, style: AppThemeData.boldTextStyle( color: AppThemeData.grey900, fontSize: 12, @@ -104,7 +105,7 @@ class OnDemandHomeScreen extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); // ✅ declare it once here! @@ -240,7 +241,7 @@ class OnDemandHomeScreen extends StatelessWidget { Image.asset("assets/images/location.gif", height: 120), const SizedBox(height: 12), Text( - "No Store Found in Your Area".tr(), + "No Store Found in Your Area".tr, style: TextStyle( color: isDark @@ -253,7 +254,7 @@ class OnDemandHomeScreen extends StatelessWidget { const SizedBox(height: 5), Text( "Currently, there are no available store in your zone. Try changing your location to find nearby options." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -266,7 +267,7 @@ class OnDemandHomeScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Change Zone".tr(), + title: "Change Zone".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -308,7 +309,7 @@ class OnDemandHomeScreen extends StatelessWidget { child: controller.categories.isEmpty ? Constant.showEmptyView( - message: "No Categories".tr(), + message: "No Categories".tr, ) : Padding( padding: const EdgeInsets.symmetric( @@ -388,7 +389,7 @@ class OnDemandHomeScreen extends StatelessWidget { width: 70, child: Center( child: Text( - "View All".tr(), + "View All".tr, textAlign: TextAlign.center, maxLines: 1, @@ -416,7 +417,7 @@ class OnDemandHomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Most Popular services".tr(), + "Most Popular services".tr, style: TextStyle( color: isDark ? Colors.white : Colors.black, @@ -431,7 +432,7 @@ class OnDemandHomeScreen extends StatelessWidget { Get.to(() => ViewAllPopularServiceScreen()); }, child: Text( - "View all".tr(), + "View all".tr, style: TextStyle( color: AppThemeData.primary300, fontSize: 14, @@ -444,7 +445,7 @@ class OnDemandHomeScreen extends StatelessWidget { ), ), controller.providerList.isEmpty - ? Center(child: Text("No Services Found".tr())) + ? Center(child: Text("No Services Found".tr)) : ListView.builder( shrinkWrap: true, padding: EdgeInsets.zero, @@ -772,7 +773,7 @@ class ServiceView extends StatelessWidget { return Text( provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.price) - : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.price ?? "0")}/${'hr'.tr}', style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, @@ -785,7 +786,7 @@ class ServiceView extends StatelessWidget { Text( provider.priceUnit == 'Fixed' ? Constant.amountShow(amount: provider.disPrice ?? '0') - : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr()}', + : '${Constant.amountShow(amount: provider.disPrice)}/${'hr'.tr}', style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, diff --git a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart index 9db13d4..231adc9 100644 --- a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart @@ -1,8 +1,8 @@ import 'package:clipboard/clipboard.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../../controllers/on_demand_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -56,7 +56,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Order Details".tr(), + "Order Details".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -100,7 +100,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Cancel Reason'.tr(), + 'Cancel Reason'.tr, style: AppThemeData.mediumTextStyle( fontSize: 15, color: @@ -155,7 +155,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - 'Booking ID'.tr(), + 'Booking ID'.tr, style: AppThemeData.mediumTextStyle( fontSize: 15, color: @@ -175,7 +175,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ).then((value) { SnackBar snackBar = SnackBar( content: Text( - "Booking ID Copied".tr(), + "Booking ID Copied".tr, textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle( @@ -207,7 +207,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), SizedBox(height: 10), Text( - "${'Booking Address :'.tr()} ${controller.onProviderOrder.value?.address?.getFullAddress()}", + "${'Booking Address :'.tr} ${controller.onProviderOrder.value?.address?.getFullAddress()}", style: AppThemeData.mediumTextStyle( fontSize: 15, color: @@ -296,7 +296,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { top: 6, ), child: Text( - '${'Date:'.tr()} ', + '${'Date:'.tr} ', style: AppThemeData.regularTextStyle( fontSize: 14, @@ -350,7 +350,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { top: 6, ), child: Text( - '${'Time:'.tr()} ', + '${'Time:'.tr} ', style: AppThemeData.regularTextStyle( fontSize: 14, @@ -422,7 +422,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(vertical: 10), child: Text( - 'About Worker'.tr(), + 'About Worker'.tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -674,7 +674,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), child: Text( - 'Add Review'.tr(), + 'Add Review'.tr, style: AppThemeData.regularTextStyle( fontSize: 16, @@ -754,7 +754,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), SizedBox(width: 10), Text( - 'Call'.tr(), + 'Call'.tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -771,7 +771,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: ElevatedButton( onPressed: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); ShowToastDialog.closeLoader(); @@ -844,7 +844,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), SizedBox(width: 10), Text( - 'Chat'.tr(), + 'Chat'.tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -870,7 +870,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(vertical: 10), child: Text( - "About provider".tr(), + "About provider".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -1064,7 +1064,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), ), child: Text( - 'Add Review'.tr(), + 'Add Review'.tr, style: AppThemeData.regularTextStyle( fontSize: 16, color: @@ -1130,7 +1130,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), SizedBox(width: 10), Text( - 'Call'.tr(), + 'Call'.tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, @@ -1192,7 +1192,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: ElevatedButton( onPressed: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); ShowToastDialog.closeLoader(); @@ -1260,7 +1260,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), SizedBox(width: 10), Text( - 'Chat'.tr(), + 'Chat'.tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, @@ -1297,7 +1297,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(vertical: 10), child: Text( - "Price Detail".tr(), + "Price Detail".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -1362,7 +1362,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(vertical: 16), child: Text( - "Price Detail".tr(), + "Price Detail".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -1405,7 +1405,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Total Extra Charges : ".tr(), + "Total Extra Charges : ".tr, style: TextStyle( color: isDark @@ -1442,7 +1442,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Extra charge Notes : ".tr(), + "Extra charge Notes : ".tr, style: TextStyle( color: isDark @@ -1518,7 +1518,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ? Row( children: [ Text( - "New Date : ".tr(), + "New Date : ".tr, style: TextStyle( color: isDark @@ -1564,7 +1564,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { vertical: 10, ), child: RoundedButtonFill( - title: "Cancel Booking".tr(), + title: "Cancel Booking".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { @@ -1590,7 +1590,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ? Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: RoundedButtonFill( - title: 'Pay Extra Amount'.tr(), + title: 'Pay Extra Amount'.tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -1633,7 +1633,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { vertical: 10, ), child: RoundedButtonFill( - title: 'Pay Now'.tr(), + title: 'Pay Now'.tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () async { @@ -1728,8 +1728,8 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { margin: const EdgeInsets.only(top: 3), child: Text( coupon.discountType == "Fix Price" - ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr()}" - : "${coupon.discount} ${'% Off'.tr()}", + ? "${Constant.amountShow(amount: coupon.discount.toString())} ${'OFF'.tr}" + : "${coupon.discount} ${'% Off'.tr}", style: TextStyle( fontWeight: FontWeight.bold, letterSpacing: 0.7, @@ -1765,7 +1765,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { color: AppThemeData.grey50, ), Text( - "valid till ".tr() + + "valid till ".tr + controller.getDate( coupon.expiresAt!.toDate().toString(), ), @@ -1821,7 +1821,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Promo Code".tr(), + "Promo Code".tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -1833,7 +1833,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), const SizedBox(height: 5), Text( - "Apply promo code".tr(), + "Apply promo code".tr, style: AppThemeData.mediumTextStyle( fontSize: 15, color: @@ -1928,7 +1928,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { Container( padding: const EdgeInsets.only(top: 20), child: Text( - 'Redeem Your Coupons'.tr(), + 'Redeem Your Coupons'.tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -1946,7 +1946,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { right: 22, ), child: Text( - "Voucher or Coupon code".tr(), + "Voucher or Coupon code".tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -1990,7 +1990,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { controller: controller.couponTextController.value, decoration: InputDecoration( border: InputBorder.none, - hintText: "Write Coupon Code".tr(), + hintText: "Write Coupon Code".tr, hintStyle: AppThemeData.mediumTextStyle( color: isDark @@ -2011,7 +2011,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { right: 15, ), child: RoundedButtonFill( - title: "REDEEM NOW".tr(), + title: "REDEEM NOW".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: () { @@ -2043,7 +2043,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { } else { print("❌ No matching coupon found"); ShowToastDialog.showToast( - "Applied coupon not valid.".tr(), + "Applied coupon not valid.".tr, ); } }, @@ -2073,7 +2073,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 5), rowText( - "Price".tr(), + "Price".tr, //Constant.amountShow(amount: controller.price.value.toString()), controller.onProviderOrder.value?.provider.disPrice == "" || controller.onProviderOrder.value?.provider.disPrice == "0" @@ -2095,7 +2095,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${"Discount".tr()} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", + "${"Discount".tr} ${controller.discountType.value == 'Percentage' || controller.discountType.value == 'Percent' ? "(${controller.discountLabel.value}%)" : "(${Constant.amountShow(amount: controller.discountLabel.value)})"}", style: TextStyle( color: isDark @@ -2125,7 +2125,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { : const SizedBox(), const Divider(), rowText( - "SubTotal".tr(), + "SubTotal".tr, Constant.amountShow(amount: controller.subTotal.value.toString()), isDark, ), @@ -2183,7 +2183,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { ), // Total Amount rowText( - "Total Amount".tr(), + "Total Amount".tr, Constant.amountShow( amount: controller.totalAmount.value.toString(), ), @@ -2227,7 +2227,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { AlertDialog( backgroundColor: isDark ? AppThemeData.greyDark50 : AppThemeData.grey50, title: Text( - 'Please give reason for canceling this Booking'.tr(), + 'Please give reason for canceling this Booking'.tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, @@ -2237,26 +2237,26 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { controller: controller.cancelBookingController.value, maxLines: 5, decoration: InputDecoration( - hintText: "Specify your reason here".tr(), + hintText: "Specify your reason here".tr, border: OutlineInputBorder(borderRadius: BorderRadius.circular(7)), ), ), actions: [ TextButton( onPressed: () => Get.back(), - child: Text('Cancel'.tr(), style: TextStyle(color: Colors.red)), + child: Text('Cancel'.tr, style: TextStyle(color: Colors.red)), ), TextButton( onPressed: () async { if (controller.cancelBookingController.value.text .trim() .isEmpty) { - ShowToastDialog.showToast("Please enter reason".tr()); + ShowToastDialog.showToast("Please enter reason".tr); } else { await controller.cancelBooking(); } }, - child: Text('Continue'.tr(), style: TextStyle(color: Colors.green)), + child: Text('Continue'.tr, style: TextStyle(color: Colors.green)), ), ], ), diff --git a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart index c99539a..f455175 100644 --- a/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_payment_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/constant/constant.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/0n_demand_payment_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../payment/createRazorPayOrderModel.dart'; @@ -53,7 +53,7 @@ class OnDemandPaymentScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Select Payment Method".tr(), + "Select Payment Method".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -79,7 +79,7 @@ class OnDemandPaymentScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Preferred Payment".tr(), + "Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -158,7 +158,7 @@ class OnDemandPaymentScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - "Other Payment Options".tr(), + "Other Payment Options".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -329,7 +329,7 @@ class OnDemandPaymentScreen extends StatelessWidget { ), SizedBox(height: 20), RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { @@ -400,12 +400,12 @@ class OnDemandPaymentScreen extends StatelessWidget { if (walletAmount == 0) { ShowToastDialog.showToast( "Wallet balance is 0. Please recharge wallet." - .tr(), + .tr, ); } else if (walletAmount < totalAmount) { ShowToastDialog.showToast( "Insufficient wallet balance. Please add funds." - .tr(), + .tr, ); } else { controller.placeOrder(); @@ -461,7 +461,7 @@ class OnDemandPaymentScreen extends StatelessWidget { Get.back(); ShowToastDialog.showToast( "Something went wrong, please contact admin." - .tr(), + .tr, ); } else { CreateRazorPayOrderModel result = @@ -476,7 +476,7 @@ class OnDemandPaymentScreen extends StatelessWidget { } else { controller.isOrderPlaced.value = false; ShowToastDialog.showToast( - "Please select payment method".tr(), + "Please select payment method".tr, ); } controller.isOrderPlaced.value = false; diff --git a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart index 0b7a998..04c83e0 100644 --- a/lib/screen_ui/on_demand_service/on_demand_review_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_review_screen.dart @@ -1,7 +1,6 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/on_demand_review_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -53,8 +52,8 @@ class OnDemandReviewScreen extends StatelessWidget { const SizedBox(width: 10), Text( controller.ratingModel.value != null - ? "Update Review".tr() - : "Add Review".tr(), + ? "Update Review".tr + : "Add Review".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -97,7 +96,7 @@ class OnDemandReviewScreen extends StatelessWidget { child: Column( children: [ Text( - 'Rate for'.tr(), + 'Rate for'.tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -154,7 +153,7 @@ class OnDemandReviewScreen extends StatelessWidget { Padding( padding: EdgeInsets.all(20.0), child: TextFieldWidget( - hintText: "Type comment....".tr(), + hintText: "Type comment....".tr, controller: controller.comment, maxLine: 5, ), @@ -165,8 +164,8 @@ class OnDemandReviewScreen extends StatelessWidget { title: controller.ratingModel.value != null - ? "Update Review".tr() - : "Add Review".tr(), + ? "Update Review".tr + : "Add Review".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey50, onPress: controller.submitReview, diff --git a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart index c0474bd..652b98a 100644 --- a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart @@ -8,9 +8,9 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dart'; import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -29,7 +29,7 @@ class ProviderInboxScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Provider Inbox".tr(), + "Provider Inbox".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -46,7 +46,7 @@ class ProviderInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), @@ -157,7 +157,7 @@ class ProviderInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance .collection('chat_provider') diff --git a/lib/screen_ui/on_demand_service/provider_screen.dart b/lib/screen_ui/on_demand_service/provider_screen.dart index e38223b..d352d47 100644 --- a/lib/screen_ui/on_demand_service/provider_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_screen.dart @@ -1,9 +1,9 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/provider_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/provider_serivce_model.dart'; @@ -143,7 +143,7 @@ class ProviderScreen extends StatelessWidget { const Divider(), const SizedBox(height: 10), controller.providerList.isEmpty - ? Center(child: Text("No Services Found".tr())) + ? Center(child: Text("No Services Found".tr)) : Expanded( child: ListView.builder( itemCount: controller.providerList.length, diff --git a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart index 287ddba..6ccb52a 100644 --- a/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_all_popular_service_screen.dart @@ -1,7 +1,7 @@ import 'package:customer/screen_ui/on_demand_service/on_demand_home_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/view_all_popular_service_controller.dart'; @@ -50,7 +50,7 @@ class ViewAllPopularServiceScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "All Services".tr(), + "All Services".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -71,7 +71,7 @@ class ViewAllPopularServiceScreen extends StatelessWidget { child: Column( children: [ TextFieldWidget( - hintText: "Search Service".tr(), + hintText: "Search Service".tr, controller: controller.searchTextFiledController.value, onchange: @@ -83,7 +83,7 @@ class ViewAllPopularServiceScreen extends StatelessWidget { ? Expanded( child: Center( child: Constant.showEmptyView( - message: "No service Found".tr(), + message: "No service Found".tr, ), ), ) diff --git a/lib/screen_ui/on_demand_service/view_category_service_screen.dart b/lib/screen_ui/on_demand_service/view_category_service_screen.dart index 467d535..d2165c1 100644 --- a/lib/screen_ui/on_demand_service/view_category_service_screen.dart +++ b/lib/screen_ui/on_demand_service/view_category_service_screen.dart @@ -1,6 +1,5 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../controllers/view_category_service_controller.dart'; @@ -64,7 +63,7 @@ class ViewCategoryServiceListScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.providerList.isEmpty - ? Constant.showEmptyView(message: "No Service Found".tr()) + ? Constant.showEmptyView(message: "No Service Found".tr) : Padding( padding: const EdgeInsets.symmetric( horizontal: 16, diff --git a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart index e74599c..72a945b 100644 --- a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart @@ -8,9 +8,9 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/firebase_pagination/src/fireStore_pagination.dart'; import 'package:customer/widget/firebase_pagination/src/models/view_type.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../../controllers/theme_controller.dart'; import '../../../service/fire_store_utils.dart'; import '../../../themes/show_toast_dialog.dart'; @@ -29,7 +29,7 @@ class WorkerInboxScreen extends StatelessWidget { centerTitle: false, titleSpacing: 0, title: Text( - "Worker Inbox".tr(), + "Worker Inbox".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, @@ -46,7 +46,7 @@ class WorkerInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr()); + ShowToastDialog.showLoader("Please wait...".tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), @@ -160,7 +160,7 @@ class WorkerInboxScreen extends StatelessWidget { ); }, shrinkWrap: true, - onEmpty: Constant.showEmptyView(message: "No Conversion found".tr()), + onEmpty: Constant.showEmptyView(message: "No Conversion found".tr), // orderBy is compulsory to enable pagination query: FirebaseFirestore.instance .collection('chat_worker') diff --git a/lib/screen_ui/parcel_service/book_parcel_screen.dart b/lib/screen_ui/parcel_service/book_parcel_screen.dart index cc14c4e..5c0e10c 100644 --- a/lib/screen_ui/parcel_service/book_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/book_parcel_screen.dart @@ -4,11 +4,11 @@ import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/utils.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:dropdown_textfield/dropdown_textfield.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/book_parcel_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -65,14 +65,14 @@ class BookParcelScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Book Your Document Delivery".tr(), + "Book Your Document Delivery".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, ), ), Text( - "Schedule a secure and timely pickup & delivery".tr(), + "Schedule a secure and timely pickup & delivery".tr, maxLines: 1, overflow: TextOverflow.ellipsis, style: AppThemeData.mediumTextStyle( @@ -100,7 +100,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 16), buildInfoSectionView( - title: "Sender Information".tr(), + title: "Sender Information".tr, locationController: controller.senderLocationController.value, nameController: controller.senderNameController.value, mobileController: controller.senderMobileController.value, @@ -134,7 +134,7 @@ class BookParcelScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service is unavailable at the selected address." - .tr(), + .tr, ); } } @@ -162,7 +162,7 @@ class BookParcelScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service is unavailable at the selected address." - .tr(), + .tr, ); } // ✅ <-- Add this @@ -173,7 +173,7 @@ class BookParcelScreen extends StatelessWidget { ), const SizedBox(height: 16), buildInfoSectionView( - title: "Receiver Information".tr(), + title: "Receiver Information".tr, locationController: controller.receiverLocationController.value, nameController: controller.receiverNameController.value, @@ -209,7 +209,7 @@ class BookParcelScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service is unavailable at the selected address." - .tr(), + .tr, ); } } @@ -237,7 +237,7 @@ class BookParcelScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service is unavailable at the selected address." - .tr(), + .tr, ); } } @@ -249,7 +249,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 15), RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, onPress: () { controller.bookNow(); }, @@ -283,7 +283,7 @@ class BookParcelScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Select delivery type".tr(), + "Select delivery type".tr, style: AppThemeData.boldTextStyle( color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13, @@ -305,7 +305,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(width: 20), Expanded( child: Text( - "As soon as possible".tr(), + "As soon as possible".tr, style: AppThemeData.semiBoldTextStyle( color: isDark @@ -348,7 +348,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(width: 20), Expanded( child: Text( - "Scheduled".tr(), + "Scheduled".tr, style: AppThemeData.semiBoldTextStyle( color: isDark @@ -377,7 +377,7 @@ class BookParcelScreen extends StatelessWidget { GestureDetector( onTap: () => controller.pickScheduledDate(context), child: TextFieldWidget( - hintText: "When to pickup at this address".tr(), + hintText: "When to pickup at this address".tr, controller: controller.scheduledDateController.value, enable: false, backgroundColor: @@ -398,7 +398,7 @@ class BookParcelScreen extends StatelessWidget { GestureDetector( onTap: () => controller.pickScheduledTime(context), child: TextFieldWidget( - hintText: "When to pickup at this address".tr(), + hintText: "When to pickup at this address".tr, controller: controller.scheduledTimeController.value, enable: false, // onchange: (v) => controller.pickScheduledTime(context), @@ -439,7 +439,7 @@ class BookParcelScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Upload parcel image".tr(), + "Upload parcel image".tr, style: AppThemeData.boldTextStyle( color: isDark ? AppThemeData.greyDark500 : AppThemeData.grey500, fontSize: 13, @@ -469,7 +469,7 @@ class BookParcelScreen extends StatelessWidget { ), const SizedBox(height: 10), Text( - "Upload Parcel Image".tr(), + "Upload Parcel Image".tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -480,7 +480,7 @@ class BookParcelScreen extends StatelessWidget { ), const SizedBox(height: 4), Text( - "Supported: .jpg, .jpeg, .png".tr(), + "Supported: .jpg, .jpeg, .png".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 12, color: @@ -490,7 +490,7 @@ class BookParcelScreen extends StatelessWidget { ), ), Text( - "Max size 1MB".tr(), + "Max size 1MB".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 12, color: @@ -501,7 +501,7 @@ class BookParcelScreen extends StatelessWidget { ), const SizedBox(height: 8), RoundedButtonFill( - title: "Browse Image".tr(), + title: "Browse Image".tr, onPress: () { controller.onCameraClick(Get.context!); }, @@ -597,7 +597,7 @@ class BookParcelScreen extends StatelessWidget { GestureDetector( onTap: onTap, child: TextFieldWidget( - hintText: "Your Location".tr(), + hintText: "Your Location".tr, controller: locationController, suffix: const Padding( @@ -614,7 +614,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( - hintText: "Name".tr(), + hintText: "Name".tr, controller: nameController, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, @@ -624,7 +624,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( - hintText: "Enter Mobile number".tr(), + hintText: "Enter Mobile number".tr, controller: mobileController, textInputType: TextInputType.number, inputFormatters: [ @@ -686,7 +686,7 @@ class BookParcelScreen extends StatelessWidget { clearOption: false, enableSearch: false, textFieldDecoration: InputDecoration( - hintText: "Select parcel Weight".tr(), + hintText: "Select parcel Weight".tr, hintStyle: AppThemeData.regularTextStyle( fontSize: 14, color: @@ -715,9 +715,9 @@ class BookParcelScreen extends StatelessWidget { dropDownList: controller.parcelWeight.map((e) { return DropDownValueModel( - name: e.title ?? 'Normal'.tr(), + name: e.title ?? 'Normal'.tr, value: - e.title ?? 'Normal'.tr(), // safer to use title string + e.title ?? 'Normal'.tr, // safer to use title string ); }).toList(), onChanged: (val) { @@ -734,7 +734,7 @@ class BookParcelScreen extends StatelessWidget { const SizedBox(height: 10), TextFieldWidget( - hintText: "Notes (Optional)".tr(), + hintText: "Notes (Optional)".tr, controller: noteController, backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface, diff --git a/lib/screen_ui/parcel_service/home_parcel_screen.dart b/lib/screen_ui/parcel_service/home_parcel_screen.dart index b9ad4e1..151cf78 100644 --- a/lib/screen_ui/parcel_service/home_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/home_parcel_screen.dart @@ -1,9 +1,8 @@ import 'package:customer/constant/constant.dart'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/home_parcel_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/banner_model.dart'; @@ -73,7 +72,7 @@ class HomeParcelScreen extends StatelessWidget { Get.offAll(const LoginScreen()); }, child: Text( - "Login".tr(), + "Login".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey900, @@ -100,7 +99,7 @@ class HomeParcelScreen extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); ShippingAddress shippingAddress = @@ -222,7 +221,7 @@ class HomeParcelScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "What are you sending?".tr(), + "What are you sending?".tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: diff --git a/lib/screen_ui/parcel_service/my_booking_screen.dart b/lib/screen_ui/parcel_service/my_booking_screen.dart index 25c4509..f5348c3 100644 --- a/lib/screen_ui/parcel_service/my_booking_screen.dart +++ b/lib/screen_ui/parcel_service/my_booking_screen.dart @@ -1,9 +1,10 @@ import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/screen_ui/parcel_service/parcel_order_details.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/parcel_my_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -36,7 +37,7 @@ class MyBookingScreen extends StatelessWidget { children: [ const SizedBox(width: 10), Text( - "Parcel History".tr(), + "Parcel History".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -75,7 +76,7 @@ class MyBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Please Log In to Continue".tr(), + "Please Log In to Continue".tr, style: TextStyle( color: isDark @@ -88,7 +89,7 @@ class MyBookingScreen extends StatelessWidget { const SizedBox(height: 5), Text( "You’re not logged in. Please sign in to access your account and explore all features." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -101,7 +102,7 @@ class MyBookingScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr(), + title: "Log in".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -121,7 +122,7 @@ class MyBookingScreen extends StatelessWidget { if (orders.isEmpty) { return Center( child: Text( - "No orders found".tr(), + "No orders found".tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -169,7 +170,7 @@ class MyBookingScreen extends StatelessWidget { bottom: 8.0, ), child: Text( - "${'Order Date:'.tr()}${order.isSchedule == true ? controller.formatDate(order.createdAt!) : controller.formatDate(order.senderPickupDateTime!)}", + "${'Order Date:'.tr}${order.isSchedule == true ? controller.formatDate(order.createdAt!) : controller.formatDate(order.senderPickupDateTime!)}", style: AppThemeData.mediumTextStyle( fontSize: 14, color: AppThemeData.info400, @@ -230,7 +231,7 @@ class MyBookingScreen extends StatelessWidget { children: [ _infoSection( "Pickup Address (Sender):" - .tr(), + .tr, order.sender?.name ?? '', order.sender?.address ?? '', order.sender?.phone ?? '', @@ -243,7 +244,7 @@ class MyBookingScreen extends StatelessWidget { const SizedBox(height: 16), _infoSection( "Delivery Address (Receiver):" - .tr(), + .tr, order.receiver?.name ?? '', order.receiver?.address ?? '', diff --git a/lib/screen_ui/parcel_service/order_successfully_placed.dart b/lib/screen_ui/parcel_service/order_successfully_placed.dart index cbccb86..12a0a2a 100644 --- a/lib/screen_ui/parcel_service/order_successfully_placed.dart +++ b/lib/screen_ui/parcel_service/order_successfully_placed.dart @@ -1,7 +1,8 @@ import 'package:customer/screen_ui/parcel_service/parcel_dashboard_screen.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import '../../controllers/parcel_dashboard_controller.dart'; @@ -31,7 +32,7 @@ class OrderSuccessfullyPlaced extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Text( - "Your Order Has Been Placed!".tr(), + "Your Order Has Been Placed!".tr, style: AppThemeData.boldTextStyle( fontSize: 22, color: @@ -47,7 +48,7 @@ class OrderSuccessfullyPlaced extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 50), child: Text( "We’ve received your parcel booking and it’s now being processed. You can track its status in real time." - .tr(), + .tr, style: AppThemeData.mediumTextStyle( fontSize: 16, color: @@ -60,7 +61,7 @@ class OrderSuccessfullyPlaced extends StatelessWidget { ), const SizedBox(height: 30), RoundedButtonFill( - title: "Track Your Order".tr(), + title: "Track Your Order".tr, onPress: () { print("Tracking Order: $parcelOrder"); //Get.to(() => TrackOrderScreen(), arguments: {'order': parcelOrder}); diff --git a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart index 5393cc6..f5f6fcb 100644 --- a/lib/screen_ui/parcel_service/parcel_coupon_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_coupon_screen.dart @@ -6,9 +6,9 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class ParcelCouponScreen extends StatelessWidget { const ParcelCouponScreen({super.key}); @@ -51,7 +51,7 @@ class ParcelCouponScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Coupon".tr(), + "Coupon".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -65,7 +65,7 @@ class ParcelCouponScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.cabCouponList.isEmpty - ? Constant.showEmptyView(message: "Coupon not found".tr()) + ? Constant.showEmptyView(message: "Coupon not found".tr) : ListView.builder( shrinkWrap: true, itemCount: controller.cabCouponList.length, @@ -108,7 +108,7 @@ class ParcelCouponScreen extends StatelessWidget { child: RotatedBox( quarterTurns: -1, child: Text( - "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", + "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -179,7 +179,7 @@ class ParcelCouponScreen extends StatelessWidget { Get.back(result: couponModel); }, child: Text( - "Tap To Apply".tr(), + "Tap To Apply".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, diff --git a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart index 2fe7a4a..2166de8 100644 --- a/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_dashboard_screen.dart @@ -2,10 +2,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/parcel_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class ParcelDashboardScreen extends StatelessWidget { const ParcelDashboardScreen({super.key}); @@ -53,21 +53,21 @@ class ParcelDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", - label: 'My Bookings'.tr(), + label: 'My Bookings'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_profile_parcel.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ] @@ -76,28 +76,28 @@ class ParcelDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_parcel.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_mybooking_parcel.svg", - label: 'My Bookings'.tr(), + label: 'My Bookings'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_wallet_parcel.svg", - label: 'Wallet'.tr(), + label: 'Wallet'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile_parcel.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ], @@ -120,8 +120,8 @@ class ParcelDashboardScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 5), child: SvgPicture.asset( assetIcon, - height: label == 'Wallet'.tr() ? 18 : 22, - width: label == 'Wallet'.tr() ? 18 : 22, + height: label == 'Wallet'.tr ? 18 : 22, + width: label == 'Wallet'.tr ? 18 : 22, color: controller.selectedIndex.value == index ? isDark diff --git a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart index 1d76a34..82da970 100644 --- a/lib/screen_ui/parcel_service/parcel_order_confirmation.dart +++ b/lib/screen_ui/parcel_service/parcel_order_confirmation.dart @@ -1,10 +1,10 @@ import 'package:customer/models/coupon_model.dart'; import 'package:customer/screen_ui/parcel_service/parcel_coupon_screen.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/parcel_order_confirmation_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -56,7 +56,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Order Confirmation".tr(), + "Order Confirmation".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -134,7 +134,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ _infoSection( - "Pickup Address (Sender):".tr(), + "Pickup Address (Sender):".tr, controller .parcelOrder .value @@ -160,7 +160,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), const SizedBox(height: 16), _infoSection( - "Delivery Address (Receiver):".tr(), + "Delivery Address (Receiver):".tr, controller .parcelOrder .value @@ -211,15 +211,15 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _iconTile( - "${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr()}", - "Distance".tr(), + "${controller.parcelOrder.value.distance ?? '--'} ${'KM'.tr}", + "Distance".tr, "assets/icons/ic_distance_parcel.svg", isDark, ), _iconTile( controller.parcelOrder.value.parcelWeight ?? '--', - "Weight".tr(), + "Weight".tr, "assets/icons/ic_weight_parcel.svg", isDark, ), @@ -227,7 +227,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { Constant.amountShow( amount: controller.parcelOrder.value.subTotal, ), - "Rate".tr(), + "Rate".tr, "assets/icons/ic_rate_parcel.svg", isDark, ), @@ -241,7 +241,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Coupons".tr(), + "Coupons".tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -270,14 +270,14 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "This offer not eligible for this booking" - .tr(), + .tr, ); } } }); }, child: Text( - "View All".tr(), + "View All".tr, style: AppThemeData.boldTextStyle( decoration: TextDecoration.underline, fontSize: 14, @@ -328,7 +328,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { fontSize: 16, ), decoration: InputDecoration( - hintText: "Write coupon code".tr(), + hintText: "Write coupon code".tr, hintStyle: AppThemeData.mediumTextStyle( fontSize: 16, color: AppThemeData.parcelService500, @@ -338,7 +338,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Redeem now".tr(), + title: "Redeem now".tr, onPress: () { if (controller.couponList .where( @@ -381,18 +381,18 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "This offer not eligible for this booking" - .tr(), + .tr, ); } } else { ShowToastDialog.showToast( "This coupon code has been expired" - .tr(), + .tr, ); } } else { ShowToastDialog.showToast( - "Invalid coupon code".tr(), + "Invalid coupon code".tr, ); } }, @@ -427,7 +427,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Summary".tr(), + "Order Summary".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey500, @@ -437,7 +437,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Subtotal _summaryTile( - "Subtotal".tr(), + "Subtotal".tr, Constant.amountShow( amount: controller.subTotal.value.toString(), ), @@ -447,7 +447,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Discount _summaryTile( - "Discount".tr(), + "Discount".tr, "-${Constant.amountShow(amount: controller.discount.value.toString())}", isDark, AppThemeData.dangerDark300, @@ -481,7 +481,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { // Total _summaryTile( - "Order Total".tr(), + "Order Total".tr, Constant.amountShow( amount: controller.totalAmount.value.toString(), @@ -513,7 +513,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { children: [ // Title Text( - "Payment by".tr(), + "Payment by".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -550,7 +550,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), const SizedBox(width: 6), Text( - "Sender".tr(), + "Sender".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -589,7 +589,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), const SizedBox(width: 6), Text( - "Receiver".tr(), + "Receiver".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -613,8 +613,8 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { RoundedButtonFill( title: controller.paymentBy.value == "Sender" - ? "Select Payment Method".tr() - : "Continue".tr(), + ? "Select Payment Method".tr + : "Continue".tr, onPress: () async { if (controller.paymentBy.value == "Sender") { Get.bottomSheet( @@ -768,7 +768,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "Select Payment Method".tr(), + "Select Payment Method".tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -791,7 +791,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { controller: scrollController, children: [ Text( - "Preferred Payment".tr(), + "Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -860,7 +860,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { true) const SizedBox(height: 10), Text( - "Other Payment Options".tr(), + "Other Payment Options".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -1006,7 +1006,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, color: AppThemeData.taxiBooking300, textColor: AppThemeData.grey900, onPress: () async { @@ -1061,7 +1061,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { 0.0; if (walletBalance < amountToPay) { ShowToastDialog.showToast( - "Insufficient wallet balance".tr(), + "Insufficient wallet balance".tr, ); return; } @@ -1101,8 +1101,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { if (value == null) { Get.back(); ShowToastDialog.showToast( - "Something went wrong, please contact admin." - .tr(), + "Something went wrong, please contact admin.".tr, ); } else { CreateRazorPayOrderModel result = value; @@ -1114,7 +1113,7 @@ class ParcelOrderConfirmationScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - "Please select payment method".tr(), + "Please select payment method".tr, ); } }, diff --git a/lib/screen_ui/parcel_service/parcel_order_details.dart b/lib/screen_ui/parcel_service/parcel_order_details.dart index 9a801bd..398c4b1 100644 --- a/lib/screen_ui/parcel_service/parcel_order_details.dart +++ b/lib/screen_ui/parcel_service/parcel_order_details.dart @@ -1,9 +1,9 @@ import 'package:customer/screen_ui/parcel_service/parcel_review_screen.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/parcel_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -62,7 +62,7 @@ class ParcelOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Details".tr(), + "Order Details".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -70,7 +70,7 @@ class ParcelOrderDetails extends StatelessWidget { ), Text( "Your parcel is on the way. Track it in real time below." - .tr(), + .tr, maxLines: 1, overflow: TextOverflow.ellipsis, style: AppThemeData.mediumTextStyle( @@ -110,8 +110,8 @@ class ParcelOrderDetails extends StatelessWidget { width: double.infinity, padding: const EdgeInsets.all(16), child: Text( - "${'Order Id:'.tr()} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}" - .tr(), + "${'Order Id:'.tr} ${Constant.orderId(orderId: controller.parcelOrder.value.id.toString())}" + .tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -187,7 +187,7 @@ class ParcelOrderDetails extends StatelessWidget { CrossAxisAlignment.start, children: [ _infoSection( - "Pickup Address (Sender):".tr(), + "Pickup Address (Sender):".tr, controller .parcelOrder .value @@ -213,7 +213,7 @@ class ParcelOrderDetails extends StatelessWidget { ), const SizedBox(height: 16), _infoSection( - "Delivery Address (Receiver):".tr(), + "Delivery Address (Receiver):".tr, controller .parcelOrder .value @@ -250,7 +250,7 @@ class ParcelOrderDetails extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( - "${'Schedule Pickup time:'.tr()} ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", + "${'Schedule Pickup time:'.tr} ${controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", style: AppThemeData.mediumTextStyle( fontSize: 14, color: AppThemeData.info400, @@ -261,7 +261,7 @@ class ParcelOrderDetails extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( - "${'Order Date:'.tr()}${controller.parcelOrder.value.isSchedule == true ? controller.formatDate(controller.parcelOrder.value.createdAt!) : controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", + "${'Order Date:'.tr}${controller.parcelOrder.value.isSchedule == true ? controller.formatDate(controller.parcelOrder.value.createdAt!) : controller.formatDate(controller.parcelOrder.value.senderPickupDateTime!)}", style: AppThemeData.mediumTextStyle( fontSize: 14, color: AppThemeData.info400, @@ -274,7 +274,7 @@ class ParcelOrderDetails extends StatelessWidget { MainAxisAlignment.spaceBetween, children: [ Text( - "Parcel Type:".tr(), + "Parcel Type:".tr, style: AppThemeData.semiBoldTextStyle( fontSize: 16, color: @@ -381,14 +381,14 @@ class ParcelOrderDetails extends StatelessWidget { children: [ _iconTile( "${controller.parcelOrder.value.distance ?? '--'} ${Constant.distanceType}", - "Distance".tr(), + "Distance".tr, "assets/icons/ic_distance_parcel.svg", isDark, ), _iconTile( controller.parcelOrder.value.parcelWeight ?? '--', - "Weight".tr(), + "Weight".tr, "assets/icons/ic_weight_parcel.svg", isDark, ), @@ -396,7 +396,7 @@ class ParcelOrderDetails extends StatelessWidget { Constant.amountShow( amount: controller.parcelOrder.value.subTotal, ), - "Rate".tr(), + "Rate".tr, "assets/icons/ic_rate_parcel.svg", isDark, ), @@ -426,7 +426,7 @@ class ParcelOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "About Driver".tr(), + "About Driver".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -524,8 +524,8 @@ class ParcelOrderDetails extends StatelessWidget { .value .id! .isNotEmpty - ? 'Update Review'.tr() - : 'Add Review'.tr(), + ? 'Update Review'.tr + : 'Add Review'.tr, onPress: () async { final result = await Get.to( () => ParcelReviewScreen(), @@ -604,7 +604,7 @@ class ParcelOrderDetails extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); UserModel? customer = @@ -709,7 +709,7 @@ class ParcelOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Summary".tr(), + "Order Summary".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey500, @@ -719,7 +719,7 @@ class ParcelOrderDetails extends StatelessWidget { // Subtotal _summaryTile( - "Subtotal".tr(), + "Subtotal".tr, Constant.amountShow( amount: controller.subTotal.value.toString(), ), @@ -728,7 +728,7 @@ class ParcelOrderDetails extends StatelessWidget { // Discount _summaryTile( - "Discount".tr(), + "Discount".tr, Constant.amountShow( amount: controller.discount.value.toString(), ), @@ -778,7 +778,7 @@ class ParcelOrderDetails extends StatelessWidget { // Total _summaryTile( - "Order Total".tr(), + "Order Total".tr, Constant.amountShow( amount: controller.totalAmount.value.toString(), @@ -796,7 +796,7 @@ class ParcelOrderDetails extends StatelessWidget { ? Padding( padding: const EdgeInsets.all(16.0), child: RoundedButtonFill( - title: "Cancel Parcel".tr(), + title: "Cancel Parcel".tr, onPress: () { controller.cancelParcelOrder(); }, @@ -838,7 +838,7 @@ class ParcelOrderDetails extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Parcel Status Timeline".tr(), + "Parcel Status Timeline".tr, style: AppThemeData.semiBoldTextStyle( color: isDark @@ -859,7 +859,7 @@ class ParcelOrderDetails extends StatelessWidget { height: 80, child: Center( child: Text( - "No status updates yet".tr(), + "No status updates yet".tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -1011,7 +1011,7 @@ class ParcelOrderDetails extends StatelessWidget { Text( value, style: AppThemeData.semiBoldTextStyle( - fontSize: title == "Order Total".tr() ? 18 : 16, + fontSize: title == "Order Total".tr ? 18 : 16, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, ), ), diff --git a/lib/screen_ui/parcel_service/parcel_review_screen.dart b/lib/screen_ui/parcel_service/parcel_review_screen.dart index 8a829c4..62a4bae 100644 --- a/lib/screen_ui/parcel_service/parcel_review_screen.dart +++ b/lib/screen_ui/parcel_service/parcel_review_screen.dart @@ -1,8 +1,8 @@ import 'package:customer/controllers/parcel_review_controller.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -36,8 +36,8 @@ class ParcelReviewScreen extends StatelessWidget { title: Text( controller.ratingModel.value != null && controller.ratingModel.value!.id!.isNotEmpty - ? "Update Review".tr() - : "Add Review".tr(), + ? "Update Review".tr + : "Add Review".tr, style: TextStyle( color: isDark ? Colors.white : Colors.black, fontSize: 16, @@ -104,7 +104,7 @@ class ParcelReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 16), child: Text( - 'How is your trip?'.tr(), + 'How is your trip?'.tr, style: TextStyle( fontSize: 18, color: @@ -120,7 +120,7 @@ class ParcelReviewScreen extends StatelessWidget { padding: const EdgeInsets.only(top: 8), child: Text( 'Your feedback will help us improve \n driving experience better' - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -138,7 +138,7 @@ class ParcelReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 20), child: Text( - 'Rate for'.tr(), + 'Rate for'.tr, style: TextStyle( fontSize: 16, color: @@ -197,7 +197,7 @@ class ParcelReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.all(20.0), child: TextFieldWidget( - hintText: "Type comment....".tr(), + hintText: "Type comment....".tr, controller: controller.comment.value, maxLine: 5, ), @@ -210,8 +210,8 @@ class ParcelReviewScreen extends StatelessWidget { title: controller.ratingModel.value != null - ? "Update Review".tr() - : "Add Review".tr(), + ? "Update Review".tr + : "Add Review".tr, color: AppThemeData.primary300, textColor: isDark diff --git a/lib/screen_ui/rental_service/my_rental_booking_screen.dart b/lib/screen_ui/rental_service/my_rental_booking_screen.dart index 11c5f77..321b8ad 100644 --- a/lib/screen_ui/rental_service/my_rental_booking_screen.dart +++ b/lib/screen_ui/rental_service/my_rental_booking_screen.dart @@ -4,9 +4,10 @@ import 'package:customer/screen_ui/auth_screens/login_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/wallet_screen/wallet_screen.dart'; import 'package:customer/screen_ui/rental_service/rental_order_details_screen.dart'; import 'package:customer/themes/round_button_fill.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/my_rental_booking_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -38,7 +39,7 @@ class MyRentalBookingScreen extends StatelessWidget { children: [ const SizedBox(width: 10), Text( - "Rental History".tr(), + "Rental History".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -75,7 +76,7 @@ class MyRentalBookingScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Please Log In to Continue".tr(), + "Please Log In to Continue".tr, style: TextStyle( color: isDark @@ -88,7 +89,7 @@ class MyRentalBookingScreen extends StatelessWidget { const SizedBox(height: 5), Text( "You’re not logged in. Please sign in to access your account and explore all features." - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -101,7 +102,7 @@ class MyRentalBookingScreen extends StatelessWidget { ), const SizedBox(height: 20), RoundedButtonFill( - title: "Log in".tr(), + title: "Log in".tr, width: 55, height: 5.5, color: AppThemeData.primary300, @@ -122,7 +123,7 @@ class MyRentalBookingScreen extends StatelessWidget { if (orders.isEmpty) { return Center( child: Text( - "No orders found".tr(), + "No orders found".tr, style: AppThemeData.mediumTextStyle( color: isDark @@ -272,7 +273,7 @@ class MyRentalBookingScreen extends StatelessWidget { ), const SizedBox(height: 12), Text( - "Vehicle Type :".tr(), + "Vehicle Type :".tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -387,7 +388,7 @@ class MyRentalBookingScreen extends StatelessWidget { ), ), Text( - "Package info :".tr(), + "Package info :".tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -471,7 +472,7 @@ class MyRentalBookingScreen extends StatelessWidget { .isEnableOTPTripStartForRental == true) Text( - "${'OTP :'.tr()} ${order.otpCode}", + "${'OTP :'.tr} ${order.otpCode}", style: AppThemeData.boldTextStyle( fontSize: 16, color: diff --git a/lib/screen_ui/rental_service/rental_conformation_screen.dart b/lib/screen_ui/rental_service/rental_conformation_screen.dart index 92ac2a1..03832eb 100644 --- a/lib/screen_ui/rental_service/rental_conformation_screen.dart +++ b/lib/screen_ui/rental_service/rental_conformation_screen.dart @@ -4,10 +4,10 @@ import 'package:customer/screen_ui/rental_service/rental_coupon_screen.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/rental_conformation_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../themes/app_them_data.dart'; @@ -56,7 +56,7 @@ class RentalConformationScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Confirm Rent a Car".tr(), + "Confirm Rent a Car".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -156,7 +156,7 @@ class RentalConformationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Your Preference".tr(), + "Your Preference".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -256,7 +256,7 @@ class RentalConformationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Vehicle Type".tr(), + "Vehicle Type".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -330,7 +330,7 @@ class RentalConformationScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Coupons".tr(), + "Coupons".tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -359,14 +359,14 @@ class RentalConformationScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "This offer not eligible for this booking" - .tr(), + .tr, ); } } }); }, child: Text( - "View All".tr(), + "View All".tr, style: AppThemeData.boldTextStyle( decoration: TextDecoration.underline, fontSize: 14, @@ -416,7 +416,7 @@ class RentalConformationScreen extends StatelessWidget { color: AppThemeData.grey900, ), decoration: InputDecoration( - hintText: "Write coupon code".tr(), + hintText: "Write coupon code".tr, hintStyle: AppThemeData.mediumTextStyle( fontSize: 16, color: AppThemeData.parcelService500, @@ -426,7 +426,7 @@ class RentalConformationScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Redeem now".tr(), + title: "Redeem now".tr, onPress: () { if (controller.couponList .where( @@ -470,18 +470,18 @@ class RentalConformationScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "This offer not eligible for this booking" - .tr(), + .tr, ); } } else { ShowToastDialog.showToast( "This coupon code has been expired" - .tr(), + .tr, ); } } else { ShowToastDialog.showToast( - "Invalid coupon code".tr(), + "Invalid coupon code".tr, ); } }, @@ -516,7 +516,7 @@ class RentalConformationScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Order Summary".tr(), + "Order Summary".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey500, @@ -526,7 +526,7 @@ class RentalConformationScreen extends StatelessWidget { // Subtotal _summaryTile( - "Subtotal".tr(), + "Subtotal".tr, Constant.amountShow( amount: controller.subTotal.value.toString(), @@ -537,7 +537,7 @@ class RentalConformationScreen extends StatelessWidget { // Discount _summaryTile( - "Discount".tr(), + "Discount".tr, Constant.amountShow( amount: controller.discount.value.toString(), @@ -590,7 +590,7 @@ class RentalConformationScreen extends StatelessWidget { // Total _summaryTile( - "Order Total".tr(), + "Order Total".tr, Constant.amountShow( amount: controller.totalAmount.value.toString(), @@ -603,7 +603,7 @@ class RentalConformationScreen extends StatelessWidget { ), SizedBox(height: 20), RoundedButtonFill( - title: "Book now".tr(), + title: "Book now".tr, onPress: () { controller.placeOrder(); }, diff --git a/lib/screen_ui/rental_service/rental_coupon_screen.dart b/lib/screen_ui/rental_service/rental_coupon_screen.dart index c1e2c6b..dbd31ce 100644 --- a/lib/screen_ui/rental_service/rental_coupon_screen.dart +++ b/lib/screen_ui/rental_service/rental_coupon_screen.dart @@ -6,9 +6,9 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/widget/my_separator.dart'; import 'package:dotted_border/dotted_border.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; class RentalCouponScreen extends StatelessWidget { const RentalCouponScreen({super.key}); @@ -51,7 +51,7 @@ class RentalCouponScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Coupon".tr(), + "Coupon".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -65,7 +65,7 @@ class RentalCouponScreen extends StatelessWidget { controller.isLoading.value ? Constant.loader() : controller.cabCouponList.isEmpty - ? Constant.showEmptyView(message: "Coupon not found".tr()) + ? Constant.showEmptyView(message: "Coupon not found".tr) : ListView.builder( shrinkWrap: true, itemCount: controller.cabCouponList.length, @@ -108,7 +108,7 @@ class RentalCouponScreen extends StatelessWidget { child: RotatedBox( quarterTurns: -1, child: Text( - "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr()}", + "${couponModel.discountType == "Fix Price" ? Constant.amountShow(amount: couponModel.discount) : "${couponModel.discount}%"} ${'Off'.tr}", textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.semiBold, @@ -179,7 +179,7 @@ class RentalCouponScreen extends StatelessWidget { Get.back(result: couponModel); }, child: Text( - "Tap To Apply".tr(), + "Tap To Apply".tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: AppThemeData.medium, diff --git a/lib/screen_ui/rental_service/rental_dashboard_screen.dart b/lib/screen_ui/rental_service/rental_dashboard_screen.dart index 549f827..4d7d14a 100644 --- a/lib/screen_ui/rental_service/rental_dashboard_screen.dart +++ b/lib/screen_ui/rental_service/rental_dashboard_screen.dart @@ -2,10 +2,10 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/cab_dashboard_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/app_them_data.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/cab_rental_dashboard_controllers.dart'; class RentalDashboardScreen extends StatelessWidget { @@ -52,21 +52,21 @@ class RentalDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", - label: 'My Bookings'.tr(), + label: 'My Bookings'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ] @@ -75,28 +75,28 @@ class RentalDashboardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home_cab.svg", - label: 'Home'.tr(), + label: 'Home'.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_booking_cab.svg", - label: 'My Bookings'.tr(), + label: 'My Bookings'.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_wallet_cab.svg", - label: 'Wallet'.tr(), + label: 'Wallet'.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr(), + label: 'Profile'.tr, controller: controller, ), ], diff --git a/lib/screen_ui/rental_service/rental_home_screen.dart b/lib/screen_ui/rental_service/rental_home_screen.dart index 0ba3a0d..9da2218 100644 --- a/lib/screen_ui/rental_service/rental_home_screen.dart +++ b/lib/screen_ui/rental_service/rental_home_screen.dart @@ -1,8 +1,9 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:customer/constant/constant.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:customer/utils/app_router.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/rental_home_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/rental_vehicle_type.dart'; @@ -71,7 +72,7 @@ class RentalHomeScreen extends StatelessWidget { Get.offAll(const LoginScreen()); }, child: Text( - "Login".tr(), + "Login".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey900, @@ -131,7 +132,7 @@ class RentalHomeScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service is unavailable at the selected address." - .tr(), + .tr, ); } } @@ -167,7 +168,7 @@ class RentalHomeScreen extends StatelessWidget { } else { ShowToastDialog.showToast( "Service is unavailable at the selected address." - .tr(), + .tr, ); } } @@ -178,8 +179,8 @@ class RentalHomeScreen extends StatelessWidget { child: TextFieldWidget( controller: controller.sourceTextEditController.value, - hintText: "Your current location".tr(), - title: "Pickup Location".tr(), + hintText: "Your current location".tr, + title: "Pickup Location".tr, enable: false, prefix: Padding( padding: EdgeInsets.only(left: 10, right: 10), @@ -196,7 +197,7 @@ class RentalHomeScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - "Select Your Vehicle Type".tr(), + "Select Your Vehicle Type".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: @@ -407,20 +408,20 @@ class RentalHomeScreen extends StatelessWidget { ), const SizedBox(height: 25), RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, onPress: () async { final sourceText = controller.sourceTextEditController.value.text .trim(); if (Constant.userModel == null) { ShowToastDialog.showToast( - "Please login to continue".tr(), + "Please login to continue".tr, ); return; } if (sourceText.isEmpty) { ShowToastDialog.showToast( - "Please select source location".tr(), + "Please select source location".tr, ); return; } @@ -428,7 +429,7 @@ class RentalHomeScreen extends StatelessWidget { if (controller.selectedVehicleType.value == null) { ShowToastDialog.showToast( - "Please select a vehicle type".tr(), + "Please select a vehicle type".tr, ); return; } @@ -438,7 +439,7 @@ class RentalHomeScreen extends StatelessWidget { if (controller.rentalPackages.isEmpty) { ShowToastDialog.showToast( "No preference available for the selected vehicle type" - .tr(), + .tr, ); return; } @@ -502,7 +503,7 @@ class RentalHomeScreen extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Text( - "Select Preferences".tr(), + "Select Preferences".tr, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18, @@ -627,7 +628,7 @@ class RentalHomeScreen extends StatelessWidget { const SizedBox(height: 10), RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, onPress: () { Get.bottomSheet( paymentBottomSheet(context, controller, isDark), @@ -675,7 +676,7 @@ class RentalHomeScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "Select Payment Method".tr(), + "Select Payment Method".tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -699,7 +700,7 @@ class RentalHomeScreen extends StatelessWidget { controller: scrollController, children: [ Text( - "Preferred Payment".tr(), + "Preferred Payment".tr, style: AppThemeData.boldTextStyle( fontSize: 15, color: @@ -772,7 +773,7 @@ class RentalHomeScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - "Other Payment Options".tr(), + "Other Payment Options".tr, style: AppThemeData.boldTextStyle( fontSize: 15, color: @@ -923,13 +924,13 @@ class RentalHomeScreen extends StatelessWidget { // Continue button RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { ShowToastDialog.showToast( - "Please select a payment method".tr(), + "Please select a payment method".tr, ); return; } @@ -948,7 +949,7 @@ class RentalHomeScreen extends StatelessWidget { if (walletAmount < baseFare) { ShowToastDialog.showToast( - "You do not have sufficient wallet balance".tr(), + "You do not have sufficient wallet balance".tr, ); return; } diff --git a/lib/screen_ui/rental_service/rental_order_details_screen.dart b/lib/screen_ui/rental_service/rental_order_details_screen.dart index a6c0821..74edf80 100644 --- a/lib/screen_ui/rental_service/rental_order_details_screen.dart +++ b/lib/screen_ui/rental_service/rental_order_details_screen.dart @@ -7,11 +7,11 @@ import 'package:customer/screen_ui/rental_service/rental_review_screen.dart'; import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/utils/network_image_widget.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/rental_order_details_controller.dart'; import '../../controllers/theme_controller.dart'; import '../../models/user_model.dart'; @@ -64,7 +64,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), const SizedBox(width: 10), Text( - "Order Details".tr(), + "Order Details".tr, style: AppThemeData.boldTextStyle( fontSize: 18, color: AppThemeData.grey900, @@ -110,7 +110,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - "${'Booking Id :'.tr()} ${controller.order.value.id}", + "${'Booking Id :'.tr} ${controller.order.value.id}", style: AppThemeData.semiBoldTextStyle( fontSize: 16, @@ -134,7 +134,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { ); ShowToastDialog.showToast( "Booking ID copied to clipboard" - .tr(), + .tr, ); }, child: Icon(Icons.copy), @@ -233,7 +233,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Your Preference".tr(), + "Your Preference".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -344,7 +344,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "About Driver".tr(), + "About Driver".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -496,8 +496,8 @@ class RentalOrderDetailsScreen extends StatelessWidget { .value .id! .isNotEmpty - ? 'Update Review'.tr() - : 'Add Review'.tr(), + ? 'Update Review'.tr + : 'Add Review'.tr, onPress: () async { final result = await Get.to( () => @@ -588,7 +588,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr(), + "Please wait...".tr, ); UserModel? customer = @@ -703,7 +703,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Vehicle Type".tr(), + "Vehicle Type".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: @@ -808,7 +808,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Rental Details".tr(), + "Rental Details".tr, style: AppThemeData.boldTextStyle( fontSize: 16, color: @@ -831,7 +831,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Rental Package'.tr(), + 'Rental Package'.tr, textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( @@ -852,7 +852,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { .rentalPackageModel! .name .toString() - .tr(), + .tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( @@ -876,7 +876,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Rental Package Price'.tr(), + 'Rental Package Price'.tr, textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( @@ -899,7 +899,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { .rentalPackageModel! .baseFare .toString(), - ).tr(), + ).tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( @@ -923,7 +923,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${'Including'.tr()} ${Constant.distanceType.tr()}', + '${'Including'.tr} ${Constant.distanceType.tr}', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( @@ -939,7 +939,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), Text( "${controller.order.value.rentalPackageModel!.includedDistance.toString()} ${Constant.distanceType}" - .tr(), + .tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( @@ -963,7 +963,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Including Hours'.tr(), + 'Including Hours'.tr, textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( @@ -978,8 +978,8 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), Text( - "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr()}" - .tr(), + "${controller.order.value.rentalPackageModel!.includedHours.toString()} ${'Hr'.tr}" + .tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( @@ -1003,7 +1003,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - '${'Extra'.tr()} ${Constant.distanceType}', + '${'Extra'.tr} ${Constant.distanceType}', textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( @@ -1065,7 +1065,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ Expanded( child: Text( - 'Extra Minutes'.tr(), + 'Extra Minutes'.tr, textAlign: TextAlign.start, style: AppThemeData.mediumTextStyle( @@ -1080,7 +1080,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), Text( - "${controller.order.value.endTime == null ? "0" : (((controller.order.value.endTime!.toDate().difference(controller.order.value.startTime!.toDate()).inMinutes) - (int.parse(controller.order.value.rentalPackageModel!.includedHours.toString()) * 60)).clamp(0, double.infinity).toInt().toString())} ${'Min'.tr()}", + "${controller.order.value.endTime == null ? "0" : (((controller.order.value.endTime!.toDate().difference(controller.order.value.startTime!.toDate()).inMinutes) - (int.parse(controller.order.value.rentalPackageModel!.includedHours.toString()) * 60)).clamp(0, double.infinity).toInt().toString())} ${'Min'.tr}", textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( @@ -1121,7 +1121,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { CrossAxisAlignment.start, children: [ Text( - "Order Summary".tr(), + "Order Summary".tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: AppThemeData.grey500, @@ -1130,7 +1130,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { const SizedBox(height: 8), _summaryTile( - "Subtotal".tr(), + "Subtotal".tr, Constant.amountShow( amount: controller.subTotal.value @@ -1140,7 +1140,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { null, ), _summaryTile( - "Discount".tr(), + "Discount".tr, Constant.amountShow( amount: controller.discount.value @@ -1189,7 +1189,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { const Divider(), _summaryTile( - "Order Total".tr(), + "Order Total".tr, Constant.amountShow( amount: controller.totalAmount.value @@ -1237,7 +1237,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { .isEmpty) { ShowToastDialog.showToast( "You are not able to pay now until driver adds kilometer" - .tr(), + .tr, ); } else { Get.bottomSheet( @@ -1338,7 +1338,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "Select Payment Method".tr(), + "Select Payment Method".tr, style: AppThemeData.mediumTextStyle( fontSize: 18, color: @@ -1362,7 +1362,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { controller: scrollController, children: [ Text( - "Preferred Payment".tr(), + "Preferred Payment".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -1434,7 +1434,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 10), Text( - "Other Payment Options".tr(), + "Other Payment Options".tr, textAlign: TextAlign.start, style: AppThemeData.boldTextStyle( fontSize: 15, @@ -1582,13 +1582,13 @@ class RentalOrderDetailsScreen extends StatelessWidget { ), ), RoundedButtonFill( - title: "Continue".tr(), + title: "Continue".tr, color: AppThemeData.primary300, textColor: AppThemeData.grey900, onPress: () async { if (controller.selectedPaymentMethod.value.isEmpty) { ShowToastDialog.showToast( - "Please select a payment method".tr(), + "Please select a payment method".tr, ); } else { if (controller.selectedPaymentMethod.value == @@ -1634,7 +1634,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { Constant.userModel!.walletAmount! < controller.totalAmount.value) { ShowToastDialog.showToast( - "You do not have sufficient wallet balance".tr(), + "You do not have sufficient wallet balance".tr, ); } else { controller.completeOrder(); @@ -1674,7 +1674,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { Get.back(); ShowToastDialog.showToast( "Something went wrong, please contact admin." - .tr(), + .tr, ); } else { CreateRazorPayOrderModel result = value; @@ -1686,7 +1686,7 @@ class RentalOrderDetailsScreen extends StatelessWidget { }); } else { ShowToastDialog.showToast( - "Please select payment method".tr(), + "Please select payment method".tr, ); } } diff --git a/lib/screen_ui/rental_service/rental_review_screen.dart b/lib/screen_ui/rental_service/rental_review_screen.dart index d5fd8fb..140776d 100644 --- a/lib/screen_ui/rental_service/rental_review_screen.dart +++ b/lib/screen_ui/rental_service/rental_review_screen.dart @@ -1,7 +1,6 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../constant/constant.dart'; import '../../controllers/rental_review_controller.dart'; import '../../controllers/theme_controller.dart'; @@ -35,8 +34,8 @@ class RentalReviewScreen extends StatelessWidget { ), title: Text( controller.ratingModel.value != null - ? "Update Review".tr() - : "Add Review".tr(), + ? "Update Review".tr + : "Add Review".tr, style: TextStyle( color: isDark ? Colors.white : Colors.black, fontSize: 16, @@ -136,7 +135,7 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 16), child: Text( - 'How is your trip?'.tr(), + 'How is your trip?'.tr, style: TextStyle( fontSize: 18, color: @@ -152,7 +151,7 @@ class RentalReviewScreen extends StatelessWidget { padding: const EdgeInsets.only(top: 8), child: Text( 'Your feedback will help us improve \n driving experience better' - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle( color: @@ -170,7 +169,7 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 20), child: Text( - 'Rate for'.tr(), + 'Rate for'.tr, style: TextStyle( fontSize: 16, color: @@ -229,7 +228,7 @@ class RentalReviewScreen extends StatelessWidget { Padding( padding: const EdgeInsets.all(20.0), child: TextFieldWidget( - hintText: "Type comment....".tr(), + hintText: "Type comment....".tr, controller: controller.comment.value, maxLine: 5, ), diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index 6b45339..ec76d86 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -1,10 +1,10 @@ import 'dart:developer'; import 'package:customer/constant/const_texts.dart'; import 'package:customer/models/section_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/service_list_controller.dart'; import '../../themes/app_them_data.dart'; import '../../utils/network_image_widget.dart'; @@ -68,7 +68,7 @@ class ServiceListScreen extends StatelessWidget { Padding( padding: EdgeInsets.symmetric(horizontal: 16.r), child: Text( - ConstTexts.otherServices.tr(), + ConstTexts.otherServices.tr, style: TextStyle( fontFamily: AppThemeData.bold, fontWeight: FontWeight.w700, @@ -82,23 +82,23 @@ class ServiceListScreen extends StatelessWidget { // Other Services Section _otherServicesCardMaker( image: "assets/images/garderob_img.png", - title: ConstTexts.updateYourWardrobe.tr(), - subtitle: ConstTexts.weDeliverSafely.tr(), + title: ConstTexts.updateYourWardrobe.tr, + subtitle: ConstTexts.weDeliverSafely.tr, ), _otherServicesCardMaker( image: "assets/images/keys_img.png", - title: ConstTexts.rent.tr(), - subtitle: ConstTexts.hugeSelectionOfAds.tr(), + title: ConstTexts.rent.tr, + subtitle: ConstTexts.hugeSelectionOfAds.tr, ), _otherServicesCardMaker( image: "assets/images/cosmetics_img.png", - title: ConstTexts.cosmetics.tr(), - subtitle: ConstTexts.moreThan1000Products.tr(), + title: ConstTexts.cosmetics.tr, + subtitle: ConstTexts.moreThan1000Products.tr, ), _otherServicesCardMaker( image: "assets/images/products_img.png", - title: ConstTexts.foodProducts.tr(), - subtitle: ConstTexts.moreThan1000Products.tr(), + title: ConstTexts.foodProducts.tr, + subtitle: ConstTexts.moreThan1000Products.tr, ), SizedBox(height: 45.h), ], @@ -209,7 +209,7 @@ class ServiceListScreen extends StatelessWidget { spacing: 12.r, children: [ _mainCardsMaker( - title: ConstTexts.foodDelivery.tr(), + title: ConstTexts.foodDelivery.tr, image: "assets/images/food_img.png", // onTap: () { // log("Main Card Tapped"); @@ -227,7 +227,7 @@ class ServiceListScreen extends StatelessWidget { // }, ), _mainCardsMaker( - title: ConstTexts.delivery.tr(), + title: ConstTexts.delivery.tr, image: "assets/images/delivery_img.png", onTap: () { log("Main Card Tapped"); @@ -276,7 +276,7 @@ class ServiceListScreen extends StatelessWidget { Expanded( child: Text( maxLines: 2, - ConstTexts.bookingTaxi.tr(), + ConstTexts.bookingTaxi.tr, style: TextStyle( overflow: TextOverflow.ellipsis, fontFamily: AppThemeData.bold, diff --git a/lib/screen_ui/splash_screen/splash_screen.dart b/lib/screen_ui/splash_screen/splash_screen.dart index 3e6951f..4777563 100644 --- a/lib/screen_ui/splash_screen/splash_screen.dart +++ b/lib/screen_ui/splash_screen/splash_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../../controllers/splash_controller.dart'; import '../../themes/app_them_data.dart'; diff --git a/lib/service/cart_provider.dart b/lib/service/cart_provider.dart index bc2ccdb..08f4e54 100644 --- a/lib/service/cart_provider.dart +++ b/lib/service/cart_provider.dart @@ -3,9 +3,9 @@ import 'dart:developer'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/cart_product_model.dart'; import 'package:customer/themes/custom_dialog_box.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'database_helper.dart'; class CartProvider with ChangeNotifier { @@ -56,12 +56,12 @@ class CartProvider with ChangeNotifier { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Alert".tr(), + title: "Alert".tr, descriptions: "Your cart already contains items from another restaurant. Would you like to replace them with items from this restaurant instead?" - .tr(), - positiveString: "Add".tr(), - negativeString: "Cancel".tr(), + .tr, + positiveString: "Add".tr, + negativeString: "Cancel".tr, positiveClick: () async { cartItem.clear(); _cartItems.clear(); diff --git a/lib/service/fire_store_utils.dart b/lib/service/fire_store_utils.dart index d5d0d23..558cb8d 100644 --- a/lib/service/fire_store_utils.dart +++ b/lib/service/fire_store_utils.dart @@ -9,12 +9,12 @@ import 'package:customer/models/rental_order_model.dart'; import 'package:customer/models/rental_package_model.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/models/zone_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:firebase_auth/firebase_auth.dart' as auth; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/cupertino.dart'; import 'package:geocoding/geocoding.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:uuid/uuid.dart'; import 'package:video_compress/video_compress.dart'; @@ -205,7 +205,7 @@ class FireStoreUtils { .set(ratingModel.toJson()); } catch (e, s) { print('FireStoreUtils.referralAdd $e $s'); - return "Couldn't review".tr(); + return "Couldn't review".tr; } return null; } @@ -2069,7 +2069,7 @@ class FireStoreUtils { File image, BuildContext context, ) async { - ShowToastDialog.showLoader("Please wait".tr()); + ShowToastDialog.showLoader("Please wait".tr); var uniqueID = const Uuid().v4(); Reference upload = FirebaseStorage.instance.ref().child( 'images/$uniqueID.png', @@ -2404,8 +2404,8 @@ class FireStoreUtils { // userId: FireStoreUtils.getCurrentUid(), // isTopup: false, // orderId: orderModel.id, - // note: "Order Amount debited".tr(), - // paymentStatus: "success".tr(), + // note: "Order Amount debited".tr, + // paymentStatus: "success".tr, // ); // // await FireStoreUtils.setWalletTransaction(transactionModel).then((value) async { @@ -2950,12 +2950,12 @@ class FireStoreUtils { String firstHTML = """ - + - + """; @@ -3000,12 +3000,12 @@ class FireStoreUtils { } String product = """ - + - + """; htmlList.add(product); diff --git a/lib/service/localization_service.dart b/lib/service/localization_service.dart index 92cfb47..cfd87c1 100644 --- a/lib/service/localization_service.dart +++ b/lib/service/localization_service.dart @@ -1,20 +1,37 @@ +import 'dart:convert'; +import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; -import '../lang/app_en.dart'; +import 'package:get/get.dart'; class LocalizationService extends Translations { - // Default locale - static const locale = Locale('en', 'US'); + static Map> _keys = {}; - static final locales = [const Locale('en')]; + static const fallbackLocale = Locale('en', 'US'); + + static const supportedLocales = [ + Locale('en', 'US'), + Locale('uz', 'UZ'), + Locale('ru', 'RU'), + ]; - // Keys and their translations - // Translations are separated maps in `lang` file @override - Map> get keys => {'en_US': enUS}; + Map> get keys => _keys; - // Gets locale from language, and updates the locale - void changeLocale(String lang) { - Get.updateLocale(Locale(lang)); + // Load JSONs before starting the app + static Future init() async { + _keys = { + "en_US": await _loadJson("assets/translations/en.json"), + "uz_UZ": await _loadJson("assets/translations/uz.json"), + "ru_RU": await _loadJson("assets/translations/ru.json"), + }; + } + + static Future> _loadJson(String path) async { + final data = await rootBundle.loadString(path); + return Map.from(json.decode(data)); + } + + static void changeLocale(Locale locale) { + Get.updateLocale(locale); } } diff --git a/lib/themes/custom_dialog_box.dart b/lib/themes/custom_dialog_box.dart index 9b3d6da..ccfffcd 100644 --- a/lib/themes/custom_dialog_box.dart +++ b/lib/themes/custom_dialog_box.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../controllers/theme_controller.dart'; import 'app_them_data.dart'; @@ -53,7 +53,7 @@ class CustomDialogBox extends StatelessWidget { const SizedBox(height: 20), if (title.isNotEmpty) Text( - title.tr(), + title.tr, style: AppThemeData.boldTextStyle( fontSize: 20, color: isDark ? AppThemeData.greyDark900 : AppThemeData.grey900, @@ -62,7 +62,7 @@ class CustomDialogBox extends StatelessWidget { const SizedBox(height: 5), if (descriptions.isNotEmpty) Text( - descriptions.tr(), + descriptions.tr, textAlign: TextAlign.center, style: AppThemeData.regularTextStyle( fontSize: 14, @@ -87,7 +87,7 @@ class CustomDialogBox extends StatelessWidget { ), child: Center( child: Text( - negativeString.tr(), + negativeString.tr, textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle( fontSize: 14, @@ -114,7 +114,7 @@ class CustomDialogBox extends StatelessWidget { ), child: Center( child: Text( - 'Confirm'.tr(), + 'Confirm'.tr, textAlign: TextAlign.center, style: AppThemeData.mediumTextStyle( fontSize: 14, diff --git a/lib/themes/easy_loading_config.dart b/lib/themes/easy_loading_config.dart index 6735481..a48db16 100644 --- a/lib/themes/easy_loading_config.dart +++ b/lib/themes/easy_loading_config.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/app_them_data.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../controllers/theme_controller.dart'; Future configEasyLoading() async { diff --git a/lib/themes/round_button_border.dart b/lib/themes/round_button_border.dart index 3b1eb2c..12d0c61 100644 --- a/lib/themes/round_button_border.dart +++ b/lib/themes/round_button_border.dart @@ -1,8 +1,8 @@ import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'app_them_data.dart'; class RoundedButtonBorder extends StatelessWidget { @@ -65,7 +65,7 @@ class RoundedButtonBorder extends StatelessWidget { ), isCenter == true ? Text( - title.tr(), + title.tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle( fontSize: fontSizes ?? 14, @@ -76,7 +76,7 @@ class RoundedButtonBorder extends StatelessWidget { child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), child: Text( - title.tr(), + title.tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle( fontSize: fontSizes ?? 14, diff --git a/lib/themes/round_button_fill.dart b/lib/themes/round_button_fill.dart index 4b50524..7ae0005 100644 --- a/lib/themes/round_button_fill.dart +++ b/lib/themes/round_button_fill.dart @@ -1,7 +1,7 @@ import 'package:customer/themes/responsive.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'app_them_data.dart'; class RoundedButtonFill extends StatelessWidget { @@ -62,7 +62,7 @@ class RoundedButtonFill extends StatelessWidget { ), isCenter == true ? Text( - title.tr(), + title.tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle( fontSize: fontSizes ?? 16, @@ -73,7 +73,7 @@ class RoundedButtonFill extends StatelessWidget { child: Padding( padding: EdgeInsets.only(right: isRight == null ? 0 : 30), child: Text( - title.tr(), + title.tr, textAlign: TextAlign.center, style: AppThemeData.semiBoldTextStyle( fontSize: fontSizes ?? 16, diff --git a/lib/themes/text_field_widget.dart b/lib/themes/text_field_widget.dart index 44c3e57..8b53c35 100644 --- a/lib/themes/text_field_widget.dart +++ b/lib/themes/text_field_widget.dart @@ -1,8 +1,7 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../controllers/theme_controller.dart'; import 'app_them_data.dart'; @@ -104,7 +103,7 @@ class _TextFieldWidgetState extends State { children: [ if (widget.title != null) ...[ Text( - widget.title!.tr(), + widget.title!.tr, style: AppThemeData.boldTextStyle( fontSize: 14, color: isDark ? AppThemeData.greyDark800 : AppThemeData.grey800, @@ -166,7 +165,7 @@ class _TextFieldWidgetState extends State { borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: borderColor), ), - hintText: widget.hintText.tr(), + hintText: widget.hintText.tr, hintStyle: AppThemeData.regularTextStyle( fontSize: 14.sp, color: hintColor, diff --git a/lib/utils/notification_service.dart b/lib/utils/notification_service.dart index 1832fcb..8b13c65 100644 --- a/lib/utils/notification_service.dart +++ b/lib/utils/notification_service.dart @@ -9,25 +9,51 @@ Future firebaseMessageBackgroundHandle(RemoteMessage message) async { } class NotificationService { - FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); Future initInfo() async { - await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(alert: true, badge: true, sound: true); - var request = await FirebaseMessaging.instance.requestPermission(alert: true, announcement: false, badge: true, carPlay: false, criticalAlert: false, provisional: false, sound: true); + await FirebaseMessaging.instance + .setForegroundNotificationPresentationOptions( + alert: true, + badge: true, + sound: true, + ); + var request = await FirebaseMessaging.instance.requestPermission( + alert: true, + announcement: false, + badge: true, + carPlay: false, + criticalAlert: false, + provisional: false, + sound: true, + ); - if (request.authorizationStatus == AuthorizationStatus.authorized || request.authorizationStatus == AuthorizationStatus.provisional) { - const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); + if (request.authorizationStatus == AuthorizationStatus.authorized || + request.authorizationStatus == AuthorizationStatus.provisional) { + const AndroidInitializationSettings initializationSettingsAndroid = + AndroidInitializationSettings('@mipmap/ic_launcher'); var iosInitializationSettings = const DarwinInitializationSettings(); - final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: iosInitializationSettings); - await flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: (payload) {}); + final InitializationSettings initializationSettings = + InitializationSettings( + android: initializationSettingsAndroid, + iOS: iosInitializationSettings, + ); + await flutterLocalNotificationsPlugin.initialize( + initializationSettings, + onDidReceiveNotificationResponse: (payload) {}, + ); setupInteractedMessage(); } } Future setupInteractedMessage() async { - RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); + RemoteMessage? initialMessage = + await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { - FirebaseMessaging.onBackgroundMessage((message) => firebaseMessageBackgroundHandle(message)); + FirebaseMessaging.onBackgroundMessage( + (message) => firebaseMessageBackgroundHandle(message), + ); } FirebaseMessaging.onMessage.listen((RemoteMessage message) { @@ -103,18 +129,38 @@ class NotificationService { log('Got a message whilst in the foreground!'); log('Message data: ${message.notification!.body.toString()}'); try { - AndroidNotificationChannel channel = const AndroidNotificationChannel('0', 'eMart customer', description: 'Show eMart Notification', importance: Importance.max); - AndroidNotificationDetails notificationDetails = AndroidNotificationDetails( - channel.id, - channel.name, - channelDescription: 'your channel Description', - importance: Importance.high, - priority: Priority.high, - ticker: 'ticker', + AndroidNotificationChannel channel = const AndroidNotificationChannel( + '0', + 'eMart customer', + description: 'Show eMart Notification', + importance: Importance.max, + ); + AndroidNotificationDetails notificationDetails = + AndroidNotificationDetails( + channel.id, + channel.name, + channelDescription: 'your channel Description', + importance: Importance.high, + priority: Priority.high, + ticker: 'ticker', + ); + const DarwinNotificationDetails darwinNotificationDetails = + DarwinNotificationDetails( + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + NotificationDetails notificationDetailsBoth = NotificationDetails( + android: notificationDetails, + iOS: darwinNotificationDetails, + ); + await FlutterLocalNotificationsPlugin().show( + 0, + message.notification!.title, + message.notification!.body, + notificationDetailsBoth, + payload: jsonEncode(message.data), ); - const DarwinNotificationDetails darwinNotificationDetails = DarwinNotificationDetails(presentAlert: true, presentBadge: true, presentSound: true); - NotificationDetails notificationDetailsBoth = NotificationDetails(android: notificationDetails, iOS: darwinNotificationDetails); - await FlutterLocalNotificationsPlugin().show(0, message.notification!.title, message.notification!.body, notificationDetailsBoth, payload: jsonEncode(message.data)); } on Exception catch (e) { log(e.toString()); } diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 8b44e86..97b5582 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -1,7 +1,8 @@ import 'package:customer/constant/constant.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; import 'package:map_launcher/map_launcher.dart'; import '../themes/show_toast_dialog.dart'; @@ -37,7 +38,9 @@ class Utils { if (permission == LocationPermission.deniedForever) { // Permissions are denied forever, handle appropriately. - return Future.error('Location permissions are permanently denied, we cannot request permissions.'); + return Future.error( + 'Location permissions are permanently denied, we cannot request permissions.', + ); } // When we reach here, permissions are granted and we can @@ -45,12 +48,16 @@ class Utils { return await Geolocator.getCurrentPosition(); } - static Future getAddressFromCoordinates(double lat, double lng) async { + static Future getAddressFromCoordinates( + double lat, + double lng, + ) async { try { List placemarks = await placemarkFromCoordinates(lat, lng); if (placemarks.isNotEmpty) { Placemark place = placemarks.first; - String address = "${place.name ?? ''}, ${place.subLocality ?? ''}, ${place.locality ?? ''}, ${place.administrativeArea ?? ''}, ${place.country ?? ''}"; + String address = + "${place.name ?? ''}, ${place.subLocality ?? ''}, ${place.locality ?? ''}, ${place.administrativeArea ?? ''}, ${place.country ?? ''}"; return address; } return "Unknown location"; @@ -59,67 +66,122 @@ class Utils { } } - static Future redirectMap({required String name, required double latitude, required double longLatitude}) async { + static Future redirectMap({ + required String name, + required double latitude, + required double longLatitude, + }) async { if (Constant.mapType == "google") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.google); if (isAvailable == true) { - await MapLauncher.showDirections(mapType: MapType.google, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); + await MapLauncher.showDirections( + mapType: MapType.google, + directionsMode: DirectionsMode.driving, + destinationTitle: name, + destination: Coords(latitude, longLatitude), + ); } else { - ShowToastDialog.showToast("Google map is not installed".tr()); + ShowToastDialog.showToast("Google map is not installed".tr); } } else if (Constant.mapType == "googleGo") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.googleGo); if (isAvailable == true) { - await MapLauncher.showDirections(mapType: MapType.googleGo, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); + await MapLauncher.showDirections( + mapType: MapType.googleGo, + directionsMode: DirectionsMode.driving, + destinationTitle: name, + destination: Coords(latitude, longLatitude), + ); } else { - ShowToastDialog.showToast("Google Go map is not installed".tr()); + ShowToastDialog.showToast("Google Go map is not installed".tr); } } else if (Constant.mapType == "waze") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.waze); if (isAvailable == true) { - await MapLauncher.showDirections(mapType: MapType.waze, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); + await MapLauncher.showDirections( + mapType: MapType.waze, + directionsMode: DirectionsMode.driving, + destinationTitle: name, + destination: Coords(latitude, longLatitude), + ); } else { - ShowToastDialog.showToast("Waze is not installed".tr()); + ShowToastDialog.showToast("Waze is not installed".tr); } } else if (Constant.mapType == "mapswithme") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.mapswithme); if (isAvailable == true) { - await MapLauncher.showDirections(mapType: MapType.mapswithme, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); + await MapLauncher.showDirections( + mapType: MapType.mapswithme, + directionsMode: DirectionsMode.driving, + destinationTitle: name, + destination: Coords(latitude, longLatitude), + ); } else { - ShowToastDialog.showToast("Mapswithme is not installed".tr()); + ShowToastDialog.showToast("Mapswithme is not installed".tr); } } else if (Constant.mapType == "yandexNavi") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.yandexNavi); if (isAvailable == true) { - await MapLauncher.showDirections(mapType: MapType.yandexNavi, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); + await MapLauncher.showDirections( + mapType: MapType.yandexNavi, + directionsMode: DirectionsMode.driving, + destinationTitle: name, + destination: Coords(latitude, longLatitude), + ); } else { - ShowToastDialog.showToast("YandexNavi is not installed".tr()); + ShowToastDialog.showToast("YandexNavi is not installed".tr); } } else if (Constant.mapType == "yandexMaps") { bool? isAvailable = await MapLauncher.isMapAvailable(MapType.yandexMaps); if (isAvailable == true) { - await MapLauncher.showDirections(mapType: MapType.yandexMaps, directionsMode: DirectionsMode.driving, destinationTitle: name, destination: Coords(latitude, longLatitude)); + await MapLauncher.showDirections( + mapType: MapType.yandexMaps, + directionsMode: DirectionsMode.driving, + destinationTitle: name, + destination: Coords(latitude, longLatitude), + ); } else { - ShowToastDialog.showToast("yandexMaps map is not installed".tr()); + ShowToastDialog.showToast("yandexMaps map is not installed".tr); } } } - static String formatAddress({required SelectedLocationModel selectedLocation}) { + static String formatAddress({ + required SelectedLocationModel selectedLocation, + }) { List parts = []; - if (selectedLocation.address!.name != null && selectedLocation.address!.name!.isNotEmpty) parts.add(selectedLocation.address!.name!); - if (selectedLocation.address!.subThoroughfare != null && selectedLocation.address!.subThoroughfare!.isNotEmpty) parts.add(selectedLocation.address!.subThoroughfare!); - if (selectedLocation.address!.thoroughfare != null && selectedLocation.address!.thoroughfare!.isNotEmpty) parts.add(selectedLocation.address!.thoroughfare!); - if (selectedLocation.address!.subLocality != null && selectedLocation.address!.subLocality!.isNotEmpty) parts.add(selectedLocation.address!.subLocality!); - if (selectedLocation.address!.locality != null && selectedLocation.address!.locality!.isNotEmpty) parts.add(selectedLocation.address!.locality!); - if (selectedLocation.address!.subAdministrativeArea != null && selectedLocation.address!.subAdministrativeArea!.isNotEmpty) { + if (selectedLocation.address!.name != null && + selectedLocation.address!.name!.isNotEmpty) + parts.add(selectedLocation.address!.name!); + if (selectedLocation.address!.subThoroughfare != null && + selectedLocation.address!.subThoroughfare!.isNotEmpty) + parts.add(selectedLocation.address!.subThoroughfare!); + if (selectedLocation.address!.thoroughfare != null && + selectedLocation.address!.thoroughfare!.isNotEmpty) + parts.add(selectedLocation.address!.thoroughfare!); + if (selectedLocation.address!.subLocality != null && + selectedLocation.address!.subLocality!.isNotEmpty) + parts.add(selectedLocation.address!.subLocality!); + if (selectedLocation.address!.locality != null && + selectedLocation.address!.locality!.isNotEmpty) + parts.add(selectedLocation.address!.locality!); + if (selectedLocation.address!.subAdministrativeArea != null && + selectedLocation.address!.subAdministrativeArea!.isNotEmpty) { parts.add(selectedLocation.address!.subAdministrativeArea!); } - if (selectedLocation.address!.administrativeArea != null && selectedLocation.address!.administrativeArea!.isNotEmpty) parts.add(selectedLocation.address!.administrativeArea!); - if (selectedLocation.address!.postalCode != null && selectedLocation.address!.postalCode!.isNotEmpty) parts.add(selectedLocation.address!.postalCode!); - if (selectedLocation.address!.country != null && selectedLocation.address!.country!.isNotEmpty) parts.add(selectedLocation.address!.country!); - if (selectedLocation.address!.isoCountryCode != null && selectedLocation.address!.isoCountryCode!.isNotEmpty) parts.add(selectedLocation.address!.isoCountryCode!); + if (selectedLocation.address!.administrativeArea != null && + selectedLocation.address!.administrativeArea!.isNotEmpty) + parts.add(selectedLocation.address!.administrativeArea!); + if (selectedLocation.address!.postalCode != null && + selectedLocation.address!.postalCode!.isNotEmpty) + parts.add(selectedLocation.address!.postalCode!); + if (selectedLocation.address!.country != null && + selectedLocation.address!.country!.isNotEmpty) + parts.add(selectedLocation.address!.country!); + if (selectedLocation.address!.isoCountryCode != null && + selectedLocation.address!.isoCountryCode!.isNotEmpty) + parts.add(selectedLocation.address!.isoCountryCode!); return parts.join(', '); } diff --git a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart index 576c3e6..4598366 100644 --- a/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart +++ b/lib/widget/firebase_pagination/src/widgets/defaults/empty_screen.dart @@ -1,7 +1,7 @@ // Flutter Packages -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; /// A [Widget] to show when there is no data to display. class EmptyScreen extends StatelessWidget { @@ -10,6 +10,6 @@ class EmptyScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return Center(child: Text('Nothing found here...'.tr())); + return Center(child: Text('Nothing found here...'.tr)); } } diff --git a/lib/widget/osm_map/map_controller.dart b/lib/widget/osm_map/map_controller.dart index d08d846..7f528fb 100644 --- a/lib/widget/osm_map/map_controller.dart +++ b/lib/widget/osm_map/map_controller.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:customer/widget/osm_map/place_model.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import '../../utils/utils.dart'; import 'package:latlong2/latlong.dart'; diff --git a/lib/widget/osm_map/map_picker_page.dart b/lib/widget/osm_map/map_picker_page.dart index 6b65246..d5014a1 100644 --- a/lib/widget/osm_map/map_picker_page.dart +++ b/lib/widget/osm_map/map_picker_page.dart @@ -3,11 +3,11 @@ import 'dart:developer'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/widget/osm_map/map_controller.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:latlong2/latlong.dart'; import '../../controllers/theme_controller.dart'; @@ -28,7 +28,7 @@ class MapPickerPage extends StatelessWidget { // centerTitle: false, // titleSpacing: 0, // title: Text( - // "PickUp Location".tr(), + // "PickUp Location".tr, // textAlign: TextAlign.start, // style: TextStyle( // fontFamily: AppThemeData.medium, @@ -98,7 +98,7 @@ class MapPickerPage extends StatelessWidget { isDark ? AppThemeData.grey900 : AppThemeData.grey900, ), decoration: InputDecoration( - hintText: 'Search location...'.tr(), + hintText: 'Search location...'.tr, hintStyle: TextStyle( color: isDark @@ -157,8 +157,8 @@ class MapPickerPage extends StatelessWidget { children: [ Text( controller.pickedPlace.value != null - ? "Picked Location:".tr() - : "No Location Picked".tr(), + ? "Picked Location:".tr + : "No Location Picked".tr, style: AppThemeData.boldTextStyle( color: AppThemeData.grey900, fontSize: 17.sp, @@ -178,7 +178,7 @@ class MapPickerPage extends StatelessWidget { children: [ Expanded( child: RoundedButtonFill( - title: "Confirm Location".tr(), + title: "Confirm Location".tr, color: AppThemeData.mainColor, textColor: AppThemeData.grey50, borderRadius: 12, diff --git a/lib/widget/permission_dialog.dart b/lib/widget/permission_dialog.dart index e499e38..f26e0e2 100644 --- a/lib/widget/permission_dialog.dart +++ b/lib/widget/permission_dialog.dart @@ -1,7 +1,6 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import '../themes/app_them_data.dart'; import '../themes/round_button_fill.dart'; @@ -29,7 +28,7 @@ class PermissionDialog extends StatelessWidget { const SizedBox(height: 20), Text( 'You denied location permission forever. Please allow location permission from your app settings and receive more accurate delivery.' - .tr(), + .tr, textAlign: TextAlign.center, style: TextStyle(fontSize: 18), ), @@ -48,14 +47,14 @@ class PermissionDialog extends StatelessWidget { ), minimumSize: const Size(1, 50), ), - child: Text('close'.tr()), + child: Text('close'.tr), onPressed: () => Navigator.pop(context), ), ), const SizedBox(width: 10), Expanded( child: RoundedButtonFill( - title: "Settings".tr(), + title: "Settings".tr, color: AppThemeData.grey900, textColor: AppThemeData.grey50, onPress: () async { diff --git a/lib/widget/place_picker/location_controller.dart b/lib/widget/place_picker/location_controller.dart index 70a4ab8..7721776 100644 --- a/lib/widget/place_picker/location_controller.dart +++ b/lib/widget/place_picker/location_controller.dart @@ -1,5 +1,5 @@ import 'package:customer/widget/place_picker/selected_location_model.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:geolocator/geolocator.dart'; import 'package:geocoding/geocoding.dart'; diff --git a/lib/widget/place_picker/location_picker_screen.dart b/lib/widget/place_picker/location_picker_screen.dart index e00f665..e1190e4 100644 --- a/lib/widget/place_picker/location_picker_screen.dart +++ b/lib/widget/place_picker/location_picker_screen.dart @@ -4,11 +4,11 @@ import 'package:customer/themes/round_button_fill.dart'; import 'package:customer/widget/place_picker/location_controller.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/theme_controller.dart'; -import 'package:easy_localization/easy_localization.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_google_places_hoc081098/flutter_google_places_hoc081098.dart'; import 'package:flutter_google_places_hoc081098/google_maps_webservice_places.dart'; -import 'package:get/get.dart' hide Trans; +import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; final GoogleMapsPlaces _places = GoogleMapsPlaces(apiKey: Constant.mapAPIKey); @@ -131,7 +131,7 @@ class LocationPickerScreen extends StatelessWidget { children: [ Icon(Icons.search), SizedBox(width: 8), - Text("Search place...".tr()), + Text("Search place...".tr), ], ), ), diff --git a/lib/widget/story_view/widgets/story_image.dart b/lib/widget/story_view/widgets/story_image.dart index 9a193a5..5d8ef01 100644 --- a/lib/widget/story_view/widgets/story_image.dart +++ b/lib/widget/story_view/widgets/story_image.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'dart:ui' as ui; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:get/get.dart'; import '../controller/story_controller.dart'; import '../utils.dart'; @@ -28,7 +28,10 @@ class ImageLoader { onComplete(); } - final fileStream = DefaultCacheManager().getFileStream(url, headers: requestHeaders as Map?); + final fileStream = DefaultCacheManager().getFileStream( + url, + headers: requestHeaders as Map?, + ); fileStream.listen( (fileResponse) { @@ -44,13 +47,18 @@ class ImageLoader { state = LoadState.success; - ui.instantiateImageCodec(imageBytes).then((codec) { - frames = codec; - onComplete(); - }, onError: (error) { - state = LoadState.failure; - onComplete(); - }); + ui + .instantiateImageCodec(imageBytes) + .then( + (codec) { + frames = codec; + onComplete(); + }, + onError: (error) { + state = LoadState.failure; + onComplete(); + }, + ); }, onError: (error) { state = LoadState.failure; @@ -92,10 +100,7 @@ class StoryImage extends StatefulWidget { Key? key, }) { return StoryImage( - ImageLoader( - url, - requestHeaders: requestHeaders, - ), + ImageLoader(url, requestHeaders: requestHeaders), controller: controller, fit: fit, loadingWidget: loadingWidget, @@ -120,7 +125,9 @@ class StoryImageState extends State { super.initState(); if (widget.controller != null) { - _streamSubscription = widget.controller!.playbackNotifier.listen((playbackState) { + _streamSubscription = widget.controller!.playbackNotifier.listen(( + playbackState, + ) { // for the case of gifs we need to pause/play if (widget.imageLoader.frames == null) { return; @@ -167,7 +174,9 @@ class StoryImageState extends State { void forward() async { _timer?.cancel(); - if (widget.controller != null && widget.controller!.playbackNotifier.stream.value == PlaybackState.pause) { + if (widget.controller != null && + widget.controller!.playbackNotifier.stream.value == + PlaybackState.pause) { return; } @@ -185,22 +194,20 @@ class StoryImageState extends State { Widget getContentView() { switch (widget.imageLoader.state) { case LoadState.success: - return RawImage( - image: currentFrame, - fit: widget.fit, - ); + return RawImage(image: currentFrame, fit: widget.fit); case LoadState.failure: return Center( - child: widget.errorWidget ?? - Text( - "Image failed to load.".tr(), - style: TextStyle( - color: Colors.white, - ), - )); + child: + widget.errorWidget ?? + Text( + "Image failed to load.".tr, + style: TextStyle(color: Colors.white), + ), + ); default: return Center( - child: widget.loadingWidget ?? + child: + widget.loadingWidget ?? const SizedBox( width: 70, height: 70, diff --git a/pubspec.lock b/pubspec.lock index c0f8f59..dcfcb6d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -329,22 +329,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - easy_localization: - dependency: "direct main" - description: - name: easy_localization - sha256: "2ccdf9db8fe4d9c5a75c122e6275674508fd0f0d49c827354967b8afcc56bbed" - url: "https://pub.dev" - source: hosted - version: "3.0.8" - easy_logger: - dependency: transitive - description: - name: easy_logger - sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7 - url: "https://pub.dev" - source: hosted - version: "0.0.2" enum_to_string: dependency: transitive description: @@ -707,14 +691,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" - flutter_phoenix: - dependency: "direct main" - description: - name: flutter_phoenix - sha256: "39589dac934ea476d0e43fb60c1ddfba58f14960743640c8250dea11c4333378" - url: "https://pub.dev" - source: hosted - version: "1.1.1" flutter_plugin_android_lifecycle: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index bce9ddd..9de4c23 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -88,11 +88,10 @@ dependencies: flutter_google_places_hoc081098: ^2.0.0 flutter_screenutil: ^5.9.3 flutter_hooks: ^0.21.3+1 - easy_localization: ^3.0.8 flutter_localization: ^0.3.3 country_flags: ^4.1.0 flag: ^7.0.2 - flutter_phoenix: ^1.1.1 + dependency_overrides: webview_flutter: ^4.9.0 -- 2.49.1 From 50270ed2dae1345454887f82b88f5f983b4a8137 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Thu, 4 Dec 2025 17:18:43 +0500 Subject: [PATCH 24/30] MINOR-FIX: Solve Localization Problem. --- lib/main.dart | 13 ++- .../change_language_screen.dart | 79 +++++++++---------- pubspec.lock | 2 +- pubspec.yaml | 2 + 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 47b0a7e..bae53fe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,6 +13,7 @@ import 'package:get/get.dart'; import 'controllers/global_setting_controller.dart'; import 'controllers/theme_controller.dart'; import 'firebase_options.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -45,10 +46,16 @@ class MyApp extends StatelessWidget { splitScreenMode: true, child: GetMaterialApp( translations: LocalizationService(), - locale: const Locale('uz', 'UZ'), - navigatorKey: AppRouter.navigatorKey, - fallbackLocale: const Locale('uz', 'UZ'), + locale: const Locale('uz', 'UZ'), // current locale + fallbackLocale: const Locale('en', 'US'), supportedLocales: LocalizationService.supportedLocales, + localizationsDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + navigatorKey: AppRouter.navigatorKey, + debugShowCheckedModeBanner: false, builder: (context, child) { return SafeArea( diff --git a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart index 05cc06b..068d870 100644 --- a/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart +++ b/lib/screen_ui/multi_vendor_service/change langauge/change_language_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/change_language_controller.dart'; import 'package:customer/screen_ui/splash_screen/splash_screen.dart'; @@ -27,17 +28,6 @@ class ChangeLanguageScreen extends StatelessWidget { isDark ? AppThemeData.surfaceDark : AppThemeData.surface, centerTitle: false, titleSpacing: 0, - leading: InkWell( - onTap: () { - // Get.back(); - Navigator.pushAndRemoveUntil( - context, - MaterialPageRoute(builder: (context) => SplashScreen()), - (route) => false, - ); - }, - child: Icon(Icons.arrow_back), - ), ), body: controller.isLoading.value @@ -45,38 +35,41 @@ class ChangeLanguageScreen extends StatelessWidget { : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Padding( - // padding: const EdgeInsets.symmetric(horizontal: 16), - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // Text( - // ConstTexts.changeLanguage.tr, - // style: TextStyle( - // fontSize: 24, - // color: - // isDark - // ? AppThemeData.grey50 - // : AppThemeData.grey900, - // fontFamily: AppThemeData.semiBold, - // fontWeight: FontWeight.w500, - // ), - // ), - // Text( - // ConstTexts.selectPrefferedLanguage.tr, - // style: TextStyle( - // fontSize: 16, - // color: - // isDark - // ? AppThemeData.grey50 - // : AppThemeData.grey900, - // fontFamily: AppThemeData.regular, - // fontWeight: FontWeight.w400, - // ), - // ), - // ], - // ), - // ), + SizedBox( + height: 100.h, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + ConstTexts.changeLanguage.tr, + style: TextStyle( + fontSize: 24, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w500, + ), + ), + Text( + ConstTexts.selectPrefferedLanguage.tr, + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ), _buildLanguageButton( isActive: Get.locale == const Locale("uz", "UZ"), flagCode: FlagsCode.UZ, diff --git a/pubspec.lock b/pubspec.lock index dcfcb6d..7dae800 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -647,7 +647,7 @@ packages: source: hosted version: "0.3.3" flutter_localizations: - dependency: transitive + dependency: "direct dev" description: flutter source: sdk version: "0.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9de4c23..333c97e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -102,6 +102,8 @@ dependency_overrides: dev_dependencies: flutter_test: sdk: flutter + flutter_localizations: + sdk: flutter flutter_lints: ^6.0.0 -- 2.49.1 From 079fb016089159bc94066d07454e2dad27145dc5 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Fri, 5 Dec 2025 15:59:47 +0500 Subject: [PATCH 25/30] MINOR-FIX: Solve Navigation Problem. --- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle.kts | 2 +- ios/Podfile.lock | 26 ++- ios/Runner.xcodeproj/project.pbxproj | 27 ++- .../AppIcon.appiconset/AppIcon-20@2x.png | Bin 2772 -> 0 bytes .../AppIcon.appiconset/AppIcon-20@2x~ipad.png | Bin 2772 -> 0 bytes .../AppIcon.appiconset/AppIcon-20@3x.png | Bin 5498 -> 0 bytes .../AppIcon.appiconset/AppIcon-20~ipad.png | Bin 986 -> 0 bytes .../AppIcon.appiconset/AppIcon-29.png | Bin 1793 -> 0 bytes .../AppIcon.appiconset/AppIcon-29@2x.png | Bin 5163 -> 0 bytes .../AppIcon.appiconset/AppIcon-29@2x~ipad.png | Bin 5163 -> 0 bytes .../AppIcon.appiconset/AppIcon-29@3x.png | Bin 9939 -> 0 bytes .../AppIcon.appiconset/AppIcon-29~ipad.png | Bin 1793 -> 0 bytes .../AppIcon.appiconset/AppIcon-40@2x.png | Bin 8101 -> 0 bytes .../AppIcon.appiconset/AppIcon-40@2x~ipad.png | Bin 8101 -> 0 bytes .../AppIcon.appiconset/AppIcon-40@3x.png | Bin 16337 -> 0 bytes .../AppIcon.appiconset/AppIcon-40~ipad.png | Bin 2772 -> 0 bytes .../AppIcon.appiconset/AppIcon-60@2x~car.png | Bin 16337 -> 0 bytes .../AppIcon.appiconset/AppIcon-60@3x~car.png | Bin 31661 -> 0 bytes .../AppIcon-83.5@2x~ipad.png | Bin 29703 -> 0 bytes .../AppIcon.appiconset/AppIcon@2x.png | Bin 16337 -> 0 bytes .../AppIcon.appiconset/AppIcon@2x~ipad.png | Bin 23679 -> 0 bytes .../AppIcon.appiconset/AppIcon@3x.png | Bin 31661 -> 0 bytes .../AppIcon~ios-marketing.png | Bin 458698 -> 0 bytes .../AppIcon.appiconset/AppIcon~ipad.png | Bin 7470 -> 0 bytes .../AppIcon.appiconset/Contents.json | 176 +++++++++--------- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 731 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1628 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 2477 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1139 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 2388 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 3667 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1628 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 3501 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 5241 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 5241 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 7989 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 3254 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 6945 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 7699 bytes .../AppIcon.appiconset/ItunesArtwork@2x.png | Bin 0 -> 109349 bytes ios/Runner/Assets.xcassets/Contents.json | 6 + ios/Runner/Info.plist | 87 +++++---- lib/main.dart | 17 +- .../ecommarce/home_e_commerce_screen.dart | 2 - .../home_screen/home_screen.dart | 4 +- .../home_screen/home_screen_two.dart | 3 +- pubspec.lock | 152 +++++++-------- pubspec.yaml | 2 +- 49 files changed, 264 insertions(+), 242 deletions(-) delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png create mode 100644 ios/Runner/Assets.xcassets/Contents.json diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index afa1e8e..efdcc4a 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 36fd3a3..c4b6403 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -18,7 +18,7 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.7.0" apply false + id("com.android.application") version "8.9.1" apply false // START: FlutterFire Configuration id("com.google.gms.google-services") version("4.3.15") apply false // END: FlutterFire Configuration diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d3ba75c..bfc088c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1317,6 +1317,8 @@ PODS: - Flutter (1.0.0) - flutter_local_notifications (0.0.1): - Flutter + - flutter_localization (0.0.1): + - Flutter - flutter_osm_plugin (0.0.1): - Alamofire - Flutter @@ -1500,7 +1502,9 @@ PODS: - Flutter - Polyline (5.1.0) - PromisesObjC (2.4.0) - - razorpay-pod (1.4.7) + - razorpay-core-pod (1.0.3) + - razorpay-pod (1.5.0): + - razorpay-core-pod - razorpay_flutter (1.1.10): - Flutter - razorpay-pod @@ -1592,6 +1596,7 @@ DEPENDENCIES: - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`) - Flutter (from `Flutter`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - flutter_localization (from `.symlinks/plugins/flutter_localization/ios`) - flutter_osm_plugin (from `.symlinks/plugins/flutter_osm_plugin/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - geocoding_ios (from `.symlinks/plugins/geocoding_ios/ios`) @@ -1651,6 +1656,7 @@ SPEC REPOS: - OSMFlutterFramework - Polyline - PromisesObjC + - razorpay-core-pod - razorpay-pod - RecaptchaInterop - Stripe @@ -1682,6 +1688,8 @@ EXTERNAL SOURCES: :path: Flutter flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" + flutter_localization: + :path: ".symlinks/plugins/flutter_localization/ios" flutter_osm_plugin: :path: ".symlinks/plugins/flutter_osm_plugin/ios" fluttertoast: @@ -1758,13 +1766,14 @@ SPEC CHECKSUMS: FirebaseStorage: 20d6b56fb8a40ebaa03d6a2889fe33dac64adb73 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb + flutter_localization: 72299fb6cb4e51cae587bd953ed0b958040b71e6 flutter_osm_plugin: 3fb57665b32a81fcffa57c6206658d3a0d0d1a96 fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1 geocoding_ios: 33776c9ebb98d037b5e025bb0e7537f6dd19646e geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e Google-Maps-iOS-Utils: 0a484b05ed21d88c9f9ebbacb007956edd508a96 google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264 - google_sign_in_ios: 205742c688aea0e64db9da03c33121694a365109 + google_sign_in_ios: 00dfa94252eb10278b64828c81bcb7158a81a53a GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleMaps: 0608099d4870cac8754bdba9b6953db543432438 GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 @@ -1773,7 +1782,7 @@ SPEC CHECKSUMS: gRPC-Core: 860978b7db482de8b4f5e10677216309b5ff6330 GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 in_app_review: 7dd1ea365263f834b8464673f9df72c80c17c937 leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8 @@ -1781,15 +1790,16 @@ SPEC CHECKSUMS: nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 OSMFlutterFramework: 2f1260ac2854d3398b92403f2d5e012b4ca2c620 package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d Polyline: 2a1f29f87f8d9b7de868940f4f76deb8c678a5b1 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - razorpay-pod: 7bbc8748a93377d1705f9119b2f947faa9c9e3e1 + razorpay-core-pod: ef0309dbf8e3e5a1330f6cad89dcf9226d8ef758 + razorpay-pod: f634f1b8397eb54d547f25d35291f679545ddf17 razorpay_flutter: 0e98e4fcaae27ad50e011d85f66d85e0a008754a RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418 sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 Stripe: a4b6584549bac3698733ed564e55b0b067cfda8a @@ -1801,9 +1811,9 @@ SPEC CHECKSUMS: StripePaymentSheet: 7bc20a0ab10d91acc06dc449ab61bb2cf221b0f4 StripePaymentsUI: 1590647b3f635a58fb0e7058d86d3e9ff89250d4 StripeUICore: a63d95d604e70a5895f9d6b09c49a46757e86353 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b video_compress: f2133a07762889d67f0711ac831faa26f956980e - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b + video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d Yams: e10dae147f517ed57ecae37c5e8681bdf8fcab65 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a4e69a6..108d164 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -496,7 +496,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 9J9XV5T2VN; + DEVELOPMENT_TEAM = N72LCPWT92; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Emart Customer"; @@ -504,10 +504,15 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz; + PRODUCT_BUNDLE_IDENTIFIER = uz.felix.fondex.customer; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -683,7 +688,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 9J9XV5T2VN; + DEVELOPMENT_TEAM = N72LCPWT92; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Emart Customer"; @@ -691,11 +696,16 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz; + PRODUCT_BUNDLE_IDENTIFIER = uz.felix.fondex999; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -708,7 +718,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 9J9XV5T2VN; + DEVELOPMENT_TEAM = N72LCPWT92; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Emart Customer"; @@ -716,10 +726,15 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = felix.fondex.uz; + PRODUCT_BUNDLE_IDENTIFIER = uz.felix.fondex.customer; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png deleted file mode 100644 index eeb78fa5d9b07486f2c46099e56be40fb7a651c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2772 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png deleted file mode 100644 index 9cdf92299565d67c40dcf3912ffa9ee1c7868e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 986 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png deleted file mode 100644 index 49f84fccab00a0bb216d1fedf51f1a0ead9d2e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png deleted file mode 100644 index 17c0afc735b38af15f677acaf4cea7c2bda23044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8101 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png deleted file mode 100644 index 3fa4f47d7a210c16344f5cd6bf852c70b4b2cecb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16337 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 TN&I7h00000NkvXXu0mjf>ECgT diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png deleted file mode 100644 index eeb78fa5d9b07486f2c46099e56be40fb7a651c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2772 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 TN&I7h00000NkvXXu0mjf>ECgT diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png deleted file mode 100644 index a9c049e3994b0709907ac42be9c9ae51a2c2ffd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31661 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

I 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png deleted file mode 100644 index 260eb41736479c1a436ef43d568271acce5a7ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29703 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

bKi6D0HlwW9}qQq~s6-?l~cR0frxp zyqJC{`W=3{d^tZ)UciT;L!=e_>5oPH!eb&{%BSOt_`%|wk4Ls z==D*{cF_e9ewX?NeolPi|BCqWheo`KJKRSGbj*X4&Jpgwp|sn@Z$&cF#o9Zb4#7D7%M zIQg^+9ltIqy&=rQp$QziUG)nh?(>5Yd$(eK_WW(WBmALnVF7<9!p$i^`|s@MK<#E={aZ)ej}JNz|EY+(^VQXE?vy?j{0U!$J@Gz~zx;I8n_qqyGsnf*u!S4* zQdWa^YtHFz@5y()cZ|WPI&d(naiz12RgYDK4A0RWp2Y}$GvzzJPx6Ix>~LK3##{`3 z=Hf%r;Ac2oqnDp{*lNYfLfolA1Cd>y*89M5e2zYLAAQ)n9OD%hDE{LMZnTTf zi}Q!Qut|eOc60hq4t_h>6|QlF0mr=1 z4XWQa`t^>_kdM1(#BXuO{%5}2|1@`D!qvQHeg${aJMq@dUGITE5^+=Ju*?6hJ>U1Q z5l{V=h@apN?3eRyREGCD)w-|=Yn+8PtaQ9HwR2iawSJdGb?NmwKjCVv1llwPo3lG3 zL9K{Z9!B>w!sm_;y$j?J?Ka#IzVFAQ@!SZT^zG=cl+G7(5*fW>?~RFU_bJr}BC+En zE;e^+rVw2cjl?dFeJAk({ z;0AGZUL0$LLpv8!@7#0GjSKzI^AB&}^ME%C`J9vU(CjONm0Yqcje!nS_wD<7CRks~ zHh;G*X5CRR!+oH%xi(NWV@9I?LPWKK*SgjT^-M7W{;2P#zu|A{Exuy88L!-jz91UE z@}z}*G?*r^IgyGpj(FMD^8=RpxJq8~>VBQ}72m_%iSIIR%3bm@e2Vua?w!={Jr!-g zdOGXuh#SNC{+C2NglE1hU3=$o&pRjLgYS&^$2ak5{v#1*T#*e)-4joVIALFeA4Hd# z{)BvG?$meqx`;>c$iVfEo8KkEJF|DtCHD}voASK#&I>oDcKsu-tks~qCc_?kK&=$M zaS1zr1C-e4gwdVjzQO^nwzyHG`=!9ZN;YRk9W|&qLqIL2UwkO)(eKg%SRvWkk`3Q#DiWO@p!&JeAFu< zzV(M9zV?w3_vFLRcl|Ut-!VR#uXG;7^WlxSYi`!}E1$pmgNUDdV$>(>=R6?d1rLw- z0Greo`6gfA7w%o}9pQ82_y2gry}v)=^R64Q%MBSE+q_-7A>Ei4UE~Lyh<$t&xUW9! zMXaqi*QnM8O@PLAqG5zbtyx`5JoQ4Vjy|Emw^nz#i!$fR7f`6%eGLF|x9Xw0Y(Vs? zbw8~Pv2e8?h+fD7_u)u5lLpaGC+=y<-bIv&@>P`u^hiBQ7PCBVJXZ_M=zSl^>c3qU|3W3n3nA-xc zw}Ex9_h7joXGzt9&fj>qA-DAXPsa%iB>xv}W+ z9-ck_;MXF4;s>~c-itfqxACFr`yzgc-{SqdN8^4sd8omz$Ooo-vB{r64eyZO_y`^k zzL;Cw{zGLP62I`m3&RcR#&m;9+~P68O{us+#e$nczbYARepc+O&%S|@C36hVsHl1+ z6<~E^uCwGMs5M$Kf+I`pJC-oE3!644w&Xqwg8E9@O)_k>cg+_*I^rFFJ;jco{8i!} z-yZSo*F?J~7yTMHjNID8IMi}n(w$g>)U(&id9Z&1Z(on%YnT_Xz%S?P5Fgmz#+TQA zAoDHJO+en!wG4;w)msuA(>Y@ux$)s4{0`7Lyo2v5{dw?@U&^OvzF_}JJ|sPbPrDDf z3!Cx25ijMdwZDHugkSxf!*APOvz_M5w;OQ{?y_I}l@Z^>CVUdlvi{EPcgH@@`s)*S zlOs=V#qiE}{`u#}XFvPdPQC^GoaHEzX7q*!{>lO?*E�{bmh6$lfBH{BBOYvA*^X5VroSj zu|S>3f4nE+N%xB2D+s=Wkg+@Q?fzOfiFgc)`n*4hxZl$v_~hC6mCKvubpQYm07*na zR4MlG70OOkJOO{7_HPH>0Dj-_TTpSh#N7U9M72r9%;MP zZa&|ty*s)o)nX%m&*Dyb!jb;c>r}p~BGHYPtg-tbnNxzf)+vBpEvt`uZNshofFrMH zV6&Dw`H3FfiW8f2sA)_*8CSj4M}RdqSPazr4yMd9v--8}!|&$pnz!sX^U2f=v=-cj z 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png deleted file mode 100644 index 3fa4f47d7a210c16344f5cd6bf852c70b4b2cecb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16337 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 TN&I7h00000NkvXXu0mjf>ECgT diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png deleted file mode 100644 index d96554ef642775fc095beaebf755cda2a220863d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23679 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 iPyhe`21!IgR09A9%7tXRril&!0000w1PK=0 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

I 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png deleted file mode 100644 index c231fe826c9c4af06461d887abb2420420538873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458698 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%0D6DH9{Ri#r%^v=)KXGm(xHdP|#~YY2j7uJ~s`ex) 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%0D3?5=wY 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 z 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index bd04914..0344229 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,134 +1,128 @@ { - "images": [ + "images" : [ { - "filename": "AppIcon@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "60x60" + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" }, { - "filename": "AppIcon@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "60x60" + "filename" : "Icon-App-20x20@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" }, { - "filename": "AppIcon~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "76x76" + "filename" : "Icon-App-29x29@1x.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" }, { - "filename": "AppIcon@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "76x76" + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" }, { - "filename": "AppIcon-83.5@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "83.5x83.5" + "filename" : "Icon-App-29x29@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" }, { - "filename": "AppIcon-40@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "40x40" + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" }, { - "filename": "AppIcon-40@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "40x40" + "filename" : "Icon-App-40x40@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" }, { - "filename": "AppIcon-40~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "40x40" + "filename" : "Icon-App-60x60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" }, { - "filename": "AppIcon-40@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "40x40" + "filename" : "Icon-App-60x60@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" }, { - "filename": "AppIcon-20@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "20x20" + "filename" : "Icon-App-20x20@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" }, { - "filename": "AppIcon-20@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "20x20" + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" }, { - "filename": "AppIcon-20~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "20x20" + "filename" : "Icon-App-29x29@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" }, { - "filename": "AppIcon-20@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "20x20" + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" }, { - "filename": "AppIcon-29.png", - "idiom": "iphone", - "scale": "1x", - "size": "29x29" + "filename" : "Icon-App-40x40@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" }, { - "filename": "AppIcon-29@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "29x29" + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" }, { - "filename": "AppIcon-29@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "29x29" + "filename" : "Icon-App-76x76@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" }, { - "filename": "AppIcon-29~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "29x29" + "filename" : "Icon-App-76x76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" }, { - "filename": "AppIcon-29@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "29x29" + "filename" : "Icon-App-83.5x83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" }, { - "filename": "AppIcon-60@2x~car.png", - "idiom": "car", - "scale": "2x", - "size": "60x60" + "filename" : "ItunesArtwork@2x.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" }, { - "filename": "AppIcon-60@3x~car.png", - "idiom": "car", - "scale": "3x", - "size": "60x60" - }, - { - "filename": "AppIcon~ios-marketing.png", - "idiom": "ios-marketing", - "scale": "1x", - "size": "1024x1024" + "filename" : "Icon-App-76x76@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "76x76" } ], - "info": { - "author": "iconkitchen", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..663f22706ee82130d5b271061b18c0915e877f07 GIT binary patch literal 731 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..321eaedbbc31f2cdfae7bc6ec8e2f6eba4073276 GIT binary patch literal 1139 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6cc2504e6e148bce5db364d1acd748f890544f GIT binary patch literal 3667 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c45bdd3b7cf7ff3ab870604444af775075766fdc GIT binary patch literal 1628 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

MTYD}7N5wgmvqVlk+Ix{ zNVMPggZE*w=RQOb(nsrMym%(}oYtIH(OBUkVX@#Jn^0)I{5h{o_AnSb{QI~(A7{ku zXoRh|{m_&4HSl;%g&2)z+GOn=GSs^k?en^EoQsRJ2sT@Gb9Kt;xB2nvi7$p#!|n~A z0kS{yJlRwfx|{Cd(Dzj&hf<>bhsfZ&GG~iTe4|;hr$Qn{+nqFJTC3;#10S&})7YU!Hi~ag)!`8^PBCK^yUtBx! zuBOb~bVsdQr3Lc-6=qzI!OsVp_O}5G>*|f49&(9mKt&u0R= zSiL5q|NY<0k|e66x+)pn5(6TZ$7s@p&=-S}%c++@0O0a6!<$d>H*_)om$n!Hxm*6_ Tk40&kzZU?++|CSV;+66rQW&}G literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f035588a346b931974f0370ee7488c70a00ec7 GIT binary patch literal 5241 zcmV-<6o%`GP)$j*JTZ?F@;Jw zxXz(Y0Zsv~^BSo0;-ws%0$k@cQ0K))Ik)yYu*$7#zZ={-c3)>bXv(d- zK16nHElz<`9-@zAu1qq?CXlKCTfZG_))}_n9rpM(9MBWKc`SVU`*6q);jok8h*ROa zr<*$ydYJ3k8+x7tNBs8&btnJUjwK82b^e?{6hoa2S3RI zb&P>0Airl}d!7YH8NdSj$REMs2K?ctz+orBcTUVYHHw3+VH|t{e9Ib1&K-1Iw&8s9 z7`r#(4m=vVe=nl5#<+hED0F)t3L9;nMI(Xl+5}i4RIR#)0d)RvaHs#A0H9sF!`9ou z##SL4Y?u{y5^-yrNL|ast>Q@xXW9^m=2dqqrW%X0`)baS73&f2Sa@2;WhJg5LIuL6 zTV=&(pX=d>(_oujphHK3zEXW`BIMR@qM4d0+Inqaza#N|Z^27cZn`yyJ5x~0f~e&I z7Jw4Dr}o32csXv#zw3Y|<-<8fY1Sx9kcw{h{4Pq~Mb1 zRegX>altv)LWfNa+oa}`9=zO2SebJxV8!w;-STCyn)||@^V~A~9oH?lxXM3K=)xsl zU4YkFA1|%bR$s-?rM$}kTw$OsT@0Up2A|Ev&zl9ar{h1K0@FT%iT{8P-@w27SNQu2 z`0-=#uZ+aM_$0jW1dJO7&pZNSAB3mx|I&@V4@M1vkulw0?uA7Q$}3)lVmA$Ng)#|} zF|Cr{?}%WuOgSTEapC+q_-X%wH^;#fe}ubD({)Q<-1Vk!{>|CA>w1HJ-())GTQ9-= z{tCFWKW^|fxO=a|-G2i-cq2S=D?B<79=ko8j?$8Q@-BGl9vB(Z{beXDoEH?krN62N zu=Tsn6#s55Qz^zNwSb*968$IKi&M@D$Egm$n%~Nj(|%)OiDrr5@lV5DKQqp=X_blHfI|cxHFyQ! z8pt(3TJiv^usiJo+wTEU=eovqe$GsI{EjTJQ$EacWerqZlO(9juE`Kpdzn1Ivf&=u z3)bHtTA?IXXHLTX>3VqeDOmiu#kYZ#eb@fS&=trvKxpy+i*q||3z;_Ii!08ZJ`wKw zEqw5r^`|!N2p_xULpqTVeCbDvx?}-1qk-S&FlgI8LLohV_B7l>*4IvYhhVN6A$Dy9 zb@(-cgFAM@b=e7`^t}sh6s#%AzuqPo1=j{*F{p4c;#59LavZD{+-+ajXtVHCn`X&R z7>6_0qMX|l#T#@0S-@1jQsFWgY6D&pJSS`2wy@pqU}CydJrw!dJlBmetV8 zArBi5u$~PNcRc`q_BGJ|9=sO!wUY5(Cb4SUq!V=B9$d&QzA(kagy-NBQ!`Qnm)3V} zzdQc4e)y~Z1Q+}kx3`TaWFUFd=%gux9ks&3A#0!LmlnlI!4Wp*{Mqn|O@~@adEpEc zjTKDe=8rxX-{17mmkh)mcnof1>t-@*frar4KE=InBYRrMl^npCHV~G3Wi*)bKFpax zRWE0tN_D!S*`&1$w(rew)gWAtGjIkp0$gEoM44sEy*3t>XilE2?+7RV6#5N!KKj*w|DQluDx)vvbi2wy+Q`c%`9U2ayS?ni+Z{YlywFr`xUHrVnX zPJkI^)F>6G2K`$eU{guDxiblj2T4_sfbF;i!B&^Pzk_pr0Xvv(TziW`a+;HPe&Npq z3ki~%1K}79byLxD2pu{>fFqR91~H*2&JSot0N?X$f{oy2nk3HX zI6u9@-&6l->QfWX(zF%6Yw9`E#`rg6`6U_D$eT*9jCaWa9I|||X*XTBS6{2$`E54@ z;~FY>c`Xro^frPu*Xl;1r0uL)LzmysZJit(u135nFKPkXZ;b!(uVD9svRh5VWfeY@ z=+Qc`N$-M*>F^O7LTZXgNQ4dFhFFQ*tf?iEZnQ+Bh-iU(;eVSZYEN9HMREhxe)>e* zn1=|~R|5^+;cv#l;c>H&QOX~liXdcd0347K;!FFQF1!)C?2HSzBt)EuLHy!{xZ!uh z+%ha%)(7Lla@b?O z_m-kF=fCcH7@>r^1hDcB6*zjJgla1~AthtT;&beIxNiGFn>Hnbm3$%YFwQLbK6qhb za=}~}IT-Cu47|$uvgwjc<=eTaM6NR(~NP@u!mqHcRpo?65w z1O2G~1s%y$s!x=eQsJI|3@V`$SKhhhKKk99QzMjXE?ms_$#HP03N0YisTDLPdSy7! zj>Ha|LddkpUB;1q!n4^uzfy!~8BXq9{$1QN+c^A*J53#FB0B$F+}}ENFUn$nfvZLq zH@{}$B?oXb8L$4@t^TNf_glvY)1k=yu6EX&alj291p6Eg;-*H$rS-duKC?z}7s1}* z)hUSoq(fyoZV4f$alVEDj$a9RF|C^Op6sW%b=zIgsdvF~z2+76;}_0@v8JHV4tsIY zzK2nA;k`t-j&S(L%f!-Fl_E-u{o8dY^|shw-NK48t!c%nuJUPd4t63XUqssg#UIiO z9nzv#p_~n%g7wNeQ$y!%sDjmZx7)~~2RYb1?<1~x`z3hh;mY;9N?wx3)ThD9Og)Ej zT2ZRQUc!Wp5hgi+#fdahxrIb3NKS;Bg23;xKW>LT2rZg(;Od+W9j;<&aMW3_MHg_z z#ghS_853dHK(dAeDt9T*uj~l9@-&yS(HQ&bwV?An3g4CUYz@n6 zIj;KPu<6+J$j$v2%3bi#M1Gkj-j(^v01lIa8iMAyGTiTXBy712$d9J4fD^6HbwjSj zz4ao93%Yj09dZJV_1y}u#^44G!0EsiYaC7I5bUq`7<8s7sd+NRvv;y-Vbo zAiyPZEcA96oT(zwph#1iQk+*9&qm9B$S<>cV@)%({p7o6kX^)H(6|gtafFN05}g8ZoPrIE8Xu644mB}&rjcmFv7#KlqKMGTu9z^*y4@+q~jVZyIifgke# zXdzrKx|YWF>Z$5{6(v0x}QHiQjr4+HLl^9uPdT1cU^N+(VCXy$Zx>AEL zg{`!crb>P8aTnk=2-&sdXwc|+#w5^on4Dii_tpWh>5To94{-O}bSNJ%8=QHoVASu< zv+2(p&)^1L3R*0u4Q;uGQ0dB3ejPT$pK_Ir`mO(sn7-G7J{?sdEmp+1QG+K4u!-HM z)HE92`rS`w;s*c16ch8m453QyvNK4{H|~*uW1U9TQ$GZW=r2Q7_LuUtDG{gtCrEne zIZ6)JSe*hPeV4VZZbLUc?iDuf8n>^9YdGMmvOI`gn9q<$Wh})ND$z-BsIjd zfr!_svd^0MmBy#RyXrShpL~k000CcNklk)&PRJtIowb_FOo$ z7wD*CHHIy$(MZ*)U5e6YR{~fA(Mz>D_CbP~fFzUoRr^yr0IPM+F!i0(jD`J_RFPU; zxj_e03w8ig4F>8#0b<%L+O~t>-k#vt2I;4@XdrNH3Aj;WScU2oUg)#4wJo4%!L$q~zM>;__7AM}6(*W^aCR1n%}L(O>Bmsa2~_)v6p@9$*`3I<0IlbKfee zaz8q3f;Y1q68Aa3TDeOzC56o7_p*Q3^@xq+HP4lpt`!=Mj^qFi+5ZOOS?ig_2}aOr zA5C90LSD_Yg&#!c0yA)!B@6ur;%%3M6f-S2Qf{h75(HRDH-oZTyL8R6uoO{gaZQ2Y z)>*&kP1QZbtuoSo{BL;U85sI&&>voEU6>83s!mUY42433;4y*<#8Pg>a;vasp)uR2 zGk~SNvKy-4Qfb8UUumOtb4oXGD+u~c(>kF&OPbo4DbmXZEyKKyb$HlB@E!eNh$&9q zdVyd^LX7IDc9i4*{&O`16~#r>*Wi&H!2h#SQDU56R-VM@_vcnv~X)cY@NDrfJj=1KaX3wIXT^*6`2*Kb_ez ze|F7Gc~+~RkPpcLtigy{yXLq}IRV)evC>IPluLYSZmBfono6_qoxAk(B~m=ZGfq3F)OaML`wl~ zEl94MrE9dt(n|rZF+eI!P6}|PYqZAFO98GiKq^g63UH-sw8qk_ z8o)JH?lp#-{|5j7|NnFza_ay900v1!K~w_(e)Y-X+OguP00000NkvXXu0mjf#%nxy literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f035588a346b931974f0370ee7488c70a00ec7 GIT binary patch literal 5241 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..666179c4e16e58e6f7885ed66781b9957edec4dc GIT binary patch literal 7989 zcmYkBWmHssw8n=TxmI&vSl_RBp7AQ!HJ5xLGZeT3f!lJX!nf@p~=*@8V*&q~Ff>9HHKzlN=#$ zhl9w0zt}SVGEfi z@?FZa7*N79vn{&1q$nB2F2?l%wZMsI=de0~v>jR1#sE~y3j)i9m#_M;BnWHw4*9h)8Bl1& zP31_R&_cSY2TUY7vwd;z% zp4B|bdc>@0Zm9kj>PXzCM>-J_w!J0EFPfo11vnW8n;16{zHFg?*^KG4Pcl}Exfzx9rOTSYh+?;4r8DPY3>mUe7=fv zOZ<*L@;(UiAU6_Sn=sM(w;%quh5mK22;q39ol@ALO{T?h&SA}MJRg>ehkV0@1@`CX z#8D3bg?sF82~1)qf@1dsghu`EjlSSt21Wie(&-A-ZeOW071P?(6T74kJ1902JChf? zyEA*{#X#?MdFQ#2|lA*`m_*hVAaQ&!j+5zJMv<)S}j~vjeXwC zY{Z-FVaNMK!;e8P^9TtS>*bf>{GzYCV?Kg5DIwYzF}ETp{@FQ&o{fW|4-mGbB8r$D z&`fEjsElbUW}L=b;=jA#hKL`>K?LV3R1$C?#+Z1@*LjatXG{H-5t*XpT=rGC$4vj_ z-ulDql-kb0rsyTT4TH)m_DQ(?VUvlpiX-j$BED8vq*dQ0Ox_q*>$wc+hO5X;9@L%` zbpiWSx17Dv;60F}i}Iz;YjzG~nshpw4y|U(Zt-bpfQD;hv_|>P!==bbq@FL7JoWk_ z?y%GeF$@!zq!ab;d<54sdExRLT&8nv2)#8s?bHaz*^d6J%*$6?Fn?NeY#3;nIjfi)*6O0s=ye>si$w1t_N5S6*_TIH;HW2X!e7PgTZa#ik z;g<~!MRY8{OlR-BpA0WBg|<$hr&Ps~Th?$w^6d_5oLu>CC6P8Z@gF46ez z(xmS9tSer;C$~bIokCvLTUDMHr{$Z~>tF1@W%HSZ5NKTciJ)9tIC&%zLhq7~c6ubq zYkHM#zDVKrMIe7_>u=0l$)|Yj7H)oRCUOPV@o2~LXklU;FRlNola%&57Qw29xNK~% z@oYq-@*l*K{ct~j-d;hxH%Yru_*b%vpP=9Yx9d!->vq!2|Cq~v)ji?s=D5J=g!(q& z?;cG3BV~itUu}j%T&0XCgq?>4vC)Yr3v43XqZh0r9Zwm~Cq~3ekJ*+_s=b~))6dw2 zQ5a$cy%qW(g&&$ngn2(H`z2wYNwbbW=*eC=*()mUweKK-4QQva@4_^(qo&BxKga&7 zn^9(Hgj;zIW#E=tiG?tcJHHSFHZYj%#RO96a4P1K8ly(A7ucMpSwPf>=^hB?4~Qi= zHWjQ2{s>8hnoh`s%!bN7C!KCJe#^7@Q%_y1X)afy%DzGD>onn>eb!qUNvKA6|jD?+^Qh9tAhpT9^19FUEeDWG6*Uv9Wc$ps!@HhZ zSCEE*)51l?Y4Kk)_DavQn#J;vAG-!R+=5pIL2QMc}6UK@j$kho2dDE7uf7fH!)LH^0QwJfLi=+4`fyR06`fen59ScK)j zwu&8P!`|y38Z{=M?TPai9{_aX-<)W8F<4#bxOieco^;^65TUA5HsuSn35sjfVkGm| z7A(B&DNhyMOP-NGDzA#FO5dz~S`(>s`?7Su4DY2wOV~7qV{KWD!5?#tH`Tg5w^VCE z!t5V2?6N~X|IlkVffeC!B-2DZnZ*Z#Ad*BVh}Aqkyk3@YUE^g^K!nNmUR!%!m4>-0 zgpZTVY4?Y`@c4PZEZ(j#->dG*(Vn;wQIjk`V0`_@d`qB6Z=hWau!X?Y zST@)iBI+A;4VBcyEt(U<1kdZdfo^=R-?Y@uJ$CI&QmCK^xWH7%&a`Sa*B~q;9#H<- zx||GQt=P%-6BK_@5!^-dZgmi!>96?uMb^(3UNKqIucsbA%Mv!s&1PLdhJ`P#rrX2!VRKo&>ddU3^_{$| z_5@hD42XIYL+RLbPiLzkIhmwheRorqn0-W$dlD_eAs^K3+7%VR+xbyfk0YIx`)OyY zu&mN=_JfQ1%A1|?nSYTXPmfAZ3Wi&*2Fxog~iozS}^*TLD!TwoSEHxrweqJ|0>SUkrN zXaDSu=-~La;?c94Q>L5d^(47$JL$uxi!^&6O6xhxO_8ZK9F+YcW!U2`zP2{q0U~o? zlLudQuJT?G94a?D9vS@hyD!==*CL+QmS9arSHD8WJP-iVBv&!B47GuBv$5Kp{iw9{ z+fu^*TOi*alGg`H;c%)Sg=HD3i1^Si+H-nH0BU2icDM~1reA;bE9viqZIU$1^J%gc zDij?HeE;sbBdUDC)8an9-7JAC*tiz3DA6x)09vC$@NlSg{h?qpaVb^BEqWtH9F`5W z#Yeu#HmJf88Re)Sd@OzL2R8eJriKe#mPzu)aMEPu@myNU>L2Km+yCr&HabSvw^w=7 z#;XbD=wt4E$ZWK>1nWIX*O*!)Cfd|OF8{_|S`Ui4@AyalYb8(jLj&Cp&4TElpS(iN zYDYxMTpZ2_|0{)AJ(jXDK#``AQ+}d}5Q~9WqvDxaO)t(D^4)=YQb8s^AV%KLq%^%x zJ@rYk?Mo&xhx^4vXrk!Hb$U}gINtPm>AW-9;%HRT+b>~#wbPW??obuYs?JSB;I9IW z@>V$IZEC-rVh(+#$wx6vdQ<3AEL(xg#(nwC*{#c~=jzdIHn;jV2AKMd)A4U=#ly_Vt{{$6q!&T)FzN zxn|Nnj$f*0ct3|N5~4?6piG7o0s+TFVr6j(W7N^|piGF+O=*YWGJr%JH_!ujQ^%J` zCYOs{4|z~=Lp!;|-zE{0Dya0z&ezA6x>_ImGEP&^$Tilh%p))?`%~#VpTk4z@ipvT z=}ZXaJMisO0hj5KtzBa5p91Ci93fdR132&ov5+S%b~)Vn2xtAklbRhfN9(;Sy7Q9) z(_+GjA(zu@o2F%R)<^_Pb%kzlB$^8kRbIBMLKU_%YJWmKNkD^%6b{74bWBr9{4~UZ zOT>%{3Zlkse&aZBdjd!MxeyZl&D~SE(0`{6X8!ZdzT^Po`KWFbx2j_u$^7Q>4gZfR zpxXCOn`ULg&BDJE_S+rqfr#I3VU!Phz$DX2ol9%=7ZVnZ*q<0s9R#`j$LW%Me@vrT zcZTp<*C@fHQKL~NtwN05_>;2OUWu8;El-+rM#u+iUE&h64<`MNRYi>9%WK&U*#JVqh~=)Lc^7=!nO{ zTxWg0;fT9mIbA;N9={@nee569#9UhL{ z)8iC2{5|Nq&OYSO$_1DRu6GLQeB)LOPf}v)`0hKBS}my7lp`v-uu>0?qeA`Q~`vbb~PY0`@Vd zIk5+oFctnu_ZuiyfAX!@%)2cg*K#OWrJ-HV`j7oPU)w|Fyv0!u!l^smSVOm-23Y;@ zkZ$oIXBT;?6Ey#T? z%h>DqS&>2C>65IjGS;99{KGX=os+f?vY43?9-cZD2sM^k*+042x7tz8#@65?-DAOFmFDw%s{E~z4!z~mzP!hVTK8F~~zuyXl zxy-)AnaK$P1*=|M5^k2XLB@jr!8jGy&WEk|ZGn%~Jf5XL$k>X8;w4NQ)ZOS_Gx+hu zj(ub+PT|Fuu0QUR*fd<38B44w-&iawyi!T9KhvwF^x69IhDEG+{j!Xrd%!*CX|_(c z99W`LnC0kmotZcjm9<|>Q47H9tW|5cZkh^Ue;}{C541Mwy-7zpyUt-P<+SGkfr#*t zx|#*jwy(;HKw1zZX7daMrf4ByVMt1@L*rd_5m$w7Az+hO;ECUFYJOj}F`O*)0kr$g zf&L)xfX{g{b&U$^{S1cVK!Nw=+`Ep-Fsy9@#}8kSLb=2MEQEL2Oo7U@gp8KU$Z9AC z8jgUL(?MN<$FGI?tO+@$ZPr6@!g?qAq&i}v?R#dYy6BdG3fishO5=hv`)|){#_~xZ zwtfLJ>CDv)!ltefcgor)LW}R-d~s#UfbFzYFwDZe39FMkXgZV$DR=l zYBwThpQ_o$`>gr*$B0+^S}p`yH@xIfRWeolqW1~-XU{L(S^NO|@<62vD8x7DL-!KJUXZ*(gqR-5D+%Fi>4ks}#z%>&#XP}VS@|~dJaI-w$R*Ntb z7P=$Tu3hj>9HwlX6ynyv=02Xt=|AuR23vZ)QhE3W@$2IkT<+jX?M7!lf-|i_+tIe2 zW7UNd)7a>D-z&s(z(}ADTpBaWl!m^H(d&~_E>c%C66vC#wlhfre@1jx1Wxb>c84jQ zu4a1{x zV~t~?b8R;Y#;lxK+YriFS5gcd`U=}7s+zL%!w9;&HL(@qopC%-%$D|Yd{a^7ftA2j zS8;R>hdsmhJp1P>Z^V(eKv*h=4*T$`Nq zy?k9o1jxhY4VSbsa~qG{?Y3Pfbs>8c;0o@#&>2Oh#f$7kgB% zMMeoZf*YRxGNn>JY>8%aIhW9TWIN3kB3geS`KM&dkzJ8XDO{^kxhy3IOzti`e)p#r zUG0L_Ks_Uv3=XEGqykoIsKHQO139_BWV`x80IY>S&d(vs%l; z2{s7zDpzFxtc{uZEFZZIJcv~1P;nSud3GL(VIe2di*w2Hmw-qhwjEk+d5dzd|M=qr zgBbBV9@Bg{6vlLYHP&uA8Fe@b0C|6!u*%5zhuf%I>Ey2okjl%< z)L?t5I#iiMaz%*0%HWeO_o;fr`p-U**UZro4R3CYUcV7LJni7o_1Y88Hom$ z95KyueDrSl12$qg%|^Tw8^wMT-SS@d``+BL&D6eLL+uAyJcBv!*If= zOHKM<+Lu!}=RVAv3X+NYnT_xFz2}5$oB{!>DW3%M-Xct%Bc3v1bl=;F_|U{TnWs%4 z8`f-BW;8xVs8IAc7PSj{k~^|hIv}x(ShaO%M&lHkU;q#^PGJ}xRMJ*i&CN=Hh7Au% z%b)sQVDN62?l*+VBlc&>79V?J!RvComH3hmSLIp)H>TolZUAVa;0@i1dA6Za3Gy9A zgkkf}rBuWQ%DZTp+v>8}yKcy}kvH_ud+9lbx5y3-@65;UQv@LG0@Okyz9qByd;u{< za^Kj7%%V!4`BTwLV~Q+dRN(7pkPlNNN=YDU*!=SEE2QigQPbSCQ*^l#skM>UsCdF1 zBUnY$rdUwFM!3_Ue*@ehceoQ!^25p^lW$MS7GK|$frI}(PjCp{1Bn52Y(o(|KSPTmS^ls#D-tx^;-0;2*QthCqY_M98Lx)W)r8|Pvz5Up||U5N*uZx<`jy0sRx@N8ZKtpO*k~t<-g+*E$O-6rE{BMUaw9gJJL{+w4t6HDG@d9 z^nrR|SbCy`ca^Vg$PG#C`h#&^^mx%l$k@Tw__JuuA3|d{EP4H+ze}hP&FCAEXa=4`tLuPep+55vI9hK6TcSu<3=HERP z@S#rEOzpwhw-QoPd1a9^`u?x(P?j{rh3d59Ez~{ZHgIq8t!L`D%Cu2O2~B*w(1O^Y z6SN=-ZK<&43AOKluqdq=uYmRvXS8!X=>#wmCnw*@}f3p;D$Z*Iw+^oB8 zpha4g&#)^{R;88T3aM?Ir{@abzdebZ30LxVa%Q$jZ!Ql`o=IwH$|3$?QVEv;fcSX^ zQ!A0pKun}`^h9oneZFwux$}v$+n~A(=zC#$eFZjt7P%hTrH)3OoZ zB#U@%WLk0#Z3N``6_7iBj$nrf&$WRo%m%XOxf*tfDy-w#G#F{f#Utyu!EMW}=DfkfFd1Lqf&!-m-AW^-~G5Fu# zYUI0!n`hM_TvK*;w^iO`7Xq}`aiOJB>b|Zz*&2YQs;RYLhVu#2s8L~Yb35HUL(W>9 z-?4Tq8=@QZdKB6L6BWM)_9P*Phvq``$cq^E-RztgaGExLkvdhPF!vIl4xz_WmXBOTW3^_S z266SvC9l%!UOVJarL+Gm=q~hh>n0?L334mdo{?^;Ynd)>XWzC1v4yvO)ngsbrWZG6 z@bz2^B`;3!8Zi*PF~zL?ARa<%J!uKm2sOr;LeR0G`InC_Vf|*%+f4ByL8{l~ky4}x zsWRa*`*ml=ryxMpew`rYmSOsWvgqMk5ArUVuToT3WGlj$%JhW0jMz&;x=c^3P%Eb^Yr<8+SqhA@t+^^U^A?@j}Ae3^Ck?9 z&AD>M5y`pT_Tj4(0kpvA{3UjA{V`Xa5z~(!% zm3JkZqv>x(`52oFc>^C>W_h!WD``eUq@Rap#ZIZ$Ov(TP6O{4i8z$s8CpPHG5Ac~h z-f3izuD>{sbL6AW{Cj45`cu|xGe);VC4hJANo3}V9Iv~OS$C3uY&M}LT37p z=|;+jgHAXV$?F(5Q;$P=sHEbIrSOOv6e^{CLsHsZwrG$nZV>l3edul<;PZs-@bESH zqpfJ9c+`XPQtiX)G)uei;rY*)jC;5G6w3P;%T{kHa98@zTQxe8X@atCV3^l}c5fzl z9-%IqKdE!vk0;J<;*)+BkMu5ed~%K9f08a^0X=B7B1gz>*-zGPY`y|@I)D9tkRriirCOF$(Wj|$M6)~Cq{~#tONOphJSA(s*;vsoxD}#{{a1bJ@o(p literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..aaf36f3c6bf4682c26483300d41b7482412bae94 GIT binary patch literal 3254 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..40018a38f5107e54f6a1a24d7df12579d2822d27 GIT binary patch literal 6945 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 z z_ZA;#$C$7gNR{z=kk(XoGKfW+(Dj>UIF0zCn|1eVszA4+KZxD!vlcr4d0WUtWenECkhJ-Ay_+(S%i9lA%Y~0w%E)t*V6yE|w~rGB#)Y zew@X(F%;h$zse|f_&!lr4^~6sp`v|UNqs+t+x|2_x6HlM%P7KEEc9u2$0B5ojq?c7 zMk)If*5^W@Df>#$i^8OrSKt{vOB1=4H{|g>zu2lL@SnsZcyCe`30fib?_0=gMt?sB zZOmGIjKZ?s$uGoLvTMg){sa=0W9T3*37yjUc_gR907@PEtZ}X=gLLy?NPc|32RZ63>a<1$fPZmj#dd-k_WLD@Bv<7Zc z0e%ygP~aA!GOdPr>~ihyJT^xiv|IaU2@@)PAMuQeGFAki zsgGTv&~og61d1RmCKilTg$T%4#OTF#r>7=w4w`OK=uacK0dFjkFPE!Jf{V}8 zlIC52IUH5_NW;A_CAc?j?qsFDfQ!``7`DIH10yZ0)J!bZ5sjzL&I?Jq{!eFqzhH-I^1u!rt3407NJH%)0O9g zLfFr1!zEhfLE7v+I~c9og15I;%Zq`M{^+N8lD}x~Hw?}xsC+Z6bYt`=2*5Zc&Gat# zh50vf7$&RrkXZDAMkoiC@W?*XOu@Aj_D4ns2fFNq?<`et0b00@-bph6Ys{)mF)D)| zcwOF@*BYi(c0)sv*TpEjRAz2AC8WdHGwZthlia{JU-h`{<~YH|(bv=-Oj`}d`AU`u z^hOQ$!&B$W46{xAZ+epazX;$NdtJk0pFHy?wqZ8T@2jh@U~gGhtBw;B8iK~@x8HBo zK20qBrCgX?Z}4ucpXW=Esb3qtb?ad4Dwj@Xc&^oR9FU zLxQpWYxQ?j3p)UWCmx;u<^Z56QzCIM#tv+j0gfI^&Smb*2W7_yXXRNNu4MCG>v2qv zk3wTt#JA>7O*s+^jJpW3Vl+@m&|d`EH*C(k{k3d- z7;S8qKY;Xe@b{`S#%?R=_(L1s`2Io`xVlpVD)M^N_5>wgCOc3umQ7^9H9M2N^@1Z_ z!1&jzu?i>68!qQe=c3WdLu*OXUmdgt>_JHlnF91sg34>2+%S6v(_~)3g$1en{b7B> zxoH@t>Ee;r1IF`~{b%kLHbO)hT{d6AV3HvRSsz>~=uzPg;pItz!f%fS-$^pe1lP+P zll7jMV9rzLcSw#DY06vdJoz$N21-l6tUxeqii!W#r~O9hVkhLc6Rz8JHc%J_Nv2Uu zf+x0ASwE^~@LV|xRSo4qBFtLcOQ*Q6pigOIG=vFac{$Ol9?`H}@_=eI1DeafBf7ja zhw6cpQ&!uR(mrjt!p)h!R=ky2ZiD`v5~DS;)Vy-U{=@4%Cnir`OgOHQBjKW#65#5fSwiY`HdUd4h8H%d_yWdRwotmlk3ecFD7Q_A5HJ z2fC3QoHEwPMnCLWC9=#UuA{ITY1)n5y$J{hQzbc=fAJ7|l%MQpE#50?|I4Qy$@H9u z1+Q^l1UKW=e@-J+73S{V135U08wTKTwR5IudTyFSOWTLhDiwe5RcHmhK#_Td82zV? z`5h-fg)c7j?}bpf?_Z2+U!-98TpPONhdb&X$q#4?ZGqH1E~}{Y9glb*`i=-!t4=(S zo&}Sp2?eHLc>wO1$bxP9jdtp7C;L-+I1`1Ern>3QP7nD;}FsO}#lE9)p#D}W;Z4@A}+=>Px# literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcac433e1750a80e160059ddc2134546dcb1b8e GIT binary patch literal 7699 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5a3d8447f2ff3c9457f66d555b280f1231fbf3 GIT binary patch literal 109349 zcmZ^L1z3}N`~MhIhSUZK9HbisF#r*SjV>h(q(f0U1*FE5Qlv{kLIDMX6p$Q(NJvRY zGeD$abZ&cokLUfL_ju0U|K)Wl7xVMn&;7kSzI$Y#r^#@P^B4pIVbIo6GlD>1;Eyl} z{3!SjhWpe*2m}GqR#U#}N3~o><2%!yl2@rr2r6lPV|)B-%~ICN;CaRKy}hQrrk=Vu z6`XNzYsY1MU)*Z&jz7ljKH-_XLR_m(Y3s=}X~>4|thOKDG&TIQlBmF${yjYK3i~O< z>Hqg9`}-i;PAiZPLIp=dpokC%?5`j5FH+IcpjY(I{t^23FaP`;ixovc+#xVn{qO(( zKOf1nxKFr4okXrjs9F+7dVI!Uosk0f5 z=1{(;Jo0Wg9bX3gVwx0LDR5m{*;bV z{32LIqiAYtrZXMk|I#Na_|^CZONTF1#q58~{tq@at-D!&K!#Wt=>7+rg2lf69+2hE zaN+;KCelyW5j=w=YVH)Chf;)v$CT~tzEw)@o()1-!`mawC@r1 z9BDbyh(mRk6OoJ4$O86U35U(Sk&^Oa6xz1;TbR1VEx1&5!>FQREQD zA0(P}+=^s^8k^hy2T_Ea ziM%_6>j}FPr3SVuPlgmUP`RV6-!W1iFE#ezE6_xhAC)Lk5(Qw4&!HeujW0(ji3YRC z?X7!2xSs!EMk&(+-AROI3za+kt}~@f=S8tiT%f7h~pL^OWU_#Z@( za$_DK(U=ovlrlX~os83LrgGPEcczr-JPo#qhXo|sR>Dn5bQi`Lqy`ezXbGnzYRMu; zTnCRgliQ3^rvAEilUe<1#l5nuf2Gj?(d7p!K%J%R%IoQkIU!xXLe zZCx&i#iw>XN}>_MJsB$?GZCi(!YG*Gib1DVfQKYpyv#;Plmj|Ga+C&L*;;BvN%Rw~ zw+kIeRP}2NB~cpTp1N(2(^$y>$~evS1kFAOa;pAunUj(z0y=Ka4syCs>PAVFOzVB` z3P`m1YZoQaL*btBZIIJcselLyPM2fRse>S=w;PsuD2NvGLdPv>Ku&4PFqA}VXuX3N zK%$x*RFvvV5a=QOl!H`vKNX}jw+X#$8eI>_7UW#S-#OJ^`c@l_mP!E?|H$naDhkCP zN=NIbOhV>q?HMWk_D~esZT1Ibp5ac+|M)Ni9XmS>nMdAbq^5jqG`eUOqt{emZB^`L@NaS)=1@`_m;;mD=kou}!I^y6L6RF6BnaAV^KUh`K0~{8YETYx zpq}~T-$Af}k9poK6Vx{bMVfz`9rlx84~`2|8s2~ydI|C|D6H}5Lp06{ zj3xLxAwT{daU1v$^8q{{ha}cG$iFG(qp;*T1PvPKrV{_RxnZkW#FWYIkfceWI2Z-+ z0`}YtBMthGE~oFpRB6iWvrjz@p}g(7$>C z^S9zyDIUU(J@*rI?9aN6I#4`B9w~Os5`4&_cN_-=kO}Mg6Gnrs>Y^#209GT!ZYqJm z<ex3dVm4rP znzWW1Cqx01#h!b`1Io1fm;(jyB#YSX5fHfXAx?|}cpB^ZiVKu!H(db*@C~z=Lp2E8 z`W#15^X7|SOJ8wzE7Lrc4)00R^y>IbW+91kR|% zU#0+xV&CL~wt20Kb%6qSjyeBw8VH=d8c*TU#dxucxu9*{>pCv}?^Fw0ip)3g2Z8gq z;;&LrWXGP&1MM-ni_L)ocn+C=)f5CSddHhk0GY6kd7wR(cd-{x080`1zlzbT%c1e+ z6hIp6n>^4S2f8>GD1he>`R1G;a5X93`rp8L6m~HWw8!nPKg20QOfXCSBv^@FUCWKX zMFEt;p5y^z;qh)x2TCAw{!9r7-1rcGmjcL(b>#U2lw%xA?ykNvtJH{u)?=Ufr9C_x_XO zP&8W5ezl3SM9;-p*DJx@3HdJou=tozt}J`^kfuKI%oK(bPh(64ZcE`qBS6d<07KVa^2 z7%KR2rzA)At8L(osFv?>E+(8Kof^4QJ}06VES!aA%bhQCmPEJou>HuX;NUI4qLpJ~ zM<~^Hc-Q&GF3?uTKlO^9ZsPggBp2Cmn&O3v4)#jU%4y}2U)B(^l|r3Gq1+19lAo2> zZsg_tuyML#7CUA5-o@%`Nl`LOZ@ad`_ElbIRe4th$@dwwqe->Fa?&{Hb- zQySPVgxE1P9=7Yt7e5CFMimUI7R`w>HJLt8cQ%?s9Ssa*D6QhdtV_Z{fV`u9NiAL22P74Qa zdAsE6{;1_Tyms9=Ucy6+V9=ItZwp{~FoXK+-q3OX^fEi}o)dRK=-=DMNRehSalt2M z`BOH<1ZlDa)BD((!dHBOoUKYAamx)zeMKtjv^i^0GKE(^09G+kmq^{cQsfg0V>G?X zFK6x~@1ZB*u#@!*2F-o?8-FI2);QQ>IJxUZr7yM>I<69UOHDhF-8P_KMM14Xa9G@k z`@wyG{$oZqY+p9NI;zJ?`mo1p)4es~ca73=N0wW}w7!2IIVt}*VENYRkVN=ITmnQ% z^5*2~hwaEqB6L$VJccdzn9^s(Zt*+oTNpgPoAIRedg)W2Tct1Kc*XeBPT<%}aidA`kq>`@E zVXTj)_``Ta?|v~I|A>^I$xzpVE!nln)`F?&^oUZ5scJ0mcUvnT5kD)3c~YoqgC4g2 zrkvpEFkzaOn5pEag=H%pW!&ddo5X+Elv;&76p@Io?7m}u+uHNq-2JsG$B_Y!k*bvN zWK$lB&RA-C_%>>l97)I<9G zye0z979Bt0su6|ic^<3SvBYZ6^GW^2gKNxehSs=J zrW*5iEbr?CV5(OJn^?4hYFUy^n3p~%oDXFQs>F<|rd<*r}R4?U}&b8!~ z&lm4$ZxrA0G1Q64-An*zmi=_P^4+z{W7#(sWxaXmye7WOCWn1&Pbe#NpUgN$WBKIu zD`xs@B8+XHIOjgAzINJ9D*ae=$EW@D`-sgQzrO2sCifIXhR?3tdFm82{3&DKCQ^B_ z2X+!?lXP%0i{{*a8ZBY@yTt>;-%@5AGZR-ecJa!E71)4;#zX`SJ`H z&&cC@edh={Cfz@5nw2Iv!sjnG5AAUY&n^-{rhOR0ZN)OZR8LbYWzGPSqa$i}~3jlABw!7u#09+|XP9PKV7d~u#Ry(z+!epMF|&SEbT+W#S9GvP>5#(B5$ zoo(AokD~0S#;-^--tIHp%Ss5$82VyIES5d{Y*4@htFZm;%;_rows;qT9lIz}^p~C^ z0Se_Bn#pPJ_T&j+$6HRs{1_>j9XanR|HH;6v+zBGc2mU^hivD|c9};$6X{RG(SN}A zhKEYE;+&eBL!@Ag>e)w6G;`M;t>UBmRR}L$&c5dU$Vk^eFD>GVSG~m^50CL8ygU8^ zoq?vfr27q3`l1MQMYhkipr{qZR4E^mO(E+M-w!q80;PnXZ2}1{Q>$X-&DFb8K3n`> ze$KD^!#xJsid8?w+wm50$U~iVp~TRHNlV60F1n2hUyK0=vYDaeedBWOF2+{y~QmF+t(SAAJ1L#NRd;#MV@Q^Hu+|ry0(UC!}5} zx@BJu;>h=O$1ql^fofXqDldrq_1^fw- zb#Ff?2xPq^An#ex*|_oJm>FRT%n~Eq3|1zFf?V_rn(q^b7!Ai4T~O?u(TFbD=AIOF zwToWIFOLr8o=b1x=GJQ*f!0_^L?Cz=oYcJ(ElrHq3_F+k&6Ll!_$e&) zxY7C^_5_Z;GwGL&GW;vmJQ{(P^yC!IHl2BR`B%d$UkRJi6Z-soX83R;3R z7r2vsw-nVUQgc;iY98Nb-tRMd9I3CP_w_D(H~wrM+?#oZ@K}IJx8~7KiWYA|0$M7( zq(1fb*}Bei;*Wg0rM^VjbQnJo?ThKIw73QQ)eErP^nLfeq|KXox1^F(SQ%?ka_p~; zj)j0h?09wV)!658f6f$=MGPX*OoG(}G2Gjerh73O-eZk;mv7@$Y0WjGLp7DYyF7%6 znejei0Opj%;XO4n%J2s{j6)J*@i-n(K3^{ZBJ)*!k;4xBVd_pp%t` zV0~F%7gVP12jA4l%|kXSd_C9ft3Ps6qNF*S#)`LK+~2)5i1($|V2$h$!Jja~^!2X> z*gPjTZ5gbRujmO4gH{Bp((#{_J+abe+Gf^f?q>65ku`#HmG^yHyw#KNE_>sQ_>~Pw zGWSn??ll=fVx|uRr1G2oz;61rT?-fd%KRO+T*TqA5-HxC$Vv8VD?!Ah7(a>7p&K@O zSy#few$JpED%|2*D&IGq`%Bn-2K>-_+Kx$EiwVa!esyfKC14T>E(*QIa68Ri#nt9Q zc|zCESN6G8!fgX<<7IUUOJ1YIuei8Evb?|{j^QwRCLhSt7orRHot^92;~Mu>2->AO zQ$o>!3P8l(pi}XL_}}>8tkA8;Gqc>t(7-TPN|g%F2{T{dtP(LUvqXm z1%GWb)=ej7qo%!Ha6dRKb98-FVn=ahVsC}Rop9)SY?2e|!zovaf4mrb$}N$wv#Dyt zJniAUvdgkCL3s1-?~dxx2k4-4f8;eC+zNmGOZVsLsG^pA$|l`tF?5TF$yH*PBEH5S zrw%MS$mnI>_|Z{*DGjqA*!C^h?C}~Vf9tW5?+E)+LF7h_Lr4I=a*{WCzFzR~u**AF z)n>(E+$9iyXs7<)vp)lYIVP!dL1g5g-8upiW1)&7-RkT*RI&T|0Do<5e0IX{An!*) z&Q8pPn|YFKk=C6eTtz2`lmM}icG8FF3S_+`e(il?Re3?OYK7eTbmkTHGqc2bNlOZt2a(TuO(+s_HU~}F(1I>KMUmNv;Y2I-!rd?kn zbmCjEZ|htPQO`0?&#E(r=-T9_5OBqFF6g!G@QA(TsfKcD^KyJAwYiLOzH0_Nvy-X56M)||%~r{-?*p4|RU zm^dr~>y)+lnUmzzhVGa6a_E>H#_=oay+lR#m>G_nR@|TPaQO`Ho!5Ey9&Hi$n*ZKB zndic$t$>R^oqA%!AR+n7d=E&TG696|(6NC-)nX@GjWmlmw(EkAF-D%pgEbGk>v$ia zxFD-l_yMxy!T2h^iz+Jk0^QTJWTS1eN1MxjM7S`)?Ab;v(}?T7dGKF80rUg@y4kMa z*w>))yiPDECP73oq*BJ$hQW26@Z!ipYyL(BiJv%r9sd%4?LaD+3kgJS)zDyKvx4;H z?-|P1^H;TC1{t3|HL~-*%n(IN>2c$ki^lf#xVpV-_^oS;U1iB1N4i7$SCbO>;poXV zn94$pDTe-5ywW9!XpN)^mqQB+4B3Qd#a9j3x}7(;b+OmY>jSVQ?6C4=BZiogS8!1{ zLK%*6iQ3Y=-%a8PU;nM`BF2wB5O&B9zA2#jD?wn?ZkWa+F{3@jGhKTUMDAu(u&L+0 z;2Z0{`efHp!i&*EH_PN@*0ocIujW8+GRUzOY${U2nsggE?Dj18DJ$=PtpBQ6e*i{yrcONxb<`trjAkFjS?IR>=QdzWvOC7HIoix>SxmB1G#U4>~J zqXzcWCQ7mb7Et#sN9aEh7D?==c7>fyC!$`2pmmV3scEXjfrW0vz~QLszK_@t*SMSd zq2hYXR`GA^E}(yPe8$KHDZljo)-fnzC^01Lz75;l>X4hKMw(el%yICoyP9#_kUNdE z#mGLj$;(HCV%M!=PrWb09a~MHI1{*j0cX)^1hWDRumV+$bw`@BO z<10QvMdv-(;^r)VWLc6tZiwHYUFbg|UQPf^JV(iNygGLZPu5Lz$6)u5w_TwgQ)`H! zmO(jWb$WEWRn9v9zL9ZU(4cQ-8j`>8NZ1S!(r_AP-ih&(c6*B|LwqC3IJg*l29V1L zbBrOKOTAyz7d{4TTBXjWCi`#te#YFoyrI-vn2rRbyM7y?qch13C!;I|$EBoI*4BWF@On>|0z&`ppI3=XM z!uJR`>mVRNR;R(Z&S7@yB6lzX7UVo{{+DDnK-WoU<;e;Q{I2Urx9Hr-xF}-AmtG^dT2kqw4r1 zHLn6{aLn!u;SHG`mDGhR>YvIA*v@)%kI0E~8~mWL{Q4VLY6exa-0v@_%x|z12+DkW zLD&nCe;ymR$Ul^5z{`{JMMTJVtn%Z@_Zin6=P(CvZqYP6``X(^*SpTp_La1ViUL$- z0#Ft5KLmbXK{(_yAY23aJtQV5!21(Jn*Ha2q>Gi?m3vthN!Rto>l(X@wiF1FK!6Ss zC_i7dmi0V-Ox${;2Q{Jnl$*-tW=a@}fAhhZt-Srr58{908JKHlp*y|gu5J?J6~WXc z24+5hciE97j@JMi)kX>!&BO6F{A~FcGR}X;D$&02;-n8KBDQUNThRv*znvfimIhl? zYM?UMJ%5?ZXK(?^wk9Z;aD+tkR3lvwXve5mBanb@)=X1$RB!tu1bH(-0p`tuwUCqM zeCF&Xv2hms%lhbFX(yPeMAP;wImtmBF^}8$V2&ych8WGYme(pnQql_h3ZgES$z63) z8Fi=kWiYFg-9@DIrzsj=gmA~RMc}Q!KL!kJ7%;GP3tR+y_9u0-zeVOoT;wF=SZuB?&R}sInAs;L2ivhYem*F<=Db8$IxC*&Tw-pszK#CJ4r?|QI)vI9 zqId3QDEc<-$A`G7$myDDoWj1DL&Y|Vdm6t&>^6_r3tiJ6AhG8nfcKHO44Sr+=>g2Y zEd%waLLa(|aX}usr?d&e-e`fo{Tf;Hb>9AQhwTsE@-SeZDK`qa|4V&&HfPy{alJ*7 zu{TrHZ=sBdGp{)GMU;M@o(@GfpgT@*Mw%yRgHn`-snk08sd?T5hK2LGh+IGQ4S}~+ zEY_swAC~pVX@m!kL1URX= ztlbg&MAz7>x7WiV$k?+V&j|6|OMOXp>II)hx1Ob5r~9HR*gcI)WI9CYih zPGS7^?ukSaasSxiZ9u~5yIz40nKMr`h9^aZj1t)Eh*E_*qAJT-7^~{7N8US%ZPWN7 z@(J$LWwFTqI~9>zcW$yN10BX!qNx7KUU&n<pUD)5=1bZ66k#8{#;mGg1 zV$a{B2~}-Mc)O|JtsUjm>u)9n6jDv@0A8nh!8$}#S?A<5%4U-0H@B_}JL*)a`Y_qT z6O8^_VIgnVV`H@0fYp9CK>^a8BHg(O<2Pi&Ao+@3#2T-wh*T(M))4rRK4Le^{%_T8B~Nlr&@qktE^PUP=hpNZ-}xk(q>c^mQ6 z=|sCF8`F!d|2@i(hHNCqMxM+`+@E)Kv_I~rD=xj~cQNkHeJqXVe?cm<2AmghHtfC+wL17sE4zJz3Ym(pVk5yc^uYrN@^^W+CJ zV!#*SHbbB zX6WE=X{sohQ72-tpXa@_$_!tpml<0;xrqn z&cwaWxU8D33Nxx9A=V1JP_p8kk`a5Tye&sue;?5NbRy2aQG7BVmvN*Z75HEi!Tibf zcR9HmKp$2qF@}7)M3~`(Y6>A<;_kjhu~x=^JL}-1?5Pj1kqdV)8!DDRF@ZWof&f3U zOpqt7^S7*?&;2Ttx;iLnj7ECy)(I#=j+07r(;^QK#dusZ9Zeehj<4YPq1%$z_D7o= zb#WQr2jClH>-T>s8$DKe9Ne;3R@|I90gVudYrbB=A-6$b1ZHpa%iYtC-sIJ~gHP1U z>=p!8m%FD?Tt^swVoC+A(;xkoet}wc#o9VHg4)_zU-6HK27cPmZ2fBo+~X)8m4$)e z^c$P=paE9x?Uqg%ivM5}{M}az3!eGd_QG4~<6P!*)k$|4*FGQcA~j=vaH8eUE)?jPO@ z{<;JzEOHx{FbHwK67uXw+ZAYd_;E+8e?%|?4d}z?BA|i3%Ry&4?KEamnTUF%K&>-XP%D!3I#zeVZX$+gsBY}@ z{*maTK{mdFd3#?U5EML?C-pnyzaqgWJ#J9`O27;cGyvh=U+>VA(>wEFX7IqpJf+Jr zsuie`9*^9Qo|@_*tJ+wi@D?ezM_+AL{hqL(v%6tOiEFCVnV3>0D)_QGpIR-Li0#g2 zjS#a^^{kGq^EUmIad5Qs?1WrkTB{CNiP-;L1H@>t%KBe=vZ?t1Fv5X3{{F4AQUZsZ zSxIcM+IIvt2t0s3m{RF!C6@KJ=9lto0%ayu`<=F9-=E+5eRUJdjO5tMrDwQA1pzA@ z1$byAlZ})n`G&p@8|ihCmg^>tH68#bqt51@ct|9Pd->^aTLWTJR7T;{Ax>a}sH(-QDK_U3KY=w+NzOX+vk2OF>(9n{Tl-rXzmR;$VWI>6!RHG0_z2c!TFZutXPEsmFoDLeg0fkz@>81aacs$qC z?pw0n^W-it<$0dUc3nu}i1~TQ3sg@k?X$nfW|)ol~M< z;ola6wXXp*-Z`CMm7e+S!b^5Itko#0!NBPW5-h^bz@KQ$VCa6-4C4MhOboe(1dNqREAbCsjJrMk z`-Uj?0Kq4^0y6rc&zcK*PsrL3bxESC6KJPxTOol-@Yn*rqt>+OK=;1e=c3LSh}q?h z-x?et=xelbt1htciYsTq&S`%n8txYb#3LPSO-)VW&9}jXoFg-4!LD~NH_77!g7yBB6o*YFJ(R?lk%X0I*mh0iRMyxQB9zd6%OhMGP3=V3>~N^Bxf~1s%7o@j2=MbL`&ht$%-y-&F!_%{GC`qU=u1K>NU&_RK=&*>{YUL zVCULg4#q1$l`hD^f$fAuB*~W-V(g`pLB4&ho#h{!PT&Sh@y}IQxKCCmxT}I5 z3>xpu<zla(StHlD#fJ5jk?`E3cq0;h&2#fJdeCmf|K%sLFX-?iT0-q`ql zDQUe|;L1;a1b|;S5Z8aKMGIcj3n4BmLueX!te-Mqbr9~`K~Wg6msSJ(xRdk-;8g%~ z8}aQu!o7saBDEMTA+QGJV_$zUB#1g|$-1-4dGfo%P3PW9H#ycm(loa!{zi;rv&YUz zcTEbR+~Vf!?h2RZqz+>3p6R2|1TFa0WXQrqR6~y?-BU1TB|Q(JV~Sa==|krs^`Ip$ z;zkc@+HqF9U<;y3qhYOBZAvAOuNVWp@`AT9V9+IjBbpbmsvEFf+W9%sE!!-=j#&X# zT&_zvG1~1C$QqUv7ey*^HHNO+6y?5GTprMMK<#XVB`x2lryF&#lnAg15K+XWjh2b_ zzE~;Q+KS(rvAMXsPQCDrR2L^dky=kXib)wWBKo|#F-+`vjl>kX!xx%Nz z86b6w7QB0D3tioFbH4PF6xBQ8P_>A$TmQ&u494Tun9vB0A>ICElSFOsP|>FnEN@w- zLt+3dci;PM-;Nt;j4zgLmQPhY0WuMI?benjzQO5B{y}Cn=dDxMCBE9em)LQP`lO6w z+mWSv+-Mp05p(-2Pvhb3p(u98P`I0kpGhbx;Ee{{-Hdsh8Mq>@WKprC}{h{Cb!V%^xG!-c%4IOqxboB&~4_$io#Y;n542cxSw91P`W( z{Jd!M3vp<6sn{*;D=ubg5R*{97!tIvx$qUWg|Cm44qPuvSlPrpvKg8KB<^!PR9)g+ zlR?fd?LhdH)G4@k#9=PL;69W@;9)$cVNm%gCbU~@mn&fJF{JKi3S*_UzJj09N3&*zE7POyY zidbKeFMj^m8IR*t38`5Fg5VHM8p(>pyROH66sh(HAGfzj54|1P)~zBPxD&9@he;wI zF!g2uO3S$L`y4y30RhqiDuN`s5POzrM-L#HP=0%W4#2q+QOsd~r4L6$^`ZdH+im0` z>D7f>xYz|ekkyMK@m|^VbG_M7DIVTNzBmhbz2iO99)0DZACX5QwglpFu`gDv$ZmOd zfD;#BkTNIO-3N#s-}lZuy#1)ITiIl3>_bMDv{V<1>d(PdNZFq8%s9~E6I!+N*y;Pw zFh^zXIN@3c7@ZlfgfQTBK+kBlUW|YW3!OQ4vMLRj_Ha=A3>@5a5dWgs{grE7!lqQ4 z88)HEms?XbKJGjh&bG$3dis*thf#?!?syFOazRE_j+3nB4~vX(q@U)fOH74A^=f{# zdO$$=hDt5|uEv1m1m+kLFpk_6nifpRgaxW~;SMhswEI4Os?f_l+ZgoN^Fml4^Cps? ze6GWA`WFB4sNh5G8MFCOm1VQFQ6=#F%FZykU>HP0j;I~36a8 zSaBcUW{Yy*SbDV|pJMAj*RxQTch@)f(4|RA0N3^adtdID=~HeVnsb9Z#Z5vTT`Yq} z?kl00qgKg-acgVFZG#V-jEIQABO;&pI6`xzE)u8H*2--*6=$x?(X7aA)wS=QbA&9{ zHl1g{3bI(!xQT}R=h80L6QPBCfY2%&L7h#e3yuPe*#!?UB3w|f-nINv3FBGTfFQFp z9j{C557BP$j|PXbr;Lz;Z%wav1S)PNI|V3;eyPO^?Pck9XPzv-fgu_cuvA18>S4@= z>(bjLR_SaAcg>hLtaRB3Y))(|Y;jg$aUVF!&s2(4=9dqVoFb=iYC^kG$Z{ujH^KJN z#~(G5NczazK+YU!r7;Z(0?Xibir(mFe@unUZt4y;6CSi{a8ZfoT1cwBq;G*Rg0`_|Om5 ziZaM3^PY#xDwprn;F3Zb!Ex`sSg`R>4MW}A5woG1v>^ClKkf6d+^{>2o0e*Gs-NXY zu15xFhDxp(t0}=e9esHW_ls1dUoUPWqbuh1;};?g%!s01(xZJm;WtAtJkT-QF@ahW z6oZ}BL>4z(JMuzKAKSFj&IL@ev*cNx>CtNdH?6m6qI$Jtwae<|!eW&`g;=(c3uyuh zwDY{l@{OB&861^j^(+sDRvxeHiFHg5jhSAL96$)$J1QHQ9C|a0GwlvH1(#`u9$wO7 z8?AEm`f6J>XSVfGHoTK0^wH-_yhI`L!dJ1VIzN%BqmR?0tzF#0;F{xnn`<)PTWX61x1m&7OFNk#}a_z=LtYSJRqgb{lV;a&rLqixF|b1R5v)bfF$m!CW? zZhb1lMdhtbEE4XG4WWCd@Sb#rjkwac@?&Ck;5z(>?<@A{wwFEefx9s)J6mj(Y@blU zFRl)Z#JgzLNsdVNOLj=M8(+Jp*)5os`Es!nUX!!q>XrU-6?xxR2>%t}j1STrs>=u? zvGZ?8&epj_-B&mk_|65YBrxwI@v-kx)Gn{;2eW*DSUw|dnyUa^joE*`I*QU=F?7^? zB-zLCt1Nvrm5}6d+I)K^8jq@Y>lA#r{ZQLVo0nFm;=l z(;{?Ve2Q7^SEpV(ppNhRja^tqZ`FO-O$-_?zWR<}bFSN|Qq0~j_>g=l=vLI0J*mQe z;yGhklMsj23Voo<(Ab4ofTnk^Ye@ras$lh)t*r<`2;UdJg-zhqdNc}*GiT&Qu5{~w zt(cK##hrnHo*JAykNR)h)TAuhDOth2ABE7B)o&%_Wyu-PE26&KqFTK1?Pjt3$dXvG zU>Dox7}FZbcgD{q!W2JS}!)PavmwXX-!4=FnkQ@77^;iD>ts)df`az+kl#I zm6{N#(8E5&N|)Cu74F9If#6Pon`#=|e|(6n43X-nO^{I#{*diU6K4O+`E_>eg3#g* z05jJ!XMG{cSSTw;QS$Lo8n*e8KE>U^=-YaB7k0iX;e%Zo<_rR_x;xdlDoT+sUrMEC zz+Uk@jB01y73v}CzpL{r)7yF!^7RPYUf}`ZF5nLbSmtt*SvF1qoFyHKd2)(0%J+`Rkl`z$ic@Nyi@zdzzMSN>Ovv0X?l&9u8D*A4% z;I^w2!E#B_xjZ!%ETwi<_mytGTWSqrCIfG_PF^ImTw7j|b{{3H^ouG3b+>39=4_}B z_}zFUC9ozrMK;iRIsRaLpq=go4|M!xtwl)9GnL1=xP(j2>khM3L2)LZ1uKMeAI8t+ zsbHQ|7A<*nm)^hhK2c-3<@~6mee&$m692o&V*FIal6VDb%NwW6>Ok<7mkZ8=yAS`m zp)u5sfebRcCkG62h`kxDqzllTlU&UR7h2`j@=-Dw6AgHN zBga>50_pd96pFWxchg1gAa;E$g-&gZa8-ml@(r(~pJ~?rw8GaUbYM3sJ?1j^Yq#j+ z6+TzNWIfcQ2(&Ofu9buUi#uMOchuNmM6utR6Un?2U$kGgW~C_H$!je592$){)*2T4 z{3$0-8S=hkRL{#cw2Q>o~C=uPKJ7re_#IJpDHv`uh`OA2~CUz17%gzneg zjQ|5{29+ha`Jq6&EK%I!3&USqw>W}tBu|YaHg}UpS`VLUf7bjkp`vsx$E^aR4^`q~ z@iCC2Cey5+A>Wt*MDKq&J$t*&_BNB*QnU1*Z4Yiy#O}8kLLxWl|Dd1hf0e}SBG(^) zQGz~JEBI$t013s`2n>aPaKD_E79Xy87{|wW(+tX17j~0qimrKFlQSI?XXaixLeLDw z$NOqdNq)E3o`6np&sUjZki(VK4cB&7=+}tg(qCk~)%iKC;5V5VRnGz9p|22KkOJ#t z%lYw`i56G(eLZ9Tt&A_M1yX7_x`B%6%eRf?oB(CG4LIFuCxw@U5MOvh7r` zw(pkPk5(CWc)j+DDLhPeiCsMvB^EdvSqpCKJyePcq9fsmsyqXLvDzN@xbJ5?GPrW3 za^6=a7`M~)0H3jZ@g*U1ZTttREOK(RDo!nstE}$Q^DjR{>vaZwIUj|7>FGPGwb|!) znN_vfuhb;@zdJ<_)k11l6B~Mz2JK|P%AFmiLepmZ^>b^#M!1 zcLKq6LQ^XBuaix8@%{@1N)gVn|DRUyJBi#EexI={-FyQj7!R=F2^?}1B8 zE~_8Ar-4mOvQa2N*Y*Hk)aJDvbYm2>>no_!cf<>g2k({)-~YKZx}YU;zvM9|t-5KH z!}_niD}x)*dgYPDG}OisEDy`1`=JOz#}2<#3eHx0u0i>eBx1&DfDV;NvP?n#L6$#> z>2*Vo`wioUE+>r!fze~5s_93378?l9W_)&b$1_m^Byc~Ado6E~1lC)7swVJ2-`+ci z=U%NK_Q-v;n!$9z3Um?&yc6-nqYxZz12=WGEY|7xp2?Sm9|zTXvrd;f9CT)n|9LO* zp$g;^O6*Qr;7%q)a|}fVe!a?_<}}1S4^~B@DhQZ)_o23Ms~zmfjL|fJvqCCiCBzUD z75h1tlEQ5t`WdH=>9K(|aI4@Eem6_Eu%0kTxL8Wi0$u}rLF52Xw#eYYqwXijW_VpT zV(h9e+u=m&?z3hppS0LPSIeUD$hFEo8?YzE0f%-5cvb@pYT<1{Fn{e3JMIt&V+eJF z?KQY}a!9~V*3*=+K49dTJ4E^|`E?ASQSE=%$MOP{zdb`(b6T>0Jh473;Be`H>l<+H zC9!bUP1lf&0%^ML5_SOJ;Dl9t0?&k##{Rem-m5JG=8sqEI5CYsALRb`cSUSHfV9ZL z!4sf)(Oiv~XQR^Gwb;f4-vpP&GOC5%XC>RS00SFOrO_4(_zLvE7rJ%10W z!@^9rDMAH_jpT|WR1h)bqJ)Ud9U`w%s`;sgq8VM6eO_JHuLKe5h3XUF`uT`?5Gu;a zNC8zZ>!L7sp5fP~Ru3)fZinq%o|PY&U%=!;6=|JAjf`X-$9}(a8?>`Nm_)uti;(Ze z+#8^92XviyNSr?@7SnfC18s7TGwA)!Tx4wyY4tW~tp_!L{J_ zqqdq-`44c3%Y5#lA*<}*CRXAaMqI}7h=7%^2bJksrJ2Oke>S}i`QlbHN-`r<>$483 zR&6@UR0pWRQ<9UWlD))%{YcI2O#L0aUnhUr+Rwyu033rNNvMqUbgIjGx&?hGx?;Ik zbc|;aVMiF2TMS8!Bm5>rg%QFIiH%$t4EF%Swg!0f^a1UIO}sAVKfyR|vXi7w#ikfni9i*Hql zX6(TLKLp!_bms@RAQzG`x=y`|;YKteiRTmOXisxVgCgva;9aAmqT89430D6Me2+~S zB`8!Az@5Dj0wY=C0C#w`dOg~EZm#wUIN^-hdOf%;BX!QotwJr;N%B8)akMCWZz4^- zWVG8Sy~ShR_kqMAhaVIoCx-pV!tKrS9h`^At28hHQ)k<3G3y__!TV9 zHG%tS;M?ZD0gQXi;pAi%9Y)9n>ZgtxfPx48jv*8DwA@LZM{IM2g#@32)o1u`#4MGu znz>-#ncV^24MzY^lyQSjW)cY#Nn;hj{`odNYL<2Ku}$g!e6!EE;N;{~xY5CrcwPVJH{jVt2XAxF&<0!m^){8g z<`4oOBGM^Gk=e?eT70Rb13EDc1gmXg$k#ou0a9dPw>iQhxo{C6-ANeTt+8*2Vt3Hp z_t#+?G-6BX{`sHTk-svZD}Lcj^O-AazjkLsAT@F@>IotiU=dLEdd6rAi`ypEEDZ=6*6G3Nnl5p59tVtYC2RD~5U|cnbxKz+r z5EoIEgx!jmGxt%lv4ate7ytC)+|Wp1@%bquQ+}w>_8D+E!WGUrik>upO)v0TU1VMo z1Cnxpw+U~7!(>d~X2Ky%Y$xNmApMel1AF*;$=5eGq3-DE84c8BZg&0`y)a~5HOa!2X~eNyirBHfT|jadj%j`ZTOH~cQHTA+FXddil;6w zXa3a-XjRxN+uNK_9l%6Ft{Bz2aB|) zDd9ix-we&@J_E38Hio3xrg*5Z z2sE+t6Wz4*d3DXC1e;18N*rAn<-pvYvWXhNibU`#p7SXu7OW^&59P;Ws z;VVkV^$@cZ(DpS;kwH^A662QYZn8Jp3;X+f1hc=uT1RZaG(k?{V#ULTU|N&xFmkHG zF1Tg`PN;^&^D=?C8v+NYybm2q!$4MZ3|*9Ay^PSLmy1*P$lDvpZy15&ibM?Q&TR}? zs-3)-wOK(%1^>|qWNvMQ1wLzK6gE3l;`n<~`Vbv*i6;$=YN|PQs&FpwDomQy;h^O< z-US#(PPXPJJY~tk3Kf?NSG~tsjrz`MF0>R0?Jg2pac{|o<-x1_ctcFlofd47=qMU0 z*!R~slU|-`1LOBgSluy_{A;ezFq0EJFnoCePC~E~)joSuDsKcO%Z&{-N%DW%+UE2m|Rcb`>t^GC9vksw++ZF_? zfj_@(3tPzo_n13AwvHdlm97-48pPZHD))T1@NTd*`5|j$F-yY=Y5Y;vTjJq%FrF;K zP6Edhi6{lwGKU}evZo|f*dSybWim)x1wMaKmCto*yN&)L7LB8IC+7Sj!s_o#_kT=X zc_5Ts+aF_k3=$$r_9aV}6h(-#?;_ckN(tHbEHf$*A$y3CNGMwrc~mMy!HC1e@9 zVV3(l)APRH_x;&Fn)|-bxz2U{wi8vye)kWmK8{A{e$3E?;!B~{?ovqTpOaV5+!b7# z(s^Id8P5KwO*!M;x9CHZ0da$h_4gyegU|q~iw~wADLIK1D>9)vb~OBlzs+wz%$&d+ z#XR0H(o<|uHS!-w;vW6G9&qD~mD_r>?aU}}Qgd1cA-x#Ch*hD!Uk~nunA=5%k?Wgv z_j(F=j^0%mC#h7UmUV$xM-H;|3j7d)r{+%UMq? zQ#GW9B(+HqEQRY48SVFL9ZNPgqj{19^e$jCo2l=&i=m^td-WpIyQclAx+&49vGd5n z$$jy!w4(r2e-#gEs6}45{Lc0V_|rl zrp`v=&_|K3Sf-OqeFWb&9}VAUo=Dz2m>qvQ?Jg5)mNI%>U#K%kiO26R^VAW6U=I5H!Wd^U-U+7VwO^@{FoLZTV0oDWl*oV-EO-v{FyW_oW|Jkroom4a%m5C&V`k2#01A4sSAm_iUw0%8PHC2 zO6&vU;5){kZj1+izNUy&5T3x~n7@a9jy~PLzkk+y0CnLD6f8u<60N|(AzT6{OtPaY zs_AN}#x%x#F6Y|c?}odK{4((Q2+WESeByH=%(Q*w;YxHM=yam;>A~U*fC)FEaUO7? znUztn*H$Tf`(Pe5ru!;hc+WcA-Nbp>GM41p|Ekd-mtwQt*oyV0N>R3J0th;GHK_Ob zh`UU*b}DM@=-tWRYDY6_Y&_2ye--?}0$+L0LHqL$gh^-(6*}F0@#6GgYMoR)D{T0m z^^@sr%_Mo=~CBzGh zWX1tSKq=*R_puX$@fu2qT1SIki~(qf)Wansjuk+i>UwypcEg547dBNcn1xOY)nuan z*V?jv9=;J9GJca5%SjT!+2#rX)x$a7(awAh2}EugG0Aw2HlzYZx|~X|rMq*D6R!Fp zl>hn(cxV_3qom@O{o5aVjGe;WE2>LG9oUW*LvL1kQF1_s40hcF`*ayM5MY0w%Xswf zCi6xr*o#Zscqg`B6*SX_i#BM|ULpv~JK+rHLia>+K_<6=KM6`C%js;R?py_2aL9;< zURK*H;@|^~7lzEJ;N88IssKX9_NCNIh>5im2zbm%3%&rca01!I?zp-HTGdpeN1u!ur_jdHa(4HF`-u7@7GN)cxj`Hm7Ppg8Hw zK@}-sq+l5|Lon!meORJw=X1OMS7QNORnxJ#G(C#H^yq-#(Mq;}WEKfkF3HbYCUAB+otXsdbbL<4J}Zxgd<86WP#99mN6u#lFwF zpz$_a7^-U4{eP0CzXQ|}AWryk`T2^w1|yI=*KC2JkkLZt>^}}Y(eLOyni0!WETo=( zYC4u0&mG!GRZ%y@#}L60l7rP#kC0K`BwU~iX==G)wsbf(WJ=b6C5GnWU7D+EukF9Q4;>*&`H`ee_Dz0HWYGPeyn?2XxUI{maLhn=ucJrsj0WP$VB;!eqypprxhPdP%imVMVKKhXpt_>^z){g)&jknpwng3Em=`0yCIzD2g1t-+$xHGHFZz~CAxFkCrYPY}%x#-Lt4`lVt>#h3 zl2O6L;H|KtL@IUDN#p?P?N4|fN!Gi+bN1)f1>Qsa&j0oz;K&}?{rIha;8fW7f%HS% z^ijbDzEj|1w`z<|!q|_;p)h@nZuhSP3DECWx-)9x3C4>x^v>fPk?83`(Xs@Yr8fU1 zUoC39JLCig#I)#xS~gl1>A^>$tEEnENJ?XDS8|S3U>a z&s<@JE1r7BKf<+hqgBM9k6IslAjiwfprJ&^3l0HGzxiTYc-3XC)VAWI2te0m+zz#! zOvZ?iOodxeWuw2Lt=I#gnhC4(Ye(}T+*UvG_wSo<{M($;v@U{qCmhFkLpT9Ux+{oV zN#p=8(zkG>l8TUKYkjP_Xxgp!-cX3z%6R4+o{N$+zr%2~m)G{2-H1vx5R{eFL2_wh z6qJDGFv3R{9mMu={cB12LZC+ZUpO!hjX5@ziQx`9J09o83f8f+DO`F{6@U@BuHX5W zjq-Qcl8Qg79OPt!P}2u|vU5?k3-1=`HN3VUP)qh6Z_j4-TcMB)IH#>8 zS5wh=NK052sdBhq=|6366dz(nKDpO-R4{Im3$pRo3l-9Bl|$^F!llTv#j2Qb?|zpR zGINDThS)8VEKxu-FZ=rl%#@X7L3!^YK=3VvrmtkTeJZ2a&Ec`>@sPJBQDu`b1v!Y| zIvq6grS^q$|E`4}D7Y;5;b;!rJYrACMO*{2&}I@e^Mi|4oTTlXhf<`sa&*jE>K}kF zrfx5o0M(Y*%;!Qi6vO=+PEJR6zGd~g-f)+Q-{{Jvs(mURY=x{)*Z=H5yR0c~P(~Oj z32y&ALWHsj&Su)O09G-96SAzL@n^62!44bdaREiy^gD$0$T7fA{P`X^Dv9``EBNKc z_cXP=#9hyproE9nSp^J;_8zQ$C7mglsD<36+vc!1=JvLvrc4CaF7+1y( zI$fZ?0mo$e_T++j=`Ko680r-pJ|ej3w0Am+Ov|WTWQht{+5WA;dkCohG>$ar!WcC6 zMyeOa*kZ+NMQ}Fc#=pA3~@**}aQt`3zDIE&~Y6sjE zB>zT8pgGM88u|HKy{BRSqy0A!Y`2 z7_|36v^^H5{rATVus_dayn?{I`(+uOAk5_Nbuo zBu$Q*6EGUQ!)QI?+I{aZtD!|ARZe?by=!)jt+M|43Ou9ex1R$VwuuxB9m~DG(N+2MWqEqmt9N ztrd~hBiNAY4!5lTVga&h_XQ`Z`hIi3#}g05bO%9>#XR*w>Hi%yHS&WH-^_x+$h;`) zwCflMmyv(2|7zB~OSV+LE=2|YH8_B3rNmU4w_sa{7jONUk@fB|PlaRY#x|%;u3(%k z^rrH($`!=~Z<;{;%ha*j8=U{AN6gPeC|%EFJRBGbfymY&@#!Au>!~Z-z2FUe!Fs?x z9-x#EbGLhb9eKB8W8H!L=m5Ph?x)y+24Dl4EH+rB0zuP+06Mdd_mY^QN(T+G0UAt> zSnDf0=Pn-+{NV{-!H(0aPtF-q#i^*b`)Rd;+aS0EEQq%fcJ`Ja->RqwdYs;nws+BS z^3uDO$9rvCCpu#)X(TX z(ilZP%PXgy4uM~I^T!ZZG#WCY!CjPg2?g7(+b(RU`iB0>KGsfXZE_9Ti0JU7pvdMW ztJrpoYMNt{`F$DZeg7*=f4vd;-w_3RSLf$agOD_EdJ&{&!X{n2*h@{EMZYvVQ2-Wv zj=BF!8c%EMjIv`3$MV?m+TFsY`;s<`;3Olcr#3S;Zuwv8oxw&peEpBxB3IPx3)7U% z-F2o~6aE(wm-GD)dOobQN z(V&og=StGtAp9z&TAZt=clNT`4C(4@p?emZ%QSzlGKFWMPwk*F0(z+8P9`VtM9$+) zoeYD$f2&bX>TxZH#?p2;=!F|}aJ|`;5-Q(rGmqCUm?Ai442N3Eb74XD$KZwU#SvG2 zZO27EFKKe- zY@2Uw(A-mnv#0jy@)Z4NV?Mr9?#OpSg!i|^`Tr_~dNFT&q1QYYuohf1>i)&3q*kHz zKhcZZ6;2CJWY?L@NI>)!apT?qpK2v1yYgd_zye9`BE~V+tPKnTt zvA$%b!-!HHTm_VqZP`h8MqVt`@&4WRhYjxgC(^dPno=B9Qzv==yxpJRT?7c1J?}Ph zaes!P?L+v(a9XWdJW6-rp<%69eTOBF+*(DX&R9dh%J;SN&qb37H*TN1+#>Wt48Brp zg?M~FP%x1`%AM`*=}$^ypnG|5*dL$-x2NDO_eztKKN}R8+F6S*<+JP^K%ku^WK^HT zOMr)ym+kfMMoR>vhV6rvWUDL*yn#Wswin9>-O7iz&QEc5G9p^SAAu5|p9`A>rl`S2ONifnnp(AzUx*t*MZmCdET4&-b?Y6 zlF*KdmOvL&pa?ew*cNiEiu{Fk<-#Q#hHs1LqCY;W!-aB(VTZy_F!5(Yesy+GxN> zrK}g3FQAepmZ4770}Rv4)stubwabRCN~oB7es1l>an55hK=4ECTt!}rG_m*b2o{_e ziUpL!?eTK5)EATz4EPM|{GGk@c`zxTFe7|_Ph)~8j!8`n6qw?V%GOJa)}jr?kUn?# zZ{Y{*zkRtM+n>Xo7?D&}V_g=BlK9XZ&Ynz->0iZ&>QcSKMe0xB-ir%S-S+V9sjV-; zAaRy`ee1N%1h-ni*u+AD2<6wx&y|9-v8@V2kK!VZg`$MmZOjur=(l3W5p+h|_7ZS* zTQ68EAwT8r-EghPf1Sy;D$layZEtU(HS{Z2&^Ar9pH}xt**1&Onrt_hl(^6WwDIn{ zR18a!L}&Hc;>a@tzx`*Xie03Ku?uhIIP?7JH${Zt zndgXb)Q4mBb!>I}c}v4D8wReaZ;>D8jD}3Td+`jIbU?sX4_40MsU9@%q<20E1hM48 z${8zzbZirM7OV!JXIb64X)ZYfNxi5tZ9PFEHgBu)R_5*ch6~8{e`ce7-XOTq&T{~9 z(IU2QpL!;F%y|X&JTDbs1`4$J)p2WDJ5H)!W!@Gy4g$O^_U z1Np--b0KUJl2OuW1>@4T0P1?R6dP+~WLV;JZu?@NBVmX07DdqP1wC^(_gMno{LcpT zyAD9drle%4L`GV1UtCR&1-!%o9&iDnm1Q=B>VzQE2OrA5V$SQ=|gqj-~ z7zr}HFz9<7yNjpF2g4@nh3co5-lPt9NCfiG1Lkco3oYP$Lw{TMQUu=L>3m0)nn=Ax z^ZcD0YAUy=?hc4kxd~}5-FyzZ@IN5O#o^@i$m29ED9+qiNri=XN$wFghlP0DSEA^a z*SxoFD1YLxIO`UVbu%j#$$-vfb8J7tRFU+z?p#K9OwpQ`u;08@_Ymg4M43!w2cH^C zH8p&zfc!})?)=9wMFo{2mmY6U;nlaZKr{rNe!m+G87ZtAb3e-;b(t2eRc+{ z(Mh67<3c_&F9M{sP-SY+i#Z71l3;9K& zz(`(xpx!8ItgY~+n{JF*r^skKU#v7)mpHkBDI?(-8PIK54|w4s)``SzWN()6uVX%4 zn62*Pr_zY0oWc{mLLg6YDY#of{S{YsGIf@nmLubL4YhS&i-=DJAxFsoZ=Y-g`6qP` zX^rDKFV#oby#-1w{&f88>PhR@Y1dUwO>BQ}fqqeZdLE19--WQ?A~YbcITMTc=8vMa zx2(a5wp?)8b*&Spv^DH^e1T1=Rg}AWh3#7$Dp}%bx>)za=SMKbF3F)*r)x$~J}Sb{ zFWAT6b4)K-(@XR3=kCHi-}cbRXAMb4qNC+=kL;p$BeGI~mw$mwKlt$&1?JNR6|4S* zc+WkVO^0_-e|yU6O|668i2T70Oc@azZ7ULbM^=41D5D{mFdLv<|2TZVdq27V2eh#q z=JzWtBE)Jl2R0!pI4|T;uJ-2Pw1vy0{Q!~Qh)k|73M5A1G}r`FBZSS~ zN6h@XmrR&SkU4PWPQR~aG6d-s{iL@G|E_^MWT2bPOTh*k0tyhkI?{)6YNk*^AswyK zM*e&Vk9FLj}M3k`zRB@NzE5&Vc%_>4B|M^^E-`nK-rTAYVJO=* zfoq(kjr?~nTgdI2N5;) z_dcJ_=Ybr%4YiJ%s&MZ}_9L)`V)ljh*5m6ea4t&iVExS(0!i&FWDjeac=h;kxXTA` z#LSVwx?BFv$TW}vEAn25>d@4mD{0&#rENs^33~L3w}f~7+LtFjDi+KUb>{*v53E8C zBLV*CcX!4ix?-(e&}vk(S5`8=XY;xsK47`2D{{rVZ!L&o$X*{T9-*BRsk<+;?a6QI zc_7m7-HxlWNEyaBU3VWQ@X!bGfArU2?h@^t{TP&A+r_Y&uY7=UZ0Diz8d#L!lI7cS zD*oNApfmewqv@uXmo+wcU;U#I|Bnb*vk>y|4&evy3AmWxbjpPYr#Z zlU(>xHw^_Z`DDMbQGI+p8V6$&jE|rpCQ0kc0gOoEiIqPoTvXZE`d4Bqh&XsUv!|He zDSaed_F99_l0+&WjKAT1iB&~mff--f-zcsh>hSCSwR%x)FEC<35+vo>*LS>b{?5L` zwb^cJC@!a$xB~F3U#)E98?JZ@*@Irmz=MUrri8kkOXR1Ur`OoUw z=ox|bJ(poz1NRKRrh4TWON<6k(%5&Gw2UzxH+tS{N4l3pIN!S^j~q;aW&IHcb3CQ6 zx5`jMkpD|!{zs-ef6lm>^YF8bVxnI^ZMnv1uJlab=U4wvM?t?GR4_Go;V}(A`RuUN z79aIR^EFsQM~|+nbtbXo5FE;92*a!UI}rn027O`J6z|!T09h?+TaswqGM3C-61&^z zfK}PDbL=G*`pVF$us+Vdsb0N0IX)vw zf%cS~Tgtw*Hys{_vEALgcVyT4$tbW8)A6={nTYFn^^xt89z9wo<`eW@IHjso-dO!t*f&uca6 zwm!y!3TRMPK811&-J!CP6W1Ffu&*fmV~mx)HWwpxHV?|9?kq&@S*`>x{BT2dR!e(@ z*+|Ps>x5AP7f>boKf7b8kSHKkRov$lb}q{EvH}Sf zU^^ho^h7bI1L&fRQmkjesl*owtj`f9r(%Gb#N7n6*OpUi0oNT2yNuhViN$xs>U!&9 zY5Hk0NZodCB`h|NZ-LyRu#I5XNUtqI;HPpGOrS9xp`CR43pQ!M>(U)J>Ad9Ty-Q)j zqms*3RSoJ~D)jcJ1z&Jfr=MyP1%Z+h0(9ns-n3s9@sCm@BT_3$rm2}dj`3Bw|@fq&~er`HsXRY|OQ zw&$^LqN{*^fCsJ+60o4pf;^eI-ilq7ptHeTAA3(+P&tjjCfzu#g*_C|7~ zZHsqrPp0I)2fF2bRXxM|n|fS`@7n0WZ479Ts2F;4vr}*z(XU+e%@KlToM(@T-#E=Q z4a9BhUQ=HObD{blOD)B@^pf|vmUo1*Xx9zBVUG%8&-*$%HT&}YVl4#>`z=*$6reR2 zaeYa!+O3ztcC&-@F1{sob`v_?1MXXtEai?Nk_@pmd3xNgGmb(!US-sAv!(TT+LB$N za#2T*6`mu8<0pT!}K&om(xsxD+jwqo^v?+2*8$Ewpkj?bdS<#0I8u>|}qxTOq%4ug#Wmb#c zk&k$I|1P(Jz*OqmWLGY%y*g5);xUar%s7sAN2N-Zk_D!c)j>H zI4`q*$f@`SAgUA2Sryg{7^o31h)@#x#^40$;eNjz=tIiZ)$h`@dt^Xfp`NZJ@^HHFF;O_2BK(X=X2W|Lo}b`8 zPr1mk?;CN6S1A6$>pZn|`yT;m9hz9CABVan;(njr`U{RZAb6@C$o$hBOyno%p<;JL ziIZ9Qm4XkIQtw_IzKSjRlnw2u_M?QpK>M+~-i|CWxM=H09b3oD-x=u#2%lpR=aN7& zlXx}jJn4B%N8D`j6L;#zEp?UKlj8Ah5Je@$<8HmCMjd6ZsWDqwWC%0?tc*Ty{MeB5 z7Kx9ZF(J2OG+tl3>mT(aIY(OfGN;RdkJK2`H(4dp5UM2qMDi(a1&8i!Z6(B~u7&oW zG1vU`z!P6Vgk#s=wf%On%U9_KeakRmUoo6(D^kYkY8!raze4K+WUEE;^qM7@P!e;2 z#0aF0-2Nrqa}$*?f;E0?3cJ6zRx<>DM4{zxuehSkb%nf$Vm@J)}aY z?q!R$MG#t={95<`nu#{Q95$}}$I*S{9Khfd;l8X@#{;#-^y{YU{Dbe=XFtDQI^`4_ zxi^EFd0~Dsa&Ll=NSP?dhIryj;`h9#vH3`)w>*7*3L1z|E`UIfb%4cxo0+c- z_l(4A1Py*A3WMlKr_cjs3DJvbHz^jXf+$if`$P43rv;ongc+`PHLX;TIGp&f23fS+)?`Hd-{C+``wG+IT3 z9GLlScO<_?d_PpA&;qI+7zV?cE0xDEn*zbCRyzWilsjB$j_nIU6t6~t6eSY~0chEp zmCT9TG4!|=d^ZRRX+OUO2oV>CD`QSu?W~9F{LgaxWbN{np2F;^hE3E|o9{qjp*v83 zQ>1j$eaqCt!SW}4>qSk|V>CBXrQ@c8;1aJR76W9$5DzupF+Qt5${yQj_QYJ%9GsG$ zMV~QgUS%>!eqEeWmU-z@4(nuJS{c+nbL|A6tJC)C*OUOB@7A+m!VuI8V|I-&%-jjF|(wnbcI zJb8TM4`Asj_*`iJopiH0$c%A^)GO1DJoAmGR7%H9%6N=V^j@$Vm(~$7lY`H_HbTsp zTzftDjEgqsU|MVa3SWOMkzmT|DQM?&+gyftZ&WKE5K4<94_T(=7H-pmus~0~uJ-x& zTiX}nzXYzRf#AwMD%*Nw1g4CjQb4$i6``y(L4PX5l0ZW`PATpoXUtuq#5goP}K{cwCHQ7&1(=!vThUW+;= zXvPYkE4YRT=a#a3pm!L2UuV$zr!XIIkrEYb$m0_y@)wkuKpase^TU-R{82M^reDM; z89YE)^PEVZ5WK_oMJ?^i@kJPIEi zu5^zfYMP+jA-OyS5u%B#3}}4U%@{Nv{c3UN^35=gyH#h0TXr3D#n@=G{B%R=x%)2^+6b@DZ?(u|sA|OQ#-P2KlLEC|A1L_2ryYKi3l1@~u?% z8cgyX?xHpz9;1LcgzF$vopvF}eJHqp2QOv07p#aHW~zLTqrkt&)b{E@-Nv&*s~hZSFr`yMBD!=nTF9e`5TC z7dYf@M5qT1p;YL?ooe6zyyw~I+54%E4OzZ)al6t}@myU^_f1atj*y1QcOAjJkGBnv zE`b;5Zitq`Q4~vM0tDIT($uNs?iF`7KR^`sx*kMrHhktrX@{ z5qjrsP^`Iax9&vNYuN0Zkky_8Qu!fr=Joj?ieEz1h~@G!g~WgBy;)7sn;OgOUVnqw zex7=I+&1+=jzj%^`XQ((r+@Nfipm|Ci_k+mj=??#oes;8fW(!TUl4k>O8`)kn3NQ{ z%y!%iUg0=5WXN~h?;N_=RCJH3p0D)nJi^@&7bjjrs9VH5d+oY)7y91tfvW%-jAo-+ zrIqg6EjBhlcR(Sf#}(ie;pBr$7nprK>2ygfoj0+SE%np;BcBDD#r=gDuj?dF%bm0q+I4?WH=GlOyqJqBb$7;xTXCX8a}KGUcE9W}C$u)iW4;O`A#YUE1FQ_eb90WlfDpsfzJ zxBEz}u9%rm%{T8F3ijpTK8Ei@IeWfL3B^7ZoP02#*>`qRX8e-c@Pbjq61;&3#*ZUj zhROk!5JT|RgV%hpMAdq>(w{tTinLhuqa2lIK3EGpxeJZB$j-QGcFDan6z^H+qnyTO zOhMxlG*%8$bPLoR?JB6QV(h3nG)2U+-u@F&XJ;#ZTK=iKm<+Nk`MFL5Z3f9}m%iG2j6(*hb zv@ZZ1mRgLCmX^8Ivz+z%vCCTGHtEv6Uj!>?RGC!$COLiR+;UUTvEyOJFJ^ZVU<|US z!7y}N?OY)<2s@jGzwSO1vCx}LT`(;YXB7qaagEM?IzV~w85n#8MH`C3%(%`4{#RxV-3NaB*bjrK__C-a{dTx|Fc(y)yDollJ?DDIQ1{*~mwW6It^3 zlS~%8;-fw3&)1N2cvnw1S6^B3*pREQdQj@yu)57tHft{wm0cp5`{T#~572U}CMz)! z8u?uaJv%o>A6>cC5}_MxZhfw!rxwk!X3~~<~09;PSrj%1{8_3KZmQ>R` ztJ+Vm0f%xcz@BCJxX&FjwE7alHaXd4|1KUzgy(pE30;@`w(=|xFoCx~_hMW<=G6Wt zohP~F=YG6zbFPqcdG07jSd>N<@>#}FKwFv3q-ypHf(}N-K)KxO&k@LeI-sy4+BjH4 zo9?}1aqh&mOtiKW`^MgBGMAM|HpE z3x~;A&(7kR3&On{oprs4aF5-l;fjMWz(4JvSXbF9Z#j=EFZu;Yx8A7Lk=a~_k2yHY)1q6|3tjzgwaih(!Ieb@D) z>-cG(4&=W-4B;E5i?Pu98}oF^sP@tb_UjWU@8%pStFYL+*y}&VDlW*2 z9eaSynv;HP!-b75QRd&;-_6qyS!+MPuPSj#UM6^ZA<~+6KbQliavLQ3+)N+5oF6mt z3;9J1bAB5_*SDYHf3l%vn^XG0%olrTQJ$aq=UYQS5Y>{`@z3%n%nN9)0?)CG{AjuNcTg}xSrXQ@#A8PIFU z9})D{+8?mPgU z#4a()CFY(l>uy|=>7Ay;k)D3l*0?Rfq`}j5bN>MFOgSoKGgCEMlm_v!M@cMw6a*5o zx!oe!yJIVdk;NJbXAQ0knwi5l)Q`_-Y9E8D7~TAIO1i1w9s;c`#mK~6r+Yf&$tlpW zB;}_4w%XiTmG<$Bl8$4q>P)$l;j*fY8%Af=|4h$u+P`#f16nV4aYg6Cf$)Dh)M4c= zA`ap>SHtJ&eUAmyaY47+;%ugC)#Az9fF?~Bckc7{*D1hdX@5}nPq(O}fHS(AZi0$W z)@%`a4Qg8};!1?|+v2-W>|D?Ogd^&XqwPi6civJvQz%NEd-$fnAd!eS%tVRhHWc3T zwagk0+=(nM1+Oc%D%7!B=`n;->&^JRVQ~?@y6|;~>_Fc+M4hBUmz7{EFKRSvm3oUh zHMBX>^1PFSSUu&xbHi&yHC`K-I=|VL6paGAqzS21>hc*{@#S~(+m_^oZ<5n2;$#1g zZ$B8}T;U)|f|5D_%!nV37oY+){ak4N;d1;cX|lvAj_CA^cO#fY6{YHm5yXd9Gao4( zMjnF>cn_v>3ZS~8!F_zwogGM~$G6Q?t|LYRi}ab;q^*0ZzZR1a7$@{qwXW9|IJ@*SiYc0GWz|Mvl?=ia-8#;I0Tgt4K-OeMqERA-ma} zoz+>|w?P-xjUc1OIFD_>G5R?Di`7`^o-V);%eVMhkL@EGSf?z~rSP)a%CCZSg z^9wrljZzG|A1rDW@w^lk^^&PDSriDi0)@>uFM_IPf?nt?yhc&yr4Rfr9vTILXsn5> zx`R`FqW};|{n)!2cj1IKnQ%k0a%1Mu2ZqQ#bZnhIr zpX|XKSMnOtpM7dO~wT7^n)_*?5kV4IctWB@7YA1%QqzdujF_{E$f zmuH~O0*hy{%iT0|r0FPCqO-^MlOBO2+qhV$`a|S-1VmzAP11vQuupDiksKzWYe(`AG3 z2g(b2j|La}0hK=R3JNoMR}tI~I&O~5M7V%d5zEpwffnq>6#mV|FCgxUJe`X&1qlM( zx*za-bgzerEQW2nHY=LlN$unBlyfd?GZOjld6+g68k5%agT3_XP#~%xc|sJo%(*Z% z``58W;c)Jb17ZQQWDf1KLS_;0UvxeJ9fx{FshGJYW9)sgW6=ZWS%o`<}Ag?{s(4&4b#~ykt zod0rtsK>|(_n96toa9=Y2a*i_yfpzS)l zx9Giq&N&p)SipiBGnHr}{$AQsFP6c~)V)T8PdP9zhblP%)K!}5$zNyjGchV4L5o^1 z&VT?$GF%k0((g7Hz}|F~2)|@|b1{nTc;c?zwjFugvB~T{y~b$|8SVb;RwP1@4Iw?v zw-H=H1^UH)kV#}*#82*Z%p@DA>rz&cN}-p56ws3cs!G~UfaIA!Us)^)B@gClTwF*t z)ZL#Pbqd?YQ>sEP6{y2#l;IIW^lGUl?BDyIS5HMraA0LwUB6dPG=zS;JQB>6)s@!f z9q#Zk-~&FF3Shxd;^u87SZ&$`y1V7vWwgZBY{ZPCsMT!t(S{m$BU< z5ErzZ(?28Mp-6A9iBmjubDZcM_XhRssV_mUv--G;{6m7q(bz3HC-${@a4kb)um~?q zU9t(jzI3bTj(auN=RpnHdm1xs2P@fsN0he`Ycvs>9 z8&O?5MVE*FrCFtdOaq1MT(q`(1mrsijvtjs+lzb6Jj1BsuMDWNmG5%t$}^~N&1}0K z5o!=8fPTG}F-D0Sr#f%e*>I`PoO^}{H?6600^9sjs9^m8)Z_zG{lq;3+1M-C-FT$c zh{{zsL3%+%4g6GnV`}N|=6~d2Iop{q0=T4i`KzVYf3X1GWlp+X3wdx*NCma%d2u6& zmsd*PpXV-Y^g#xlK-kj|jbvyJ7BVUwV!q9IF`OYzBTXZo)U)_TK{=N>jG3GeyN(Gn zEwKQ?y7V!!06q<*G4K3Qza+U|6B&6dpI|j*x?(cUo9XtLs3FK+*|KeC#Xpho4HXM; zBYwQqA98PJzX3TQQ-f^!8X6MnP>kpg`8lasy|;?!uQ3U|rIKc1T!krRk5#!klwx#W z=!YaclKA+x=6B(gjD)9e*ja!7oE1`&z8EOID`Exi*+KDN6<2}Viz&({`os8gVY-y*Iiwuy-ASX7?b$hVLmOLrk?l8x;C1%60YBV8fkJt z)f=8B@{32J9?wCC?8vUj>D;!iDJfm&H-3_*KC>-~(y1e=i5J#eL+)B{rdo$LT){oS zw?MZC=%%GgI_Q3+zp4WFl_a4FiiuOE-E-^^8}Z_=AgWan=MKur4_t_~>s^f7exU%; z$C4zl7jCD3_~9rDyI$gOasMm>@J@Umr-Bp-Mfj(#uwV7AOp_PpvUqTJv*___Ng5KEKVsROn)$DQ;;g34M6I&z%^X7wG2kg$jZonz5qNR_ zMjr{)egu~&2x5w_&fI$fvF&i}0UVS2Qd+sr2WZT@FkZkgZ=sYL#5QvEi~{e8IF%HF zHn<9*&2y=y?MgFS$U_Yg-ZI}d$#}6WzISU&cu%UpM6zmtD|!vBsC}jB`rB`HNeCr| z$wvg}5M(Mrl}q8koofiieICD{TrLR4_+zSWqV*>cA+X?we`+HRe&x8sR5R^~MtLE5 zU&fEiUsZ>f|Dj!RAuD0I<1~J)bPcteZQt#bGhAemDH=?^fE70G(Tgl{ilrQU7SvUv zC7yIwP{YV)9-(3((hV;X;g0nZb^QIHPks=b<@?E1rTgdCpqPM4iQq365;h0u;41}j zh{vVR@Ae<2LtX>;c@>Lp);(FDi<{o!8h)@(-_KpPkyyZaM<6*58ONi7$6Rlq$VNyi z8!1z`A5ahmeW*H;lNt!BHkh?Y!NaGs;fEMi=^Eo9Q%wnHt$iqXefBS{DS;TN&8D3NTc48Mk=Gue1Dj;h z6&(Zv=kULe(53kk&mhLYNiCfhcJ*3<_x$GN2SSyp=(1J2E|3&zLNmoWMVUO#n7lYPB=@aM$H-iT{b`bA1(uwetr&TkuP z+wwVbPtoco5PWM))1JE&eD!Rfe%jl9qQPkd;N2PZAy_Q@4GE!VBX~6Z%({gd+}Gyx z6X>FQ1Vv z&l}uAjft+kPiSWy^w~jSsf0eYrM3Y!sN$yYTV8B9&EdoQ1a{IY17~*I!lVUs((ddM z?l7&-*Ah)eg?>oIG%VV_TX{A{cgi_=Er^=R-hpw-05q*hUS^MddQY=leJOT)zv2tI z-ujY!kv%a`5T;@?CK|C$ zgkW%HIb=waf#hO5gxm9=EA=?y;$@t-?UTkbb0U7v67PypGY=xXu2xZxp`T8i>w&F? z7!NxifN(jW3fC3Hy*>t_kFuDG^9q4PVP1SXrG&ZYJTnSl0*yKv`xd553|Z)k(H8yr z-GlNLLMb)Ay{P6~iqq_Z6jc5P8!A(AsM7CBwoMxO04qvmw|f}QxFbziIvXz#PZnn_ z3acvuk>5cuK&=NO7fD{5N4KRdd68hWm!Ug*{Wfi43g6XJ0j?lHrq^5+vM(A0VDTtZ z6-r_yP(1-7$_lRfu3vG)d!ZF8(|Jn@A83G|1W;Q+q`)1Rx_ljwsHJ3Rdt@9tx)j4_}MtxE&CGeTx!a2AlW zc2$Bk{+oMxwT3OjLv*gi`S{(cjo3vwJ;UV`m2H&>8@~@AF~Za#Wnu&4fiUXTzm?km zBX(}}3j;htaDC;8OCRuV7V*GX*T7sv%3JnmVAY>_rUK;KJ`2*Xh0NsPqIF}mO-&*v z-$!11q`?_tPn@`OO#fmBuQYs#XEFt3aV)E!tGG4^=5e_QX@|q(pGxNrTid3mth0)L z{^4_P+S`7ae`Ez&31YxC>X1a9t-xifCCyU=c|WF~o-$tQpzr7|55FANuM6+g%aYEzeJ9L`5K_op~Ua8V2kLzk-(rQm*0Snp4rO~$wLX@nd zy|GAz-mAYJNuDC5^CmL?jefQiKXYy8@UuuDe0YkuVq~+Z;>M-JMV5(QEX@o(Cf6?b z;{se;UsYDe31bp-h|*$!q-?p{A7~|bV6TE(=elSB`KAX&8n6eVD$Jh}DqQWjI67w9 zha6?1D55Caj3sNbl&Hv7Nr)n3o3Za? z_o{3mDQnqfSBhkhlqIt7`xrBG|1Q11pU3Y{9v<%dzOJ)A&-0wa@DHQcJu-x%o{4yU z1qSSvbh`da=R^f0LW5LqygE)EdwPhBe}dZgRTc@WRNmWZKd_4cr3OJPXOg}leIls< zg+rR_6>iP@7IwQphn*5T5Eyp9q4~9xUi!%tqv)eXLz3FGueO3Hx8^XC7lpX<;Wpxn z;SN)K#vAf~!i+%Uzam3Qd@^38y9r$5(N?X%!Zsj&c6+Lr>^U%`*?^@ZF9}2GX%w$5 z2IRivjJh{qph_%?7Q4Z8zSX4n%jk(0X9j&(-MMzzx z?GWSnEm*s?%ZupLXxT&Wz4nD6|O~M=};r$bl2Y<0q(EzLM*_b z#ZFGP#(qkBm+O;W)V?6*2>K13zK5=YRV?psj6o#Fg~3Y;--doGoY8Ya?^Iv4xu*^& z=wadR$HvD~jW$>UX`Jgj^Uuv>GH1z1WF@%42o&WO3Cse4z~)aS}- zdCX6g1ez|a#YZQ;9zlSn7JY?d(3xkWmiJw_FWcXUyn3bols?G(X8(%ka1HwB?vh)u9zimddl^R4{d?kI-~f_&B|w5=Z@En{lr;v9Ip%iD~kBYQo0% z;ChrMpVPGHXW`*@uP8dcJ4VNXEw~T~xheeo3fdS?7yWgi0`7(t#p1CJL7e)a>HPjs zz|WC9uvDzJp-GY8awBH+a8sMV$mFj)!^V>6bM302G@g@1hnT>9}jDvjmz)d zvn}E=|M-?@8(iffVMn1LF$SMqgm^W-801ucBR%DOZQi?9#MI3$4bTp00LF%zP-js4 z0SyzgW``vIDq0DXEaCF=mnmQ+jrqP%=c$*jiE3_$-(M%D8M_xDKyRnwE8k#1F0ZZK#1 zPY7_V82IvQZQykV=kFwPBa@@>TsN=!6csZ&U81RCPtP#IGcc19G*aHVdSS3Ua%nEv zhvfBy&@}1_77jv*S0vAQ5av%_e@)6C@VYgS+=$0kc`}|aA#U2@f>LD8)n1qxA}G-`6UW~3=@B!cJ2I7!n@D!BDAnMwEx2bOkFPVtI9L@VcdAZTG(Ss zx%P>l8nBer-#rP3(X=Q0IPUcR5Fy}*4F|1p_W7)fOZY{FU-)bp1pfnPm%; zQUJyDJ?CVLl@D#LYky=--M`1NWa)v9Bv(d&-MzChCXH4nVM|!}y{+e9H;C~EPJK^d zV>P%5Our98K_DhtqK7xXgd=1nBfHJyFgDQ_$~XC+CWR$CjRSE_wUB$T?C>HD7FU z>5Ir0u-6<8SLyK8%ct4S4iY-5EEl%cCdl@nCQgEfCFp#J6ufc}_kO_vj}NRKdB{@d?v z&c9fWWGe8+G`_%Z5qd*s%O&&YX`?q54!0r(h=Pq`k?#Gi55`4p@+2v@hX1RsZaB~_ zqC50El@FW@B0qJ$GY2cECuo>>T0Lj;^$tS$!zG{iM~z~lDDf|B#5*R-yVP&fVwW9V zlK%2X6f)U?aX+CES51F?^i;E7E)P58v9(zyh=CYR1wqL^U8GVdB4#EG;*;7v+QRqH+x8Lr~EG`g`^Wxsh<2cDd|=zaa`RR`ocah_FY7akbQ z;Wjv6^1l2L*oax!*`!QXhH^YG%b>VBqUZSFx=(H~q|W}CjFMoY!?`m{C2mhWJsc|t z(0JO}HBxB=?Et#-B3oL)&f+Ls?dKK8v)dPboQFd=U#Mm5bK>2lSMm#zi5zz&U8^Mr ztX97B?M*bD9rqo6>3*=gP%>&(S^N`Eb5N2x^t&J z=G&JUyCZ8XKcKvlu}^#gfj5P1j^Ix}{~CG@eqJLx;=M-sskD>s1C}Wr6emOgec+wm zsXr~xjgp~#P(igm({W(E-{A3|1T>u72Nu{s>7C^?70YK72LuB>-3bTjR13&FtxFO@ z!btBOsT~G>3SDq^qWNs#~n;n^|aH7(&e_wOaE_#}HwqHaP*}$v1bJ z86n()oW{pn9NJB{^al$_A8*EzxrW8g!yE9;%*5N-%f8z(a3sgGDW{i9w9^m#4USn) zaM7w$u3i`0;_q0zg-QE3fRq(GHcbU3;_tT;%E(}x;oW42WjN&w#L9%%E1MqQ7~fp2 zy5FI<#vAxt*mx(r`+WR)duaH&28q2TYm&f9KjO#t13JwV`oQqPtX%*f-E#r*WBq~= zMR;Q`k~dHgX+c*;&$h-Y4&PXay(Fpig^-~QyO*N-gFA|A_BD3MHl=w_^$r3xkEYFOkUBc! z-$Aiu6zhXrxlX8$^FhdD{BsG(6m6lDi&+?)mQc>rSRJNp`eNMNe-46*gb=8}cAv1T zD}tPS(cQn3#S`STc-<&%j~@Orpzp^5T?e^M()9@wor4p2gHlu(eA4_GiHMekkEsi% zXIR{PTJ2iR=3{SzmY8yH+xACny}*fO)QVb>>yB>`&i+^qU(Yh3ZJ_YHK@7)G=HHO# z(0GaVy7&~KVZv`3&zhc;QI{jEx;i-!`t6`V_wG-W!fWjV4vL4g%`YZ*mWmF z5cXh4UFa-ayBP_7;pT>ry}{7392cvHgg{ST4dC2oorTN;#4{R&yH6xVFriY*MIKsm zg+{%~8|h_BgkqXu!o4MvcB4(PPZsuHZO>O#c$?p}PB3Oh;l##6>E3L(T@S3%B?~r=Kmhv%Y+DO5#+n-^bsoD>fc}Du&3s14R`Xw zV)ley7|VTL(J&E@npBCwuAg0vmu(-tgJ9sJ%XE)WdVg|Vs01>w-68lH+`N&jFswnEh~n}~ zv75;sN9OV1G2AVlJVluO(qG661gs4rfHQDDGGMEQou3Z;bf{87aM_xey{zX6ahawJ zd-fl3tF(*b(0dQ*IHS;YoYGs5H67I9fj+|!LkU~?6=W@+$40H>rp8kZ{@8|z6LPW) z<#m|(>bFC`UlW`Kx3m?}ZsXwSCR9*Qsh;K8b1*dJp2%fl1Y*YT<#g(}t++6QUL)$Mye4(H3 zI0h&fQdSctJRE?ac+(eBg*+pIYkphcmS zKqxND7$?B!$4JCLCTc{nq4oggzGxc&H2 zD;73P=n|*jcRo(yAAG>^$!$rPU)E9nV^rnff#LJF1TF`Zh&%jWnw_5 zzcW!w8pcImMPr|BOR%!0X;CdS%NO#ckbYmzA^gWLj!Vr4GfZl7xE@+t;D|6zZsq{_ zp~Lo?AfiYys0G4ox(7K(>lxTVVZU#U{6ko+330&7T739+OD`MnX3<~2rWtVhgc ziVJq?ix6%85UBb-RTejCXxe{AVEM4C@W(e!?)KOSql)8Sos;g9wo_(1sy#-oI@TTZ zsViA1bFaIGzdX+C{nLIatZW4`hSjCp>e2s`TO3@r++sWOZ+s~9?UN~~Y4hN5gPR_( zhw{Wfbh5SwO)pB%!Gi-~aJ3*>mzm>!jvVL=yUP@czX@sD@Wni@J0?ubW|s_@mp4g& ze=lq6^%+d>x76WCS0hs-^pW7KXykhr5ynj?1q-X3v2s0pYO^}ZhTQm7a$%lnVfijo z3-mcF?_HCWD&0Dgw{1pCjM8U`gd0C_uRKP{k$rrgV>eFV?Zv7$p&cGlBq4u32CMR_V=cRUK#vdzt4!8i> zbA~HX|MXRf2)itOhI&<=BY{@FZB5bUTY-L`UudtD>&H3jI;p**&sL5OR3{1(hAIeM z@p(KwKv6NFcKD|LW2~2ptS&L*)9$9MmW26{eaY6Nb!qiWkR^}vb&26@b3daH)JrtmZzaMpZ>c( zV=SzIKiQt9+1#;7pw($56XrE6Xz`iG_I{?HzC=XHk_!^@Bb-LU!uWCK0rM#QK6iWW zgw40J3DAVIL@o{2D5hE`d3KkO>qwoW^alQA76?3pS^w$$R0{W^Sv9^d5WbD4Ezc*hiCt{IR2 z$f6}U;lufZHrGG>tG^9J%Ti6fU95l06|4*)JG8?*_ydjRc-E#1jL0!)-cyJo81LIz z&%6JgRj-w8MasH(DnmueiZurs6>1|x2al03{Xi5Y`pbKyf%q~vm#N|L$kUrdyPjw? zuLpwPf*P#P&YSXX<@EX6#qY|GYd{S`d5ldV>yXB1K&qu{pE#V<#zZ!tFX@gRjOIPYdJZ~q?_u*}{?>*G9(xI#-i3u$NkIS+X9 zeopK65E~`RSZonwRyr=an3V}Xv0`bxnEmjPfDe43PZ)WHS-%EFoqPNI9i`CIZYBQ% z((g<)^FdGk#zm~`aiIJ<=dBFD8~McHqnl!nrrSysweu~XV%zzs()ec;rTd3)O@oxh z@<&LKAObc%Ty@;Hu8}tE(PKSIlIVCPagFQJ@nR6w152o$EfM8S%YDE7M2liH3~_VE zyB2zT7~HfPKcJcL8EM$@0vRp7(GD}WKBY*Qh69S~boQ00 zK^|#ZJ(QCSqnHbAx9*ZZFN+7ye1CF0BELautX%b@u3*J%(^J*bTi-vM zNRA~kM&`YY0Ma5G1LB!;F+-jiKq%)W;aaU>Wq#`WnBC#(0+;pt7hrvRl1}Sp{5qkQ zmDB-}gyFpXf&PRWOlw4$ndvQU8wqp-jkP5xfK3W_6?ki$zi_eI(Iu#^{ZaoNNHJOX zsBM1q8+T)abq8g(N>Q5k!;$k(V1Y(=T9ng5Hc!uUe)StcvT`0;m8(wmCED3K$mV|h z)B44>=pCWibgIgqtVX;r$)x3FoRNME5D!t?{U$PFq$D(}i9w|jxUmUEy5uLd(H9V( zI)RcXAm*2a7pb(2?R%O4Wc7JmnzxhEk0rXVLU_juU#;$V{i1T#^5nQljd!pxLv;Is z6ojdo%4Hy{SMOSx16gHbqEo9eUfSI_`_RRAx)&u8g#GlkCmpiK%x5*2-lYAvy0(1x z?s3>hxUT#C(Cye*d=nN=IHo0}Guc!**Z-jdLkZu3ekNAzn~shrqSVL@r_NZS^jh_;KBBYMLugv0qnhgDG#SFUk?I>UaYs53nL=l~sx)SfRCczmMF zNOap4D|_wGd0p#X>HO!s;B+BgBKt-?Al}i|Ac^-w`L6jW+LP^?c98iX?xn+JWwa+* zkj~TOrWiCn%WWc7Qw43hgiT?+~7q(G)`= zk!1Ro68)5QBYOt!OF6G3JpHA_&%x;)sLMv_FpjqipKxnaIRU6KFn@_B6-!?_UO z{29o@;-FNagF+BPQ%c`ccs3k$XDdEGdD0h)mqFQBp6#PrHzMB=ENDU#i4l~h-6B>> z$J1MoZy$$$Ks;)Ffq>D!`IYK?i)6&bwmIzt{`rUiyk%x(1zw==FG~vK7lBP*44Q!= zLS}@j319#_OO2d{zBS~=pI(~R5D3h~pn_C?P!(VFKR{A0 z@0;I%6n}KSfnKiNcGL|$In+cC;^u1Ah4RMSP&s(Vz!R_i$VA?#F;E2VXGh| z6*8F61uok%adtL8QV+C06~c*P#U^8x*RZ|r2ydMr)TW|!Y6&C(TZdT?ZpR%Enu>c- z+aK>V+BRWOJ$hz&A|o#3p9vbwVu^P7KPKWbewer}vjtk^+tplI5*Yq*roL_@GNySF zgHr9EH0wMM4)-ve$HTNayP(J;`MpMYgwNE1U(i`c=O8Wh8F+khYWLqO-N~tMNM7@3 z{B7N+EQ_eUHM6`W=)Kk;;WgE_O5zb~HQ{z%4r4bg?;{iIc3UBgHzlGiNFfMc9ZGc36| z{2!Z^jn$@dg(v-OqGHRUrO>3LaRZ5Y&qt9-yn*UE!alFmOJ6NHAUxxVO&#?eostLK zf!TX*>+C8?k?AStU>o7ycs3@%h&VIk+y19I||^>!fc_h!jdva$)Pr zWU)cN03?7nY>@mv%_wlVU--T(0rQ`cKp;&=_{41a;Yt>z#$JV42-`(a9~QC%S?CwB zb8!D4{70EsmznJVryl(!kd$^d6WZbUv+HUhF=~><(R~g`t>Kqq`nPjyIpdSFfzP1| zm(@GL?}P-fK=r|0g<){In&zB0Z=@U%0kL?$kbPdwr*gaQD?(Uf9mLeWVHXtBo(`~* zax&-k+Tg_nU5O*w9i34}aD(5yj{!qP!rv8v_yaLI!sC(NXZ2AUM2V_uGv|`DX<9i& z9%18u$xavlQihW}jJ$@_(z(^HkVncPXzzErbB9kmd$i5CF8lmchS%4_BlK<*|5O0^ zoz7u?M}URZkvCM23EAnEb4FW$EId05Ir#%D??SIY%VrC97E}}X%YT5&XK}Igo;yLC zIw0kIf^m-XPn;XZHh=iM8(zAJoo2o)%jIreqIlyun1mogCwpA=Xa zeCjy+Mo!p9lu1(T)Ue;Ky+Pr6CnrciWWhC)P^y%M{vGJkd#!dzM^WrIurPTmE8fLZ zltJ@G z_q*%JNzZQ;rb#+^_Tpk8P_(tdoU5+mepXsK!?SahZ_`ajd5NUR(Kp1nCsF!d1*B*Q%`pTS;*&Z+5LBgp52WU*SpDpg{P-3Q$Y)fbzR_IwB9PyZy`ow}$O^=iYW@IFTgqnNZHc%r9A1)hPb0YX3S+h0V?q4(qZ1`;ye6NL%4};C~jCgn+@5nX@GAk{I4He z`*{G1^0aOeW?!8XXl*(TJ-M%&R&I^P8{6DG1kJZlv`18j(WaS>&PUM8rQ!GWmef!@ zGp)~|y7b^($a(4RhtV%jt?3?j`uNnl)Lx#=`z%~D7I;X_F-pltaCJMH!n}IY+DH=U zXGM_fY3%(&IN(C^*R5j=pG|2FJx}90^v!C=_fo-M3!x^5h!V(A`ns7olc3S3HI(E4bFj`>{X* z=3RQ@LsNmuOAs#}JB$~v`_?G{^UHb;-f}@Mv&sJ(G~+7znJQzMIvXbiy6=-N_TpZ~iiA_7xcY10ArZWt70y*pKv}qx1e0b@F7s zy?9=z6h|LTh9Hm%ZS^mkIQm(hZhYJkY-uG8@d4oQEF8(G_cDTK&fkLc-}u^73rf~+ zmOs!#3s6$1eqmb`yM;vMiPwHb`W*|L_eIkN=!HX|2g*u|7dV?Nza4WLID;Ose?P0- z<@=(dqbuV#l2sUvrMD0_|9a@vWi61+P0e_YLD$`MkHsJl+H;T9I=N9?Dj^KfY-#G= z|3Lw~M42KY{RjInp@`bW4(bR;n)M~%>kPu{6XTEF7jv{>Esc8H-P?ck9!Vej!zZi| z#-HbZt&ua0ckfE}yvkxU5P}^S~b7%)9!;d=Mw;PqNW z2dPjRnn?_%)s$J$rSj5Q96o+%s+y5n@g9>ZF9Q$ra{%7a(;+x`KlL5jdW}h(Z>8gY zlSFsMvy%nE<;Pb(k7X2~c|{N!?$>K+r78(1aL8%A49#xDl|92f2ouz9wgQ8PY6-Dn zD4Nb)go8^qJ;R^gHOx8r1)_P~4x{jO2G1Q}?cQME+`;M0#QE3g%{e0jp2kGpEyAw; zMe4*LT9V#?TUqMsPVe{J!&l5c8mRrz+L(d*&Jr3n*RO^;s`F-aI5g?1#y^{-iog*v z^_Q|26K@RgU`Ye!AMOcphTJSK`P3k*ttXDTljLw3Kzpl9tu{OHNtzsZNuRuVTRnq^@H#l z=J!FeVPf3%d*j1-G!jEV@F&don83Npi|ytUehR^SKQb>giBYCM(a*G~-uwGk+olZV zeC@3F|6u{yJp4ucwTG(38(1gOd*)jkz?JoNj3iD2_+BQX=}Zo5dS(LeG2?uPu`5rC zo4Q;OJ^-`BwKrJEtBx!kJ%2s(O}U5B%?H|4!UxRL-#Cf?cBApTT`dpdWAw519AFAg z1g_mU!sSq+-QR~rd3Qwb9gPH2e6}*t+ed;U@!R^rH_i@s{)<+X5kV$j<=RBATsAl? zBOF+hZ}O4Y{}5*1v^&GF*#8D`;6;za=!y<3_RDv%6i(9G&sW=z4Ml_}>E7?=YYU^Z zap9&+s3;g0ET2u-=)hqQxh!?}3vKFG)OwZ^+p?6nHGt+B=-i*t49EOfsLerK~#Ye)9agC3t!j(_FKTcI8lM>^pH)b60e|kJzX_{yR_S=xm<5hYUeo zALCkrUJUm~JM<4Qa{PeA_lBNt#+SF6-7Jl54nVy*Q7xiiy3X$TLhYqX+=_S)rs>|q zkj@XIxA$NX85X-4Su!9o1XznMy)lb<%l}J!f-bi6BkV7nf9J8|@Dch{nip!o!5rvu zAQU^weJUz3PeUJ+O^9d`0v=notsb?f{ZTGYvxWeQ0@wR)bAt^nBY@QvAwnTY7=Adx7nj8Q2q6N1=Rcuy58mi2m<_K`g!joh|;>>!_vA zKdrVx6X`GiA!t9xiJi7g_-=L8hYrPPvl)?mRfqdYaSqTYGGm}IGU5yE1%^_pmXg}K z2t?wNb5nqri|d}z4XecGSbWx)Xb>z8Q6I|z3w7;w^1SeAV$KS^i}}RP3?sv;?7gxs zlI5_nC}2I$p?2KFz-Iy1tu9=wAscRTN1B2>Kv3yvIm-#jz zKMR`4A<@V%dWh;;aWQmzajG5?d_ZjZ^aNur=RT3G)x%(Nu`QL(?P9|zs~FCVD}pT1c#WPH>2%%hiEkz(lqay(f;CUk_eBolc| z8DP#gp{q5lP3l{Ch$Ri>6{}AL@~LA`+R5Ka9QB6ufJ(5iSjqq0pRx;V@K2D^*KU zP|S0ILq~5{TIH*WZlZn=jgg-@BI4vvVE^J30RXgfsln&PPHrw){oa^26upJ)sF zyjJ3wxckq{4AKSKsPP`?wL`h$W|lQMQ=4mf?!)<Q30RI^8cI(vMUbKfsp+I3 zE>~`T!h5h|>=AJ?KNK%p`0Z9~3VG~Sq_8I56l^KJ8 zY$}=oK;`tOrz_33K#nP>Ej(^S-bsZECx7%~1j9P3eT$S65@~dIPqiyFXq__>fA4uh zJG%rxQ^v!o?zI5Nm?t1?U>%?H7JioPW~K735za_M?XdKVr(%tC^AeyKJSQCjs>bAT zjV#yNw6m`wd#ibJ zInKgJY-Ly2iC4yK*0(OY9X-T0(xPzV(6@>&)(~%??IoK#7E-G|pvVsj7D2EQ2(jNr z2LDZql6CQ9tYOG9PUHhd)iIP-rze+ZTN-!7{@Ob?0N0mTH%f$>|NbE~!6w$6*k1D_ znZCGv92uvEN20Fwp4zlJrJ-jU@;=XkY3A#cmE*>h$vv%6i!_cV4Uq=Gu&Rr|tK2iC z*lY+1CY=KNJ+eIat9$PBiC2`wxFiRms7t=PIoIK?yn#7dHg_bPR`mb9U|kemmbZq6 zrSycA5y%>jREJnOP@M`who~<YZ1+08VT-t3|O)*v_uU{gBsb5pJ zq9{DkyCu7-6H5ukjB_HP$q12|Px6r%x}k#~o{@^NcrVm_wHF^Jup8euX>o?SL$a_q zuer~`DNf=}ngpg5x7x+OM_;C)-|)b(JEuwv051lJmls0gZTNy_FYakc1qDm7reu$ zfZr7JEM0>=eY+R-m-o}s=M1W&Su@&^$5C{disYxCskt!Wah9kFyT3#}_MVxHLPrVv zd4~n;srMY&^1VuFH?fnMZ+>*owR-W>jcC3Z*jH-8Xu$pu>`YsSvLYb!#*|}c^mL4L zldf`H#(evOQkVN^c63($zwQTAG)E1UbD2H*e8QqDWLCEq9P*3&OOb;)cbcWsK{6Q@ z>s`e!TYg9WTaR(>Ghwd#_~;#|`*lbqw4f!!1#W{%TBFiE0|k0!>>B00XHD)*+?jO9TCWDvIJ7 zbokyc8Wln$e3$3z`$T2=fwp9tT7Iuy=ZkUUX|Nb)-IkXF`+hYrw zj3vnZWc{_KRE~A2N!LXW-bEx%NO!&ve#Wst@XzPEj;6QuZy3t7ECn4F46QT{s{ zv@=-Y9T4@3cUAn2-FP%dC*@N^)&-`^|J6h+K~|A`Fa>LUZ;Lx3z+#-hqSoG$PE3+} zWKY<^xLl;Y4&;ANzZ#nIWRw&gSJ&&l{C)!2g^Pl{c{&2f5Z{m$JKAlm!Aoi%k>{FP zzh<+`FqiDpp>^-MsvxRwFr~Q!(K4FQzZ~+h?)~#xzq65>aurBn684!$kzGc>W_AUM zbA9cPO#h}m(;uNgI`+h?a{%c2`IPC8ZOtWUBEY#h`3(Se5ftpY&;_}oAQIC{Xhq6@ z5D8e3B&J5D8Y-3|FB;=@A*Fe&enoiZ_kVR-ntAIzN?fpQ#zI&G_51JUTHe4>5n0n; ziS?6*srNPbjY>7QuHEQcJ@#JdH}r-qn@UVwR9JbU|JvSAW>UJ0(^`pnxrxZ#9gnsB*0Ak`80BxyG>`* za}naN3-MJK{_mUj>vxsjcoF*DNDZTN)6C8o!s~)YxehN z7l%HvmUBj)>nE#f(;Yl6QjF<4rS?bSkr@VW(w{Yj_f((kh!5d_Z;61n^vi$KuRI{#O*NUA$ zAQjuYND0=P!)6H0%Q-{GlVORUll8>qF-waBz>r!kT_8`Sr(er0Zj3F{z@INEj&2k{yj2MQ z+5Wz%N<{Uj)DBfBU)grwA$GlIn{cZ%r4AE9Z>J->3Q^88?Gd=(3*=G~3qxwiUqN5Z zhU{w~6M1sOhXV*AfDu%arDF~l_u3s{A480ZZep@G_1i z8pjM%k!t44$Ip;)64Wk~;**tkagWp2=v$$`37h^W1d=v0QX#cyJmZyn)q0EqPxE^x zDkuZt*+}Cp%a^-=`M@1G*%@BBSW=DtQrcc%OKM#(vYwZZ#486_XbN+|WOXVXLS8+d z9_ZhY=lDTDUTWTs;R2Ww*ObsZ+%>Lpp5z*mgBwbBRxbVPTNm3iXwyh7BO>k6CBIql6P+E!=4L{0?Y7fYCH5j;jGn)Geu@>8j zo38A+4Pxvp)z_?);kVYOA53d_!s*hu z&V~5a9U*oOpk3}9Jv=?Ar-`0#3ZFG&3XEBu`S#+waIMgXj{eWjL+ps>Y!n79YB&7@ zVLg~1gwHh24*Lf;?Qq-^{wA%BXS5txcv^9-YE=3lTu5SSTVJKe?(Og0$Uzo>?Qjq0 zpND5?5lfrDQ!c<~`hIAy?mP4#uUU^+v{CS~IsiAg-}7^)?Z_pM|18{5yG9@_4G;rp zq8a+vMfMMUdH?7>xa8k==Oy4CZ0bKNj-GFQKj{4d)JF!&u1qAX(v173>u1V4FJ)}! z+H+i2&*b}jP_Rw_ayH#hB88i>O}h{HxwhA7z+Y3lm*l=o3^0l{76DY$+G?^AJ%1Kn z>~)@uXmpo|K+{Y%4Fwat=YB=D8BEv&Cvn+M-l!%p5)wF*1#)2zSat|WoZcMs^uE~Re&${ z`CzfB$sL&kP2xlPKORfPV1C@TpPq<>U@GBtew%(nl{9)mh(#e@8{LBp1k|LA3)qZC z(X*>Ut{lm5iD$d!&s*x5{Y((VwXUINFBACH&mhp3pAo8IyWMS-tAuSa=gTTu)=}e?0!Wm$rv%$5iH0(7bksc=pt1uOSdHgZDq~b-zSEUs>7s zcH03nC_h{f>3+Jloki1W5D!Z&h4pRR40uGV=YdAYBeUvkC~H2Em5 zp0_VHa=z;+k@slz0UaY=+T@PY)LJc3pAg6wr)vR~o0h63-Fyh;NPls-e|dr2Bj2`; z4gsxQV)qhlV%+Y$h&MPR`?ZpTn+xQ z*@PJ&!rj4kyml|vbY5<5K1C=6D7+92F#d6}T=1MOMXy8MJ?#H4RBC4np@{b3N|vXNCXK>n^Agmd$FJ$$duYa6=`k5tk)es1Ul-6+p1y+>HFeq4~m^#xxX z*oEZq8)&JI#F6pF1e*&VrXHbt5Yq?c$P?Djkd*KxsBb!l>w-u=5fvl3kbTG49#<+9 zB=nZ~?pUGgG79a9MlO4V~>8p`*Z}PBaP&IZGq>D2%U3 zM*gvXS=3+VLgo!Tv&=ZT-B!U)^?camI$m(U1k~o+BEc=R{ah`nL|;H49*|m2zlzo( zg(tkgVKW+}0ha0Z>s}`gp_m@6i65w5#=!UI8RR2>U2LJ9dbiz{mG6tw_lC)KPmmv2 z(5wv*FJE~NeF$Wc1!-b|=#-8PRh$8)(K?bo$l-VXBY~Sib^!@VSRi+GERPgH?H2cA z58|tg6*||aW}ffyz*U<3*pVDvdqEaw{ji@4^7QG9*MIMtmmd_I%Q&NFV+gTeDCX^I zgA2bd;;_c@h@kr78o9k=K{QuhNwXcK+<7&(2l! zxTl@%iA03os+X&8{s-i*iooO<2g1%X8nD?{@ql1}WAeTPy_#grlWL3aR20fv$XQfF za=OnvO9InB>MSq?}=TdvD13*kP> zZee<$T}9)FSXb_?{v^g6F!x2M6qYQj8Ji$Ak%nx~mEvmsxP*ujBjZ3pWZ#SqAOuhJdPu>^aifcQC zqHWaJoWi?(t#D2U9U#J}o=4I%2PfF)M)E@JTzyI`w~iJ@{kJd@=}~lf1?l0aT*lxP z#*Lxme#>tvUOiUu&JYwJ$_`1&WtBBchaER_Xo(;x-6evodyR{IZTHz<4k=e@wlkRS zIroj9bt1-wBx#khPVV#+Dg z8^N#A`RLw1>poYzk_B-21?=Qls<;Nu|8l?1+-Ty{fkT2Nw(Z)D;i1DUdHpVeSxmm; z0;Essc+kZ~WMv{fX1HP^fUsc*j*@WWz?H{7c}^shTIe97se^6a zz*irIRw*%xg#A|)+S8zBf(!0bMgD>Q3#okWA)7X1CKM1&DvC1-L%CgBSdE`Fnrz~9 znC5$)aKYM5Mm}eXU54c|waNRGYOOgl)Nba@P0HofjcJK)KY55OtY4WP3f>_cJJM|F zr>Q|VvI)!nrqYJ`_1Y7m)R;kak~imySRe~^-VA}3jh@f_-F@?H-G_uiUb#y;wZi`o zwDT0{<@!9ySl0Xf2xs^ZAm}fAn?cRS>Df;|h>1yFre|eHW<~I}U*kGNMykAN9+t-+l*B^%DJ0-DbS|lCOt(OBi z^}733YTA4H6yM-Ift@2C+CS#Z>bIUslb4bP&bE`=5{e}Ca1kYL+>iI`U|>fN--n?l z)n5xuW`L2PYg!UiIWqL}9QxqX{SS#750gr2=Z4r2brqcHN%AgQI1Ow1awF?O6+@0B zG_N)&JCygAeE3&(0JQ4t&}TA;%A`3lgyLt~^ylu8?`|zQve&W7$fyvqXEL)n=kp182dOok~aXlXQ z%h;RMDK8*IEVqsEi1EnqKx%J@Ame7O)Kc$Gydw<}; zYU-Blb)fB;!HMPZELm}*W)5p_818zK9v9uS61V_9v+{Iv)Ah>!O2Mh&+svW$XW>|@ zJ3WhMUhsG%q9Drq5=goc25iy=BlaK_bI%fI{0_GCm0oQ;m&b^l0&Iyo%q97n(E9K; zg~Qk&BQ_>?#pOBtsx+GhYcY(wG_Wz z7Y}59Akfjlk?yq*XbP!jsYqcX76LbYNj;j44j#z|g~9Ca(UJC|E;&cw@`1#uY2OE| z<3?;$>}hr+!l_>eB|pS#V+A}DmJuYdWb~XGEBR&G|7ihRrxl3`A@Ls9E^gcyZ9k=D zY>fz)uHqN?eVrcWO9C8?S+?WtcO?5zbsJ#LNZKpv@uES zBnixmyoeho@*GXL3l=nr^Kq9JAC|U3mL&^C> zF&5hhHr?wIi5vH{xIJ|aVYEpObjNx$l*4O;qvA^yPalU zFP(%mV0-3)R0!tRuwumN=}-AAq}Ne2@q8W>WDad3kd7hX`rb%rNNBA3KyucR=03Gl z0mV{%1WbqJ(wzv&Viy^P5nNaefVMs)`w-HKH0f@9PX_kzY9@=!7SK6R@U#D2T9lZ!J&)G?6Zh9sB$bj`zZ>=ar;g_M}b;FOh3ox z^Fd#=C^#)?e!6vtAOefc?lxjcE*ZdtDRUQH&>$rx3MVANrjv$5$W*s=kWdFv>XETl z(e%CB{@8C^7jur+cRjbFzNCu>>F&;}A|X<(kg=qT8CBOfg?G>V?7PV!B*O6M2pDEX zx!xNrj9(v%xFN?aa%*Ch!f{JNpoT?nX|{qQlWR|p8jQwjZ7Y*XqIj_wOe3rp8yvJ0(n+`rw#N?-3<6T76j?(lP& z^Ryta5Lz}LefT#aQ6UHw!&)vM>8%N7V{g##BQ#OP59_l*o9?wMoN)V&dvQ?#cdF@x zSb7?IqQnWfvnNx$G`FAQSuWfHUzeDK0&hTfRo9bqX8I9>iQ+Ct2CEy;Kb)2%#DPA_ z5n0vIuCX|eCb11P#P1z=0pGMWe-7sy%)?SvEY!HXql%VJ`(f7*i52`WLXO{R1TAaV z2;9@P4xm_beiBJXoWAzK8s6@`=m_jxgjm>sZz?4_#tuslvpZ5>jTTMu6>VI3dNqB2 zU3Mnt8r9vTGi~DarayJ- z!S&-Sz|?Tu6lp2XsjrMUY*q@o?UhmWw9tuRK-7k95ISC*dArt(t}+*K@eIb&{f$)^YoQ%s%rJ>TJ-NsPxvBAyQnq6Hv^ zmKTD+6rdD_YOQOOq}D~(DOO&Ni>z02OCy~yZj?PsKfzG}p)N4HFSKQ!cc*T^32_SY zW&O*{T$mntOUQ^sm_N@rX)}6mjU5VN4He8T$|Ns8W$HImC7vn)5qlwXaa?nS}Lsk*K+ll1u~KG+<(2D84Ahzwy#E?Gh*Ys;B&++ zZIZX%A9aR%Z4gpj_dj7tKD=B$twNz?;)O;-mW=7D(ie9YnWFO~kO#q8PDZHnUx9D1{N2uTyLRqU zpLf=I%Pv#;%=Z^x27gqu5ua7I+%xO%ruAi#yqII7B>2tvmV8=RUB;k-#cIhl3L9eh|4pg3E>%hcLv3}1iHUwmE z$TYf-nnc5EPepaE(y4d;;tx}SX-zvZ1_+BK?}d5Qz0Dz$>hP<4lVBx=UH4d8q)7@%s4En zdq#{R2fn?1T*R#j@G1HgW|4U74V(1pnYcxaHntrsN#0s{QT_31UW(=iiWX;Y7v1!K z4v4v5i!w?u{iu{}!kZ|Fj$Y=9i+pq6i41Dxn=bm762^3OKY0ce{pG*aFGyJ@D8wrK zbVv&TCpY+Iyy!_X3UbZs{j-wA)Ja0)uL))){A%8P_vnvAc}<&GVJF-BwwIKh#p&{D zArfKvs|ZJf%3a}iEO;o~rqG6HN%I~;7OE6Se^_7GcR2^=m#@G6`>1)h-gigA|5LH(3Py;Cn*EWKT(cGr8<0?; z@_?L?OnB_~5Y|ipHPu8m9x=n;2|Wt+8~(IFz; z9}^;vj`AOs)-|vP+7q}BSssEZsoqI`{J)Gms$Er@YG{Cgp2DCoL)Z<+nP&i40PMMi#cTNBU_7)t+K+ z>38@vp~*we6R;gVO8uGY8mLu}Qm{Kydh8wsjs8Yb-h>MykRG)UvdwuSq36q2%WKTt zq_8WDl*R<5LCP+{GKA4Zqv);VnXghnsnx25=AR@@K+V?&JaeA7V(_39)XPpc^t-{8 zXTI}~7EgHMGHYW&mIqnC^(BEA1_~v!o^?+x&Hu@H$)SK%&S^h@+X28#BpWEtAOrG2 zGnI6M@0a(h$K)EA+M6m)TPR4cdTNfTp)GgI5zSB0E3QB%Us+r7ob^wHO`m@=day^R z4}syCz*i30jiIJ=qhZ|=BNiF;cQ@vy3M1{mYh&0IPO8!KH}eF*D&-MZ7q{E^#Zz5# z!ZytJxPnqD`ca6h*tQ_9)EVZ)+Lf&_T_UIf(kRRCwY!yLJ3L_7{Mk8HP8KJ3XOIL_ z)r$A;fH%i0KG{8zX69iv*+cLHZ3eHAW5nQlN+HgeNQ_a)4k2Xh+opz0cdLZ)hd+B2 z)lGHu>p;@wI4*|IVz?9@#LwS`*BIbua`Mi;_`HX~W>aTgdHMJHX_CWq9l@WR8hTSN zWxXA~B^C*x78tv&$UNi(w9;K~%KrN9q`4j5djy)+E!^gXqD7qazNbv|YCF8znO$y2 zl`JG=;IYzR3lLOusAn;Y=L{^5N3xc-W(VrBR!of2Yfe7Tl6A69`};(8uf`RraV_a7zv1MCn|C zb0@HT??YP=gORU%h=P?}I|JKVTa#kytVieI1Ki(LX%;b&Lv^m>=o`j`h=W_>KSvz#98+^E+2^A7#`6mX%bWQiDwp+AqR+lvwN{o;k=KA5A^BJ39zpCfm-R07rY4LNolj-pr64?pi#&^4!_SDX=HMjOj> zbq~~XdqJ&gnR4i_Y}Gt1>_pw%Ccw*E{|f$xV`S2KCk9dVWaj}N>`{GjtV`@;Vej^_ zi{9m8Zltu`zPR#UVyGa_leO03Qg2lMYW*=v&-4&M9-DW!gP0+Mo=(+2 z&zhO&Kua?%e&l|D+~srJH2~ph8`Yc+ovS>8^Tr>vW=|MHgVk*drzuu;m_j$$TGQF& zH&h$p!UutU4mC0dm!~X4tM%Cv=|EFo;l!*FcNl8_vyMx&<2X6(S~-y;Ovco5-)`Za z^TVhVIC$|mfhyx`&4XS)$JuQh4D2yJfPt;qf{?4{dM9h5E2jQ3{LYiOl?$j{y;o^q z`z=m_4p#Cljhuw;oUEi5Q);~1$T^+9YS?;koy!zL- z_(l*w1d(s)h)=j{2;3y(>>wx3PvASWv1l2R|S3B8>RO!GKTLm6I zen7kHUPO6(;k(uI@!AZvnRw*ZyPnOj=-B2^_nyAW!)6^#o{udVp|sVUgH>*+B(*0F zN9ukFG`T+|>E-yN-0vceuY{%qA2-Da=Ac(3;DK~(MOQ@3fA2)SOMEoi0s?D1M}p25 z|5mhJwhx##{%rAvP{dI$Ru0v=(i~D#Y;1q0IT3y|RG)ZNQ`Hhw^Ffg?YR&rlQJqd} ziI>;-@1ra?_NTevL=gn+;NQDZzV4Um^#tSGpZnV|`+jYpKZ95;-f`7jR`Pq5p?_jR zhfzTxVX{!=Wg?q} zRyj9j(65R=_zJtl^^T@j z>Ic9H&FzyRUM_)5M`j)bKl2a=ng$PS8&;uawpzEuc7yejoKuVxZ5V{-imgTSBzAEZ z+66r<^@$^*T`y~fV6FVsyG5nx=5uEM#4eO=08d13S88Gl>^|RhFW<*%@^*LSr z^1_j*Qy&FH2#uD`dPpz5z#Z8xe2}&smqHT?C&8gY)#-3{pxh;1WaPQ{tvtGIqb)Mx1>p;-F>0Dh~ zX*7NX?+y6TvCc8hya?DcgU=kSmt(ZgXU64!F}tyrK}BO>K0K1Gd8W5_*ejroL`F>N zHU4xWe_RgrC0Z=1=gIo1+BspM^S*?|-p@=@U>CLlq31UX~rso@3$X#r?=^Ns<4;Fp6WWeomo8!UjwypEBns zd7f2@?(xEf9T9GL`|zSnHrzpQD&s-&87N^=+Tdc!XWI4H0IaE;y(;P~m9x#Ef4S{+ z`SJKy=TCZ-kV)lBZ(Y3v$>HPsJhrSFDknDeLXH3oI@o&m`I6b_2@uqz;qTmg3>F`V z?$UmLY}m{H<|ye$E8g&p@P+wl#g%qCoo?V189O-IrEcXDIXhmOl2_3t}C3nf6=0TV(Dc)OcY0y z9V1qIfPpLHegvc=^ToFIp>ni>{P*qm|9-cQ4~zlg=l#AbW}GKc+aXt*owp|fwe5R* z8Bim({Mn6L(KjBK|9?5S>olAh7)=SaXbHA3_#( zk-F#KpQHLJhu-2&)@U1B1ELV#Oe^{6F9#Y{&ZC4UWy9WIBt3#5UEUSITAoeZ<{6J% zC1#M$xK(%WpWHO=aJ&HzP!HLpol*=`-a;x>>P)B1Lq}2Dgz+_dVBqr3??JpGkyi0;sqD zVO3lf&cO4;z31(c#0Zyw^skYp^6$qX{Oc^U*C-A;p;qN z;ak^ZoAaeaOY#?q)A|Nd?&QmuyT}woSzqEysvpFafR_@F`p--KI)Zz;U8j{BR6|MQ2IdC1ivS zSAnOpFEcOwP7@*)u_f+V&poCWScM;7XiOB^M8T_7^9-I9dko|9D1Z?0RlUB-6 zA_P(1RJ}M(#w9g#V&{)|UwdInhrQT{Exjxg7fp9j__=U}eVs*f&trI0Dw-A%DQXlp zXAlL?+U#llQO8ZcI(sXhYPCS0rKNMH1sI>yTby1yQfIZ*lv2StKk>e$0GLIECKS(H zxMiAeVTx_;v$2abI5(HE-}IfIgk7GC(NJD?0FpCzvB?zo@E2TAxWdo_YQ&d!6@#|3 zdb3yoB9iC}6Tm*(LcZxbeg2u2er5_KNR;L5h;1ccKA1U)P#h{R`1l`!XO! zSyOm|)uMLS`n$;(XD~`$KY2!iP{DNiaHU1$F&5&ao*2G-XoR}+?35-3^LleuaGD|? zilz~xf8h%&Ctv(N7#!u|2|H>S{HTJxYe zJ^Q*=R=)^DNgd-Q^Fg+ib%1$*bf7yke)!1s{;THPt|355H4I_m>!^AZV)0|i&?9o^ zwd-d+Bw(qgijU-!)k5KM7PzOZr-cdaXOG>zMv41InhZaXf6*jUWKnN#u>w&_Ol4)^ zXiV@o#Jv6c{(?+ZcVM)fpU@hHVBVFWxK%REaUQ1p5^)Z;_ffbx{r~G>62ZX{lPsiU zE^J``ny!1_h+j}Sqn$6@`+P4}3;3~lBkKBa*rVf@z>5=}=(^PV6D5%Ky(bUm%Q&*s zvyK@E(N#V9aNnrooS4Klk>d0>kU0_9FS%g@r~w+6QsA{JzJ>a`UCY*rsbpYGBFRhf z`*h7S=|+1*{Mt=Rxy(`?koBTV!pU6&+$_YQOj1A#?Ny7p-&c=!{H&V zAAN6Z%f%M2xkv|!aq82a{Z5+7bs1{8BS^Np?1v7Hc2cdu{6-0Uq=bs8I1$K&fW3~U z^th`tCoc?lc^B$1zefEPC#MMOV;7E|D@LZ+*^P8jtbT2J6xWi4yVwg+)6DnAN+lOv zo47vgV?Qe$@`b`3ovK<(%&8N2Embo2#em*{cDpv=&225ii&WxpR}J$6$q{3L-$sfs zwXRdFjq$g>);bNz8@aXl$_Wa)w^fMT^2iauxLx6l2ou)NGwFx05NmJrzF9-sp8imqFx@*AD|&OGDX^J z*GX>`zmS#Oj|#*36-8%4}G9$4^^Y%Iu7B3%k!7xc;XFbj6a2>kAg# zQ2CWGT(84LWeDZ6p6(rA3Ur@x(?pO2HoSdwNF&GUMzvS3&F}eYkU&VGUN6hx~ls#igw*&#e#rCyj{N>H+szNfs(y%=;@c-MB? zsg;)O&533&3ah_G{KS&>%gJ5{c*{0G0S9q-0AEx2=Qk^*16l7}POY9vOrtEKtP(`6 zVn(5&6B@0|2kCB+FKqSi|Mh1K9pDVf!cL=)$t|HuVgX7))7!^@%m?67${%#=CeQ}B*2OKg$se&l`j z3Xfa$_r7V_<)NQWqW{>A*!~#SqBZ1pX-Rpl=W~gq{Oe$nCBJrGZ^gCw{p1io>Ke#` z{jR*xoqNwj;-lFv&GLQZ3_rJ#!aYCE2$g>*x4+&zoz41 z$vw}8<;4ToB z7dC4zfK_5VnXEY0sA>ui)104A8hkMia0<&Gv=bJy<*v>4+>-w(K3OonUtfl_-HQ%k zx&MZzsf(<>gQahEA9~ERMJ@TyM4&IL=gq%&&&2OoT=_L4jjw{OT`^M5Zn&mc@~zAh z>?3}c$8n|EU7dXTm(CmZ)VeO2A4peohago|p1X12-m8JG4GHq=r4D_}EFwAGfrDTf zh)B9$2qKMZJ2IjHUJkkt2cEZ~A>ZB|>sGptUxCYM(^ILmL{=mZChuWLfuSQQ@7|M> zy>juu0)KX4!w+-y)o1gzOC<6g!dAj&4{)D3*qc+%=UtDGd@aijoVvj8TCF0iutVPV zuj<#~U3V0c-ALH#UFD+Pk^Aiow5Uz#THB&8tNx|_h(|~+U}s`KEeY6MNKGBEa-Wf! zZ0Kk>H?N(Qo8ni+{!UQa*KTG9cM!l^a$;eqd*Iv)%}S(i21_Ar7js^^)I&K>x8Sy8 zs30U*;@aEJdwYFzyo#L8lY4xXAhUSDO%KbvH#KgU1SNmB23_Kz8#o;f-7EvoKyMF0 zD9S{o=3J1L?{fIX#01_F4~I!e+OjU(W9^!fSf52%pa%*4r;Gjt1;|t-E>qkar3SQH z#>wW?+c9$^ht=%Mz-`%+0JkOW#UXRk#ET0YY9?AA4x$vO4RJqiPE3Fbpo~&5o?D^JCjR_D zaLWbNo$H_r0nWfiC$1-+XXXxect5p>GE9llNZ6eHsjA$Z@9BnloK(~&354YA%dcKI zbFa!J``?kCoc&4hjgNVdwsujofQ^2K1PV5Gv9nHPyf|pzRd0;X#TY72CyJ+kk;kCz!&Ph>p``eH3ihh^iQjaQnkR5z=%HsO+I;Ta zzj+*Q)DsL>WzTk+e@+vmnRBU$weycBuYp%H$nH$DH@=>F$QS)`hE9?bR`Chn!d$wP*d>u*>is_Rs#zg()-%Rs+@CNNlw>MQ#WPy5 zS7rM-=FmJ~l>~mnIFDlk5t;E;P1w4#p@uJJA6f_|&+L5HQu;;!k}k5WA?@QK8|YoB z1rMVtdWyq0afWJeupr?z^A}3r_v^TDlxeAHqUoompraG39eZ6&W zJkZ3S4rkd*OCyG`JivMZK# z$$h2OOV+6w`S3^)vI}dAO>VBy!8#k!gA$nA~|A z{b7UQ1p|An-Fo*TW){OwMR|GDGkf8S>;tn=zu#5}+d{St8XdDcL_lv_1bVemFz|qk z?J)HAcxE6As)g2nP}w~Xbiu_elRB}wqv^m%F0+S1E$8353oq_e_#-~yfSdK)Lx|^oMmD;W%4Po9;J1YjxP;bLP6ceMPk1mH>A#_hL(bEGZgx>j zQCW#m_AoY$?(u32!rzCAz@|Lt0jaM5Kl#@A8Q;C%>{gpvi!w~1<7}XdbnE#O27JW& z76_$3jAVEdW<^#f3Ri8G9=`3TQJU@K;jY(0Co2}RWrf%$+j7|li|}k8wg&9jLvp{4 z1sA7SQ1bt4w@F1W{fZ_DKMIR2mTNHW^7Z(V;|vsHp7=|Gyxsr4ebc6-pY@BsYsHVx zbDk_`QKGseJbA(tx6L*lzD-P9#1U@uI9h90Yj@IN{C`=&I0qdND?*1$I^Q(98Lmd9 zfwTGEE(0yiawq0BgX{Mx^vV#uiN(-?2{~*M+J?W0lB#10_`%qG%L>i-*0s&*AyCx* zL?{F%Rw5mO6z{du!kiMQrSaH^kYrb<0JfSVv0*Rad!Uxx(N*2C(L?20v5m(v+bedB zKWkgu(5%gvC#g7AS>4Z3a=Kdhx}Nue;kE4a*i}PCl~*xUX1(iRfx!R+wT|qQMd1jZ z?`#69#vHuC_OWtgy+nXy(T3Jrv?U<{u%2Q^fkVE1qJ}2n(Y1Ymk>^0H)UcKI9XJJQ zy`&&z&vqoYB9OAW>@pOJtz$y7t(jiSOfw&2=>|~K*Y;O8OP_4IWS+Gxn6tJ; z&!VnSEw>rDB@#vAY6i<6)Kp(GAA zcK$Z9CjPd$p!>u58cE-nUyOUyht(1F^)9;p>MeQ&kVE&;NCWa6xwduahiXv`iqJV0 z(IRx^K0ez?xj}RUx8}{0W0NNK4V*C-drnp`0e2XIT=;`JRB`#)pHU9MN;IP}0@b4y z{wr)Yj7dAM`6y3KMB&Gi2d$-X(;#3%H2LQM27geUueCnB4=~TNdh$yr%k%z>*T1)W!rn9Be-b3z#60}R zkSSnx#D)ua-;eC8HI3NAhof9|&X)7cScUphGhT{#hFTO=?iJO)SJeVz9v(7N_?xvK zr$9Yy_8K=Cx39E%dW{a&As=c;QsJ0f64D)yKBNJj&_FWw96(md6+(SJhAEO47{}( zmK5pcF1?8rA25&?W8cbYDt~qD5ivF5}Ug zF}=|IL>|f)`0B`+8VDEefMTJeq1^{TD)t`QW!hz+lvGB)J1oeFPfHJH8=QANTFOmz z0;wsir%Oy^m^0n7za`7`H{hKLeOgaHwg`+bxy4|=F|&i90X&y7sasK)viE^m&A&YeBc^!G{Ym?H?$m|1EGh4X- zR5-*P>#v4}{><@&C_8P>pJ%ik7Zxhxg57=uiohhc)`pN23_-d6l$JkYR;jAHu(XBk zmij}9g-owc$Nln8O}sIwd5BX7Mq@shb?3pC5r~`>WK+^nj7Ns>vmXjrdk`d+M9&F% zQT~3!xhPb07FZRMuC(~W-RY)EV`6rNL9)Bx~x z6)MsC^=l8PU!rES^Eib632*ZxZe9Mm%tfd93d56GbDIf4Hy*|_T20zUh}la1nX~si zfX0(a|3@nw_qTr6#}i<`hXy)VFXPnmB}h`d`>#lv-}~nGbZ}$>X<)3ItT^IaoZ@*XT8u@aPpb3`(mwRbGCt#oGr&)rUJa z18AO?VVq$L6SnWIXZA60EPm-Xn1uofv_ggdyTo^&hTObl)BrX4RmMZW0!g*lx>ruWBziBDx42FzRFaqre zv?^U>#^eA!HqF#m05aCP9Q$?Snw$H2ehn5h$0~2`7d$CiDHA8N=YdVX+i$LFD0;MU zCbxjUWNqp3Y@$LUN`pFtm+U}WKm@Rs(_5$%1qB9_ejpCy3z=<0FcgW^;h-X25*z_s^d0AYaxka%q3rjH7=vl^l!%y|q({EC&Ns z)LrI#qh>|U$vw6>$`%Etc1p@#Pl1x708SC(f-<+6KA>9xt~UN)VeIRQn4nhRV<+V! zom14eA)M-{Vbz^I7ta8Lawi9qAkGb-NUfeTfDM`rQ}4VB@i({%DxV*Wz~_2@(pRt^ zy%K;J$9917pbsX@pu-5q3W9$yVB^;Q#pQomKspj047ggZ)UR&paMvLaS z&I$%xqVfRmxvYEq>TEkk*f#5_*1kH`k+4`)zO{qvL9Kv(0nj;~WdCTOu;olS0 zwG*N#^llY9g%83{ut4)PJ5R8v=YA)jX6tLv)w;F+QLdgM?6D-E%fVE47QBvL+x1}W z`}iMbGHfi9?pj>1g`HnwyI=e4b^vtL64GU^B zw#XZiIQh$iZKD5v+9<(_DTHA8wX};l3L!e3AoIf3?H7@$#zh&#tDLjR0~a<$9w9Sy zcn@Y67OQbWN;46&_@<8qlBYUOvT#{y)IjgwMz5V$#G7Kf ziTY0*g;av1qr(>WdY9;MphMECFmKQZ=ui(ppe`U3YEgOBxPTm??){xjIYC zAm5VDL@k!u7wCN0wIK7{J^R!L%m#Bv2v*+dr@Bps=kpgQc6a=CW8Hh?E4Ai70bjDs z8IVCpX#o+Q44ag^aVRdgd-+nRm|zCNPN@Q{F&kSx%wu>MLjf~VP4z4PrVUuHbT2?0 zq}|q&CA~KrZ=@khE6a>L=^o%Y=Qk??7t@o4eNz|xx%1(+$Da^kIFaYJb(DB~C873c z*%!j}RzhIAXl=vXlGdH~ZylSg?r{z}B2YVIr_t#s0%=_PuY#UgrCsiRvk$#RjQM{9 zEKLLmDnuKLr&~G!b*BEe_G%fMU!&j1z&X7?g!H;2_LCJn;AiHF*+HV%PMVDh%#~u- z6aUA&Ix;M7ELvW7iLk*QqHy#w2I>Wy25`^xK?DLe3lSP>eX6xj_q}F+-(?ZX<^a5Q z9l`}8tT=ySQVsngs%PZML6e)IX-pY;wlDom@>a6U+T0bgHcT1xx`lV*TylcxOlPg& zNhya!Ban0SIR^LTb6E;=atA^fA4*7b<}q$H7~y|@oqo6!xrn*na-rwmBt&M|z^Vm{ zQl6DgbDIDgGQe#TcoBFEgyr&8Rra4 zc`0KVlwb-@uN8S)k8U0?1&#B`@n0ff!h-iR%Rs3x1Q}!x=inRaf&xZZnhgkOq+lsA z&4VhTm54$*T`tZof{ob-Hs6;-B1QspEi|)E0xR;8lWX>yhHfL2Rz8U8INevir=h)>Juiz7N#%rw@sByTBl*AzdRr^1d;t^s~g62+*$wmDr|u1x|rcWX1XA zV3k>FRj&@~Q#G~DvXT)Sv<296#)1f)ved>UrzBUjR2Ca2IE^QA>u4yeqj-v*zg1e+0)wB^QO)90&;aFul^+G;t(&} z|D5il!uhu4=jN!z^iUtf7>a0}uL=a1AC~&09ek4Lr@NxvDwrxLT*+geEu;nVpFCEE zM?2wQFX>_#sz2KWOx`Hb5u#Y@!3%B$UWat)dlTmZP;rR=jo=>CZ zpUAy&+&}Qd9P7dhY4#x1z?ztJC7U>VHr;@;JvHvgh=r;eidW-EN=kU3d2Z<26n=XI zA0kB}9K|+4X7}tKQCQbpKg0B58^(W!t^8Xp!96W=>!HG;b#k!sVCS>$J{01lJ+21z zqOp$FPVtmwvOqVkFoWOZo#cX`ca9n^irWEDOJFEEhkRhdYoi~r z%L0Ag@&AteK|(S`8%5FoO?#ICT+|3CD=`S(?{pCx2V~sgZsWhJNH%Jf27d>#PAMuM>_b~y?@E>ny3kcNoj;0-}vJw zzFMgbX?c_SjqLhd%2OW>0YB+TGbHq?Vr=ytlz)d^Oq`A=r-x8!7t`)-QQT`)?cN58g?DL zhFhdJ=HRiwpvp05h5R42xEyuAq}fEcTW>Jw0h`Woj6j*HyXmifLX7V2Z z+TIfcsMd~?8=yM=;kq(_5d-`QtpXlO^>L$shAN~NyX0{rTeC?e%`{>IFNL!&p83>; z5^uIkfYe3wi)JqmzXW&57(IOBiVx{?S}I_9ayj1+_5L@CQ~$cc+fZPyXGq42cU{>{tuy}O-qc4Kx+vBx+GM!!ivuz{2DVu*dNE+uOMZy5GFk9}on zIkEP58l0bt6k3cKw;3(+PorrRXJC5>FJRUL711#Q9{DXQ%wzVMN{%N-1e6JAOsogf zi(Tsm`+@0?(d7Bfr;kM(Q{pq164NH**7{z|84`;HfEF3UX zzJ~#`mpeOMl+KZ)e4g4q)3*GOy28=JPU7<8-Cs>?gNfB9=~`1Jk7t=WYvNbHiiotT zf?U*0?OfOc8$sbS*faxZ&BrM2=>A94d&3M*c;3;I@QEoN7#zZ&S+WW=9=nm|kJI=> zE+~}YEs_MroQO^QvuK(S&qni|Kdm#fuVKpM4)t|{c6%4rKnY|{@H}zOn!WU@JuLEB z$l66Rzv&U=4;qr=@TVZ#bn#ox#mL#tXJcLAfTZSf|90ImUA;3`=VK}^@iQO>OuyW8 z1WJJdOfODCL+y zMUgtu|0FNxuuq;Y>uD{!BO>=8z$Sg9h3}WtGCAA-r+=DS*iMZ9$P*(PNneVbZD9-H zFet4&4*$1aaSZLY;CG-LaL0raZSNM``nc=o_VB11{I9>+T4j`TLhL;rT1)@NI6%oc zPm7m-FkV@9Tjf58v zJ7s$|*6y&{=qC}P-wwQi<}q68^>Okn>l>HwK{7>yQ%|(NiFm=6yyP;BI8L$kyuXPJ zyS+K#&HV3(123)$nDRIbi`Vs>+n@)K4xq%&{6j|EO*Tv+!X0PvX@(>UIc!~Wpa^b}PhKYZ_T*?-4SiiBhiO_kPpT+6(LGbYI^ScFWjaDIz5N$+sG^$f-4y=i zdhmGLA^-={D=U!G?t0rewDLK^@lCiEGlkwA4kj#WEdlGQN}ZK$(=y32+z?j!-`x2z=`UZaUQ0TH28dLb`t4tOTq_vT7>4-+r*2=>P8y$KmvNTm(%ByD<;x zVVCzO)Hi_rmp^;RgP9wmz(YMJBlmHVWJ!Q{1oE zW+YSel`TK5Jr-M^&eX>5wV+QDD;Co5JM45cr@1!2Z}#+7-qkv%JZX?KmA+M8dzAj@ z74+^5+E?JEcoddSnsC2!@KF;;*o6|)j{{6O`YLG zcH7;@1IMaai#cA=WHfNkJ5c*eAAxee+AaJK+Cyppj!^f$SQR6)c?C`?#@iZ*Pslg- z3oN4}#sbL!qe|g<3DCFV3=^~dd`ke%;DlCdKzvu=W$aO$<%-y9@wm;gg=r^I1080+ z^*`_9AdbQC-a|Dvx5z!5oB(7F=Hyr?T?J&naQx1u=6;v^{%98+korCAwwt#! zZEaD@okHdc+pb%QH__TL3 zg2>?5(tC)bo9M7wT_U`$Ia6QNqTalJUwRfgw}pW%0Q6C@GaAUZwYk{l>+Gju7lR6T zGxnAH?Y1h$7R{&T!9tu8A&sia#664?RMDGBdCxr4W0u<*-p8FG8V|n&S>Vztz;c`9 z`B&X0X?YAhb{88?n_JL~2*k$^jL$1h!QLAHcg9;f#lQHU7GSpc1BW1gcT91Yp!ml9 z)}O&W`(bGKz-g-mWD@0`TSsxQrHu^<8Nq6#c`_1OL(ldWD{LLvgSRlDbrvjLy;c`G zNCxaLSK%(?kk3`ipOT|k^CIdG8JG>0MS2H6XS{#3>SkYO#nNjN2Y)rH2;4X4`%e zOXaCkh{YE;FpV3#0B?K__7o@)E1wT{f-TKpHM(FbtXns|Tl3sD*vXAK*x?FL%x!mB z^$O3&KHSUdxSeOS81VTrK`2OA#BE9~N2lI2%cqv-+czX7)7jg4JG`O(>}^HCg;mV6 z?NUH%WQxll#@YzHyN3M8gFIH`iS%sW%kgXg>`WpPguB6b$`|J&lohq(ffbHeRf!Et zi-iSKX0`s#Ss{Xn@o%DT(ND<6#zF1Me`B-xKBR8TxO)3>;GP2vrV>8;mqlZl}n^?O=)+rF=%@>rI{W5rTGxbB>c5z02Xg}E8}HCn$qDtO}Va@xr-+jjgg6n@>I=X)XF$(edV|^&y#@9+7LMM)+%txn3A)T=;!oDEh7H|Ho`533aOoh~5T@e` znSXb_x|oEkPgEG)5#n&>F-1TDb$n>E$V^ucsAM3~=xma_!UE@f-P2fBkA4s#^DoChr6Y7B3(pH>w+|}!uv=lVfi)ooiPk`nw$qi?92rU#h;Hd zf2sehaHd6o{jflx?xeu$WRr%32zKA3kjwH_96x7G{y(1HJD%$I{~te2ryL^=N+f$` zL`Fm$duEmqGV&@URFv&l**Rop6H#VGlo=uRE*<4gnvOTWeHW}!V1)U9W(jfuSjT`y9Gd-JQ3A1oSu?> zKNY!HP`KZ<^5U6L?R zh|yaV`gU5lzb}W;;7OVg^oTe78?NY{cHDdKdq#{En%_avN!#9Ezs(VH$(`?zn#-H; zneDyI`_dcmFSkup-)Cum2#64@Sfe1?Hhrv@Q9oAr7R~Ipq=>>J;fZN(r%4vVNa=pD zw!HUCa^$O?;)W)BrVRQMtgEcmCH{JqRr-TG24cps%LNOh&c7JxN=WQjz8X?u^sOw4 z?+p#Xp|_+D1MZXWIU0ltg4BE7eIqI=Vw0p0$5(`)5#r!;R}OV?Z43hT&MIv3`{}dO zw81LL^ z#oa$KyxnDrBYQpKSt?N^pbpxO(cWpjfAjJ>Zn@D`Q{gLj37H}++edmG%-W!oB#W3s zpAvlPB*V3$@IX&<8KOWLls$mzhT2M+(1@4(2a!@Ur^RgNx4+aen&lk=%oz9;tTZ#$ zZucy*pJ#Hc4mLtQU?~_m+f}E{tC_tRk^m&0w}&MV$^pDYi*i-dR*y!K+%NiDT-dPv z?{qx^A3py<3l3?3Tf5Ac_3fW#%8&xWDeL}CoK0rd2D6buR6X&wO5rcUB#_Ns+sPWG?yucyO2kx1s?&789O1^fOCa z`4BGy7TQ}@Jhtv?T|QcS6GaQtqS^cj+Wr4C{9LNx=dN$q0>d8~M7E@H9e#J0MIuB;-PrrY6TFpK#GVR51 zQp8M7HRmZQ?pVrA!AhN{?FJ}z;g?ujM{~h6p{KQ*XK+wcd>f@;7zdU4%AJBCOuOcp zcjAVy!+dYIZvpq2$uip#^A?+xYLb^(4QUy0@)5GSE)QS7etKnr{I_v@TC-5)a5#y8 zLlVW_n-3TNTI6atG@QVuium@%OY8d4&)I`nynu{s?vKY+Adbku6*OQc=sw9uVVwCt z*|zxWan`FvO)=(n9fnpgc{Ks0vKKw+UsbDHn3F>)p?harNN@Ir_Gm7Bk=%RiX1fcPl!8Av9m-Wr5 z1KR5lDGdhek`K#rA|k@WjJL=h)@5F&8pY&38zsDR`O6D9i342>}GS#~?xD0B|CMacYclvMQ;^NFWXeWM89w^uXHw++U~@0vmp9 z2UC#QRzJo-%!I@4btd5*d%j6LlDzclaI==pe39k_GmUXwFHDITdpmyqQyz75@ns{pLGC*YK z+K9gMb)epF@R<`4!O*SBstCCzu)6$wb9c#q*C|aY^V~z%jjeeNkA92D%VZ0me0quw1UWyu|(H)hAmgA4jVD z4Qn5H#jx%TL`MxjzWwU@T`=EOV#licd9B%l*MbDs8i}IzY@Mi-Z%*-(fL+?*WOvy@ zb*q2Vbr|0l0YYn#;2if5?{UbC9)yQ|)89KI2liPs4CXl$hHTR4@3Ib#+oNv8jd6nbimAw8cz`2_o%}48wA@dby@GZO0z-%mi11nL#_7{E(a*cqm*@-H>r zU_nYC$JYPCA4_~XSm!$J%z2&%_iO_a;~(t+>cl1^gcI(oy**W@ttTN zWuaSa1sgTR-!8MK5k)>T!-+iz!Gn!F*)fgV=QTI=mZ2?lNgKpWmw;Y4!jt)=rc<3n z9ti3zFA*E91xEAzcs8j<)uK_DtlLxi>IPlu?Eg|zAaUywdG&mgDv`GQR|-Ugg`2R4 zt2OpvDFH6VnnlL5=xEoXpSlx91$l!S=|4TdPf(`fee!fi5C5e`U^vFlU)LJKo%sEo z#j@yK)e(yG?u>mVDt3zVRS2$Pewh+$1xus8%RXRV^5(EjL1VyNSGAbDSkc1oM1i&4j zp$9++iLv|tylaal>`)$HQF^CtaqAW_Be*RejMjxhCeUY^nynPNAiGTwN zYCOEPo|Bh3*|Vqn#(B5sr(|aQ`7Wtb_!C*3PDn0O-dEx9s5fLB89!VAVTS#n7{U(5 zfEklwm9Ia$z4x@M{`a-TWk>Mrn7G6J`}H&%ds;96vCt3Iqs32y1=b3d5S_?I*uca2 z(+CB>7Uf_B({=bHD=S%6+pBVAVe3Dw%^nwz5S`1-5~mx2uj&KEJF13DqOY9K(m&ER zs_GJ~pEi*NE(J$tcuGS2h}9nqbVVHf2N&M0dcJjp?I4sHof{q7s4rCdpqLI zz3EOa;1bV?!~Kta=N+OgWbB&9{IOe^x9)R>A&%Gofy{E2`xWu`>C?IhWE*0fH&`rC zuVy^%f25q&h*t^L0<&?@g+?Kh)~}TX{}UAkle6yE z9uS6%DTQ_+^Q}y%Exv$~iC`bh6zblS)0N*zsH}K&FA&TP3QbY!b20PMPk`JaP@r@q zr^X)C)RH{juAPZrKJm^dLBVSNAE|V~^^VU&H2h-m#Z{^avWjUx2}feVbjy7*u+|6Z zes=cPLQzy*GlD!kI1#fYiSJ8p?7s7R$NKYuLtgTl?^$L;{tEmZoJ}MP<`R` zR8R4TdOP%rvlo(vng~GE$C<3hiE{61G?UbEI(8z3%c_IB>tZVSwiqmc$Yelqua;@& z$!H&gTg}i@v_WQ@r7cBtnXR~d!n6_ z8CbZ%$e?~0ULQ-0yf!GY$OT+Vtpox!6M(PaR|gzO;gkzcW-)Wo50%ZpK2`L7fc10b z?{fk}b4?=~Vm^uvh7zXfxabVm@g^qR*9qX#HibceK48^U^ZtLti!vGpmeKqZt<#dv zi#|6EFR1jzLXEu(mmC=?^a0Bzteh3Da@#Tfg{+8%0|5#|T=8H`yB?L!`qlFW2G)XQ29si^bmEq0MCqq{JvB82T{ln?N$S`nd zjz#|Bjf}T}F$=8cV$#rSUohlob7J_lDF!5#V3*S)-Vm59SOHlbv8^gzYsPtBhpA#hCA!eAYP-l{+;_ z*zd<`_Hq;E-F^PHc^-a;@c|hSDG&e%?B2Ml8WeI-SPB(lDR$-#jK%4~f8~}6JT3cn zfQv{*Tl+)Lah`oY0fBKHj_NFxzW(Ine;-Om1p_^|ZHE2O2(Wxu6ZJW!e6YsBP)sR{ zUOfFAK9Yt}Sd-zLH#Jj)klLc%N7zTu@)nBHxjpEQLF%ZBAU9||{Xe8W0o~WTG#0bDdupBU(5T$RY zLeC$xrM%ZV{G?!Sml^mm7kF>|VCm<(F1IvqWm8306SRp?B#?vD0#B2%AF7kRgj})w zf_bD_*m+w=gT#ujMUl2pfqoQ0yAKaffFt@c(GaCu(_Q#Uyq85RQz+18n*omG@d0ZQ7FNhl zI71Z)o~LY4mX5w%Iu+AQkcJ;!xbZIU#;b{MVs+zM2N)h))1MwzoGJjT?WlfPa=|GQ zo`Ao*#ulC&xED|=EeDSbgMGcq%3BeCqUct&7LFhGF7ii?liy%w8Vyj8lb%VfO_GVu z-{}?Gzq!(8&-d4wWmlixB-v#&PJ!?zH@5>khET0A{O{#Pc~!xS?=f@Fd=LFVFzF`R z(e*>Wn&s8br@W8FyGw36uA`RS!s#9+e1;|j-4)Vc!K<+$kphh`6d&H9p6PgaN{i5A zTR|BmWR%mh^l+{4hoYgc7v8LVrq=fyJW;{+^PD?_qkcBpvB%7AXrawNb>j(+-Y3p&jn6y@k=!zjw<{Z>dZ6sk0N}gON>lE;{ zzA=0BbyZE*iC5>vQ~pV%*uApB9=60H$HC6+0vfLZ1F`lk`hM42ybasJ)VF~EW~dB* zA@@oOzE!pDSN^`r8XM7xbUxYhS7TPNyW8au6Wo-`8izdSMg4f8+$16Vm9MU8)P%Y+ zT_6yqfN5T#-h`KXP3JTL7?1KUWWG|n1Ol9#pG+wgig0dmRh;~-*2F8+z)U!eWU~Bj*? zZ#}FCu@byly`VB_u`cWu1qSF1^!P*1U3h;{%uoIIoMjKl%9?tzD7k%F z;GAvh-alEY_-6=ZOfAyDp*($GEu4+?G{ro4;rOQb-pIl_Raq}l9YbY$#?(a`fyJ-(LcZi* zW+WNt;tr4X0)SSy&|MUi7n52CYk)+-cCbG0?*7<8`GE;2O+K=+W8maDn%esY*(%k! zi}=(ON&<0V_Uy7c>N*ytH8ZBQGJW=_O<+q(h~4CM0+a6Mx69}m*w4@bmbA_q6;zWIG=OlT~p3tNpG2X8)QFp(~-) zL80jOxzowKJ(1HL*3^F5Wok?CT*fzQ0qm>?6G1W{Gbn#zh9ey{>F!tf#(d?|$7>p( zt`65O{3cTWLl9!QpwYvYTvjqsyH;?|mJGnqK(4J0V^3Kc)c*>X`FQPM>EQ^U!2K}g zBADJA@*OQ(<^*&HCW*`}tkgMsWe|;wTHeQCgpDlotgp?CFsn2Rg2Ia4tO%IMakr&|D8P_ z21jb~?uX)7F?mlt%)hH1MUwt??oAl#545#Dyxm4p$||;`lR#b_LTSvu2Hs#u8mUeD zM8-4<6LoZLsdPuNM54{wmJAfzfkKlv>|3gruRJ|(@lE@)Tn;DBg@;&U@n_?`qe7xE zw`L>(%s~m}?P&C#g6FbzbVGck3T8}ej|YI~E7OQXEU+aMR{m~k7@mv=K*}?CeQB+O z!4KHD(0eAz54NcV{bM*K>Yyt z6d28dXq=-^+t2?Z{h%KH1M~;!sw?RZ-amKSxFx99a3}<^oVxrHMe5PqEVyiCyZ?NK zITP~0q;afbE~L?bm2Gxd2b9%w_lx4XSR&p5DMBJ4WNChqVh@pxjCp8F^bbT|08F~YYfAzW(#I0pGhdGd zzKqwW3$ckSY^X3z%l95U14;rQC+i<3@O<>DH1!V;nNod`Y1Q0YU<+W&6QSg zDpiSNyizkKb(f2xbfWlacp#gCJzoRBMa<$xZ^vKjAzyjG#y={T0sRhG`SmE>g)C74 zDXete05sTlD={<@ZW>kZ2Qcjs_|=E47_r8~F_zWE-eW5|!L*KTX)`Sek~xF_-3y?W ztPrYj9N%W~LHnPJ4b_C*5j{_TI@nn97JJzIbVmHsU5n+OUC12>pB&?0>;3sff8+DN z=A}6TMJN)#rYs~`CHP`^l*OHL9ZBI|#_Wo&_(4^5M7c3&^tk(8R$2s<)nx+-$etI7 zEcwZgiwDipa6PB})4#d&@8&Z{K~GV8TaWEN^3reW6&-}Kj6n?+p-1yK1gfZhqLm7; zZN0~S2Fww{TlHWkV$VYkSAYQZHdqgjSpn%=05fzAw4v($Orb`XCET=Y(nx?VxN1OJw^vr<`S{|_Zgo| z%`hET7fajAs!F9=ogLM2NX@k7fQ#@*6Q)Z`EdQ!=PJ&}8wqLLsi^Zoo!2FLjPstu5 zusF<6H#iuOd?YL&jVbTW#vGj(PR)6+~N3`&e3>LHFq9@0>AF$u&onm|#{ z%JaZL1W2@OQ3_H1utxN=mo@b39aJOoKrCN--Fh5Q7=|FWR02$tgN#3d$?Flu(L(nC z>yn$3lPOYGa*C2*t2Nu<#}nT2hhuQ?Xn%Oh*gZtYHuO5{l=qc|ftgz0yMp%{fpy+* zJUH3_#xV+~sl06*2$?)}dVIE`fA~cX>kf|#jlq788DnxK`=f{a;CSW7;egJ~?0fR3 zhm2?|vJd}nxl-IXB&jh@(fGKTuD#jz0Y&0mMa!~Zn$YZ$Eb@rZZVnSV^loH1Sf5N7cBcPd zFCgj}RCojLVy4;q@BeXp{2k z|JYo-S&-2&TpeLrjY_S-MT!22QxK5NNvMr#o=CeNB6M=)f4LQzFF8b?|MaKqr%6WF zMl6zc&=PYS1u0}mh-DgxPW1o?&I9*AD*-;fz6gPBGm=76?N2bH3VqUE&Ah3!^;B>Z zXB)heua>+StaWJoD`y}7I4_-z8ohXti3Gii_VmDs0&yFDvxna{RSiCoPUT1&yjslX)g7RWI$SdR%)M<}ly#)GPYWX!`q-6r=r8Q4NVL@>H|V$zu|CL}7gN5nFV0eo%2BvB;+q!@`KiDN=o6Q9)6` zt$sF?GkC+U_8X2;F|9=~oQ{=vaC`!M07pq}c6ODxSUqC`FV7 zfqCTF4N}$G3ssQqm23p$IF$a`DQv^QMt#gt-wx34{%-Q|SOT{maD}L&;r#ae?Sfwh zd8DO?jRZ&1OMn8~!0hh#U4)iu3;=?u$K-s>@vB!2?GtLze6@{dW1hC3*%*8`wjCNI z4)pbIjd8uC`E9Q@?)asrjOyS2MVzUZ4?a<+o}6$QIkOoVN&ZHtZNkjuw!z6?Jp6Fz z^Th|%>6fJc&0loYHSdd`!hDaBd7RxkA97EE$>gfhPMI(et=Kx+!}VRHIFjE*ZDJ@N z&pK~;*U=sbqA!%SIdfkIKzCZ*!gLyDOEbyka@&{*b(*Ah?Ech(O6e}|IEDc#1YWM5 z%3eLGSR_Hcym~BQ?xLGitu!)k+8Bu3);16>a1EpP>G2(1ClpFOB0i9>TyX8oC)i?{0DpI+KHS{AZHh@Zh}bMS=m9>uFxXGScE>?7s^HC>h=z zt6ws{FPH_eE@!Y_6;5mD1s+^$3J2Rn{up&jgoEZcKaoXp54nNd)L!j*ikUOCIe_>= z$Tc7;*FZXd(n1wWMwWnhMag1XsE&P(ET;b)SJ3YpDJhrWw0g5zOozWhe-898F+e%i zfP&{2<&aYKWD{C^bVy#ves9$54xWxG)td9y7cHpP3}gsqStxXYgv!esKtDJi4fMcb zUDeC*D{~q@ zC6#p?n`r3IR8CAdx}F29G>L!nRpNYr%TIbh|I5GWLhd0Kc=O}5Tc7@rgI-Be=O19Z z99XhvcHePoQsRPa|DwLmd21T;?mVE!(7qD7nNW8wJ`6~31R447{X?z*-CqJHzi9fk zux?#*eI)+sQj9RKHHATO6sggsArE5z&0JSx_}d$a2OzH>Pit%I*#r(-KFUNf%l{6xW>% zLn7p^(}6BU+IO&cIZHfvb{>0W0}6v3Jrp!^K@?-uH^a-1M;skQ$twsB@T4Xcq{L1R z+EBpUSDVnb$84wwnIV<|VV^e)4&%8j{xs$@MyQhfJ6+S}cfk}OjhWV)P4)XZ17vHW z;iOkxjev3I4R_z>_=B%wkZH#vn{Ht>I8XiTg$C+*KyP4nvh6fG#oBqLXM5`)LwnT4 zo|kj~XG)F|8wd(S9-2zLSw$g#uHeDK*@3g5O>%f=QTP|>Ottv2qnqRxQR&bsCZm-o zdU_lxpC29vFvcBGVfYb0!R05mnJdLw^37)&u}i=oZ3vpp@bj#Ws{V1fg1NG@ZVvc< zq|s@cp$k)AcA&Y4=00k3eUuB7Du1U#FNEl!Vws)#+j7>E{`-5CcsBfXUL;$``qm@4 zWtI$PIB%8Y@tt=LA1V8fRPB|(NtL5v7MHKnsUX)~*!bIdztegEJHH;PO>hlHo0It~ z$!9tzF_+TdjK|yO(LPs!{56M2ShCKHSr7eMB7m%-4yx+5PJ&I6EzLk8UmC8Ve>cIE zRcn4TX-DqJuKh5JrCb5DzDGYE+8;!M)hl+5H+8f{fdr zS9P3*55E1I>@y0$x1Mly-Th#q>vRUWxmBURb@A%t=SL>89LQ#7T_hN7e*4Qtm#G)Q z!$J!yRhKo2G`Ae5Hemg6EFDEyoM%)>C82R&E(EvM9CaKT4WRo}@P=%2*hVb#-5TFT z8zOcEi=pR6!*M9mQc~svnpkFahhRHc-jT+=oWyp1f!dw1Ew$?ll*0{GrhY(0zxjh9 z&YQ1ufwZ;}H4vohqz)pmlls}=A3sImGNC9J6^Urif*Xf#DSCzHg18cyubvz`X@73K zzzA$4V7k^XmXW5C`U+3Q|D(vD@(l+hgub9B9D?%er}p_~Ue)t?+RJSsH;GmsDa;l& zM_f2k&RHDA&MN_i0qa9$g4`=*u0N1PZJ+!~J|5q%e1F5Ifcq5fbPEFM@G%}XI7d4f zAaUi_%q7>B5BsUU`$2$YP4+J|wmQrf?cwL}N0pitA;ME=Ud2>6Bfw^l$~9f4JALZT z?dMOydP&VG4$-A9!j*t4o{@%c`FqoyQB3|*8oiDmfHhu^Z^jjo{`j>dsksxSNmU+^1&22|lZq)J~h=8a^_MDix1o5()3VEm-*^q)+{ zA6w4wn}E0nInq5D0bPJ`MG1W$l2LajV}x7$U)NF40b)hSu=5d@1y0H%Egy3y0?D7) z{ZzFNI*wvWc(*T*b9G|WJ@olmWaLpj(H1n-w4@B26~ zw|a|xFb|dcfzyhDa#%ZIzysv{ulNn866c3|IapJtBY8*!E#g?$fi6ekpPo`U47eUx z99``W98c{d$RXy*+OWec@q|#zBtxLd(nB<9Z`q2g{bFi#O%H&6Dj2&nJ1FP>aD;U4 zNZV&nm0qX)E=!Uxhv3kLHb>rFXLZ{Dc$bX*q`Vt8uOz=?HAHNTJ7m1hwfxY02_6!! z&YrN8?tKoYeCMO{R|q5t+d1tGV%>5@)D2n=Uxe<7mWb*CmIER9Cy&L;V`du%uE{L= zFMjO-7rFrY-Exa8XTD@s3{NSt_JwPlXn!OJzp258tNe0!ZB^+<>kv+}%H>VueRydY z_fe$}n)MBr1WU#7aNfH&_R2~H`3ncX#?*#d2;4$198l?9HysZQKW%7lejfhxNuh0a~A640KA64f%uBbjO6iPHAg z?$gZSyx}|y=m>Q95puaF+a+fDjb4 z`Qk~Gye^bt#7r^4ff0ylqaVO#o@}c;^QW#h`lDi{@tfDj6hJ5jkY=}qNiP1_doAf> zos-PRqE;8S1y}yWN7?;HFVq>01!AJ=Vf#X2Po_<)1aIcX;}$zi%pBP8?D+9AT_2_0I&||B(LQ%41&H72^;2j~8xY_iY0onwkz{ zGcrnqrQCIQ3Eo&Kc;N%qcg6Ma26xXJ(9{k`c<$ceS18#;iYiC1>H-!Ubmm2Fyd8++gy zq`SFPcBDo$Ckh`No%0*ak2*rHQdqib{tc!S8GmYoPp{n`Ad%Pj| zebFPPH14Zx+l-BRj=>0WxZp8!%yQ)KFM4zx`Jub9LB$)qkkaAPf|qn8UbbH86lerz z>X5KF;s{9(XK%^L@J6&v;7U%8#x(Y@sE-!3lG}Df=}h3c$F&bQH?d>z!~;_vH}kN~ zp2OOY*@QrMXzblxh9-2U=f@foVHsvb z(_~UFS_osy60Exby@QkwcOWyXYl}B@aUlX^ZL<5M=~-kbadX5XY$3IvlUMk6dI805 zI@PSZnP^?gWaaS8_RC=<9q;?jEMA2S=NJ9CneAU$W?%E1{kFch(Uf7Yl#;7rl@u1Z z|NZRj%E<5AH}}^$<$a#WXn}`}E`A8Sz)$?- zmrcQkGU4)%b#-f3InZbaDtaKhr0jHTtlv8u$Bu;}8w~6c+ywnqrZV|L$1Cj|t`&C= zi2rSAD4xN~M(wo5$Gd3fK2JK^&ooM8mqMpCUsAQl^)o$wETr)@>1-rULE>T(AFslR zw?PAHU)5{nq@0867`G@Ibp8U{yd=I)vCrg^c?5{GS}dmMpyFluJW)ez7SxLuO)MXb zJ!~WE-B=AWMda&W30Y@ZlDg%X64<3Yu!XS_Xd93tH?fj#ud9qqCapu8HLQCOIi4uE zVW(Z7cJ%06QvVj`Z|s#hw?bi>+e+K!@MB6H`8#zVMdyeMYPL-yh6MQ~J;j@LbBPG{ zNSJv@@e!lHQAI;Vrv{WI%hYb$uecHZS?q0Tav0*0snhM9oR6jd>`HVmH&U+IX?}y6bg^p}rc}t$2K!04*Z@8ze z-5|0ayS%&CYi5>NyK$mQtNi^TPJiqrx-wu*k8WU&WoF=SP!2`tutZ=*dn5-14gBXx zv{Qhl=x%X5nBjzT3JT0HzDXi$Oq%}s-b_(6y2=(O`j9duT+K2uK#{+}wuQ+bTgykP z-pX$!7LJ_qigcW;k^zgP}Q_l%^2X01KuE@7<>c zjra%35JEC0aES#VZXv`+L-&=DMqJ5r6pHDco-2pO2bs^&c$_YLy>@M-;Q3W+-Pl?| zFI003)@pR`ML2iWdEGQN7oM$&MKljmsJJjkAzNQj;-cZ`ekW^@=VS=ZDL#zc_};^+ zI8lE~WxYq(K}D-8BTHwArY6oEq40h4&T7{qwx6+UZ*i2=I=9QlvpKWX_^T|f+D(`SZAINv zdHAaIU zUzqn}{l=ZdRIO^ucaE&&SqXTls<=@krKk6m=E5`y3#YUQH8=ct1w;Sx-0gU|`22@Z z?N!9sOc3^&itrxiYV;jQ9$Hc{p_xhO@9KJMs1El=4bg0#U_GO+4rkB^YsH!t2r-Kj zO;a(U+xW2`QOjs_T+~p$!j|bD&(h*-`6FFM{uQ%#MJ;!8{AJF||eN4dV)=^C8TAn68n!Y4eY+sDJn4tgbi_LiAdSC1b zK}nV@Qjq>d_;t&j;2vdu`w{d7m!=KB z-#Km<=166yKY?*YEPpM_r1nQUXgA(p4*LlA{QdGFMn5(lx~=p5Oi?d?$#L@&B z&3r3%r8>9c5y@qrd$W_Jx73L3D`gP}!ZRPvDBH0S>YJxBg7!~Vh@b4Y^$2^k^7!a- zdV4Wyd4u`Fqr@qfs{W}eLQSp#@0KZ{z_Ha?61MU5F;xpheQ>dp&ku8)MTR?h&Lx0DdpyYfuL)es57MVT@vPE_IZ* z+VQ+G;C+f;_loy_v5n*R#0qh!pY_4MobaZ1=+}>`YA&TLHP|%dpD%7UHcFO*Ok8q` z_?6?7YmAM`+qPQXuV?Tt=A6u|Kb%vWCV7lZGWEb%Jhx-aFI7scdW?umOx4~?+y6^)n*Ly`l3Aa7xJW4X={=>_o1O0R#0PiT0`+V4=@_C)_|stD`N+9kXWM8c zZ>Bukv6ot9OeO{FPoT&;+&9SJa%AIJwxu=?zv*?Ji>Bkp5UN#IP`mb-$ROM2zE!47 zn5;2;tIjHODVZL2Q>`&+B@%tM-tmTU_CnQb9{bg4!KkB00}iblFm+PHqxy^Rn8WN{ zK^nS5)NHGp2_Bys)NlgdoKVJkqWLpTl3?x^XgNgjZPPmtXdkkaH*7vU{c{-H4~DCS z6~Fj43s}f)dB0kp{c5xsiKk#78Ga(RyuDoB`CSAeJSw^Pyh;bNvr+23;@Z`!;(oGi z^b?V31zfhz__o(%&7rwbi1+G8&p0Qx4~raMz1^VXx?RC*#CvR~DH9)&0d{-)bSV!j zLtJx;%=6LJhffph#xgS99NGSAr6ieQD)_%nB)MM}y>HLg$})eOoQ;>`p0sV-Bj%&k zgP|L6Z^WhIvo4gAM>is7H-M`e5iW5z-b&4`z7cm5JSIL6B?{ROL$FI7|KNp>J7?a?inQD-3X}Rqy!T)z=isaF@vVL;o zse@GK-M5FPMwOKNZB>dJQ{OJhO_R*0E#L{JgTycUGUSPrk)fAUE+M=xTSi*I(OuLa(pd zor%JkaQQRo9iM;PLUt>`g|f8}{z$*D$IBAQE@%#~1im}4#yjY%sLp}V>pQDeV{AoU zdy!FFC$sPKeA@{T^q2~MhWb8}$bBdlsrHw5@u>#fePd>#i1{r$r}sSRzUFw+B}~bp zO2wZ%x3Zd}KnWJ!M2`i9sm!!mW|qf{572j&QX2t0VBo#^j`zOdwCS`j*>gk+_w`iF z6p^fWkiW|mmh64+#nYQ2G;~o%_=yq5k4-nvYLlh&&eg#iF``8Z=NeEV7wEvf)^RHR zilrtemqpD4N+oDglFM+`x68%V6pao>2nAj+&&?NS>VMR-%fB^}`bB1*KN)WGeOkm9 zO>rjj2Fu3oWn3%70kw>+fP?hiy8+CfdQA&j_$5`sKZFMQ^Qqxbd9BPYxdd<&~Ut4*c%j>UX=ee>3pDMDd$T;N%Ugv!#~Nv(gnGhAF$5FCi>% z31-KFh{O;<+MYM`=VX~8UVFGQ6MBnH>KthW4+CnSr22xJA!A;G)EhD%Vr8>ZhBXG!<)4a^9O9X zE209dJmMFe1tq@o-1FteSzD#flvj=V-TRMo%6E+Gbh1K$6lqnwa=K0@W%XQ}=g0Tc zn;g^oyCZXdD@#YDmWMZ52bT#|f1ZCQc`4g@i287tz7!8CbUZo;#No$dMp*Udn$%A)^$TK9dI$DPrR4VPXq5&~P+xj*jpmzP@i zgvLCY8nap-32{VwN*s=qe!lXaqSAk7XvQ|5^XsbB+u!ej!%{&uQ-c4dH{!ofu6tc> zs>wCNuPLtF6r*kDo(aIR&crltE62>KSUgS#hqOod!X(EJ-`BC)*u#;**(z$w*%U_( zMpDlpU1_lElSB?Op3&?ZL4)S;bT#r%CXIcaUkXm-4y` z-!~Yo$xT9sF1>%`=%i-cSlX48-u;^Ql>6+<1>Wr~MCDBr#wt1^b$F_v*=fFP1=fjW zCe6CY0`iL$=!Z}5kB2asP25Ni-D&>fm(%ax$?N>aPo$nx$~q^tWy%1{ri@%E_%!8^ z5IAVjJ&=ItHf-+#7IqRzSXGUww`}hBALrkWBaAFTU9P<=HP5E3^=z9See;@0_cVp5 zQPM`R@R-xdCvxD(_N?W7=CPEKue_g3M<5Sj%Hbhe+~9h~&zE#7Hzb@bhf#-wX+44< z#T`&H1QA+#F3Y4I<|`yEx>D$D;B@-4c?kbO)u0S{z5U(zg95{En9QNI0zV!XoQwzz z-*n@Vf7`pT>a;M#OC5FE_B#EbbKn64BanBUu0Jeas|$xVgcFITI!Mv>mZ{#ICAul6 zI*u=lloy9+GMSmjmB$S$2-_r(%(Yl;B}|H=EFcRZwA3*%flEOj zF6psyNYJpQh9PEj3!A57gKX=z@?Fv(22s{*$gwT!iujVE3tWtdJ2CVJJZ5FMGHi@y zs{$nW%!ugMjem6li1PfCm<5Z;LEeko(EdJKvGA$e?A$PqfY_gPzQcJlxN2H<1$nw5!sq7 zi7~icj@Xl2%(+s(W=V0QfK0v%-A(#CQ{v;0#>PiUZI589^#@N#EId#Hb%-Ik$-FmS z-N6JaO+p{SwPq(4wpp9cP4@;+qfw3sxIQE0zs%sQKULwD{Ke@1`qc+UmQwDdXp@?j zp**hMk=Li{*YDKacThQlNa}E~7Tym1KKj$r^hc?*by~=T_R`H8$4k55pI#P!M zl3kYCE37sqaCv;kWYcThua=fW&_;KA~D+U|R2^`kxB(g-;90oa(T=+_xhd>4rwfX#WOIRgj-efj_d-_<5dc1wB`~ zS}{b6P1}V0he!n)u>B3wW%gRD532(Xdjl!|=SXzJ_TlsS8u#$_Mi;=1=9W0R@Im$z zr1T+x_AiIm7wXf#hYe#2TYumq4PMb}gl?3~cTBdfEQ~e1M1+EOmEjofFR@J2eLt8; zmLTIE*16)cb} zt=@e&_us?qop=)FA_^iLVjNb3B#znMLuc*OP}2Y@HV!p|_ss<=|6aBljkxMy!AtVS z#f}0BJrCEo&x7Z!vtQ^OHb-RSQu>w0e zg{+GoP8b?&1K~K-gMyJNdPtZI(=T5=|J$`GhA&9_!7?7&!ls&rJ{vmi^vKkKjiO95 z-}Xe*iAK2A7cnVOD4~F_|MqIY{}SmdZwQ5Ry#UXQ7p@Cr2>M}i&yfwy3hvWmP2i?X zmOp^sETam)9&8JJp`|-U`F{1873_Mljap0Y+M0eWCL0nYx>K+hiJ;Qafxi9xxDR%{ znpkaa!L=y`ss;xN0AQAyAo|P)$MkYsT7-E+s8Vset?NvjPGbDg- zswjG3{u+fiSP=?RAUw{XrVE2#OpmAFOl#mQoOj-AbG0=1n?2w+ z;(5+i0H%{bYd zClZ_W@rNS>o@t|MN4JhPzwHDJyow$4PuDzzGa{em(y^%E%MM=M5xvdal-qL zwVoqH{&9BcrEy_i0#WN!6iadw%d@yF8QAQLBTMr@wJ(;Qm$IJEwFz%)$$>YGA-wps z3~58w93=1P9nUc#85X#Rc(|}Ydr;z=yKeQmtMwADIRG&1eIf;;3t>o3ATs*YYP(6k z21XPDe8tPbUxMH0!%gI6Ki?5{G|Izj{1#ddu0zw2`9K6Yy8CcFIN})06=p2<>N
!Vc%)bzWnCUv1e#1$*-S0hS#b}|zFwgtppeWwnDl}K)DuaQ$IvQBZA z^q(IfR{I>gNI_zBbzeUJy`V=I34a;2dnJr7hmq3b2F0Ka)eeL%Z#%#B!`Mn)+#M`8 z)!2L|iI6NqWJIV#I&nuSDU_8ZQy)y|B7S%U(Q^s^ZtogK2T`M8O#0_2gu>GeM7$dwo`eFUZ+frpXse|QiW?9zOYjhR%KaErA8+BQc&6jSwgCa!r0u2U%{-76 zg$+Q~`(v*vAMK7~5gD;zI_d2sw*RlH>kfqa|NnRADil&p+wk-gWEb$9RI>&@Z&`>(v-ukm<2$LqOXuj}gx%#qZs zDE;g{*-;QQeKXwJ11OIS@Us-qhw5k#E^=*ea}Word}lk46+XEaK99p+0M&VnPOe1p zFfRD(uvk}ElJ!juQ;qmj^XymL2UzT^A9nptmx2E7?)3Z7T4dedC>}{*b}$cR~2IFE4y&%s#gtpR(S` z;CcBi;5@cCWuU*J>?c{T$Ea1f`P^a1etzheunP2N4>!NUn3%UCmcCk_&_dS!b6&5BOnS-p|2l`V^6T|Fv*`Y5Kt);0ZHxZZ- zG|+l021l+%MT6=twTZkI-k^OC=@S-}B~MW^=`U$&2R~z>WH1l|m2?j*=ZP4QKKoDX zeo816?(mXQCpRzQ@u;g@ZM@gs)I13h^1sGs$0e8_haT?<%EywWE@j8pWQdMK&Kh_q zOqjhC+1E0x(i#GNLtlCW6c3j$ILf~pKj}zd@xN!x%)R`&JYMI@iI-PiO!{E5lbDJ% z$*NdOlV`gEfhCbuU6HU@vDQI2aluJ`pP9EHh%;eV$-FtESViRO8dDnKeY~Hw52XbX z@gO)!gkBXA%$Gq;i~B1I{;GI0UP9F(rnJs6V&`x0Ei~}zM^L0!rkg{__#cjely}xD zOCx&%IzSqO0|yvnhe8O)r3AFz{r~>_EwBCX;$hk2Sj0%$giG!G$k3ATkQ!3o-NP{+rf!V=Q!E5b|<57XuP0AWdSwlI3}$xt>ecHDs`>tL%$aNSsXHr=CLFoEL4< z39f)C4q?vM-9A)v?WI8e4pjN?5BVhtMlpy$$QMcpf~JCkf2O)4e%U|kJ(vDjt|K*4 zana`NWmU#i?FHx;5&0xqb%SD((+#sWY$>*fLfqr6hRWNZL3r z=2rJV`s2-(X>%^6-bbfKD8Xd*MX>#b)Rk}hEpxtM;p6@~Y*ck92@mU_YIJeIyBo1u zXSB$@B~QBvNy>gt%sM`+OG#c`ZDA2D2%jg|+q!=YQf0ygK8mVXi~9ZBvcq=)aa$l! z;smlr*xy^|m%iKC!_yA)*u`$XPU9Ac>{b1{0Mic@QK_VhHY5q)q>K1RpB9fBdIqM( zBbxRx9Ey&W)3()HrJf5Z^~m8yc>P4q`YIx91e~J0S1&|=v%&bTLcCO|Pe`=|EXd#9 zLf*^fwImDs3-Z~q3Q9Gj#}Bq}*L^u^g3TT(N&cNZaPXTk*;@H&BKeLxxj>x(H!(8d zYsxf{u~>O;rTib?RHcFn6;8%Ei4cwZNCD(Mq|QQDb(sMihyeJnrvj`b6rohjRV8(o$)`$|2|(HU+Er9rUpykkyFvLI z2vae!ihuGi-!Bf{3Rup-3f4gm|EXo+T8=MzU$`gpA%Z+l!aDXtUk23_QD#eKWy9l3~g#amVQNrXM*{4fxks$ZYjPu7JFx zFi@oATDIt8$45o%Ya2@MT;s>DF$wTeq*j)-_fk}!%g)(~+MNNmxH&(H!xUAfW5+Tl zTpGzrcGZd)r!-|bNO!|dLGj0SgRV!dhDQ@AWb^fw3 zN?(iEuV<%)>AT@#0+kKnB!m}+LRaykbJ*dD!Abe**HM8(<*|1!yraY~*=f~WErx>| z<&V^UpY1JpkhN}YB&lI81xV-2Kucpi70EnIh@GZ4eIeVcCyS&XynUaOE3~G+fSuLt zltla@6BH5ssu(d|q`nwI=M3_ABbOT3f}~ z?vlB;)sTMj%w*a+P*)h}8u^6}rdAReZ^Gt%sSqn-!I-VttG`MuhOa@#`fL49t0Ki#?bX; z4RV`6=c*s;S5vG4r*AlQ{n0&vP|E-_lZ;btz9rex>jU()3dnK8Ym2)0-JIX)AmQO~L;LN+cZjEt+_no@J`4mDkzX zBCqxNT#^ZStSxd@mFf_XBq~h&O~P0=nL}iUPRW*_eP^e}wc&_L0FbbJKH;XzI(F0a zET)&v2#Q$AQiNBHJq$$bbEHg79Gewa1KI5wDhJ&{pj3R?V=BQ5`@TQbGot>L#X&fP zM3i9d^X`5?9&`Dwv@65oz+cD-946;Xu<3;;I~GgsCSx9r z9uvr)MBm$yl6`WF)j)kv)hDsL3}j-GSt!E&^Yh-8zB$fuifi(W z)EF2v9AmveFs;-RIOk2rzIH5W-{Ib1Urp$5WYbQ>SFR`bYR%rYhMLf~4ktY&US`j~ z%@&71@?>6HbjXW#>5P!QPprKAlyCf&l&#_ct>qch7J^qcKLmbZ!Jh4V^2?!)FnjNu z-)j0*>zailR_(XJz7K9O1^~V~iX0&wNNI$4=Ng`e?r)4YOGx;n>?)+cKmt`Ymwu`4 zL?|z)f4+-Q*x5-nJ(gpfun4?|0NjJ;AcQa*{>^Rw;b8*E*}V@}r%EL2adt=I7r#hw z8|T_`W{;?R^?5`|e`3fC(wsVWX7t&$dRn!Q!2W+k??lGGTor7BM*Uh}K|OugLdLj} zP)=}m>}vM=H}m5WhJaRspc6Tiw~3$m3UN0$z{byE%r!8R!3bl+Z2h2>_p9aedzpJh z7pF%rv=AbfT~(*Nq!kxWyZ1N0Z-^@B6(~f1^ia9Pr}pPmxkqVQ5;!?wJ$M2UGkVqP zJZ4e?MEDyC&%j;XZo^Rs>NC<{uN^UFZ=G`4`2l--JS8iunhL_Ekxbz+2vMJ6e7cXG zT|Fkw7h@2FXy|f(yK|u8lhO|D`J60_;aUTBUp!g95j$-zuB0+L(U4LQt`fLxPYAhM zuL-NM+LOR_DZob5zC;fvtL3#F2&dYz#=^dzp#yDn0(qynh;=NjC;EA$T zUVFdzSn}wss!>(BWMZ$%(aB9N#=vHe@B08|Nk&&n(1_ z`7ULll`I;e)^6ys`_lE(6kfsG%s0mJRf}U%K&%{`-J#%2d3~aX!wj4SxL}58IezK_ zrRqlL%A_s`Oqa!dNa88I5ZUy*qFVhG#4E7Il&*;WIrpwPt;ZHc(j{Khw=+QBjksKQ z=#0aBr5#_#n%A?0ST-$EMhNym4^$Jxfw%yUaeAU6F6xDsF*{U5;DrN@`bH@?bM%df z{cy%W@Rx|o9r{%({(obsy000(aH)~%%#Ka`*78_>dEXg9q+sZvgWr*7NTOMo32Ctl z36YRMJ~vwIHM-a!#n#78?r-xShT3q>oF6PuAz#^TX~h-q(`2lL*;DM!m4OVZi|s-3 z0&iE5I@KoKhp}qiG8JGsh_FEebq6$L(Mw1$mC9c7as{&7;hfeapVS>bc0_PGgnIbj zQuL@cc>vvRMN-&dej!0~PF3iSkc=d{HUnL3Xtw}fz>iB`D;MQd8m@o*=?Hb7G2`kA zJ~vqPGu{j#FY({^m@&&3xjEImnHcA04{aFwj9>~~Uqx^?V7_(<w9_E7TLlaJQG%C;)N45eYkcQb7f`RL_|$JF`3sV03>{QX>|-Gw`(@!g ztc|KUMSP}b$AG?9B;N3|g>i=A55q!NMl`2t7f1(#096RYwx&s5@m5_WH+MtB(Xx-E zy9lifgr>JwDR9K%2{8c#wJ#2W46zzYNl;B(;`~Vb1D*P)s=(nF;Xe$%MF=H{*@t=O zX60lH)gj%ED4yxZUPY*l7m_X(0{fxsP~SPvl94J5ytrsfpdMqlD>>i4gCUU+O+4xW(hZXogJ0sV_W{&egvqBGly8X>%p z?23J#kcemPhfk0VQ{>l&Upl-K`Vj42DPMszBK;j@E}o$#dUj35RZyD1*3OFbiXkdt zX3d>0SJVlVAHK`m$5{#9p6r$(_JaIaM_!an@A(D7u*LUMrK10Gs@+8L_CYhs`J%AY z>mY!-Nl5`G{D7cZe#UF_y~-jt!v7f)uwS9TuId{k$c)wLK*L|W2rmCuILu8`=n1!|xCVqJmd|$@ww?`D_`+E?gW(-pGUFGV)-%#}>8^_Z1 z_0N4eQA#Hj!Pqq*YX_D1Vb358;q70*fbi%^kH{nbJA{AT^vV0FgEbOy4#rv{l*{qA z_bP~B^NJG*isSDVmOxOF3BiqILo^5>F3t-f{%P9A zcyyrQ2vu`+Yyi8O6}pU78ePIpX=r32xPK@_aP4`LdnMXn4|Kra^96k7ErBy{)<)9> zY=%=b;!c5I=H%~W#@gG2S5)%-b6H|?!Z!@#_d4N&vWApCt5o#(MNg*K5 zmRoZPyd*Zb4`WE->Yn)=Qb>g~$-IBKZtqQfjc|AZiu6=>)_{aKEdOl&(c;ci-`UJ% zQIs|Y&BYx)zHfSu8{+gVk3F~)xw5ZeXY|KbGIV{OLJ1N|T_v7gc`eH{^U!mcW_+BFv&DrXn2sEAi2tLV37DK!Qsb1RCisA5}P8bGKmu+I_hao4xZ2xJ?uLO38 z5pCX>BBnPK!GZAkCqzc`fuN0cQ#|Bz@OSl6!E?0O!eut%C8e8FTy0tJFU$Q6T+S#t z$$G!k$C~h*5AbbdU&ae)&NwQHU}WBUn#`-py)aYtGIWkg)Hw%dq_*A86J6*Ni?$`2 zUrjoQ<5~D)Y$+>HU>T+kdQr@ph!?g#?H>Lp-tVmG-0Sz9z)q3^P7xDvJbBFi+hO4K z(8oRAAx!jn&oz|2bi|j$N(sJedAFzZS?eRHX>9Pbm*4_HxBk9d@M?1})E@$V^%ex^ zC`uUd&&h2{{)6}Tol=KaBefThCq1AeuvW;Q?N*NT7w0pif)~{*b$c8AL>_p#G9`GO ztnbvR55pzwc5FkXP*B8ASBr9A+h9|Z-;sQH>PpbZwTU?#57b7|rqZWWI(#Z_2V>F7 zgh_YOyi})c0O3Fjcq2KaVOKvs9lB7TMoH}bvKDyDuJhdcXWd7pEGJ<<0f!dSPPv&C zrQiKrP>O^u{kiMTfnocTUu2TiInO#wiae5qs*q|0zebEf$i>|pfn&BGxux;XiUH?a zUCBmWtNAx&Y-Tp{PIlM=b%oE4jo}n-WI5ABs?>#b3Zh;*J>x2@!Mi&?%d!Z~}}3ogv~PjjZ_!S31?%u38ykj*cy|$3W}b0O z5v1Fb%}~l~iX4wJ?XODFjvMexJtq*JJIZz?{fA02xN@Sl@yDcFNK_8njYde@A@zi6 zW@f_|pXzh3AW7*=Cztb*x^bJa0J%?GU6o~8qca5P49F%29LCM4@V=4pEUvA8PJcH} zQ2@tMW!YMT!Rd^w)GdqO{>y*4VU)}`?ls`vX}p+ZF93zke-NS)jKWr%Q8*+N{I9n% zdH4tsX|O+)u=@F3zNhkf<-`-B3u}IHsnwuLE}A0*v9~H$+4S#(N-3U)0=-f8Y=jz} zOPxpV=n2M9p+^w{WEAlarF#5kxYIXmjV|$Q13xmkB=ujh4%PwsHz7ukO)LubDs^qF zg?^R{lIIH3DZ;=CnY@t4Pi36-n!D;wYEoMuk+70@g8Rb1-MbrpZbZ!Z{5uYTz_n-n z1H}$;)cLcX6YXJlFRq3(oqs+If(yyYdOwfm18<&)=;#=tyxOeV)OK{wkeLgmB}ZV0>D55v%xiQq+ZXW&#b z7!y&`Y{=xwYsx-tRn2Lqt$%}p9DFVoTEKCvZ z^1nQQFhc!%T|^{hI9TsIyKA`ZOzD91Pbb7+yHES>i+}o)HFAr&v4PJwwt>m-74s+KH2f!W zW!4QYb%g_#LTib=9tjzT21b5mB|FpfFd_=Wwjq78iA4PNR z7(ZoUBEuVsc4xXsc-~!N=FlROXhx^G=KauvJJ~nRr5-i29*ZHfnZM}GPVfNMY8(9- zuF34LzG3&-$6TWux&nU=q`nP4iGB8KPjq;3=wTTT7fm83;)y>LPiKeKP;ED>{FAt^ zep25q4BdU70X=&>vi*llAcOT zAT}y7O%=)re7Z)Ue6#E1r`R&ZFWV|cbsuSLh!gMaH6E47Z@m^aVqxJ^Y-%QgjjoQL zgX>j5*vbH;_m%M~Bnf|O;WK-GnH{}vv9~HikUS&AD02E*;pxa^(~9Eaj>Y>C$LK2V zIZcBs)k?2zKX#@Pok8SezI2u?ZXascBLH1$FPf7TJl~v#KcX6d&ou*8Hy=bTd*lDb zJ`w(j{WnqQM-J~cCi(50IoyQ(*QMT!)tb$iQN4orC7!Z4A!$DqRpmgp_Ba$9q%a;-wN zU3eb6#-okK47iFRMEkjVM9e#*C{Q+>Uzm!%%i(g>f%)fOThGzocE)RqV@WgqmbM*Ui(=o0J&3lp=&( za%JlIhZ)a891fX))H(+5RMeV%7~PYFitzV0kjFE)A8vSsQha{%^^+{+o&@9*D#4`e*sVZZwD zKYstfP=j{07?w&;_1L(Ad0Q8Ntpf|e|T;AM} z%yCw;pLKX~lCl2W*AtDD1N)-bW+`lB3aP3|m14R|@4Gt7-UBVF3KFPQgJDo2%c3^f zR^ixmBSQ!)$^Hv>6anpHT(Rp(J^A>MxUyWZyw=Bkwk zN}A+Lt)-aLn;-5}{(fo5`y<`py#}5PuQkhi)*k2L^CBXss@-*mca(tpcOk3t#UW z5>*ZFKD>p$5UwkO7`=;S5SRj{p9+>=s}dj^p)N z)`Gp_=MN7X`!&8=^Ie_bUAuOA0a9669k~X@{J8+d+niqZ>Gh50saxxaHKFph$n4rh zM<@^Y@+xHQZ9VHyRi{^S{hd&|UlzXbg#g&&%9MY|0>_zIilj1+?iIYA@Y^dsUoxra zGhv81`lqx=T)xP=u2)v!M+^&0`7fT2u%O258TLE&3aPGUVYQI^%FW=C+SSNV=*!y_ z)pAugMrA*RQ8x7~dPa4Vh=AK#_=`bRnV(!wWgQWy!e*GZu)PbE;*^VV{@(iU%>>>< z`KG>?BGTCruiJhyBZXZLDV^l&xv5W`kC$^O{VjLVbBt?r^!~EK*50#7 z_`6V@)hajT$K^LdwJ4~#n`+( zD)zIlDX3vJEG6zvSg0vMB-K}>{(R^g?sFa2&xpQq>G2GcdZ2B8kvWoJ%(A9AXLR3e z?~3HxSCF&&oTh1KLz>r=#=Rkyv3*h09LF(`NvZJ-5d0y0)6Z3(=V;h zQeFiIIw&%Qx*m9!aO3d9j}H9ybaTx?EE;cGgVhqC6uS5`ev@*0C4vt_BSpTbB@w9G{Ytp=JEj$(P-B4)ldZ)sJ^0;$#MW}Ql z-nngt5;Qz|u{rhood}h_c;3)CPu}M&So817o`m6B(kZ+J|-OvmE&b(x1%4EWiO84|2AB>Bp(vlR4`&9T9*^&|a zh2;>HpcDK&NZZD>Ss5SUhlYz?DfjV0y`}q{1+pspYJrPj95i+M)0HO1KFg`ciuwr(X*iHesU3?Q%i$`IR0kc;EkqS z--}W95qlGgogme?dc`8>O-_YhuhgXGn#n$0C_DP}gJdl$!$i(kBbJkz;tA1l zYG<6PgYRD!%pT1P|Fyq@w^Qytdg;rJ7a5As{@$1Er`!LG)nDuJ=sNMCh_|jWK|$hD zIkmH6cI{i?M2@u&{dNAHzzON8&cU_dLuq-56348+7nMJi^S6F_D`-*cJEi5TXOD0X zr73-{qW#Z`*6BB^mB*)sCr&C^FWHtYJv^s*Zz*Zzx?p9Ac9}Pt9N#!n*(&qi??bk; zRgG4Lc%9|H&ccY^>6Oq?_PPwQ=dAW9u|7KaM3&nOeaiiugNXx-Y2Q#0(e^{n|8jj% z3e^_6Ou#^I--8QQO5t}ltYsZwrj0wl|EAJ?5f!F})7zsFp(F8`_pjzqxZZw4$q=-h ziKnzh%+aBAa;zv@D|%GtTe6;G0UJ_KV{NbQMBCDz2Qy89d-q!KV^gDBPk%HzE_Mnl zb%s;*%>y+FCg;9fcKm<*e&J1ZquqGO;~s&Uv2b#&${$oe2;rlT-CG)gZ0A?7MwQEu z%yQi{R{ucVS_1yUeoc&MfDYa+J51!+Nfi21V~}ykf9dp0*_c!|9(z57Ln$o0UB}Q2 z53jt!#6~%!KJ{?6OLTRzm=1G@jap-I%$~5(l)_7Xx<6eOM6#$)J*jm*ekLK`&$&6A z^6}&i_j)=VHUe)I@1(iFReS zBUDqmE6$x)HfzR~?D3gmvSjq}!pSV3hdv|CScACvgKGj*>?+E1B(p`|;A=|of9w%?1%eGnqP?_Ic}?lJd2NikI` z>#a2O7`;{L7SJdA=~yV~p%Z}~o$#FV8coWC4f|F+5KTC6+C<6O?zO>wIP=}6Pp zaX(eM&K{~X?+-e1tS-diy|QpDvHrb9v}Z1_{Z} zq&RpdKZn%UeW)yqCz|7UxEcR6D<^&K@f`ZY;Vboflx$dk4&bBtxb}Z$w6Ze0yyH{T zBuG?8Nci+BuRU)(|H2VzRVF!3CRytXeYg9u+~tlcy3$gjW}eqEx^kswbZM!UH*YE- zIB%+S;(?=mMG?5ud8gu5&n3sUzdxj7u4GT-b_~mAI>t_TpBjjl95_kDd@3wBr%8I} ze!a-&^>B&nA1Q9@B187RS}!w=L?5O{m?b-Vg&dX7R~^z3m9{)H=b}E#-Z;{sv&6uirYwI$@OKba zk-aMrJbO~_hAO`fDl?q*g?hfp-<%^RB9;lZtcIUON*BhS zab1Ikpd@lXWI&}rI(}3_?45JNHPl6{{){cPZNYC2E2x0VG(Y$Efv}<3B_-yzPe$|Y zzq`t0kI2_Ei!3eFq~Ag8#i9{RsAadDLo6(evft8wV+>bV55(%@3WH~=KPjLTn1V(6 z6^JaV3XCjf!E(86@I`);=IT<2yFdqpX8K8Jsf zcSe+-L4OOyl0&4+B)4Xr1{ zLO2x1;Sed~gUuBSt znozm2WR^Rc+_x%RZp5$PKh5(WKDVYee`FYS=8|yt1Dv} z`FCUYrrOwhc-9NY_t?C)F~g_Rjazlrx*^-Tto}UlWfc(847KWX)3hF2WuN~uKJ2Q z-`pzLX{5T$o+-a@dEc)lU2yrSRix;S=3hp1_wBe!-cwoCfaK39v<_2{={icR$ z=IcAQHKh+cC3TM_g0>NZn7in$De>@>s*hsez%m>oazLenWD&g7CqxunB!duc}utKGxTI42X<* zIO)bw+5)5a?MgQ+G!O=$2c8;(JHI&mR0<4C8f{>@u`)jY({Sw6q&{s3UMRc+0XPS^ zx&i)gz7*`3*S;y_+Zf7!j$P{XCPEJpR4J0c7sV3a~iU#sK z07+XJo4EiCa?Ht+gZ8lkCN5?RBz!YYBgu$?=5=xMBF}-6%#C%wgF$AK92{sv4e;BY z*aFE3gY?u8kDz_5j5avE1romF*I1u9M5AqZAkKldGJ$+I7-aX+A~hPwBzCDCTOi>o z)Ne`|F*>vzflC~>K*D)IobYdcnpApf5i7PRsR@Ie%eEAvfi$B32;bIO@5`VIgG@GK z5Zo9Fj-`TIfg2!?0j@KzCEa{O`?yQ6&uu-Ss)d6-U4cTxB zE8N%V5pMk%fOSgd!yqT$6xq>0=CHdlZ-Io5zi%oZ;2NIwk4;f`7EEP3U#(Ffd~UL^*-*-a76Xp+3vajxqkA<28kv7!z7Y3DlMrvO5ZQ z3~hEgMC<4(+_!(LV<6}_q|gAWo;PMZj*{4#Q5Wv`jNSPdt>Xc9H*imIWA+;OrqlaG zhnk}__6Ww+(3;rH_k%5u89r}yhPLGi=!^WDw3>%ii}Fb4GnxRmvd@-n4yq5|@?=YL z3WIMM0QtU~gzMcJR0tk)%*o1(Hs}%L$QF%7;I{GGR^VBwb^RrZs;9BS|K1bcpiTtt z+{Ra+JSZHX7gYMoabW|!6ki|hcn58d;Vo4fh@rJ1kZ^qg%(ecnVM!e`D%nBPYy#5j ze+O%}TY4$wV9Z^%y1`Yx*HlO`RvX=- zaId#Cv;*9&^PKCajc!~R^XpsPw#%U5ZHS4)32t=@fxGobxi-?U(VN?Bb%QU@TsyfI zW4$q3816N=xwauQZ{Tj@&8~lG*yzn^v<1V%2jb94C}!h8jCq6;-0D^hcbjKeFRlV- z)q0T_ZJWiEfLPY}?V#i69Fs&MH&{fPB|m(l1?II~xVFtztry*GiYu** zYMt!sR{=M;pY4g-ZNyzx+E*OOxE-5X13Y~|8 zhv^faZ89mJzn0oAwJ&|^#bW@|E4KWLTZ^-U4Jlk8c72!BP+=e~x!vy&81fX$rj-$< zLzLcbivW8V5k%v5Vn1uX=JuE{cgyXm-$d{jw|VSt)b zj;x&ZH0k9C!Cl+5MbuEKK(~cAxzUUm@Lq-(&3lAp8J@AtZJBo7XT-teD%Z?<`lrIpeKd_-wHu}+sHmNGQcIyCOyDJPPo%uSTw>c?`6n=Zs9(dA( zNXJd2>corNlP22 z0;kFGQ`OG2!3qF z3hap!+w%n4VAr4Gyf@88a7P`sj0)1aH}~2HUHfzkYCD{4PS6^9xC!;J-TJc#>)S*e zhPg^vbklOFl!7}g#fb|o~z*~QSu?c0V57jP77)Hu_~RB(!zNZWcKKH$ec zkokfa;paitq3%TupQ1?*fC|fV&YZjBCR7%wecMpOV5qEd2{i7$?vL}P5dw^41w+mH z+P$eK09CElfhup zgMU5jX>=>3zYAXYpeZ46`w4mf~PHp%Jm4Q_Z1%*b=w2lf^CVT@We!%d~bgi5D5?l4f; zIr?+(kU(|{UbJ`y&!kBw6m25NsZlm;}3)eYPbrSX^)5&#uK z{1%{5O6gEvvZln4)Pv;&V3u*iE3jxAmL>>?4G{l)FR&YKHk( zu>}-_H^2q$D~>;DKyz5#X!;PQs5%UkzAcRg6fW%D2Ko#J`YhLhrh|?f6UDb#R})Y) z?uZRLP12lVa9#fc6sD*}WjamqwR0ms{0~r=qMvbwo4S&}M~@v777%t|h^ZaxFZY;gV$Bru7IGv;Z%N$1#$25d5zP3f>Tb z$-?i%Obdx{3ig$6vw{#{h32%WceEYKqgU9rH`4XM#-G3CBelUqYTCqYJ1R~B?l?5H zsom*N)NM_44kqVMq6(;hgU?3)33ujgOKP(% z4!)PuY(LGq&TRkB4Hd{|0Hm5k-DciUb~T2?rfp*M@XgvH5C{nRBSR+*{;?Cb*60vF XK4{1a-Ad#Ge?jP;Hqy-1unYJ - MinimumOSVersion - 15.0 - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - com.googleusercontent.apps.841077018919-978flnqdu54q5lb5e56od2jr2oha90ll - - - - - GIDClientID - 841077018919-978flnqdu54q5lb5e56od2jr2oha90ll.apps.googleusercontent.com - - NSCameraUsageDescription - This app needs access to camera permission - NSLocationAlwaysAndWhenInUseUsageDescription - This app needs access to location when open and in the background. - NSLocationAlwaysUsageDescription - This app needs access to location when in the background. - NSLocationWhenInUseUsageDescription - This app needs access to location when open. - NSMicrophoneUsageDescription - Used to capture audio for image picker plugin - NSPhotoLibraryUsageDescription - This app needs access to your gallery photo. - UIBackgroundModes - - fetch - remote-notification - - + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -47,6 +14,12 @@ $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 + CFBundleLocalizations + + en + ru + uz + CFBundleName customer CFBundlePackageType @@ -55,10 +28,44 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.841077018919-978flnqdu54q5lb5e56od2jr2oha90ll + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) + GIDClientID + 841077018919-978flnqdu54q5lb5e56od2jr2oha90ll.apps.googleusercontent.com LSRequiresIPhoneOS + MinimumOSVersion + 15.0 + NSCameraUsageDescription + This app needs access to camera permission + NSLocationAlwaysAndWhenInUseUsageDescription + This app needs access to location when open and in the background. + NSLocationAlwaysUsageDescription + This app needs access to location when in the background. + NSLocationWhenInUseUsageDescription + This app needs access to location when open. + NSMicrophoneUsageDescription + Used to capture audio for image picker plugin + NSPhotoLibraryUsageDescription + This app needs access to your gallery photo. + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + fetch + remote-notification + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -76,15 +83,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - CFBundleLocalizations - - en - ru - uz - diff --git a/lib/main.dart b/lib/main.dart index bae53fe..8730cf8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,19 +1,20 @@ +// ignore_for_file: depend_on_referenced_packages + +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:customer/screen_ui/splash_screen/splash_screen.dart'; import 'package:customer/service/localization_service.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/easy_loading_config.dart'; import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/preferences.dart'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; import 'controllers/global_setting_controller.dart'; import 'controllers/theme_controller.dart'; import 'firebase_options.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -23,7 +24,7 @@ void main() async { options: DefaultFirebaseOptions.currentPlatform, ); - await Preferences.initPref(); + await Preferences.initPref(); Get.put(ThemeController()); await configEasyLoading(); diff --git a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart index 720d510..79c5f87 100644 --- a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart @@ -28,13 +28,11 @@ import 'package:customer/themes/responsive.dart'; import 'package:customer/themes/round_button_border.dart'; import 'package:customer/themes/show_toast_dialog.dart'; import 'package:customer/themes/text_field_widget.dart'; -import 'package:customer/utils/app_router.dart'; import 'package:customer/utils/network_image_widget.dart'; import 'package:customer/widget/osm_map/map_picker_page.dart'; import 'package:customer/widget/place_picker/location_picker_screen.dart'; import 'package:customer/widget/place_picker/selected_location_model.dart'; import 'package:customer/widget/video_widget.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geocoding/geocoding.dart'; diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index 579ab1d..3736289 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -13,6 +13,7 @@ import 'package:customer/screen_ui/location_enable_screens/location_permission_s import 'package:customer/screen_ui/multi_vendor_service/home_screen/restaurant_list_screen.dart'; import 'package:customer/screen_ui/multi_vendor_service/home_screen/story_view.dart'; import 'package:customer/screen_ui/multi_vendor_service/home_screen/view_all_category_screen.dart'; +import 'package:customer/screen_ui/service_home_screen/service_list_screen.dart'; import 'package:customer/themes/app_them_data.dart'; import 'package:customer/themes/custom_dialog_box.dart'; import 'package:customer/themes/responsive.dart'; @@ -154,7 +155,8 @@ class HomeScreen extends StatelessWidget { children: [ InkWell( onTap: () { - Get.back(); + // Get.back(); + Get.offAll(ServiceListScreen()); }, child: Icon( Icons diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart index d7cd033..9ee26f3 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart @@ -58,8 +58,7 @@ class HomeScreenTwo extends StatelessWidget { init: FoodHomeController(), builder: (controller) { return Scaffold( - backgroundColor: - isDark ? AppThemeData.surfaceDark : AppThemeData.surface, + backgroundColor: AppThemeData.mainColor, body: controller.isLoading.value ? Constant.loader() diff --git a/pubspec.lock b/pubspec.lock index 7dae800..d0c04cc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -93,42 +93,42 @@ packages: dependency: transitive description: name: camera - sha256: d6ec2cbdbe2fa8f5e0d07d8c06368fe4effa985a4a5ddade9cc58a8cd849557d + sha256: eefad89f262a873f38d21e5eec853461737ea074d7c9ede39f3ceb135d201cab url: "https://pub.dev" source: hosted - version: "0.11.2" + version: "0.11.3" camera_android_camerax: dependency: transitive description: name: camera_android_camerax - sha256: "0db8e7b161ec6cdb2219540eaa4cf599dc963929e5f8ded3b20b3acb52712fa4" + sha256: "360a9436980590e7268e0ff9eff482ff73ac3e0f66fffdd203cd93d1bfed0fc4" url: "https://pub.dev" source: hosted - version: "0.6.21+1" + version: "0.6.25+1" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: a5a90297520e3b9841331161a7511626681153849c690c138e04a2b6d0af3026 + sha256: "035b90c1e33c2efad7548f402572078f6e514d4f82be0a315cd6c6af7e855aa8" url: "https://pub.dev" source: hosted - version: "0.9.21+3" + version: "0.9.22+6" camera_platform_interface: dependency: transitive description: name: camera_platform_interface - sha256: ea1ef6ba79cdbed93df2d3eeef11542a90dec24dbcd9cde574926b86d7a09a10 + sha256: "98cfc9357e04bad617671b4c1f78a597f25f08003089dd94050709ae54effc63" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" camera_web: dependency: transitive description: name: camera_web - sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" + sha256: "3bc7bb1657a0f29c34116453c5d5e528c23efcf5e75aac0a3387cf108040bf65" url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.3.5+2" characters: dependency: transitive description: @@ -221,18 +221,18 @@ packages: dependency: transitive description: name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" url: "https://pub.dev" source: hosted - version: "0.3.4+2" + version: "0.3.5+1" crypto: dependency: transitive description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" csslib: dependency: transitive description: @@ -381,34 +381,34 @@ packages: dependency: transitive description: name: file_selector_linux - sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" url: "https://pub.dev" source: hosted - version: "0.9.3+2" + version: "0.9.4" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c" + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" url: "https://pub.dev" source: hosted - version: "0.9.4+4" + version: "0.9.5" file_selector_platform_interface: dependency: transitive description: name: file_selector_platform_interface - sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" url: "https://pub.dev" source: hosted - version: "2.6.2" + version: "2.7.0" file_selector_windows: dependency: transitive description: name: file_selector_windows - sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" url: "https://pub.dev" source: hosted - version: "0.9.3+4" + version: "0.9.3+5" firebase_auth: dependency: "direct main" description: @@ -695,10 +695,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 url: "https://pub.dev" source: hosted - version: "2.0.30" + version: "2.0.33" flutter_polyline_points: dependency: "direct main" description: @@ -921,34 +921,34 @@ packages: dependency: transitive description: name: google_maps_flutter_android - sha256: a6c9d43f6a944ff4bae5c3deb34817970ac3d591dcd7f5bd2ea450ab9e9c514a + sha256: "3835f6ae5e8b8d4d454d913575069513c9f216e088b87aa5c18cb3610951c6b4" url: "https://pub.dev" source: hosted - version: "2.18.2" + version: "2.18.6" google_maps_flutter_ios: dependency: transitive description: name: google_maps_flutter_ios - sha256: ca02463b19a9abc7d31fcaf22631d021d647107467f741b917a69fa26659fd75 + sha256: "115b03c2e637e74d084a78c0e1faf42884fcd8e65d1a9ce58d909ca5493afa32" url: "https://pub.dev" source: hosted - version: "2.15.5" + version: "2.15.7" google_maps_flutter_platform_interface: dependency: transitive description: name: google_maps_flutter_platform_interface - sha256: f4b9b44f7b12a1f6707ffc79d082738e0b7e194bf728ee61d2b3cdf5fdf16081 + sha256: e8b1232419fcdd35c1fdafff96843f5a40238480365599d8ca661dde96d283dd url: "https://pub.dev" source: hosted - version: "2.14.0" + version: "2.14.1" google_maps_flutter_web: dependency: transitive description: name: google_maps_flutter_web - sha256: "53e5dbf73ff04153acc55a038248706967c21d5b6ef6657a57fce2be73c2895a" + sha256: d416602944e1859f3cbbaa53e34785c223fa0a11eddb34a913c964c5cbb5d8cf url: "https://pub.dev" source: hosted - version: "0.5.14+2" + version: "0.5.14+3" google_polyline_algorithm: dependency: transitive description: @@ -969,18 +969,18 @@ packages: dependency: transitive description: name: google_sign_in_android - sha256: "7abdfa0088dc8f7d08eb3dbb1665a72bcb5b37afa256c9ec5d21e1e2d7503e5c" + sha256: "5ec98ab35387c68c0050495bb211bd88375873723a80fae7c2e9266ea0bdd8bb" url: "https://pub.dev" source: hosted - version: "7.2.0" + version: "7.2.7" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - sha256: d9d80f953a244a099a40df1ff6aadc10ee375e6a098bbd5d55be332ce26db18c + sha256: aee8bb29484611a37607849175a2009d423de6bd7c129326c69fd7068f0b6ed7 url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.2.4" google_sign_in_platform_interface: dependency: transitive description: @@ -1065,26 +1065,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: "8dfe08ea7fcf7467dbaf6889e72eebd5e0d6711caae201fdac780eb45232cd02" + sha256: "5e9bf126c37c117cf8094215373c6d561117a3cfb50ebc5add1a61dc6e224677" url: "https://pub.dev" source: hosted - version: "0.8.13+3" + version: "0.8.13+10" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e + sha256: "956c16a42c0c708f914021666ffcd8265dde36e673c9fa68c81f7d085d9774ad" url: "https://pub.dev" source: hosted - version: "0.8.13" + version: "0.8.13+3" image_picker_linux: dependency: transitive description: @@ -1097,18 +1097,18 @@ packages: dependency: transitive description: name: image_picker_macos - sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.2+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665" + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.11.1" image_picker_windows: dependency: transitive description: @@ -1257,10 +1257,10 @@ packages: dependency: transitive description: name: logger - sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c" + sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3 url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.6.2" logging: dependency: transitive description: @@ -1393,18 +1393,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db" + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e url: "https://pub.dev" source: hosted - version: "2.2.18" + version: "2.2.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.1" path_provider_linux: dependency: transitive description: @@ -1641,18 +1641,18 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: a2608114b1ffdcbc9c120eb71a0e207c71da56202852d4aab8a5e30a82269e74 + sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc" url: "https://pub.dev" source: hosted - version: "2.4.12" + version: "2.4.18" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: @@ -1902,34 +1902,34 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "199bc33e746088546a39cc5f36bac5a278c5e53b40cb3196f99e7345fdcfae6b" + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" url: "https://pub.dev" source: hosted - version: "6.3.22" + version: "6.3.28" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad url: "https://pub.dev" source: hosted - version: "6.3.4" + version: "6.3.6" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: @@ -1950,10 +1950,10 @@ packages: dependency: transitive description: name: url_launcher_windows - sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" uuid: dependency: "direct main" description: @@ -2014,26 +2014,26 @@ packages: dependency: transitive description: name: video_player_android - sha256: "59e5a457ddcc1688f39e9aef0efb62aa845cf0cbbac47e44ac9730dc079a2385" + sha256: d74b66f283afff135d5be0ceccca2ca74dff7df1e9b1eaca6bd4699875d3ae60 url: "https://pub.dev" source: hosted - version: "2.8.13" + version: "2.8.22" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: f9a780aac57802b2892f93787e5ea53b5f43cc57dc107bee9436458365be71cd + sha256: e4d33b79a064498c6eb3a6a492b6a5012573d4943c28d566caf1a6c0840fe78d url: "https://pub.dev" source: hosted - version: "2.8.4" + version: "2.8.8" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: cf2a1d29a284db648fd66cbd18aacc157f9862d77d2cc790f6f9678a46c1db5a + sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec" url: "https://pub.dev" source: hosted - version: "6.4.0" + version: "6.6.0" video_player_web: dependency: transitive description: @@ -2086,18 +2086,18 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: fea63576b3b7e02b2df8b78ba92b48ed66caec2bb041e9a0b1cbd586d5d80bfd + sha256: e49f378ed066efb13fc36186bbe0bd2425630d4ea0dbc71a18fdd0e4d8ed8ebc url: "https://pub.dev" source: hosted - version: "3.23.1" + version: "3.23.5" win32: dependency: transitive description: name: win32 - sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e url: "https://pub.dev" source: hosted - version: "5.14.0" + version: "5.15.0" wkt_parser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 333c97e..fddee45 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: customer description: "A new Flutter project." -version: 1.0.0+4 +version: 1.0.0+5 environment: sdk: ^3.7.2 -- 2.49.1 From 3874ef062b07fc61840d9f9a8f8bbf609f5622fd Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Fri, 5 Dec 2025 16:36:32 +0500 Subject: [PATCH 26/30] BASE: Update PLs Wait Loader. --- assets/translations/en.json | 1 - lib/controllers/0n_demand_payment_controller.dart | 2 +- lib/controllers/cart_controller.dart | 2 +- .../dine_in_restaurant_details_controller.dart | 2 +- lib/controllers/edit_profile_controller.dart | 2 +- lib/controllers/forgot_password_controller.dart | 2 +- lib/controllers/gift_card_controller.dart | 2 +- lib/controllers/on_demand_booking_controller.dart | 2 +- .../on_demand_order_details_controller.dart | 2 +- .../parcel_order_confirmation_controller.dart | 2 +- lib/controllers/rate_product_controller.dart | 2 +- lib/controllers/service_list_controller.dart | 2 +- lib/main.dart | 2 +- .../ecommarce/home_e_commerce_screen.dart | 15 +++++++++------ .../enter_manually_location.dart | 4 +++- .../location_permission_screen.dart | 4 ++-- .../all_advertisement_screen.dart | 2 +- .../chat_screens/driver_inbox_screen.dart | 2 +- .../chat_screens/restaurant_inbox_screen.dart | 2 +- .../dine_in_screeen/dine_in_screen.dart | 4 ++-- .../gift_card/redeem_gift_card_screen.dart | 2 +- .../home_screen/home_screen.dart | 10 +++++----- .../home_screen/home_screen_two.dart | 8 +++++--- .../order_list_screen/order_details_screen.dart | 6 ++++-- .../profile_screen/profile_screen.dart | 2 +- .../scan_qrcode_screen/scan_qr_code_screen.dart | 2 +- .../on_demand_booking_screen.dart | 2 +- .../on_demand_service/on_demand_home_screen.dart | 2 +- .../on_demand_order_details_screen.dart | 6 ++++-- .../on_demand_service/provider_inbox_screen.dart | 2 +- .../on_demand_service/worker_inbox_screen.dart | 2 +- .../parcel_service/home_parcel_screen.dart | 2 +- .../parcel_service/parcel_order_details.dart | 2 +- .../rental_order_details_screen.dart | 4 +++- 34 files changed, 61 insertions(+), 49 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 57288de..0a541c6 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -123,5 +123,4 @@ "changeLanguage": "Change Language", "selectPrefferedLanguage": "Select your preferred language for a personalized app experience." - } \ No newline at end of file diff --git a/lib/controllers/0n_demand_payment_controller.dart b/lib/controllers/0n_demand_payment_controller.dart index 069ee50..e647f3a 100644 --- a/lib/controllers/0n_demand_payment_controller.dart +++ b/lib/controllers/0n_demand_payment_controller.dart @@ -76,7 +76,7 @@ class OnDemandPaymentController extends GetxController { Future placeOrder() async { if (!isExtra) { // Normal Order - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); onDemandOrderModel.value?.payment_method = selectedPaymentMethod.value; onDemandOrderModel.value?.paymentStatus = diff --git a/lib/controllers/cart_controller.dart b/lib/controllers/cart_controller.dart index 28f87e3..a149ba1 100644 --- a/lib/controllers/cart_controller.dart +++ b/lib/controllers/cart_controller.dart @@ -425,7 +425,7 @@ class CartController extends GetxController { } Future setOrder() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); if ((Constant.isSubscriptionModelApplied == true || Constant.sectionConstantModel?.adminCommision?.isEnabled == true) && diff --git a/lib/controllers/dine_in_restaurant_details_controller.dart b/lib/controllers/dine_in_restaurant_details_controller.dart index a354e95..da9c1ec 100644 --- a/lib/controllers/dine_in_restaurant_details_controller.dart +++ b/lib/controllers/dine_in_restaurant_details_controller.dart @@ -65,7 +65,7 @@ class DineInRestaurantDetailsController extends GetxController { } Future orderBook() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); DateTime dt = selectedDate.value.toDate(); String hour = DateFormat("kk:mm").format( diff --git a/lib/controllers/edit_profile_controller.dart b/lib/controllers/edit_profile_controller.dart index 12c2fd4..6fc31a3 100644 --- a/lib/controllers/edit_profile_controller.dart +++ b/lib/controllers/edit_profile_controller.dart @@ -48,7 +48,7 @@ class EditProfileController extends GetxController { } Future saveData() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); if (Constant().hasValidUrl(profileImage.value) == false && profileImage.value.isNotEmpty) { profileImage.value = await Constant.uploadUserImageToFireStorage( diff --git a/lib/controllers/forgot_password_controller.dart b/lib/controllers/forgot_password_controller.dart index 3936731..ec2a1ca 100644 --- a/lib/controllers/forgot_password_controller.dart +++ b/lib/controllers/forgot_password_controller.dart @@ -21,7 +21,7 @@ class ForgotPasswordController extends GetxController { } try { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); await FirebaseAuth.instance.sendPasswordResetEmail(email: email); ShowToastDialog.closeLoader(); ShowToastDialog.showToast( diff --git a/lib/controllers/gift_card_controller.dart b/lib/controllers/gift_card_controller.dart index c724901..474e983 100644 --- a/lib/controllers/gift_card_controller.dart +++ b/lib/controllers/gift_card_controller.dart @@ -108,7 +108,7 @@ class GiftCardController extends GetxController { } Future setOrder() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); GiftCardsOrderModel giftCardsOrderModel = GiftCardsOrderModel(); giftCardsOrderModel.id = const Uuid().v4(); giftCardsOrderModel.giftId = selectedGiftCard.value.id.toString(); diff --git a/lib/controllers/on_demand_booking_controller.dart b/lib/controllers/on_demand_booking_controller.dart index 647c514..99fabc7 100644 --- a/lib/controllers/on_demand_booking_controller.dart +++ b/lib/controllers/on_demand_booking_controller.dart @@ -202,7 +202,7 @@ class OnDemandBookingController extends GetxController { }, ); } else { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); OnProviderOrderModel onDemandOrder = OnProviderOrderModel( otp: Constant.getReferralCode(), authorID: FireStoreUtils.getCurrentUid(), diff --git a/lib/controllers/on_demand_order_details_controller.dart b/lib/controllers/on_demand_order_details_controller.dart index c2c7ad1..a6410c3 100644 --- a/lib/controllers/on_demand_order_details_controller.dart +++ b/lib/controllers/on_demand_order_details_controller.dart @@ -172,7 +172,7 @@ class OnDemandOrderDetailsController extends GetxController { final order = onProviderOrder.value; if (order == null) return; - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); try { double total = 0.0; diff --git a/lib/controllers/parcel_order_confirmation_controller.dart b/lib/controllers/parcel_order_confirmation_controller.dart index b76f4dd..25ecfd7 100644 --- a/lib/controllers/parcel_order_confirmation_controller.dart +++ b/lib/controllers/parcel_order_confirmation_controller.dart @@ -136,7 +136,7 @@ class ParcelOrderConfirmationController extends GetxController { } Future placeOrder() async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); try { List parcelImages = []; diff --git a/lib/controllers/rate_product_controller.dart b/lib/controllers/rate_product_controller.dart index d4d5d0c..0c0575d 100644 --- a/lib/controllers/rate_product_controller.dart +++ b/lib/controllers/rate_product_controller.dart @@ -142,7 +142,7 @@ class RateProductController extends GetxController { Future saveRating() async { if (ratings.value != 0.0) { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); productModel.value.reviewsCount = productReviewCount.value + 1; productModel.value.reviewsSum = productReviewSum.value + ratings.value; productModel.value.reviewAttributes = reviewProductAttributes; diff --git a/lib/controllers/service_list_controller.dart b/lib/controllers/service_list_controller.dart index f107978..6535e58 100644 --- a/lib/controllers/service_list_controller.dart +++ b/lib/controllers/service_list_controller.dart @@ -77,7 +77,7 @@ class ServiceListController extends GetxController { SectionModel sectionModel, ) async { try { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); Constant.sectionConstantModel = sectionModel; AppThemeData.primary300 = Color( int.tryParse(sectionModel.color?.replaceFirst("#", "0xff") ?? '') ?? diff --git a/lib/main.dart b/lib/main.dart index 8730cf8..7883818 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -24,7 +24,7 @@ void main() async { options: DefaultFirebaseOptions.currentPlatform, ); - await Preferences.initPref(); + await Preferences.initPref(); Get.put(ThemeController()); await configEasyLoading(); diff --git a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart index 79c5f87..4a60069 100644 --- a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart @@ -1,4 +1,7 @@ +// ignore_for_file: depend_on_referenced_packages + import 'package:badges/badges.dart' as badges; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/home_e_commerce_controller.dart'; import 'package:customer/controllers/theme_controller.dart'; @@ -108,7 +111,7 @@ class HomeECommerceScreen extends StatelessWidget { } else { Constant.checkPermission( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); // ✅ declare it once here! ShippingAddress shippingAddress = ShippingAddress(); @@ -1525,7 +1528,7 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -1537,7 +1540,7 @@ class BannerView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -1631,7 +1634,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -1643,7 +1646,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -1728,7 +1731,7 @@ class AdvertisementHomeCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( model.vendorId!, ); diff --git a/lib/screen_ui/location_enable_screens/enter_manually_location.dart b/lib/screen_ui/location_enable_screens/enter_manually_location.dart index d2d154a..67ceb0e 100644 --- a/lib/screen_ui/location_enable_screens/enter_manually_location.dart +++ b/lib/screen_ui/location_enable_screens/enter_manually_location.dart @@ -341,7 +341,9 @@ class EnterManuallyLocationScreen extends StatelessWidget { "Please Enter Area / Sector / Locality".tr, ); } else { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader( + ConstTexts.pleaseWait.tr, + ); //Common values controller.shippingModel.value.location = diff --git a/lib/screen_ui/location_enable_screens/location_permission_screen.dart b/lib/screen_ui/location_enable_screens/location_permission_screen.dart index 1491fa7..1a7726c 100644 --- a/lib/screen_ui/location_enable_screens/location_permission_screen.dart +++ b/lib/screen_ui/location_enable_screens/location_permission_screen.dart @@ -76,7 +76,7 @@ class LocationPermissionScreen extends StatelessWidget { Constant.checkPermission( context: context, onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); @@ -145,7 +145,7 @@ class LocationPermissionScreen extends StatelessWidget { Constant.checkPermission( context: context, onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ShippingAddress addressModel = ShippingAddress(); try { await Geolocator.requestPermission(); diff --git a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart index 720e34a..e66a6c5 100644 --- a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart +++ b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart @@ -86,7 +86,7 @@ class AdvertisementCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( model.vendorId!, ); diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart index 05ccb43..1d33614 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart @@ -46,7 +46,7 @@ class DriverInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart index bdf6d90..5485ddd 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart @@ -47,7 +47,7 @@ class RestaurantInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index b2888cf..8806a67 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -1294,7 +1294,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -1306,7 +1306,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), diff --git a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart index b1ccdab..2dc5ca3 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart @@ -106,7 +106,7 @@ class RedeemGiftCardScreen extends StatelessWidget { } else if (controller.giftPinController.value.text.isEmpty) { ShowToastDialog.showToast("Please Enter Gift Pin".tr); } else { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); await FireStoreUtils.checkRedeemCode( controller.giftCodeController.value.text.replaceAll( " ", diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index 3736289..61a293c 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -2190,7 +2190,7 @@ class AdvertisementHomeCard extends StatelessWidget { final isDark = themeController.isDark.value; return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( model.vendorId!, ); @@ -2653,7 +2653,7 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -2665,7 +2665,7 @@ class BannerView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), @@ -2759,7 +2759,7 @@ class BannerBottomView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), @@ -2771,7 +2771,7 @@ class BannerBottomView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart index 9ee26f3..86a840e 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart @@ -213,7 +213,9 @@ class HomeScreenTwo extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts + .pleaseWait + .tr, ); // ✅ declare once for whole method @@ -1206,7 +1208,7 @@ class BannerView extends StatelessWidget { return InkWell( onTap: () async { if (bannerModel.redirect_type == "store") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); VendorModel? vendorModel = await FireStoreUtils.getVendorById( bannerModel.redirect_id.toString(), ); @@ -1217,7 +1219,7 @@ class BannerView extends StatelessWidget { arguments: {"vendorModel": vendorModel}, ); } else if (bannerModel.redirect_type == "product") { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); ProductModel? productModel = await FireStoreUtils.getProductById( bannerModel.redirect_id.toString(), diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart index e01712e..d6d041a 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart @@ -228,7 +228,7 @@ class OrderDetailsScreen extends StatelessWidget { : InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr, ); UserModel? customer = @@ -902,7 +902,9 @@ class OrderDetailsScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts + .pleaseWait + .tr, ); UserModel? customer = diff --git a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart index 5e73807..afaf8a3 100644 --- a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart @@ -578,7 +578,7 @@ class ProfileScreen extends StatelessWidget { negativeString: "Cancel".tr, positiveClick: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr, ); await controller .deleteUserFromServer(); diff --git a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart index 56ce1ca..74cca90 100644 --- a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart +++ b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart @@ -42,7 +42,7 @@ class ScanQrCodeScreen extends StatelessWidget { // if TypeScan.takePicture will try decode when click to take a picture(default TypeScan.live) onCapture: (Result result) { Get.back(); - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); if (controller.allNearestRestaurant.isNotEmpty) { if (controller.allNearestRestaurant .where((vendor) => vendor.id == result.text) diff --git a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart index a59f56c..61b4359 100644 --- a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart @@ -246,7 +246,7 @@ class OnDemandBookingScreen extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr, ); ShippingAddress shippingAddress = diff --git a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart index 0391771..982aa12 100644 --- a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart @@ -105,7 +105,7 @@ class OnDemandHomeScreen extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr, ); // ✅ declare it once here! diff --git a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart index 231adc9..4687960 100644 --- a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart @@ -771,7 +771,9 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: ElevatedButton( onPressed: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts + .pleaseWait + .tr, ); ShowToastDialog.closeLoader(); @@ -1192,7 +1194,7 @@ class OnDemandOrderDetailsScreen extends StatelessWidget { child: ElevatedButton( onPressed: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr, ); ShowToastDialog.closeLoader(); diff --git a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart index 652b98a..4e21735 100644 --- a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart @@ -46,7 +46,7 @@ class ProviderInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), diff --git a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart index 72a945b..b11ad2d 100644 --- a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart @@ -46,7 +46,7 @@ class WorkerInboxScreen extends StatelessWidget { InboxModel inboxModel = InboxModel.fromJson(data!); return InkWell( onTap: () async { - ShowToastDialog.showLoader("Please wait...".tr); + ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); UserModel? customer = await FireStoreUtils.getUserProfile( inboxModel.customerId.toString(), diff --git a/lib/screen_ui/parcel_service/home_parcel_screen.dart b/lib/screen_ui/parcel_service/home_parcel_screen.dart index 151cf78..c6d9f11 100644 --- a/lib/screen_ui/parcel_service/home_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/home_parcel_screen.dart @@ -99,7 +99,7 @@ class HomeParcelScreen extends StatelessWidget { Constant.checkPermission( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr, ); ShippingAddress shippingAddress = diff --git a/lib/screen_ui/parcel_service/parcel_order_details.dart b/lib/screen_ui/parcel_service/parcel_order_details.dart index 398c4b1..65b0768 100644 --- a/lib/screen_ui/parcel_service/parcel_order_details.dart +++ b/lib/screen_ui/parcel_service/parcel_order_details.dart @@ -604,7 +604,7 @@ class ParcelOrderDetails extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts.pleaseWait.tr, ); UserModel? customer = diff --git a/lib/screen_ui/rental_service/rental_order_details_screen.dart b/lib/screen_ui/rental_service/rental_order_details_screen.dart index 74edf80..8662f2b 100644 --- a/lib/screen_ui/rental_service/rental_order_details_screen.dart +++ b/lib/screen_ui/rental_service/rental_order_details_screen.dart @@ -588,7 +588,9 @@ class RentalOrderDetailsScreen extends StatelessWidget { InkWell( onTap: () async { ShowToastDialog.showLoader( - "Please wait...".tr, + ConstTexts + .pleaseWait + .tr, ); UserModel? customer = -- 2.49.1 From 653f1f93bf659aa0f405fdfd87a9afe81efd77f5 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Mon, 8 Dec 2025 12:05:48 +0500 Subject: [PATCH 27/30] BASE: Enhance Design. --- assets/translations/en.json | 10 +- lib/constant/const_texts.dart | 16 +- .../0n_demand_payment_controller.dart | 1 + lib/controllers/cart_controller.dart | 1 + ...dine_in_restaurant_details_controller.dart | 1 + lib/controllers/edit_profile_controller.dart | 1 + .../forgot_password_controller.dart | 1 + lib/controllers/gift_card_controller.dart | 1 + .../on_demand_booking_controller.dart | 1 + .../on_demand_order_details_controller.dart | 1 + .../parcel_order_confirmation_controller.dart | 1 + lib/controllers/rate_product_controller.dart | 1 + lib/controllers/service_list_controller.dart | 1 + .../ecommarce/home_e_commerce_screen.dart | 20 +- .../enter_manually_location.dart | 1 + .../all_advertisement_screen.dart | 1 + .../chat_screens/driver_inbox_screen.dart | 1 + .../chat_screens/restaurant_inbox_screen.dart | 1 + .../dine_in_screeen/dine_in_screen.dart | 1 + .../gift_card/redeem_gift_card_screen.dart | 1 + .../home_screen/home_screen.dart | 1 + .../home_screen/home_screen_two.dart | 1 + .../order_details_screen.dart | 1 + .../profile_screen/profile_screen.dart | 1 + .../restaurant_details_screen.dart | 1190 +++++++++-------- .../scan_qr_code_screen.dart | 1 + .../on_demand_booking_screen.dart | 1 + .../on_demand_home_screen.dart | 1 + .../on_demand_order_details_screen.dart | 1 + .../provider_inbox_screen.dart | 1 + .../worker_inbox_screen.dart | 1 + .../parcel_service/home_parcel_screen.dart | 1 + .../parcel_service/parcel_order_details.dart | 1 + .../rental_order_details_screen.dart | 1 + 34 files changed, 668 insertions(+), 598 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 0a541c6..f841b8b 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -122,5 +122,13 @@ "changeLanguage": "Change Language", - "selectPrefferedLanguage": "Select your preferred language for a personalized app experience." + "selectPrefferedLanguage": "Select your preferred language for a personalized app experience.", + "searchStoreItem": "Search the store, item and more...", + "category": "Category", + "highlightsForU": "Highlights for you", + "newArrival": "New Arrivals", + "topBrands": "Top Brands", + "styleUp": "Style up with the latest fits, now at unbeatable prices.", + "additionlOffers": "Additional Offers" + } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 408d0bb..beb1fbf 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -122,14 +122,14 @@ class ConstTexts { static String enterManuallyLocation = "enterManuallyLocation"; static String changeLanguage = "changeLanguage"; static String selectPrefferedLanguage = "selectPrefferedLanguage"; - // static String rideDetails = "rideDetails"; - // static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; - // static String somethingWentWrong = "somethingWentWrong"; - // static String cash = "cash"; - // static String hugeSelectionOfAds = "hugeSelectionOfAds"; - // static String cosmetics = "cosmetics"; - // static String moreThan1000Products = "moreThan1000Products"; - // static String foodProducts = "foodProducts"; + static String searchStoreItem = "searchStoreItem"; + static String category = "category"; + static String highlightsForU = "highlightsForU"; + static String newArrival = "newArrivals"; + static String viewAllArrivals = "View All Arrivals"; + static String topBrands = "topBrands"; + static String styleUp = "styleUp"; + static String additionlOffers = "additionlOffers"; // static String enableLocation = "enableLocation"; // static String allowLocation = "allowLocation"; // static String useCurrentLocation = "useCurrentLocation"; diff --git a/lib/controllers/0n_demand_payment_controller.dart b/lib/controllers/0n_demand_payment_controller.dart index e647f3a..fd66a94 100644 --- a/lib/controllers/0n_demand_payment_controller.dart +++ b/lib/controllers/0n_demand_payment_controller.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/utils/app_router.dart'; import 'package:get/get.dart'; diff --git a/lib/controllers/cart_controller.dart b/lib/controllers/cart_controller.dart index a149ba1..b4cbca6 100644 --- a/lib/controllers/cart_controller.dart +++ b/lib/controllers/cart_controller.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'dart:math' as maths; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/cart_product_model.dart'; import 'package:customer/models/coupon_model.dart'; diff --git a/lib/controllers/dine_in_restaurant_details_controller.dart b/lib/controllers/dine_in_restaurant_details_controller.dart index da9c1ec..34b3715 100644 --- a/lib/controllers/dine_in_restaurant_details_controller.dart +++ b/lib/controllers/dine_in_restaurant_details_controller.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/dine_in_booking_model.dart'; import 'package:customer/models/favourite_model.dart'; diff --git a/lib/controllers/edit_profile_controller.dart b/lib/controllers/edit_profile_controller.dart index 6fc31a3..38f94db 100644 --- a/lib/controllers/edit_profile_controller.dart +++ b/lib/controllers/edit_profile_controller.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; diff --git a/lib/controllers/forgot_password_controller.dart b/lib/controllers/forgot_password_controller.dart index ec2a1ca..c64621a 100644 --- a/lib/controllers/forgot_password_controller.dart +++ b/lib/controllers/forgot_password_controller.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; diff --git a/lib/controllers/gift_card_controller.dart b/lib/controllers/gift_card_controller.dart index 474e983..1c98016 100644 --- a/lib/controllers/gift_card_controller.dart +++ b/lib/controllers/gift_card_controller.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'dart:math' as maths; import 'dart:math'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/gift_cards_model.dart'; import 'package:customer/themes/app_them_data.dart'; diff --git a/lib/controllers/on_demand_booking_controller.dart b/lib/controllers/on_demand_booking_controller.dart index 99fabc7..91978f1 100644 --- a/lib/controllers/on_demand_booking_controller.dart +++ b/lib/controllers/on_demand_booking_controller.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; diff --git a/lib/controllers/on_demand_order_details_controller.dart b/lib/controllers/on_demand_order_details_controller.dart index a6410c3..c351b6c 100644 --- a/lib/controllers/on_demand_order_details_controller.dart +++ b/lib/controllers/on_demand_order_details_controller.dart @@ -1,5 +1,6 @@ import 'dart:developer'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/user_model.dart'; diff --git a/lib/controllers/parcel_order_confirmation_controller.dart b/lib/controllers/parcel_order_confirmation_controller.dart index 25ecfd7..d3d1cc1 100644 --- a/lib/controllers/parcel_order_confirmation_controller.dart +++ b/lib/controllers/parcel_order_confirmation_controller.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'dart:io'; import 'dart:math' as maths; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/wallet_transaction_model.dart'; diff --git a/lib/controllers/rate_product_controller.dart b/lib/controllers/rate_product_controller.dart index 0c0575d..be7d7ce 100644 --- a/lib/controllers/rate_product_controller.dart +++ b/lib/controllers/rate_product_controller.dart @@ -1,6 +1,7 @@ import 'dart:developer'; import 'dart:io'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/order_model.dart'; import 'package:customer/models/product_model.dart'; diff --git a/lib/controllers/service_list_controller.dart b/lib/controllers/service_list_controller.dart index 6535e58..19d08ed 100644 --- a/lib/controllers/service_list_controller.dart +++ b/lib/controllers/service_list_controller.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/models/section_model.dart'; import 'package:customer/screen_ui/cab_service_screens/cab_dashboard_screen.dart'; import 'package:customer/screen_ui/ecommarce/dash_board_e_commerce_screen.dart'; diff --git a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart index 4a60069..6dbf7f8 100644 --- a/lib/screen_ui/ecommarce/home_e_commerce_screen.dart +++ b/lib/screen_ui/ecommarce/home_e_commerce_screen.dart @@ -298,7 +298,7 @@ class HomeECommerceScreen extends StatelessWidget { ); }, child: TextFieldWidget( - hintText: 'Search the store, item and more...'.tr, + hintText: ConstTexts.searchStoreItem.tr, controller: null, enable: false, backgroundColor: AppThemeData.grey50, @@ -335,7 +335,7 @@ class HomeECommerceScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Category".tr, + ConstTexts.category.tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( color: @@ -351,7 +351,7 @@ class HomeECommerceScreen extends StatelessWidget { Get.to(const ViewAllCategoryScreen()); }, child: Text( - "View all".tr, + ConstTexts.viewAll.tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( decoration: TextDecoration.underline, @@ -466,7 +466,9 @@ class HomeECommerceScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Highlights for you".tr, + ConstTexts + .highlightsForU + .tr, textAlign: TextAlign.start, style: TextStyle( fontFamily: @@ -547,7 +549,7 @@ class HomeECommerceScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( - "New Arrivals".tr, + ConstTexts.newArrival.tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( color: @@ -594,14 +596,14 @@ class HomeECommerceScreen extends StatelessWidget { isDark ? AppThemeData.greyDark200 : AppThemeData.grey200, - title: 'View All Arrivals'.tr, + title: ConstTexts.viewAllArrivals.tr, onPress: () { Get.to( RestaurantListScreen(), arguments: { "vendorList": controller.newArrivalRestaurantList, - "title": "New Arrivals".tr, + "title": ConstTexts.newArrival.tr, }, ); }, @@ -614,7 +616,7 @@ class HomeECommerceScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Top Brands".tr, + ConstTexts.topBrands.tr, textAlign: TextAlign.start, style: AppThemeData.semiBoldTextStyle( color: @@ -777,7 +779,7 @@ class HomeECommerceScreen extends StatelessWidget { ), ), Text( - "Style up with the latest fits, now at unbeatable prices." + ConstTexts.styleUp.tr .tr, textAlign: TextAlign.start, style: diff --git a/lib/screen_ui/location_enable_screens/enter_manually_location.dart b/lib/screen_ui/location_enable_screens/enter_manually_location.dart index 67ceb0e..fec9134 100644 --- a/lib/screen_ui/location_enable_screens/enter_manually_location.dart +++ b/lib/screen_ui/location_enable_screens/enter_manually_location.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/user_model.dart'; import 'package:customer/service/fire_store_utils.dart'; diff --git a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart index e66a6c5..88c6875 100644 --- a/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart +++ b/lib/screen_ui/multi_vendor_service/advertisement_screens/all_advertisement_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/advertisement_list_controller.dart'; import 'package:customer/models/advertisement_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart index 1d33614..278191e 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/driver_inbox_screen.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/inbox_model.dart'; import 'package:customer/models/user_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart index 5485ddd..016e01f 100644 --- a/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart +++ b/lib/screen_ui/multi_vendor_service/chat_screens/restaurant_inbox_screen.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/inbox_model.dart'; import 'package:customer/models/user_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart index 8806a67..5000f82 100644 --- a/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dine_in_screeen/dine_in_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dine_in_controller.dart'; import 'package:customer/models/favourite_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart index 2dc5ca3..1998431 100644 --- a/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart +++ b/lib/screen_ui/multi_vendor_service/gift_card/redeem_gift_card_screen.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dash_board_controller.dart'; import 'package:customer/controllers/redeem_gift_card_controller.dart'; diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index 61a293c..a321769 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -1,4 +1,5 @@ import 'package:badges/badges.dart' as badges; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/map_view_controller.dart'; import 'package:customer/models/advertisement_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart index 86a840e..3c35f0d 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen_two.dart @@ -1,5 +1,6 @@ import 'dart:math'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/food_home_controller.dart'; import 'package:customer/models/coupon_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart index d6d041a..10ab8e3 100644 --- a/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/order_list_screen/order_details_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/order_details_controller.dart'; import 'package:customer/models/cart_product_model.dart'; diff --git a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart index afaf8a3..5f1b3b3 100644 --- a/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart +++ b/lib/screen_ui/multi_vendor_service/profile_screen/profile_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/my_profile_controller.dart'; import 'package:customer/screen_ui/on_demand_service/provider_inbox_screen.dart'; diff --git a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart index c7b9011..4f6f350 100644 --- a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart @@ -1,4 +1,7 @@ +import 'dart:developer'; + import 'package:badges/badges.dart' as badges; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/restaurant_details_controller.dart'; import 'package:customer/models/cart_product_model.dart'; @@ -728,7 +731,7 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Additional Offers".tr, + ConstTexts.additionlOffers.tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -1543,557 +1546,498 @@ class ProductListView extends StatelessWidget { productModel.disPrice.toString(), ); } - return Padding( - padding: const EdgeInsets.only(bottom: 20), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Constant - .sectionConstantModel! - .isProductDetails == - false - ? SizedBox() - : Row( - children: [ - productModel.nonveg == true - ? SvgPicture.asset( - "assets/icons/ic_nonveg.svg", - ) - : SvgPicture.asset( - "assets/icons/ic_veg.svg", - ), - const SizedBox(width: 5), - Text( + return InkWell( + onTap: () { + log("Product Clicked."); + }, + child: Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Constant + .sectionConstantModel! + .isProductDetails == + false + ? SizedBox() + : Row( + children: [ productModel.nonveg == true - ? "Non Veg.".tr - : "Pure veg.".tr, - style: TextStyle( - color: - productModel.nonveg == true - ? AppThemeData.danger300 - : AppThemeData.success400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, + ? SvgPicture.asset( + "assets/icons/ic_nonveg.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_veg.svg", + ), + const SizedBox(width: 5), + Text( + productModel.nonveg == true + ? "Non Veg.".tr + : "Pure veg.".tr, + style: TextStyle( + color: + productModel.nonveg == true + ? AppThemeData.danger300 + : AppThemeData + .success400, + fontFamily: + AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), ), - ), - ], + ], + ), + const SizedBox(height: 5), + Text( + productModel.name.toString(), + style: TextStyle( + fontSize: 18, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, ), - const SizedBox(height: 5), - Text( - productModel.name.toString(), - style: TextStyle( - fontSize: 18, - color: - isDark - ? AppThemeData.grey50 - : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, ), - ), - double.parse(disPrice) <= 0 - ? Text( - Constant.amountShow(amount: price), - style: TextStyle( - fontSize: 16, - color: - isDark - ? AppThemeData.grey50 - : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, - ), - ) - : Row( - children: [ - Text( - Constant.amountShow(amount: disPrice), - style: TextStyle( - fontSize: 16, - color: - isDark - ? AppThemeData.grey50 - : AppThemeData.grey900, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, - ), - ), - const SizedBox(width: 5), - Text( - Constant.amountShow(amount: price), - style: TextStyle( - fontSize: 14, - decoration: - TextDecoration.lineThrough, - decorationColor: - isDark - ? AppThemeData.grey500 - : AppThemeData.grey400, - color: - isDark - ? AppThemeData.grey500 - : AppThemeData.grey400, - fontFamily: AppThemeData.semiBold, - fontWeight: FontWeight.w600, - ), - ), - ], - ), - Row( - children: [ - SvgPicture.asset( - "assets/icons/ic_star.svg", - colorFilter: const ColorFilter.mode( - AppThemeData.warning300, - BlendMode.srcIn, - ), - ), - const SizedBox(width: 5), - Text( - "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", - style: TextStyle( - color: - isDark - ? AppThemeData.grey50 - : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - Text( - "${productModel.description}", - maxLines: 2, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: - isDark - ? AppThemeData.grey50 - : AppThemeData.grey900, - fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, - ), - ), - const SizedBox(height: 5), - InkWell( - onTap: () { - showDialog( - context: context, - builder: (BuildContext context) { - return infoDialog( - controller, - isDark, - productModel, - ); - }, - ); - }, - child: Row( - children: [ - Icon( - Icons.info, - color: - isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, - size: 18, - ), - const SizedBox(width: 8), - Text( - "Info".tr, - maxLines: 2, + double.parse(disPrice) <= 0 + ? Text( + Constant.amountShow(amount: price), style: TextStyle( - overflow: TextOverflow.ellipsis, fontSize: 16, color: isDark - ? AppThemeData.primary300 - : AppThemeData.primary300, + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), + ) + : Row( + children: [ + Text( + Constant.amountShow( + amount: disPrice, + ), + style: TextStyle( + fontSize: 16, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: + AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(width: 5), + Text( + Constant.amountShow( + amount: price, + ), + style: TextStyle( + fontSize: 14, + decoration: + TextDecoration.lineThrough, + decorationColor: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + color: + isDark + ? AppThemeData.grey500 + : AppThemeData.grey400, + fontFamily: + AppThemeData.semiBold, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + Row( + children: [ + SvgPicture.asset( + "assets/icons/ic_star.svg", + colorFilter: const ColorFilter.mode( + AppThemeData.warning300, + BlendMode.srcIn, + ), + ), + const SizedBox(width: 5), + Text( + "${Constant.calculateReview(reviewCount: productModel.reviewsCount!.toStringAsFixed(0), reviewSum: productModel.reviewsSum.toString())} (${productModel.reviewsCount!.toStringAsFixed(0)})", + style: TextStyle( + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, fontFamily: AppThemeData.regular, - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w500, ), ), ], ), - ), - ], - ), - ), - ClipRRect( - borderRadius: const BorderRadius.all( - Radius.circular(16), - ), - child: Stack( - children: [ - NetworkImageWidget( - imageUrl: productModel.photo.toString(), - fit: BoxFit.cover, - height: Responsive.height(16, context), - width: Responsive.width(34, context), - ), - Container( - height: Responsive.height(16, context), - width: Responsive.width(34, context), - decoration: BoxDecoration( - gradient: LinearGradient( - begin: const Alignment(-0.00, -1.00), - end: const Alignment(0, 1), - colors: [ - Colors.black.withOpacity(0), - const Color(0xFF111827), + Text( + "${productModel.description}", + maxLines: 2, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.grey900, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), + ), + const SizedBox(height: 5), + InkWell( + onTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + return infoDialog( + controller, + isDark, + productModel, + ); + }, + ); + }, + child: Row( + children: [ + Icon( + Icons.info, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + size: 18, + ), + const SizedBox(width: 8), + Text( + "Info".tr, + maxLines: 2, + style: TextStyle( + overflow: TextOverflow.ellipsis, + fontSize: 16, + color: + isDark + ? AppThemeData.primary300 + : AppThemeData.primary300, + fontFamily: AppThemeData.regular, + fontWeight: FontWeight.w400, + ), + ), ], ), ), - ), - Positioned( - right: 10, - top: 10, - child: InkWell( - onTap: () async { - if (controller.favouriteItemList - .where( - (p0) => - p0.productId == productModel.id, - ) - .isNotEmpty) { - FavouriteItemModel - favouriteModel = FavouriteItemModel( - productId: productModel.id, - storeId: - controller.vendorModel.value.id, - userId: - FireStoreUtils.getCurrentUid(), - ); - controller.favouriteItemList - .removeWhere( - (item) => - item.productId == - productModel.id, - ); - await FireStoreUtils.removeFavouriteItem( - favouriteModel, - ); - } else { - FavouriteItemModel - favouriteModel = FavouriteItemModel( - productId: productModel.id, - storeId: - controller.vendorModel.value.id, - userId: - FireStoreUtils.getCurrentUid(), - ); - controller.favouriteItemList.add( - favouriteModel, - ); - - await FireStoreUtils.setFavouriteItem( - favouriteModel, - ); - } - }, - child: Obx( - () => - controller.favouriteItemList - .where( - (p0) => - p0.productId == - productModel.id, - ) - .isNotEmpty - ? SvgPicture.asset( - "assets/icons/ic_like_fill.svg", - ) - : SvgPicture.asset( - "assets/icons/ic_like.svg", - ), + ], + ), + ), + ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(16), + ), + child: Stack( + children: [ + NetworkImageWidget( + imageUrl: productModel.photo.toString(), + fit: BoxFit.cover, + height: Responsive.height(16, context), + width: Responsive.width(34, context), + ), + Container( + height: Responsive.height(16, context), + width: Responsive.width(34, context), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: const Alignment(-0.00, -1.00), + end: const Alignment(0, 1), + colors: [ + Colors.black.withOpacity(0), + const Color(0xFF111827), + ], + ), ), ), - ), - controller.isOpen.value == false || - Constant.userModel == null - ? const SizedBox() - : Positioned( - bottom: 10, - left: 20, - right: 20, - child: - selectedVariants.isNotEmpty || - (productModel.addOnsTitle != - null && - productModel - .addOnsTitle! - .isNotEmpty) - ? RoundedButtonFill( - title: "Add".tr, - width: 10, - height: 4, - color: - isDark - ? AppThemeData.grey900 - : AppThemeData.grey50, - textColor: - AppThemeData.primary300, - onPress: () async { - controller.selectedVariants - .clear(); - controller - .selectedIndexVariants - .clear(); - controller.selectedIndexArray - .clear(); - controller.selectedAddOns - .clear(); - controller.quantity.value = 1; - if (productModel - .itemAttribute != - null) { + Positioned( + right: 10, + top: 10, + child: InkWell( + onTap: () async { + if (controller.favouriteItemList + .where( + (p0) => + p0.productId == + productModel.id, + ) + .isNotEmpty) { + FavouriteItemModel + favouriteModel = FavouriteItemModel( + productId: productModel.id, + storeId: + controller + .vendorModel + .value + .id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList + .removeWhere( + (item) => + item.productId == + productModel.id, + ); + await FireStoreUtils.removeFavouriteItem( + favouriteModel, + ); + } else { + FavouriteItemModel + favouriteModel = FavouriteItemModel( + productId: productModel.id, + storeId: + controller + .vendorModel + .value + .id, + userId: + FireStoreUtils.getCurrentUid(), + ); + controller.favouriteItemList.add( + favouriteModel, + ); + + await FireStoreUtils.setFavouriteItem( + favouriteModel, + ); + } + }, + child: Obx( + () => + controller.favouriteItemList + .where( + (p0) => + p0.productId == + productModel.id, + ) + .isNotEmpty + ? SvgPicture.asset( + "assets/icons/ic_like_fill.svg", + ) + : SvgPicture.asset( + "assets/icons/ic_like.svg", + ), + ), + ), + ), + controller.isOpen.value == false || + Constant.userModel == null + ? const SizedBox() + : Positioned( + bottom: 10, + left: 20, + right: 20, + child: + selectedVariants.isNotEmpty || + (productModel + .addOnsTitle != + null && + productModel + .addOnsTitle! + .isNotEmpty) + ? RoundedButtonFill( + title: "Add".tr, + width: 10, + height: 4, + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + textColor: + AppThemeData.primary300, + onPress: () async { + controller + .selectedVariants + .clear(); + controller + .selectedIndexVariants + .clear(); + controller + .selectedIndexArray + .clear(); + controller.selectedAddOns + .clear(); + controller + .quantity + .value = 1; if (productModel - .itemAttribute! - .attributes! - .isNotEmpty) { - for (var element - in productModel - .itemAttribute! - .attributes!) { - if (element - .attributeOptions! - .isNotEmpty) { - controller.selectedVariants.add( - productModel + .itemAttribute != + null) { + if (productModel + .itemAttribute! + .attributes! + .isNotEmpty) { + for (var element + in productModel .itemAttribute! - .attributes![productModel - .itemAttribute! - .attributes! - .indexOf( - element, - )] - .attributeOptions![0] - .toString(), - ); - controller - .selectedIndexVariants - .add( - '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', - ); - controller - .selectedIndexArray - .add( - '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', - ); + .attributes!) { + if (element + .attributeOptions! + .isNotEmpty) { + controller.selectedVariants.add( + productModel + .itemAttribute! + .attributes![productModel + .itemAttribute! + .attributes! + .indexOf( + element, + )] + .attributeOptions![0] + .toString(), + ); + controller + .selectedIndexVariants + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)} _${productModel.itemAttribute!.attributes![0].attributeOptions![0].toString()}', + ); + controller + .selectedIndexArray + .add( + '${productModel.itemAttribute!.attributes!.indexOf(element)}_0', + ); + } } } - } - final bool - productIsInList = cartItem.any( - (product) => - product.id == - "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", - ); - - if (productIsInList) { - CartProductModel element = - cartItem.firstWhere( + final bool + productIsInList = + cartItem.any( (product) => product.id == "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", ); - controller - .quantity - .value = - element.quantity!; - if (element.extras != - null) { - for (var element - in element - .extras!) { - controller - .selectedAddOns - .add(element); + + if (productIsInList) { + CartProductModel + element = cartItem + .firstWhere( + (product) => + product + .id == + "${productModel.id}~${productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).isNotEmpty ? productModel.itemAttribute!.variants!.where((element) => element.variantSku == controller.selectedVariants.join('-')).first.variantId.toString() : ""}", + ); + controller + .quantity + .value = + element.quantity!; + if (element.extras != + null) { + for (var element + in element + .extras!) { + controller + .selectedAddOns + .add(element); + } } } - } - } else { - if (cartItem - .where( - (product) => - product.id == - "${productModel.id}", - ) - .isNotEmpty) { - CartProductModel element = - cartItem.firstWhere( + } else { + if (cartItem + .where( (product) => product.id == "${productModel.id}", - ); - controller - .quantity - .value = - element.quantity!; - if (element.extras != - null) { - for (var element - in element - .extras!) { - controller - .selectedAddOns - .add(element); + ) + .isNotEmpty) { + CartProductModel + element = cartItem + .firstWhere( + (product) => + product + .id == + "${productModel.id}", + ); + controller + .quantity + .value = + element.quantity!; + if (element.extras != + null) { + for (var element + in element + .extras!) { + controller + .selectedAddOns + .add(element); + } } } } - } - controller.update(); - controller.calculatePrice( - productModel, - ); - productDetailsBottomSheet( - context, - productModel, - ); - }, - ) - : Obx( - () => - cartItem - .where( - (p0) => - p0.id == - productModel - .id, - ) - .isNotEmpty - ? Container( - width: - Responsive.width( - 100, - context, - ), - height: - Responsive.height( - 4, - context, - ), - decoration: ShapeDecoration( - color: - isDark - ? AppThemeData - .grey900 - : AppThemeData - .grey50, - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular( - 200, - ), - ), - ), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .center, - crossAxisAlignment: - CrossAxisAlignment - .center, - children: [ - InkWell( - onTap: () { - controller.addToCart( - productModel: - productModel, - price: - price, - discountPrice: - disPrice, - isIncrement: - false, - quantity: - cartItem - .where( - ( - p0, - ) => - p0.id == - productModel.id, - ) - .first - .quantity! - - 1, - ); - }, - child: Icon( - Icons.remove, - color: - isDark - ? AppThemeData - .grey50 - : AppThemeData - .greyDark50, + controller.update(); + controller.calculatePrice( + productModel, + ); + productDetailsBottomSheet( + context, + productModel, + ); + }, + ) + : Obx( + () => + cartItem + .where( + (p0) => + p0.id == + productModel + .id, + ) + .isNotEmpty + ? Container( + width: + Responsive.width( + 100, + context, ), - ), - Padding( - padding: - const EdgeInsets.symmetric( - horizontal: - 14, + height: + Responsive.height( + 4, + context, + ), + decoration: ShapeDecoration( + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 200, ), - child: Text( - cartItem - .where( - (p0) => - p0.id == - productModel.id, - ) - .first - .quantity - .toString(), - textAlign: - TextAlign - .start, - maxLines: 1, - style: TextStyle( - fontSize: - 16, - overflow: - TextOverflow - .ellipsis, - fontFamily: - AppThemeData - .medium, - fontWeight: - FontWeight - .w500, - color: - isDark - ? AppThemeData.grey100 - : AppThemeData.grey800, - ), - ), ), - InkWell( - onTap: () { - if ((cartItem - .where( - ( - p0, - ) => - p0.id == - productModel.id, - ) - .first - .quantity ?? - 0) < - (productModel.quantity ?? - 0) || - (productModel.quantity ?? - 0) == - -1) { + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, + children: [ + InkWell( + onTap: () { controller.addToCart( productModel: productModel, @@ -2102,7 +2046,7 @@ class ProductListView extends StatelessWidget { discountPrice: disPrice, isIncrement: - true, + false, quantity: cartItem .where( @@ -2113,75 +2057,161 @@ class ProductListView extends StatelessWidget { productModel.id, ) .first - .quantity! + + .quantity! - 1, ); - } else { - ShowToastDialog.showToast( - "Out of stock" - .tr, - ); - } - }, - child: Icon( - Icons.add, - color: - isDark - ? AppThemeData - .grey50 - : AppThemeData - .greyDark50, + }, + child: Icon( + Icons + .remove, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.greyDark50, + ), ), - ), - ], + Padding( + padding: const EdgeInsets.symmetric( + horizontal: + 14, + ), + child: Text( + cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity + .toString(), + textAlign: + TextAlign + .start, + maxLines: + 1, + style: TextStyle( + fontSize: + 16, + overflow: + TextOverflow.ellipsis, + fontFamily: + AppThemeData.medium, + fontWeight: + FontWeight.w500, + color: + isDark + ? AppThemeData.grey100 + : AppThemeData.grey800, + ), + ), + ), + InkWell( + onTap: () { + if ((cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity ?? + 0) < + (productModel.quantity ?? + 0) || + (productModel.quantity ?? + 0) == + -1) { + controller.addToCart( + productModel: + productModel, + price: + price, + discountPrice: + disPrice, + isIncrement: + true, + quantity: + cartItem + .where( + ( + p0, + ) => + p0.id == + productModel.id, + ) + .first + .quantity! + + 1, + ); + } else { + ShowToastDialog.showToast( + "Out of stock" + .tr, + ); + } + }, + child: Icon( + Icons.add, + color: + isDark + ? AppThemeData.grey50 + : AppThemeData.greyDark50, + ), + ), + ], + ), + ) + : RoundedButtonFill( + title: "Add".tr, + width: 10, + height: 4, + color: + isDark + ? AppThemeData + .grey900 + : AppThemeData + .grey50, + textColor: + AppThemeData + .primary300, + onPress: () async { + if (1 <= + (productModel.quantity ?? + 0) || + (productModel.quantity ?? + 0) == + -1) { + controller.addToCart( + productModel: + productModel, + price: + price, + discountPrice: + disPrice, + isIncrement: + true, + quantity: 1, + ); + } else { + ShowToastDialog.showToast( + "Out of stock" + .tr, + ); + } + }, ), - ) - : RoundedButtonFill( - title: "Add".tr, - width: 10, - height: 4, - color: - isDark - ? AppThemeData - .grey900 - : AppThemeData - .grey50, - textColor: - AppThemeData - .primary300, - onPress: () async { - if (1 <= - (productModel - .quantity ?? - 0) || - (productModel - .quantity ?? - 0) == - -1) { - controller.addToCart( - productModel: - productModel, - price: price, - discountPrice: - disPrice, - isIncrement: - true, - quantity: 1, - ); - } else { - ShowToastDialog.showToast( - "Out of stock" - .tr, - ); - } - }, - ), - ), - ), - ], + ), + ), + ], + ), ), - ), - ], + ], + ), ), ); }, diff --git a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart index 74cca90..b5f9119 100644 --- a/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart +++ b/lib/screen_ui/multi_vendor_service/scan_qrcode_screen/scan_qr_code_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/controllers/scan_qr_code_controller.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/themes/app_them_data.dart'; diff --git a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart index 61b4359..fd01d93 100644 --- a/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_booking_screen.dart @@ -1,4 +1,5 @@ import 'package:bottom_picker/bottom_picker.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; diff --git a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart index 982aa12..3d22b0c 100644 --- a/lib/screen_ui/on_demand_service/on_demand_home_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_home_screen.dart @@ -1,4 +1,5 @@ import 'package:cached_network_image/cached_network_image.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/theme_controller.dart'; import 'package:customer/models/banner_model.dart'; diff --git a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart index 4687960..23f7c36 100644 --- a/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart +++ b/lib/screen_ui/on_demand_service/on_demand_order_details_screen.dart @@ -1,4 +1,5 @@ import 'package:clipboard/clipboard.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; diff --git a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart index 4e21735..344835a 100644 --- a/lib/screen_ui/on_demand_service/provider_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/provider_inbox_screen.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/inbox_model.dart'; import 'package:customer/models/user_model.dart'; diff --git a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart index b11ad2d..d500bbb 100644 --- a/lib/screen_ui/on_demand_service/worker_inbox_screen.dart +++ b/lib/screen_ui/on_demand_service/worker_inbox_screen.dart @@ -1,4 +1,5 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/inbox_model.dart'; import 'package:customer/models/user_model.dart'; diff --git a/lib/screen_ui/parcel_service/home_parcel_screen.dart b/lib/screen_ui/parcel_service/home_parcel_screen.dart index c6d9f11..23dd4df 100644 --- a/lib/screen_ui/parcel_service/home_parcel_screen.dart +++ b/lib/screen_ui/parcel_service/home_parcel_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; diff --git a/lib/screen_ui/parcel_service/parcel_order_details.dart b/lib/screen_ui/parcel_service/parcel_order_details.dart index 65b0768..fbb482a 100644 --- a/lib/screen_ui/parcel_service/parcel_order_details.dart +++ b/lib/screen_ui/parcel_service/parcel_order_details.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/screen_ui/parcel_service/parcel_review_screen.dart'; import 'package:dotted_border/dotted_border.dart'; diff --git a/lib/screen_ui/rental_service/rental_order_details_screen.dart b/lib/screen_ui/rental_service/rental_order_details_screen.dart index 8662f2b..f471eff 100644 --- a/lib/screen_ui/rental_service/rental_order_details_screen.dart +++ b/lib/screen_ui/rental_service/rental_order_details_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/rental_order_model.dart'; import 'package:customer/payment/createRazorPayOrderModel.dart'; -- 2.49.1 From 81895849dfb069df7c0bb6f44d140404a7254e4f Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Mon, 8 Dec 2025 13:51:09 +0500 Subject: [PATCH 28/30] BASE: Implement Localization In Home Screen. --- assets/translations/en.json | 12 +- lib/constant/const_texts.dart | 22 +-- .../home_screen/home_screen.dart | 42 +++--- .../service_list_screen.dart | 137 +++++++++++++++--- 4 files changed, 157 insertions(+), 56 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index f841b8b..d4e1498 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -129,6 +129,16 @@ "newArrival": "New Arrivals", "topBrands": "Top Brands", "styleUp": "Style up with the latest fits, now at unbeatable prices.", - "additionlOffers": "Additional Offers" + "additionlOffers": "Additional Offers", + "largestDiscounts": "Largest Discounts", + "newArrivals": "New Arrivals", + "popularStores": "Popular Stores", + "allStores": "All Stores", + "alert": "Alert", + "cancel": "Cancel", + "ok": "Ok", + "doYouWantChangeTheDeliverOption": "Do you really want to change the delivery option? Your cart will be empty.", + "freeDelivery": "Free Delivery", + "upto": "Upto" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index beb1fbf..0216b5c 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -130,15 +130,15 @@ class ConstTexts { static String topBrands = "topBrands"; static String styleUp = "styleUp"; static String additionlOffers = "additionlOffers"; - // static String enableLocation = "enableLocation"; - // static String allowLocation = "allowLocation"; - // static String useCurrentLocation = "useCurrentLocation"; - // static String setFromMap = "setFromMap"; - // static String enterManuallyLocation = "enterManuallyLocation"; - // static String changeLanguage = "changeLanguage"; - // static String aroundTheCity = "aroundTheCity"; - // static String rideDetails = "rideDetails"; - // static String youDoNothaveSufficientwalletBalance = "youDoNothaveSufficientwalletBalance"; - // static String somethingWentWrong = "somethingWentWrong"; - // static String cash = "cash"; + static String largestDiscounts = "largestDiscounts"; + static String newArrivals = "newArrivals"; + static String popularStores = "popularStores"; + static String allStores = "allStores"; + static String alert = "alert"; + static String cancel = "cancel"; + static String ok = "ok"; + static String freeDelivery = "freeDelivery"; + static String upto = "upto"; + static String doYouWantChangeTheDeliverOption = "doYouWantChangeTheDeliverOption"; + static String cash = "cash"; } diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index a321769..346d662 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -654,7 +654,7 @@ class HomeScreen extends StatelessWidget { children: [ titleView( isDark, - "Largest Discounts", + ConstTexts.largestDiscounts.tr, () { Get.to( const DiscountRestaurantListScreen(), @@ -709,7 +709,7 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "New Arrivals".tr, + ConstTexts.newArrival.tr, textAlign: TextAlign .start, @@ -744,7 +744,7 @@ class HomeScreen extends StatelessWidget { }); }, child: Text( - "View all".tr, + ConstTexts.viewAll.tr, textAlign: TextAlign .center, @@ -825,7 +825,7 @@ class HomeScreen extends StatelessWidget { children: [ Expanded( child: Text( - "Highlights for you" + ConstTexts.highlightsForU .tr, textAlign: TextAlign @@ -855,7 +855,7 @@ class HomeScreen extends StatelessWidget { }); }, child: Text( - "View all" + ConstTexts.viewAll .tr, textAlign: TextAlign @@ -971,7 +971,7 @@ class HomeScreen extends StatelessWidget { vertical: 10, ), child: Text( - "Popular Stores" + ConstTexts.popularStores .tr, textAlign: TextAlign @@ -1025,7 +1025,7 @@ class HomeScreen extends StatelessWidget { vertical: 10, ), child: Text( - "All Stores".tr, + ConstTexts.allStores.tr, textAlign: TextAlign .center, @@ -1247,12 +1247,12 @@ class HomeScreen extends StatelessWidget { context: context, builder: (BuildContext context) { return CustomDialogBox( - title: "Alert".tr, + title: ConstTexts.alert.tr, descriptions: - "Do you really want to change the delivery option? Your cart will be empty." + ConstTexts.doYouWantChangeTheDeliverOption .tr, - positiveString: "Ok".tr, - negativeString: "Cancel".tr, + positiveString: ConstTexts.ok.tr, + negativeString: ConstTexts.cancel.tr, positiveClick: () async { await Preferences.setString( Preferences.foodDeliveryType, @@ -1305,7 +1305,7 @@ class HomeScreen extends StatelessWidget { onPress!(); }, child: Text( - "View all".tr, + ConstTexts.viewAll.tr, textAlign: TextAlign.center, style: TextStyle( fontFamily: AppThemeData.regular, @@ -1479,7 +1479,7 @@ class PopularRestaurant extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr, + ConstTexts.freeDelivery.tr, style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -1685,7 +1685,7 @@ class AllRestaurant extends StatelessWidget { begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [ - Colors.black.withOpacity(0), + Colors.black.withValues(alpha: 0), const Color(0xFF111827), ], ), @@ -1784,7 +1784,7 @@ class AllRestaurant extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr, + ConstTexts.freeDelivery.tr, style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -2081,7 +2081,7 @@ class NewArrival extends StatelessWidget { ), const SizedBox(width: 4), Text( - "Free Delivery".tr, + ConstTexts.freeDelivery.tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2491,7 +2491,7 @@ class OfferView extends StatelessWidget { begin: const Alignment(-0.00, -1.00), end: const Alignment(0, 1), colors: [ - Colors.black.withOpacity(0), + Colors.black.withValues(alpha: 0), AppThemeData.grey900, ], ), @@ -2504,7 +2504,7 @@ class OfferView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Upto".tr, + ConstTexts.upto.tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -2568,7 +2568,7 @@ class OfferView extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr, + ConstTexts.freeDelivery.tr, style: TextStyle( fontSize: 12, overflow: TextOverflow.ellipsis, @@ -3268,7 +3268,7 @@ class MapView extends StatelessWidget { ), colors: [ Colors.black - .withOpacity(0), + .withValues(alpha: 0), const Color( 0xFF111827, ), @@ -3403,7 +3403,7 @@ class MapView extends StatelessWidget { width: 5, ), Text( - "Free Delivery" + ConstTexts.freeDelivery .tr, style: TextStyle( fontSize: diff --git a/lib/screen_ui/service_home_screen/service_list_screen.dart b/lib/screen_ui/service_home_screen/service_list_screen.dart index ec76d86..81faa14 100644 --- a/lib/screen_ui/service_home_screen/service_list_screen.dart +++ b/lib/screen_ui/service_home_screen/service_list_screen.dart @@ -80,26 +80,118 @@ class ServiceListScreen extends StatelessWidget { SizedBox(height: 10.h), // Other Services Section - _otherServicesCardMaker( - image: "assets/images/garderob_img.png", - title: ConstTexts.updateYourWardrobe.tr, - subtitle: ConstTexts.weDeliverSafely.tr, - ), - _otherServicesCardMaker( - image: "assets/images/keys_img.png", - title: ConstTexts.rent.tr, - subtitle: ConstTexts.hugeSelectionOfAds.tr, - ), - _otherServicesCardMaker( - image: "assets/images/cosmetics_img.png", - title: ConstTexts.cosmetics.tr, - subtitle: ConstTexts.moreThan1000Products.tr, - ), - _otherServicesCardMaker( - image: "assets/images/products_img.png", - title: ConstTexts.foodProducts.tr, - subtitle: ConstTexts.moreThan1000Products.tr, - ), + controller.sectionList.firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "ondemand-service", + ) == + null + ? SizedBox.shrink() + : _otherServicesCardMaker( + image: "assets/images/garderob_img.png", + title: ConstTexts.updateYourWardrobe.tr, + subtitle: ConstTexts.weDeliverSafely.tr, + onTap: () { + SectionModel? innerSectionModel = controller + .sectionList + .firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "ondemand-service", + ); + + if (innerSectionModel != null) { + controller.onServiceTap( + context, + innerSectionModel, + ); + } + }, + ), + controller.sectionList.firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "rental-service", + ) == + null + ? SizedBox.shrink() + : _otherServicesCardMaker( + image: "assets/images/keys_img.png", + title: ConstTexts.rent.tr, + subtitle: ConstTexts.hugeSelectionOfAds.tr, + onTap: () { + SectionModel? innerSectionModel = controller + .sectionList + .firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "rental-service", + ); + + if (innerSectionModel != null) { + controller.onServiceTap( + context, + innerSectionModel, + ); + } + }, + ), + controller.sectionList.firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "ecommerce-service", + ) == + null + ? SizedBox.shrink() + : _otherServicesCardMaker( + image: "assets/images/cosmetics_img.png", + title: ConstTexts.cosmetics.tr, + subtitle: ConstTexts.moreThan1000Products.tr, + onTap: () { + SectionModel? innerSectionModel = controller + .sectionList + .firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "ecommerce-service", + ); + + if (innerSectionModel != null) { + controller.onServiceTap( + context, + innerSectionModel, + ); + } + }, + ), + controller.sectionList.firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "ondemand-service", + ) == + null + ? SizedBox.shrink() + : _otherServicesCardMaker( + image: "assets/images/products_img.png", + title: ConstTexts.foodProducts.tr, + subtitle: ConstTexts.moreThan1000Products.tr, + onTap: () { + SectionModel? innerSectionModel = controller + .sectionList + .firstWhereOrNull( + (element) => + element.serviceTypeFlag == + "ondemand-service", + ); + + if (innerSectionModel != null) { + controller.onServiceTap( + context, + innerSectionModel, + ); + } + }, + ), SizedBox(height: 45.h), ], ), @@ -113,11 +205,10 @@ class ServiceListScreen extends StatelessWidget { required String image, required String title, required String subtitle, + required VoidCallback onTap, }) { return InkWell( - onTap: () { - log("Other Service Card Tapped: $title"); - }, + onTap: onTap, child: Container( width: double.infinity, margin: EdgeInsets.symmetric(horizontal: 16.r).copyWith(bottom: 10.r), -- 2.49.1 From fd8a4cb469757c816e15c368c815c8c0823b1fa7 Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Mon, 8 Dec 2025 17:30:30 +0500 Subject: [PATCH 29/30] BASE: Implement Localization In Dashboard Screen & Home screen. --- assets/translations/en.json | 15 +++++++++- lib/constant/const_texts.dart | 19 ++++++++++++ .../dash_board_screens/dash_board_screen.dart | 19 ++++++------ .../home_screen/home_screen.dart | 2 +- .../restaurant_details_screen.dart | 30 +++++++++---------- 5 files changed, 59 insertions(+), 26 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index d4e1498..eb8d5ad 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -139,6 +139,19 @@ "ok": "Ok", "doYouWantChangeTheDeliverOption": "Do you really want to change the delivery option? Your cart will be empty.", "freeDelivery": "Free Delivery", - "upto": "Upto" + "upto": "Upto", + "viewCart": "View Cart", + "viewTimings": "View Timings", + "timingIsNotAdded": "Timing is not added by store", + "alsoApplicableOnTable": "Also applicable on table booking", + "tableBooking": "Table Booking", + "quickConformations": "Quick Conformations", + "menu": "Menu", + "searchAndMore": "Search the item and more...", + "veg": "Veg", + "nonVeg": "Non Veg", + "favourites": "Favourites", + "orders": "Orders", + "takeAway": "TakeAway" } \ No newline at end of file diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 0216b5c..6cb4350 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -139,6 +139,25 @@ class ConstTexts { static String ok = "ok"; static String freeDelivery = "freeDelivery"; static String upto = "upto"; + static String viewCart = "viewCart"; + static String viewTimings = "viewTimings"; + static String timingIsNotAdded = "timingIsNotAdded"; + static String alsoApplicableOnTable = "alsoApplicableOnTable"; + static String tableBooking = "tableBooking"; + static String quickConformations = "quickConformations"; + static String menu = "menu"; + static String searchAndMore = "searchAndMore"; + static String veg = "veg"; + static String nonVeg = "nonVeg"; + static String favourites = "favourites"; + static String orders = "orders"; + static String takeAway = "takeAway"; + static String allStores = "allStores"; + static String alert = "alert"; + static String cancel = "cancel"; + static String ok = "ok"; + static String freeDelivery = "freeDelivery"; + static String upto = "upto"; static String doYouWantChangeTheDeliverOption = "doYouWantChangeTheDeliverOption"; static String cash = "cash"; } diff --git a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart index 648c8d7..662490c 100644 --- a/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart +++ b/lib/screen_ui/multi_vendor_service/dash_board_screens/dash_board_screen.dart @@ -1,3 +1,4 @@ +import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dash_board_controller.dart'; import 'package:customer/themes/app_them_data.dart'; @@ -51,28 +52,28 @@ class DashBoardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", - label: 'Home'.tr, + label: ConstTexts.home.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr, + label: ConstTexts.favourites.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_orders.svg", - label: 'Orders'.tr, + label: ConstTexts.orders.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr, + label: ConstTexts.profile.tr, controller: controller, ), ] @@ -81,35 +82,35 @@ class DashBoardScreen extends StatelessWidget { isDark, index: 0, assetIcon: "assets/icons/ic_home.svg", - label: 'Home'.tr, + label: ConstTexts.home.tr, controller: controller, ), navigationBarItem( isDark, index: 1, assetIcon: "assets/icons/ic_fav.svg", - label: 'Favourites'.tr, + label: ConstTexts.favourites.tr, controller: controller, ), navigationBarItem( isDark, index: 2, assetIcon: "assets/icons/ic_wallet.svg", - label: 'Wallet'.tr, + label: ConstTexts.wallet.tr, controller: controller, ), navigationBarItem( isDark, index: 3, assetIcon: "assets/icons/ic_orders.svg", - label: 'Orders'.tr, + label: ConstTexts.orders.tr, controller: controller, ), navigationBarItem( isDark, index: 4, assetIcon: "assets/icons/ic_profile.svg", - label: 'Profile'.tr, + label: ConstTexts.profile.tr, controller: controller, ), ], diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index 346d662..e10d60e 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -1216,7 +1216,7 @@ class HomeScreen extends StatelessWidget { value: controller.selectedOrderTypeValue.value.tr, icon: const Icon(Icons.keyboard_arrow_down), items: - ['Delivery'.tr, 'TakeAway'.tr].map(( + [ConstTexts.delivery.tr, ConstTexts.takeAway.tr].map(( String value, ) { return DropdownMenuItem( diff --git a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart index 4f6f350..cce2b6e 100644 --- a/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart +++ b/lib/screen_ui/multi_vendor_service/restaurant_details_screen/restaurant_details_screen.dart @@ -63,7 +63,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), ), Text( - 'View Cart'.tr, + ConstTexts.viewCart.tr, style: TextStyle( fontFamily: AppThemeData.semiBold, color: AppThemeData.grey50, @@ -127,7 +127,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(width: 5), Text( - "Free Delivery".tr, + ConstTexts.freeDelivery.tr, style: TextStyle( fontSize: 14, color: AppThemeData.carRent600, @@ -257,7 +257,7 @@ class RestaurantDetailsScreen extends StatelessWidget { begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [ - Colors.black.withOpacity(0), + Colors.black.withValues(alpha: 0), Colors.black, ], ), @@ -291,7 +291,7 @@ class RestaurantDetailsScreen extends StatelessWidget { begin: const Alignment(0.00, -1.00), end: const Alignment(0, 1), colors: [ - Colors.black.withOpacity(0), + Colors.black.withValues(alpha: 0), Colors.black, ], ), @@ -549,7 +549,7 @@ class RestaurantDetailsScreen extends StatelessWidget { .workingHours! .isEmpty) { ShowToastDialog.showToast( - "Timing is not added by store" + ConstTexts.timingIsNotAdded .tr, ); } else { @@ -560,7 +560,7 @@ class RestaurantDetailsScreen extends StatelessWidget { } }, child: Text( - "View Timings".tr, + ConstTexts.viewTimings.tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -602,7 +602,7 @@ class RestaurantDetailsScreen extends StatelessWidget { children: [ const SizedBox(height: 20), Text( - "Also applicable on table booking" + ConstTexts.alsoApplicableOnTable .tr, textAlign: TextAlign.start, maxLines: 1, @@ -676,7 +676,7 @@ class RestaurantDetailsScreen extends StatelessWidget { .start, children: [ Text( - "Table Booking".tr, + ConstTexts.tableBooking.tr, style: TextStyle( fontSize: 16, color: @@ -694,7 +694,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), ), Text( - "Quick Conformations" + ConstTexts.quickConformations .tr, style: TextStyle( fontSize: 12, @@ -753,7 +753,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(height: 20), Text( - "Menu".tr, + ConstTexts.menu.tr, textAlign: TextAlign.start, maxLines: 1, style: TextStyle( @@ -773,7 +773,7 @@ class RestaurantDetailsScreen extends StatelessWidget { controller .searchEditingController .value, - hintText: 'Search the item and more...'.tr, + hintText: ConstTexts.searchAndMore.tr, onchange: (value) { controller.searchProduct(value); }, @@ -867,7 +867,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(width: 8), Text( - 'Veg'.tr, + ConstTexts.veg.tr, style: TextStyle( color: isDark @@ -963,7 +963,7 @@ class RestaurantDetailsScreen extends StatelessWidget { ), const SizedBox(width: 8), Text( - 'Non Veg'.tr, + ConstTexts.nonVeg.tr, style: TextStyle( color: isDark @@ -1578,8 +1578,8 @@ class ProductListView extends StatelessWidget { const SizedBox(width: 5), Text( productModel.nonveg == true - ? "Non Veg.".tr - : "Pure veg.".tr, + ? ConstTexts.nonVeg.tr + : ConstTexts.veg.tr, style: TextStyle( color: productModel.nonveg == true -- 2.49.1 From 766e8ffefb2f098224ec2063d15f5b5c2630fceb Mon Sep 17 00:00:00 2001 From: Abdusalom G'ayratov Date: Mon, 8 Dec 2025 23:23:54 +0500 Subject: [PATCH 30/30] BASE: Update Firebase Json File. --- android/app/google-services.json | 42 +++++++++++++++++-- firebase.json | 2 +- ios/Runner/GoogleService-Info.plist | 8 ++-- lib/constant/const_texts.dart | 16 +++---- lib/firebase_options.dart | 12 +++--- .../home_screen/home_screen.dart | 6 +-- 6 files changed, 61 insertions(+), 25 deletions(-) diff --git a/android/app/google-services.json b/android/app/google-services.json index 869b8c5..3b964b4 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -8,7 +8,43 @@ "client": [ { "client_info": { - "mobilesdk_app_id": "1:893074789710:android:05002c15a64cf1e0c4ba1f", + "mobilesdk_app_id": "1:893074789710:android:70c2e98114a8ef1ac4ba1f", + "android_client_info": { + "package_name": "felix.fondex.driver" + } + }, + "oauth_client": [ + { + "client_id": "893074789710-nqkeis20f6b64luas7g44c836fvi0qms.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyALZhdy7Rw3jffipxsDvvz7_C_b4teVg1k" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "893074789710-nqkeis20f6b64luas7g44c836fvi0qms.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "893074789710-7am77oq925d324gvpga8g6r6ggul4v9i.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.emart.driver" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:893074789710:android:e932bc88da6665b3c4ba1f", "android_client_info": { "package_name": "felix.fondex.uz" } @@ -32,10 +68,10 @@ "client_type": 3 }, { - "client_id": "893074789710-pv12m4nhe82a4ueg9sb2pgt42r0e5da3.apps.googleusercontent.com", + "client_id": "893074789710-7am77oq925d324gvpga8g6r6ggul4v9i.apps.googleusercontent.com", "client_type": 2, "ios_info": { - "bundle_id": "felix.fondex.uz" + "bundle_id": "com.emart.driver" } } ] diff --git a/firebase.json b/firebase.json index 88cc8d5..0e7803d 100644 --- a/firebase.json +++ b/firebase.json @@ -1 +1 @@ -{"flutter":{"platforms":{"android":{"default":{"projectId":"fondexuzb","appId":"1:893074789710:android:05002c15a64cf1e0c4ba1f","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"fondexuzb","configurations":{"android":"1:893074789710:android:05002c15a64cf1e0c4ba1f","ios":"1:893074789710:ios:510ebf9e4ebed6a8c4ba1f"}}},"ios":{"default":{"projectId":"fondexuzb","appId":"1:893074789710:ios:510ebf9e4ebed6a8c4ba1f","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}}}}} \ No newline at end of file +{"flutter":{"platforms":{"android":{"default":{"projectId":"fondexuzb","appId":"1:893074789710:android:e932bc88da6665b3c4ba1f","fileOutput":"android/app/google-services.json"}},"dart":{"lib/firebase_options.dart":{"projectId":"fondexuzb","configurations":{"android":"1:893074789710:android:e932bc88da6665b3c4ba1f","ios":"1:893074789710:ios:7dd456b65070f325c4ba1f"}}},"ios":{"default":{"projectId":"fondexuzb","appId":"1:893074789710:ios:7dd456b65070f325c4ba1f","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}}}}} \ No newline at end of file diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist index 9ddcbab..87acab5 100644 --- a/ios/Runner/GoogleService-Info.plist +++ b/ios/Runner/GoogleService-Info.plist @@ -3,9 +3,9 @@ CLIENT_ID - 893074789710-pv12m4nhe82a4ueg9sb2pgt42r0e5da3.apps.googleusercontent.com + 893074789710-tgc677brhj8902uu2nv6k53otbhbnp1e.apps.googleusercontent.com REVERSED_CLIENT_ID - com.googleusercontent.apps.893074789710-pv12m4nhe82a4ueg9sb2pgt42r0e5da3 + com.googleusercontent.apps.893074789710-tgc677brhj8902uu2nv6k53otbhbnp1e API_KEY AIzaSyD6Khoz4y93GCj3mOPi2FoluDipplH1av0 GCM_SENDER_ID @@ -13,7 +13,7 @@ PLIST_VERSION 1 BUNDLE_ID - felix.fondex.uz + uz.felix.fondex.customer PROJECT_ID fondexuzb STORAGE_BUCKET @@ -29,7 +29,7 @@ IS_SIGNIN_ENABLED GOOGLE_APP_ID - 1:893074789710:ios:510ebf9e4ebed6a8c4ba1f + 1:893074789710:ios:7dd456b65070f325c4ba1f DATABASE_URL https://fondexuzb-default-rtdb.firebaseio.com diff --git a/lib/constant/const_texts.dart b/lib/constant/const_texts.dart index 6cb4350..b44803e 100644 --- a/lib/constant/const_texts.dart +++ b/lib/constant/const_texts.dart @@ -152,12 +152,12 @@ class ConstTexts { static String favourites = "favourites"; static String orders = "orders"; static String takeAway = "takeAway"; - static String allStores = "allStores"; - static String alert = "alert"; - static String cancel = "cancel"; - static String ok = "ok"; - static String freeDelivery = "freeDelivery"; - static String upto = "upto"; - static String doYouWantChangeTheDeliverOption = "doYouWantChangeTheDeliverOption"; - static String cash = "cash"; + // static String allStores = "allStores"; + // static String alert = "alert"; + // static String cancel = "cancel"; + // static String ok = "ok"; + // static String freeDelivery = "freeDelivery"; + // static String upto = "upto"; + // static String doYouWantChangeTheDeliverOption = "doYouWantChangeTheDeliverOption"; + // static String cash = "cash"; } diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart index 4df3f6e..cf4dd0d 100644 --- a/lib/firebase_options.dart +++ b/lib/firebase_options.dart @@ -51,7 +51,7 @@ class DefaultFirebaseOptions { static const FirebaseOptions android = FirebaseOptions( apiKey: 'AIzaSyALZhdy7Rw3jffipxsDvvz7_C_b4teVg1k', - appId: '1:893074789710:android:05002c15a64cf1e0c4ba1f', + appId: '1:893074789710:android:e932bc88da6665b3c4ba1f', messagingSenderId: '893074789710', projectId: 'fondexuzb', databaseURL: 'https://fondexuzb-default-rtdb.firebaseio.com', @@ -60,13 +60,13 @@ class DefaultFirebaseOptions { static const FirebaseOptions ios = FirebaseOptions( apiKey: 'AIzaSyD6Khoz4y93GCj3mOPi2FoluDipplH1av0', - appId: '1:893074789710:ios:510ebf9e4ebed6a8c4ba1f', + appId: '1:893074789710:ios:7dd456b65070f325c4ba1f', messagingSenderId: '893074789710', projectId: 'fondexuzb', databaseURL: 'https://fondexuzb-default-rtdb.firebaseio.com', storageBucket: 'fondexuzb.firebasestorage.app', - iosClientId: - '893074789710-pv12m4nhe82a4ueg9sb2pgt42r0e5da3.apps.googleusercontent.com', - iosBundleId: 'felix.fondex.uz', + iosClientId: '893074789710-tgc677brhj8902uu2nv6k53otbhbnp1e.apps.googleusercontent.com', + iosBundleId: 'uz.felix.fondex.customer', ); -} + +} \ No newline at end of file diff --git a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart index e10d60e..9764e2f 100644 --- a/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart +++ b/lib/screen_ui/multi_vendor_service/home_screen/home_screen.dart @@ -1248,9 +1248,9 @@ class HomeScreen extends StatelessWidget { builder: (BuildContext context) { return CustomDialogBox( title: ConstTexts.alert.tr, - descriptions: - ConstTexts.doYouWantChangeTheDeliverOption - .tr, + descriptions:"", + // ConstTexts.doYouWantChangeTheDeliverOption + // .tr, positiveString: ConstTexts.ok.tr, negativeString: ConstTexts.cancel.tr, positiveClick: () async { -- 2.49.1

Product Name
Quantity
Price
Total
${orderModel.provider.title} ${orderModel.quantity} ${Constant.amountShow(amount: (orderModel.provider.disPrice == "" || orderModel.provider.disPrice == "0") ? orderModel.provider.price.toString() : orderModel.provider.disPrice.toString())} ${Constant.amountShow(amount: (total).toString())}

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%0D+RkTu*#p*~Y zj}o_sVk^=xL?0dGE?aDp1dHTT-t^#-08YsK#>Ns7m;otW$Vu*0m8~Ld1xO|X^Zz-&5m*%SZVldzM#dfvM#Rc%=9=7 ztYMe%&_U*jCTV7BmfATAICA6=HFw0>x{T5TKe~&yoO>Z1KDLjxZQCky(zRkhN!hSl zie%Ih&qH}JM>*!qm4;C0e4}ltJlEJEqutjG(C?#s7 zFMa8o^pY38NVL=tt<-rv2p5WU8QcOxm*&Mj|I(V#Z zes2M+y`}L+SKL5VmV@*N(W3X#Cy?TWE;LxUKEp53zNNAvxK?O%3qA#IhU9_CxvbO( z9L`# zf5lRsVzIEe+55%j>^63>gtqx922z;OEmOhjjd!p5Byd-pO(nzo;`c%rW>xJ z+iv@=L_{MTVTBGpEMZuk5`Gq{Ko#CEm7U=blQksus)#x>J&^3HyO3w-_`LF^@s9M#QiIn^yeoa_g_!}Zy$P~AwHU(;|I`#Kl?KH@EDDrI7HX% zdX8k@=aG&OOHw088jl}6PJ5Z#%CK7%F#Q}1NQh+^3B{!eNreFoO)(A~IYNu`Gt5<` zC^eU+&bAJj1D_EVi)xW0gOIT)lxToK<(B^= z)?XkTVrwtR{8f`gZQ+`uC>;gZaZy(d(FwL7lPyjBJ~=7(ii4knnnXrvf&rM&X&e?7 zx)RL^U*?y@RkX2#MFj=)Ir{N@4a-<#TWDaup|%6^_!CN z67VaP2{`iAJ_Heqe4-^idE|Tf zd@6$Y|FQQU(6Of1bs&2F$^{fq$TrM)F9Mp6&72vSe$< zmi^}W*-H-NvE}eAOR_};QW8Zmi#ar#x4Uo77dhvQ0xH-4&fe!M+?Hp(^%NMuweUAD zFD_81`s4Y|*=L`<(S7orhagv3&oHNuqgoi>$AEcYAJ7s*>4{P?m&=&Ioy+Pl_zN9; z1V!rW2W`F*;&I=IHhC?kBFnyC^Rw$Qz8{sy29S#8mq_HkR z!`5VdgM99@pOkmK`#qXfWMy$?T;BClKPEr>(?286J@JSnqG5UTu_xq?;!q8B8n|Gl zq5D0jz(06rZEfwuz|zQ=6k~!f2m*XOuJ~PrVuG5HbocZysMj<$NJC?d3{NO%-q0!& zlM|ZtWN0NNB5}>UfnocDrsb)Ir#F)L;c# zNBLTq{#(J_BYMsCb;VG)aG=Jzf43jV0QNt>|2>EEdB758Sm8NI8my)yveFUAMv3SJ z8H??Wm>^zQc2s0`Wt(rW#e<+XbFP?U5US8@qU;q2z7f(SmVzNOtwqG5TB}p6@Lef_ zQj451fXw>yJPkiAL(3I*<;1BY93bXckyD^xE3yPLS$*i|r{#s`-z;}7U6&et7Tc8Y-?w*x~85}0=rww($Ur-?Y(`ZA(Z@xT)TKtgJFd%EiB54zBav; zl8djtDn|!<`#%&JDWQSm#7BaSX?$S?iMKb1RQ`xA+*%}ajep5km1QmN+% zm>W1?m`wy0xv)4-!Y_*V&5dn6{u*|EA<+$534%Rvu0sO@nk}wLXImpP+$xr!m86>> z=)v6xWuXTyng*s*51f@>|MmYQ?|#=iBvZ_A2tKcY8J$j{RCI{^F#36x%u$Nun&5pV zKIk){l6RoSx{tRX$N&~gME+*jnZa5aC`J+E`KnyLa+Sb#Q%jv1+)$x2#DR z!FK>S*(d(w6Y|a%-!Av=++$Z6a^PV&u0uGfT(3*n($3UN$~20AQw;$QR*|UKk%MjD zZa9O3#hc!K^3n(q|JuveX?*WtP6cZ)9A~o;xc$nVdZF_){{a!RzRuq}txr89p=5)+eCeW0&(4s-^1HwP32AI@ln2irkrnM&qD)UzLhFB(rvQT#VJ&fC zn1cPqc|<7*Tx@x1i3f2M4&FDd%612oF-^|R6tZUg>(^w~q)3egl*2yj- z<_kNtoNTUZrUJy>Ti0c7ahY7KOmSQC!6Fqn>Jl|lsW@PDRZPD4`Oiz=kt6JW?(P<( zwY5{;_Kx=`4wfX56^jipDA=JP;lT(I3`3Gy3c`Q`YOTna*Y$gI3v=Yx1&LK@w^N~j znq&>BDZRZt+Q^vTB85o^NCbhn4DJ~)KuGrND)_g(wN3+cXob<=6IhtOA8j$XqETn57G!Whl~_QV zUvFM|L_)EGSceN6PTtv+qf2~9#8E2n|B#=?lMf!4nXLv{Dw-#)sa_yhA>%@45x5w^ zdUV5dUyPd;-edn$qFSG(1_jv5)?TJr=8>BeuMW%b(73$u+2>g1%r8vK8=ihzKK_YM zN@jOc!Wwwq@{S*p`DyJ!j!($n`K5m%pZeY3(g!;(^OGY|ujSt6)~0p<8#u(hv5}JP zOkV10Vw%+?IP?rULsha)HW#L3Q^EaYQzI?QP{wXx);C|`_|}c<*LZ%@ibZwzw9^%+LCdy9pmPbEwvu9(dM0_zqfyPww39iYftu3L!Ju120%oCxthrcl0+`~IS4+HR zrpy{5xLPU&x8z{kx7!a~0IQEi{yxV&oHZKf6+Hv!iD6+ieVrg(Wm&skOjfw8jW14* zzC1U{AcC6~t1y_@8hAi@1ipp$;0=xf6SI?f!%s+)(4d9+xq{2EP~HSwc88&4WCsz~ zA*GRo28xP`5X+VFR?r6)GSV1;K6UD}eEG{?mLn(5C??b@|L#Bkrkp)_TpoMm0T~{@ zBdywTgcH%ZhaZyv&wu=nQmc5+%-uWEbLtVv>}<*5{=@oEXEj4Aa=&V{Oxw=cej=Nh z)1b06GcVnP$D}F|k#z;t7qmNAqwniOHDYQ`Kl`ZMx_(`b9X-sEtI6>ZGU#{p*e1uu z07D?%_48wLuX(Pe)k3OI&3gndjO^fMbkFbDY8I)Er+nC9-dkL%sEq-8T1&~&u-46OhK4*-4ujGiCLGqZ&SXnlcqpLJL zA{rE&b~U8_E&{Cr)>TQFnVpvRy!%Jx;%l$T=)`UL@els6Y$%xil`s66{PSP?Px7hH ze@?0z+vRuv`+t{nr%%h-GY?8y8)XCi$K=M9S4d37ep5?69-&xZ2wb&7TFb9G>F+y4 zD#VnQibch+su~-lzNL}W24q&pj-S?y>bgAt{PUXCY*0lN#}75s-CTh(+oNMs99yc? zvhSASTqhJm1IMgdJA*Ze3i;euUeb~+rl5Ph{H>q=3HclU(>vwV(L>VE+$=9&xG43> zT1jbkh+vM6=#~a1sJL2pv6A>Y0tuYI7Zv})wM4dthRJp+ttImsA%P9W{IFUegKJTM zKj4QrNDhA3p@BohzUH+X%hH~n1|fEbsm?2bJ*AM6>p-G01Ad_An_4bjlk|fda@8^i_--;~oLYFFNOIyw;5n;Y;Y& z(}~D)*qHEZkTnt9&@lu@3;}UR%aXJPDg+3$@6m~b3M{a%Jk4B7#zzWRS&L2~WnS2? z_gKc@Q(Ib__;Y*@-7jQHdCizW5BQ@${-`|j(IubLfOY27QF-*4x5_{Gdw)xg zo;)eHu3eV5yyYz<(0=C6J|pjZ-_Oc_`WL^VnAux2i}0CwA+s2tUY3niR!gu7vf-Ck zmZ|J|XXKtVHdJf5Ta<0>>gDo9c1#y~o4GB?1mlUlkB-5rt+4ScYU>py%% zlCc^|)-*~^&;Q)Qs;sUqG4n;I@YI>p^3VR|zm#!pA{0srnCG;N)^j(vn$fQ35iL6d zoCcWHEDl*IhO==FLT-WCgE$ATIsa8m8U)^$ z8_;irp^64SnA$=>5?=!Ys{jT{^AwNw4XHD3u9f8^FiA{cP~)x0U>xGTQCOFQZQpJ` zPysAo%>NkJ?nX+*NQeW-!MiHhur&aTFf7#A&x0Xr#IO%>YU|k`^_n87Pd0 z6Q&_2jvUqU$;y^^1kHhzw6=8+SF5hBqoB)(K7<#){fa#O_>=O$nPW0Cd`mN-Tk_LC z^I;j9nxS#UrI)`hzw{6Pk(6@yObrk<`!nir2z1UcemQR9Lk3q#pdmJUV+25>j$aFM)k z<0U29-RBt0C=c!7-)RQBqGmQB43ihkNCX@)C@J9e$dUk1BQ8Qe9v`Sh%O2VFP=6oa zqoBdFp(?`R>4}LkdGd+pd>k{23h-m#JE7QFU9;k3Q`6Gh-NWwYwHw!@v#o{vt?jKf4dTAE5lqiYy#|Yg zB~wR*G6#;IbOk++wHmCF8rYJ~Q5#)Q(^IqTIE&6LKzsdznMy1wm?X$*pxpqiLNm^V zg?Y_98)Rv5MWPi^HfmytC@T&OQn)}HA$s26-re8dFJq%abUmuT`47O6 z3f<^9h8*=zh#9z1C}eLqpR`j_qr%WPv9o|VV$J-Ul-Bdut=a0>_@p)l+BBeU@%$jGaQ`jYXuJja6foTVE6hMY|>7@>nUHq%P?h<^c3 zK>)+oz^`l!rD(yAWu{RwN^bTMNQ2WBS?ABb`91O*|Nh^~hko)$hDJ6e;u^$LJDVEJmSpJOxK!)!hM>=ejx53ZAQeS&%-pQ2h)fLu z4jE^iW?3NHqEo!79ZOiSK_4Fu-z6++dcK>Rnwj~XICDxaTzpM_=xuM4k$WS|%tKLA zx5OwB0#{J~rc=9SV0lt7Y@k2jgaOdy37LtvtSziA$icR6w;z}QwzIqYC>2x@w8X8R zP|-xkPlG@t8s-fSM4ToZV3`+Dp7_qx!&B@j=llTm9(7zJs4j3`QL`!xT|?K3c4>tY z=@Hm~VWArd@E4#y^}BS%hL*nP`FnH-(k`In>H8$L1_Gw+ic$&KQAS@6p+f}TL`6x< zptw{#&q!-)gLd}PGNl;{bhBQ4?Nyo8 zCIQSjCTH$x5L%X)mRW~SoRLCiSC$}OqXFjd;eNSx^{W1TM5gCvWqD~{&OfS|*UExo zLshb}x+#x6^^}amIlH<>14v4$sw?PNj(~&gD_Nc3_YlZn)LRj+B<7XgO>5b=&4mQI zX~51fa#WqH93}V1MI1?>X)la_kRMbv_tyz`&*5+nZDGGkqY1WgFwWU>gTm#m(U;2i$Ysau#AI`;jXoEdT^N#tM zdCg4fGZcrhk>5o3N*iiG~)+QMb0WGIOfYCqU=qAYHD5zQe#+8NfO%UQU9@12c6^3oewbL1yNLvyqh) zi$$kAKoSK9m!Vbwe5FKVk1R2me0inTn>wA&kw2!LPyxz@TnnX|Nez()p?kKeM zbLRLB?ic`UD!b~xG1v_ovgaN?BXx-?X>P2Rh1FGAT3eH`;d|2G+b_x5dMyJh{#NM*c64xKtF%QItIs%2$M0~R`? ziE8caX-VAI+aW6&grJB~)6~VWBk-wW6&e7>M`iT(h*Z@lswRQd^af@q4#SnL{&|gqD6Qnh7GaK^ch- zWLh?+XG%gkSNjetip8dG0cs@ zZcrOA+gNgdJqQf+j4V=^5WfttzEpO|28dtu`LGegasr2(GvN%KkzmO$3)p^`WKV#> z6s&b*eNaDT38@(Xx}m=A-v zh9iDvHRxiHd2M~0w17$tJh`mmV~Q;$;|a}xl2TdSA`j_4!if)Ml zhe4ZlEtvcl_<8Y)ilQ8B`+D2=0qn&WAE?OWvrQa%4%qN^u~gdQSAhuW1xgl!eB*b) zixC!S;kdTMQ8H5gIlQO9N-HxeL>L(r-8yDY2wu4Yh40V^ps_8-g-jY6-8Puo7R#1g zfuinT!n>5h^!;bq*lkBkLT2Y*n+O7Fp6xVoLG2r8SVu)7s6vDBY(Xl!u>vlMD~t z(ET>Y>`Kk9aDH$+V9g&oepLFjY+PC1l$-`;5Jkslr={TU%629v4O-%9*`=9Zf|~VE zn8^F4%mL~I%0~nSd>^xnXp{gBz~=xfgX8zEma;qAXn<2Ux|txcwzf2L45+fAN*Wtl zSq29k{RKnayBc(mjUnj4imki5hm3rTK%x7Za~)``PS9NoL~TK{Og+S`-4-cNhh;(k9OWQ7Sttep5F06#ZAz}_VGewUnWYhX zazHHywzU++dxGH&X<^LEmBmphj|?q*&$2L-lSO1zEL{z6GwQ^B3wo3t7;j3$^$5YX z@pSz5N7dEl%Dt`%k=7$rJ$>MWZBNc2()WWV~#EAkT`{ssB1 z-}+5`o+>3-8Ihw$kIR?7{<4gZOvwZ1&&iiQ^*L#7)2^nLj*}CUvc9xVJ+xd#18?56 ztw1CNu2j@rt*(SYMwG__3$)V@J}ei${AF1fAEzO0B^LmZw)PGU=tY^G9n;QeN;=wm zD0ukzlg}}5gY}M1WSzc#d~B3Wl48C{QYgl(aE_o50stSz9WVr`&8p%Y zY6-0812`t7i*iz-?-$c+iR=s018eJBoa1B`ri%+$`*VulAuy)4ceI@M80=7%_iBf9 zbaa$TvFj^qc71$<5`s>#*LNH>%7}Xo_jEI|D1EUoQmVR8NXfyrueW_4z^a0wzw2{V z^c-Mr4EnN^ju-G*CI*7WbVtTemXjuETd*piWSY)~w=e_4?25l9u|s(k;$tNStr8S0 zG?Ez$JWc$}cjQ*aCb}6p)eGOGrs+}X*_ab_+wp+#-~5?9G;sx5BiRy9Lv(uX}K>)QPj z%!z7XNh{cm685pD9uqGbSL~@uJB~{lXcDruxj}0)5I`HX`sU~3-otd~Q_28sU_HIQ#@ zZ%DKvEa{way*SkEJJCWoR8ft!#Cch40q2&iciRDgzt6XQAHed(;={h1xDDu&fw?)S z!|b?R0czm;PMM;DgS#NAh8bjN7Y|8jcXQq^83X(iaHS(^zaojIhKblvuSZ-A6bMo) zd<%2{!%Ysyx{u-vbs@om2aJA`Vnf=_Z-}KXLG+qBcI%MAfQoVY>_f7o*wLSS>|^qe z{`Y?*|M@@vwwyh2QoizqFUpVn*azj0{_s!ag%@9x+Ug+137>!VS^3)6zbQZdlRqQB z`&+*y@Bhi4lnaN>g%gzWMo{b6wrprEcj@U zfJRfJy`w|M$H(Z#w5H`@Uw^NjBTw#JyDB-&+Ma&Xi?X}DCh zPP3lb$uVir0GCz#tG%P0r5s479CkG?}t4(*!K0duLIamzV(@wbS7I(z@DOj z9?Lr~Xh8$z07#IeO2lG(4OJmZdEV48r6mI&BPvb*p9?68eCmt5#KAE9V}2Qh)ZlQmZ9aBp#B%vnOQq z&K+5p8J33jUJWEuTCPTAX?cmt4cMpMoG-1NZQA+F%fNuXW`2QIY98<=4J0U&k$D8P z)NInA(5fZd@V$F1GuJfxIehepR4J~svb@G_XhH+!q;@o0TU)jKi)vT1S%X%O+`Vh0 z(e2G0wC~s)!OSB_s}u{-1z}8^6SyV;iI9&4`Jh@2d{{vsM})F|UYi8i?*~mpXJ=`M3yKQJ#uqPNlAr#ceoBMv1&M3Pir|K<4cR!d zUN`ROI?+PtpzLOag$~_r&ksv6m_NY4_W8E216XBKpI^}U zT)vZ!M#~*qT)YvX4nc6%8F)~X(6_wH1u$z0Sg8l8W8ZOr@Z>P_a-}1JAjzzxO_bbw znW=8M{hp@`ago6iC1(&r!Fl73foO|t10yteFO-+4R$H4I=m7NUrHk@oKmLCC*0)}g zM<07c);G7<1^m(X|A>6?Q=gGoMN-!1CZ$U|f5`8C>p%TBdCv!bM*i^QeJLTepVf*zx1CqYpYf6Olt~Y_2f#8y>!`+0~#N)08l2S*;}`u&=|XPiUJj z%F(FZOpc4d1_rI6@udKLg#!5Sid@(4iOZbnKBTx7E@0ZtPuA*w0+&N46D21-D76ek zGh{boqKBC0?ALvq*KD(+yNk*cIRDA&3fa{Ce)5UOHK5*=vGGyuMn;)kp}QF1@W0`f zWkm{XL8l>y`;2;S95p=;*&$oRYz@p*MdrcR>aCw5l?j~fXC~O_ZFoRT)lmQS} z5sX3+^Mgco6mT**Mm#MUQ@`xRW=1r|{Ste9&dEmOCdSvs?=o72Gcn@IU*0cl$gU!e zPJss#V=BdROJ09BsAbH?`lbTxi;53r*#Sjn2^k<{4qbh{@|CZ>Bva!f@)pItKJl?X zl{Y;5l>D22{jcSJ`N#iQKJoF7N<&MxbT`+?#fz`X-}@)OA|L&~{)PP1-~M~DGBc~$ z*Q6ZkJ)%EvWe1b0qL^9Gzo~MepZAz%aIb3VcTY2{x+KW1d78u~G+@*4`ObLXU4%TRPww-i4^rg!_b3$md&7SuUn+WD<( zXe2fTNoag;X>pmEQ9|**=GG=c0UYGcr%kI%&l?&rxYk8`c8{d$r(Q$d}3(vE3#dU~~uqw{p&LqCe z8}UzErQ+*mYe8==27Ni$_Vu>EF)&}AX8B0d4GUVtl}hDKq;T}d0P+yCEvS5&aYunG zD+38KESlibrh|nZvndRKi@ld0@J$lOH_J7;3^_+_zi9j5J1J}0eRzAyhkHTHFPNsf z=cpQGk3kSEQ3g#Y&J@tk+|Vo`h4CSjP5PP9c#=Ww$T2O~s;cGx^?&?x`N${#M1JjG z{ww)gf9r3`XFmSN^85=g$j0itRMa)d+u!xW@{wQv*Yc+K{+Lum0&;hJTHf%)QAy&D%LlG&7+ z>PihdvvTP0QR!4nt2UO93zuFcZDLh3sPX9;4ZJa_3{^;r?oYuFNo#MntZTM}>je)< z1fNPR-x?I#0$~+W(IeU&jB56#)vAKg(=a{FZcSR(tmJS(((58qVNg@56@^L|bg&3YvR* zh<}(ZQ<~h|(#;prF1;LV`+D2A0qpU|AFs;g3Q50gvJfOClEEcjQOVU3^ag~L80^zr zDH(7jLL?k^?-X#l_s)qMe>3isLE92r_dbFBkein*vIHtQ>;|oNWLTbw-Ls^$5lAD@ z8gs+jb4WwR7i549u&Dqi9qjL}0@Ii?gbFHk^))bNwM*C1*{NW8MmERD6mjWMpVaf$n};SzXdhC?`Fg-O|<7Ess9+ zjBNUqV#DxZx^{1`ZOK=@^$mIJ^KX@KTmx2PonlT?($Uf>3rn*a%%&9UN=iugt1?zW z$_mas?A;*e3;;e>8JD(>HpR6XWqEOxv=^)cQ2R*haih%JQG5+o09a;SZN0v>nLIZH z7IY#p(uGoRZf=G_4<@_KTH)}cyDQD3@zkw&+`8PSXNLLO&hgF!Pj z_MF=kt}DF?3XWRg7NAl|@0o}fmV<3yZ~HcYoj6>77%gys;8+#0N`{^4127SIJ7T_$ zvu$E_XpxXTJY|E8pkrW{d>aWW^R-CF2n6;pEo5!T;GjHFAZMsZN(PCno>3%7fOYDf z*owZ9Uzw4iG!48CLvbk?N?v3SiK>_a!Xa5%T9M7wb$Ua>(=e;qLpqnyjOdIkE^kPE zZ8f{BV`W1gyx-q1%$sQ}W#NZ9)y*|FDiV+YO2jowTVe^kmCZBD z1L%(P38(GqWHqtKEd|=A6=VmM0)yD?EzPpEy=n@#xgE{U67+QpDKr2bvQV&~IN=W8 z8^VUr-pBg_xCcYO%)7(;LzWs@9OR2Y&v^OLb@`poz9feqd{|-{v}dO$NK=8jy=COa z4Ge{Xdjt4@2{=v`vPXf~s#_?1c5V)~{k-kl02U8az0))Cd;XhRUSfDw3>Nl~dkI0T zP_Ye28A@hI?At1S#$51F{G>4#3AB?RkWY#m-_||>$^(Kc+SjqP&C&T~p4#z53 z8S0mfI2=h8vyJ$hzt2Eu4TiGMBuXW?6RoUn%g)A{q_$ElgSIwP=2z(F6nsu9sGj0J z;ekA&K>cSv_j#F}nv`c02YdOO-;{sw%m0V`)_?dn@;Ck;e_K+Sg517(MSl73{~axp z7A4u%DSev7fxCt*s9rN2Xlp@cnGWU}g#mUqYi6^(Q;;jyuSoyk5m}mDZwmNPWn2T2mX#>iFn)C#0Qu;Mg8hf3u{tL8T1F-`XpT=# zvy7jDgOOrhxDL?KZ_`dCfcxR$AuSJg$;qp!snU*Y4Vx|qCRN(?gi`JHcAEUI07^-o#e&mCYOACAequfuQBtO^u%y$}L7B;vwpL zVYNo-0i_DEhS1TX%uk392xFsfbC->cH5zQA^h{h_+)zM!OLjHm+TPrzb2s=Cb&a-t&R?$=1fIa+v*&6i$d#s_28IW6B}37BaFDQA7>_8nP*`%gtk9(dpp8NYj(^a$jt zQ87KZ>y$89}cEFj2g5BCq~J>oGdjE4(yVQ5JkE08wI&@U3D zWWi<82$uI}Sj~#hI@@l6(m(neyK=DY>uo;NzkRv0YAeoq;DMW;&^g1R_z?G3?>${uRC&j`5dyqQOwJJG%C`hi53x*{f zg3yk{N&!T?#?dVT4(dgq4Y`&)bgeXc5WvR6IHR}`O49e)vPlINj+_A1h zM>IeIWAdfH{{&@<-ua;qOG0SMd$6ZQ4x*hUe#ZxmbB_ z;NSPki<1$WF$GY@18A>Def|=e&iFU7?NUe%hPn6owjTqS-%=5MK}uSJfB=f11Fd`C zCq;rJ(vk%eWK5B;1u1BJ0mug+Tx7Xt?eYMFmC5fIfwjc)50cXu=P8wpBB96{aW?AV z1N+Js_H@1g9z(wi7+859%uLthc;G%%DrKbG~k zvZD_za5MzoxOV2ip}O?#3-T-f@K@wN|HkjghyUi!%EZtxX$-)LE`RNdGB&#)@A~nd zlRy5Aez=JKy&~`Mux!E$QxUlS6}Dq(_Jbmbzq=0srp38?vEg zYc{nv_!h`;?}WH?7X9J@k#(PM`?7@eg4zF_ zdV|Dod=BrT^(_o0p}j62JsUOHBoY-MUr7|s+K~VsmT=Hyb?z4g<zVees+4j53=a_z9>PY_+2s3GluMmDLb${PIRuZhd&*5-nk0cD6P+ zP6YgpCaVEcehomGBAaHAfnNNlKmR#->)YQZS6;iM59gNr%+GyTe)qrrcRByalZuUX z$d^9*ae4l|KOxN;1OeD*b-&M_e@Jn%m*v@K-zaNK%ZjU+S}izp0Q}+94aaW$>>+)h zo0qT1!143i`Akbf8wV&~D=Mogun0xgySHyEM%Ab>wNlcBZP{F2lN*|~b+>fsd5Gw_ zFDYhM&_G=!t1D|VKQT&-3X6g7@T~QXb?sKpDb}~m?*Vjg)vh6~OFpa33&kH1%(k{r zN~X12xlIkTnq)1MF!NLA=W>$s?__fWlQZ`dx7xn`O7}!4F_FVvD`IyZ= z9CR2~*{9KSpg2lMBveI5P^HmE7M-)Wcu{=~FfehWJ^{;;3T~jgSS-1WEWlt>2KjS^ ztaYN?Kyc7uWH~oK8Fsudg|vxX0nmqXLckGa^J4oJ^o`XGz7en}WFX|vdQkf;QpP0& zR~`LbNG8(~42B=MlAL_#q+GjtO`02$a_ZO-xqRuGv~_jK@BjCYa3*qVbDd_d$4@>e zsl_Q-P47r*eOU$$9U>!sd3jL-d6>$g*RS8y@SK-WWt95Hqm?s6C#*;!R}m8|Wiw80Rff-JC0XocaL z)@b$z@kg-paa}T*l06OzauZb{Hi?h?6Z1YDY<_4wjM{dbhJ0iH}(7No$ZPz z^^y+p@;AP!S=&41(3C}A>j>dEUuYVy<%YG&}r}{dtWg`ydK%@l4g|Kn;IB1d8yZPJE0j`To;LAwm`m| zbrx-qKH$VA&3UN6?Av#g8em`G{oytISqP(OP^k#5$-%a-xBV8t{CG0@YoUMz5VGon zrsu^WZgl!wP(eE!SO`{8w9_GW7t-&crUU!X3wW-Z=p=H=vv2PEHmhhXeZxIGYo~+Y z=-iJu?Fb+kR17yqNrPLSwIV@b$}9(sBwGT37Hn_*9dMwCx9EQe3>7gg=QuQ+C66ry z*=Nm2fT^LRY;Wz9tG5?rd}Kskc;N;4#3%n$-t_EKl2%~+@|A0H^7J{W)NbN`_*ef@ zOUQT1*zH^LCm;KL88~`OUU>0`4;a_9Ojs;5F``q+`D9Blh~+fMC+hV-ew=sEwk=miK2l8nxn>8{$Yj9=|chu8S<~RT=2w9OM`nu*g_fM z^86yyD#~3d&@)hG0_-n2XCwSh$OR)9e~_o|#!ZNo;30tTB($&K{|LgQZw&8vMcD1P zb+=GPVH^p-Hb|QJY@Y4kZ=P@n&p!0C^<_#KlfP5R$j5VFg(j)Q#4K`z= z_n2vY33iq$0(b#nOVVI%ZvU>=0_}tZ_F6*3k*oWbh6P+FeAa+@tn+!CK;! z2sRCL-sv6|k?nMf`?alQU{kn~no5_Ju7?C5dME?)Tdw>9&bm;Uxca(n2m zmWkcue%02;wFz)WR+bi}MuQ8mKIr|&s^eTh=H}-}oxlPD6^iPHI;X^8y7r(;(4EPN zJz^ojIl_4a&#SGim4+Z#q(XXqmle>*VughOjDEc5EKEl9_m(**zAY^pY?t+C1>$Y zr{uCNZ1jZ8IeB5vngj#dWd#~*u2I{Le1Z0MHUxN=1j)s-~B=VK`q(hf@CG7 zffFov=!+ph6*5H{aX@O?(*JpG z#X^99x1>Q5!|4F`;pmMZ1F#=mUVI-?(p6gaLPjUGy-q*OItB8bsH!%lqqMW*ss_J+ zP z>unCof-Ef@GD?Mly`e~u;fMp@A#=wLIVA{ebTM+Wsbymi>oj?L!Hbj&51F0eRz{OB zc^;z!`JAbw{+Q>R8HB^+5M08#@@K#@SNz7vlA1jzn2*n%U0O2UnG?_hjuul)45cuB zj@%BxqP;08DJ?INRZdKd>qEJ&;C_{CEUZgoYrA~%)1Q(zyx}?d(q}%Wfc%_dKHajk zwkqGga6tz8`=zy|RlfGMuaj1R%wwilN3t9@dYBp6MP6d){de=IzFC}IGo#|7-x=TKP-c}Jdq*N@25$aUG$%;VV6qjLG;MOoL^ zKK0b&GBP^MU{S9fK;T?Za5#G8sH`n4%JFlLC|)%#D{Cu~*5*N-b_5&iTNM0mrEb{8 zZ@nbhl_k!D!d+-Wvo=sT2Kooc6~lbx%F-4yrIp1M86O(bfcdDNkFaK$+br3^0fR~e z1R`5nTiInrV8=N{Y1!7^#_|xvRQPdnuzT0s%R!;Q5O+;7!3GYxwZP8i6ypM3h(9>5 zTN+S-vjKcZKJhE|dRYc@E9=aP?QJUF}=(NEw_ZT*PC!ehS z2+?|GY2b1B=15f5>cV@|t%#TimtMm^@VGfV1epUeE3DM4QiBmIZ9VH&A%!8ANFTx| z1r&|DhHQ$XOrFVF?{2K}_dzVhv7jrst0iR?V16_}EYH`6^q2;j9j!$(ij#F8>XQrK z`nGg*x5?D#T@6mF@|HKhAbOmaoIUWes^Vp)d| z4@z%OuS`zNkwev@+1vH2*QBebTkdJVK`^V;?5IM^xdrVMuB^}K`>$z9myx#aPKh?R zYm%Fh5AgiH?T5UG@n8e)-vLpMxpp_`9IWmWMkbTM)L@Y>ea7AjNJH`LRu z`^1UklG02Icv=m3Znti0Q^5Qr^92ot3i9_fYw3*z5WIMiK*<0jz5yVcPgV`Q(~qs|wig9a7^v~pR7 zC#LB99m}(f!GP1O_Z@G`v92ja?Tl$zk_J4d#A#(^(9KCYZE1q*oQ;GBZqVD~h}kf> z$xY+IiO}ID%1q36_HOturP%_Ec44FedH@>>=(+{meu<4ZB^291<+H4SJxWKMi#F}F z4c)sdJsQw%Ub&_n#sP_GAiQ?@ikyGw5&8PpUt;-$2OL=!biF3Vr{u2w&chF$lI5i} znuZJ<8I&Q#$sRaj(#n>dWo5ZHAu}VwpLo7m-PCQ2B|8Rn_H>0R4ce2 z*Yg07eQ9|`Rx~(ux3#nLi$K-g)g}uXtT2y=45_xZfqM72UO2}X0fJ*uc~BMj70PIo zk+t=89Kc5Kfc4t!+#E|moWo?Ynn4eE7=V40kvK1=gTKQp8ZzCumT|pTQ1UL$F7Rj2 z2?Lb{*|6OS0a7|_kt^*n@&ke3eZNr3i&G<9N}_C)}zX=r#aLrc*DNx%h^ zXeeeB1&|Yqmga-tN*5ZKd3bK1o8>^zEaL(E2ZPR>!OS|aS(z9R|8*Ex$z@U0!uNd_ z?2Mg{CjtO3e!u8Cj)Bm9wN4m7P+JTcmp-J~oPqOrc*_Q<#M|_tVmSp|E^LOg*k_cM z2t1{nJ=1u2k%8bmz*ll(ZH<}B;{3d{wf0CyTZ{bZ=RPZghYrc7Klxet$)ETM`Rdoc zDveD|d}v2UM>GSgV!)f6oR#Cp56jChUsjB&U+NUhpO_ex=B5@}s2$dl6Z8}8|H#x` znVB47u&=3UkWLL~6^-4}&~r>1Bsu;0gqCQV(xRDTi?bAGB)={Kt@>)qj`V!P>=)&yxvK~DSkt6U;Jg7Ui0b(QeF6mE zw$?T(RO~QNm1JXMgZIF)c4@mhd#QE-7a|11Dh+g*om~y4Yf@Di=lMlo%;$Fap5?AH zltFw~QkG|3ZM>*xV`3p|mT(cw6c3pA`+VCM0jx^0|0}YSGUb8P1ah}5I24LmmW22j z%P=!$v~DB_sbLEi1*bt@mW3upM5y?RBSdFD~MeQQ`AeDI`#;mi8{dFj>6Y(atlzP>(sCwiRgEXlyYQR(XLl3jh! zL7CW0Ljq?*Rungzo1P^01^m&|YjEMhC7NtJaP|ym7-O2X4fJ(u7ji?UXO^U=y-9Wp zik&G=m(W0Gu18rm0dSpS5p)P^6+>HQwunHO&lh>_kj(=saz+K2#5(5jV^6g@AkbQNuebJ@Zs~QU@v}( z;c5g7>duF3jE6ieM|P8#M{iVlD4x9G$M1GyMp< z)f)s?j;mlW99r)g3!o*IBZjH$YBvwW&7@{W2vnE{1a8JmQ1-^mnIY8FBq=kqyp@rg zw?{SW>X4o79T}S#lVitE$nc$;^58?~<)a__n7mhm*%!X>1*xq|>hD$WVSfXPS6#h& zRR$0D%e}kzXgrJVBuY3CM$r*%)oczLXUHPQv^j8ZctRQ#5U<6b+BQ-;qD>8Cx*s`q zQc@dRRDOu-`RPA=nD%IQhwn+J22E)BPtAAFFTOXwFvqNEa%z&88X7;* zL|ieqEt%62a(fpvjcv`uVsu%L2BK60F&#MB>qa9JESn#jCRo_;3+*ub8!JIM*!K1I zeGg!@k*W^|C>4mU2?zbEd%qMwY*nm>?05rihC?=Gtu?-qw+wD4P(Vvoz5)eKDx}S89erJ5_zaFW(x|Aa+yU{zE?`U;48z@;rcE zu(&)gXU?9|^6=a8hBrJbmo8mYz5{+aR#wKLw_GJm}Y|6F<-|cisZr`}1!6GO} zv@9K+7?HZ>MtSh`S-Exhj!aF@NLT+c+0=b#YU!4m1iF-K98p48fR#Yf@A!Em2n`2iv~hzV87n z5sm(YS5|Wf8b(FwXJj}*8{9@aoi~_ggV`*<@j=Y2=@0_@8_}3@)Ca&Bq2Rh(y1?_%;hi1%uj~!BE z1Q5?-Q$l|yuN^hSQ;<2sfuJjOi{!D@)z>;Qt}km^qTLvokFxGhNZ5lUNf$CS=THotl8@9 z#Dp|yR}yoW_^@%!rZ9h5tca6K)_L@>^!6Q>ynDctl~H0=ZT*L2XmniGrlz6AEfb2l zq4aCfEU~?JK(e~OVN4!qbZBa6)UsX!$i_C$5tJj4Ss}QzD87XfvK%lFjA}LWjBD_w zrhd^zk9O16p+tGy#2LvFv9aCVjMQmnh*?Nvm))IR648Ap)kd>D%$2U|@29o#u(J&o zM2XD$g1g2AYQBlfxN>I!3K(o8EtXj zfZ=)W^YCvxXdW%!3M@6*&D1$h%6LW4qQM>l`JMmvzZ3$v0fW@K>SxJ)d})BPL)Bb`$G zO|iO3#mjJR7FX9e(uMIP$mC!;Aw*~Fpn~x03fQmdzO-iZfTwiUpio0*WV_HIf@L*{5_ zGb1@|P+%rA4`(C|Qc#VkRB+zYMQ2A#MsyaTi3U3~l=-lni${Xe)z!&vW0wX+aMVC} zMFR#w3&dA=SR(i>X)r#jxErn=ng+f7y}Iy3bzf$rt+_=zk{MZr>o>aDq_T< zB7HX#iOfx2r?6|L9+*4|==%>Gl#u&;`@ROSXvqKjB@Y;cX>8G>&-2)c!@ohFKwyZ) zDip^E>S}E)X@!{B8qeuNj&2`8{IKC1))kD{!68uK`|Kc=t>m2%t>b8!3POlkmYIH( zSjv_&D8eDy#bQN?2LRnftj?fOIN~iR638I%AeLA1BFn;vtS-(;AReNVHLc%bQAgAb z?Kv1hF#!QICuu2$todMKjRr2StZ&QJ+tc#fANf6b>glIRTurAHH_|KvxLB=bDJZ*U zH2dh%2YGyaikU@wd#eVEEd}a_^&yXHIkqA@`nuMxc8OKgQN6SxmXLbw3|@TYWf>W| zBPo6T(9p0XAu^~qnS~n; zt#;gC_^&b^(Ja8YUNDU{;1%ro9LIQ29$@$w8w@n4oljYtvcZEBnP!<6beNl2kCEJp z*SU@*n*y-n3TwllV82AkVPIKB>ue(6MM5EG$z?5hJO~Ve3La;)6PDY}+wn12c_#N9 zwXP>sF9OClt5A$8SrOxaI?Ed0R5KcD8zmeK%DQ&&e&aVjB5!=d8#OywduXJrFA{d$1V?t1vq$K}wG z6H=|8b?np$S=7K=Nar*_G|SP!LCw-8q*d`I=+YiLa$1AkxJ-`?Nwo&QWqoZVUMYk9 zM`dMmU9q@Dvg@OIEFk1U#|x$F`mzRG?W%$cCv3wUK5Nnt!|LP4+-qb%4)QRt@L+<)iR}` zEP6;|5I0sP6s-(NZ+Bx%4z_*0ecu9DQzCHM_bq)VE1HflB@W(tlr$;28_r~O0B4mS zc-(vuUEPZsMM}ji@eRlr1_KdCm2f0_1RLO9`p{wCux#Ey#x-TB4akKHGcX;`H4>Qp zI9?FsaPk;I0i6T;=i8`}#wJtm3{;LA>or?b~@tBbH;UOO$8j%Oj zKg6KFw6vn7W3vX#v`o#;Xh~Ecg=1xTL3(=od5kp*f>$F8(j&Nh<&xaJ_L`P{TXOlU zU)Kz*RziswiJ?c1Kcx6lRu;7kg>=rCb|1sl5jlJQoZP!RB3Ui*4jt~1wdFY;Tbp8B zi_6Ox57Tl`0eo1aWi!&++Qy6-fIdoo>^sQ2C@o>mfot8;($4Z2B9-Xe0vFrRpoNSQ zWhXK>WN{UWZx#IvHS#fifW;5yxSp1wko{iOY%E(a6NKGd8YwP0bGW|niY#wf6a${g zBzf-M5sZ2%9*|21yX9cp*W33kfK|sTKNRFcYswDT{8D*_sO)+zBql-(FcOY)z&J$1 zj^LgJd@zVb(!hMI`o3dUnZA>;tb>6lrW##<32_VwVaJH90q5fwWzZ`*t$m-e(n4@O z>{jkF2?Oy3G0ieCpWQmc=8D`0{#&!D90H@_P*7mS!64&6rhv>0-iMqN@b3p)P!%en zqhGQPC|eKuvnmC`OPWztDV`OJhb5-v*~k9)iOrR@YZG>q<)hz@P@9lUnxG%407)FY6irHkQ|z$>nne zGTM)5hjMyuNdrYdLH52eA`q1J1c%d(U#63=uj{L=l|TXu#E7Q}G>1r-CU ztcc3Nw!gRUTL9AxZFdi_5bjXWw7|^OI?OV__bjO3L8W#R_3^cI3kR6(z`z2T zR>%=c`91)~(dl!v2?isu^#Q&!GB`e1z;|k|zJc-%(8WrRc|{uL`jpIq|7ZN-!JoH)3Ks*FA#Zz*nJTp4*nvlhS?H`Wmdo!!cJN+sMHU=RN#?mf8 zRas$>id9EtE43?In+0=Xs;iW*ed|>XFa_#rfy{{j2D}MJmPu=gxUo$}`|SKAXE;G$ z*w*0o@cBn2r9q}uv8(E;q>PUa$<)Y@ymH~&+Wid6H@@&WEn6$3si{Tko7(j}Y%318 zB_nrkX^ER25@)6xuXX=aS$QBue#UZ&a9_O2|>FI$$S=LjQHDDO~SqkBqu zo|RR_+foYTZ}a=GNi+2ko3sF~*V5Uc=fdN0t*)*xTSmFKgOMT4%FuN!xJ3)o0Nom> zYrx7!0|8vSfDnU2EsnC%gh&dMUnRjhsp6h*Kf!AXb6Eh7u1{1kK3s@N%{Ev`rqi)sl0JUchn0 zgq=suQHlkq5LaF?MF}c&l6tx~=0nM0=Sma~n)xY8%RB&n&y}CzJ9~NyXkhB&VM1d8 zWobmSFUZc!DNYsAfCRO}XfVvof%b6ZkzsbT0(GppBN=H;F{4@r%TPJ+@&WTCy9-6v zw6wL>vkSVlotCt|@3sc0RBBrTL<4zWAbjHCud4@nG%6L9G3jjYp^FpBwf3eaxqSJe zMD@HZX!mk^1D=YVQrFTXk3ROOp7R|!|M*ifJ3UY5rl2+;N;|%OzaYJR-7=-YYHWBy z&OQ3D)abs}H8skuOV?xvbc(iKx?tDT*GrRv?x4g#oNz>e|M{6&>1b=`B7{W;HftcD z*45RrJOniacqL46+qDC^vbe-iBsh3OLZ`aALKc_iHG}Mw$;n9>JaSlrXSD{mMp7-n zi`&(}SY4Ntx#cAoa%h7h#A`$QJ9J7sP-ip)E0p%|u(I2gDZ>^`hKZ^o5s3vO`_8rN zVEgmi_vHe;^Mz-6a{285-5E;`L=BmjA?6!{L3?=NHiSS{%$Hb(5CjKT%eluuUK)I^ za2Ws2yKy1UXc^di-5Kh9QE8mREJZwk4s^ z1GO(9B>zmXGb- zol@W0AjbxeX-3sfEinYEy2fV7|-)Ma#toNCP{ov?QBX*TaR45^a?p}b&ahu zIzA$YdVBRe#0cK!GX-9=Ma`r();4H0hxdhRH-ZGU-f~X%Teq3nSq|l6%qW5R$I1$p zj&bd7q7(%|H(#(BRdir+jjmt5s>jqSi~61jh&77kf%8?;3?BZG6_GGI*uWga8cfS_ zbK>9cK>8(@ox4ei0vav8b-^`Dt(AjqUvJ-+02YfzUJQzL9a+LrfmLs+f~l+8jTT@K zvl7oE1G^ZoSxETyfk=r`1P`)NAp(2co{}@9H8YP8JAA$yQ;Im9d;~WVNduMv6|@Az zJ&d-#%|<$wJ;}9220CPACbQ!#Qax)bko*c21J8_Y@$dxUTR1(#5)@CnQ-Nr}Y>xCS)q?hV~hu>Pn9!nERB4RZL{DJ|7@WoCR_E?>PQ zL-(%8j0S{KKEv5Tz}|oM`9G63?ew86#dTUCrnc-m}feg7DG4tJAEXk`*yAAgR zN_>Pgl&-;8^ni)K&$sVO04o*!ClSBOT3vq8FbTG}g8?^IROAhvNI=`kXa-2ypu}1N z#|V-sS{4-;ysV@%8@140DG5>{{_K^2A~xgbmEFFr(}@kZl}YTFTn;cf{D!GqgsHdh z`(C+SDCUt`VupxP6>M`82{bNPQOlJb4IV*#Adv+kGs)_H!y6J0Gcv+(zzjxEB9DdrDRYG+q*A+ys!F*%X#P}khcW4Ha&`ueg!9kJ0s1DidnyIvRw3x?Yb&_fh z^@=rBRV3x~1Lx%WrPqj$O+#8*vzaOdzFXS5BE^AHp45kv+R)lwURh9wPf zS#4T?01F_0UO(Sx6B)_rqJ-bw+}vR120JzUKFn<^G#EohXH~n6y?uQwpHad>sdi>| zhNDFZZAi>4ttj?YNpoCq`-=Km9M~p8;5(s9M^rBPvX^Fy1vT800n%~`=+IXF>aYIl z0S>m0x9|DI`N?;_vu1a9yRYO{y|Vc%JC8x5FYpEe4y3^de4s$6XxUHEq3HFcIhmQ7 zm18H4&uW1d!YoxJR|}UvLuaAjx4bB%j!PhIzUGZ85^1r5KQ#- zK8kBFgPCxVq*R}yUjdi$`tCo&JWI~3IKXqr1`zG~w0Wc#Kr>oT4z_)}ea{0}OH0-N z7L=SbTJRi0J;+iFKs4Q|X*c&F=3k<-{P+n4&$EjEpocgP|8wELZ4N|4&q*%=1%}Nfcu;z0X$RNI$HQTqX zbXqYK*)t2la5n#hLyoB*q~%zMBSrSvc(`NHN_NAH2WK;)HfE(6TNJwT=)RUT_;fHU z1y{2wQ9+ChWe_GUd-^#QG|<4$tCEd!>fAYw z>zqD$TKBV3jvg75`UX>f7*>$Kt*f1m=e1h0&M&OUng+5C#lh+ncLTY%QcL`-9w#)> zFsu!0GJNLt&NhQK-Ul5?WYNvF4Gge2W(;HF-1TWgp&+){tSqlEBLjtIadClx4?(-F zqeG^rCZ(^lTh=!=Xl4TKGN@Ak;Gfs`3Y1kuB9&%TtLJW8aYK`2wUy7zSV9a|=K0~m zS=lv8@0WGW4wu%p0$p8Qm2$A{+wFTEz*5=5hb-t=`DOx!mI;ALZ{mbu@~lvjg`uCN zH#1gwlwcfob}aT%xl0(dY|Ts=3Qm31cV-?g!z(#iXtxR*wpQBHz~^hEY_RI2cs%O{ zLi{i41P_Vz?&;#2<`}z&Gxlq9Ji8-o_IYP1rTC{1hfqk3o$Yi zN|gI_4Sx@HR{SO)YnwZ?BdgSM3=IR|VF-SkTe~EQ!1V|n$&{WiG&Z2o4?#uDOYZKb z6inZeyQ3p=?turG%_M6Qd(ULyU znj%yvQpAA*R%a8N3$O>6DU=`$M4)_A;|`kv{X zEKBFf$qAP6q~?H_tX~JCMiMS@K{Cmr^2i#JT--Crp0O33E*QVojw~>}sDAe6KmYlH z9Blh``(6ex@2B4Jj?O|l+f)u<_!D+&4CbR?oE$K{apwWhN1#F=qoj(KR~VcQL{07n z0fi-?;3h5XVPGLQDne)OGJ76D3T`y6>tvr5+B4?>0hK{hA0CD&-#VZyRrP0O_ii%o zNp~pFTo?Elvce*5!eXuj)rV_oW3R*Jm+2My9^gTtR6@1}Ur7uYLo(Y+$RZ!+T+#HZ z$|PJnd!A-kIn8`l6*G#+%F2e+R9DKjmTFbWN;-OjQ`MF?Iagmx|~Dx=zYY?X6o9@68A$g|HrBP9(YhX+nbS7)2#^u3ZAFbDb$ z$@Od36bz5bV^2Jx0VvC|42=F-{oH#R$XZ+4iAiNN13l9flBZAgN^omNwr7WBb$MEw z4b$2kt=9}o@vXKtDzf7Gqf5vVPNPa=Q=`;qMg_xKWMRm@5U6Uk!w7Q}l*1ui%x>Sh z#qx4;a!RwXTE)p4xcHqocGNV!G>Z+ys@YK4%euvZ_YSNNcx9i+z@D%rbAG)y&^bjT zLbse8Z2NZmUIs9~rK9d&dy+xEN}S|0X-nTq1mBf~ zK_i})X%mi^SQg3y?~4q1faAHG`(4ZSN=3`wC_t$HF67E;6&7q_Y!c*{<&~TU7)uh* z?AIXJ2bu%2E|4%m>o7gD5Ch(dcIx2$Sf1fSCl2@+9w3y-AX);e%CpH}0n#UPJhw-z z+{5wAdxT`vL{*Iqq6bQ(8bECW0RHAyieNU%rCrUcqEVj@J4b=EWJP&7rdiIy{DywE zo>v9`p?5zwJF6Ybak+ctCAl{-OlciY_j_e^O452Bz_l74nv~l^H>D;~s~KiYnj72X zl?z{23@j*>kvKcKM@}AWlHYsav!rAj9R6(zLw{BacPkO1x`emEI@`lJ2^?b3`~B^R6@uR4oOhNfT;<` zsEWM8^s~b%F9t(}0?}A%|h;0@Mt{d#_X}l3S2$m!|`V89x%7l``>@d19o z?YrYE;s5j@gx-5iWwm59xIpeFlQA7MaHlXciOgboS%XwGNH-v6l=?nLPo0#e+Iks0 zeq1hp^JQXnaPR z^N^d{o0OSGiAR4*-Ji@(T51)Phw5x|bCcqJ5te*S+WqwP*p3_?knyoGo@-!UAh4!1 zfQ@VE46<;4Z?C?eUITE(yfE6!=F)D0ZhJQ*HQ8K-YrHh-ecPmm9?zQMgONnlLH4!J zx9?d7_KQFF(~lR@nSk$nA1UcfS)72WsOoE=gv!yNP?&%=jWqPm%V=PWD(H-{AOseK zCU)*T-<4?|NwAiI1#NcGG3@Cy6n5h~JYpj&A~1R77-k6^w-V)}jXM-@!3|rnWDI*` zLO~KF3oKQ`;gIWO`p$jZxJ zjo=d|ansU#SZkql3_0Zq5J1bBl_}TD zo}PKBWbJTD&_J!i*{m_6(tii2_vFBPw?j1O2!zP{p)v(=u!xm;_|J_5VO+`EqitBm zR&q>z@YDExeE=&oE7@hKYqOnO>zjNq5r`udF@7$F#u0QARTT=#dp2uXV#wk#v3t3- z#%2aCjhT=*qAUJiKNkuYQ7s)~nsG)DNEClU8J%|{Q0rQcDH+|> z{Kk&rPm0m)C}=)2B?HIKNlN#3XDub&+8LbH(hmk^K@H-qnmv8%r)i2=fdH9eYf0H_BTPJ%z>ZY)spdtwR?0YAj@71|UubAZBy7qY=`JS3Q-3mfo+ zjLg{ML9X`L?=VTXBAM(iIY_3Y;cI4q*~~2WC8u3KWS9tu&@BrD%UWjQC?N@bAWIB} zc#Oy^LzNf_Q6U4W3C0pBx*!(hV6vy@Y;8S7qHi|uvm=+*GJ0ccgI%>6E#uIotk57= z(2fU`P(hr9C*<77jKmX3Ijva}jxW8lDL3xil9_vV71R2r%*@YI>uY*+PGWh*(sBg` z%E#aEti<*FbPo*3l}i^Tx1EvWr%ou|m69B>%7|>PZAwhfLsL_;%*@Qn`Sa%`r29Xm zUC)iBC3)AoUZh=GO>LDdF0669sZ!4Y%jWGZ&TK9%FH`XY_rkiCmk|x1jf$5c3-0Xf zF$zXYEAhmg-EERyS2eIfi39wvoMv6%mt{4(D`**+%kAhT44L~8yg2E9Af$MdTt}HV zsF{cIvytHBB$%{)}Qm9NTb%*$65z*uL*E#J5KLoZA}zf|zZ zy($x1(E$yIqSP$&d}D^=n5f-e@*Gs?Q>zZDpq6X?6*)Ha! z_t*(ZZ)%yV`%uiJDnV?grPSf$JtFM;<-G|Ih(dTQ5`Zc=OSPV<# z^5r2L>1JF5d-ovkL*MQrF!?k2owyuq`+ECc1Tc+B;eQnH3T$nIv*mlHf6vUu$;(g* zS|7l0&?p8d-O50Hh}lt?4=pgQoErjWy6>BgeZGiXfV$7dG%dOkk|fcH1PcLE2gK&& zbjt2CxSZR(A(PC*wTQyA(s`$>e5W+=!xU9y|KYE`P%hsy1!fU z&6h98&g!yEj!ntR@J+e+^2>BcN@(XVr6uC727-o$T9R9@UA~}MAoRET*$LcSTUYF@ zQYw?p(xi=p>8Tmb)UL5Z*wor8p(vU#p0v03$oAHb#H%W~K;gVYzaFDQ2)yeW^l`nH zH4{U37k-fFM8a_#kOGuxL6XgBc9l>p4cQoi7n&2}qoee_Tv=S!Af)9q4Lf$tumEFg zii<%R7a4lUcjpvv0PqW_pirjC+~Cc%3R-8$yc}%%dJD;Sd3*o+Uu@XfSv_p|gcWff zd03%6FFphkU^UchfZe1VI#IYv=%jL6*L0h8{5g&61=IJj(lS{6rMbCf4Kg)+A9zDz{2)w)29dWs|EzrK z)1Q&_^sqem)+z~=!gB2BVR}S9_r^C%T0gg`H6s=EEmGGbl7hlRJS_7oGt%AL&!7MT z?D1o#JemTAp{YdgG1RF2C)&e zhKR{kgVNzq53gWChM-P>#jmk2Uo>~;QqVe#5q;3cCMPJDT!hafvOH#8Mh`*wjBB}s zaUj^ImCG12<_&6D7t`PJ=(MxP1@oL+v?JytP{Rcr8AXjY1Zp&+LEr>7mfFoo94vp$ zh&ETYWNl?bJBtO|mE|>JPPhk>wMj{6;HBzm&etH6Cx@%5DnUXlO2cHLiiF=*-A~Bubab>c z8^htRYK8?HIoPh@?~e8kE)E#h^VqS<_?NS_bA zZWi3_wm`!tNCj7nmsN%hNzUu+ZFBSel-gCBOWU%{AWYDLwLfI0H04r8r zP#@@%m}k44#7{Td7mJ4&yhvSeZSatD1Tu?wXgPtwA7PukSacjjbT%O+tU&-bEy#*A z&Om3KviJelRkZiaGutyeHMnF${Q`c5pkt8k04*`k$+LI?H?l-!MyX6x%h0GvN*K0RP*%qFU5l3gDoR<<3hEWBs~aGb(2Z$c zORtPJGtiOTQH*g$15qMbEj5kR)CH@mOt1m)#Iw)HwTqW!e0oY&r{}1%f9U9OX}~Px zgO5v2qvit-Kg^lULq|^O`Ho6nqx`Mw*QNj1Q8|9}q}&~!kh$S;Y3=Qll4f};GYa_Y zL!Zy4C70jSz*;MLRBZ*zCZWHE>Cw=uE-~6Yqy}_T*Df$+W()7jk+W}G$WGJa&&oVMON0AWp#6%lLMdr%%|loKlE-odVAV1fl9>Gs1Q!O- zBamG;X;T4&Tm-ECo?Zp;=d~l*$&TgCn>QHvrzR$)sjh(m@YwNV8cYks!F&y@1qJf6 zX=}8=*Av%>{g5K{DHx#wxL2@}m8@5SrqQBiewy`G%fYs zpUFlqW*m4f_vM?tB0F;IECy|CCtq+Zc48R;;uVyE=HRw4c!iu*JXIesz^z#na3@Ie zP>mJAhklMB>ty;lCyNtemXa&$sVt0Q0@z&jEV~k_u3AI`&c8 zobkbR?i!Se2}Z2zhMgj-JNn0nf+|Y3n zOg?yDo?8_7Et`>y>-{l1J%PpKU=DJhZ{Mu|=Ka*W-`2Oavsp>KEw4moI4#i#N|%T$ z1(|7O*!iQUqYGTnV=pVL68uJYl8kvV;;LsDMOp5~Og@~kM#*HVIVMDG!)7BT6m$VB zbYJukWCu_dJQGkfj+jYJ!>A&UeREti;6jjzMtk4$EvSUSu;1gWDaNH4*0f?m(Rjp} zNPw_f!BH3tMVCuT$V_K)CQ)rN*dDvC1>fiy2Ab|W#bxnows%mN#s2`T6o_vIA7I|%{ZfdY7X165Km{c5VOwK>{v~;vK zYDcqH9)J1?+06Qy3Dq$`*EcoN_H1l)ShKtuY42>6?)Fx>@akpR-CC2LzClT9XArX1 z1r6kw=gh&FRjzRO?t+SmNu#PB;?Bjl=BH01K~3j0vr2Fhfa+^8?Np zjBBwVVNMfQ3B%sN#}E{!#wTfv3)2z|!ec-^pLf2Zo{-=QqBJW+oLdAf-1r`eDn=p> zI!AV>pJ?y`kF2()O5eBoz?plWZ{Mu|<~KDZ|DRzJq)crUHxq`J#mz5*!(`f66^=FU z8>Qhcfi5I z!%0MJFIc!>2ge}{W$Vu{gj^Okq;;C^H%C(-NC>8SG~rhLB6Z&96;r}IANWRO;TH>z zq*|bUKZO&;&D}ZwOJac7e~ca}P8J9S_pmPie>kz_><|+L>ua0(kj2TgN9l@Es3H+( zP=KcW=7sCcIipwe9G&emjn*7Q9?6iF0 zb6-+?s+tBOX$9HWH+Hq#*RGi~bj^14HR~E|kBZ`kTQ(F5_f4`>7K^Z(WNXxZY%;AUVJ^RSU)2>sE(XAr!$%0d3 zHMJ7E{`O^wrRkCe`b;5vP(tqW?Ymb(76b1TaoSsffRruC;HnK?l2If=e89s_zl*pM zI(km_B;d?7@V}^LJDHqeAyf|#XUFC;B-(PZOtCQ~JQ$X(nd)XB6m*6TraTdL8e;@T zTnUOY&_wc$CxrJ$!vR?ib|UQT&&uT65OFtaI6zVdKU-g#=kGDY;8=_iZt?jcC{Q?8 zA`8&M_hpG&vJyL&&HZ^Du)WQ5G0i=k!1W?=2C){+kPtY~EJ$`NBB0 zvc^V7}Y;Qn(OOiLP7fe?pA4P@6t@|F z94W=Zpf6Tgm83EVoUU=cZr;8vgU3!vQ+*=`t;3#arBzoaxnLo1!vhjji6!lh;+!KB z1BM0&pbn-V;RvraxPbMVEiPzwg+X)>b0Ia|(%Pn(XSAzsxuXCBK4T_^WCGDdm^GmA|#S9~w48gKWMqp1*EZ_okkb~ACr>*as zJhqel!G8RY@r%Rdz8gixLg1TTKJcx^I=FGK((@6Ngs|>Abny|GAv2BhvazuthXxPJ z%Ica_X`n0WvA1{iNlMGjQx7~Kw>1dC==SFI8*=mN6cIglixom|Eu)wkJ_Gt}CY@7q;)ZS-quklWf7dK!vh_0st^F}^U(c*YzoGUocRWR z55cND7g_Ffl?`gio_8~jHt-#Aa>5}7u#i)t2vG07U<`1l#a~vy2)MByiX{3LG>hzT zhWHwkNGLIpNhTD)U(i5;tjFYl^gW^6P%x~E-jK-1sFYD~BM_z*8w!_8%@Dhg@;c2k z5hvFe2<~b9OZjj80(_}Tm}At{kn~#%vkb-Jiu$=R=)xCsoL0DU`HCbp7z~Zv6R^_K zYfCaSbdz(1=N@@Va;Z(}J$yvEH2`%E3}`S(>3b$=GLqJSw>-a~UBM2isfx<-;X zJJR3VPff3C#iq8`mt;*#z>%>@X;ykjst?{wR+>R>qt+9-s`UT!P6A?cYJ)$6&X+3LZzzqjvn0OLKdTP(cC9H@O} zEyQ=kf|-rb1elFgf?&yP1tiZ1g9FBg3dORfy*Pko;5*35%3A#lss#%il>G@Zs|sj^0Yh8t zF97{z1@Pe@jZ%mjXHb-l8|$3E7qJo*WhKlnY*fffN4y6b1l0d3U!1aw4sg6uv3z>n zP`a?>snOC61kaQP5)5b;Fb1XXTg>@vL_jtNpL68s5pt_)s}d9kym94{^qzW9>J`M_ z+}I&7fAij`+`TiTL2a7jI4S*;&1INT#v=&^`IrLc<65#E9_Z2FtoWLig$RrldM@Cg zjnZ*T16gHtr7UVDh6@7z7cA0nAHbvo3kf-2nhjP%RaWnnHf;((9}M`@+R6%#3D*}2 z7Hx`op@WP2rN6I#uZ)L3fXRfH^mP+5NrrwW-I_e-^N9OnSIbs#))36`*?YL6IlH)t zhmvcKc(SD3&p@a`-~WJ#zu&j-cn0=2fBFOGAth6EA)>5w3K?Z)N+sX%r~=wT-{IGE zXhvxzVOy0eE8R_HVt@4OEAx4retCgeQ*1B&#{+KUR~z>MDYWc}O?3)%I3ZQzm4l*F zdys(ByB9VLApeZuQ!H5!1MWt>e0_M~9=j%vUS zyKyK923!YL_c3AsJ+dW~(UvjV{udqptlWJpXImm=F#o>E2Oh+H76AP+4NnjZs;VkD zPgqxzG_zgJ!azZQv@~W1Y50-aR!pjn^30nHvsy-GwSD2!Kkk>&;jm|6N ztzk|Jry(e16sHG`~dw?z&m zXumcZrte$>Z}315Y@cu6=>X=(D?IMOXhH4- z2ac=!>+IOLmze*AVQa=+Q zZ8PxQ&Ye3ex3$ZPjI+op(Lj6nUjiG1p|H=%3zO;&I-Iq<;l3&A_cG8=(_jiq0BBt$vr#K&dJI^el>*cdW0$jxBL&D0@{L!)%*mKw8c;#eKz8N0V+?fU zkA-AcyKe}*=(v^fwurtKgVbm)AUgvFwUaB#&ej^sEribqMpnvmmKZC7WD7hX_4C3m z%PKR*@j9^0nMHzT;j)AB=BlB+Y?H?eV-Y={s|vU`=!3kpw8`@ezeG?yve+NZzB0Q; z2t~}jclWNm^4e>1`pj7>nl8@GNksSO0O%Jf}xK^03A?>G-8&tMzOA`xfuqwMGbPmDoGL1 zZYS*8LJ_;-R185T?s?{9uID)KO3w0qaewofT^CtqhN%6I>vgd0@9jGoz`UP)-}_GH zcG4lww>H0T{b`ex$>%xu7k9(WR46SPu7e?MW-^|!@A2RuP*|riN~O(6EXMDZO2s`H zo-&hPocCkNS){?K2MQ1nM+9gtPGdf}XWXGTHg)N(p>Dyi>^xK=&@Uw$OTsK4;s$lX zJdY0>LS(@=31>VYAq~i*6Vv*683~j;W_2`;2;7&3f%_3hq|j8rI|Ks`12b|hP8G`T zkoP~7kpDk6^71iguIFq`0rZCYIC*B3l`#uE8X%HdCML8?2@S0Zg>x{P^Y9ao$=Cku z^D;d(POL7W<>sSrcwWXwMx`ay?ft=*6J-*w~mh5c=f$m8%SjASok=Bf}ik;{eAl z;5dIVy*9MI%WH=-=*o5f{#i7L!?fLSJy%y3q?p>09LUyaH6LvIdizcWFu%UB>X$HC zR&?%TWg@wm)tYhxz-s{8xQlGgu>}1-g7=_R*leS5!#J?5D{~b3Sx|Gp9G(6gPDCXe zq~uKpIbwE|f+i{m7I>gwHf3b^GY*tkTA49M$qY>cWd?p=Pw5pxhUM(Xx|;rK;S@7Sko*8zY9X?NB-+?%3I(4 zKI!i0kep^KFMZ=1vc0h^bqx(#o;Ay(FTO>#mKUX6Gc*L-WNnkI%q=O7wIx0M1G1n1 ze{WBh%qr%URQ$^;24rmFsx-%|q*j9n7Oc1i(AKsliF#4eXb{98)1A`K%j7c()Q4%h z8`9T;u0ejD9{a#R9|JQ+i-6?;#2?jQg%S}9-00Y-^!N93%m|qrGBRZN-JM;W{k(PS zwj4ixT+gq#W{A(mg3VyYD9L2=sqQqo^Up>SuuT0stytMsDx<%rrGGFQk%MhtZ{N`p zvXtKaVe#`^=}IMMQX8^SpAdovx`htV7RS?pF@^KnAYl|TJ4Rs$I6`WMH&>MRl2Ii* z7kD@z4EzY(9{rsxC8uo|ycn=R6$kD_91fv@_8pD`P5b|N5{Z}1zs9Q ziZlS_w2K&w*hIlztg;cv^1tq%Y|lEpc?U?Rck;x;5d5pO#KJj3xdpJkwz`HAG_Bfw zJaVL;i^FSLO2%sH>_7@0s_=Gxojt$7@oqOVi!rOAN?d$D3 z7Qp`J_rK>zI#Udn0+uOII<9noG>1e^+(0GEY*6M{;pVa2Do~jrs@a=Iy(xCuBI3Piy*&%iw$m0_T|J0UzV=w}}Pw;V{Bzk#<^`A!Mu~V?1v-N6GPkFz%#X zHls?!TvH%OtP6Nb37s|Q_=imb8chfgaeDI2+zERT-Lr$6>l>FVm0%}h?ZdwXPi zSFceZuK_hGAi>N{&q;Gzr-aZ+t*DjPUU@}o8yd;(N6@Xnd2!_83GF6U=`lkP5f~UU zEJ#MzY4_95d$Oq+6lo~|sJ=pkF-6)$Q&YX%)GVs4t&NQb96v^$z`h4NAM(?{xNZ;K zlkVqu(6gL5)C$usG0gA2;Hy>+2EATNfw&TErm zWno6nJ^VP{_khT{&$sVb083O={A@6gqvUhBVMbp@Cm+MI4a3L2d=I zh1pC!2N3c@Fb2kFRFWW1J%TpCe&1QEmHe!hRw2Gexns)t&DTL;4jp5L#s4^Shz_JD zyBd6`SEk1b_I*lJ z3q$3|Xmfh<>l^A=K2kM8zYoesHlJc}qbH=E15hR!wE=)k6n>gu)kFAkQ@f9tjYKwf zZ)k{PMCf1ww;Rxg0y>K)wOm|R{0#TQw02A@>XOpf)Z)s=0LE}-rzW!cJqtG zJDlo-iTzpEup(YbLTS)(ywIVGgySs9O3om*JQVFa0Yq%zX2F~kcz7USbO_VSH(Ro> zGs(5j4ile4W<~8MGV>!W1B1wr6oI`X**H+gU)M2PGJ~b~*?X8-n3@b*Imq(v^nq~3s=B~_4Ov;VR z7v-@>pOmYwT#{oN80s{;0>uFVKBt}7mc~}io^ocbx zQp?WKS(0}XiE5U}3v&xBX}7jhEC&%GZ?mRF%%|t_50uvLR|uZ z4h;xoWM~3G1QGWF%1h|@kK7%SYCYy_uU(Qs#phZYnq_+{MKutLcS9XoUsnp)1cc|z zI%u$t$p)-&fI1*{23n5pYXY`xsag{TdizcUFz>||VcfCNhCAkd=gi4H z7xR2j=&G$ZAp%*!jS7L4Z|>G%mVNHm^z|hI;K;ZzN`ydw9HsnVV>7`z>ty1AK)}Q6 z(J4ew@F^dhHz7pNW*n&z<${Rsx}?P8MA)&!9A*IJqT{a_snk|%>`zRC0b|+ z9edOJEOPo(FyNIqJdHq{mX@{#QZmr=sMSCMg$zh2H@DQwx4-q0Jn`%sWnto)yz<%| z$!u>)>p-{ECqmM5_6g14w&l!YPsyc=UzgpjZ8ilUMO{%}E!SWBww9GU^3Y?C%I#a1 zrM+)ZCWkIdwRR-a+Xa~%zb6A{9%Lh6ZhDGi5PgG(Y@yJ7otmDevg*p}3Ktd-Z^LfL zdUa)m#wNXe-6X!&Dc*(GA`?TVg=`nLYIknmF%=69(vZpNIn)R9SvjWI7cw@;{Zu6@ z^_s+Kz~Z~>N@zf@P2MlEQ;Xg&Ol-Y?+3XcUMQW@eLz@~I5d|S6UR5E>8`}o~Y@cu6 zi2&yJHYR`ECt1|^TLGu9MfQ2g1o$W~6SaQ>yhSiU*;pRpju1l$x|Vj3k2Fb%rJ|!x zSUH6thLRA>{(vX0a~N_Nm&c3)vv3HQ2#y5ki?74uoVtaLDg|7}(I?HJobiM;UX=MhQ%7jQk;!|8FM z(N!ke1{}c>4|aK9uzBVEz$~Skf#jruP#B2VUTQnb%yC;YD(n}WueX6O?PMgccoy)X zx4z{?Sz4Hv%NJjhcfae0*hS22?#Smp{{`7z7$c`Fr`gB3hh9)DXhQ0%DrpY8zPuub zj-Sy^U%fQ6wn%BGAbA9k{-ZLl*jP5NfwQ$+lfsPRU*po#-NR1e(()2Vz)&ti>uXLw z8zvk$Ct1zv05^axf$I!AIRv4WRuENlvb?;;;Dtrx>eZ_ZKrLEE;%{JLSTJDHfyJS+ zA|l(0^My5ohD-lD&-%XSvW#$LcRrFUlM;<5C6oMugCLLKhG>emb4qBa9M{D_SXPAi6mqVGD8A(aGds zE>W|n5ZUwr_Zc}dyKxM_Q}6)N+Yv+P(SS^jj8nN3v;&kXAmZY01TyP*1sR;-6jBgV zpD1g90n9G4l!k+Jft;mqIP~X>WXPH?7`*_vm8oHR6yyWW z0syy+O(E0b!&fZsDKB`A4~6$Dnc<(CQH&DP2srG>hP{Ps?qJZTvk-vvkGPlToLH;W2ykk7U7V~ z9*eFsR_?h9$7BLdzPOxeuPw-fDN90@F7WUEHl#`ot~6y*GJ{#i8Bl+hy$a;qs#z7kw_@sh0G8DeSJec zuk)w|GJx_`ikDSYBuxWO52j7CsxmatrnnmL(u!z>q*G~PhfsoD)=UmuFkJs@SFaP$ zUs+p}{()Yp(*^((GZq%+c%MPTzXFS+Ck9n01QCxV^q!29`{%nfniL&ed#H@~VM_39 zu7dR+m7VPk8P@%c1|tWO())b-YiD5VKlj6LDs#19oxlNQkW^7dk?R#;w-9Z11h#^s zL!iK_uCh5k1TPdr6%|^#y{0O1_qRPvkJ;% z10Suww^y;l3OBt_kR9Nax_{6tgXA?-c!!3Eq)LM(tmSrh(wuz+=@~LPcrBD#Pn|g> z6WVk*bNVdB3?ng5mJ}bmb?cVYH8;>z2%7pZi9zY_!*3yMLY6ETJp=QtN-zuz_I457 zFC62c!6Ul=IcY^_w7%*f1Ka1@UpIjH5sCjZlH7e`#!JbZfbak!S7;NBp?d_~*N&-RmfJdniVcksbjBiR2#LF}wAcr-8L`Wq=8HxZG z3_G@cNzAd^H?ce%H?ob0D=mSgf%sK)>~H|i$OQL-_Mbo1Vr+cd_duXb6)8zt@u-@* zq%5v%(yk3s%XmF7sFs#CKG2Un{+LXSO-M@1x1@F$-~OSW(=xD07nfa{-!8AM%k9w- z$!|}|SHJKj>1>C-eMGx_mBf;o8yn=xwHtEt`gM8#kG@|P)>oxjn-~Sn*5Z1+)k*uh zK|6ua-dfw(klwCt2AR3}ISr&~sjE)P()=O`$2fn;g0U!p3%0bhB27&#B(qj2_6AAo z#->IB_$aaaGyr0t8^#?dV_$mdTg>9t*SF-z;Ug@Ow-xsbL_)@+bC3cQNI;TB*OJq+ zMYA}*KW}PXhLSE2$fPg6_L}R8C#951SINP)ueZN;2A0}Lo%MW&(V#Qt24KtD?+5}6 zIG!1tqAOM^nqmV=Ev}3%cp3XX;7Z7_)5H(5l*{MM|1qMa0KNU3jT!)K%)af>H}G$~ zhi_8Nnar-_6xc7iAcriAe+Ml{a3l!K_ma&!k`I)3r6g2E3nuZ5K#EKZSxrPsLg->u zBx_{&))g%m<0g;85hJ2pTCRl211nN^G03dYV<%LMh9TuyP79s@{TUjIr9DO3Krrxs zyIB8YV8eNcSH!r_Rh4nYv0^-L(B%S{j=95=M~}*6f8NpU%+01B=qNYu60t^o_)P>eNZz8;AQ2u{2#!ye_R-8y1IjuE+(9 zyg$8HlKL6APbjk!`19wkJmvsAY<_lD2KD%K#gfHUU~z#1BI`ci{#pU-XFl{JNBuy- zD>KR|S{MxOY0?wa^)2fGuLl_z0tD>8Jc9i`WoyW=4_n|vxxpY%mc3!7QeuDz(nuq3 z4Ec~{UQkvwwbB4v)2@Qp)^7ncQKACi$+&pPz92_aqd^v$@ts;0e)=!v5CiFM(e z&dtpcI|W|2y`7>4J{FRy>MAp~)hw|^GfK=%LS`DYn*MgYjmT5fBJhlxaUTRf^42NCTppi*527AVcnmKAiT#9w*9>QwE|dm zMf?{$KYxF&%)J|jW1$Jf>`B;V0+1bWjQnzG=Q%?T+^`5Nb&7xBre((B$=>@Kf6C*7 zO0x_oyh1L8`XnwJb*Ke|m0KqEMU&*-8&Q%bEcNHW$b_Ll(;586;JNK^$b%fPEG+ry>cJ zKDkhAcu?-xvBS!aIWEIQDPA5%CZ&T{f~W2 ze&&NeN)55sF1!rOFlH~)3+wz{EHFKaF+r00)VT+>LpiMP(Ws4qIjPr|;5HRv=_9ksoqjR9hQenGJ}EfKYJ#Vt}* zm1L%bKn;Q`{>CtWds`bbNRWczEs4?(SvvwT77mp1iwg@fIx@oFLsr(>(XPi?D~*kH z97lpv6nJo9En{J#;_H3Y(9%MfG2&)$%UYJqzdW0P#Jzgs=1pyMG|Ii(cQkL8Oq@PaHb{tyGxtcaRl1+%dtS1J~x2A4g+1!g6{mas0y zb+v>chIu{S*DKHKgC3@dM}}QR4t_fY3j8j*g?Ly%aX|J%{uzUT*|qsLII_p|&u8;e zmY^slzG?NUH?K>J29-_i2xj!p{M@7*KXyg~%8CrnOv;IYLCQkHn4`A2Md}pSLQ`gFa#(6L z8`{v4uuU_k=H@0Y0Mi=O(3!^g6oL_g&5CARDDR*wap%rm(jM?ybQ6(T&1oY5K@94x z2vAUHMTZ(0TD1cIxR)?=KQl8;7JijxehDp~5%4M^VP=QW-Dh{&Es7zIk(qBKRZK8q z?)#i0MRwhBq)$ufghZ0{89CVY_4Zc|VDEm*TRO74=_KS-q#Q`dt~cBV*;T}Gy2`{% zQyVRDH7^GWQ)tbx41jsD`GhlDDmCQ&1|Z{N~vAxyjl zZrwpg%BABFr7nC1J@Unz2VnuFts8j9=b^i464nJOOOOKLGS6Vpf-g4DJ#b}vx`1^~ z_%oQDFd*uKpG|Lb&>Rmvg4*EWLp+WxEe{`m@=1Q)s+NIw@7$99;|~dj3NBr~EGr9( za{A#%W%BL~Y1e>LT^ZHRWFMLMjr9$bEb3}$mg}0O>}ZB}`ow9;?xrNJ7+6sk7jz2q zyPFbkZIZwi7LdF)78+$l8v}50LLi4M^ycQ4EG#baTror9X)00U>-dS|+PPdHO@$`6 z8q^?%gX@Lz5xy#>Gt0}dIAOEI%8WJlOWz_E!#I9W4z%kMc3-hLT}$fvhM9 zIR%W{M8oVzhGRAlh+u@EQy#2F#zI%?py6f+cxHGe%%aR2GQ{9P$DlyS%|r%R`k5S< z1*)>%R++mMb=)xDY0RUfpz~4DO2Ts4NGK^-#+Tfw0A>f-8$> zA7+;O`|Nvr0S#k(JKH@@pE@>P*D%v!&HNsaRrW>$znYm}21^(y0dxE?4KX@3W;G!3+sdVV2B2+9gv zxKU1SZ|+df3_%2nvfzOM z5b|8=3J9X)Kuat>zHj*FFAFZq}iHDJZgKb}Lf8_vH@CrYH`T?aG$^v)| z+B^D2ObkI8HDXT4UWubO*l+_^SHUbb!y)Ruksq4|bV~I;2d`0HQl$cRSSSm90M;fM zQ!3@1uV0wuCAx+_v!gHrgyBY33Nm0i3w!8O$)4uC7_jTK$$Y26T6D9Tcxdqeq1@%@ z5xgcrp4C6ob4yy++UzCXh@?q<@R;WnZCDuJ$9u&T2*;e|{egBjSx_o>BYj8C^*H7d z3Y4K2N1YJa8vtiW3m6vWIUEN8OS55OZwSy~XS7@89EdV`Gatd#?(XiCkOsSNe*RCi ztnB32*0ctMik(db^A{wiS=7;oo{~2|{{{xx){YKIZEfm9?aPtDBUZN<~7VNWM!vVu~v7UWnxPXO}=6vSUrObv|%1T~-P8dqgTG0D}XWjXV}IhygJ zR7`6J+6$R%j+v_jjI!dJiV|H*Nny!IYiBo`2+d6`Qlt0iM#(>*QS9^WuN1)E_x5Mo zi|I@ovIc8F`mTd#;)E!_&;n!v6LBpc?`jhxy4Scc6J2jFI6-BV<)G)3R>Kizw(2^RV#f#Yyu<*VWv0e& z@9BQozPZZLR4DfFulwa?N&^7omLZ)}R=q&Rvc85tYYYxF#u%SqKzRA(mnEv*-;rBa zrJ=Q5o_g;GB&CP9y)ZAyWV?*djLP-vH%SvoYe|0V;$=Dg$Z6eAU+U|s<;LxsQkAS? z3AeB~Ln_3PlSky<&ASBsyZQzs8c)z=dwq4uKy|%XNz zbt?{sxk=C}@)$AG>ul)wF?|f_ z0`0wSGy{&)0KSXGtd<1{a{_WDpZP#m(s_tnA$lhUnL$z2G!!Prly@MuFeuu5qKy&R z?^)0bx=y0-^JrHFQ&{Rn#r8@>l4XN|z1c(F)WEb{wpb_@_RK-Bah=9El6DIVxX}YP zTM0TkcwGoeRf^3d75}=WohrEMlmjx7sj#CXx!}BM z7KDt1R1|npx`n{huB`)089vV(xh;V#ne!9X_%ulB1ByUdc4$ISfuv52;zc+QFgfY! z?U4%2%BmH&s%>eN`i7*8j*iK-m%b{U?Y%Ojpnlh2ANA!2Pn=@uA6Hxn0*Ao-ZfT~q zw6Y|}2ai+BUc;_5G0lGWgBo(R5lc6Jhg zPhe1AgCl4bkOl%(VtHlR78ngYAPpnCf}t&jx)HR7hlaFVt&+RLLz1km*AjAEgI=#@ zWc@5R;R?R8x=i_MWTllXrz3VPOBSqf{y7ur?paPX=rt~63R0hJq`6Gr;Q>8I4HBz3 z7$w^8+g~Yw`QgG(V;L(lD{!KPL1URyNmW-tPlE$^S(Gm+6bSM{DI!8QpRf}zM4&0` zWh`W=YY9|zFm)*8vMhdT*<~h6rnQxKMKfc-yd?>=zVrCAU<7M>lsbWu0q1!HGVp@J z7HBLB@b}6`le`HKn~TRPNyUr` zAzMU11_3rid7%6rR!0&oN>kle?W@WT+38WEmUzMY8I~`v(|~`K6$q=_S?5_%aOx}Wl@3hrTJx9m|K(%#hi{m@R)2b&dLXV=5NX? zFTErS)0#DHEO2PLGU~Iru%N$F)N5CxUBX%ILhf#?N>}HAY^B!4uL?+Nah;{}&ib-8 z5;BSrdeWi6EUp<9J|FwFtw9e%;qZAxN3mS4W4sHUPXu~sePwobrJ=5#PDD5c%vARD zbhC^EFn|7`N3`tRm8ahHERPcu4J;zpu3u+X-PYD=S#Q9uMbI-sbiU{mfP*FzZbSWc z%~1nD?`=ba?Sf`>!2}4g={h;s_VxCc4Pf3g&pZ=Kr!$948m34hW|=@r9W96d1R@AZ z_uZsfHs}LTaG8pA{bI(r_lrgV6~iP<-q*}g(HJoEQ6ct(6*cEdh+r`4@S~D@zlbY2 z4QB!dlqo-c5lo|THuWzryeYJ=hYq%snt&-kPP-6<|0y+th4#b z8VE@SIgHK$dPpAO1}z#757|F9T=&#YPFD4O(C}#MAC&dEHEC*Y>6U|SUvGce0OlX* zZu=3R63(8~OZJu1d;11-(NWprN&1CYcfx=4`O>MhXy8o$bz%y zIrR(32o>#kiLL4HZtQ3VL+yP8;Z&f>g$YPMu zV*kOXDk;WTspnxxOEBnp0SKR*pVQ1`RstGao_za{NM~!k1S@M~RXdI&$UwB|Qq=6R zB7stGTQ*lWM4;@T8PLZ3qINHb6(g&s`f7c1hs)8}n+8o?9WpaDrVRnbwGJPW zt&I)iiX}BTY4#?`Ad z%LQ2PV={vobXJZZKgwf{C^iXc>m5CpaXpvOaD`M=>LM4l`?REizTnDoJ$ss27Fk+j z%N0^`?$L)RYB)YVB8}aRvbmmWl!I+wZ-40$G8zj0eRHvPnE|jVy%DHDp*Ia47_hW~ zYr(V>Hzz<@aRVGExvU#ypf}1NA010XAz$`PJOF4%!*OO|#_K9_C8cE;)LWehBKT8Q z4jR>>i~*HFb9@#y6Ftm0Mt;HYFW+>*5WH+fHezdtiV{JVpeR?N^G^H;TsM8N@7}vh zzsRDK;lZCU?b6IEk}gTCQ8bY0_igpJj;JSYnA{8Ok!RT~@IBhIp`;ADW&q~%V9$oR zPITnTqea-ekeDHEBw(3X7VLj?cr|;ec3Br18YutJp+sjBfop7NSkhX)9X)lH2Ci*g zof>==DJ5OlUX{t4H>F>HCWW-b^!%fAoL`)mosDfdeEJOM3Tqnc$mOci!wh>Bvao_q z;*RtU9F-*vT%ML;s~bCtAth+|0ZlK=FK+E@anxvCvo`SXfYFhRs%h)KRu_)8wsyJ^ojQF=;(AZ@Xcx7zGRZO!rXL$CYch2AE=3ui|L`v= zUZx99O+8J0L7fPdJQ|c3gTin|v%8DPvL4T-mcf&g(^9LM+t$juE>h8EIoS5~_LmA^ zANarrYB#r6Pm$hlb;E*Q9#JZQ4RRarXPkg$7UX&9 z!yj^ED|lcq`^gM6Xt*92=r+V{qJGE%n3=hN>N_trK=TMsfwDx8lNmBO9p6TcJOlZ| zPF)tqiok^z;yk0NK{FM7fB}jR9v+nAM~}e8A_E{#etTav+3CuM1ALGOb)4Vs?x zb~Nkx@aO{y+C^7)7xn2Q(GXexL6;44AYZS0@8BS(FqSsgxbNt!u50-T^$`$qH#awA zdU{&#iL7E>m$@j;Xh-wTo!gpeXINf#YUX$9%xPYm&dy%SVpr*VmIw9WrBZMsS^?i& zqXLe&ytT6}4?J>C!q9cAuGPh}S{L9*iyUnGdizTSu*Qmt57~gePp~-{ikiR@SUQhti^vet|d*sZfzGh)@fn!P-Pr~%WAq^74L!q z$DW|lL~TQ-OkKYvsm!(pjUD;K$No?f)f)72MX9c=m94c^vSrczgG14TW+*4MOE)?? zuKzAdfB$jm>1&s{$r;UnmZi13O@aJH3B;;pVQNB-9y=@B3fyBzx7 z2YoQ^i_V@A?}yG_*d(dTIGT;#fXa|16CUqPoJ5Sa5prcHO3d;&QJE*i5hpYqoQw@= z6)x*3>wwv21lJHHz<(NSfJnM+kmr_3;xf2>2 zWlk7WDIhEuabk~bIAHeEcf;fGbHpePjBOFfC^BRcFXayGUh3sKl*q=yWi<^SG!&Z? zCC*bUa5@14-4(jeLH(?XB*tvEwM1)@x4!)y^2h(>Hx!>5)VI@YusW^){{vE2(nN&vk}f%d88b$RH#;za>H2Z~Fst*522tyLn}b1mz) zSC&XrMzG$|%%(}Zh)MnY+joa#Vs@U*6`VKhbF!v}T3+yZ?CfY~K&f_06j+Q9$iO4q z+1*kcEGF&k?eyYo>T2igBh)HDp}3_TR!m^fCp2G@_C$_){%{&1l|s*6K@Xe z!Y;TejV#YCOJ9GF-WxgT>^~ye)Q)0jp|~7u`+EC}1~Bi%XP#-uX47q65#>sh7#Iv* z%NYi49($$fv}5)V;)N(3bGuoVV$iLkK73HzXpgu#MF<9lX(kI?tdK9UTji6(CB(OY zQ{{36n&0|+V>G6y8RnQy&N&?golu>}P8V)g0Qd-sA;;4a>VH|VDmsoBPljW_mpFWl z_YT_U>1(5)SZFXt1`^j2mRj~jp`5YjnPfJy&9d<>vQ9|Oc26)^S(JUh<`M}nrXyt*Q(-5s90 ztajPz8*1dnwJVa)^YX;o->u(E$?o=!p^Ro%3-eQY-Sqq@-UnU&g@qL@Nn50*sg84ts~hVQiB&RV zYF3P^B2ht84GwLmcNJq>)IgWAQ6asK>)PprAu-fifnkD_yStO+6b3?jNU!taENC94 z+FGLiSvBDb>|aA;y@U%URm9FPGiJRPO18LK_NC|74{@P_JN*3Oid5A%>1VFV?9`kj znrbDzwdu*hwy(FpXaMuOdfR`#RLD8Yv4VBJN;X4AlsK;;RGrLaq#!NuU+F>Cl z*=!k@Zyir$I(``+E1AKpFK(DSus6hQS&rE8%Fb?WCgt!bjtA3z8T%FPM8$f!wqR=^@~XA)CZlQ{DxufK&c5&e(k}SlQHL zZ*zm_aOlp0$*<=Dqgvoh)#$_Q)7YYlMk)wwy@LaconQa-pJGl47QfR`~+6;||TLP#$8#s1eLX5cpudhU0*v zcxq>Z3)qfkMmrkRpy(RcAPS-`0#|KaLTYNNDZR6@vZ^?#o?DD>X?f`BJ(OdX9(EoL z-rk}^SOY;#7l7L8gpAx9lJ3qHTUfUJup5Lp*!Jo67cU__@56AUMs^bBm`&K`@leX> z-O3Cr8YiBCR(~pu?w>KAt?Os>0?-=FO3gB)Af-(LEP0S20l(lFk1H3&3+(Z%@PKm^ z1apUOwkSZ5f0rd0iK$LXxLm%`9E4*`F56>}Gk-|x-%~uXr6z zMdNyrd>J&2{J`r*q1@)X`8`1TVB%xu54^D=z^Q}sx%#gt-I za6EtPh37SrYni3p!PfRJx$x~vGBY_Q!Q7Vknz1x$X|}X9N5hbgjxLtPJG*fHR=j9= zRbIV(Sq}I0DF)WZ(r|iuT%LZzo28+?PV@@O*o~_;C81dlga$$Dz;Wzqhp<|M53)HJ zen2?`<5W#r?qZAxCmtCyN>5T*;54rH6Zm3SG+SC)n5AJL9E)SUb{SXKR#;Bnym5;} zSI~6UH1I~W0)z?&I+~GS)RCVHypM3rF&f1_x}M8<4U!T4jJhh#ywWLIU0%^et1|TO z{@wo-k%MjDZhxTw_EYbEcV8y8*qzjrZ7am4*^5Ck?Sx4W%cFIOO zfkP83G^z*ogEnoh34n~LthZH`kuIx2lw7Be*j`Yatc`ZywCuTl_qHUpH1tbOIYU=- zu+AZ+LnR4hhe*zX=Kk!-{RTwHbt3r?m2AX{YJ|ntbt4gYeU}M(W?~X?65YW-;68Ta zble%-$`?}icYPzpQWV)%ZEYRNp_l@w0lua|v>tSXWTn(~_sjU#Uy_|Q&8Xs)l*K;t z&;xSl$Pppg>>0ORIMJ zGSV~HFB&#vV)ULYt*ujs%X5r(Xmx>Buz#eS^r2t25U|SY8c^j5fPGJIu835jc0UPTGIvspS^RSZ#!NHOZ zd)wCqWqHhhNsKg`5?TOoq)*qGS0^9hN?qc z*)jhZjfSlQ8#H@2;CjdyEGU{@S&&`JC<9?ROGQ`K^rdVrkAzyWMgh(ZGFP_xMJy1C zf%u^ij;zEP$e_a)xqof~z>+f{LqVQ@lxB#c7_Wg8G_u}#?bIQ=#m_)EjqGOR#1Flh z3K=oo|Kksyk?oCL`SPEBPMQ?FzkK;sX>4kf#rZ{^hnCiMx$yEgi7yR9%I4vd(yGmX zU?`zD+k{Nsx-JcE_0rbSDKo<(lF`m(LksNAsx+vs@|q-*395$7%+6{@vzB;PYipa9 z)ERc7+q4N#t)C6?OA2A?HHC8P+S(e=9qxyzscC}!w{G5|aW3R~@bBZtPViQ4)%QS& zxyx~?G@YDiB8=?4V19I_0wQkkm3?L_O}DpXVQF5vd%C5eu2xY1tqwGtwgiua_Z-PljH*x(t00I^)e6OnChpy_j-|6h1C|2WmN1nl%GsS~C8U%UVJ)~* z^UQNJ6Nj;3pK_cY2s1caHt1x1T)>im>}6VI3@jM<^VVzlIbOT9zDeu|qgqg>(8$ir z7&6g#DV&2kHOOphHhK%Dv}lg#XZ^{4`#tIIYL=(o^qkDhxTUjt)z*E-o8OYuZVym&Mf$x$(+N60L8Pj{Z*B&};@>Q84wf zIN=Yb0Tx!)xEO$ipVH1EIBFZ3RY7JPL*EFx;CihC87RZWa$Lp}OXr~ZhnBXaHLIjd> zkR#6S`&Rym=Q@QxGc#sfV4{aC^Rl!>ST+=WWA3xG3YqyRjYtW`{(swh6ClgZ>pbk- z<=waTKHanRESMQ=1h@bMK!Ri}O58~;Bu$WFB+?Qkg_12XF|AZ$D~@Sb%B)nmq$*if zY&tB)E4`;HmR+B4JL)BEeU-g|St@0|O3q>xgg0OKb5{Xp0B z@|Jt=yZ794zVn^$(+mz>sVwD*2`#a}hop_-5Exzu!w_=L41*~$v0~eh1!k_9j}>@O zjf|Sl_W~JoRXeGz)s;aOXjza2IxBrGz*3b09Z%qKq2YrB`hBRK7mx@sGGwFJZXB;g zD2!_6UFizYK#d!w(x+PIy7DE^jF4-PQmAg^m_4#1RFk=b)Fh zx+dx7s@!tR?b6lPAFYqd2S5A~dE~nf%iN16q}*JVdmemT_U@UM1qH(&yysgot=ZI5 z&%7YFz2P=3N5>`W^y#{J_VjUW5KKS^L!vB}Lswlb+Pc(?Z=NpW4L#NfMutz?GzLC< zll|`Sn87^>pgqcP^4?rW4P9K^U?^Xt*eXu363g(MyfBCyLfL{%3hln$@R}QW&H-8g z)uRnXjJRTAlzszY_u5T?bF0$%{FU`3UI=g^FKfeNUCZX{uf9ggqm#P*4-PZ1ZM^=< z0H$E>Cm|1<(SFP@C19OPa}m*W|7quBo=wDUAXvdpKs~xLDxYXxN{614giu+W9O?TLS!T>a95U zPM$i&a|#@>MQvW-tj@Y9(Y5r~3=ro@;Rk8VRM8Anl^OT~&$^H~6ngwc ziHC1E3kmriu~D8B$IJ;QA5as}2Fwdi zRc=`kvJ_+lFls2qYf!?0*Mkd}%9sScQw9{=`8aSL1_L&K=GYhWI{$s@q*R=^vAg|{ zMNa}}C}jjEXm8ON!xc-Rmqq+5W%fh&A9O4wVn>V&e5j%JvH|V{{#5K`9s~sq8#5AV zDXGcRk3HnLnw5tLlDGh&u7HL8#|6U75wbs+Mo8@34-c?bb(eGh2k(?}(Tbn}AD%uLhWr=?iZ)D%o* zcgcumM`xdYPUtuHCVL5Z|ti;HI4jquW3uk3=*Mx%jv&<$pH#g+$+(kL{;tM>+sdLv_+IcK8P*|J+ z-vW<|6Bn6HC-k~Dv4CTXu;7>*ui0-P2X$wm~X&vZOiqS1+e^8 z*B<^f@Ea2y%r66~4Uoo3UXVnM1Cq+6pMcx{$? zQS2{cDikTXRk1Y&QVWipx9pkgm0?S!2UaMq78Y;j`KP5QJR-dV7;zg)%m#_2^~^sK z>~CxdfPdk?JqE`!^DB}QD>F4%1mw`mH;zQnDy+mz)S48Ae-X%cIUH;^+xeuA7>}z9 zJ+(9&C~;6?$JzJhfMi5l8UY6~aO$=uL}b~QGxkC00A|$3wxg8SV-1B;8ntT4I6hjF zb9$j(TDT+??QHJ9@paO=bWx^v?~%s%jLg332HEUu=^Bs9rHiN8&D+obxY^#+4D8kN z}CmF^3NtLZjQRprN*%;|BV3 z=C<2-{iP-3X1DY6#0zpC~mly1#uOe9^-w5EDfm@g^Sz=tBHdk zq__&GIRo{47Tilx&1eu5Q`g1ke(J^Z=);dnQjHyl$ru2;9^|OV>X{_~Xy{rYh)`J; zYNKx2%f~wQ7MdX;@j}3aTN?e*fW{H&F(qLox2|Q34lbV~Hkd5pr8hMxxb5t=aw?%i zt+Yk$`0d&?BPUP3C`+pwvPa9lqsOk5B@JpV#foNT56QF7KPMZDXXX5hnt^F|vD03X z-Fs(w+)kf7C08H2N}hS~d3n>DendMfEyb9YWK_$`5PQrvDj)~xAhDNjp1r@cgM z`q)e>2K`~Jwp#-rvb2fu3628+^MnpRI=~&>|5YtlVeCus%G8F3LPI{B1PlVOo#(L! z$Zy~MZF$2RZbjA%~3C|vX^<}L