From 6e86c0ba380551b8e37238aad2188db176bfab1c Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Tue, 24 May 2022 17:59:52 +0300 Subject: [PATCH] profile details --- android/app/src/main/AndroidManifest.xml | 1 + assets/images/user-avatar.png | Bin 0 -> 20893 bytes lib/config/routes.dart | 5 + lib/ui/landing/dashboard_screen.dart | 502 +++++++++--------- lib/ui/landing/widget/app_drawer.dart | 47 ++ lib/ui/landing/widget/drawer_item.dart | 59 ++ lib/ui/screens/profile/profile_screen.dart | 66 +++ lib/ui/screens/profile/widgets/header.dart | 16 + .../screens/profile/widgets/profile_info.dart | 122 +++++ .../profile/widgets/profile_panel.dart | 28 + 10 files changed, 598 insertions(+), 248 deletions(-) create mode 100644 assets/images/user-avatar.png create mode 100644 lib/ui/landing/widget/app_drawer.dart create mode 100644 lib/ui/landing/widget/drawer_item.dart create mode 100644 lib/ui/screens/profile/profile_screen.dart create mode 100644 lib/ui/screens/profile/widgets/header.dart create mode 100644 lib/ui/screens/profile/widgets/profile_info.dart create mode 100644 lib/ui/screens/profile/widgets/profile_panel.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7be27d5..27bdf35 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ !u}#@Ri>9$LIJ5|9)C0IDOA zo^@fNjjARJDt0Q85}f*07IeBlt@I4&oGh%N9RUDtCr;>B3j;e{VkZl8OIuDS9@78x z;DmnvR}CR0{!bS>GagbENf}}xt6v7hEOg9t^rXCq#KgqhzkV8W$_an_@8Qt@cu0-y z?5sH<5JyKxI!7itt6xSC1`ZAm2t6Z&k&zbKgVxsB(oWZj*3y>jzli*AI>H9F`oB!9 z?M$pJiT}~n)w8m<;~^#eH_`um{%f6fCWilKCQIA@-WGI&kbf-@20D7k|ImgG<^EU8 zDgDdD06OzO`n(L>|LOVv)cyB7+>n2h|6hywubuv<7P?hlL~h9cJT_iLi7pCN0DvFx zLs&q;33$?qkVUR&!=`1G?0jXo7N|O(3=Gix80T&)^X^@u@Qd|EY?jU1XLNn!-Av&t zcMp=x=1r{Jz9!*MAHykwXb@AXhIl*ZK}_BB!)+}KtL+~4Qa3z}R%@+KtEYE|!^`S3 z_J;~H#ix(0Q|?cajKA2;1Hv{S7CaLNz~wIKncJBFJJ<}`vl++zb>PW zmtvBpf%m@#I28wIR~nE%v|UNpAs*HgIu=`Jfk6jaqJM?9`!6VB78!Iv2O0ExK}(q= zXgh|XvT7ET*gv9B;{V?geMx{B;x9)=Mx8sfXsIkLw9%ZZLso!pOR0W148~baXZm{y z?u|jm>~~ht$_U^r<-%P!%(uoVS+EqS*77X<^ogzG@Rj%P7aukM%;4@1*pex+-YW2) zGs&>vR5%uKP6A>S#!nW9pYHF|P&zK#`WHjT0Hv+ZJ9>64##4x1frL4VVCBg} z#Zr@%P%{K~lX@H9E#t*H9A^DpiIjF7;KeDgVb6V@I-ujXFkm65@;b?E=xP&f7 zo=BRdxJmdq{}F)=7}U_J`1Qbr4kDta%+uB~lGE!nbp2a|V3eaeAb z6>ncxIGN3pm!Qs=grMf$n)CTDnaSGA-B?e#xAIpL$(16Y(jnDIpH8Vxz5Nj8!u18jM@)e#?7|>9s7E&;YIB@(9hrR~X;J8Qx-{g(Fg4oVs>TDS|9d(DjBlKk2DV|I{2F!_hFmv@}#08M@zuCY2Q{&6SRM-0Da@ zfoq)~)29%ItphEt!nWc}DDbkH6>$r2-fdqXW_HdOg zQu$Q!h4ln6K;l~Vt8%OJ9 z%hmpVBL33tHgeOVl&(A+a#f0$a>L*V0J8(}PWEMM%_F7ZoWgrHWvrv+0qI@Ss9KHR z`GJ1(NJr@k@+^^+mm;4i!Gtkp*=hS8;p39DM~uU{vVK{8BG4^=KW<7o*B0W0vR36{ z?b`Qj460O^RMG7Ll#-ICV=*HtsVHV|(A|LfY+yIg1k4T$0ds$}uKvtjm~8!+PV7|n zHx)4>Rt9rbK(CBP1mg^J7Q)vpqJu#&@9ItEh8_|IPCAksK2)O(I(s;9X!cYKE$w|R3$_lOuxHh%}}H|9;m zJG<8Hrmg*Hrm=0sxeMkDB9$UqZu_12tPEr}37{9go>V5DIR&!eqm&-nFy3 zJzW;tzj?V!$SNB;o^Q>sVM;uWj0Agz;goUT_`!07B4I$K4-O7a);@19XQ$h1up05ce`)-r4A+h3G)2Lg zuB^Xs2(hB+by6P4u#v&cW?u2#D}mCHW#Mhe>xm6-FY0TA?r2teeQ+w0UrH5c)I1To z+jG`0(mUV&991Z3E;RWVtv9H9NP_RLWz?PAifHocBg$p0^3I_mWGVLU!uR3W1es%r ziU8SYEQ7~xDx8hgEmR0zXviN7D$_WI3;7_!{bPD@f3$<3@wI>kc%!6hFi7Us4FGQu zXqXLT*b%>8c*8SB{2kuo0o`{PP^~3m5E79PMYhi}V9wD#HUO0ZT&pHPKTy9tt6jy4 zCmLc$C)0_+5qcg^aiDhzv1j*Z884jyMrkOV)N|w79 zwago-j(@<`sgJ40?DK;s^nl%CV_Tc{!N6lwWAs|%M^<-w_PdQ7bG+~|1f zQ*Mj#QD$P0W3pcF@@IA(O^fDiZP+#Nno)Yh#lwHKZ+TmFJ-84(q1)|aWaF%t+9Oi0 zPe=oT%C=kbzM^y@KHES0f@WzzGmP}^k9ID-rCN&RuG2#(Rg2v3QaA`S+ARrIUbH=p zr*ct<25_8SQdfKUDmV?lNLQEt#?h&dZ(H=;DlJ`Gbx3_#b~}j+KV0pOV2?>idpeX& z_jQS7>nKUgMt?ec^)0WElh_MlWbx>F=du>a_hk)3;;~I9#$1>@t8)Nbhb5`#OTAj5 z@5Ky8AK&lm;4e&H@pf=JsMh=69xF{|j|ZjUP>KdoKY+?E-F`OsXQq4FKtaxN>V}>n zK>J2=DPv>!w-_ZW5i zQ9?P+)1VU57vQW&!#7fWulPa!iVRY%8)LJVZ-^BF%}k z^?5ti1PaooyWi?W*3m)W_zk0wR+tfE5fw~52IHs(aS4Dp`&&r6qQ^|(S`EgS z1nt(W1hsE=xKn#{IaUN~LPO8^>cCPb7jt{X!JvP#Dft(Z(a7L*8_pOji0Ny1Zuecr zH__w%O7{XL{*kN;(7?`AyKCyZDQXpe0LJCQXchKsER$B)JQBvv@IoyThE-|jDU&Vf z37hL@i^T@tjJ2wC?Iq*AQ=amaqx&Y+*#3#OT8hawCW;B5t7MLdZQ*#1b1Z@v1`AE4 z4Pn8M`OeF4)wc=@TFqLYmycP3yq5&}-=+?T3oN}bxBxZtJqIMGri2G4>Ea)<@7hdl zR3~&tk61x14HH**jT4KKOC~D?>2;Ri{SRu520>cO+`_4iXWMgh+3JClt+4M3t74?h^h0%))G%QT-(~ zXSl(3JegG^btT{U~wA{Gu z6yUV_eFC^2V^ShuQ66F{K)Keht<8b!3JRP0c6jMC_c13wM^mLv@jK-}WgkwLeNhRL zz3gYBZ8<_IrP3%51_x!)f3{*d2&goX1bK;O$`uxNYyduQrF-@t9HfL6XnaipMtxa8 zGRU^-S=R%5|1w$Kx$39VolhINbS|L@qr#UDCo0$Rcbliut^Tu5o|u0ap=Y?TOL|6NCN2LWA2gc4CXZUm zX*T4$yPNZa^*F>10h*-7;dHRJ$vgZIIIT(vz9<1L7gVQF}$zCOYP(*HUxg^^d~gm43?AG^Q##NY{)fQoxKdVKy$D3c+%9YpeTp%vR)C zR{yakZ5mfRpZ`(pps0X}ELHq_yKeAzAk!ItHxR`M7GEd%JnOlOK0g8;z!~*1>myG~ zHQR(}AqZ5B2g2_`hY9P!Zt29rExHPw(HkI4JHp2w8zi-@)-yjlrz`XgrF8jzUumj=pm`}| zC&;}JK`JZ5E!`}h3-L(90_J1ep@KBkIN**If!fJE^5gt3S{jvdE$MVCxKA?%CDf#o zDAK)j+BsumvG8F z?wctNj@sQ6EceZODNf%-hCR78{RRQ>{k{t@RUZ5TbiW+RfaPvfWi5ildI1Fcl)E5( zL6VSze%9Ov<*7EI9ydHUQO&#YV-4CQUs> zgdPwm(uHHcN?I<6PV&#cO&U;44Fn$du234{-{gOGXdx=b*mw&Qcc+hxUuf1|xNp^y zrwGeWj)hyGZ0QVf4Q}O!sg#2IAlaDK2KwR^1{1TDu2^4Ix9n4^bh%%rmf9ZL2mIm` z4$rF*w!Um0Z>k_x-)Piy?SE#y7V1rH<>9Dsz{2p47yEAk+C>}}RgDS`A2#JtbI|S= zBr2*jI=OVLdo^GX97?gQ_#eniKS{5RXlr?lmBzHAVWT=taJQwCY!F>{!9+%eS_OWh zmZ6kPiR>B5DzrYiiO}?4ny_B$|pB3LNw1rMXCIQn>;9y zoYUKp{AmI8=Uu6ChRb32u#i`>!9#rUN+9OvL>HzGF`oQ*xO$zg3|QB*k@j2l$1dyn zIU3Iigr^B&zHBeBh?d;*u&7su9EJRl+Nji8IeSw7ppX)N_w@lAfw<@?mnQrdx!=0z z@%W&$b5^e?W&W7YSY8)9AJBpbvOb++#S(fYWCUHBie zeE}P#oO{}KvJ#8S1+HaCi0?4AQfCp3|2|oU!zwtTC!w=}-*Nv8yto>we9VOGVJJUj zU#6hl+BYol&efl1b?Kuqt}(O9Y~*L{NInPSTA9YGIDweAb3ORx{u0`?O4v;|MwUvz zX%5fGZ+sGqe<;-`Zt~VlI=_wGZ5P$|A~P#C$aFxF0&%J}p(qv1yGqHh zb2#I_W}ayQocO6kd+c+2KRGKj)*b?AI5I4UJ)8QKRQ@zh=E13$7}f@qR~aiv8qBw? z*H@Yy9C4blTHfuN0^uG@uO z^dz}l1us<=68U{Kf4XAp2-#y!w*Zx)UltjW{3sBVL3|q8HrKJXj-qqvJ`#!#xMz9R z&mYCC6v)9qPjo2H(o0ZmWL{k;`S6j%*sldf1G-`oqPeLP8F=oL$*90GbTg{g(=qLg zGk=-#{1m8yt1zXylmsJGgfVDMYqog3=$II&-^usz{H={}2a!Mlatij3c%;N&KJ8JG zu{OhQ%&;-T+F4Qh(a7BP6YX}ZJcG|GtX31nT8x(^=d(ZCFjhIU)%ov~_VmwxG~+J+ z84eIEdNfqVqj^DpldAO(Zmit&znJm8S-q)wYhR3~J)nbP?DtUbld;lSu9T;`gq{vCtOT`RR@sr;OVBTiB zkAhSGJQ1`9J)d9NoBN?W_{6Ft-QB>Uc5#twCt+v7h7fl=!O2761EkB3EfOAvk%Xu? zKyYIN??XC#V)MtSCQ*V~CGvHrWV};7__Mv((1#@pl!;U6ScVQUrc{)9IqML4oWb~6 zsO8=Ba+i%wr#SEO2tG4jPb7O2mPQ6w&p(2nDCH2uCJgtRsFK;ag~^Mf39Ap@3$2#o zo5A~4vGwBDtqZ{l#`E`5#q>V*GMl`7%J~~A^WP&f`)zzHYSnW%t?~!9KB4z1WVV-A zeGw^c$I;2pnEdI>-egu^^>)oP_Jw;Sd%~gHlZUKCEz25~P+^7IpY#wPMZw8K9`T#r z#WY4fW?^k%!;E%Xhy}y@3h#nq;7v6cLz_kkx1_}2I@<*QchbM(Opp0@oFND(0@(?w zu!ZdL4CZ-(o{PJZR?cR$Xa?@!S<7tK3^i~soqvQDIxkvFo)^yyc6`k|Fs?8NA#o$# z$I&59aAE;g(&YkK_yg``2^avvGslMPQ)0L?AZ-oM4yT@52O{XcZ~s^+cfK!Ia-~FF z;sIhk7t?=j=n^!XvVv1N*sCiMp(-h9rKC|vGlOjPQxZ+~NH1x>3a{T%#E6iSE}&ry2PoahndRjF{XUvh;@C^C;P*45V{a53g(Wq zlmv{lO$9h-GAs9fF4M*LTvpEK94=11aF{j=Iltl=AtL+5VDt76o%9}0Js(#nD4ONA z$CLW%p+eY*`g>4V6#1S(Vtpz&&2dNMuNB5i866`sk`vn^!b;M20SpmsePA!&KD8pA z!Ss`{(QC77|Dj!2K@#-VqQ@=-QNb3O{?UEw3?vkTY!PW$)VZH7y5Ar+Xtw>a$T+v=|Y^2-5T9`*gV6SC5S#pZ+`swT48>=SW5 zP~Gwz<88k28HD0osam zMp03@MT$Ghu}wZG_Ebgi>f6rqvLjvRHLUgog}kPGfs*PnUL~yb$7^P%8fw2zf6pj@ zw=*9uc*~fkDUW-x-U&tyCh13g4DLs@De36Ms|qiGjjSHctSxja zZg=1g`?QIw;H0%niK1*abIjp6D*88Z7jMt5f=+9$v}SgZ-8sRzKVJ&#hU4>pkt?;SJ`H7X{7`Oi3jCwr!%Ka{%1;EVT1B zqJ8oUU~ry?>X3Yxpf}jQ1?*4{pS!+;!o7r%+z4GwyR{qc?g;}%#!cLy3K5wE>!c3G zh$^a^$g8HrcnsF|x_kR@ytB;4ggW$~AH}?SbIbDMpeG&o8Hdext66EPtF!>^Ryu{- zpUzElOFPWtdg11J!}E8n!=JNbYm4kj{Gj(^sbUl4trsw5PL8kLx?B^#^ldA9bu8Ly{#1Z>VR!{S8D`iRUdup?V#vBUWyQ{d>TYc zfR0J|^AGLI>R(u_)`nupx3$-Cu|L~LjpKi4xiqR>oAvP4VVa+bARqHdFBxTZSApLU zbkN!3^w^y&IM0l^9lZiWN~q!)tV7_ax!b7>zNttnmML)RBEy{Vn_s1_9p66}S7sjb z(yS8UFoU3Wy2YXaMjbJ1^xG}j!4VIJ$J2bXeaXxxjFr}FSa@toz2e=^{_2nrMEtP7 z=Y0?$u{5lo3cf7%Ito1TGu@yT(0w@%y00W<;Z_fJ<+RsqZ^W@dF$S4GJd!EW*f37} zl#-K0^0)jO-{Mz~ z9wQgPkp<}D11)`sh;#LO%9U#)>J|wFIah1U2mCIUqs5y@zsFm8iz(k(2T0nde=!dXU#Kl74AkuZpUxSjHOb%-t>>bWLQHdPBC<;?K>w0B0w>)k0XZBU1; z>D`Z1H~B-OT`pI`=Vult3)P?~hB{DyTf?9#54t9Tx8f&TE%CFR*EuPkwAo>HsXutI zWyXi(xqak6JERcMVkS+ZUw8bqcj5yW(K*_%-BxEonBx8HnNfrDux zf2aRkN}-;WAcZJngPfT2Z}!@!KnZw8XC{VFFUN>^gRVFd&eu3)+`%f+&fK^$lg-n+ zZ{2?`GK^H>k>mjb@~Bc$1qpRd0zz6(Tg=l4&NF5o=m*`uF32}W^py*hFcyAV)M*=e zI6F+;A6|4l{AVrT$)7qdM)r&t*-cDmGHs(W6pcme zI39I}nEf4!0#fRHqIm)SDWON*6_gzCDc{GV99t32I5C;G6Z4u?fblEn4f8QI)lzt*|(os7l<$_oehTI1vtF(%D3I*u(i#y9q?6BqQ z9KyVdL{fiGNYzuI_B@j59h8LF+Z#FnGm z*$c>wDAa?ves~O;6e=@K)wof3B2r0)MzKw^8UGcP(z_@A6|XDgEaMT3B8_%ZY&9Mg zNLwdUz)9lov+tCBZ?yW9$a~(_>=VG7wd;s${8vaaW!@;_K*saW9A+y#8837n9K7f; zAwmZ4pL*n_e(*f5G`ruJe5wfykv@=lx>u1vB9!%-D{zZ{6?3hYM%ln422#86>oUa^ zOYxJ7wxEiP_a0m6{`P2bX<~K zO0aG4i{KntR>Vu~Yh=!vFsCQae8;FiqXCkp+%tb*<%^;a~azR7)J4ipyRBU%j)NhY%L z-Gp@&!*Gh@T=!x$r@#3lCZv8S)E83HUK!fYo{R^%@}XVpg6dJXfy9ma<|jy}pQV|{ zlMI=leAB#7ZgLLSYC4T@U(5g>k7Kjw8gMjBwg)1AhacBPlvw+h{{q!rtP@FwQY0IU zItZcqC2atGEj)rF3fBp+IS{q<&ZkG#BGKYt6}-E*J1m%arnJ{y>KWy5&Z9zKS=|gc<|#*>M+BEk7#fSB zdgN!99xxe>53AM+%8EZzh3-v~xJnD<+jQCtI8*ER&!D`4zW+s%0j$3H3Y{&%I?^pLPKW{5YKicBfa9*i-x1NxkxD7-^gafM29fvud`TXU0yPVVGMao8Y#at z-7_d#-|V)#>u@fs4$(v3T%50spQbdxim8}t8rc$~aF_(YzH8(cpD?_%+V$c^g!dU& zg8>~xPE-yE^B8Sl$2i86Tuy@g$sHEbmyU17>My-i=E0s9Fob~3BA9%+dn7WLvugrH zp8WAhwtK-T_AczsP%-h}Af?E3TP@HE3vU5#3LkSy7_d|b$v+?T3 z!cjw3LnyC;aHzAKvZ><3tw%{9>EtUVTdk|N-Z}C)mD;NtDrUeLYVW*uVH&6LTI3jfEK%7j{Ked+86f|m5duN*x?j${(l%9iOk~Q!wkr|vpX}G z2M7K(;piBot$!OaBbc2;6%e~oa2T$J$jS;`Pb$+CjJ2KYO!tq?l^Ek9Q?|?0iTU>% zvQxgp(H=(>gn`kGW{RvP(J8VhejabU^A24xc9~cTcbu#C+vCm88DNbIkwjK%UO!@) zf!)C}2V)SXW}`SX7*yGTDo!E)sfg-BQ;-o?nl_Jm$DwO}F6A&I7WLHFpW->!>F)GyQKq3D$j!8Hj9!AM3 zMAXI9L51KsRQ*I-KiynNVmXkEi-YL#ikYb7w=#AS*hVpD$oJ#E0HFD7ly zzW|;U$FY@cu^!a0gF^99&ZO0g5FwMz^?63un#E{A`$JRZkX3b=tPaEX)NRdSU&0~s zK^8?8`Fff5cB3|~7_S&%+~G&HB=B-2SXV@671(1?pMHSSz0pE~&43rI`t0P87ta(= zt44udv6!StFA@bMHtlXyg?e)W@5?}Yj!}jOXNbXLp3U_m8fw;?&0;6B>tR-`vJz!j zf)e3`v7#dw^Cn(lyqaVu)f6udZ&kL>63J2=OnqR)6R)f8Jl=y@3laYsPmVIqE5kgm zm>e6|s=tcsD-Vgpa%_a8JGSi`xA&DO>=*<%=Pt%=x-^{pgW0uY0%nwi2|lpfgT4XW zA(mqqE7$j+yK%oltGtIPit%iu0$GT5p^ugdx54d(LMZ0#!_0@QB1pJoXluz^jSe+i zO8s0J@8#_1^PHrrL}>vL)(+Oy^l$3kGC?gP6R-Sa@w$p+! z_u8GGeJJ1E;2?0zOA^l2o-E>2g`U=5OjN8et2b6m42|C;gxCWf`N-HVBRK? z|1BqLc`4biRI7}W3Ht80+Z}2QzEE6*q;L9HAJhq|LXBzP9q%Hyj+AW$qc3m_JCvYI zjm>Ndk=MY(%jtvfV9&-kl@4lUoQ8NPI#S@vvkqhl`J=d6sh-kMm{pG6Ht1~hd*Ys+ z*PK&|>M`d2i>fjFbKk|&MT>Z$m#!x}Zyes53*6uvdZT6kHwR+S3?lK5iuDQas&{4U z@bsU(6;S$d@r?h@VawHm>poqwz~@i@*6s4ZNQk)=^^ZYN8~jh0-qCATUJm8JJ;bB@ zqy29f+{^mD>3t*t((PQ5Y}8$HPH7god~CGE_YZ%y!X|$E1h`3**WrYUaw;fImJFR7 zX9}ysi%Abs?zFoZ+dKcxu$US1O8-1NCfm;%2 zzKH%aJ2q;st)`%XA1!5mqitL(xnNNV5f4}5XXO{`b#e-|HsyyHDQ08|Zr*!Y97lZx z%&Rqe8@>kf@>nQ$KK$7re;)r{#=KFG(98GPf6pSDHvo|z0g;>9;qSN}VBN3!u0wlj zYo_rLZA!ooBdFUQ7tJmnRsa3H#O~UZ=+Rd?yJ$EYvxxW*pVs^YC=Z^NTW}Vl47ooX z#0Y^n(B?tWXhlt4RsDQ?-;KR_y~n)5+K*fCvGa>D5JRX4(fw38d2vpqs@y%xIK1bG zd8K(#E=31*uEOC~`n@R5nl}{U*%J?_HV1*Q2rs}jrV$v}-1b{5*vP@1A}>CPK!AWf zc5Rf*`KKa3p}0t?b?)^b?qJ6n#H+H*ooCnkZ_D+uSfUd?-tBoxni+W(H7@^TQermU zjoGKKza0T+*+O}8F-L>qNVrS+Ib9`Xc}QvAgcW8FIa{wA#DE!C5j1waHgxarZjtav zXF}KducTF%w`q=q@CKF__ZpFpA5lD}WXA)`geUeYCxe%J$K=BKFr{mu`jI8C#U0;X zK5K8Zr+AG2OJ8FK^zqEvCZ0vNv46@-V};SFtBFUodnau7jrvX@U;tZDCzX8Gd+oM- znkm3Dr`1Y=JWH46dZt1L6%+vz-cR^4fwb@cI61;7!|YW&nD*sBvwkY`ZE@h)PdOc_ zS;e4HcE<+srvJ@u;Np&h>z(WmYC9@QYZo3Owr`KA+^K&3sX@Pmn|5u zC9RM?you8bF7E1e&OK&_>=I&JmQ!byoZmYhX@AGmC^7jgSQO_I<@Ku#cGuPL+LKN? z{|Bp-CWr-262b3^-Y=)AYM`=8ODK9hEGWW8)U~-jSGJW&1)#K?7odlsR~HTdHg?PI zNx$}Z#U^?aa(%{Yl_)&x9aCN4zkZ&YW~%E2Gs#+CdyzbP;5#KLL5;KifAlEodS8sQ z-?z-4D|GF$<(~|DN}pk?ah$O4DLjkW)s#Od<5J zQejhRN&6e|fp5SkiI-VdO1O`5u0O8USRHW7)0-$mgav3n)1wUv z@=i0fwf=KTCALR|Nj-)xD+m+;p}N=v7p0(Vv**WBWH%nKpgYt^9P6z7vCy@)WMz#Z z?3RpO`Mz*^oP~FlZ6yzppr~)El0>XSYV3PacVhN0S0#rFsuWxn1Y_!dP~#FF>cS=d z$(SE%%~lEm@1p&%N;-3;shrR?goRdrc++)3o!{R&pAuBgLCa#)i3*10KH?|NiUwC5Qo6 zTY@H4mow&3Qi%)Xpe}UsjNYIuRb9uq{D7IjI0>K!fM9XsMbXv%lp#1ngai=R6{{gm zpcR2Ov@~hdz=yb~fV++uv!=d!6WUK&`u8d0J;lu2?9ncd4-M}vP1U`>=_?Y)dh|p} z!{#w`Ae?ziZGwTR!?2oKtrHKZSKS|#CHRW3Tfpg%R5_Utd927*qj>0vmN71oH_P#B zBo)!p?z49oZ-C3+WB3!GJN0mJ7Xi?5D(6Xr2(Uw5Y>?HM_Rv}ZhATsJ_dYIpX)5c>>7s9r;wuOOiCnc8MCR<8vg-8&~Zg=;VL)@S1 zn`Zh=MSKokMV@6$XzDf`*`vS)t8|7BHhP!2pJ#E<1q5?Vc~eCuwfQr zXEEZKTP6R5+BRbA9F~j^uHQ#fI!$YN^Fuf+r;F5CU|)30`$L-a{PVYf%rI&#lcu+? zWh>3W4Ht#s&mp+H{@Z3cJjfc|_i7*I&joML#FQ#n-+0`8-P}zvEpU^BQsMTlc$AP! z+C`-!qBHMa^8bIyE5!ug+|N3Pxc> zcgzDE?H-|k0*5$GllusabTw}cXRP1|d1|)!OM;8;)O)d~#~He$aSg=hj0}dl*t5*V z&Paxe*%BBGxO<&a@3_JA62p=dirB(x(h{2O`p3W%<3IgV zCd=pXhdZU;%eXmfSr1NFmo3^pa=T12bBKghh{U5W?rlHC<>MC#r00&J{qmB2$1f10 zfLUl-DqF%~rLcBg0*$pTb+JTT@s++2lSIOb>-@%vuSlD}FGq+DK`)b2Zh1yXSIC~~ z;9_1;ifM}tPHBO?SQmU;1{E1~#mPCsrNJl~8J}xJj6t-lCEd<4=4uwpgenAsS|U{=fz@q1GDVJ>(Mw_f!4Uv z7$RNzq_cIGV`u&r29a+mvhS60NBpXa_6B~}qU`hGAhsT?OI{>%>}q34$yp?vOV<53)W;nw)n0xC8d zlt`#|HfEIb(}5jF@D^2)2d4PF*l3|)M4&pKu%)=enfu4PM>KB%d-t*EiJQKjvgIq; zSWuPB-MdTt+CbRK{gi?A)5agNwZi%p+sAj=E`+WXjR0|()WXnZnu3!V`-aWFA&vAy zrE6Qb^ylN@D_H`$Sz))Nr)>Ab$-A1d-YA5_Hm+(@wG z67M%Z^2NRXULSS5 z*(xJ%+bS-NPHDvRk^bAw@5c2bAuo1+*)JK&`oOi*4hvNPVP6Jg18{Ful(Kr3@xDA1 zz+2U6!|n4I=s}}%$G*7UQ;&u{Om`QCcB@!esE(CF;Hs%5J#OIL?K`Lu{BYwHZOZ9N z?NeLA|H;VcmX;5_2QsSi#4@<>ew;zRNAlfnyv1|Haq#hQIjkfyyvSthy@a{)(5RGC zpB9y}*8qwXsok?j$;~+_I2yPL-DQS$rq>r?2W(L3#~?v1!PyzjVOtHztY)=puY`XF zg4)06E;DCv4<#)tz}v^~ofeRu<|EE(6BUsK=T{i?3b6;R93`V(5ypm3fVkSd6CZw} zH;i)~RG50K_HS_N?*%NV$JQkCifxOG7V+CKeA;PR-9w-6VT-u6358lD^JzkU+7K=+ z3cAP7{lWh(`sMka~ONK z;BQ6UJd1+Q@10MKgso{P+j|NMM?D4#DN9UbHXbCYnCNEZo~wY#p>pW{kojNPHB~A z=36kLwjDl>=B`P>PTIGmkTVDnu1qHnl+#Dk^CA-QVtvuu@~FHN(Up3&=T(N@d^jX& zNFP!dH@czSknH+i(%A-Vv38IXA5@wpR!W?oP?|JjnM-AqwHIxWn)8xTW5JZD2WR)` zQ_A$7x_@2d+;AwSM3xq>h#+1cnTnQMK!7sOV5FUMNap>(Sp4Un4$HeBS)eMms;Ny! z5UQv-<+5BD)QXSdp%7rPQ+gvrVa{^>V8g=0bf=%inPmLP>*m|SWinrDM#0md2R^w) zWmnXZLp&lOaxwE`%QF2UesBa$49lFFrcLn5TDE(yu-|#x<{DlYytNX^5oc!0$E&E` z-L3*UU+h?0xN^dPPZM(ruB_Tj7!r-M0%n*-T48>K#iuyw)lM;tO0oZVv%cvnxYS}# zL94!#5ud-Fhki(sN#9cPx1+?=l<|zdW01S|gzGyD4J=qi*<&$}f!XmZpJ0x5_-9JOn?%MjLFD5cTG(Ze|+_iy{zEtEiar%l1sjbObdVcw$=~35V0%R zTe!tRtcHnDJg}!!nQB$Y?yQ%z`~V&Fg-65(m-QhMk26#eSxvH~d!7=`TevRW zYFH0V631ZUlu1;cD*PLeKiBZhwNN z`Zj2fa;BQ{7;L=s*!5U=qD%3!b@FY)0OnoH94p->+GBt>UfmFjkv}AAwHcWwrxV{z zSg_#KW*Db5e*={quQK;FkvOVj{SlS+iLj@Hp2ku?V(8T~ocs-ByVTcGy1J>@vk862 z$K!qRUEtd>HS58Gu|-QrA0p*?Vx|!!Zbo5jd*Q@S)t2Vh?X<1Bv9Zws#M@hGByOi> z3IH~0&L>nM(SW5v=azzn@4JLd*kz$?CA@DF5meGN%iLYc6zkOe33lSO3I`_BI}|a{a|OLHz}2hoM_4y5=Qz(>WXK@=x!QHZg<4D|>lgwr((b4NT!( zcuO)ivs5Q!3Cm2{OO@Mstr%&6nNq}14_hk$c)_wGOQ-b`_s-?-(rl}Lax$3l50FMy zZvWfpct88zSYXCWoM~3m)N5wtIrQ#ZC*t6rKe&7qiMPp2ZP|)~v+_MGbQ}gfER`f> zIzD}TY^Yv29D(QZ!VkELiFlWH!-wT{_RYYv};M}-Y9#3n%uXy+>L%AF%i9BR0hKQE>FF!!hDT;0D*UVtNU4MDwq?J{x zKcQzBU;ftZbdCJJmp_up>+|oCBu33lZ=+1jA8)sU;oKN@m=5iZTrVwI<*HjgV(>Vv zy-f7pxV(Pgw&weDIXHB1zZF?rxETGq@~oJIs`XpYP4lK0c6x4G*}n$y@~*u-koTr| zY;rPRnr$1VFes47{!6;Uu4>I?3VXH9Im@^yWiKriG$Sgm;n5ct2!8H;>rQV+i+Vg; zTN9bLtk<-g_-*&FbC!EB)%^5h8DhEeUHkDCi80)<-Qa7w?cugkAvE$8OIt%U^W}K& zAjQmMwuYxnCz9v&9p~0@?Y|UXb7K*+teIbb%sw!8lq6@&a+v{VCn*REQ#~$_{@m=Q znr!v$dK9$CmjD2$TmOCwz^YP7IF>>>C(`4Z=ep4IF{OZxbgpJWV(m7Y=Xw;JF!dPj zw2R4S>Hdqz{pRehzy@@Rqc}2es*FV>=l1qAH~IFuroD~dEI;jFq4&HEO>>53gyz+b zas+a8ELyt=-Utcp$@lKf8bX`mF8gHL1AP{cbIDRPEP? z%9c@Rdh`&HBQ!fp@(`t}W&o`1`zwH`>5lht46mY)>#V7@T)xe)`*?@Ks%?kXDht(Z zoiT+y+G=&Usa&%?boC~9=YIw74iNFQV@LVdb;geEp|AYi-ZW!s_8$yv-n@nW`JcZ= z-~RRwX%C*X+M$M1#uH9FiC%f$`E=ybM~hbjtZb5RfR#aBH>}^lE2$gl7dPBM&pqod zKxg2lA(OLb&!j7^_#mBo?%56Lx2p8{Z?2(V-I09ib@oY<=zVXW)vD=+#{KMPzoNhY z`>W{r=iT+Qh6ZJzG;jU_T5|5WboMz*Dpp+?xEpmQ4X{$&7?W7Z~o>lXy1MLIa4XOr&kQo2S3esxR)=kA}?5NT=m!UX}<;OJ^}|0mMvS( z^ZH+O#~r_q{N;hcs_W#_Pp9)QdM)4Q)!9??Jj_3<7!0u5%7UYx;2L0^{%(kJKyBm}7Gf$@I&P=oSYJk;Zj<;^vLO;9y zI{N8PuBEjvboVr**(vO^&jML(oqX~M%?_>5zx%3LdbzIl__{Tp$bLO;meF@J?$Eo15XLmF-r+w#-l~coJpF6L{SFc_} z|L_n0Ot@ZE^dO!Lvbk z9aEbyVLW~CgO}087r&wD)0G=<+elyhR&%S%_q=r`EjgvRn@Mrn{hjapkgmGwYqVuc zvHwVfI~LcuPCx5xdfgk}Nb?uu`wQb?+}-32u#-yoDCZ`(&s++CHmg?ei9FH#BKw)PCx4` zdgEIz=BGx?AF=anXJQ6evFxp1w~oI1t#8wfKf8f&Dl!_|v}sf6V;_4z;roe64fi^| z`O<%<33FbZ)LmD$W%Uj8-K*b3xJN9h;d_6d`ON>Nb?eISnorUli86eWxa3vm(wpD* zR+>7kyWb7XTYe3&{2tl9eLMZ+hd-nr|KJC-ZCmY+=<~J{vx?`XFFjgL6AwCQ|1uX> zT=92w`+YNM+Pqhk$s65R_uMb(N=yewnVj?%Qz{_-~o_diY9>r@&T-`vwV)%wn%HMH^h-_r8s&&u~4FT3m` z^qb%Omai37xm8{Vj#7$a^Ugc&pnLDWn+{sIhyY-twT;RZ7EbxT^DqBTZu;!xmt;rM zLALKve?{Y`E^cW`Th~8C%kKOCS{ggr2jRjzZa%&ElK;so-oa6qj?O=*sLLt7@9ul( zy_a6f-}$>{RDJrFcG`RUS}&G%#-=@wqS?bASRA`JhOy!rZLNQ_On58bmHy4IeT{zp z)1Qu(DQ7y*-u~7v0=F|Z(@7P``17k*(h1okwrK>@vdL^P{1SiWL@~qVR!t zz0<%d#Ur}6uk`|HXKad77!juM2N=ip<5hmFWJF9dn8b(&EG(b@^8N3pRnM&qrfqDy z8R+Y8{gkksvF*k^6364%zWf94r|Yiy@kpFr*_=k~DIxBw`lru+Rv!IQHe=gpKLb6z z)YIG8S8I}-$yl~Q!<~C7Xi^*_NrvyYe*KGIqCejM0Db84%SY^eTO)FXg~z>I{=p9# zSY=d^ef_PU4r)kg*ic(WOBukk*>LO^?U6^N8Pw)R9AGVd{Biood)`A&KJi5DnOkqm z8R+e6{ertXO~Z!TGFqMi9Qz-B&$|h=Fw)wH0<1?KdWf$0=tl|9tg@C}2GY1KAq^YZ z&9L~EUtIg5)Bfq*0Rk&8mDt<*vNL4#kY=HKuw@FMoJqI zfQ65Aue{<4`_giUj>a}Pk-VQgii&nbtVJ7 zZQRnJ5vE~7Z5ged0n`R+1hrE1R%pPIzaG3J@C++!oy$NPtD`h*bZ*AQ_kS*TY4vpk|8P3JX}b{`%MQ9IGNHzo@aN zu{uh_Mp5(E&A9RGH`Gp1TOk1pKd<%GFMP46IWK(NX@E@{HVU7}E=>TnQ`Aq>3kg`? z|F`eZ#tozMdEZ?+#>?EMalt$d8)ZS+M#C9E?fl@o|JJa6o)ilQSoq4pbw3{YU-Hb; zK@yK8jnz>aHsW#FcH;4WX8b z)(Qn!LqkLKiyLkzT8>9tylJeC(y%e&65HVkp_WinMQVittebEA1#Q~2u}JwHk+G(6 z{V5F_BQm)ioD^yaHC3cmD8Rb*M|SNh4+mFY8_#ps_|veVwv4u(fuhw^VF2sD?z)Sf zU9qC|J!2zN%Rm~dqcm)!Hla~$2sMS;DoQI1VBv;0Yx&4PZ*L0E!%D$MKC)5#D2h~D zg#awvV+72gw{L*>`N-|hgl&ke_AQx(HZy?QD$0$dDI9riW~+hWxBuoh zv~$Of1~g42>kOp%>0X+)vYz)ywvXCEjTNC40z`Et8oARE+Q59cr3cr}6 z2}{$K+BDjF28vK?xd*H}@3^D&JzyhK&p?{jozk?G`b0;e!6MXJt^o_b{PFmskB-7a zC%;op^E-fP+RAUniW3=X4Kq?Ho_Ct7qBL#gI%x$9F3+`>OTfajrdK}qY{7Q(=m>rQFf z8Xej1%q&rRd41k{E&=Pld+cI+XAaHgy`=ednlx=SKNA~KD+770!CV5?1NYkLV6B6x zn|(cf?LP}k<4@C;+BBL@2J%{ixdg2H4Y1NV>N2pB=H2OO+R9+6quOL%YcO|!wR+{M zLVRm{v>wg9edAM`dYZOU3(5>h2Jqwt)MDOR?f~ol`|NZuZwHCS)6>((4;vk$n{89r zf=z4r%s?J%F?WFV&;t+VbMIMHl*OldS=h8)l}-loSc|y>tVbVtIGt>pmDDqk#ix2% z*i3!mqtsv?YcW@Vg$Lm;U$$(N9v=Chb{4ClENtdKlf{S-wV1abr^ppxJ!a3o%Jq?) z#hvL{*vxej3l?17YBE=V_2|QPI+*9x z9eqba!DgJrcmJ}mS+KO`KHNOjW^MrMsV5Dv@_yuIu^P(4X5RBywD|H=o4En3r73MPE&%K4rwp))aGYmx&r}vRi;&Br z#h91tSh)bKr|kMwA&%cHRzq3XEJQL37Gz#(G#`LvpAZ(}@Xg|SQx-N0k<5YxX)7$h z!*=i9ZI6^G$ids2;tx>hl(Vp@wvDEj0X%93wc730^%d62=bodTJ9l+E59Ys42HdGz zPaUmRx_dHtl4&cE*qG`WK#ihSyWP4DSkEqB-t8Qi{{}LU<;C$VZ8tDAQ)w^*d8pN{ z1J;V=&or1WQ|o31vOIOm(snm(p*>1M30#+U_;&n6mMe?2Hb*3zB z7b(X@h_%}_+f~3?o`Z{cML0AOUrI0yr_P&y!9YU+eOWHp5yLj z?RE{YR(E-6ndbu{kFjNWoheJ(dCX routes = { login: (context) => LoginScreen(), verifyLogin: (context) => VerifyLoginScreen(), @@ -65,5 +69,6 @@ class AppRoutes { myAttendance: (context) => MyAttendanceScreen(), workFromHome: (context) => WorkFromHomeScreen(), addWorkFromHome: (context) => AddWorkFromHomeScreen(), + profile: (context) => ProfileScreen(), }; } diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index be692fe..354e0db 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -10,6 +10,7 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart'; import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; @@ -27,7 +28,7 @@ class DashboardScreen extends StatefulWidget { class _DashboardScreenState extends State { late DashboardProviderModel data; - + final GlobalKey _scaffoldState = GlobalKey(); @override void initState() { super.initState(); @@ -47,272 +48,277 @@ class _DashboardScreenState extends State { @override Widget build(BuildContext context) { List namesD = ["Nostalgia Perfume Perfume", "Al Nafoura", "AlJadi", "Nostalgia Perfume"]; - + final GlobalKey _key = GlobalKey(); // return Scaffold( - body: Column( - children: [ - Row( - children: [ - Row( - mainAxisSize: MainAxisSize.min, - children: [ - CircularAvatar( - width: 34, - height: 34, - url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", - ), - 8.width, - SvgPicture.asset("assets/images/side_nav.svg"), - ], - ).onPress(() {}), - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - //AppLogo(), - 8.width, - LocaleKeys.mohemm.tr().toText14() - ], - ), - ), - SizedBox( - width: 36, - height: 36, - child: Stack( - alignment: Alignment.centerLeft, - children: [ - SvgPicture.asset("assets/images/announcements.svg"), - Positioned( - right: 0, - top: 0, - child: Container( - padding: const EdgeInsets.only(left: 5, right: 5), - decoration: BoxDecoration(color: MyColors.redColor, borderRadius: BorderRadius.circular(17)), - child: "3".toText12(color: Colors.white), + key: _scaffoldState, + body: Column( + children: [ + Row( + children: [ + Builder(builder: (context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + CircularAvatar( + width: 34, + height: 34, + url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", ), - ) - ], + 8.width, + SvgPicture.asset("assets/images/side_nav.svg"), + ], + ).onPress(() { + _scaffoldState.currentState!.openDrawer(); + }); + }), + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + //AppLogo(), + 8.width, + LocaleKeys.mohemm.tr().toText14() + ], + ), ), - ).onPress(() { - data.update(context); - }) - ], - ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), - Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, + SizedBox( + width: 36, + height: 36, + child: Stack( + alignment: Alignment.centerLeft, children: [ - LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), - "Mahmoud Shrouf".toText24(isBold: true), - 16.height, - Row( - children: [ - Expanded( - child: AspectRatio( - aspectRatio: 159 / 159, - child: Consumer( - builder: (context, model, child) { - return (model.isAttendanceTrackingLoading - ? GetAttendanceTrackingShimmer() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ - MyColors.gradiantEndColor, - MyColors.gradiantStartColor, - ]), - ), - child: Stack( - alignment: Alignment.center, - children: [ - if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, + SvgPicture.asset("assets/images/announcements.svg"), + Positioned( + right: 0, + top: 0, + child: Container( + padding: const EdgeInsets.only(left: 5, right: 5), + decoration: BoxDecoration(color: MyColors.redColor, borderRadius: BorderRadius.circular(17)), + child: "3".toText12(color: Colors.white), + ), + ) + ], + ), + ).onPress(() { + data.update(context); + }) + ], + ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), + Expanded( + child: SingleChildScrollView( + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), + "Mahmoud Shrouf".toText24(isBold: true), + 16.height, + Row( + children: [ + Expanded( + child: AspectRatio( + aspectRatio: 159 / 159, + child: Consumer( + builder: (context, model, child) { + return (model.isAttendanceTrackingLoading + ? GetAttendanceTrackingShimmer() + : Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + child: Stack( + alignment: Alignment.center, + children: [ + if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), + if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), + if (model.isTimeRemainingInSeconds != 0) + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 9.height, + CountdownTimer( + endTime: model.endTime, + onEnd: null, + endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), + textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), + ), + LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), + 9.height, + ClipRRect( + borderRadius: BorderRadius.all( + Radius.circular(20), + ), + child: LinearProgressIndicator( + value: model.progress, + minHeight: 8, + valueColor: const AlwaysStoppedAnimation(Colors.white), + backgroundColor: const Color(0xff196D73), + ), + ), + ], + ), + ], + ).paddingOnly(top: 12, right: 15, left: 12), + ), + Row( children: [ - LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), - if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), - if (model.isTimeRemainingInSeconds != 0) - Column( + Expanded( + child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - 9.height, - CountdownTimer( - endTime: model.endTime, - onEnd: null, - endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), - textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), - ), - LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), - 9.height, - ClipRRect( - borderRadius: BorderRadius.all( - Radius.circular(20), - ), - child: LinearProgressIndicator( - value: model.progress, - minHeight: 8, - valueColor: const AlwaysStoppedAnimation(Colors.white), - backgroundColor: const Color(0xff196D73), - ), - ), + LocaleKeys.checkIn.tr().toText12(color: Colors.white), + (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) + .toString() + .toText14(color: Colors.white, isBold: true), + 4.height, ], + ).paddingOnly(left: 12), + ), + Container( + width: 45, + height: 45, + padding: const EdgeInsets.only(left: 14, right: 14), + decoration: const BoxDecoration( + color: Color(0xff259EA4), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(15), + ), ), - ], - ).paddingOnly(top: 12, right: 15, left: 12), - ), - Row( - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.checkIn.tr().toText12(color: Colors.white), - (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) - .toString() - .toText14(color: Colors.white, isBold: true), - 4.height, - ], - ).paddingOnly(left: 12), - ), - Container( - width: 45, - height: 45, - padding: const EdgeInsets.only(left: 14, right: 14), - decoration: const BoxDecoration( - color: Color(0xff259EA4), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(15), - ), + child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), ), - child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), - ), - ], - ), - ], - ), - ], - ), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.todayAttendance); - })) - .animatedSwither(); - }, + ], + ), + ], + ), + ], + ), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.todayAttendance); + })) + .animatedSwither(); + }, + ), ), ), - ), - 9.width, - Expanded( - child: MenusWidget(), - ), - ], - ), - ], - ).paddingOnly(left: 21, right: 21, top: 7), - ServicesWidget(), - 8.height, - Container( - width: double.infinity, - padding: EdgeInsets.only(top: 31), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), - border: Border.all(color: MyColors.lightGreyEDColor, width: 1), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ + 9.width, Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - LocaleKeys.offers.tr().toText12(), - Row( - children: [ - LocaleKeys.discounts.tr().toText24(isBold: true), - 6.width, - Container( - padding: const EdgeInsets.only(left: 8, right: 8), - decoration: BoxDecoration( - color: MyColors.yellowColor, - borderRadius: BorderRadius.circular(10), - ), - child: LocaleKeys.newString.tr().toText10(isBold: true)), - ], - ), - ], - ), + child: MenusWidget(), ), - LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true), ], - ).paddingOnly(left: 21, right: 21), - SizedBox( - height: 103 + 33, - child: ListView.separated( - shrinkWrap: true, - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.only(left: 21, right: 21, top: 13), - scrollDirection: Axis.horizontal, - itemBuilder: (cxt, index) { - return SizedBox( - width: 73, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 73, - height: 73, - decoration: BoxDecoration( - borderRadius: const BorderRadius.all( - Radius.circular(100), - ), - border: Border.all(color: MyColors.lightGreyEDColor, width: 1), - ), - child: ClipRRect( - borderRadius: const BorderRadius.all( - Radius.circular(50), + ), + ], + ).paddingOnly(left: 21, right: 21, top: 7), + ServicesWidget(), + 8.height, + Container( + width: double.infinity, + padding: EdgeInsets.only(top: 31), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), + border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.offers.tr().toText12(), + Row( + children: [ + LocaleKeys.discounts.tr().toText24(isBold: true), + 6.width, + Container( + padding: const EdgeInsets.only(left: 8, right: 8), + decoration: BoxDecoration( + color: MyColors.yellowColor, + borderRadius: BorderRadius.circular(10), + ), + child: LocaleKeys.newString.tr().toText10(isBold: true)), + ], + ), + ], + ), + ), + LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true), + ], + ).paddingOnly(left: 21, right: 21), + SizedBox( + height: 103 + 33, + child: ListView.separated( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.only(left: 21, right: 21, top: 13), + scrollDirection: Axis.horizontal, + itemBuilder: (cxt, index) { + return SizedBox( + width: 73, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 73, + height: 73, + decoration: BoxDecoration( + borderRadius: const BorderRadius.all( + Radius.circular(100), + ), + border: Border.all(color: MyColors.lightGreyEDColor, width: 1), ), - child: Image.network( - "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", - fit: BoxFit.cover, + child: ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(50), + ), + child: Image.network( + "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", + fit: BoxFit.cover, + ), ), ), - ), - 4.height, - Expanded( - child: namesD[6 % (index + 1)].toText12(isCenter: true, maxLine: 2), - ), - ], - ), - ); - }, - separatorBuilder: (cxt, index) => 8.width, - itemCount: 6), - ), - ], - ), - ) - ], + 4.height, + Expanded( + child: namesD[6 % (index + 1)].toText12(isCenter: true, maxLine: 2), + ), + ], + ), + ); + }, + separatorBuilder: (cxt, index) => 8.width, + itemCount: 6), + ), + ], + ), + ) + ], + ), ), - ), - ) - ], - ), - ); + ) + ], + ), + drawer: SafeArea(child: AppDrawer())); } } diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart new file mode 100644 index 0000000..4ef5eb4 --- /dev/null +++ b/lib/ui/landing/widget/app_drawer.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/ui/landing/widget/drawer_item.dart'; +import 'package:provider/provider.dart'; + +class AppDrawer extends StatefulWidget { + @override + _AppDrawerState createState() => _AppDrawerState(); +} + +class _AppDrawerState extends State { + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + child: Drawer( + child: Column(children: [ + const SizedBox( + height: 200, + ), + Expanded( + child: ListView(padding: const EdgeInsets.all(21), physics: const BouncingScrollPhysics(), children: [ + Divider(), + InkWell( + child: DrawerItem( + 'My Profile', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.profile); + }) + ])) + ]))); + } + + drawerNavigator(context, routeName) { + Navigator.of(context).pushNamed(routeName); + } +} + +String capitalizeOnlyFirstLater(String text) { + if (text.trim().isEmpty) return ""; + + return "${text[0].toUpperCase()}${text.substring(1)}"; +} diff --git a/lib/ui/landing/widget/drawer_item.dart b/lib/ui/landing/widget/drawer_item.dart new file mode 100644 index 0000000..301719b --- /dev/null +++ b/lib/ui/landing/widget/drawer_item.dart @@ -0,0 +1,59 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; + +class DrawerItem extends StatefulWidget { + final String title; + final String subTitle; + final IconData icon; + final Color color; + final dynamic assetLink; + + const DrawerItem(this.title, {required this.icon, required this.color, this.subTitle = '', this.assetLink}); + + @override + _DrawerItemState createState() => _DrawerItemState(); +} + +class _DrawerItemState extends State { + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(top: 0, bottom: 5, left: 0, right: 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.assetLink != null) + Container( + height: 20, + width: 20, + child: Image.asset(widget.assetLink), + ), + if (widget.assetLink == null) + Icon( + widget.icon, + color: widget.color ?? Colors.black87, + size: 25, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + width: MediaQuery.of(context).size.width * 0.45, + child: Text(widget.title, + style: TextStyle( + color: widget.color ?? Color(0xFF2E303A), + fontSize: 14, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + letterSpacing: -0.84, + )), + ), + ], + ), + ), + ], + )); + } +} diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart new file mode 100644 index 0000000..4431c95 --- /dev/null +++ b/lib/ui/screens/profile/profile_screen.dart @@ -0,0 +1,66 @@ +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/ui/screens/profile/widgets/header.dart'; +import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_panel.dart'; + +class ProfileScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + extendBody: true, + backgroundColor: const Color(0xffefefef), + body: Stack(children: [ + Container( + height: 300, + margin: EdgeInsets.only(top: 50), + decoration: new BoxDecoration( + image: new DecorationImage( + image: new ExactAssetImage('assets/images/user-avatar.png'), + fit: BoxFit.cover, + ), + ), + child: new BackdropFilter( + filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: new Container( + decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), + ), + )), + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: [ + SizedBox( + height: 80, + ), + Container( + padding: EdgeInsets.only(left: 15, right: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: () {}, + icon: Icon( + Icons.arrow_back_ios, + color: Colors.white, + )), + InkWell( + child: Container( + padding: EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 5), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(15), color: Colors.black.withOpacity(.3)), + child: Row(children: [ + Icon(Icons.photo, color: Colors.white), + Text( + 'Edit', + style: TextStyle(color: Colors.white, fontSize: 12), + ) + ]))), + ], + )), + HeaderPanel(), + ProfilePanle() + ]), + ) + ])); + } +} diff --git a/lib/ui/screens/profile/widgets/header.dart b/lib/ui/screens/profile/widgets/header.dart new file mode 100644 index 0000000..3a4499a --- /dev/null +++ b/lib/ui/screens/profile/widgets/header.dart @@ -0,0 +1,16 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class HeaderPanel extends StatelessWidget { + @override + Widget build(BuildContext context) { + double _width = MediaQuery.of(context).size.width; + return Container( + padding: EdgeInsets.symmetric(horizontal: _width / 10, vertical: 0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [], + )); + } +} diff --git a/lib/ui/screens/profile/widgets/profile_info.dart b/lib/ui/screens/profile/widgets/profile_info.dart new file mode 100644 index 0000000..a02b56e --- /dev/null +++ b/lib/ui/screens/profile/widgets/profile_info.dart @@ -0,0 +1,122 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class ProfileInFo extends StatelessWidget { + String data = '.'; + double sliderValue = 75; + List menu = [ + ProfileMenu(name: 'Personal information', icon: ''), + ProfileMenu(name: 'Basic Details', icon: ''), + ProfileMenu(name: 'Family Details', icon: ''), + ]; + @override + Widget build(BuildContext context) { + return Container( + child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: [ + /// card header + customLabel('Sultan khan', 22, Colors.black, true), + + customLabel('217869 | Software Developer', 14, Colors.grey, false), + + customLabel('sultan.khan@cloudsolutions.com.sa', 13, Colors.black, true), + + Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), + + customLabel('We appreciates you for completing the service of', 10, Colors.black, true), + + SizedBox(height: 10), + Container( + child: Row(mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ + Column( + children: [customLabel('Years', 14, const Color(0xff808080), true), customLabel('03', 22, Color(0xff2BB8A6), true)], + ), + Column( + children: [customLabel('Month', 14, const Color(0xff808080), true), customLabel('06', 22, Color(0xff2BB8A6), true)], + ), + Column( + children: [customLabel('Day', 14, const Color(0xff808080), true), customLabel('20', 22, Color(0xff2BB8A6), true)], + ) + ])), + + Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), + Container( + padding: EdgeInsets.only( + left: 20, + right: 20, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + customLabel('Profile Completion 75%', 18, Colors.black, true), + const SizedBox(height: 10), + Row( + children: [ + for (var i = 0; i < 4; i++) + if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef))) + ], + ), + const SizedBox(height: 10), + Text( + 'Complete Profile', + style: TextStyle(color: Color(0xff2BB8A6), fontWeight: FontWeight.bold, decoration: TextDecoration.underline), + ), + ], + )), + + /// description + Divider(height: 50, thickness: 8, color: const Color(0xffefefef)), + + Column( + children: menu.map((i) => rowItem(i, context)).toList(), + ) + ])); + } + + Widget drawSlider(color) { + return Row(children: [ + Expanded( + flex: 1, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Container( + height: 6, + width: 20, + color: color, + ), + )), + Container(height: 6, width: 3, color: Colors.white), + ]); + } + + Widget rowItem(obj, context) { + return InkWell( + onTap: () { + // Navigator.pushNamed( + // context, + // AppRoutes.addEitScreen, + // arguments: obj, + // ); + }, + child: ListTile( + leading: FlutterLogo(), + title: Text(obj.name), + trailing: Icon(Icons.arrow_forward), + ), + ); + } + + Widget customLabel(String label, double size, Color color, bool isBold, {double padding = 0.0}) => Container( + padding: EdgeInsets.all(padding), + // height: 50, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [Text(label, style: TextStyle(color: color, fontSize: size, fontWeight: isBold ? FontWeight.bold : FontWeight.normal))])); +} + +class ProfileMenu { + final String name; + final String icon; + ProfileMenu({this.name = '', this.icon = ''}); +} diff --git a/lib/ui/screens/profile/widgets/profile_panel.dart b/lib/ui/screens/profile/widgets/profile_panel.dart new file mode 100644 index 0000000..7cf73ea --- /dev/null +++ b/lib/ui/screens/profile/widgets/profile_panel.dart @@ -0,0 +1,28 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_info.dart'; + +class ProfilePanle extends StatelessWidget { + @override + Widget build(BuildContext context) { + double _width = MediaQuery.of(context).size.width; + return Container( + margin: EdgeInsets.fromLTRB(5, 0, 5, 10), + height: MediaQuery.of(context).size.height, + child: Stack(children: [ + Container( + width: _width, + margin: EdgeInsets.only(top: 50), + padding: EdgeInsets.only(top: 50), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), + boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)]), + child: ProfileInFo(), + ), + Container(height: 100, alignment: Alignment.center, child: ProfileImage()) + ])); + } + + Widget ProfileImage() => CircleAvatar(radius: 70, backgroundImage: AssetImage('assets/images/user-avatar.png')); +}