From 353cf86985023b5ea65f25783b6c00bc1ea337b5 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 25 Aug 2025 17:47:13 +0530 Subject: [PATCH] Dashboard screen changes --- images/calendar_appbar.png | Bin 0 -> 1209 bytes images/edit_profile.png | Bin 0 -> 2054 bytes images/edit_profile_drawer.png | Bin 0 -> 2084 bytes images/eye_icon.png | Bin 2417 -> 1481 bytes images/financialsBottomIcon.png | Bin 0 -> 1812 bytes images/homeBottomIcon.png | Bin 0 -> 1310 bytes images/logout_drawer.png | Bin 0 -> 1638 bytes images/notification_appbar.png | Bin 1992 -> 1937 bytes images/ordersBottomIcon.png | Bin 0 -> 1624 bytes images/plansBottomIcon.png | Bin 0 -> 1528 bytes images/profile_pic.png | Bin 0 -> 3589 bytes images/resourcesBottomIcon.png | Bin 0 -> 2276 bytes lib/common/dashboard.dart | 673 +++++++++++++++++- lib/common/settings.dart | 83 ++- lib/signup/otp_screen.dart | 4 +- lib/signup/password_textbox_screen.dart | 180 ++++- lib/signup/signup.dart | 169 ++++- lib/signup/signup_mobilenumber_screen.dart | 209 +++--- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 120 ++++ pubspec.yaml | 1 + .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 25 files changed, 1308 insertions(+), 142 deletions(-) create mode 100644 images/calendar_appbar.png create mode 100644 images/edit_profile.png create mode 100644 images/edit_profile_drawer.png create mode 100644 images/financialsBottomIcon.png create mode 100644 images/homeBottomIcon.png create mode 100644 images/logout_drawer.png create mode 100644 images/ordersBottomIcon.png create mode 100644 images/plansBottomIcon.png create mode 100644 images/profile_pic.png create mode 100644 images/resourcesBottomIcon.png diff --git a/images/calendar_appbar.png b/images/calendar_appbar.png new file mode 100644 index 0000000000000000000000000000000000000000..e8941f1d3afeface2596155bfea882798c8b5837 GIT binary patch literal 1209 zcmeAS@N?(olHy`uVBq!ia0vp^0YDtV!3HFgoC*#ADb50q$YKTt9d8h3TxvUQB~XyD zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFK(3#si(^OypeYIJoNGhQ8en zH65;1%>_+UQo}?28EhRVNw)}x+)=P)e8|E(`vB9*v~bQPX^kx`TrYpOd%7H$S@rsES(?N5?)~%u)P{L!| z^S_Vk{}u24)!*Mg|I)M>rN8A=dGc$z_*Eam((tQyDX4# zc=^#u6~807W2{0J2#9K^d^1qvV5%=I-Fj$m%+&kScJ>^LczpDW9p}db$u2hEcTTo^ zywI<`-D>U*?E)^7=1b0c@tGgzI)r`Mxg|2~vT5ENO##8}+qQ+Z+nh4g*?3TB_U38s zTqc3#hg20(OFD{gc6S{MpL^omIX~B@zRcnUn>KFzn5AGR+9*|7wn(W^iz#&8+(MN_ z^%DPcl_v1t-F2#%+5JU~`umRw%NpvA#~jyOzvS%K!|m#sud zovP2-yq*2`Ti}liYYHqE%t(%UH`hLCzjwu9C#iM(1+r(Bo1Q;^K6;DFo)@9kF;TZ~ z-MtfU=5gxj6zF{^D=%ODWJB+X#~0oQ z`5o9-bihRR>O8&NNWZIrhI5QR{n`>ClqvuFOyISRR}b!C;7fe1qgyZRZo+;i8ki|I}Y-1le+UFru|)l!4EgVz=U&)SH_2{->G{M5%;lTsr<=(j>WP< zFK&K#Exuo-w)#dvoz>H?Oa67oTzY$)LvH_*6%I#}3f~oX-Mnyqi^8TH`R50WcABeA zKXT){!}2e!D;yNH0y?-v7BPXCtk?g{OmbI72*Bhlo-<$mC;NTvV=47)7OucXCvbeb zuu_Mq@ZnS#<4Q-3RTC|_XubkgE=!O!f~69S*zHShF(P++m=(EdO3C(dmsI+b8h z!0IpWsqW;yRO;z;=G#sw91k_VTJ?EdJ$v@-oz#scnhThsWuHWU^;#-q6dWP!Ez*6o zD&*6_)T1g3*I2LmI&sal*JZmWl)qW=X8oEqbDk&)30D3oaeCLXJJ;sS+<)hm@Yp%| zi9VU)7&YblteeR;=Zuwk_pEz3MfCaR$6v}P|7U!-!L@D;bI_a_UrzAuna8mvMC;$* zzqaoV3rDUY=Wm&^x)$|F-@6oyHQVaDSDjq}4uAw*;}NFKdlvaho36HADQs(zkEl=9=>y ej>!D~k5Mb*@=T*=BCmlZ4TGnvpUXO@geCymzA3u^ literal 0 HcmV?d00001 diff --git a/images/edit_profile.png b/images/edit_profile.png new file mode 100644 index 0000000000000000000000000000000000000000..f102f29556728f34a7a27f927b015ce8727fe356 GIT binary patch literal 2054 zcmV+h2>JJkP)@~0drDELIAGL9O(c600d`2O+f$vv5yPMclk~(9hN;P9UG`LgR1=FEYy97lH-AXca=z?jxwj@a1BE?xcf|=SOYRHmE z9f~7GO{T&`M~sBjY`9&hu)+C#&v%Eh@A>ZDz5Dm>KGNkJFbDqr-uwN2@7;U9Bg)Ci zG6hN~y?RMw*JXa_b%6zcza17GM!S8RG=R>^apV^z7oZRDcn-WN33;@B; z&dwJ3HfE`p7*&8IDPRofIXkr}{h?ffBE_;s0*NsD{Ly{W0G21P_91~@%EtxZf! ztkG!TOe&EXB2)vw)v)lJ32yOjgl>o;g#ZNS0QZ=K>rRTr2W2!MHp1q~$w`?)KzR?~ z-2E#Ku60U}yYWgWy+N4)5M;U4!_U`9Z|dB$@2MKtDKP-t3?FHCH-2bwVzHoN{17+> z@EOWz~6I_+9mz`y%!LmccB3VK-vJv?b#1DDC0l_XhD)l z#Q<|)^?-70I73=xw^aA}WBv_brkM@O8G+* z!Yz|V{Qfu5#>*b<|3mcO|Chh_!8=4tl>&YCJ{v?X!7iJct-8I@wFhv}U1m#ek|w-5 zAo~8dp3&;vKu@^yNr7q$B!!otTyVL7R#OZcFNxNl_Q)?w6{7pMq%!t4CoYw7Qx;=` zFh}&ex`ENmAhiB0hz}v}-y+U-F4`f| z(XW5$XGg;zTiW=uN3~CV$AdDaZ=9wo9IvE9>vt0$`TnnW3c@t=i=Um1fE4xVH*x`) z#|E>*V}p?xphN2qDn9t}b7zsA#tj}ZmgNk8al`;@r8P=1D#QmjX2pXrNdsV-VrBSi zmkhwIe=*IiUzPZS?|0(pSURIB4`)QfJz$wqifZwJQw-=|Oa4~6xj@avHUL^a2Z)=L zLc$RL(O+U$BRM~0z&ckkxoQ31HUN)$tCT{*5Fe>%eaHElH_8;4!C*Y-f>Jl?4NLql zH^h^5OCM2Sc!JLMG=?)Xml7UOiikseT=T`ZYSyxGws{R>0;30{&Hcn7KEO3q!EOk< zfovC4rIZkt__!w!B=`=)Jz(BA;~(w{*C_?WDZa$~&seP8K?QSB?J*@Boy50594KNd zC?y;n#Rt&7h<&(}V00B9K>MP(`8kp3EIxqti8X-k;se6~e14k}Mi#^eD8GOnFiQy{ zE8?4!64e7TCO#+?cp4(udJRQnP<(?>_6hqXtKx&$4UlE=L97PIy7&MF@UTu;J-PS> z#{GbQDPnT*Z43iMIun|Ue*x;+VKVNJA|e-mgm%%aG8j6!_@hAkNDPpR?~Gvp)YYUA z$;B4~?L)mKnTtOjw-|kloSG?)}Q6#yI{C}Ybv5i3c z{kn_K?&ry1?TAY^WKbEF0up3fkM81|GzR~3$pGwzn%oOo6adjyf6@zoF5)wdaSwfPE!v0D^yD!hqX&HWlbjKZ z3WXo{s}w4z+nE$xpEIDmY$Ym6tv?(6x>Xho2c{*g*BBodM@gF&ZzBr4gLwMXolXaj z?N}j?AQjzz-5aPxt5vJ^1bdE$?8a+u@5@UUhlA(R#hw=DniF-Lm&CJNX%0Rk z23e|}L$7=S25|x9k2UNKZT?KFLHxZF%D1WF55%aM|JW_k1We20Q6#FxH?B<~qCszH zvCFxQdm|JQp>EVhi$TqNq-sHzyF?7;agf{3hABRXbP_%VJpzv{$24+7)f2Pbh~+K_ z%H;EDIVr`$v09mryJ5F>Ct|$~g`Qwm?S(PsDMBDR`}gfATe}m9xeqvCj4BH<$LH&$ kmP2zZRudai;uL+5H~OIxVY`XWW&i*H07*qoM6N<$f~=~^5dZ)H literal 0 HcmV?d00001 diff --git a/images/edit_profile_drawer.png b/images/edit_profile_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbf48240efdcf54ae873cb483197705b39fa9c3 GIT binary patch literal 2084 zcmV+<2;29GP)@~0drDELIAGL9O(c600d`2O+f$vv5yPb$XAE2_V_lFDTa@a@~T0hOe%0&d;9mGB!s3jCro z;_EFdqtD7vMPBHv0QC5)SFb*U@F|iDE1}0q=)1OeQh@ID@A*n7Vg)9OuLmxpVcyo@ z&Ye4*DEwkTR*>0^8#g-Ewx*l0=U2mJBp63P6n-_vBLVYgUYlG6u<3aggLp)J*DRy4aa%tmY)6(JV2|4b0cy+XtC6`PE+`fJL zwO;4v!uLm5_kR8Q^#xsESXS5*p@$pyM69frEUVNKK2rf~el|?M5W>gg^5x5yAw^DB ziu~}N%t{z-Z*MOtrACuarsjaVckgyBzX-#rABBGkWWgQMw)r}7-Aq53QUD9LOJ>wX zH#=ECCTtl7rZ(DdcJ{f9cE-&EY#Bu|;m-Tc(qwV^iG}GWSc|{0kSPzoCt`Yd1=8ie z4V~k@er(gJsf1m{rbpG`p{#(i+)s7xlmhreERli3!^05;Lc6@5@X*ET!89-7UPmit zncF|()d`d_DC40l3pyviCt3c^Ggy5=)3jPG?+Sq6S%A;4UAwly!t7BAx3}Izu3$gI ztCUw*!&3vvQoy3=1-^R|*3~TdA2qwZSKtz0C9IG~9AuMBKT&uD_yoP41@)Xf1bQ$c zcr?7idr*T|pa!6WJ^!$fy5t#*EH+79-V{BU-V{mDh!McTe;-2l6Lg?(Y5?L2&}PRP zxTqT_yb0z=Q~{V2i%hogLGeSMZTSOu7uf|chl|b0?|4pc5>1^n0N&z}blZSfga_yHcu#G!enldLR7==)UE?+S%FZQBANp>XBt~<~imG2@qTX2>3YI z{(haCB$y*i;+AG@cw8wk!4=>V@WCWXHKQkSqf#aIBN8Ua7VxnJHL75n3%V2-2?ZFv zt*n5zI1E1=bC**>Hfmw*obB&Ie<=%T;`SAe5S;8mUOVf-$g zLT*AyWYbA4Lyay0+o_VG=;O7CrP+W45K#cThhNy*AV|Vyqp}k8Q7fyjAHg3IKtus> z50gWX1Zj!LTqt9X#_5gxW6z=aYpG*ZVmo0SB(ZLM(0kd0d@Pbyh)Eo;am=_-QoSFD zWyWC?a1ZV4R74~CxF^yIVUpg#V+yC;*l(nF&$#Y8WKvJlmpoJ`mX8o z37OHLQSktsNQLYLMKz<(HvioOvolHK0y4;m;AJ5aZQoE$px1A0Z7ntNcx@viVptZk zuvU-(trelDAmdDGWKNe&Zwx^rPRQh;*XJwv83|oFr>LX-I*Y8Fll8tfF9`JDl;Qwx z^ZWPjr2{>s(^7m^JCUYJwUuCLDL$*6NE5Q!O4bNaWH`%K*WRK1< zERP=j8VyDe`s7`I+aecK0XS2awbTd*S?xrcBGp##y#iE_ECp-gin8Unreu;*01H=R?xzR=V~X?R7#!9Is}+f0B=a3rPAiZXSEY)Dt69MR*)y90DXL@N?M?z8O5R6 ziiymQnYj$*q0+b>WOKPYf1xuk!SGFS2}N8u>G>}4juttv zzP>(MTU&d1{rYt%tV@wx;Dls9*q^JbtN*&RFMQ@#2V#0WA|8$pNL+OE7n{CedAukZ z<*Rh)dh*l?{Yphi^sPmjO-{U-THr(OggB8i+}zw8&XV&n5{X12VfY`WFP*lNpxEXB O0000` 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 KMNUMnLSTZNyl9;O diff --git a/images/financialsBottomIcon.png b/images/financialsBottomIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2dcfcd0050ace044741369b7fe683207ce1130 GIT binary patch literal 1812 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 literal 0 HcmV?d00001 diff --git a/images/notification_appbar.png b/images/notification_appbar.png index f862a848f9b2520b764a3e61043a487811dfa0f3..a44c0e2f9d18cf5dfabd3f9d1bb7b7dc40b1e7bb 100644 GIT binary patch delta 1872 zcmV-W2e0_Z50MX$R(~c*L_t(|0qvc?Pa{VZ#~;{2V2W_UNTIr=L0}=p>C)ZOr3?H8 zkiWpBOa)Xa56Vr7{K?U}xvy9gaUVmOsvGDo%ImFi{ULWv% z?c(Ah0L!sb0MGMgrlzKRd|RQ4hnEVELlcDv@H$2@s$d~j2|yJ;IXPJwA0OX>_?6xl z>K!O%@bvVwi(-Ue304STvf}%JBJAMHZ#D>#gOpiZTwI%&m^j4BU&DV+LIPk<@bP7> zSS)^OG#WKXk$=>BfUxu1SQ%T8B50cSZfU1Z zB9ev(i3t#=^06$9lw}*J?GI?5P?; zcY#PdMg$O{Wf|ew*;y4VL6{=dNT&h@FlB;N<|lR2(+8<9FcrDgE&z?OK{38Y+aG{s zpf6Aj24*NZ05qdr01=HG2-@2ZHm%8aAzwgi#?W>egWeNW(?t7pStpZ>i$ardb0)I#w35MD|(1>mmq2!BJUDB^)ebPFJj7TO$$dqt?Y?}0|N3V;=?S_`l?4DkwSBhej_)+Ru? zTqfHnwU6y~+xi}WD`TOeh^I3{LYn}$x3|8cNX_OzTo)0Lllm&184}tAP_2YzWPc9O zfw3^-gC=zP097VL0NFuhDz*6mEdq%6h{^$HVFc76m&>Ufv9HSy=;{H!;(jv=&u!=; zGPR}t3jM$)Xh4eq*kU$h_bC+xG6p?gLQ&)g(7@0Fkomzc>&wb;($sB(kt3wV3=J&+ zCk?&TYGqCUoDa}quK4N&sdWdKEGX{x)UW z`mntq_9i{%-d{>XUw{l#DwSw~M%K!kXkr)Q_VU<0pin4OIGZpa`xxEA6iWax@!C-o z3vEn8kBUfJS8id7yI3Df0Q^AZMrW*iE1pO-EFw6k>;-5ISewy%i7Ws)UVnU9Qxpp! z!_K!CPA{N&fvB5EMA|1T_WmB=r5bwC-roR5gsZEocClEzW$Y>TqwXn=)B|YJ#c;e< zZNSq7ZRBHYF6lgm4I;o6K(zi1RXMc%t1zN4<^@z{E6QFnwg4D#Q#u)X)XXS2-a&{c zsmdXf2<%?K5`cC-sse8C@_*>yJs5E~JL`o*_JKj3QwYrpXQDxm2>XaLM;K-9?(SIS z#N#*vRXMH+iu?e)FCA|Bip!2R2P;a-56jA9(oo`2(RuMla0biL!AM~Q!rlFI@}87l4%0*u1?vlUB{ z*lN?*K@)%lq<)$zA&wJSNa}1!%3n(J+!x=HB4j@4z6U@`v8rr3-5W zAnNt{?)lQ)H@|6PUq8wRY^19UPMALWn@!gm>1>$ z4s#G_l2|RkYsBeyKE5sYu1AZ?{sdxOmhzaAJQ&X5a5x-}IQ$2@*7=5bz`ZX30000< KMNUMnLSTZekZFMc delta 1928 zcmV;32Y2|956BOYR)1YdL_t(|0qvc=cH1@-$M2=&gjRZ5#&*uhR^|!fY~3Pn-Re9+ z(kHMpX0knXj6HU;@&t*uc8apKQs&Yl#(#$NBB5{f3NjcZ$x$C1 z$4LPq0-)8Ug5IDfT;;!l=}3SfGF+P(?X7y4v)>p&7COLvka z8G<7?A%N9_pF{@R0OMya2+@L?iK69oz~DIqxK2NYPz4BG`e!{1JMTxM^8wUIZ36IG zABNxkMg_l{8-LY`;h%{l!eS>1uV4FnL_iJH(gji3$AInUg@LUfZXZ~>R!5gqxd3_L zw_Z~1i@_yo5}{H7W-5F>wr6Z0Mlxy2`|X5Nyf1ZO3o*2^IG-m_AJ5=El%)m{DidJJ z!si9N2ibV{qOkQp?=}gNav`=ZPue6@EJ7s$h#HEm*MB7npBMH{a&oi_28fn#Jt`#x zg8{JdT3OMjp^{NhG1~cAFE^tapFT)VPx@ep(fQdRy#DdR4K@UTaH{u8JPGO~Y#i;HBK z@h3^P5LobGG&<{p1+3YC=;rdFy!)XIl&nQVy?=j(P$Oc99JCKXZVwWgi`=nc3#`}x zG4fIM{Yc~dnhT#(6zYy5TfRYL0Xs$*VO^17m>j?Bfg=<{UwQ53yK@$>Bmm0SVNhA) z>R?ZrYH8)xxB$@#ZJ?{h*J-N{u0iWfiX4$}4ls=Q7LX}w3WHZJ^!?u=Yyn?sl@XY4 z1%KuRV5}=mSAEGkVeE|}!(A|pc>x0aL7I+1t$VOiGF9aWn$QB^jx;?L&Qp%Epr{;~ z@x5ysqo5z<$sdQ{EF;B43u7>h-Nm>GRI$l1EpciDI9_Aif3Ej9CHN<5-%`P+Gg3fPcZMJVQGMgP0Xy%&K>?H4c+kl2!>PFAdBJ z5MV4#M|KFVgMoZ5z|4Ab8@2(e+R=b6NI6h&xdkA~R|{QUh`Ru3uUZDf7z|=o0H#>zXbpc<;fTq-_-~PTY$=I00%BF#9dH4qkm!~ zbgc`9FegC31K%Vt)&K*10rsWIEbW3J%n87ho)CR#3{2itGBjofj0lkXfhr7e22JSy za{|S)B6LmJ0Yfc7={1%#;oOD`3Qujhy$afozyM|hXyHR?I)hixIPgH4%-|O=z{~=O z?uRK1aDbJ&pU;fSW*O>+W^VyOYkymrC;iww0rF>744Y>U-k4ngRXi?(gC>mszoqb$ zlN;jzHfC)FGYO#Oh8_exXey}Vwmw@cm^wg1FZLIQ$;rDr&|spa6}~}ZEqG)477(;I zbb>IT`RpmuXKDpgwE!{l$-{bNZ|y_~(yWvSVY)ZX@dnei0BoxRoip~V>3@aKDY_PQ zE5NpHF#1=N79cmg>JTJqmOYpk^56|c2os+dP}!8ERG4ZJ`@63^;R^9_a{6x{<^&!i z94>Y~fHI~SyJcgFO9>!if9XTyxx~olSC}(IOmU~vrI)cJTUhpx5A7}}_Xtz0`Ebba z!n~q4s@p6ROQvrFS~^CC?SIXK;k}A{m6WLrG8bwKG|>`3L_Vq(+{CbRVHf6|EZxor z84`p+)@ucAolKCjP3rpg!zZ5v!FPHwy(;j*9EBpuRWL1bYJn_(bmv& zVbp8^4cgCj1qN?)vgrxX$SuX139zS=O=~eOUyxdOZQ3z)e$iis*MDjOVnIqwuoS~D zPk!cTiOFc`0~O5E;wHUs*@bMpQ~nMaaXa7E zO!{Y{{zT)z{hy-#WhxOaf-?P&-YO(>Q=zGb6Fp1#ti{<$!j#f^mBth`aJAE zyRju%M+g(Taej5}x2baS>qKtw4UAQ&1h(hOvau5aa7O26FMl+y6EOfU{NtHpyG-GX z0G!eJ`5$5D#@piV8Pgj*++aVU!rumma7qA9>09r#Fn>FrDV&*zO+p-l8E{uX9*J4n zAzzfM diff --git a/images/ordersBottomIcon.png b/images/ordersBottomIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9cdf35f7d2f0278d1468353ad93f3f25a66345 GIT binary patch literal 1624 zcmb7_`#al*9>>3lRK;ZtDQzb-L0l4~x2b!Hm|GeZbS{ZSb)AluRaH=ASxQrvWLcA? ziW6EnCvHs?6UW&nV5*n5L&eFTyn2+AM_;en=~5t^L^^11&> ze*lnijJ6VY0l==s5Q2Xc9kf_UC96M%F>==eFi!%m>W#u77XgR9B`71vCgtmJh6kwZ z!oxeq9Sm~86>w<<(wF(K(#9t(hn%KkhMv(`@s|ps_r}Mp+2oa5_jAqx`wJ8Q*4tu+ zpz4?pDY+%g6j(*gS=8Z zV_s)H)k6EU_`256Sw;#H7BbV9(<+mqH&r;;NR0@kJ>w{pfx~z!U0M zXylEWv_Y7bVt2h+KQ62`ULABA3mx4TwI-jh6CSIEG%(Tl%8B+lVav>T!=q3pETMWa zO8jF$z&G4{mp2G6%tM$L6q%3NqC8dJt&Y}0@6BZ_IOzv8*ahFpcQl^QzGfa%c?)+? zw#r3k&U#j?Sv4L>k+Lw-1~?&c@^{#U>vGY;%hVhg#tB+-!1*g+WWpkIwsruEn2IF2 ztzlI8zPB?edt%F_k!Y0VRl}YjzMS*UYEz(%$RzmIAV$r+Y!jVSsL!YUjly=PvMaf# zY-sFJx^PIK3>$=VWvvpAQUML=7j3eFO=T-X51ERDh21~4%E_fSX&7L4YMaN)ad)U2 zxXtJFb4O_AUIzF4;k0pHV?Dqkg!G-$&9IrF};9iK)Z=G2?O@0EI$n6&qJk(F)3V z!ME&FV389TW~MQSulF1_{;s9m4nPgZJSzSSSyM7@;1}E~v||5<53nfTD++DCZ~#za zS!bPU1YlUR6@3R_0n|isom0&S7`8$kL)(0T10)JMIAP|&df8-&UbyZv!d5JNQopX> zxNBCc4oXIP@8bhI*Zse=e5CobBF8L~EeV)KSD!#6y!zqV@bdb=17?qK{-~5j&&{3p z6ua{ItW?}JTAE!tg}&|C>oT=*$DgUi*T1m2-erUAjxA3mbhsbl7DcM|myVU{e zFQG#bNbmdnnP}OkOW2}bF)2r;FLxOE#9Q? z(Qe{yS~1I2Nyona=v`#2uA6tcV&tdaUUcJ$k_^KzbhjyYR><} z&g2bIXY>uyvxPKEyE~``<($0=;n-J}=4@=5gBoTmSyv9L*PIZpI(@r;E7-K%uQ}Fk5mk QcjplRA%P@96Q0KW3z)6rxBvhE literal 0 HcmV?d00001 diff --git a/images/plansBottomIcon.png b/images/plansBottomIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..35f15847b78292e714c2d55976a54de6d2f06a20 GIT binary patch literal 1528 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 literal 0 HcmV?d00001 diff --git a/images/resourcesBottomIcon.png b/images/resourcesBottomIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..cb203730ff0c6a6aaeeef7f5d770d5efb706ebd0 GIT binary patch literal 2276 zcmV@~0drDELIAGL9O(c600d`2O+f$vv5yPyI+f%mrM)$8X?b#^KY)7*=mo3l$?%6 zhtxnR;2=){2z*m^z53cGx+WAzt-dyR;NBY4JHQgDL^vJ&*%u)Cc|ZI+H0YWrL>~$Q z#ebpswh5Ln7GWWPD)f!K4GM8sq!1dcy?{m{&~UI!0b(K{mfj9qutlIr3TMb8Cb-*JfFv4ZnZXL+aSoz&fD~dU={OYWGEl)qO^AtQutdP&;HmC= z-}9!B7dXM|zE&0&P0NBM0*?8=Xb-r$%FjAUIJbB#B0$28=4m1_&h5MiEbGW+euxKH zWH=ftFy)?jL~2*I3&imNyz^FRR{IKGl3V_^%VniS(8L3l&3EyLl@>uC4_G$;$0Jr+ z1X#F1%F4GMy5b^;+!m2pQK0^ce_v@4yqeg9a`uK8` zv&9q6tsaXANvs7yej;GFQ}?xaG$IJSsW(@u1v!E7YHgC0Qh~mgIskJx3gf;Hf`OHt z{N@F5p!-&VEbUr=3(Go^lpPIH_b{6E`Wj`$?SUmoRP_Dyak$xn#J0H&O9bEdC+PX3 zvG>8Z9Vf`$)6uvE!Te-S!xu%{Fd)N?HH1BhCSjakYV&yuWbGhHfVgeoIBYxjWH=sB z1~!xkA>eI$f8Sc~yGz;D39#nL0hG%Unbo8`h82J<0F+W|>x4J$ zKL$AX=aOS&1h%2wZVzBZFkY;6I{Sx96#}mvwxJjb8Gci(nCT(l(A0%u=ZF~&LEQoc z09`!7re`*_+k%EBa>-(IE+AiKI02l{wTd2sH1UY<;sIH)Vq#HR``52u(YBW@6+kme zn`}f$W89VWEOHdmL!VNTF|HXVo12@Hw3*&EI6FJrx|z=h=oNUeXd`^CdvbSGjDm`a zii(PIVP#_0(H{<5o|MngAKpTE^lA){&_IRQCc@u)VqQ7wiBA{zi8@L&NF4So<>IuWq z7+1keGn6U7cjq_g5x`hSL@&)hkU-IOnqbizev8}A-Xua38$Q|G1R$tKpb)?mA~E&S zl{!tV;b=HMJ7QZFDFuiz8JZTUmk$>tjA|i02w7*HPJ7pO_>}52C0TyA+m3(q95w=g*4@ussnetvAz@5iOlonb5KaH=EDIwTY zh_s{;AjX9{O_^NT#zRvIvIs!9P^T$#JRueWxK@(^krnhTi%Y_VI!#uBI&@Ma^OZqt zhT2HXDtn!#%sX}NGQ=?$vW~&HI;YGyu#A6d&*6OnDB;!;E?Jdp=m~WOrgz= yX6@g2`KbsqnS)7@nHw>yT&Jm`qN1Y0P5uK##-r_Qu;fwz0000 { + int _currentIndex = 0; + final ImagePicker _picker = ImagePicker(); + final storage = FlutterSecureStorage( + aOptions: AndroidOptions( + resetOnError: true, + encryptedSharedPreferences: true, + ), + ); + final GlobalKey _scaffoldKey = GlobalKey(); + + // Define a list of widgets for each screen + final List _screens = [ + HomeScreen(), + HomeScreen(), + HomeScreen(), + HomeScreen(), + HomeScreen(), + ]; + // List of bottom navigation bar items + final List _bottomNavItems = [ + BottomNavigationBarItem( + icon:Padding( + padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing + child:ImageIcon(AssetImage('images/homeBottomIcon.png')),), + // Replace with your image path + + label: "Home", + ), + BottomNavigationBarItem( + icon: Padding( + padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing + child: ImageIcon(AssetImage('images/ordersBottomIcon.png')), + ), + + label: "Orders", + ), + BottomNavigationBarItem( + icon: Padding( + padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing + child: ImageIcon(AssetImage('images/plansBottomIcon.png')), + ), // Replace with your image path + + label: "Plans", + ), + + + BottomNavigationBarItem( + icon: Padding( + padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing + child:ImageIcon(AssetImage('images/resourcesBottomIcon.png')),), + + // Replace with your image path + + label: "Resources", + ), + BottomNavigationBarItem( + icon:Padding( + padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing + child:ImageIcon(AssetImage('images/financialsBottomIcon.png')),), + // Replace with your image path + + label: "Financials", + ), + + + ]; + + void _onItemTapped(int index) { + setState(() { + _currentIndex = index; + }); + } + + Future pickImageFromGallery() async { + try { + final image = await _picker.pickImage(source: ImageSource.gallery); + if (image == null) return; + final imageTemp = File(image.path); + + AppSettings.preLoaderDialog(context); + bool isOnline = await AppSettings.internetConnectivity(); + if(isOnline) { + var res = await AppSettings.uploadrofileImageHTTPNew(image); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + AppSettings.profilePictureUrl = jsonDecode(res)['picture']; + }); + AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING'); + } + else{ + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longFailedToast('Please check interent'); + } + } on PlatformException catch (e) { + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longFailedToast('Failed to pick image: $e'); + } + } + + Future takeImageFromCamera() async { + try { + final image = await _picker.pickImage(source: ImageSource.camera); + if (image == null) return; + final imageTemp = File(image.path); + AppSettings.preLoaderDialog(context); + + + bool isOnline = await AppSettings.internetConnectivity(); + if(isOnline){ + var res = await AppSettings.uploadrofileImageHTTPNew(image); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + AppSettings.profilePictureUrl = jsonDecode(res)['picture']; + }); + AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING'); + } + else{ + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longFailedToast('Please check interent'); + } + + + } on PlatformException catch (e) { + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longFailedToast('Failed to pick image: $e'); + } + } + + showLogoutAlertDialog(context) { + return showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return AlertDialog( + backgroundColor: Color(0XFFFFFFFF),// Set your desired background color + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), // Optional: Rounded corners + ), + title: Center(child: Text('Logout?',style:fontTextStyle(16,Color(0XFF101214),FontWeight.w700)),), + actions: [ + Center( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.of(context).pop(); + }, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Color(0XFFFFFFFF), + border: Border.all( + width: 1, + color: Color(0XFF1D7AFC)), + borderRadius: BorderRadius.circular( + 12, + )), + alignment: Alignment.center, + child: Visibility( + visible: true, + child: Padding( + padding: EdgeInsets.fromLTRB(16,12,16,12), + child: Text( + 'Cancel', + style: fontTextStyle( + 12, + Color(0XFF1D7AFC), + FontWeight.w600)), + ), + ), + ), + ),), + SizedBox(width:MediaQuery.of(context).size.width * .016,), + Expanded(child: GestureDetector( + onTap: ()async{ + await storage.deleteAll(); + await Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false, + ); + }, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Color(0XFFE2483D), + border: Border.all( + width: 1, + color: Color(0XFFE2483D)), + borderRadius: BorderRadius.circular( + 12, + )), + alignment: Alignment.center, + child: Visibility( + visible: true, + child: Padding( + padding: EdgeInsets.fromLTRB(16,12,16,12), + child: Text( + 'Logout', + style: fontTextStyle( + 12, + Color(0XFFFFFFFF), + FontWeight.w600)), + ), + ), + ) + ),) + + + ], + ), + ), + ]); + }); + }); + } + + @override Widget build(BuildContext context) { - return Scaffold( - appBar:AppSettings.appBar('Dashboard'), + return WillPopScope( + onWillPop: () async { + if (_scaffoldKey.currentState?.isDrawerOpen ?? false) { + // If the drawer is open, close it + _scaffoldKey.currentState?.openEndDrawer(); + return false; // Prevent the default back action (exit the app) + } + else if (_currentIndex == 2) { + final shouldPop = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Color(0XFFFFFFFF),// Set your desired background color + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), // Optional: Rounded corners + ), + title: Center(child: Text('Do you want to exit app?',style:fontTextStyle(16,Color(0XFF101214),FontWeight.w700)),), + actionsAlignment: MainAxisAlignment.spaceBetween, + actions: [ + Center( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Expanded(child: GestureDetector( + onTap: (){ + Navigator.of(context).pop(false); + }, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Color(0XFFFFFFFF), + border: Border.all( + width: 1, + color: Color(0XFF1D7AFC)), + borderRadius: BorderRadius.circular( + 12, + )), + alignment: Alignment.center, + child: Visibility( + visible: true, + child: Padding( + padding: EdgeInsets.fromLTRB(16,12,16,12), + child: Text( + 'Cancel', + style: fontTextStyle( + 12, + Color(0XFF1D7AFC), + FontWeight.w600)), + ), + ), + ), + ),), + SizedBox(width:MediaQuery.of(context).size.width * .016,), + Expanded(child: GestureDetector( + onTap: ()async{ + SystemNavigator.pop(); + }, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Color(0XFF1D7AFC), + border: Border.all( + width: 1, + color: Color(0XFF1D7AFC)), + borderRadius: BorderRadius.circular( + 12, + )), + alignment: Alignment.center, + child: Visibility( + visible: true, + child: Padding( + padding: EdgeInsets.fromLTRB(16,12,16,12), + child: Text( + 'Confirm', + style: fontTextStyle( + 12, + Color(0XFFFFFFFF), + FontWeight.w600)), + ), + ), + ) + ),) + + + ], + ), + ), + ], + ); + }, + ); + return shouldPop!; + } + else { + setState(() { + _currentIndex = 2; + }); + return false; + } + }, + child: Scaffold( + key: _scaffoldKey, + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + scrolledUnderElevation: 0, + title: Text(_currentIndex==2?'Aquinto':_currentIndex==0?'History':_currentIndex==1?'Usage':_currentIndex==3?'Water Levels':'Resources',style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w500),), + iconTheme: IconThemeData(color: Color(0XFF2A2A2A)), + actions: [ + Row( + children: [ + Padding(padding: EdgeInsets.fromLTRB(10,10,0,10), + child: IconButton( + icon: Image( + image: AssetImage('images/calendar_appbar.png') + + ), + onPressed: (){ + }, + ), + ), + + Padding(padding: EdgeInsets.fromLTRB(0,10,10,10), + child: IconButton( + icon: Image.asset( + 'images/notification_appbar.png', // Example URL image + ), + onPressed: (){ + + }, + ), + ) + ], + ) + ], + leading: IconButton( + icon: Icon(Icons.menu), + onPressed: () { + _scaffoldKey.currentState?.openDrawer(); + }, + ), + ), + + drawer: Drawer( + width: MediaQuery.of(context).size.width, + backgroundColor: Colors.white, + child: Padding( + padding: EdgeInsets.all(8), + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox(height:MediaQuery.of(context).size.height * .05,), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + /* GestureDetector( + onTap: (){ + Navigator.of(context).pop(true); + }, + child: Image.asset('images/appbar_backbutton.png',height: 25,width: 25,color: Color(0XFF2A2A2A),), + ),*/ + SizedBox(width:MediaQuery.of(context).size.width * .04,), + Text( + 'Menu', + style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w500), + ), + ], + ), + SizedBox(height:MediaQuery.of(context).size.height * .016,), + Padding( padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + /*CircleAvatar( + radius: 50, // Adjust the size of the circle + backgroundColor: Colors.grey[200], + backgroundImage:AppSettings.profilePictureUrl != + '' && + AppSettings.profilePictureUrl != + 'null'?NetworkImage(AppSettings + .profilePictureUrl) as ImageProvider: AssetImage('images/profile_pic.png',), // Your profile image + ),*/ + AppSettings.loginType.toString().toLowerCase()=='user'? + GestureDetector( + onTap: () { + /*Navigator.push( + context, + new MaterialPageRoute( + builder: (__) => new ImageZoomPage( + imageName: 'Profile', + imageDetails: AppSettings.profilePictureUrl)));*/ + }, + child: Stack( + alignment: Alignment.center, // Centers the stack's children + children: [ + + // CircleAvatar background + ClipOval( + child: Container( + height: 100, // Ensure the container's height is the same as the profile image + width: 100, + + decoration: BoxDecoration( + color: Colors.transparent, + shape: BoxShape.circle, // Makes the container circular + image: DecorationImage( + image: (AppSettings.profilePictureUrl != + '' && + AppSettings.profilePictureUrl != + 'null') + ? NetworkImage(AppSettings.profilePictureUrl) + as ImageProvider + : AssetImage( + "images/profile_pic.png"), // picked file + fit: BoxFit.cover)), + ), + ), + // Positioned image on top of CircleAvatar + Positioned( + bottom: 0, // Adjust position as needed + right: 0, // Adjust position as needed + child: Container( + width: 30, + height: 30, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + blurRadius: 4, + offset: Offset(0, 2), // Shadow to make the edit icon pop + ), + ], + shape: BoxShape.circle, + color: Colors.white, // Background for the overlay + ), + + child: GestureDetector( + onTap: (){ + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCamera(); + Navigator.pop(context); + }, + ), + SizedBox( + width: MediaQuery.of(context) + .size + .width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGallery(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); + }, + child: Image.asset( + 'images/edit_profile.png', // Ensure the image path is correct + fit: BoxFit.cover, + ), + ), + ), + ), + ], + ), + + ):ClipOval( + child: Container( + height: 100, // Ensure the container's height is the same as the profile image + width: 100, + + decoration: BoxDecoration( + color: Colors.transparent, + shape: BoxShape.circle, // Makes the container circular + image: DecorationImage( + image: (AssetImage( + "images/profile_pic.png")), // picked file + fit: BoxFit.contain)), + ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .016,), + Text( + AppSettings.userName, + style: fontTextStyle(20,Color(0XFF2A2A2A),FontWeight.w500), + ), + Visibility( + visible:AppSettings.loginType.toString().toLowerCase()=='user', + child: Text( + AppSettings.email, + style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), + ),), + Text( + AppSettings.phoneNumber, + style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), + ), + ], + ),), + SizedBox(height:MediaQuery.of(context).size.height * .024,), + + ListTile( + title: Row( + children: [ + Image( + image: const AssetImage('images/logout_drawer.png'), + height: 25, + width: 25, + fit: BoxFit.fill), + SizedBox(width:MediaQuery.of(context).size.width * .04,), + Text('Logout', style: fontTextStyle(16,Color(0XFFE2483D),FontWeight.w400),), + ], + ), + onTap: () { + showLogoutAlertDialog(context); + }, + ), + + + + ], + ), + ), + ) + + ), + body: + _screens[_currentIndex], + /*_body(),,*/ + bottomNavigationBar: Padding( + padding:EdgeInsets.fromLTRB(0, 0, 0, 0) , + child: BottomNavigationBar( + backgroundColor: Color(0XFFFFFFFF), + items: _bottomNavItems, + selectedItemColor: primaryColor, // Color of selected icon and text + unselectedItemColor: Color(0XFF939495), // Color of unselected icon and text + selectedLabelStyle: fontTextStyleHeight(10,primaryColor,FontWeight.w400,MediaQuery.of(context).size.height * .0032,), + unselectedLabelStyle: fontTextStyleHeight(10,Color(0XFF939495),FontWeight.w400,MediaQuery.of(context).size.height * .0032,), + currentIndex: _currentIndex, + onTap: _onItemTapped, + /*onTap: (index) { + switch (index) { + case 0: + Navigator.push( + context, + MaterialPageRoute(builder: (context) => Resources()), + ); + break; + case 1: + Navigator.push( + context, + MaterialPageRoute(builder: (context) => TankLevels()), + ); + break; + + case 3: + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => Consumption()), + ); + break; + case 4: + Navigator.push( + context, + MaterialPageRoute(builder: (context) => SupplierManagementDashboard()), + ); + break; + } + },*/ + type: BottomNavigationBarType + .fixed, // Ensures all 6 items are visible + ), + ) + )); + } +} + + + +class HomeScreen extends StatefulWidget { + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + + + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + "Hello! Welcome to ${AppSettings.buildingName}", + style: fontTextStyle(16,Color(0XFF2A2A2A),FontWeight.w600), + ), + SizedBox(height:MediaQuery.of(context).size.height * .03,), + + ], + ) + ), ); } } + + +// Screens for each bottom navigation item diff --git a/lib/common/settings.dart b/lib/common/settings.dart index 482a55e..1ef0b27 100644 --- a/lib/common/settings.dart +++ b/lib/common/settings.dart @@ -22,6 +22,28 @@ TextStyle fontTextStyle(double fontSize,Color fontColor,FontWeight weight) { ); } +TextStyle fontTextStyleHeight(double fontSize,Color fontColor,FontWeight weight,double height) { + return GoogleFonts.inter( + textStyle: TextStyle( + fontSize: fontSize, + fontWeight: weight, + color:fontColor, + height: height + ), + ); +} + +TextStyle fontTextStyleUnderline(double fontSize,Color fontColor,FontWeight weight) { + return GoogleFonts.inter( + textStyle: TextStyle( + fontSize: fontSize, + fontWeight: weight, + color:fontColor, + decoration: TextDecoration.underline, + ), + ); +} + InputDecoration textFormFieldDecoration(IconData icon,var text){ return InputDecoration( counterText: '', @@ -51,6 +73,36 @@ InputDecoration textFormFieldDecoration(IconData icon,var text){ ); } +InputDecoration textFormFieldDecorationHintText(IconData icon,var text){ + return InputDecoration( + counterText: '', + filled: false, + fillColor: Colors.white, + /*prefixIcon: Icon( + icon, + color: Colors.white, + ),*/ + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(15.0), + borderSide: BorderSide(color: greyColor, + width: 1, )), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(15.0), + borderSide: BorderSide(color: Color(0XFF8270DB),width: 2,), + ), + + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(15.0), + borderSide: BorderSide(color: greyColor), + ), + hintText: text, + hintStyle:fontTextStyle(14,Color(0XFF7E7F80),FontWeight.w400), + /* TextStyle(color: greyColor, fontWeight: FontWeight.bold //<-- SEE HERE + ),*/ + ); +} + + TextStyle PreloaderText() { return TextStyle(color:primaryColor); } @@ -76,13 +128,15 @@ class AppSettings{ static String customerIdsign = ''; static String profileImage = ''; static String preloadText = 'Please wait'; - + static String profilePictureUrl = ''; static String host = 'http://armintaaqua.com:3000/api/'; static String loginUrl = host + 'supplierlogin'; + static String signUpUrl = host + 'suppliers'; static String forgotPasswordUrl = host + 'forgotpassword'; static String resetTokenUrl = host + 'reset_token'; static String verifyPhnUrl = host + 'phone'; + static String uploadPicUrl = host + 'uploads-user'; // Shared preferences save,get and clear data @@ -181,6 +235,24 @@ class AppSettings{ } } + static Future signUp(payload) async { + var response = await http.post(Uri.parse(signUpUrl), + body: json.encode(payload), + headers: {'Content-type': 'application/json'}); + + if (response.statusCode == 200) { + try { + var _response = json.decode(response.body); + return true; + } catch (e) { + // display error toast + return false; + } + } else { + return false; + } + } + static Future resetToken() async { var uri = Uri.parse(resetTokenUrl + '/' + customerId); @@ -259,6 +331,15 @@ class AppSettings{ } } + static Future uploadrofileImageHTTPNew(file) async { + var request = http.MultipartRequest( + 'POST', Uri.parse(uploadPicUrl + '/' + customerId)); + request.files.add(await http.MultipartFile.fromPath('picture', file.path)); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + /*Apis ends here*/ diff --git a/lib/signup/otp_screen.dart b/lib/signup/otp_screen.dart index 3f6f7c7..740873d 100644 --- a/lib/signup/otp_screen.dart +++ b/lib/signup/otp_screen.dart @@ -84,7 +84,7 @@ class _OtpscreenState extends State { return SizedBox( width: 50, child: TextFormField( - cursorColor:Color(0XFF1D7AFC), + cursorColor:primaryColor, controller: _controllers[index], focusNode: index == 0 ? _focusNode : null, maxLength: 1, @@ -140,7 +140,7 @@ class _OtpscreenState extends State { Navigator.push( context, new MaterialPageRoute( - builder: (__) => new PasswordTextBoxesScreen())); + builder: (__) => new PasswordTextBoxesScreen(mobileNumber: widget.mobileNumber,))); /* await Navigator.push( context, MaterialPageRoute( diff --git a/lib/signup/password_textbox_screen.dart b/lib/signup/password_textbox_screen.dart index ab7120a..20c1a43 100644 --- a/lib/signup/password_textbox_screen.dart +++ b/lib/signup/password_textbox_screen.dart @@ -1,15 +1,191 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:supplier_new/common/settings.dart'; +import 'package:supplier_new/signup/signup.dart'; class PasswordTextBoxesScreen extends StatefulWidget { - const PasswordTextBoxesScreen({super.key}); + var mobileNumber; + PasswordTextBoxesScreen({ + this.mobileNumber + }); @override State createState() => _PasswordTextBoxesScreenState(); } class _PasswordTextBoxesScreenState extends State { + TextEditingController reEnterPasswordController = TextEditingController(); + TextEditingController createPasswordController = TextEditingController(); + bool isObscureText=true; + bool isObscureTextForReEnter=true; + @override Widget build(BuildContext context) { - return const Placeholder(); + + return Scaffold( + backgroundColor: Colors.white, + body: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24), + child: Column( + children: [ + SizedBox(height: MediaQuery.of(context).size.height * .2), + Center( + child: Text("AQUICK SUPPLIER", + style: fontTextStyle(20, Color(0XFF515253), FontWeight.w800)), + ), + SizedBox(height: MediaQuery.of(context).size.height * .05), + CircleAvatar(radius: 80, backgroundColor: Color(0XFFF3F1FB)), + SizedBox(height: MediaQuery.of(context).size.height * .05), + Center( + child: Text( + "Welcome to Aquick Supplier", + style: fontTextStyle(20, Color(0XFF343637), FontWeight.w700), + ), + ), + SizedBox(height: MediaQuery.of(context).size.height * .004), + Center( + child: Text( + "Sign up to be listed as a supplier, start deliveries and track orders", + style: fontTextStyle(12, Color(0XFF7E7F80), FontWeight.w400), + textAlign: TextAlign.center, // Keeps text centered in multiple lines + ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .016,), + Container( + child: TextFormField( + cursorColor:Color(0XFF8270DB), + obscureText: isObscureText, + obscuringCharacter: '*', + controller: createPasswordController, + decoration: InputDecoration( + filled: false, + fillColor: Colors.white, + labelText: 'Create Password', + //prefixIcon: const Icon(Icons.lock, color: Colors.white,), + labelStyle: fontTextStyle(14,Color(0XFF7E7F80),FontWeight.w400), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(4.0), + borderSide: BorderSide(color: greyColor, + width: 1, )), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(4.0), + borderSide: BorderSide(color: Color(0XFF8270DB),width: 2,), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(4.0), + borderSide: BorderSide(color: greyColor), + ), + + suffixIcon: IconButton( + icon: isObscureText==true?Image.asset('images/eye_icon.png',color: Color(0XFF7E7F80),width: 16,height: 16,):Image.asset('images/open_eye.png',color:Color(0XFF7E7F80),width: 16,height: 16,), + /* Icon( + icon:Image.asset('assets/your_image.png'), + color: isObscureText==true?greyColor:primaryColor, + ),*/ + onPressed: () { + + print("show password"); + setState(() { + isObscureText = !isObscureText; + }); + }, + ), + + ), + style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), + + ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .012,), + Container( + child: TextFormField( + cursorColor:Color(0XFF8270DB), + obscureText: isObscureTextForReEnter, + obscuringCharacter: '*', + controller: reEnterPasswordController, + decoration: InputDecoration( + filled: false, + fillColor: Colors.white, + labelText: 'Re Enter Password', + //prefixIcon: const Icon(Icons.lock, color: Colors.white,), + labelStyle: fontTextStyle(14,Color(0XFF7E7F80),FontWeight.w400), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(4.0), + borderSide: BorderSide(color: greyColor, + width: 1, )), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(4.0), + borderSide: BorderSide(color: Color(0XFF8270DB),width: 2,), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(4.0), + borderSide: BorderSide(color: greyColor), + ), + + suffixIcon: IconButton( + icon: isObscureTextForReEnter==true?Image.asset('images/eye_icon.png',color: Color(0XFF7E7F80),width: 16,height: 16,):Image.asset('images/open_eye.png',color:Color(0XFF7E7F80),width: 16,height: 16,), + /* Icon( + icon:Image.asset('assets/your_image.png'), + color: isObscureText==true?greyColor:primaryColor, + ),*/ + onPressed: () { + + print("show password"); + setState(() { + isObscureTextForReEnter = !isObscureTextForReEnter; + }); + }, + ), + + ), + style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), + + ), + ), + SizedBox(height: MediaQuery.of(context).size.height * .04), + Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * .06, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + backgroundColor: primaryColor, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(24.0), // Customize the radius + ), + ), + onPressed: () async{ + String createPassword = createPasswordController.text.trim(); + String reEnterPassword = reEnterPasswordController.text.trim(); + if (createPassword.isEmpty || reEnterPassword.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Please fill both password fields")), + ); + } else if (createPassword != reEnterPassword) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Passwords do not match")), + ); + } else { + // ✅ Passwords match → navigate to next page + Navigator.push( + context, + MaterialPageRoute(builder: (context) => SignUp(mobileNumber: widget.mobileNumber,password: createPasswordController.text,)), // replace with your next page + ); + } + }, + child: Text( + 'Login', + style: fontTextStyle(14, Color(0XFFFFFFFF), FontWeight.w600), + ), + )), + SizedBox(height: MediaQuery.of(context).size.height * .012), + ], + ), + ), + ) + ); } } + diff --git a/lib/signup/signup.dart b/lib/signup/signup.dart index 84f6a09..2ca8694 100644 --- a/lib/signup/signup.dart +++ b/lib/signup/signup.dart @@ -1,16 +1,50 @@ import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:supplier_new/signup/verification_screen.dart'; import '../common/settings.dart'; class SignUp extends StatefulWidget { - const SignUp({super.key}); + var mobileNumber; + var password; + SignUp({ + this.mobileNumber,this.password + }); @override State createState() => _SignUpState(); } class _SignUpState extends State { + final TextEditingController businessNameController = TextEditingController(); + final TextEditingController registrationNumberController = TextEditingController(); + final TextEditingController yearsInBusinessController = TextEditingController(); + final TextEditingController contactNameController = TextEditingController(); + final TextEditingController positionController = TextEditingController(); + final TextEditingController mobileNumberController = TextEditingController(); + final TextEditingController additionalMobileController = TextEditingController(); + final TextEditingController emailController = TextEditingController(); + final TextEditingController addressLine1Controller = TextEditingController(); + final TextEditingController addressLine2Controller = TextEditingController(); + final TextEditingController cityController = TextEditingController(); + final TextEditingController stateController = TextEditingController(); + final TextEditingController zipController = TextEditingController(); + + final storage = FlutterSecureStorage( + aOptions: AndroidOptions( + resetOnError: true, + encryptedSharedPreferences: true, + ), + ); + + + @override + void initState() { + super.initState(); + mobileNumberController.text = widget.mobileNumber ?? ''; + } + @override Widget build(BuildContext context) { return Scaffold( @@ -53,9 +87,9 @@ class _SignUpState extends State { ), const SizedBox(height: 10), - _buildTextField('Business Name *', 'Enter your Business Name'), - _buildTextField('Registration Number *', 'Business Registration Number'), - _buildTextField('Years in Business *', 'Years of operation'), + _buildTextField('Business Name *', 'Enter your Business Name',businessNameController), + _buildTextField('Registration Number *', 'Business Registration Number',registrationNumberController), + _buildTextField('Years in Business *', 'Years of operation',yearsInBusinessController), const SizedBox(height: 24), Text( @@ -64,11 +98,11 @@ class _SignUpState extends State { ), const SizedBox(height: 10), - _buildTextField('Primary Contact Name *', 'Full Name'), - _buildTextField('Position/Title *', 'Job title'), - _buildTextField('Mobile Number *', 'Mobile Number'), - _buildTextField('Additional Mobile Number', 'Alternate Number'), - _buildTextField('Email Address', 'Email Address'), + _buildTextField('Primary Contact Name *', 'Full Name',contactNameController), + _buildTextField('Position/Title *', 'Job title',positionController), + _buildTextField('Mobile Number *', 'Mobile Number',mobileNumberController,readOnly: true), + _buildTextField('Additional Mobile Number', 'Alternate Number',additionalMobileController), + _buildTextField('Email Address', 'Email Address',emailController), const SizedBox(height: 24), Text( @@ -77,11 +111,11 @@ class _SignUpState extends State { ), const SizedBox(height: 10), - _buildTextField('Address Line 1 *', '123 Main St'), - _buildTextField('Address Line 2(Optional)', 'Area'), - _buildTextField('City *', 'City'), - _buildTextField('State/Province *', 'State'), - _buildTextField('ZIP/Postal Code ', '12345'), + _buildTextField('Address Line 1 *', '123 Main St',addressLine1Controller), + _buildTextField('Address Line 2(Optional)', 'Area',addressLine2Controller), + _buildTextField('City *', 'City',cityController), + _buildTextField('State/Province *', 'State',stateController), + _buildTextField('ZIP/Postal Code *', '12345',zipController), const SizedBox(height: 10), Padding( @@ -106,21 +140,94 @@ class _SignUpState extends State { SizedBox( width: double.infinity, child: ElevatedButton( - onPressed: () { - // Submit logic goes here - Navigator.push( - context, - MaterialPageRoute(builder: (context) => VerificationScreen()), - ); + onPressed: () async{ + if (businessNameController.text != ''&& + registrationNumberController.text != ''&& + yearsInBusinessController.text != ''&& + contactNameController.text != ''&& + mobileNumberController.text != ''&& + positionController.text != ''&& + addressLine1Controller.text != ''&& + addressLine2Controller.text != ''&& + cityController.text != ''&& + stateController.text != ''&& + zipController.text != '' + ) { + AppSettings.preLoaderDialog(context); + + bool isOnline = await AppSettings.internetConnectivity(); + + if(isOnline){ + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? fcmToken = prefs.getString('fcmToken'); + var payload = new Map(); + + payload["suppliername"] = contactNameController.text.toString(); + payload["phone"] = mobileNumberController.text.toString(); + payload["alternativeContactNumber"] = additionalMobileController.text.toString(); + payload["password"] = widget.password; + payload["emails"] = [ + {"email": emailController.text.toString()} + ]; + + payload["office_address"] = addressLine1Controller.text.toString(); + payload["city"] = cityController.text.toString(); + payload["state"] = stateController.text.toString(); + payload["zip"] = zipController.text.toString(); + payload["country"] = ''; + payload["latitude"] = 0; + payload["longitude"] = 0; + payload["fcmId"] = fcmToken; + payload["description"] =''; + payload["bussinessname"] = businessNameController.text.toString(); + payload["registration_number"] = registrationNumberController.text.toString(); + payload["years_in_business"] = yearsInBusinessController.text.toString(); + + + bool signinStatus = await AppSettings.signUp(payload); + + try{ + if (signinStatus) { + Navigator.of(context,rootNavigator: true).pop(); + /* String token = AppSettings.accessToken; + await storage.write(key: 'authToken', value: token);*/ + Navigator.push( + context, + MaterialPageRoute(builder: (context) => VerificationScreen()), + ); + AppSettings.longSuccessToast("Logged in Successfully"); + + } else { + Navigator.of(context,rootNavigator: true).pop(); + AppSettings.longFailedToast("Invalid details"); + } + } + catch(exception){ + Navigator.of(context,rootNavigator: true).pop(); + print(exception); + } + } + else{ + Navigator.of(context,rootNavigator: true).pop(); + AppSettings.longFailedToast("Please Check internet"); + } + } + else{ + + AppSettings.longFailedToast("Please enter valid details"); + } + + + }, style: ElevatedButton.styleFrom( - backgroundColor: Colors.blueAccent, + backgroundColor: primaryColor, padding: const EdgeInsets.symmetric(vertical: 16), ), child: Text( 'Submit', - style: fontTextStyle(16, Colors.white, FontWeight.w600), + style: fontTextStyle(16, Color(0XFFFFFFFF), FontWeight.w600), ), ), ), @@ -130,7 +237,7 @@ class _SignUpState extends State { ); } - Widget _buildTextField(String label, String hint) { + Widget _buildTextField(String label, String hint,TextEditingController controller, {bool readOnly = false}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -139,15 +246,13 @@ class _SignUpState extends State { style: fontTextStyle(12, Color(0xFF2D2E30),FontWeight.w500), ), const SizedBox(height: 6), - TextField( - decoration: InputDecoration( - hintText: hint, - hintStyle: fontTextStyle(13, Colors.grey.shade600, FontWeight.normal), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 14), - ), + TextFormField( + controller: controller, + readOnly: readOnly, + textCapitalization: TextCapitalization.sentences, + style:fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), + cursorColor: Color(0XFF8270DB), + decoration: textFormFieldDecorationHintText(Icons.phone,hint), ), const SizedBox(height: 16), ], diff --git a/lib/signup/signup_mobilenumber_screen.dart b/lib/signup/signup_mobilenumber_screen.dart index 661c7b0..fe2b6ab 100644 --- a/lib/signup/signup_mobilenumber_screen.dart +++ b/lib/signup/signup_mobilenumber_screen.dart @@ -20,131 +20,134 @@ class _SignUpMobileNumberScreenState extends State { return Scaffold( backgroundColor: Colors.white, - body: Padding( - padding: EdgeInsets.all(24), - child: Column( - children: [ - SizedBox(height: MediaQuery.of(context).size.height * .2), - Center( - child: Text("AQUICK SUPPLIER", - style: fontTextStyle(20, Color(0XFF515253), FontWeight.w800)), - ), - SizedBox(height: MediaQuery.of(context).size.height * .05), - CircleAvatar(radius: 80, backgroundColor: Color(0XFFF3F1FB)), - SizedBox(height: MediaQuery.of(context).size.height * .05), - Center( - child: Text( - "Welcome to Aquick Supplier", - style: fontTextStyle(20, Color(0XFF343637), FontWeight.w700), + body: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24), + child: Column( + children: [ + SizedBox(height: MediaQuery.of(context).size.height * .2), + Center( + child: Text("AQUICK SUPPLIER", + style: fontTextStyle(20, Color(0XFF515253), FontWeight.w800)), ), - ), - SizedBox(height: MediaQuery.of(context).size.height * .004), - Center( - child: Text( - "Sign up to be listed as a supplier, start deliveries and track orders", - style: fontTextStyle(12, Color(0XFF7E7F80), FontWeight.w400), - textAlign: TextAlign.center, // Keeps text centered in multiple lines + SizedBox(height: MediaQuery.of(context).size.height * .05), + CircleAvatar(radius: 80, backgroundColor: Color(0XFFF3F1FB)), + SizedBox(height: MediaQuery.of(context).size.height * .05), + Center( + child: Text( + "Welcome to Aquick Supplier", + style: fontTextStyle(20, Color(0XFF343637), FontWeight.w700), + ), + ), + SizedBox(height: MediaQuery.of(context).size.height * .004), + Center( + child: Text( + "Sign up to be listed as a supplier, start deliveries and track orders", + style: fontTextStyle(12, Color(0XFF7E7F80), FontWeight.w400), + textAlign: TextAlign.center, // Keeps text centered in multiple lines + ), ), - ), - SizedBox(height:MediaQuery.of(context).size.height * .016,), - Container( - child: TextFormField( - controller: mobileNumberController, - keyboardType: TextInputType.number, - textCapitalization: TextCapitalization.sentences, - maxLength: 10, - decoration: textFormFieldDecoration(Icons.phone,'Mobile Number'), - style:fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), - cursorColor: Color(0XFF8270DB), - - //TextStyle(color: Colors.black,fontWeight: FontWeight.bold), + SizedBox(height:MediaQuery.of(context).size.height * .016,), + Container( + child: TextFormField( + controller: mobileNumberController, + keyboardType: TextInputType.number, + textCapitalization: TextCapitalization.sentences, + maxLength: 10, + decoration: textFormFieldDecoration(Icons.phone,'Mobile Number'), + style:fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), + cursorColor: Color(0XFF8270DB), + + //TextStyle(color: Colors.black,fontWeight: FontWeight.bold), + ), ), - ), - SizedBox(height: MediaQuery.of(context).size.height * .04), - Container( - width: double.infinity, - height: MediaQuery.of(context).size.height * .06, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - foregroundColor: Colors.white, - backgroundColor: primaryColor, - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(24.0), // Customize the radius + SizedBox(height: MediaQuery.of(context).size.height * .04), + Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * .06, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + backgroundColor: primaryColor, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(24.0), // Customize the radius + ), ), - ), - onPressed: () async{ - if(mobileNumberController.text.length>=10){ + onPressed: () async{ + if(mobileNumberController.text.length>=10){ - AppSettings.preLoaderDialog(context); + AppSettings.preLoaderDialog(context); - bool isOnline = await AppSettings.internetConnectivity(); - if(isOnline){ + bool isOnline = await AppSettings.internetConnectivity(); + if(isOnline){ - var payload = new Map(); - payload["phone"] = mobileNumberController.text.toString(); + var payload = new Map(); + payload["phone"] = mobileNumberController.text.toString(); - bool forgotPwd = await AppSettings.getOtp(payload); + bool forgotPwd = await AppSettings.getOtp(payload); - if(forgotPwd){ - Navigator.of(context,rootNavigator: true).pop(); - Navigator.push( - context, - new MaterialPageRoute( - builder: (__) => new Otpscreen(mobileNumber:mobileNumberController.text.toString()))); + if(forgotPwd){ + Navigator.of(context,rootNavigator: true).pop(); + Navigator.push( + context, + new MaterialPageRoute( + builder: (__) => new Otpscreen(mobileNumber:mobileNumberController.text.toString()))); + } + else{ + AppSettings.longFailedToast('Please enter valid registered mobile number'); + } } else{ - AppSettings.longFailedToast('Please enter valid registered mobile number'); + Navigator.of(context,rootNavigator: true).pop(); + AppSettings.longFailedToast("Please Check internet"); } - } - else{ - Navigator.of(context,rootNavigator: true).pop(); - AppSettings.longFailedToast("Please Check internet"); - } - } - else{ - AppSettings.longFailedToast('Please enter 10 digits of mobile number'); - } + } + else{ + AppSettings.longFailedToast('Please enter 10 digits of mobile number'); + } + }, + child: Text( + 'Continue', + style: fontTextStyle(14, Color(0XFFFFFFFF), FontWeight.w600), + ), + )), + SizedBox(height: MediaQuery.of(context).size.height * .012), + Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * .06, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Color(0XFF757575), + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(24.0), // Customize the radius + side: BorderSide( + color: Color(0XFF757575), // Border color + width: 1, // Border width + ), + ), + ), + onPressed: () async { + Navigator.pop(context); }, child: Text( - 'Continue', - style: fontTextStyle(14, Color(0XFFFFFFFF), FontWeight.w600), + 'Back', + style: fontTextStyle(14, Color(0XFF646566), FontWeight.w500), ), - )), - SizedBox(height: MediaQuery.of(context).size.height * .012), - Container( - width: double.infinity, - height: MediaQuery.of(context).size.height * .06, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - foregroundColor: Color(0XFF757575), - backgroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(24.0), // Customize the radius - side: BorderSide( - color: Color(0XFF757575), // Border color - width: 1, // Border width - ), - ), - ), - onPressed: () async { - // Your onPressed logic - }, - child: Text( - 'Back', - style: fontTextStyle(14, Color(0XFF646566), FontWeight.w500), ), - ), - ) - ], + ) + ], + ), ), - )); + ) + ); } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index d0e7f79..85a2413 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,9 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index b29e9ba..62e3ed5 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux flutter_secure_storage_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 48a819b..e61fc6d 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,7 @@ import FlutterMacOS import Foundation +import file_selector_macos import firebase_core import firebase_messaging import flutter_secure_storage_macos @@ -12,6 +13,7 @@ import path_provider_foundation import shared_preferences_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) diff --git a/pubspec.lock b/pubspec.lock index 9b6540a..9ac7938 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" crypto: dependency: transitive description: @@ -89,6 +97,38 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" + url: "https://pub.dev" + source: hosted + version: "0.9.4+2" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" firebase_core: dependency: transitive description: @@ -150,6 +190,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" + url: "https://pub.dev" + source: hosted + version: "2.0.22" flutter_secure_storage: dependency: "direct main" description: @@ -240,6 +288,70 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "8c5abf0dcc24fe6e8e0b4a5c0b51a5cf30cefdf6407a3213dae61edc75a70f56" + url: "https://pub.dev" + source: hosted + version: "0.8.12+12" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.dev" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" js: dependency: transitive description: @@ -304,6 +416,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" path: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 6443fd1..058bd9b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: fluttertoast: ^8.1.2 flutter_secure_storage: ^9.0.0 firebase_messaging: ^14.9.1 + image_picker: ^1.1.2 dev_dependencies: flutter_test: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 39cedd3..8e326bc 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,10 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); FirebaseCorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); FlutterSecureStorageWindowsPluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 1f5d05f..754248f 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows firebase_core flutter_secure_storage_windows )