From 6bdfcf371cbce6ac36fcbfd31adf5dbbf84231b2 Mon Sep 17 00:00:00 2001 From: FlutterFlow <140657486+FlutterFlowEng@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:41:03 +0000 Subject: [PATCH] Updating to latest FlutterFlow output. --- android/app/src/main/AndroidManifest.xml | 3 +- assets/fonts/Nunito-Regular.ttf | Bin 131736 -> 0 bytes ...76383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg | Bin 0 -> 5963 bytes ios/Podfile | 7 + ios/Runner.xcodeproj/project.pbxproj | 8 +- ios/Runner/Info.plist | 5 + ios/Runner/Runner.entitlements | 2 + lib/actions/actions.dart | 224 +- .../local_profile_component_widget.dart | 191 +- .../menu_list_view_component_widget.dart | 302 +- .../menu_staggered_view_component_widget.dart | 921 ++-- .../schedule_visit_detail_widget.dart | 2 +- .../view_visit_detail_model.dart | 6 +- .../view_visit_detail_widget.dart | 27 +- .../menu_component/menu_component_model.dart | 20 - .../menu_component/menu_component_widget.dart | 18 +- .../visit_history_component_model.dart | 12 - .../visit_history_component_widget.dart | 388 -- .../visitor_search_component_widget.dart | 16 +- .../fast_pass_page/fast_pass_page_model.dart | 17 - .../fast_pass_page/fast_pass_page_widget.dart | 44 - .../forgot_password_page_model.dart | 0 .../forgot_password_page_widget.dart | 12 +- .../home_page/home_page_widget.dart | 62 +- .../login_page/login_page_model.dart} | 11 +- .../login_page/login_page_widget.dart | 244 +- .../register_page/register_page_model.dart | 3 + .../register_page/register_page_widget.dart | 198 +- .../register_visitor_page_widget.dart | 9 +- .../schedule_complete_visit_page_model.dart | 38 +- .../schedule_complete_visit_page_widget.dart | 4269 ++++++++--------- ...chedule_provisional_visit_page_widget.dart | 157 +- .../welcome_page/welcome_page_model.dart | 0 .../welcome_page/welcome_page_widget.dart | 27 +- lib/backend/api_requests/api_calls.dart | 83 +- .../cloud_functions/cloud_functions.dart | 23 + .../push_notifications_handler.dart | 154 + .../push_notifications_util.dart | 49 + .../serialization_util.dart | 172 + lib/backend/schema/structs/device_struct.dart | 110 - lib/backend/schema/structs/index.dart | 1 - lib/components/image_cropper_model.dart | 11 - lib/components/image_cropper_widget.dart | 64 - .../legacy_local_component_model.dart | 12 - .../legacy_local_component_widget.dart | 167 - .../select_header_component_model.dart | 12 - .../select_header_component_widget.dart | 185 - lib/custom_code/actions/get_dev_u_u_i_d.dart | 28 - lib/custom_code/actions/index.dart | 1 - lib/custom_code/widgets/image_cropper.dart | 179 - lib/custom_code/widgets/index.dart | 1 - lib/flutter_flow/flutter_flow_theme.dart | 8 +- lib/flutter_flow/internationalization.dart | 361 +- lib/flutter_flow/nav/nav.dart | 36 +- lib/index.dart | 12 +- .../forgot_password_component_model.dart | 26 - .../forgot_password_component_widget.dart | 292 -- .../on_boarding_page_model.dart | 45 - .../on_boarding_page_widget.dart | 131 - .../sign_in_component_widget.dart | 899 ---- .../sign_up_component_model.dart | 43 - .../sign_up_component_widget.dart | 770 --- .../welcome_component_model.dart | 11 - .../welcome_component_widget.dart | 456 -- .../login_page/login_page_model.dart | 113 - pubspec.yaml | 12 +- 66 files changed, 4061 insertions(+), 7649 deletions(-) delete mode 100644 assets/fonts/Nunito-Regular.ttf create mode 100644 assets/images/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg delete mode 100644 lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart delete mode 100644 lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart delete mode 100644 lib/application_pages/fast_pass_page/fast_pass_page_model.dart delete mode 100644 lib/application_pages/fast_pass_page/fast_pass_page_widget.dart rename lib/{on_boarding/on_boarding_legacy => application_pages}/forgot_password_page/forgot_password_page_model.dart (100%) rename lib/{on_boarding/on_boarding_legacy => application_pages}/forgot_password_page/forgot_password_page_widget.dart (97%) rename lib/{on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart => application_pages/login_page/login_page_model.dart} (65%) rename lib/{on_boarding/on_boarding_legacy => application_pages}/login_page/login_page_widget.dart (80%) rename lib/{on_boarding/on_boarding_legacy => application_pages}/register_page/register_page_model.dart (89%) rename lib/{on_boarding/on_boarding_legacy => application_pages}/register_page/register_page_widget.dart (81%) rename lib/{on_boarding/on_boarding_legacy => application_pages}/welcome_page/welcome_page_model.dart (100%) rename lib/{on_boarding/on_boarding_legacy => application_pages}/welcome_page/welcome_page_widget.dart (97%) create mode 100644 lib/backend/cloud_functions/cloud_functions.dart create mode 100644 lib/backend/push_notifications/push_notifications_handler.dart create mode 100644 lib/backend/push_notifications/push_notifications_util.dart create mode 100644 lib/backend/push_notifications/serialization_util.dart delete mode 100644 lib/backend/schema/structs/device_struct.dart delete mode 100644 lib/components/image_cropper_model.dart delete mode 100644 lib/components/image_cropper_widget.dart delete mode 100644 lib/components/legacy_local_component_model.dart delete mode 100644 lib/components/legacy_local_component_widget.dart delete mode 100644 lib/components/select_header_component_model.dart delete mode 100644 lib/components/select_header_component_widget.dart delete mode 100644 lib/custom_code/actions/get_dev_u_u_i_d.dart delete mode 100644 lib/custom_code/widgets/image_cropper.dart delete mode 100644 lib/custom_code/widgets/index.dart delete mode 100644 lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart delete mode 100644 lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart delete mode 100644 lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart delete mode 100644 lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart delete mode 100644 lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart delete mode 100644 lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart delete mode 100644 lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart delete mode 100644 lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart delete mode 100644 lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart delete mode 100644 lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 08fca23b..a88ef9c2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,8 +5,7 @@ - - + XR#kzZE zx!AiSE>}bvo0#2rb^FdX7i+m2y=<9S(ZAx)JD+WKNzyWWUbt<~)_pB?#bx;W`z}}T zfm64hy^lsi|M-q z`{(0x#c6xaIse7_|GE=@U*mGg#k==z+gk9`=U;NMg6q-U$M$SJf1hW)>zDX^8rqkh zxpmKuZN`Ux;9`9bxm@l)?Av?xIo?lxW`~On-R^Q#ePiGL9s5r6-h2)Iem~m#T#~DC za)kXr`o7DJPp;K+nOs>Wmo>86()Y6Z^sm0|KKK2b8r?F8<0_v#COsxS<;r)JqGfqi zRU2z1*l^%0 zJ!QcKeeHG1te?+rPk26PwfB@~!9Q=qE3)7_Yt%l*XnN_-Hc4t|k*I`**ghh40E{zAMWb4PEml%i7e`G{2T-Z`E2w^Rp}bMvOhJ zsH&3QAomurjr`Y#wZ2j|i~stIGJi#J`ohxPevO^~N`Nhij{9P{5$U2xSc%I@QTjKA zEX#_K{&^vNF8gAx@kk^potnNzGuS2I1db`^v_f+y{~15suGLt^otS~)Dsff2TxVkq z<>uBVNEVuduZ90erm$!&%~i={i}lOZMj~Onv1mu@(t#x_FWmdWPnY4ppMH0Ae0=n~ z2}3&7NYpK#H?Sre4Xj(dY5PE5|3L3RUsq2rjY+KY2aH+aYH+o>Tw7_(WVu(zfF#PQ zTEIq4pxg&zz+6V6w5`<_4~66Yjhorr8If7p+^PlQ!Jr&SjIWphE#~T;JR%*Co+c`Q zlflY863JI^s<%8rcCVtYPKFOMCX!L;^lJH&(H#aqP_Y_A|%k zuBnXW#(lnU?OA~}_wHM9&Bmr=c`z>#3lW+ol+2o zk&I&lmApw_dcpu?v!QIE%6=r+D?S4`M{sH}k?fx)#H^~(-P7cAbzll2@z)Hnk z1zEhIYf*`qqDSIf!I|OvU;NhW4Og$a`(yJ@9WKA|#*Yau`1+StUA1o3{EGQ!%>U4b zFjMrHqq`sWRJl?ZA>}$O{Te@g9@!J18B87#BLWlpyU&wyJ<4Z>?@14Ei7enU+yBAs zC;JI=s~_2l*} zY|?~{poZtarS~jqus=wLXx8pS?&tB7arzek+tLj6Es3H}{e>?AJ4aR&IsG8(;y<5Y zIv*5&y0xnzd$vz2KT5xck*$=_( zeux_Z$2c?f7q-5KwVuOIWid|Ff@4h!I1dn z`ozkH73T(;w_H1}%EM)wuN)Y1V>nOW`K@3C7P{Se=ZesZk#d|cuy0WT&vNh8qwUTAwI8JZIX z%1B`lq#(lJv*x{A!)dPR?DO<5{V%;%^CdLt0v+6tew}Ib^Tc&pBB8P3^dGbYSl{J` zHkCmCEv^o8ghaBO6WT}rVhA0^js0s=BWYR5HVkKvtCqEteN;0NtIC!5SlqzC5%#?Z z{Zz)2io7NdxESemn#MktUI&EOo8hvUoY+n1>`queOJhnj9plL5rT?rY*iBanDPBYK z2VKT#J=`bQC1RftUASE0a8HLudMn1;=COw67 zVik?-+R2zTGSj)F;&6}ObveN&Uz|L~YB}c!xN5@x2Dr*G74WbLe{%Ae>p4e1NfUk? z?Y(Z2c%r@JgnObk+%4d)W$5RtT#pd#b4>WyWWVcSPB{*DA2s`V9qqs17}saEuLArK zmxQ99aB71f?qlrD2`;pxI^k6&o^Mn^DKOvXl+9?XgP1sk8ZE~P& zw#Ot@jp>o}0}^M%3;EE0WOKqHB|n^gqCWj-v`CFaSV#IrlRF__Fe<1|eh?qzOP9a~ zn>ryq=~6P<3zrx82V3?E4L=|v7Al&iKs4;*BH_!bEUR=zLKd`ej^9Onx^_wn1jkdK zoMSlL;&`qpL3RKK0S__QIn)nu0}d7(xZ(IP&tNBfH@nb9n)qs**-rRTt3A%hXQd~x z19|^!tpq8^+i%ZmpBC*W|0?Egjq9m)eHjvtxz=KZCb2@WGT_BAmp{RhVuk29;j*mB zExbDJCO|GD3dL1FQ;M1FSKzOKp{V7)=Zi(7aqo#-)u*e{WttX=op@jJ#3Gt@;tEv< ztT9~|35CP#g%dwfb;5QnW{1&%)j52nj$~b1FI~_4y-aeh4Ty{bE&Fn@pvrA zzMiY8iYmurN-(`Nq4{)8x>z$p(G!nLtu#8}5ROR0C!W#x*tDY0@fAH_uIQgk3Sw-& zq8tt_lxz0Myq|F`?d@|SWyd~ z?OE;9c6-8;v?0-dKEb&(@8h&fL2vL@RYBvywr)u-4# z@Dcdhz`o=b!exBT1e`1c0auw5PMV2;hn;Y)nG1N-hWAT9(2 zi#Xw2qZj?fop7$v3wX>4cg!Q11*h{(w3o8r&)aa%3~;Xv$2_=(#rqNSn1+5nyFKQ` z&o?n{c@})JJ??Dwq=Vk%$D{Ts4~O&hxYYbR(b4*z{r4I0u>bDyG3)zId@_G8&-y#@ ze)jmYvi@%2=ko-!=0oSTm}f;6oX%?jFLuJYG3PT-?00y zVV7s%HXo!s9DWjCTl4gJ^6hbm4@ut% z-;10~C)q8QXb8 zY-z~0^XE$~$pyRSe+Vi+{5g>GYcak;{v7N4A;lV^Dv5to%e@Ev-O%1R>%t4q`jMtR zK0Yxq{y3@cXY2aj9ozT43zc}sqWKFJi9U}@>u}1G2hr{mUFwd0+p_xAv?r(>~pQ{_XvgynnJNBNVCH}Z*!GeY4DeRu?=9XsERqC1r8D~T#IG15xw!t%( z%6RFfk$BSCLARWn7wC_-r-o*?75r!h0eDR;PtFO&PAx1dDyyF}votiRw+GZCzok7> zF-va}QzVzD8H@pnq+p#y&$eBQgIcOHcMA@4SvLH85?ymI*R;o$uUN7CF_Xf(PU%@c zJ5pW$wP*oO*Qe`>((i%Z`-g`IhlR#*OxnYF`14#=`q@g(+qAZOxGWWL*@8m@0@mPB z4##=vY)^Yuv`^ab{;c*#Z8-H$ds(!vu;JUY+NTMQb8#-L$X?jfZQ^Xgs`W_lrV37= zMa+0uofbA|$XAoio4synNjQ)bGa?N;`_`@QU3}W6ja5UNI(qlihy31HB3iwwxn*hH zyg|h6Du%WM;>C$TA`vH>da$jbDW+@dM`kZ=D^4Z@2|X$WiVI4+tLL;w41MLI`o%4U zkk1@PPRj>PT6S_;3ivV1Rlozx38(W-z-1@gld$264euiwSa5j2pc&iaX8H+R?XgzQ z_FR*;+mmi1#?7(XL!WcDKWg_6IJd*7J)Nthk^4OSdt7HZBHf6!>EUaWy);QuTDW(^ z)E{i6wAu3JATCghP!9Ya4>qqa5BYMUTBvlmYQdth@l)fP8l4yzTQPRZ4pQ$2FI&5K zPuFl))8d-uQv&(9eqE2beFZ-u?|6;T<4Pz!xUY>X^YNN#ectG zmTsB`q>`NcLGj&n}DlXaN2IfJ-*KU&5R$IQY&v zZl)h!7M$XcqMvdH{5aQV1iVTbw(&o1&nxBOaDIMU3eV={K zrpvW%if4*`a_#ouF&kgfXB_x&eMYn|Bsh37g1vShcrsVW1xD5kZPf?_EldGG`QjJWfwYC+`}BmY`F@uCrB9RNs_*9|&*kW{uK8br-K*&S9~;m3 zG@q(U=jlbVa^fCogNpx7+$U|8l|tjh4fIJGJn-*;Fx74D7XW!Dmq3W1u)=UkbyG1qi1UK3Fqq6P}z4fP%q{kpf zf0F-fP>aTODfFkef^JQY=%It92ZM%B$&ax4C9FA?uY_aiKeN18ST2aApDjs$E0V87 zqO30cd^AEh#DK$m-~b&Dlx~p|)1UyaDXWE7^mu@2@u(4aUVlD>VHFm9Pxd9?mFZyX zA_eF+{aaQgM*4h5`kVE1dhz}_4PO>CWVM`z0!}m(@NgEKXei)P7MxBs0nf4F{e-^- z$L@9ZPc#?peFQh>`)TRNuBs{XH4<_r*vlzMQ+6>(2lRcjm5%j{zgsS>QkJnmM-HNP*+KAk=rJ_D6K9M^rm zPp5lDFQ{`ra>2E{1S*T`2)z-h$a{;MK^sH&=}!R;jWCVppxldX=#c|uQra&YP;;rhWhc1l^t`dyOWI_$@!_M7M4Qc z`cI=Kp0CKt!gbM zd^ujyB$!bsfSeW-W)AxR1e-CtVH`x9C zG7CP-hX2Y5m)^7ChqB;l8~&;T{=R#z4S(K-6TVja48G3qJ>~e`3-SMw%B_*N=DjHk_j9 z0TxjWe{TNh$btz|X1JS3W-uJaTxNV4KPA@)^!+@X%EcmXUX^O2`O*1ohEFkVC|l%< z@lJ8x4h(FLhjfT|2zetcZyFfb($cbZ`K-ap@!^J{%H@Hfj?e~@TkybxO6eEc2fEK1 zU3ykefBlMi>$lWRbg$cLWAJ0hm&X@h3oRsNz~9i=_1+bTv&gI;e`59PP! zr8=wiwQ3w9>>U%(+rnSdW+7QByewc*E|aJwJMbwT@+`h!F@`+L>?9_B7VqM7iQ`1d3} z{&5Gl2w?(UJUb?XK*LGglGDEx+|fU<2|NR15j>-Z;+yA!QO1YCGRp%!XDuB)t9ziG z6hK`&aW!$y=4i)IHn)HRk|g~vcx8}ti-iGDXvNO+QLLklXM0l6174d%O5}C=+Q>P8 zwabn`Xv3#$K#1WK;A29wFxEcHI(YXlElTaM9?4K=x&)`S<=0x zWA;#TY(c|N#aN*8wE4rQc9ab^Z@Z&m!0Xo%zB!?w?8`BXa89sTVXc4}zM62=sTVI^ zuxCltK=qQQku}wen#NX}t10awjgrB#!K(a8g64xAL37*yDmS|NvgVjb+BqK1d;{Sp zwe*f@DBriWl_-zhdS6^o;!l)f)9R(0kaQ*Y(66ERrp8%A73QwB*5Mm*#PP~D$(kl_ zDx=>|9HS-K6m8F163&(V3|wK)<0ym9YtG{qXu#Iaw$=*s5W>aY+8=;?hHX}kmlcV< zJ!fX_c_6c~(~`wP19g_b*&^t^JqzD7;VX8R$3=N>d_7Xgdt1QQ<&Ya1peYd!Ln72U zSB1NrKHxxLsik|nyG|dTJK9!+JevF1qIhZdtfmDOYnPV~mPQlNoIs>(U7&m4=*U@p zWj$-!;<1)U>yql(6K&oNTQY*&-2I37ZZ73`y+U}}aOiPN!2gm3Cut$zhirHsJ4|{X zhm%wg{FnVbk_zH`uiD=`BIS^NWx}7g;r-~(YEOEZ=+E&zcG&T~7wqpHVegP$X7=}M z2mCPUWhVSZC)^%~^fKrCp_iHM4`#thij}%(f4yYGfiIVq0?zTZ=}2d!fWK_FKZ5x| zFEin9XThPDnecbB;LyuV_?u2R>ER~)tr_6|u;ExI2cGYB_<5=>~r1jHh zQ2&tYHIAhl*48FOW~^KT({tKHBCUTvrs8b3D;t zqPs18KKW92`wWd;EyrSUy=wDzzng^>HOi!%zMk4xJQkDF7uRxGG|19??;?wfJUtG_ ze+v{gp&5(hYD>66D!H>yi)71=ny}9kRfF}*QVSLZV_W+NPiZOc7;hZd5)G0rwDkAP8=)XZxUQkO_~p? z4Z9|?sRmsbS#TuKo0@#YTvJGBNqCUZXRl+M_hfo*uMPWhB5JUDMXIqs7Tg|*$0NJ_ zk`#z-8tgx%t)z3=+`&yTPFlB=(?Wkfro8)e^x(7sUPr8@8ogh6Mokf zapjrwH7yG4D#1B?dz-Y>wYIrE}K_WLVFE>#jR_VCwlk6~h z6!f$Ev--&TuE6;?WBkNi44k~~SIz-+^0$-6S(NWG0sRYy{uTJ9`RO8{uX5-w0sXN9 z`VNQw4bb-_I&nnXgBhs1$%g)ppsqo*{Vdm|McbD+v=_ODpbpwD;+P%fJ^UGMKk2~t zW!^Rq(BJU$NA&PEZ!2a&r;mWX%b_n}ZXtB-#adLl<_g;V>zqU9 z8eKZ4Gga=*@eo9n1q04jD_~wiYreYDPynE`^06Rmt7b z!G6glZBzGH%AK$WXMB`Tvo|ox^kYovce?&C1K`Re&Kv9a8oqj-B};ydU0$BerA;F1 z9A{fg!r&%$Duv_*lXaz^M0MPTWZ~bw5mjS~5r0X_h?BifM51zD^k?<|7tL2$pa=80F*L(Q8ka54poU>(|ZsMg)!OQDFOpYrKymUHm z?;*NAG8He);Nu)&6`23jT~A(;rdB%9ak{^}aDHN zUeHq__A-;0H~lZd>7gCaKq(l@>dJXNOCvF5V^7-x#9dW=R$JFF{hZy}HEgfRnrJ&* zLhb#T^T$8fJF(#J{3sH?a_$+O>?h1Xr_(w8j39J($oG`y zYj(g~Gt2ixaIz)^{4Wk4k~mKV+~Hf2ByJ4~`15xAe)L1SEWyc&H264<@3FMwdoS4E z!}#2a6#e}=3r<#~fWPR3+vAWGiE-@t(U~sVAIyRi_X+s#XMq2o4aYn)MfteSVy1xkD2)ZPWpO(pUuiO(&dN%L4w^4Df&0 z@V+d%zt8C2iyM6V3yiC|XlK+}mN7T%f^Rqg?q4@pe zx14^{tO|QVNDcIa-610)IE*l%mHPm6rzXX4l@C*n;*E)dyoruO%zv=u_J4(A(HZR$Q)VMv1`!>!+Ame^E z4Chuu<6v^-c)f>%9vP^eUXSl0#^8k4iw+swylEcOWcCg}c zWV5d#^#d;FK@p}HY)`+h>2EuN6&422Zl+=&XJ|Py2D%FUIX*K6?zvn6`qc+wFl%y{ z9k*z}GbwD_Tc{P5Jqa32Su|+F@bz*62!AknEcBn->jEM$Py3+o01tLVHxoL@RLdfQ z&=IzwHi zZ)pZUagVX>e23gEc8KfO=1F{vZRMOT;D=0jKQsVff}KEculqf&8@Ay5-@+xlX#I}a zdT_Eot2MW|TwQ2=7MDw+^}C|=oPDQZpD@>KoPrO7`i*?c2{w0rWdV|#I|fTpPYfu*A0 zCi`gJn(`17F)dWKuy}6!oO#RoqUFUUd9&;0FEOxB4xG_4Qe9q~$PdoyUOLdQJdl^` z({O+w-K(~uD5d1}&e2nKc?ETOWvLZQ(;Zyn{?5J&OFC0kU6oo%)5cIli}wIC1(2SVXg zpk}ONlANJu)80Ls9H2)!=D}Gjhc%DK2dni2I2a>i4IUy|dKz4xbs-1Mgp=hY;PtMf zw8ntCb9^)Na3>oteSMohCTeb`kn{ z)wWkN0cjp?Z!yUvYeY8+Hy)k0G{rq}9X+FD6{S=?qOA|qt?FZ8%2G|g+t<5d=q>*1 z=2}BrAD!2Oox?|Qqm~cd(coHC9#+SMORwATzc45KxD7v)1*fxJ^z-Tr@OQG{-?rNy zwBh|UYa4zPaMB&7;`y@O9#oQ!+U?&axS$^HKkOm?;u#LM1BJ|Rq8?JvTABru`DUVG zNu^w&C|w;+TJjT$)A9{Xak~?>Wu@_W&uB2c+a#)qEk-A5{J^HFfcFztHrz40toAg! zOh2THihgKz88~T791h*nhJzZJRrn)O!=j$_8rqB1c{dA=%wrS&W)?it&)*5osoE#S z!INDs*ADO;cyC6&Brk`R8Y1cni5=eN!*|%nz?)rDICg5jOq8;1f*#MM;8f1W8PdPS zf8Bgiij19MW6jwevgh_%*4$pQ;fI}Yu5Sw(yE)YsE=AwO?dO ziX2>IrV6Ewr=`9l=lk#Q=4i2)>b*JlHlHrX4ey5%xA>4IDofrwdtZ6b*S3fs`&{x>mEN@MVjMl=?A z@V*Gc1zJ6DYvFAHEf!T-l+T(J5>=Q}$Ke7B6=iTCh5lUZ`D2d6yk@wBl=?`L^TyJtZ3OM;U1pH7IoYq6YU$WrP)qtZ7KT2@W zeKoRH{(o_M2ecT0PVu|HTRCGF-r) zv*DDXW3?yW8u~$hGkxzD_V+M8W%`=q{4xtpzBMt|Emm=J! zC*aT9aKhJWpTXDhJ>W%|DB^oB*xx(CPHPYC!+HXQhJ`$)h!eWzK!m+khnt|Tu+`?s^;v zqN5~_IDb%{tl9oGyFIOEj}8B;6V5$QqW{AL$DT%99P!AfTsTM^-WJ)4TJaDSY1AjK zuI0Px81qx4M)Kg>nMlns7Np1shh`!*ed(jF&)aazcBe>uE5%*R*1KJYP$iI}sQrkd zTD^GP!gi;9e0!!fTT43_wg%bmAxCT2?trGzcbRC7!_WsLZv~!`i!xIFEOU6GYYwwGWjkv6L6(zOP>_fJQLx5L zSlP7Q=Vl>AL&A!uzpFNeGDN%e1VZ4KBW*=G#SU450&d9Hvv@?R6IlD;n^?-%x)(IK zgGVnGakxnXKC8cG+Djg4k2Nh|cd>HV%#iyNrp-xr8icNzxza$Vj~S)Vg^`u?das|| zGqJF%vuSQgd0v%KQK8iuIEnnByym>Rw!#9`c9dtayPB(JRafNZX+=hDQAb%>Adusi z<(zOJud(Xh!g#o(1jn1?N&t^8;1MIu1ejRTm0RNwr>51e84uJARN+oUE&W?tJ!ejJ z&73*xuBxF~$N{OOf2(G-H8r7qb1U(_S(Dc5#awBe)%a&8Zm}d>rJ0H^_U(3I0cA=_ zih6Zd@eA#reqry0b`i-;wYs-XIc4jP;ogCMvLDUfF&eTY_$hb{l~?F4yS-zqvA{NT zfn8^NN%>5Flh?7?uNz3oJ{zh*r^V<}L@`mB_OylX<2NdVEb)2c4K! zZo!?b`!w|u-H^^O5&m4IuHC6>gk3(co`*RLjmy3Z+vM!qzIP8Q+@~5n9dm{{5ik8BVC7Vpp$DEW- zOf1s&z3k(;&1xhHZVr3s1M$Rd z_`;o7&r2>zy(YDtch8F^_faiBFYRXQGrv)V&)}cz8h)4I9)y7N8i8Wv++RV4?hvOa zuXjq$+gTEX9;#BgaXB8>)!^49@p6bAKMlOUP2-hsD+XE!yUQPlF3>ZP7^UYT{Q`*wXcQ zEbNZv#edMZ&{x2cQPe;PMAJWtvjo3J{92sNiw1I#3X%SOK~A!(?g#O_s5=~cyt_I5 zC$I=}r63~*AXB<64#DOAVv+s`AD|`GxoqM5l2r{5_s30FVEfor^+-#LCn81tOKSTk zs>jA}p*-kI$Cgzs>1f$j8%e}-{NXv5^iAw(TRO0KRp+^Z>I#(3!+n0eFj_pXzP}sw zF65rB>dxZA5@y;l36X~G593;mHm4r&{r za_++cH5Q8c>GGJ79u3BQIpJ7Hx|o+YdRiKeh5}0D#FeC1N-ZZIkAyjAV2|GHz7?l1 zMuX<}+pPLQbY^onIA%ZoPBl3;NbkCDMSY9;pd}U>Mk~+wlL?vR^ym_k`*0+}xaE-m z+L~Y_>`^e4^vxW_ko`IJu|?Q%gm?U;DH-E=x<7qQ*OokAAQ+Z?>cE`2{fb`>p|nEY z)*B;X7SdwZ#8ge1Llc{B-nSZgxze9n+hVH6J`3eJt--Q3)`JMhDj?p39m{a((x#Y@`ub5Sd*k!A6xZ(-jQ_B7@DPOc$U z@%`y%h{ypiW%6C=7RZk>b01=>!?En;gzRy1XQ!!nNIS6R&n6lM>*K}2U?5)JQmH|D zT%hL~yuQG_JMKJdv>@b-#|wjc-`3l9eqIOE zk9$=gJQiOoWl!TrESlcQ?u^D!Smng^5t(MoN8o#cOGWGn$U$D;<&W;T^hexJZA0cO zMNHvg#)P4vz<-dPugPP`DEA0qo|4gs-wHCCniALxybdwMP8<6?VnBJ@ZdqEp{J=;a z(!a0)@^;*^xNiA@#d(I-qa_=ccb2qo?@#vV$+^orOIx=MCG{dh8%Qj^ZsUS|OKTF{ zBmuh<3$NQWf8S_rVn8#lWyj=_uGJljcC{-?Y4_^3k<(kr&NuIRgO2~l>DUQ6E(INt z(Zi#KrrWYbh;-9MX$g4ED^+Ml@#Z;eFX|<}-?6QJWhII`82o7V%4+}RTMkfm=Dz*A zRh?Dw>UdNRl1}IKNZ5LcR+CeVt_oY-+Qm4{V^I1Xj=7&22^xakL;Y86(TvY(>ZMS# z_VG?1kXG@Z*Hjwn-6`rHOY@}YAHI>3ySB%G4gf8Vcil~q0M-rG)Dy-@U0XxkW(fQ@ z@JayiN6w7DJ%~9GuO~-U-~a5%!&M@7%2lQrN2Q73f;6Yx2JEs7<@nw*Ph5LI%!+Cu zu?rRTIVa(A_2*Pl%}yEzv$}-zGfM-0%B7lqC7X5-*Q9M{X}?6bUoAeZ?ZUmkdX}oE zKWlZIexrVMzp41rE+N@KH3O+v(9F3eC-qBalEn*}*Ib=P_$ZHjg+}>`)F1>cgqdIf z=Wyw-Ly+(yt-SQ8GYIHLF-DYH)Tm;I=O82u#m9jawVz7r1Y34m?(Pt%f+W- z_D6x=T1|>PGd?yp{tTTPSru?i(nGB4R0MZ~OdXP!X6+T zm=*d)?!RUH;PxF?2By}i-#aVn^D4Q~>J`mPcXzrA*k-PX|96qpxo2tf%9?0yEGH1I z-)q;auL|ZGQ5GyI>^px2Y2vcF_M-lxl8_Y3McI0oAp9PTwB5!FabT;&Q)^p-q!Q`m zzFD{ojTp_8a?p7_dmB*QDV~VdtZo`TW1du){xm&xz_t{++fHBFw6>ZGbNM54&+a<) z!y^qVFT#+)+}s!omKFA0v>G~}tmLn{pueOrBt;X6Kvf0m>`zd2XwVOBo7W=&SK+evh$T0p2k{CzW4Z1cKF+9bDdu#sseV|Hdu0+>QmD-e}zn!WBK$ZMqX~X!r3-Ktzd3zS_Y&}0Pe)~@1u?!1tzjc%fYG0FG z^%0nKO&*mNfC{|M89&LefIQbkm@7D#`Pw3ePCEm)45&~Y`8A|sO+QdNyE3-VpP#FE z0-F-^Qu*G!7q{+O@>ht`e?CTq&d37shD(Zm77KgieEBPNHIZGL2G-3X%Zmz~F$I;* zhWTm?x@F)2FAT6qfq_WDoyG_?MN-x>nTDt|kZ4q+5f)UUa#HObB1^OcmsGL}Mip>d zw4!llThy*5m1T`iz6$C1IYH44X z>o0z>@4^fB{n9!M*kL7BTD6Og=3Q0sc-bwsGlWi>0&wc5L7P^JkXmbGS(IFNa>K7g z7O@vLB+0BP>bAQ{)yrDg?^R>8V^PsMVM}f?=B@7P^t>I$<$Gy1{uh2br?Y!ix4uQ_ z;p>VPb&SF_@n*U#+m3vqw!cDW32a#zVaM0>ivHRs5V(?HGIq6)$;fVHdBwb@hOPNZ z2e@oQ%^|lRe2?mZw91z1$&zZ11ltCca*#bjk;#(^4?SMcIns*CKsj=xqNzrIGQ0W^ zd%AzT+RY-G9+TX~U5)7))Ix#G%AefeehZe#GC?=4Z&EorUa*gEHxgGcqyA0X+|p0n z&njx=qEMc16}Pjos{fIZzBAdY85;D9dn+T+uM0c-|H)K;j=UF8MP*e)`j@e%F6&x|=%N16Z%-8Q1G1 zmkBYuwJZ|evQk>YxxQ80hBQTFww1ZFyj#%zHZ>gmhDCd6dRxwzQuG+di8MP;^WMdukL)XXlYFKGH% zIB?~QQBeSyjh9d?bpK5SFCa53E(LyEQQhBcV_Y=Swu`W3N8nzROSh3ZwXKwXzg=U! z@G3zEN&lwA#5v2WMCY&c8nA7!Wg6EZ_%V|~?<85q+?v6)&X-l=hK%p4Yjuf5Mr_Ib z{1jfTLJ37F^}jnkTqk=F1mC&6knNV0!bJnw;ry4WMuW|6C`35GpF1!)O=yGU*X728 zZm>l5F>Jnta8<_33%+tcz)zKvHBjq}v+&4zYysZY04a5UpjDdk;zC4tQ^`kwwK3mZ zARgWTTk`uZ_@w9*5uR%2ENMW?r|KnZ5(Y7x515^BMvysa&P*B;y-UI?adT!ykooQo z$oM6E6o>xmqcq~GDoA)}4>;PzgF?=ymJqFl@(7~yhepUb$`v4X+4kE;8z#sF0(+f9LfmOLG3JN2Ex5eGfQIU@a}b zfO(h+H5|)GyWCnzcB7*97`eY8c99|!CV7Q;)U?n<= z27i_*jrU$dpJ2ON6@Qe~P~|&EeY{XKjjTYsKHh`H;zT40ZFFCOnkF^onvsoS8MOA! zvMoImC-+9~LdkuUXvMxqw0eZyLtBg}_8CnfSISbVx<=*JPCP5EC<2SJ{{wwO77=LS_)cW+P2(WqI}WB2HX^H?-cMu-6COtr7zoc)iJX)aB69FtCJ3=mBJ!7;BdMj z;_17@^j_^fJty=@z&;r~$%}Q2YO+kZ|0dg!P%dXPCf4P`wkh2-d+o)&@at(iPia_L z$z{4Qso&#f)d3Q3`_9<~v+6f6t4#gjr-J%BczUukc16O?8u29ROSxhU%$8;>hUSu7 z;X?j)YZ%+65;$Ba1fNNLx)XfFy$Q0S-KwOM5CPkPr+lF_O z^@W#jPzOtzzyIFVQmmqLELCeL?zwY|Vyt1+1tWbsN9N`QwfKp*BU0bR>svNA#1b)2 zFg)j+9ZS#bU}1JbYdJNr@>6>Xs~0ww*6MLQhSyYAG;#H&#$^B6GrHl=En0U;e?du5 zio=*LOG-BnUAeKebj#&~wD)nVnP!04#TMx7KKJ|5E-nM6*x3}Hbbp2Wc_D*%?Bh@P zNv90O6Mt;hf`Av;O)aK>O}iVqO8 z_@r;;sJep0?$DB%Vg)HWC;e1J znHqvirqOpc=Vwiu6-hLZ+a53yv{z%Gd^bR(a;)&oxP z=QM_rJON+Yd>N*OL zj~Qfg9x3}_EiasYJ5jfyuYc2Aq6BP=o9V46GY(sv6`!S2!uow3O*AAbYP{1iZE#N_l(V-t6)#CkQZ}4$@IGpG> z$>BUp3ix~pe<%OS5}u>d28&a;@DZ36b_MMp+S;^-O?9ixa*WxUDbBj{;u>Sn+uLUi z%#^@VwH4cXNypb&6j|qt<#e>;MqTd72`&GJvpC)}QRfC`m6MD3>sX|j3e5P8rBuq? z_bu78#2-)s~ceWU6wSRk!*6sCH78!07cle~N`4m(b#?W?2cUNK4-A%+BJDy?1S%+YsNkI}imxN?&(E(` zT71gDnIX#VWxqjX5f3Vhv{JBr2*LJ1&@X3#?e)ueO^^uP%$IHuhi5P+o)yD6v9)`& zig?w0F9cHWbDT$cRc{^#_$_!-LR7#d-3=-K|KP9vwvjkHt|qU89S?QzdiZP4`Q?A$ zuch5WFRv7v_ZfMRjx=ppw{7%n2tAsO1CPJLg18!Tg6QG`IkLEm4(cy|kfo=C)ge12 zFW92Tt95#uC6XHo)o@UgJTWm&F(&>@%Yv=BvHnIR?C8Tr?qtgLGoy-5|vyz1E>{NM9lo=%jZZ zzt%lQ=M?E$Z-Ex|{A{p%4l}TbrIkxR5w3@6GcvNA5Hl!PraJ;$LTiDyL%}5=06x$3 zYN6>rMM4eoIXQQ6n;)NfR0(HaANf}yG5Oht>V85pb^|`$>&)|zWBwENCeGToa=?hL zChTjs^b`1AAaQX@a#g1l31JAJ!vhVUh@P}UKHjM}jEfeY-qCdW=tq=1w?|g)YF$_n z4L2{H-MgiwM0TqjpxGHzEzR^ek+vtFEqXtF5erh+sr}_9cudXQHjPA+BAZA=!lmR7Ft_ zQBnGj;(3=iE*D*1FIJ6xi8A)3kI=c~e#P}VKYysl&q`aJ8JtaY>X22-Js_gnSK!`I za*Y?vepiyBc3L8VzByLsajcMON?ubQBj7vM#?4~Or%^0#K;>wX1U;lcsZsIdz_|)$ zev66k4T`S9uR*(wGNZqT`I=Q<__;_&B4KECZXb!d_90ClqDrDeL zi8k>E#RzxDkjeRZf%#%~4E>W=3K0x``A`_qeD>t;aE@f%rRPf5rZ`?p4Ml3};!Qon z<1n!^(~7Fw`sR(M3WmO#0HNK`IX^(5Zt-QSh| zVet)`a&fg>v2xeY)&%}bZ?Dv}i>owc+qSBw*^Z4%ZlYa^T}8EFJYH6sV}Is1Q1BUi z^0HZ5hPRU*$ITQ0KWNsL(GmST&R)0kk#LaO;UGk$AeMz(wwbC4M;xiIK1Zr1V%|K5 zNC52Z2ID&EnMsQNAoGka6pPABBkTi zi+Wn-tS0_jTG!Otms(h+3YW%5?0&B{DCBnLEEQS(^RZ^+>|mkN35-}!VO z?(4BngI%@s_3YYE%&*4Nn<+(;U68&Y7&j$6J1XH0u=FV|D}KX}zF^9bqg;jv_{#(b z?=G7>APq_1hBsgs`zXsEL?Rp+FLshm23hVBfC(^tPG&4e(UFtc;A>EIjsFI%=ysWS@eR%p85)zHo$LqF2D(#`e*?rkVBLSZ+enL`G&HN>vh~ z0Xrje+2m1n6nqWeC+$Ylj^RJyD)gyrqB?@b+vKVxPmzem}w2UZw zY)0gC#@L+B_X=6f$i`x@QI4{|K}LWB$nK~8PkJJkTUp7N>_@8pM69$W6+xCtFj7=$ z1RxP}j9iYwl|7^9t?Jagcq`2C#pf*CIxx!R!x>^1;6#uH?fb7Za~?)WsE9CgL1bz- zS+@Q;vg)TAmSN8W4|u}y5UQjpvYPm!CmISza=w_rqpJ$L7xhVfkwE%6HaigUA=h>j zVoM4;J^d?xDC}eP>5nV8Rv=Ef}=jw=oOj7j!9`FAS zi(=rfE7O;XzL(*KXEE>lPFt3KkAIeFEQ;5$?_w+@zwxn>{JHKj@h~?AdPy}t0{P4i zRI18HRhq_?cy7BCM>qxm?!~w<`zCt>vijG&fBsqeHe@nBLstKW`M@V`$n;@kp*@An zm>w5&G43OpQj5i|i*6lh&{VNeQ#>q_RiMTw6CbNcvLo!oKBVe_=)#tkvHJS4mevJP zkY3Y+u?4LJ8EtJ@7z=7&u4pXiZZ2;sENEuSlTC$1jmczV!Mw)}{dik<&;Ahk{UFARX*}uS7ZXT%lqL7Dt zhI|72xa7KvK~{nA8H2R!AyqHzuQ+WxZPDKO747-eP{X19-y_T0cC4kXJF##eu6zr{ z0@7P~-srN)^Q2DnUusg2M?Xvsv@af*ij9=Op?fVo(X8sn>7PpElHZ^zcz=w2f-~VI zcyf%GadnlZT~f(852EvDqW`QMMN`zs_88c2&>2y&Mtg?x?4QvozaIZLrDtn|onS`d z>+{@&=shcTGZlM#2x}V0@FLWGQ^%TdF4l-^pjeo5nmi9ulkZ%VJ-GQBaH4;G-M2G)#1V^rnuUo{pO= za@{n(c?d6O?kS!^yqktg`2#O*aIBT{uQHSe{~K97Cnw1MnUp zjZpQO=ZW?}67W3HOeU1j^iCf7Db2W;)Y*G=<0G3k*RSaQ$W84%-F#9P;n7Rk(5`Y! z3$#j19(8x2|0>FkTb#S1frESGENMSk^9k&7_aM_xT?!}-k_a9i&l{Tj($+Hk4 zd2XYTCD+BAA4AaK2wQg}E$59>WV|4?p*{3yZ9g9z@}e2q+@oCj-pAzyX|T^jyAu&; zN8s6V2O(-ClsRO^^TavZ7gWCZjLx#&bscqU@vR(c0h`K&?M3}Xcoi+j7b;#|yZDTb(%v19J`MQeXV`YEXG$j>BuGP8&D8S^vQp@Hq4 z-Yu{UX*+3K{asu8%#x6HS+qdgslzzYX;+c#zJFkI<22PFfd{;S>>2EYq{Dw=8z|6h znslHz;i>m`8L#Ty?17y3RAAf9aT|HQhO};s~m?*>Ver0wd9j8EC>_9?cx-3ZR zaOU>r>S!Xu!jangc=No0WjMb2P;z^@LXuAT7Jj`yqHpQx9H}aX)#;1tN=~Ff7)1Z9=M(G?~UfJ;0IYac9XRQ|B^wDg?LKA`WQ_;dCiwJ6%db{CdiDx?Tv4 zjO4wXp6U1|X};g2-_CLfD+znxs6;k+JG2#{t7O}dAPgCiA~}<9Q9C))v>V+`ZIqlT ztjA(ynJ?FfyM6QX>)UGQ`#*)qhRkllQv$(H1s2w{HRKQb+;Jn}UnZAS!fMo|kEef* zJ^CA>tG3b59*O7?{Qo1G-dJ~5Bp3JUB3Hmvd>9%~@q>AJ4qXx+uD7^; zUX0UZ9(b)#+#W-3)#50(UL!lW~(~6eCX|>6aVQ#8t$`HlzO= zmbj?`c->xE2^0nu--xiP!CwE7O+H>&2H((iy1Xk83|%UW>;KF!zrIx0&X-{cNU+Gy z;TE~y)hBf3maLpiE~Wo%WuRx(NGEJi)HhMc9G23EPOC{i{L0b21#ULNvu4bY?Or`X+YF~2zObT zh;S`mS_lmbK0~f=lN8|I!K{!%6 zgt%jt#yuvz%r!gPYPR({aX{Gl;n`+-uJK1wWWRTkseZTV{Dq}!8tYn++I)q?4i0%+p88f&S`F* z)3mVC=g;xRHQYfDl+K%Io;|<1dj9O@6`e3tDN1q~Qo3F)Lg7IHJ8b^EOJnr?d>}bxTNFyZ8!t#AsOUULR z=?4kH88?XB3Q1>02re?+A(;pPZgvc_*TIQUr}+-ZI&{H`sL}>o)2$khWh#jIRGErv zeG6q}KgJ%KQUq@NzhDTW8j0C&*3N<;n)ZQW&hoGt#7ObosKK!1JK5vO9^ZGiC`!fd z7)CvyD6z5xdvwasOEiF$1AP2BI7JN1D=ROQ7huB{pRrJzO~AP(YiLMH7!aR&uiSa1QjO3b-ZXe+1v8FGfwhiQ)c9O@(DGu(M#`A;wWu}B9?-IOC zW=2j+3pTo)14_6ER|@=LSvjC481;AlM>X<$3Y6k#EV1WwlCT5)dQmj4mCP%kqOB0| zpNY#Xwi3CXD`VTXa}U(Y1^p~|1|VkyxGm^hZ$Vim*Cli7Y3u`bNmR31Q!(6u6AfCuH9}b$dB6Iv6s03sL_Q7MFlL`~$YQ=Vp)Rjry2l_FP@{nwJc-BQ44Xh)UAxLjHl@_Ku=_cboX z({%ClgE{WCV`W1nQSwaSO}gbJJycu=B_VnPoo6iel(v=U1Uxa6zVrBVD$2Zr+uOu@ zb)FULGF7{oiZZ!13ue1Xb5|z22zx|0eh1AR8Jg^WC*K#8cHKi(tmNSyRvz8rk&wH2 zyWg-I@RLraMeGf5$JDqX=}5F8PFC@V2Kb|wEsG{X2piVa$A{*hWovh&4M069oimDZ zMMDqg_+&ER>IY}5ONO$PyNJ)HAc9qrhnFGs?hSo}jgI(B8_vn8*_hn3b8>uuc8O1t zkb);88Phj+hFC#-RzmYT<0#y@Gfmv!0>n``P5Mx4><#{|IK{^J`#AjccT&XGMTi!Q zt!HwkDk3$b;%OUCbH{5Z>ml@Pj#vf6oiHNFXh+m(<}t<05nD3w7$%?j)Pds-h$=ZI zJ&hK$ho+19LOOB(vn8D%5pYlF1EdpJgV$qVo8piFt@26IN!R){iiV#Fi~hc8q|>RI zp`44rIPu>B>BE?LYxd0LteA{RcCtZXgj&%XL4ysB_?jb1gImi}!Z`89Y=W@O&S=ea zK^+RK(H`UZ8x)=3`5P3SK-|NIBa&>w4`$%*cJ_C8kRp8ViHI{rH$=qwH)bT7YKP++#{% zN&9xTX<#DNL?mF6CxQpCiLkV%|J1pyDvbA@v~bzz>}BI)izlLZXZ3gK-$M^z6L=QT z7kokO9@^B@ar$@ia{Zbfb^CRF@%-MQSR(Wf4d-82H-d-rP|<&23%`*~68|XG=QJa* zZ)QbcX-*;nd(ecF2J7ZDpr{sTz)+opM}h!{l%_W(M4b&wy9MG<18tR-JYFem99BS{ zw(eE*21{A@$`-o>|9-Z6<`*UYyQ70BYhnTH$RA>20XX+^(yL^M5sMXik*|b^U)^uV zuim8i71|3p?+#Hbc%7MhJqDbzoTC)1;gvx8`Yp?$Z~CkyArO-K^&{`!6|7cg-dn4 zw722wQUn!X81oFmsjlelWAz^JU^C8@cdc`Ua(=nVfs{*b zWz4MiaXw_*WIZP=*QClSPbvC%0BWDg!e55kr$%F1;I=}jeaQZlBA+>@p?b+Tq-d_@ z@mH1Sx6QuzyHubz_Ujr)z25xzGnKcsEvoKVNGoE+-l`bI-YC~HH2E3eOZ6Oo4*miq zNkeOHb!1v5{#BwSZ6X{3uG4lc?rQ0)U)3{rT`C-KM~rCM{8Z1pruwCHM`-oj=AMN$ z5%^WPuCgKp*P@(CRoCNX2Y(_jXmAg^jw*x{ zGp_=M_Nl}(XE3;(@gvq6hNYKvi!-Uc`H6z=CJ{eR@n8tT=Z<5EeZA+jTh``_AiA;W z+|?q6-ixD&?}TB96p~SQaT!&MNJur0T|P&jEq^OKhfjbb$y+`w6@iX*RPoFiDM`^i z7rwgmJe$|bdxU&4pAvB-KAP4kZRPXHb&k@m{<2veWqAI)9xqUOWFt@+(B~HS)AQ&L z=v5JSO~4IcZNSJKAEJkrVVYQvjTAMM$q361pHUo~71qO2c(xRZm@kineEyb@9+ASW zImW^{){E(E@_#{VQv+C#p|zjav#p#s?uh15Qf+lJwO3g$qK&^8ZK* z0O>vF!QU$M9_rGxET_+ku(qz0iyDg9h|}gr$gPfiw3+lB%W(hu_~#_(jeI4@ zRdJFX7cV0~4)>7{0CJM@4t&V8q|-p6Sg`akGD#zdp;D}~jgf;o!3=Mbxv?PbwS~wH za{Ka>iYRl(6Zz@G|735xTa%O~lz91xFIT3dttY;pOiI0^|I|;8NORGf$jyVSVyL?$ z{PbMgZ$Ux^oZT%ZLDs}IpEtz9>33po!(d;bn`i0Ej)wjI@KJUJefoMV7x%NyD`p3b z%3R7f)YJFLMFmRwKAk?%n8<@cX2a7iAV5(H64Z8TH#ag+E6)_HP-V-1v4$odN zAe9Ka1>}YL`8j7ye0&?OsLq~!%II?x%6la&2XjJxBxiP=xpd^ru8PH-sD2MABrAD? zU){6qLnC#|&t1IevfT}N1PdvlKs4g5-@1F=vVHUB?OWEl`;_{i8jX`ayciyYLy+aT zU*Oo$@^sHch~$h^6L$E1_^x0dH+S@ol5v0+4*cZth0r8lNWeIo^&FY8?j{25o)eHcM(uRn5Q zBsUyY&;S3Z`wsZFseXR2I1K+xE~;p5%P$Z(lhdgWL`z0n62o&! zUq_;LCBFt?%YwJV3T7%NH5086U5x?28Qb7EkkOZANGrt?V4? zrPPZ~@4|+zrL~Q~M_A`{5va54dBe2j8xWeeQ zqD;=$ELWYw^T4|MWq0&RGQ@U|oX}h}u&%3YX~dw`NKRvLTBKt^xn7f;Ti3dzu6|Wt zNq13EcZvL|AHHV&!t<9_g$s4E&85K8zH8~ChLMu`l^vaHntG#sWo4uVE-UM!brCy9 z$@z2@pEi*BoWL=3ixy6qcbM#I9ovz*iY5npffb1`Q%`H1S`*S@Yz!;W*(Qg0@OG1l z=w53cX2K+TS`}*4^3F*?~x! zPIeG`7&UiwH8*#oPvGytxwCx&%6G_Is;xF5uNLX{vvbG9W%f{??32$+mmRS$8di2H zofRpiE-5YPiblKi;h>J9doX$0cQ08~Kc}RAReRU!rc6(1Qz>+)Z)X87eDFc8WJ> zb_AjyCgr-xma!%M8{5Ji3+w36xuC9UARZs6svJlp2J{_U`s){VhugOdBo}r^I?6|r z^>fP0=hP?XAk2bgcHm_etYTkHdv7FeeQ(hPMu!PGX!nUWz1e;$%^XT*!meGUCobFB(%KZC4Z;iWX=Cx~ zYK)4=j1yF7zc@w-5y`K1BU97u8Fc{}`H;%%% zNTa%kE0OUJUuzmUlk_&@jhk8drs(aBptpYk?=P^$TG1?+9i7w(osMRA>N7A9m)b=G zc5XdeXVAa^xZMn|q)Y9N&)K2Wtp;Fb0GP=G_wav9aVuMoPas9H*p$!T7wF*88!tKS~BmP3Y5s&p-ta9MWfp~Gvl8)9T zl*zgivzxezBT(F'Edxm_b$n~J8b?W$T97SvkorxutV>zpr>+}hT~b@eNIk3e#x z0lnR3)aCiQ_b!`A4wW`6YwK9u)CpRv*xf*PfwkWB0A~W$jzMw1i}*$zTa~&4?3IN* z-D=lsQZH(3KZMDJYx9w{7m3&0;=$*T7dfN3iTt-v+?ku2K#SUDG_39ITU#G$P4v!f z+IVb=JE!DOirdxM)z#6_B~#p{XiHaDOLLD*gSud&`lr$-$E3KhloDM!oZ@~_wmd4R zH83)U1|!+7Xj@#@u(CtxtD+o=`)~k*#V)csucveS+?jR5CH2eOI#)Kavo2XN=PV?r zsU(uy7gIioc5MgEJq2?I!5v?wx#Z%_4%;2^8$fd5+;ff5K_Nrrd2{9(EeCc)w*my$ znwo2IqOGCy7uak2F6;^bN=W=XrQ9W^lc;TmXvqfENBZVC;tk9a(2 z{PA_ewRy+kvo5dB9&3ruo@I|VCx(XsDFt{8vfpM3hz`oshZYD@04WTv%vTZl+kz}2 zUH%cX%cwC83s!?5>T3LE3H}&tMGX>{yY*FCtxghB_rlmjIDp=R9R=J_n17kORWwX! z2Cd#;ZmVSyJ1SWP-AM(WaL`$17oEsv?d=W5ngW5)3HRb%X3=QT@A6l9{Xt36scmk( z%~4Pj4z@>5)6+{?>_z?sJ00&#%9z4BTvrFi2uy57lbRu~Ssr^53IZZSTOW+}cto|q zWpY+}L*?bsDi8!S{F|a-N4Z^c0j9j3P|LK+U~x@Rhst5oyO3EK-czB%e5iq>Kw*Bs zgydN^7l3Q7Ow{Rhn!3`Wx_tCxVfrAu2DqN$U==PqgKEc=whtU^EmZof#%%qj*{aul zTaBEomau3xi(yNZ`6}Kb)mcTsX81%0ss0n_^-Oh=<&vjgwGiej z)2h{*%!z0`hM0eyQT%y<1Sh+*td2laaYBo?Juy9Dq)hrK-$X-LuIiVuL&eDaFhF2YLw-Cy`5>0L8| zf9_CQNEyg3D1a5!B(X!H5th7wkmMm`2>GjD-ZF6&NB&pZy8j6!` z803YKNMSJilOn%A9QOM$xj5vS_=26AgWKHko?$xy-jPJ$n|)2rDYWV|p~`~B{%~hv z=G>CuBH%R=DJxUi%sQt{M(YehYd_E$I&OLI%DU%EVzCn7m!dmEtP{J#KL&LR&37;E z%w)anAop|JAyXOMDZ-sm`56i&r8{B#YPx&}{Fi*Ekae+Z&3=kN8A_W928ps6%-|Zh1}}*(WmeUZWw5Qk{Sr6dKpSC$2Me71zKft}`?b z*QgQK87hNoU=r6EYJh9t5!aa+iECgH*O}RYYo!gDF^+3s5Z`A;8LojpT>pRA(+n0S=;EV%EjH}{3DUwlN5dYcmsDFe^B}WYe$ytE&c zw5U1#1#>5}jxl7Zp+YvcBI&BfQ&6DtyWM^&=yW`LvHUEQYhxO$$)p`}$vO|^N17di z6VAm5ee?PY++Lr~zF1TlouZ@I>YzG8g^toP&cTL|ZPiw{2enE@qlvY#ZW%l1y9W#0>~+vhno}#>1za-Q z7=o4urM?9`b&RANKucs<-forzWvptGj0mwqavoiL<}~BiqRA2oczj}WZP|>l%BS)Ff` z?w@Qj`M`Iv52D3InMe=<4Uj3!pA3wwy#@=Ftdot;paVI8z0@$bGFlsm5ClfiBt;5i z1%Pn~Fj`cAadn)Av$vq&;YfE$@nDs&vfOLLmJ|N^#$c?WAXe_l6C^;GALbe+p~A># zev5wSpjo0|OBt`(G5XudM=?u=nQ^q>LGZ`S%0u)l(86gdXIGWauBjNQs+>JuK2%jU zT#f&gLlyX40KC}E++*Y|Jwo*&NNFkjJ`OpTN2^v_t#ls% z2i|1JL$KE6oNF|wAejt7i8MJHy1I_0na?D~!^>^6SYze`Z8I#JO46T5oM|$0afcke}@3z@s z{iby?^E~FudQdDDIc@$48)YQt_Zh`8vS(V1>=X3)PqV=wNd^OC8G4?7|ESON4;}VA z-uF*<*&m_)#iGR`vezE={C}?gFSmyg)4ycVX>wmFxXZLBA-Cry`mCk4P@90iRq1Zl z4jSl2-zw@*j8b&1l2TSSG5@B%##Ir~dR&6m8@AfQ9-YDExpVc)o2FlSVUMWMdu*M1 z_jY&h-P2|B=xH~*M7o=KF;l0!7RmB36tJinGneSs@jAC#(B_4#wvbnAaC&sf8dv$9 zqDFAry7o*}Ca(JZrs?0fP_A>3T@1}X=mJ&%sJ&{6qH_BHuIzo8>2^?V*{?2COLGjo zeO8?M7`x#XCP-FG6xLMsNOp^<%Hed!^73MCr=!Ybu}k}1Wrc4him;Qh3GNw1@i(h# ztR~Usbp6>^nXk&P^u6VB+C-5ukzgbYV*kf1JhXO`JWDGGMUctxO{IuXAW@nQ+Zq8F z3d;~U9qzc-8+SXLG6cN=0ut25lqjsO+)poay57pX{m=Avla+vs7qKk9w6jGC07>wy z2Rw~{C&NpS!(kR9S!38GlEWdLBf-~r!2kJ7~yh7xT$x=-+6$I(0CT>-9bL>}PihNvQF%fqN{tpL-PU>13Az=x$# z>)`f_yg_E$>;)h_3fm^v^d4$@Os?sOoYt4PEB1>_O%}V~?eQr!p=}M!9QI81CxCU2 z4C@}|2XfnLaDSJ4f3JLhFWtwR@jUY!`xDx;@g!RAifTwlfnlZ9Vxm51aA{`ibi-OF z_FU6;bZE8n5b=4ADbI8^6tEhvw0oD7hgwiO^K_;bT4A&6DrK?IX!=cB{1zq$qfa0Q`ht^w7+aK;SJ%&4SIcH*F6s6|^R z$29medFiB?6iV_i=JZO?z1d5X#>JKmG|*3iEZkbI2GkM858zzJR&_O) zE|&}KlJQ>7*{iE+YtaRCs0jrf4&W4r?~0PD{%TQcez-|(SGPW5(TLYHs3p^NWhRrl z0ydG%Azv_<_iq!d`z2|=RoJ#)5{2~xk~B>9%{8 zR*W_@x2SBMh1D}g>zB3G^&+}Vja>8)tT~@A+E6%h*@}&KOw7A^L;uOx0LR3OW&8G) z_Qa}cN_yjUx3p~e=89!EpU}SOwvA&udwZJH&239Z`?q%1Rdxkz);C4BP#A1n)3f;e znM>~8deXNSB*F$BDRE*Ith;WaxxT(?ys^2Rbl;T0Zy#DtyPVCDb+@v*HJQ{-8t`aM zA*L(KBV+y2Mrri|M!*-!IxH|-E@fS_DKR@P%BNIQ#QJ+z)mkIUlzoY>JYuaJE{;4iLr4lXaQ6N5fSMZLR1UpiD9 zY^bjAI4m_Y;xN9>=nS{Dg&eJGZ8>tD?;FHgC_btOk2I}=vNS8>T3(OL167>bMySl%K0t7 zvpbO-Orcfc3%+<0WJ7E6-bA6+U`Z}%uAU!6oI1WNm{AmID#Vv{E#7z#U)C@EX<73`q{8H}+e%s|!j+=i zW`~2U#s;Oj#_sS`hl-N!YHxLOBtFCKHWddNW)Bef&tX)Dv}l?V37n-8M{ZLzC`TsHcmf?wqHUNm@{9qgAm4OY z02C$tSGKJfQNDY+`};eMzL*%&*{w!1pU_9V)5WEUM7((ES2u2Dh+S%PbTl-!2%hjl zhf6YS@K}VaLvIHoks!t{$GZ4I?s4>1D>A{;;8(P$N<4MWoX9xGV%l5mQz1!H?z?2@ zc@p}23DS`EO8XT$NK>`|9D>ePi#naCKF6B+mDReDV%XUj#iDMsu`a}mA7_-bf|&Xz zYZe8IC3Sfa_Xzty4>Awrqs$tcSz=j<_d4ue zSRb*%n$1{Y^PImin~$+#FNAjGZqx>$me$=&sEWnDSIJ%i6ER;&j%8mw8%LX_o`yRu zNoSMK^SKw9AIFtC*!75n)63pzAIA^AL>F=Z>Bn)jMr5vFNsfk3;z?9R#tM)PLzYcY zAaggHEOW8;%!R>g3|6PHD=ZQ_k#7@;^=h4YXEtjmxNmA-- zS`p=y0*1rfnae}(LnMrZ2ezZ3%~-Do4b{&qsEd>)UDYLd1^JeIo6!XqS5N(bTE|Bs zMV>r;SMxWF9eSf(SioxHZQ;7c=-_yL=(|NxgV~_6dJNd&W1q&Lshd~a6fewaX|d8$ zMC8j{&g3x@c&)S;W+$4Iu;XW2en|7PI9QZtGCh@phNtpH(;^uYRq4+&^QGZ%>J};l zlLFeEVFYMF!NSNE68}Ou14#RY2iQj!U$&~YZuO;$HebCUE*v~t&8uQNW)7cH0Y3(W zqsGTJr5<44QwzcI@lfL#wR&~^veSEe_pEMdKWa7oJK(CNVROLfo`C)}>q1{cU#vd|-PYx`ZBC+J(%wl{@2{w@bl=YA#J;h8V z6Dx(sIUR0gn2Z9u-;FFu@MVJ)Gc^P0UC%+bN9i4su})AXoU&niUd&M*&x<)LF*djz zb}-QgALQWv>#!Z%g`hZ*>pA#KWNbA`B7)gbt~g|4cXvgwy3SP|!q)EOO>!2Os`hFNTI^z&!-Y*+9A+&q_}4XyPQ5*#JesfbHdw_n-g2tT^0>eB?D2J1jcKKAg28E- zkXWOj+exQq+O#&4&WTi(lf9Ierx&eGp%4}*<0g7$wWKMq=)MIN8R%R*{T^4wroj{U z0ShDv%1D6ZQ6ozya^qdV0e11#YUK$62?Z|K!Dv)zG@1z;D9xB6ZAL7p((9XCd0uyu zUa$8EjlMxRg!z*~9x`_{xbyNnje?-_>KlC16A8H5={^4{8!RaqEGwH)S~_UZd-ctM znTg_={uaGk&>NaO`FZXJ11spgLStZNaq-MRli<6&RSZ{F4p*}BfpotW zm^U%>Yrn$p)}mj*QciA)NstnciCF{|b#gArQz^@&5>>-6m5IDOiRvVqwRc<0phtE? zQ{hA}T)DmV~P5LMdn$%hyK8{l_I14mV7nSKqdB*}}#ZoivwBD=ciJ0GT(j zpSCOLs|)8Re1gNiV4!h9EpJ*zy2WKCwkU**cgQZ8S1_%qEGar2qthBjE7g{jCOf#y zw)8gS!leCt+R0`JK0ZscTp}NGZ7; zP|;7x>#}qzlR4@}5-@W_c8y)xV@{UeeafDz8HtqLGi~EEqc|>Ft>PRbcyw`;P8V5? zxL-R#&RS-tF~6s%a%Q!``Yi(Sb}P?YZ>O{C4TkEOmC;VW5pz)`gqG;rPaVUrMT@zh z+bda(CW~$Sl=fg$aN3NVknbuUN18v;Xq7zO1^8ODnmgweI}7xj(dxvusMOv7H2uYp z!=MA86-tRKk=sjaRMyehF?o{hL>hqCSzVScLVbsXSc=W0gGfEXmdVH8JV;;s%Iea( zt!Fq1G$Z?(*^W`^c#nqW9%PHKdUjiBXOn8ojbhA=-t63vCABZjgD)>B+R0HSON|;# zdu4f<0|Gr~dso+X_&wugW>|#;6%s`mLD6~^S5z$S2@Z!GTPTq2O2mulL*r!zqS)&_ zw7?v9-MA{dzOaRHz0)oV1+>1*JEO~DE&ISGiO>e7KGmBMXQcM7S5_I?^}&OYvv6`I zY?OEZJDd z9}=4z%4S56pkJdE$~U%+E-s96P1Fge=I`U)rIXZi!C;`bvwSp4PpJiW-=0zEmoIzqBeRF82K z2Q5(iplWFw_RRdx@;cRW1P=6NEF>>kC=1mh97o}RXv@QEtS)JkCikdB6P;r{I{PnXX;`g->ZR#0T)l{4X*=g}=*I13MWbQ7;uHuynwZNYJQ=RFHTj;dwy9fJpF46JgvF8u)yk_X$~#3VGCjVEBTfo#5NcbRPmU*>|uufJx5%eO^@DHH*qrq}2zE_(2f zHjD}`(~kd8Rwh4cTV`iP=tQoxJGw|Q(B-smpSH4|v-Q$d zuZ^!?)jMLhk3|}aY{9OoF$(CrmU7!&>u^*|^qJ|@+OwqUcMccZZ!2n!*7X$TK+`01 zap=-XTgxQX&VZEz6}Y%55J4M`2I3^3b2d7iLf0+Co~W+iDZThfKE~c8L5hD z=_5MtQcW1C1Aq!6mAEY>30{WKLRmMpvpVUxl>3>Lo6>yd;u*LlGE7P_4f~2{Gpf(D zgi8ZkXm;E)K9?0!m(jRnkC${K1NY0PpU~$IEYVW6Wg(r;GxN#gW|)gw3Qp8>Hm%O2 ze=@JoWQA>_uh$|Eiev*F+P0Nzsacov8%4D~CRnVx>S)9f|zf5+CE?<*FaM=QE{$#S4F9fL# z`ruD1>hfKk?H6N88LbCpBFixXa6J>ab|R;%qN6?xqf0n)WE0c&aG?^kurG6XkDkAWHeDc~Gl!xV6128g+VyThsR&`211;sO^r- z4fzX~w(kiLN`+2N2c3jQc?_afb{#{?=n&<&BDN|_1 z7&n_Ar1VD*l9PPq3|62=NHu*w5!L(Y>=B8mOC`%7J7sG|mrS)~X3sFy!2Xb`V4199 zoABJrG-CfBo?;VDBD6u}P*hh3DoN>)$s!7B397rx=&`VdyYA8Rg2k@C=We41JLTSe z7cR|q;jUgIhXf9H-6Pm70x#TsH(eU9^I>S?LtYwwZs7KkG@jmFG4}F{Zkay?2BQ>Dl zNd8=r#nCTtf&8${OPNUkdXnc+i z@06<{$!OG(^XTeZ4X@JSqY?u-jT`6Fd(R^%HW>xFF^|sA%Ro}hlpw0vMqUflYjw$p zBO>co)U-Bh$BlLaCm7gAQ|$(UGuVynw-Jq2saC^FMe{`L32a* zrAlopBh)j=2s&S*RoALX9N?JLSfRzt-ibAn)rqMN_9vo_HQFjsf!V3W-cdQ#s%7kB z6mk}29XT968NiI{H#0aF!br~=jqDFo1Nao6ez^xR4pOR*5W@bDK6gQuwOdu!$F5gF z4AiP`P?MCaNxg0XGeejmZV>=mOxmSmcOq>!1mK&^ae_p@K5X49+Kdqiw4VoVLN zKQv;yk<>JKqWnO9^9>r(e&UTIRe zH)dw{yHo8x*=oMX0zU3ydgfx}lQCapww^rMXn4~yCm^@TQ}7h-lI>^;&j7UmoI$dz zglyG>I);=5VAW;q%~79VZ}c|BW5s4?#H^*=b?mJXPeUwHX2T7{DrmKimdIB=!L~qi zC)vE@Ds7Aw*_`0yvHKb*YEcm~N+0bjjKyZ=Wwd7%+C!N9ufzKCG2d3nT*w93Z_$oh zG94xZV}>xnZort$sm*d<++(&}XqA3MeQq&7Pu8CX=1eZYZI@?Y)`yu~m_Z1X4ZasR zMBUFYbn=Zq(~C}QtN!!Y&$XsAy*3PPV_s^u4L-W;{?wq!2>Pf>zYAXI8;H6uBhC;j z7`ji^0V`@ZbS1h^R{TPW!7HLj#z8tb(vT`@Uj%MA=j&Zowa{ADP&#ycdtx})Cb+CB zp)~=Y+~ZoJ(+iEP$J-k0T-Or)Y1_K?kT3PNyFqKD4ULA2Hgwdl8Y*)-W*a%AA|H;d zYinFJv&3N;WRH_9O{+Vq#uhZK?ku0}PhBO#4VXu)_{Cf)dk5CsD9N@b$*7Z=*Q|y| zMuzOHQJ0kMP=FTujX=@|KvziVBOfq_@&yql@xNv$M4KVbWQ!th+48RTZ}- z9Fvy^pP@^72Y3zH$Ej_KmzVREC@%pa*5u|Z!NAJ+qoet<$%WQ4JQNxrZgua>8UFS~ zEweY)2fJ(cQsDl@4wu@XEh@8z2a@sDxTCz$U_km2@?mi{eRs>W6GuvCUAS~`=bD(4 z?%6DY#jG!0x~^elQ$wJAqIK?79oPg5f#yUTA@<8zB~7$H4I~e8`o-cT57`K1hY1b% z9OA1Qy9G@CAB_%QYBqcI(_A>jEu{$WgExl4LF9&kXvi}4h*}PSb4Q)B%$=DrS=9xl z@Lgi1tBJJf%bm!A_?`p^u@m*!NZQ7$uk2FUKm19wPOl zFPSJmsf{2|LpB1LV#!!fNW7$YK4~)ttPahY?)L=0&7%24?f!9uy~AroysgEYI-Va1 zx$IwDW0SMXEQbFL43s0lR8w!MT>$Ms!|M){J+Ao12&K?BuX@EEE77$JVaCeCdpnMiL$Q z)qSPqJ+YFRwKcQgm!t-K@9^um-^sjE956!c?#bbxm8F^xPh<5kgT>^WKf-qa|-rrfP=f#|LX?Ex?Dr)LmDGk6KQ|^$dIy8>|bIxNFP(rLJ05B=e5Q-Gn0)iK*>d zR&_6_-i(i$rf_fd%$cE{nwhgwH)n4zt!@hS*2uSK!6>7p7O6fyq(vjlQbo#C#Op6Z ztNw3jv1-N=BH+wU=WyPGL5pAu$QDZ zVx*^6auMb_p8P988HZ{0#<(V3hQfg01Y|d=tZg!%+%jz741z)Ab;**Fq>eY?g4f2| z?OHI)+HRP+k%FF!bT=Z!1S^=LrKM4mz_M1UsKK`xqJ_n<0UP(ig8ud29)$%`(E%0F z+XcaZ40D;c!y%I1-a3c&By{5aYKXCsu0{#|<5O?9NJWjl&1+yChF|RlgGJz`-d>8f z*Bz_vq_UQ+w6Zxw!BBQ?9St70-YT%rj$@ldL{vyTuQQs1mf~_}=qSK#P;-K)LHcP) zsWd%^{f8R@R}2Z&YS=1)8x>&w!PPp0j?-HVCn3QS zJOF?pdguOQzcXhT9r2y#&DF9{&gpvKIcYuOJGU9^5)u=fgq;uJ4JW_z6-1ZXNs2j2 zJLNu6xF_hy4nchg$Cv?h~a>omdo$6^Xjc#*^shQ@IJ|Ebc)i zPBf#Lke60)^(1=8=i@Gq$K`apA9H#&^RzZet?5E)BY37{E59o9GVXFr1FK=Z31rVqVjGar97iCw@R1d7wsc37o zIU0nqb0yaqDYuB}7Nb?q)34scuP#u2mD?MIh;`R#=4hQRGq2-H1YU17-eN*FHz)c2 zq;JEoF6KMreq_27ItB_0TSrc-O>>dF%&gL{0u@6=%JATNGu2#2b^efYYtk-FsPisR zu$#FQ>I8Z+uwdPT2&s$``Fx(r40T5Tv&S$BGH%hW zSgEsMDIGO)C+hEk?iVRhDdhQ zEN+i#IFr$U#8I`eSW*K=GgtuBv34#Jn_h+3HIvwgKheZmO;yulfc{)A#GJ$niYGGF zOQI!F;|yP`EDTOA=Ye)guOC9qwqF#E*LKYsUyh} zGgdjG2NW2q0V7NxUkPCjy+1Zoym$rp_YB?V1ny`cZPgJ+t8kSgLx3?-?jG@{Aowz*t_%V3gJJhIJ2?Pb-@0{G1bj0R63m#dW(4vT{vy3QrMKt zT-hyhWTAAcfSoS&xfe7VR$(?@!@W&(Ri+-4tP6ssCPZv;Mnu^ODyoUL7ZpA5hA6R~uSa>I!rT7)U(Hfu1oxVhf6J?HMHWmbn_tC*?D$5#WiTeT}W?EtbF=k_|;{~uX3f9kPhpS zcAnnpgf~3T>RCL$OVq%n7)>Loiiye030a6Pjp=#n~FFzStnc)!di=@R(B(!2?V{fK*VMLF$f<^^bWI1J1%%7$OmKC;nAU6$}?DPt-^MS zDB6w_PQQ(CbqdGIVmhg`V+Id*Ks4iJ2k2L#*6UPSP?lra5pt%?q~=^- zS5i`^=S@e{F1{J5DvU;HXA~?r)4lX1qjCQr2~oyq+MkrUcV@+wN>_PiiwH`%#_meRb+l7!tG!VT=~ zA=WmMh9n=!#O3n>cM#c2NL#W37Q*ZKSN`kTl4F^Jj-V|`DGL6Kwj`@Lk+mgf^(DNI zypX9tUvgNd0ZVImCv%lb0vAU5k{lYI;dm7>Ig~f5=U{`?bzuuG+sa830>5b;CXPlg zu7?GQ9nNy%IrSb%50gWyr+Dd!DO(6wM`yOG`5AFSuaQ8IS@5|ZF)R7+el2~8Wb;5@ zqIU|CMK;n#?WNF{K#uyzV6=OzW~0H#sZoTTXeEiJBBvg z$=@z>)!DfLWr-HTUsTbSn7E5UAIuAynifi##oE{&E$T30vF1KzEmD7PZ$BB~H3n^6 zX=$C-fXr~vmwd|9^81gjFX24-;3%f_CHdT^1^Kq(m;`%;O;#en%mrQ>D7c9EAwNL* zB}byQq?5|XO`3Q-Q33BLi>aC0WY5plV>#9c(Z22zwUBZdL}#xRl;N z{*o*Na(woZ0~7s-e$m2m%+Fx4r(Yb)Fv*CNajlJZfQ-9SFT=$T!`ET#jj^AF z`fzS?;yk4ZqP`L~$-KaBlVvqU2317;{bcN5*9L&>Bn3nHMeJyio&jz7UC@?8YX@2D zn3VrILFDwcQCB43vpRh;X(_Uw6)nZycsOkH1T|Q{=tgsiClLwJ4bH?vXWS|-&xN2S)NPd&TGv3@|~r)!{LsGfBgiiWf|u~ z-tH8hc$4{&{KPUmaiVdGd%H$sU- z2pcVk6dr?5u0&TC3c~#fuIGYUU0|^kXjB3$OVok`T%28^)YqXQy&EP!H1?p|I9KX} z*hITF;Lj+UO`+mqu7o!VMnQ!H6P5z#=gC^8O9n%f&E%ETyR19?GvW*sEeI{R4*O>& zVhd95T1;0%*LXGMVts`hWZlsF9q~zS&>~%l#64FA@Z{xKB3S+>$7=JN;mJ0`9l&Vj zK9k$5RiVuW720er&}a;hhpEjUpuQzaeH}8!uu>h?a@LA=0*Qzo!XGN+AJo=`LUl3{ zl?r`os00kC5H&KY0cIII12@9o5mz~Xv@a`zkv4=V_BG5lW-oIwa~*RBv!8jCc^b6s zZRP;dgBn>k8)hrmW_B8OIatCz#6H13&%Vah!l!mS_c*WO&3rx|(!5IBu$3^qxL+}ej!a`wS<< zS6n7;5FZtvhCcew;y=YNOgiL}37ASu&8ACDKQ#T+^o;5EroWi}ZAwWcQoYnI4M_{7 zHPSX|r*yt_m2`)6zx0IklJvH8z|5G9X16(Pt}r*7rEekBG zEn6*TSoT@2wA^BO&GMe*6RXNvV{Nw%TF0#`tS4LdTA#DNVtw0sz=k~+Z27jBt;W`F z8?-I7t+8#h?X;b5yUO-0+xKh_*`BaHZ+p!?!#>Zx(!SaLH~UA9q+^fcKODbuyzF?( z@gZ0c(K*w(-}$J^?Fzd#xpuhDcRlTT$@OQ~Ki!Pm=ytnf?izQyd(b`ZUg6&4-r+vS zeVO|v_jla)yMOL}&i#rf&lB>Ld)9d#_B`o%!SlN3@19S+YVRrD?|47(rt=JWuDnp* zVBX5SO?lh%&dR$a@4CF(^X|=iIPZzP-{$=>@16YW{MP)<`IqJ2nE%`SKjpt$;4kPa zm|ZYYu&&_5g53od7F<(sYr($@Qoc%Gi*K55j&F(Yc;Cssy}pZm*ZF?$H~3xtkiXpD z}tBV&GuP(l# z_=e(#i=Qlhuf$z4SaNmA3nj0Xyi@XF>7vs8rGG2^sEjLHUv_udkIVjE_F>tue zd3AYHc~|+i@}1>>D*tOmUd8l^?G^V|yj^KSuAJSKPgWVL>{UyuzEico>d~qvsx{Tq zt1qg4t)`&n)SBHj57d^|URwL7y2`q9>Yhm&k{!uy$ye*6^>gbd>etoZU;jZvO~dI8 z_cnacIHz$*AWp>L%%es~ywQ5^!t!rEFX#HO6{jDFib+&D9d$8?iZO^v7*!HKkciTR0 zOSkv6?`prH{oCzNw}09Z@7U1s?T&jp9_e_hv!e5i&i$Q_c0S!z*R`!{XV-mQ2fBmZ ziSD89@$MzvJG;;6zN|alqwPudtnRs@=hr>y-gxiI-phMm>T~t^`_}f|*Y{xG<9*Nc z{cf6f+Jb3!PkXn2TK`c0S^b|5j11g3@bBq8)6bp$*z`{ZO9n3;{KE`kM%|1PXFNLN zlbLlhcg);7^YK}cS(URIX7$WEf7Y`@x}m7e8TXq z;R}YZ9)524mEpIC56os}8)v&`hi7k|{qXE3N4z7WBa22>j;tSfZjNqF|C~*8PM))K z&N*`~n{(5gUyQP&W24^~{q5)%bBpJ$oBPwbpN{p6T{iacxHLX7e%AN{>g{^-Jzw^30OIEp1!6f9Z2e-&@8l z^DYZ6Yg{&a*}7%Bmz}rl=4DSW`)GOV^0StId-*fV|Ghl5LRjHk(X?X8isM(DyyDsw zkF0oV#a~xet~_bwfmNGUUA@}B`kd7tuNhjiW6hOoZdvodnm5-9Ysc4KwDz@igX?Zv z_r-CiANTh0vyXphea-q4*T1}Be8aalN*j;g_`^-!O-naDy4kRK>*oL1{K=MqE%$BJ zZY|h4f9r``Z{GUg)_-g(+BUrHifs>Xd+UV46BeCt?TP$}jVF$sc>0MiofJK3-bvp* z>4lR%Kbb$d;^gB`e(03QDfgZ7`l*3a7oWO+yJ36J_A|CWv%|lmf5+AxSMB)qX}Z&V zr}dt;^t2tP-FDgwr@eQ&<@CDK*PVX(>5rcN@fqc3>^kGgozl+m&ILQq-g)27zwC1E z>e#hv*Unv+?|NX@A9s6pckW)ld-v|EcJJT)%dakd-gf5i&r+Y&eb%0{et&lP+4Il79sgK$Yi(+G>OIu~=u@z32Vza+KlT9pCSPWP|62vNRTUNP zTg(_AfGqz_rsb&RFU*)a%#3k=K~xORvqye8eurz-4{@*Wf4HOpAHncD9FJB$MO%D~ z4jPWJY++fPcQa#jWZCpfDE~lt9OZMRV4nl*YK!yta70pf`I$f9yb$N#W4qG_sKAqH zOfG)BV;|0OJiI_s&fH7?jUQv?QQ`g!{6ujd$HNQ%>|yt)jsFi6l@oBB0@zMPA$YFG z@mOUwQ^|eZ@+9h-pFVih@)9$f`=2V`XGGNurs(j(oySDDIgE7FvhuL+W-xK?@PaW$ z;|%fgb^luhJO0#B!Q309!amEC9j)N|GOhxJj)xWWcNu5@A1w*&>}rzB42FkZtn8Sj z9_^`5{{w-GI8GJFb!{kvN=g5oc{}|#l;5KKLn(--mY+%g6-N*5(KCO)b;4#5E%9=@@2X*q>~inMq{|ru09j&J{TM@D#lAcO_`+{{w};5O8G1 z3H3jswFh%b2hM9zx=@x&Tl|Aep8W2=G9v$62Htb=%#A3w zVSe)XO(E*P9VHJX0a&Q+-t=dawEa>h!e4{yr;tMhFrtj%e2l-Au~Q)!WL(gC_Yq?y zK0;pC??QXlVm;6BXfp2v{J}fDMJ`$V?Zn!UUF&n#@^3PUERN(O;Rm?js6Pl_RCY40 z9PmtSq&13r3VDAB$Eozwh_tp6{{#4jLx(=)@U`(>t@eF*(wWPDVB=W67{ zsYHgACT=b>#QRa|@hm;>LHRw(D)h@r#>H>J@84x=P^#I#!T;djpx6ISf53d0{w3F$ z{s4F!LR(sK{yw)lodS$*`Q1f$Pg4foT0B#VB4K@4063Q8{I4iWPZA3`c4&)k*F74vvId6n-_13hv5rEYISP z*0f3d5uP%I+Ly(Ve5Cq-3zquB1&?Lm4EQhO2+zYzH9vy!fi|O`fb;Y(2o~x~;An{Y zNp2S%fq&E!=f;^5%;6wc$qaCV_}w^Di*f==XXd;d$5|-tD9tF9C^aaTqR_KDP=--j zQRw~v3jMYhr5c5v+0O33J9l93(jDN9cVHdd0ls(#XygtiijqJHpafCA)^p6==`HX* zn#rFg7pm`T{qAc&myxFcJHxC%`7=Z^+@r!gfr3AL_bL^9*PL6pd#0|jZyt~0rti^z z!|YEPNwLuN97(PvMtOilmxp(E-c%`tVdy~ zPWHU1l7)f&G1Guj!>Vvp;dl=AE_)SGTjS{GOPM&l%v!h~puYy0Qm&9mVBgU)xm=H( z8Meaj>Q$^0_zkOP7RsfY5%JqCEROu?OqD7LTB7v#g3OV|Q3XmHiV202rPuIXO3(DU@YfTGIWci{LD%5f-{pwO73LSrg>PRC-Dy2I|#7|o7TdLPwE&uv19 zptw-#QA$uWD2wTuznQ65Bl{uF;mwp@nN!gF=~HqFU5}w4S3>&KOj(2DvnX`jiURvy z`Zkoil#!A?5$9AkqpU(X7v+4EK@>>8lVu&wsg7*973Ygl=r_MYNu$tv=)F&)+>Wvr zg}$fXcA;!UnT~QK*pA2jf1wa;-^;+Z0q5EFW!p;kwxCcuv$&w|=sXKMawx;MeX1uvgNz?4OY}g<%57o`Z@}=tz0R0TGTW;R-yX!i5(5DUgps zIkEwr&Q`IfV+XPG*o)Xp*>AGnWB0Sq!20x8?3wmHmxtW4*clmFev{k?H^$B5F6AEL ze!@M?y$Y+8k(YQYpT~z`n=0cg`C3@0F5_?E@8loiA60o(AyuQQOSKr5spC{9sBTrI zVTUSE$JOONy-z~;T!F997x5MQ%6&;+lds=5;#=Tb>)Ytt?mN?Wk?$M6D}6WkJ`ETG z=71xBoz?=uKvAF~P#tItbO&Y!HU&-zoE!LN;9G&)19t}Q3EUg_LEwSF!-cj&XJN3g zs1T`jf|?*=(u0nmH|Pr%2dBZ7url&g^qo)ApK~%l8F*VPC>m=Bx8H`Z|4szWKfh*`~77ccJf684EWB zw7`Nj;11*m0x}k=0u31~YzyoJ7H$dL1}xka_;T7fu z=6U8>=2y&9%#-Pp(reQz(zDaE7$zm6tj&4)KY9A5?+v(FGR&KxWXj*0O>f@#=HfR8 z-uURvrEk21e~-NJIlkxK)MlSxm^b#|-}*Pc`Nq1}f5|YfKY)T+`TFgzU;FyWug`~u zQ}c(d!ns<+tF$SMp>ch3x) zip&Zqf+FA+mjQ-FVL&#)sKGTxjT&Q&F~(<%n#34mj4{Tz5~9W!w-_~vEAGZ!+?W1; z>r~zD+rx}v^4|O9{cnG&?z!ilT23wJoT{!{HOC%kp|nfva(v{Kz0TfXZ;mN=zR})l zZ@2f_M_9S>IhVbUe~Eb?jfjq*CCsNSTv{}}Xjaj|Me~am6fG)hD_T{wrf6-^u|>xf zolvyC=%k`^*%a>5q8o~CF4|CZZxP{54{cldk@qT^lrLAPt^zMukhdZVttfeqra!WuP@e@BaLp<59kN= zBl=Oj$sS|BZP(g6sFQj2`~3g?1N%#Q+F4P`e$#AYPqZ6sn>{<)!=7tzvwPXSqiX8q zOuHbOXs4Q9_9VNz-OcWSeecd&Dr4`)ZJ2r4NexnyR2rSUhdM$Xs18P-6^^#k=s^?UUPb(eZZU4d*ULe788zxGC#>FyjOU8O7Z5M8PF*L&-I^bEbd zUZqdb$LMwXe7)Y@h+Ms0|CWFCZ`F_Ki}c^scDf5vd9&(=?Ngz9arRSRY}W0tO}EAV z+ChzE4BenJDuXVVs7I-0UCUTuklII2RD0{)nFHp02)!pKKTcLNv6))+f#{|=>L5K0 z{d9mjOz))*Pz&`TYOy{{AFh_@7IfA;Y`VE>89HyJUZmFQCF)qcOs&&xdZ}8kSF7*o zv(?FZt@^G$OZ`Y+sD7eeu=zb-n(nx=#O?RdK&kx9IEC&H9(> zQGFk~sotYD>YLOf`p@b?eK%{*Slxi8-NY#1S@o)ZR=uvDSFh>kSj}~s`V%(li~32< z(yr1wtE1G>%;g-Tj@K(xsrpFQGe@(BK2%+-zomB2T~&Wwt}fBvRy`R}_SGd=qa#(l zPOC%obTsp9b%y?$x=?>p{Y+n~e$K9(cj{ZzL;8>E2K_U28(&KH(w6<*&(bHV%g~eG z)F*KY@YCp}`lv3N6g454Yol?|pi30qZ<3Pea1d-|7qW_FWD#U zKkPg9W&5ms!3;nnOg7uGPH!S>H0n)*+1>168rhd}ut^)X`Zm2yAJf-%`IT_D z+=s5e-^?}-nmOhnwEkbrf#zX!|6k3)<`HvEqFG{IGE2?Nrp>%!mYIK=<>pm$ zw0X^}Ft3}H<_)vTylGaOx6B&zwmHVUW7e9@W}SK09BbY)Up4QW0CRf{oS#RFkez zjk=nd#KDYO>(p#LMeVPf)S-G`wOqF{5?QEL>mwOeE?39tqp^}!Vj+A-{ZL<^zK`X0 zkv>OVt$(Pl(LYkZ(O0V*_0QEW^_A*ZjHrIAuTi(_8`K^8H|jBF=pNR8Qcp4}{)c`@ zJ;4mvb9^cGhJHb9%gCvZE>>ODC)i@2@ilK&^*{@CV+CBK-sK;+_p#JIP+ioASc>nd zJz3dSr&DUO9;3$Up^UtSs|k8nwVNKH#_3^Lva_&YXR5RH$?9BvsybC4tG>=?^mKi^ z`UaNkY5J>t(fM_CzW#>#4x_pY^qK10Sh06=zUw{u4$gV~y}D2TLEW$K{a$M?7@rdHTG(IrTww}ncZmbw)dbzud{zbbKasTy6mafM&ER5sF!-uS*uYg z@MSm;b4mqI9yXNHH37DqlXG)`Bjot&0WLynlm)mLdwOtyyC82T1-LW;cSX(~81UT^ zaCf~6rR38sXAF3CfVa=*$JLhE3}~TRLQD&Q+K6Q(__jo9yB4H96H0mjAzDbQnz+W0*9_l7 zPv;E#>8eSfd|pSX!Vrag6uz57+%Er%B_{(Du_r^dkI{!}3t{S*F=>IfmAMk|{2zlJ zIfmS>#s&bNY&(v5S|f^F48e6CjJN^K4# z$F8+3B6N$STZb*?;8nDUfw|I&+s8_{aV>B;?^jAWx!6X-{R&E{3J#j##I??3tJ=Cy z2f%yWwx<%lg_vFG%_R1vJTc;zQ7JcO2E?8REVv@Z8EUZlBbJqAq*|nlbqTi8U3?$R z$Gliv-E}!SzlZLLrr$>Q(%b6ZSU!D_3Fl%%4Z(&Qiu7cKHJ0V}SW?5Vq+Z6V@2>~w zov}45=rgVK>p`ry9D?KT!C!o`7|>8!I*Uz!s~-2D=xT@@HL#L%T+C+jI{l%9&V*$XRYZ#@mm za5}c(zIs1BQ*B~ia)0JkXX)8`jy^yii1m9g_Sypd6?)kNSU(Rs%ME+DMbE`@Td3#j zR;;AI=!JR_Hu8~J$xHN7Y`0~4xjtI2KtFwp_5Q!mtFfMsQPa|#*$7*Ir z_3`L{G5TwIJsRjl?AMd@$ylkU>eJ8(WA*9!8_WTmsn5ca8i&q08yoH%wFq7J2wO0o zr@xIY`yG9O{;s|d>--|I&wrpV!9E<17P^#~gUir`yD=~MPj)>19VdQYsei10qJOHd z!VcR59r=R(xxNPL`C8S8UHVIX9b@e4^{@2}=*gq7^M9*v(!aw>z6E>rR&>&lSj~6n z4QQn{G|^J@?;p_HchW*X(+WHGE>_9@k+V=<(f4Sr|D^BLf5sA>g8shWjTzA459z-! zhX1P@Jz(=bhAn!u{=5E%eq2AHpVUw3r}Z;>6Sk=v!F;HnW3>MQ^Bynhm$9;6VgBP) z{hEHA{_v<;#q9YS{iZrbzop;S?_e8j*6-@~^!xe)tnv?;E1J&kub=2ovCTizS+?BM zhAkybg!Q|xDPs1z*pwK)^>g@mQX_iM=|J9oG(2Ct!uvsr9B_ooE`=*RW!pO*$Dnaw<0D-q?xz zU?a}JKHSgD=I_n&NOG4Z<@1nw)3~KY`=qL`(3f3osAq@(wAcYUWRpixw*nz zX?|>eVt#6_GCwm{V=X%y`&z7QXJcQFg?$5-wzH;h!n(dWSl73U)%|;{>OWvn--Xru zM=a()VJ-g|OZk4R%m=ZO|AK}5SFGblv5fzQRs0XE;wP|rpTZt~23z=9?BM6IfM3M= zeHqL5pIE)GVe!6!wfh#9?mJky?_%M;k9GSYR_(`Fw4Y+lW|?8q?3u_$BDRRRrV`u5 zaxQ{pmk>VJD`)PhC$mqz?6$VI?PL4e?QB20z1@NNsGV$oJHYO22igj|3$s&$?GR?D zhA~&Ss~urS+Di6gV^-d#n7PZ?YFoqn-55KTIlS?90wd+!87oh;d)i61&eq!o)}A-n zW;@wVu~XgX+D^0k*y(l#E7JF~Gnqx2g&$#9YPK?dhzFKZDW!S@xUuY#R_O)Ur5D=o zVTXR-Ud*h)C1RicP;Ar7?G;#&o3Xdw6ASex%wArFoq9F%3)f)5UdtTAb@o^GdS*gy zu)krx=ePDI=0I+?x7b@*Gj|)aKX)+m@Ox$xdZ_-)iu?@g{YPpSY}VhauVdL4W7qC! zH>#fY59&JgD|@HC%igW(vHQEJ!QVcc{hR$euV@ zzHdLUAKH)X$MzHZsr}4m`9eWQCbE2*Sj0xLd_WknVP4cV>K1j6%A+29zpzczE7~^d z9rcO&M%zXGqV1VG-Z9!K>K_e=c8&%{711utB@d2kZbW|0k z7_Vod>Zpcs{20dY;~2$HUWgqd+{yBv}m7bdNd>2H`*_n8SP(OH+Mzrn%0ulZHv=QbxrqTwozQ1e5>G0ViQk8K>m=S(CY33vTiP;j#j>`N zx@8NOwY45qR<~kt+rpN4t5>y_)HV6LBt0(eqfU+M+AweNig~M-E?CmKwya_PvQ;hf z=C!u1k`&VoHN}ndT8NO_ie)W=O*f?^pQ-dX$rsPUFZ|RNH%T!RH%TC$>rCJx9k{Cx zrPC0&Xb4<1gwkp7rISh3lr+_Z)4XIa$ zRBL>@NH^3KPxnzwPef5u>qFN_d8eCd;somhew=M;TUb0J$6mUrF;rD!NT@MXS!0Nz z(MOR94J4BZ^;8{KacBY!O+_;nEnCs%6KV|EZHi+HRE?n!n^N6pELu%7Ua@-Vl9tuN zG)37|G9y{{wIOt^q?MvKb)B(tNz2MbxmFL0A?6z2U^AJ9;+ei+W+n=zHgJ&+xvmXd zq~jEtiuX@MIwmkbW=z-p+f`yF9SUkph-yrTVobn~Z;EEo#ENGnlJ_*JOga?Hn2_l) zO~tcwb;0Y9Y*Tz6Q#3nYrcEJ%=8$kxT*e`?rl#(*w=7fo&+KHGj;$-1?VD-QY$r&H zXG>%C)i!oq@c~i{T@T2!U3$R$#jPt^S1w*ze89pLEo)l49+ZFS!;K5o+FVn7kdQcZ zDqUagUpI%+uMS1kJg)d)Nv7=JcKvgFrsq_7bNF7Pmn@sNWcswmu2b`HaZ9eWXbjCh z_WH5m9^_w~YQ1y@dRxd`UFaNjv4{@g>c;!6MSsMCRs z`cMoFAyh-iZbL}B!52d&Ra@4YOE;8Q;JiNOd~8W;vaO^;l$cGUKIQ z>7UKT3nhnL7v{NjNu|=6>avCHQqTBuPB+y?i}Er#WF_6)bx~m)$mZJO#ku;Y9zyOj z&83T_vCNvex96)Nh`WZ6zf^t6;=tG9AfgxNT74>0J+|wSg=xWx51OtX+wG`@D_UFI zmbA3ZUp%jPiPUcKl3Ya~)f=KEu;!DlmLj9hLguPNR%)t?+aze$wwC3~R<2sHZ26+r z;ELQ@^?oic@A+g3#<&7bVMju5cZdjR6xYcnJ2~DV> zxoBBl&NPNBH^s39s>aaJn$q2uZ7FAHtjm&ZCvN(+aV^((UABen4l&pGhMvhZ7O(K- zyCP9AzB?ctL#}HB7wM3{+UDYwxjvU}8WWfwGq&r>cD0&Ghk_atq8byT7&AUvA3DRBkm)ha#jA65kxF}g33*7qDZY;_TAeRj->m2;Ap=cuS%*lQn!B&w zvTR*HOqT6fLIoMVT4ea@Tx(7@jU8WnjBjbjGhCMUy>@iKf}{-tlZ<3jZ|*A}l! z%J86znnPRStY@*yn#UI(E6J1{+pb@aukNw1b;VNp%iJX^N6%|nva07|p*;M^Sf&@Z zj9$4imG0Ui_y9{`3fxUnsB2C<)Q?R*q>~TT$%oq9gA@Gn(6c4aYVIxSBTvdhWAaTh zt-A5aH}$y(rzhm0yd^H$#JfyE6rQkaixg{)id6GicWTAI3A!ab_-dAiGSM;u_Q)$7 zdG6XG4M5=HCGM8#>LpcxrCkf`%GSv&c_?*)D~C=uRZF%ro~A)Kmj~Vm=fo;~*vGm! zU!f%ne5$T(q-wmC#ohP)8gFIsENv%Mg9a74@!qbh3HCuv&?7bDrOiPf-=!}RF3<-J zUE{|F(D}Am<4rT3z3{FHa<9e@YQTG|uO`^CHNInF3gzf6c<>>7QwZM_%E4RqshZ|c4$UEab147j5Ux3dYxd!4Lw~Cc{j4^$ z^V+ywj|=qPOs8Iae6^XT9=;!DL@?LyKgB<%#uPq}A6NKXS6BEP-ZxB{?Zb!nJo|R$ z$BL;MZ+CDH{CQoHs`0i$s%Ctsx1eik#>a9Z)L(TdkLvIo#)UP(#;6H{=9*xH)l`Ra zs}A*D8|ryn=ofxaP5PmHys<|9;^#nL9qOk#^q-ng&ov>xVNhOE6Y^Ud=>0G}RpU)M z?xBB%VR=nW$X`vIzc~Joeoe?{O{n+Um@a;f%OR9YO~`K;?bZa#siroh6D+5iFjlS! zc2|ubXQ$Z9D9DA7E?a9$`xqP2@g@-U6!I}X(2Wo2jt}{-3*{0D`Viiacn;;{r>S@j<nQ(HPSAmNNZ3g!h&-&mnwMXa`}CQRA&Z-iPo_ zA>ZCgL>`2CXb$0<1OLq--R2Ok*@vqQdbc*{+uES#YGeI2F3@|Ek9zU()n=N5Jg6@0 z-?i=K!T7@Wb@heM#7c|p}M}I3-g=Kv`Cj8+qz=e z=vB*BE)bLetB&!QvQ>*1kIBo@1X zOTz&n4F~!(Jmk_4I+upf`7{LdX$YaD;UHI}Oj(M6;w}x4y9iwF(vY}IN8m0Ein}N% z?$R*1OUK|Y4I`5p>jhpabi7nh)G6OVc^~5Qf`aD|-`Eh}*bv{?@up#BG=288X+EFc zU||wmIv{u7AyeL<;5nr44VlbXuRytv@4LKp#o}f2-Ly7yQ}d<$HPp?L7L}@NEL*U6 z;cD>A75bF?une1BIB6c&++4hLaT{~!#VcFqEo+-EROxheY3s^W%oVI^jWL0f`r7XE z*o2~ODXnHz%Zhc;{AFzmqo&m>mihR7iDXjVbYW7sF

Cg|u*xfjw`p@N!J?^468a z6T*gC^5P5fz_mAfAQyGQ-Q&Y3mI)nSs|-22v@Tt~Y8^3pHoSe5$ppJFRbSiH$?@vc z7+g95rxNh^1Y8|p1|>Oq2gmddj_Dm--Bku}^Oh~0J8xaj1kCVnWvj~+MB_rFa_p#yqScfZ>v673hRK|!73h&d7HpE#Ua1EmwW(J%$E~--v@w)`Q)F#h$;aweY zx>N>Fi4*MyiD)Z{pHa9mUlPIq6lY}rvQbC<25tu37!^67X`|d8IyeL`bDZeq98d(QQe-RAi28aTWME?fIq6l<2!$q;MRVdI?TP)Hw6B!#;OoynRM#fLFm2%a zd3fWSSeZ02N4BnOj>XZ-y8D*rYkyT~Oth+Jp2kHrdPcdtO4pB`A#qEy&%_hD!C=dT z0bC{w1T*nOcKl~z&{vsY5N5(aF%t~EOoQ(hyw5WLkvzB+YHZTS_d@J4$_ln}9yj1# z2c80EJKXmC@2~kMy%K*kEATX{a^~T;s^8-OPQ8Ht692YqzT$n0aBs7!jZ9c)6m1LKhc9?FtB3~U59KRd%_{U7{0U|P{zTUNXx91cg};y42Y(JL zd$e28gMS#Sc{D3|;Dxn2N8_(F$K$Uz>+xBegZ~Y44*q$3gRNP=ekuNC=I8jVtiiv* z+<z}-;y-Eh>3D$cEJU|j=miX;b0a?pj967Q*P zSm#it29b{;(h?NwR7Q|u5i8zmSQ$5+)mFB#dD<*BXWqIMOVpetEvwpC4{DEUUD2kR zm$s}pN=;jO)Y79^&lO3ln?hLlW(}HQ^@U*_+H}^FxEwcw_mFFYZr!A#bC==n@@?Q0 zzV_TSZGB*Y|qV;PExvl#iT~oW@ZWJ;(~ta z8p+3^N%z(Fob=eFtCGLEhx}6=pZ>bvq-*(Ys#AM4@7-^o3#K18WA46Fn&(a)T&Je| zWWUifd)KL%A33`HpPqCBzgNY-0nC)TiwXT+-NF2p%WuHs7wRfI`!!w}-h^~R>MkZV z>E?pphPnxLz1?rp-F0Q$Pm>?d${c-<<81Bvm19`VyRR#@|F>86J)ge&cJ}kH?B>Gv z>>QoDJe++q`?y1O6j%0xm^k}>_8Fo248K&`S^P?6U+`e|!x)wQ$U)in_?~>LuY72? z^ERRRLNCPgN=K2%`@hF;;u4`9mJ#lsF+RR$-vs+??&&oTWjDo`{5_ldnlX?2AAvZ_ z=l}WDbE|XUBxW^~CWm=gpaJnW`7z$z^IRmcoxv{N{FUA0b|U!qub9`4WL9Ufw`)(Gkrm)O zsvk#?eWQTPVK(D}90Uq7gnhjJ^Df^vwlZH^Q)*jRr`hK^OVUY(j;^?tw|tk-75SGz zo+4v>uR>x4{c(SuD29mJNegE;6#H#ij`dqEbRtCOVD>(85&CHyLrm>j zbR1juu^9Wmdr#&mdt)-~?1qA;&m1TJ&h^C{<~2lUYuFi115iqzdFhmW*OymZ<8gjm z$fW!#=miDs(uJ2e@>subL8m=A`%Bd`Sa-K&ulHpn68F%Uv4t2PhvruRU9z{k z=faCnPMYOfyc)=Ugev=w>`mE?;J3rM?=I!aeoF3K|LB?1w>!8O^!SVr6nGu!6rqk= zc%T-YCpJLmGAOTq3zEq7t~^#sJC}m55pvjpHtIaJIJRUcSIXWpc5mIAIBt1<4|(#U zKtaak+l#|O{btf4_qf=P?dR+>KE*`LuC(RKX{a9A*JyFCQn$YKxm|T0B8G>u4`v?; zw7<_@oV_pErn8S^-*R%<^(a^0VkJM%-PQHQE>!kWVsI4ntn9t993n?hfDuWNeZlug z(RN1S%9XUE@>kscvHSiO<2t|lS|}*3?v6V9WTF(>1#0Wr)M&E|8`b%9lw!Y^#GWh ztoN3$s?7c&rpe!h8v84>pmw73{K(_`M{yZJ4y(3bKg8B6sy#kNc0^F6*# zyJ&W7_biVx4szw!&g#k8j34{)OyYg6UXt-q&i_dCq@9V;wZzc6lWhd-C)t-6FUUBb zr+0Z|HEAC|plmpRvflFt><*(e6??b-d$?NhwQ34|GacP0w*S`tnHZVcw!F~l8;hPiE zWsF<$(dXYK>j>TpWJBCa<9nPF zq-D?uIZObYe8jGx2V%#?_8-y{tyaqOLyj!_wCXByw3}FT$cSVtP`S}W*BoxRn@h+( zmHmTIJNqNi3a}8|6X#|Jda+Ni4l=p$IY9E(QNE*?WDBlxZ7-%ECqB1vdU5+SL2l>s zoe$!6vMao7hkYkOmA6&1r;}zP*KRk#FzUVO7qp^`siQmbtgKP8g#CU(to>2JQ z*;Dp;+WH;Y<=NA-=XFNYG2Z1lZcW6osgMd;9_*7seEx~|Z|9!!r5#YdMDVwGlMC|& zKw&v%ZM#~sPb^Km6&zFLEf9~1#~+kZ+%{zXFQ(7mWqgjU z%S~F zFSEU)q!f2|_bo4H7b5?+!~bLUZa)io_M8SVbT&9VS*R^6C8b1xe)#eEiT_Tdi%1;-V@qZOc>L<*@nCw;KS|Ip?r3Edj;pMMQR8s@hUp< ze#W_F+1pj*Mg!T$83k?R{)b%Y<#L&Q0$KHm^iEGf$9f}I7C~ag_*`GkMZ9tFl3WR%yw*Sc4pTK?anZgVX?4i(??^Pe(*vnj@JdC&eM#$~U~&!fb+fA{V! zOczVx4DA=ko9946KV2B2{b;E0ZSqNG8(xSpaes*CiDG8hq={OFHjI3Gccj^aHqFJjb%2}o^Q}31Gmsy_e__xpG-*F!@ADsIK5=;b!T}rag%50LelYF_AZPCkolG4UQp5G&!o9Rl<=JXY^ zZXIby)l2yOnUBbYj4x8}Xv`kJ-r}CUA&L63tv4C=%fPOE##Xxz=h}y01}5Th*2Tb_ zPRiR-c@igiy!1(0BISuPbNlkf^2ybSmn_?hH8Gs^NMGWL=S;=AdBq2m|CDn%V+Pr^ zj7@R7aE<`-8XrELvR+&K$d`ORS)}*&6 zDLuKu{G$&Qq>#LzeJAaO!g)$;Kz{}9yA{Y6Sz(ck%h9%%V2ROSY_~GM9HQOgmYh>4 zh>1D8{FRfozU}2-Y>|5W%9S=!m@<*Nl+l;i&(FL12`iP}1b!Wgw}Qo}75LcxEa~i^#qlx5_wt?oMeG zw5nV$%K!5Q#XDY>7u0&F88sn{Pq(yYeIncD()w3{e9U9NAc}zn?KeTj#Bt+=vt z0U4W!h2;IhsPer$*TxD7a!&;%9qZrR+bw{c#K@&u=4(L4L~f+%TG2+@;zo31jye%f z+=D-a(iYZUf=clZ9kCGC<^t?yktrR;>+9aN9ckNfTjPJ&mb)mw)#}`|&Ls9ZhNaE7#uSG5k*lEVI6$jkx*e+)Ns!EweSu z#CS=V{fVDh2=QIx!V-F*duC?A&p-Q@^f2nRG(2=N|I9yMce@rvtT$$_VP!;z*A`AcljJS!glrh zun#Qtdy9u<4Dg2lZ+RkFONMJCRQ4{tS7be)A!Gj@-DA z|NhZ$**j^|{{JJ|G1~THWL~hX_)5c#Z;UU?xcB(Df}Y7s*lxZTk(!&gbLHd94IsD5 zpldFF5{~>8$|#9i?2cCm^?`fL{+9g3`Ek#m@P8lDma7}ks}2Y$3+$fV6>ROCR3nxR zU_W49&Pm&TxP1OLfpaC-N&n?d;!4VHV$6-19SIubZ#h!y*NdWm1=s$+1)#R>kiYp@V<@Z{2yM$rY_2V3 z6iC6>`yukmam~Oo}=Bnkw#yfm(OufN14-1%+)#zs?-1Vv!YZU!Q_@O!bq6AxcqlC{$4jy5J7|)@%$P0)FHj!V`BUpPl9M zdF!7EO@DmHMbhCvb$F2`!wPOK6`cqX1TNybky8hS345GTXIQ zljjbaSl>vC@#9~{+;`_A&gUqP>i`-r!uL}R4$y3`&2Tz(msg1Aht$IuLBq*A+ApU_Z3VRQ@ zod>qui6AQ6iGV!_wvoLM#=0-!CJpV-eewPUM$VJKE==xlKt4WJgWSmuYMAVHu&eBL zkWmBn-0-=-yZ8K@A3O~pl_%xA#b@2A6LQLgJ9qINf35^+70KBVWu&(ar$zMRjEDj8 zxe$b(i3OzXd{$0qyM$h-&1?M6sO<#Cy4rq+w}vw=hGUTr=Ww2bR5yJv){)Wf#PRQN ziip84wcn-IjGdqT)Gk6k7`>k=(X*%~7h*mkW(ZUY#0j2ujT&j!;*M1#Ii%%URmN$U zJ98>#74Jr5AGUjD-?H^sW zv>(KImj`nK{X#XBbC#xnnZOx#*K*d~FLBr5eucXp_iNk@xZkK9IA^FI=M42@kBfd% zDm|o}e#e<3H{))>-HN*ncRTJ5+}~6!=e5>yCPpnMWz=#qMlGlE)pB0O&U`cTJIeHC z+%33Uakt@a$K8Q@I(vnB2Db_KEbckn^SBpqFXCRpy^MPW$7pGfOaFu1mE`3=!%f2o zKJ7oo>D}3DrUR#TKZ`v6XSnU@38`f7(+|*39>hI_`wQ-2++T5zsA5h68^j6kgE$Lp z5GU~t;w;WVoNqaZ9drh9BJCi~xg4aQ#yz73(R)(#o)o<&rDiKNfqB^f5T_@6q|AiJ z3!F_nN4qhe-mMsiCY!MNKgMbDQnXtyTtD0Z>J7cAnGa)^BZVwhx(U~en~a-+n~K{T zN59bf;HKkd;P%Bi={%GB{y3zxrjFPrNg*#4J0&U3(^H(Mr#MYd>BDeG;978Var1EV zajm!oxP`byxQlSVK;TC>Mgyi8$JoGh!J*L&c93Dtm|d0>XSXTgpac#|;GhH!O5mUb z4ocvl1P)5zpac#|;GhH!O5mUb4ocvlBydmy2TsqFz(ENdl)ym=9F)L82^^HbK?xj` zz(ENdl)ym=9F)L82^^HbK?xj`z(ENdl)ym=9F)L82^^Hb0jJO5N^xbluDEWv9*lro z9hAaBDIAo-K`9)R!a*qXO z3J0ZdPznd7a8L>drEpLR2c>XO3J0ZdPznd7a8L>drEpLR2c>XO3J0ZdPznd7a8L>d zrEpLR2b`gY>xyG`2o6d)8@mUmL-)ir;2LpFxMtjB+!WkY+}^lpxP5TbaWioH;`YPM z#O;rpg`16=gF66sAnp*{S8#{o4#ORRYr)OM&BM*dwc-}w7UCA+F2emn^@M|-aL^MD zdcr|ZIOqunJ>j4y9Q1^Po^a3;+n_u8zB~H9J9f%0XldHDTFOszlKPe4o>s45WAtOM zuyVa4yM*;%m#_h98$DDH<%H|udN}6^Pe2m(<|Os0oGZLH`R=QaAUDG}9dZS=d>ZHd zru7dv)q5;wFJ8x)!4Du6$8)m!Gipy$L_YW8jKXeeZ?Ql3;~c^r)GW^W+g}~Td3-0R zgE<>+tU83V;U*|K+f5y6TWpIu+@0*Ej&SFa@V+9{`Y%Bh`lYNwpqDW`VIshx6ar<~d;r*_JzopNfY zoZ2a;cFN(hoZ2a;cFL)pa%!iX+9{`Y%Bh`lYNwpqDW`VIshx7lqnz3)r*_JzopQJ? zr*_JzopNfYoZ2a;cFL)pa>}Bd+9}7X>`o0eQbUc@P$Q>m{vYo#aMar_QhniS0$fdi zs|mERW?I{Jv^%$(-FD31RWjS^cC#BHyV*@wt!fP?&#h%oyQ5`KyI;wkc2CJ}b}z|p zc3HQZ9p|>Pn;mDhvYVYQce~kfVk^7Z(Ms9Pj&oJn&5pBG+071!-Rw9mmEG((>6G2< zI9Zh4>^KvY-RwBwlilp}{caySz1i(!r{8t^*y#`0$8H!48+YZzOT&qmX<9FP+Htlf zd)jfjCVSekvm1Nb5t2RaIE$S6#P;?4s^p}}l-tdY zbK2R>j&m~E&5n~Y-Pw^1oE!OL&c$>mM>fmJkyGU4$i3YDcASvO{&u9p{&r@%+ux3p zGTGmblhoPYjvmDRcAS{W{&t+2$^Lfah5hX~FO&W4I3bh$?KlyW{q0Pf+u6=6cRSdb z)ouqnbBx=;&a8Di*qL>12RrjsdhGvoX*XZ(K z$L0TNy-FV|h0CsRSqzuOa9IqO-QcntTy}%YZo*}RY>beN5wbBtHb%(C2-z4R8zW?6 zglvqEjS;djLN-Ro#t7LMAsZuPV}xvskc|beN5wbBtHb%%shTFIzTrsW$*9BLKE5migb;I>wWa}l#ws1KL zE=R%TD7YK}mm}bE1YC{~E;DeMfy)eBA^~vCxXHLFxT(0kano@7;HKkd;P%DshntDp zA2$m(8#f1c0PaBCAvjJ=hRY0GX5cadml?Rsz-0z5GjN%K%M4s*;4%Z38Mw^AWd<%Y zaG8P23|wa5G6RG0+&PJatK^z;4%Z38Mw>{mwn)}4_x+v%RX?~ z2QK@-WgocgL;$$Nawgb zT*cV8D*U&aYGVkzD$tzNF}yW2BNJh(Mv&g=lIrXa{v^ILcx&?z$GJ81Nt({mP2!XEBQK>)?(`*=+E=MG z|9HD=ymHk3pi)`EyP7O^}a+IOeUFBffM9>$N13H1Bsif}RRY0>9_|)8d zKdO2t4{r_r^JwD!*gnoAJ_k=H-@CiqSIw$Qz?EY<#tRMdE=S)1Tsf=q;L0N^MM6|g z|2JS4&y+8Sr?a%SChV8ZTQaRA+*v$H8f0l@kfo_cB*R{=48g7aa&T$~!kpm4IvrQ_ ziHED+`*N@gTY1XA7Pj(E!it>de#Tb7j$Y)vPY;eo4_00V{uFU!iC60j@hdp&;C1{U$&7vP&afwzVx5w`NN z%I7MPQf? zfafIeNjO2{axnUl(O0|sD0*%Vp7?LTox~$)y%f^=cj8ChjzZqKYZP)f2Y&^)E#T)Q zV27U@@Qd>J(T|VbH0oH1W&P*}5^xgl;8lU<-@uPLi*!#5d2sM~9!^hUTtnTtD+NA= zKM(Kfwvq$KP4l zYoWO+6+0qeW{Ob{%?X^oD;qv&KfwPj3lR%60pNh=m4Lj zNy1x`=dIx}Npl=|I4tC0KJfAYANl3r6n$aznh@5-d3JzL|B|o^d(yuc_EN%L6vCdr z6|kef($j}fSG)V@8*v*)-y`s?oxtsBt_$=@d}r|gW}L~iTz=wwCh=PXCwWQIcZNrY zdU-Yab*FQ4a1!s}m!yEJsH(xdACQ2r z;rR>ZW2;W_^v-u<_SB*fencMc=7Hm@>aiFi?oi1mAF0Sj#fPWHVOV;U7@OK9M?FsnaM2Zh3 z>NHt*NjNvpM!n?fsNLM)d&K{VkJrs<$5*FtmmEcTs&@>Nmqgtq=dzM>4z3L2x$)$@ zai`^ZxPnJfu!btuD{Z!CwWZfC#E3e)2SCyue#^d+o=yc zKJ{7Ry};=xU6y{_VbeVe$}mwc>0Njm>L^_UJi*73tQTjq#h0_$;wybv3=s~U9@k5< z{0rcd@?~DY?@4hy@P2j-6W{r`Q2w35m&WwzE7MoUFyRt)l)jbcjs9Kw9^eN8{0MNU zi_XftGkhkWRN~WV#^qlYUz`t+Nx-aH+nrTwt{3yw3-@g~PqQcIY%b>v%@yi6wN#y; z-d1aMsV-Hou_oQlvRZ8+ze=;%tRVK)=Bvbaf;o}ZYA2i1OuadswP(%dOml&mVlFh_C#D~mAF^ic za`SU@D67qGCiJcRR-4<+2D8R&`p? zlYQ5g+j8@3o3i804R(s%&)jYgwTsL>_DFk_dBiTYtIcDq+gxX!Va4WY<~jQfd!~8Q ze$$?B-m%}a-!mWEd+oiP!fMnrQr5*%*2R={f4(ppz|VbKv$LvZ-PTaPU>e5CLBp3e zqri+-lYyu3vuY|oqxRxt2Ft3#Ilu?1R{RBOAz#oeqP{rcRISH9QT+&-%heUYZvCrO zKUUWO|AMuL-PKL}3@Z@tV1Jtp>M>RT|BY`{w&NR>r_?y*R?3#Ef2ue5s^?9A+Ab|% z7ij^z&;rVVd$6`6Vyz-4#j-MSJnLlK+Sx&RH(d{=K~`PurT1b5+TOB~>L9+oN$Epa ztr6+N_2J;%%GyXT)=Plf^lJPy`a;5fPk#^iBGzj}`uqC(U@qo+of3UH=k@l`zi?}- zSm*c~R_orV?^j)94Q^Nc2;U~mkd?Sy^(M~o?W13$r5e{#iGh~N_e_4x6(`p6WkL_P z_KLRG6L=fbOQq$k-=VB%+(}I}6{bRMZ-$%UYA4s4RW~!*jK;4rRjh|dnY8NfTDBU- zn#me9fY!Vl_}$I!&`&fI)nv1$*%SInW|FF*l{cs`6<{03$W-Y0&W5r{CbDTL2%CDLA#B-84iLfV|lc70<6Ntyqb4~|yra6r%>2dt1pdab`_cm07x~>SeXnti&|8rn z?P2HHd1@kS&F8B++scabdb_}~-rg=^1<(X!*^#WyKFS`Yc0;1A1i#9zBJ65brB~WD ztPmO@Ytwt$wX75xAuH4??Xj#F8X@b{``P1JEi}ZQXirq5?Me0|Rb@}MCj*~iPXRvF zo~8yP8Nb1|eP`G+)OdTQJyT7xXW6q<1G4gL@aNcbRFgf|p3AzcZ`t#p|F%7!?+KBi z_{dPcsJzeKkMc8m8J#RFSF!MXFkns#c`xFr?~YG~|)|`l+M%4O2_djs1|dEAdyUHB{I! z{D!HuXiJN>T#tXEx{R2A#IFb`d^xdS!EbMo#ad+X_9BaWiY(q!WN`(u_#Sou{*!uu z{62_W?kaM5SCPxpL@sY5a(RTvDI3n>-bKE3i1hY)drHfl zjy_Sodx&&@-CrFnUq3{8XT3ABa-bf=mtA9#<|ZM{_eYM)*DE5;-S-fzhDCN)BfDGp zK5{PW?PlwFthC!fFJP@5YhaP-J0R1KCO__*iAb+RvX>&+ze~&)BHxRV?-v0($v#IU z`;H>ndx>P9C6aw7y+PllDn+t)6UjbLBzw1nWcS}&u)3CYd=urXiwGN}oL<)hnI4Hu zuNRpj%G)so|E}iyq8kQd89CiB)9@{ad{Z(A`-bm13@h`I z?@n7ZiME*H>?ZK;?&y_osUdtdZ~)?=$P)JV@8XPk?#xCcA{e@h>q!kj`<~FuQS&{|10w=;Oouxz`r)X zR#omB1mNGGb*e<`93fg~v}m2~qHnrjGv3ZxW~Xnui@xdN>__OGzUeOdW;@Y0L(new z5&!+>et3BRP16HS^B^>Q%b-S!zG)VHvmKh|G2Z?SP1D7F-9Y^RK;QJ>8;2**=uXr0 zK+|mE?X&2c9-?o$h`#B8zIhS)m(0shzJk{2E?Q@ZXq_%-oy}mJzS$0a^C2;OguWRd z`euUp)O<=#oYv_gT4%0ko$W;HRH1bY-|KLxE~0ySpnH(2d|Ocr#%Z7-qJc(>1{xw7 zXtZdcL!6C_Ho`{6cY0`~=%GDC4~-N(w4dmqnWBdd5IuCD=pnwRK@UwAJ#>)hp&6ow zdW#+!DSBwEXrQs8fqIJu8Y{YIr0AYn(LIwy_tc5*nIyWWPIOO==pHS)XCKi$R5 zt|Fn6%0Vm82)f^T)cdRO2D;-4r!p>&&zO}Ej?@U6qVDE`UfuXL&Cm6GCb zkhoem3jOgy|8?=t7R=X$-i>j!K2G4{CDeNHHwtEVq2I~*>gW1oDBZXgUt(C{eZhQ9 z;1eX&369>(@V>mAE%@0I+iaoSU3{z$VjCqiqXe_m`+{F8F*Hf2r9yM1_y-E+AP1Xa zLfI_%5fU~dm}92f5nO{Uqjo5>G#gr=NtH?|k*L)alEDALe}JWCOZgV(72l170OGtK{u50w3dH ziD!UygP(RfkHn}!VZ*B0|oz2psvD7*@H`R_6%j zdGXH?%5$U^W;qOBBoJ2j5x9@U_I<1&tyc(UviBWcH)1Q%2L*Gy*%f${z@w!9P89fR z@pqS0Hab}SLE;~!C(<(AETh)X3C$AkOU!K!j}~)pUlja{0yhfWDDdmzuM_&?1%6K8 z3F5C1|7()NuSuw{d5lnw5O{>ZjRH>;Kc%s$_00-r4Ki4In;O3l71b^RT+nXvt(HU~@1?&5vHD0w?f zFg}$Mfy=~S>U{N?`0q;0j|sd^!diB>(RvrjmE>PtExmXb*NgRC>@1>{aHsAUnsw3= zz9BL9_P)fkjpY9p@h=zryNrmn9xRv{LO)07ca%Kr zDEJ*+Z&i;8Tq6D%LQ^JinYx=8mI~ZWV(6+q05e?R;X-+pz*k8g);U;7O{wn)=3Qn^ z=*vR6qfqWB_>Wwi>LcswYrT}fdcmJ9u-7uuZnd;qzN>MyEb>s_0qi(-^NY(Fo7u+Z zX|vSZ^VY3cqTXB5vZ_rNtKqs**O-BNcYclfaemYEEXEr1^%A~rJ&xZg`Ye4uzl-(t z`f`1>zMfgfoAu46uimKdMSeZ5pVP1M+pIrfo+nbutmSVWZAqWdb9W+Io~Mpi^cCIey_IGOIMhF%ea{V z%T~;9GyAS|sSIAZxNU(Mv2tZ9ZBqCdGiK%Lxhu`?D_1XHY3enSQ@^TA{r*!1nqCc4 zW)CzI?4_!-?%<|@`tgRkSp)6nhMBW~_pUn_f1erC21YwgpVl}qYMeP^A273^!JoPJ zz-Wn-q%Jz2F(%PQ>@MQ&MZ=j#?se$;@*||$cGbtNQ%{Ur|O(|XS6Yc}JQ=idLrMvJ|Y&0u6ELs#Xw@j>&xMv)p_cV-a-3`v=eiCeCNwN z1p9;VzebtqN{j93Q)N!eM7@e?BwZh8`x(m+fnJux-rx)z|@c7dzDQJu>rmI$E!K*d=xaBd`+~TU{EBwpZI5?MC~6eViS~ zHp8TePEh@scYj6y6M6iaeqFzz-_&pExAi+n=Xdpc`hER@{!o9UKh~eK$zt^^MA-?orRE2O`}@5j&U_%N}N>k>ACvm+WJ}e{Y$hxfi}?(X=0+$(L}y@ztmnytGN#78hgFH$#Q-s@olho z+xvj-p)EaPAD47UjbEg$SGVe)vOgQJ*@qdgKQfcz@LHY7-Wl{|Qkj5H4ww;j_Y=Xo z{0y~jQ4JV&bvX!(r6rZoj=M!z;?gd>ly>7A&3xh6gz0L#6GEe-wY?07+_6{Ukc}1@ zf>hF$|I+NW_6GbLtkZQ}%nqhb@^%6LQn>uNM(zINQZg^eu6WSCZ$CuheH>}zgSDsI zvn_huo@Xz#mvFz>UPc-=ln(!0nQfFomVFcdEOKU$XT-zYi#rV%DdxsxlIJ&Fp7|%O z$nFToDLc_l0q##r$=FGDFW>>RnQB{S_XggX)>C8a?KI$lw4++vVD|y8phbmuH$|VbL+U>SM?uzNpJJDX# zc27(HBlLsx?fhlqfl?hEr7PR4U%eG+uQa*UTtUl(e_-q zyzOQHc(;w(k@R=sUjcSvlwEz4K8RMJB_BreT_*Y7R`M}a^06z_+mn*hL?`mow7%=X z-OA6ZcZi!kCFmIgq;_{^ZhH;(>reGh)vhv!JwpGAmO4^uy^>b319PHvrjGfx3z*%k zlK-$$lCQM%n+&sG3;4go{r|Fus#b=0j&a`|2Nrl5xdXryy*JM9CaZ1-Wxhk?RERSbE?ev1a!*94D!PN~1{-rBbXLn(rxMD5dPc}LG4mq-t1XAFoc z1hcbX2I9N?mP7v}X}n-xro7&Owun&M_?tTnIA&M=-_XfQ?;90F%w-h|nyKk00OG z=(V)m2<_)(Yvf_>f_Dkn!twR{OK1>>9_s4O4&}1RUPgA*B{m_H5MBU}BVwXMc>a7L zCB)W9Ax?qDuo-8BRv;p-tj6myeR>11c?NBc~f@M92O*?nXS>n zT_qBUsf1`M2=c)Z$Ye4OZ-z57!$JgBc$hC@hG6+Z14v;BTA@MX2-!h?0U|#E9}R0V zSpu=h*2riHdO=#`=lz@Z@8STjC;|bgq0u(*l(Lf}6!?o_H3r{LL^ZR){gL?tzWXe}F%>Ltf!vH$HOfzjqaS78jQfar~XH@86uq!_9lEU@0^KTg>C| zMO$gq`6u)eu>HI!LXm*YrI5&8B&H>kgEcd^u)vZm$Sf?`fBeUuhvEkg^XvrAlPGL4Q2eF!uT)ZicD09-&Y-u2{teBPU>3yEb=iYAH zTTxl4gJthYqYfc8@*Glf^wWDKD9!NzX{`6pGtIQLvEZB0@u=!$SccuU=JCkJl5BtO zWDmEgfHipJVjUx*Y+EMZ&{emuFrFnfujcIdW#s*JRL}YI_Q!5BzI(54cV%+mM9!>r zdffxktd0w{VoycBeYQc~F=0wom?s)MZ^j3jtE1Sam6pEA(=YUoO%mtoi-Jh4IYy|A zNKJD6!}O8YrzqFnOaDB0wQx1kAtP(wyB5zJy1sQil{1OKSkVHa09YKA&`qdXx4BE| zP3S3eax0$8m0nMy3X*MV0u}^}CJ#gp=SIesJIjF+i^ZL3YIAbU#3ZqjSg?vCdmI4$ zcpAgG$(>eFy*PTv+q#K1y}_=kH8V1!oJcy-Hk9%HE)$13CH#g%okWKCKHb^T|DNXq zQa`E8v~C?z*MuD_oXActksJlU%6yIzOLr=ZKDaD?M^*IOB1iXv4c7;Xf~6kDN!&E= zq_i+Yy-o9~yJz*DRPB;#4aAYy^d>nt=N>la0vGeEFCE*ssNfv-hvi>ns&Pv7iah-vCf+>)4vvJVl_`Mw$0B9UvriH?EY|Z zb*gZ*-gv6$=Y)jl=%*+d8oC`3i6YuyD7`=Ok8J72at#cPVsF~2N1i1+maUps0FA+# zd8^y~nO!-(t48jmc)AC>4Hp~*V8gyCkCVC<0fQ}f3@}zf1DSDc?^eSu!mY1yEU&Na z;pj+zw^WkJphJF}=aviigXZu`w$d5M;<>m8zc`H$R83?9F5 zJi4GuohBc)+Oy&rt1DYp6UI7HHcIv3o*e#1~=L1cEu&eJ`wEu zkzsC9=ee4mBlYF)#F@i#Agh@(p1P@3{M^QIQZ!TK_Bhv|E2g%qJ>z9k;80t2+;rTT zckg;5Ev<a~Q?yk?zZQQHxD z_L&^4pS^fI)?;;bos>4^;mjC(5`Djoay6I8>OC3t>ckD=Oe*nO*_I^{jN_rrl3JVc z1D6(3Q(2ZH?kv$9YG8KYV*Tn~*l~ z>sv_#Y34K%iM)-$7!*M68)DeUDxBTCQYUPSe)1W~F7+)8iny2;L+y3i-FA37-x8m5 zQW`iOnsdtIP=0V{aITB=48vYjzc@3i8$UW9$)pac#L^?%looQqH(7EhuKc$3UcK0~ zCw{x$T3u&X1x&Y?yl{Wph=ypjAs_o>wO5mFkn-BYb*I)Xx@O~~z#A`%WtKK$&nK^~5$)ig@GW+xyAW<;435!kVOF`e zW_^jh`~FN5=w1XumEr2ik@m5_H`X=vCFS23C~mQs9eK`BsA^*4Q^SqV&AHm!tu3^9 zIw0$O?I)_BJJX$MG)J|l!HAq84?%=LbBma0ykt?P*DS-^G8&b-h&-?M=nr2nl?h+$M%8pnQ&TyD004XGNL5 zX0MIal$%$<(nnzliITuPNALpFPTd{n{hrKI;=`tZ99@2I`2cN${?kZsj2T!r8U>tzlkS*0Q9l_EI zM5B z@B|>Vq~Yi5$9LY{1Wmpux>kDr*7)`_@CpF-uO1tY&8;YaNyJqi&T!av#X7|bK!z3H mEtLcNjS7^z&*^TdhW+AAiba(JL!$z_1}6pjKXRJByzO6czK>}D literal 0 HcmV?d00001 diff --git a/ios/Podfile b/ios/Podfile index 23464e32..e0f1d724 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -28,6 +28,7 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup target 'Runner' do + pod 'GoogleUtilities' use_frameworks! :linkage => :static use_modular_headers! @@ -43,3 +44,9 @@ post_install do |installer| end end end + +target 'ImageNotification' do + use_frameworks! :linkage => :static + pod 'Firebase/Messaging' + pod 'GoogleUtilities' +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5f2695cd..19a32d68 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -44,8 +44,8 @@ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 6436409527A31CDE00820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; - 6436409227A31CDC00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409A27A31CDE00820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409A27A31CD500820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -225,8 +225,8 @@ 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 6436409527A31CDE00820AF7 /* pt */, - 6436409227A31CDC00820AF7 /* en */, + 6436409A27A31CDE00820AF7 /* pt */, + 6436409A27A31CD500820AF7 /* en */, ); name = InfoPlist.strings; sourceTree = ""; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index ed9b52db..f485c607 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -52,6 +52,11 @@ NSPhotoLibraryUsageDescription In order to upload data, this app requires permission to access the photo library. + UIBackgroundModes + + fetch + remote-notification + UILaunchStoryboardName diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 6631ffa6..2cf02109 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -2,5 +2,7 @@ + aps-environment + development diff --git a/lib/actions/actions.dart b/lib/actions/actions.dart index 6cbc3c59..a5b0d07b 100644 --- a/lib/actions/actions.dart +++ b/lib/actions/actions.dart @@ -1,12 +1,7 @@ -import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; -import '/backend/api_requests/api_calls.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import '/custom_code/actions/index.dart' as actions; -import '/flutter_flow/random_data_util.dart' as random_data; import 'package:flutter/material.dart'; -Future repeatVisitScheduleAction( +Future repeatVisitScheduleActionBlock( BuildContext context, { List? visitorJsonList, String? visitorStrList, @@ -56,220 +51,3 @@ Future repeatVisitScheduleAction( }.withoutNulls, ); } - -Future manageStatusColorAction( - BuildContext context, { - required String? visitStatusStr, -}) async { - if (visitStatusStr == 'A') { - return FlutterFlowTheme.of(context).success; - } else if ((visitStatusStr == 'C') || - (visitStatusStr == 'F') || - (visitStatusStr == 'B') || - (visitStatusStr == 'I')) { - return FlutterFlowTheme.of(context).error; - } - - return FlutterFlowTheme.of(context).warning; -} - -Future singInActionApp( - BuildContext context, { - String? emailAdress, - String? password, -}) async { - String? devUUID; - ApiCallResponse? loginCall; - - await Future.wait([ - Future(() async { - FFAppState().email = emailAdress!; - }), - Future(() async { - FFAppState().passwd = password!; - }), - ]); - if ((FFAppState().email != '') && - (FFAppState().passwd != '')) { - devUUID = await actions.getDevUUID(); - FFAppState().devUUID = devUUID!; - loginCall = await PhpGroup.loginCall.call( - email: FFAppState().email, - password: FFAppState().passwd, - uuid: FFAppState().devUUID, - type: FFAppState().device, - description: random_data.randomString( - 10, - 10, - true, - false, - false, - ), - ); - FFAppState().userUUID = PhpGroup.loginCall.userUUID( - (loginCall.jsonBody ?? ''), - )!; - if (PhpGroup.loginCall.error( - (loginCall.jsonBody ?? ''), - ) == - false) { - FFAppState().isLogged = true; - - context.goNamed( - 'homePage', - extra: { - kTransitionInfoKey: const TransitionInfo( - hasTransition: true, - transitionType: PageTransitionType.fade, - ), - }, - ); - } else { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: ThrowExceptionWidget( - msg: PhpGroup.loginCall.msg( - (loginCall?.jsonBody ?? ''), - )!, - ), - ); - }, - ); - - FFAppState().email = ''; - FFAppState().passwd = ''; - FFAppState().update(() {}); - } - } else { - return; - } -} - -Future signUpActionApp( - BuildContext context, { - required String? name, - String? passwd, - required String? email, - String? device, -}) async { - ApiCallResponse? registerCall; - - if ((email != null && email != '') && - (passwd != null && passwd != '') && - (name != null && name != '')) { - registerCall = await PhpGroup.registerCall.call( - name: name, - password: passwd, - email: email, - token: random_data.randomString( - 36, - 36, - false, - false, - true, - ), - uuid: random_data.randomString( - 36, - 36, - false, - false, - true, - ), - tipo: device, - descricao: random_data.randomString( - 36, - 36, - true, - false, - false, - ), - ); - if (PhpGroup.registerCall.error( - (registerCall.jsonBody ?? ''), - ) == - false) { - return true; - } - - await showDialog( - context: context, - builder: (alertDialogContext) { - return AlertDialog( - title: const Text('ERROR2'), - content: const Text('ERROR2'), - actions: [ - TextButton( - onPressed: () => Navigator.pop(alertDialogContext), - child: const Text('ERROR2 '), - ), - ], - ); - }, - ); - return false; - } else { - await showDialog( - context: context, - builder: (alertDialogContext) { - return AlertDialog( - title: const Text('ERROR1'), - content: const Text('ERROR1'), - actions: [ - TextButton( - onPressed: () => Navigator.pop(alertDialogContext), - child: const Text('ERROR1 '), - ), - ], - ); - }, - ); - return false; - } -} - -Future forgotPasswdAction( - BuildContext context, { - required String? email, -}) async { - ApiCallResponse? forgotPasswd; - - forgotPasswd = await PhpGroup.forgotPasswordCall.call( - email: email, - ); - if (PhpGroup.forgotPasswordCall.error( - (forgotPasswd.jsonBody ?? ''), - ) == - false) { - context.pushNamed( - 'LoginPage', - queryParameters: { - 'device': serializeParam( - FFAppState().device, - ParamType.String, - ), - }.withoutNulls, - ); - } else { - return; - } -} - -Future cachingLoginActionApp(BuildContext context) async { - if (FFAppState().isLogged == true) { - context.pushNamed('homePage'); - } else { - if (isAndroid == true) { - FFAppState().device = 'Android'; - } else if (isiOS == true) { - FFAppState().device = 'iOS'; - } else { - FFAppState().device = 'Web'; - } - } -} diff --git a/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart b/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart index ec4c3b0a..d63fabf0 100644 --- a/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart +++ b/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart @@ -2,7 +2,6 @@ import '/application_components/organism_components/bottom_arrow_linked_locals_c import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/custom_functions.dart' as functions; -import '/flutter_flow/random_data_util.dart' as random_data; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; @@ -44,107 +43,119 @@ class _LocalProfileComponentWidgetState Widget build(BuildContext context) { context.watch(); - return Visibility( - visible: random_data.randomInteger(0, 10) != null, - child: Container( - decoration: const BoxDecoration(), - child: Align( - alignment: const AlignmentDirectional(0.0, -1.0), - child: Material( - color: Colors.transparent, - elevation: 0.0, - child: Container( - width: double.infinity, - height: 119.0, - decoration: BoxDecoration( - color: const Color(0xFF1AAB5F), - border: Border.all( - color: const Color(0xFF1AAB5F), + return Container( + height: 284.0, + decoration: const BoxDecoration(), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Stack( + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Material( + color: Colors.transparent, + elevation: 0.0, + child: Container( + width: double.infinity, + height: 119.0, + decoration: BoxDecoration( + color: const Color(0xFF1AAB5F), + border: Border.all( + color: const Color(0xFF1AAB5F), + ), + ), + ), ), ), - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(2.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - showModalBottomSheet( - isScrollControlled: true, - backgroundColor: const Color(0x00FFFFFF), - context: context, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const SizedBox( - height: double.infinity, - child: - BottomArrowLinkedLocalsComponentWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - child: ClipRRect( - borderRadius: BorderRadius.circular(200.0), - child: Image.network( - valueOrDefault( - 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - width: 80.0, - height: 80.0, - fit: BoxFit.cover, - alignment: const Alignment(0.0, 0.0), - errorBuilder: (context, error, stackTrace) => - Image.asset( - 'assets/images/error_image.svg', - width: 80.0, - height: 80.0, + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Container( + width: 200.0, + height: 200.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + showModalBottomSheet( + isScrollControlled: true, + backgroundColor: const Color(0x00FFFFFF), + context: context, + builder: (context) { + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const SizedBox( + height: double.infinity, + child: + BottomArrowLinkedLocalsComponentWidget(), + ), + ); + }, + ).then((value) => safeSetState(() {})); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(200.0), + child: Image.network( + valueOrDefault( + 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + width: 300.0, + height: 200.0, fit: BoxFit.cover, alignment: const Alignment(0.0, 0.0), + errorBuilder: (context, error, stackTrace) => + Image.asset( + 'assets/images/error_image.svg', + width: 300.0, + height: 200.0, + fit: BoxFit.cover, + alignment: const Alignment(0.0, 0.0), + ), ), ), ), ), ), ), - Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - valueOrDefault( - functions.convertToUppercase(FFAppState().local), - 'NOME DO LOCAL', - ), - style: - FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context).info, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap().containsKey('Nunito'), - ), - ), - ], - ), - ] - .divide(const SizedBox(width: 20.0)) - .addToStart(const SizedBox(width: 20.0)) - .addToEnd(const SizedBox(width: 20.0)), + ), ), - ), + ], ), - ), + Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + valueOrDefault( + functions.convertToUppercase(FFAppState().local), + 'NOME DO LOCAL', + ), + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 20.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + ], + ), + ], ), ); } diff --git a/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart index 607e68af..798a0c96 100644 --- a/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart +++ b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart @@ -1,8 +1,10 @@ +import '/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; import 'menu_list_view_component_model.dart'; export 'menu_list_view_component_model.dart'; @@ -10,13 +12,9 @@ class MenuListViewComponentWidget extends StatefulWidget { const MenuListViewComponentWidget({ super.key, required this.changeMenuStyle, - required this.registerVisitorAction, - required this.scheduleVisitAction, }); final Future Function()? changeMenuStyle; - final Future Function()? registerVisitorAction; - final Future Function()? scheduleVisitAction; @override State createState() => @@ -48,6 +46,8 @@ class _MenuListViewComponentWidgetState @override Widget build(BuildContext context) { + context.watch(); + return Wrap( spacing: 0.0, runSpacing: 0.0, @@ -62,46 +62,42 @@ class _MenuListViewComponentWidgetState padding: const EdgeInsetsDirectional.fromSTEB(5.0, 0.0, 5.0, 0.0), child: Container( width: double.infinity, - height: 125.0, + height: 106.0, decoration: const BoxDecoration(), child: ListView( - padding: const EdgeInsets.fromLTRB( - 10.0, - 0, - 10.0, - 0, - ), + padding: EdgeInsets.zero, scrollDirection: Axis.horizontal, children: [ Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), + padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { - await widget.scheduleVisitAction?.call(); + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const OptionSelectionModalWidget(), + ); + }, + ).then((value) => safeSetState(() {})); }, child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).alternate, + color: FlutterFlowTheme.of(context).customColor1, width: 0.5, ), ), @@ -186,34 +182,36 @@ Visita */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), + padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { - await widget.registerVisitorAction?.call(); + context.pushNamed( + 'registerVisitorPage', + queryParameters: { + 'userUUID': serializeParam( + FFAppState().userUUID, + ParamType.String, + ), + 'devUUID': serializeParam( + FFAppState().devUUID, + ParamType.String, + ), + }.withoutNulls, + ); }, child: Container( width: 100.0, - height: double.infinity, + height: 0.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).alternate, + color: FlutterFlowTheme.of(context).customColor1, width: 0.5, ), ), @@ -298,26 +296,16 @@ Visitante */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), + padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).alternate, + color: FlutterFlowTheme.of(context).customColor1, width: 0.5, ), ), @@ -400,26 +388,16 @@ Condomínio */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), + padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).alternate, + color: FlutterFlowTheme.of(context).customColor1, width: 0.5, ), ), @@ -502,26 +480,108 @@ Pet */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), + padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).alternate, + color: FlutterFlowTheme.of(context).customColor1, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Icon( + FFIcons.kvector3, + color: FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), + ), + ), + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'xlp8dyn6' /* Agendar +Visita */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), + child: Container( + width: 100.0, + height: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).customColor1, width: 0.5, ), ), @@ -603,7 +663,99 @@ de Acesso */ ), ), ), - ].divide(const SizedBox(width: 15.0)), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), + child: Container( + width: 100.0, + height: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).customColor1, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Icon( + FFIcons.kfast, + color: FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), + ), + ), + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + '45gqx8e0' /* Agenda +Auto-Visita */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + ), + ], ), ), ), diff --git a/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart index 8fc6e479..85226519 100644 --- a/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart +++ b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart @@ -10,14 +10,10 @@ export 'menu_staggered_view_component_model.dart'; class MenuStaggeredViewComponentWidget extends StatefulWidget { const MenuStaggeredViewComponentWidget({ super.key, - required this.changeMenuStyleAction, - required this.registerVisitorOptAction, - required this.scheduleVisitOptAction, + required this.changeMenuStyle, }); - final Future Function()? changeMenuStyleAction; - final Future Function()? registerVisitorOptAction; - final Future Function()? scheduleVisitOptAction; + final Future Function()? changeMenuStyle; @override State createState() => @@ -61,7 +57,7 @@ class _MenuStaggeredViewComponentWidgetState children: [ Container( width: double.infinity, - height: MediaQuery.sizeOf(context).height * 0.35, + height: 430.0, decoration: const BoxDecoration(), child: Padding( padding: const EdgeInsets.all(16.0), @@ -72,39 +68,38 @@ class _MenuStaggeredViewComponentWidgetState ), crossAxisSpacing: 10.0, mainAxisSpacing: 10.0, - itemCount: 5, + itemCount: 7, shrinkWrap: true, itemBuilder: (context, index) { return [ - () => InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await widget.scheduleVisitOptAction?.call(); - }, + () => Padding( + padding: EdgeInsets.all(valueOrDefault( + () { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall) { + return 0.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointMedium) { + return 24.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointLarge) { + return 24.0; + } else { + return 0.0; + } + }(), + 0.0, + )), child: Container( width: 100.0, height: 100.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: - FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).alternate, + color: FlutterFlowTheme.of(context).customColor1, width: 0.5, ), ), @@ -141,7 +136,7 @@ class _MenuStaggeredViewComponentWidgetState alignment: const AlignmentDirectional( 0.0, 0.0), child: Icon( - FFIcons.kvector1, + FFIcons.kfast, color: FlutterFlowTheme.of(context) .accent1, @@ -165,8 +160,8 @@ class _MenuStaggeredViewComponentWidgetState const AlignmentDirectional(0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'ee33l0ms' /* Agendar -Visita */ + 'jn7p6pj6' /* Agenda +Auto-Visita */ , ), style: FlutterFlowTheme.of(context) @@ -193,35 +188,34 @@ Visita */ ), ), ), - () => InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await widget.registerVisitorOptAction?.call(); - }, + () => Padding( + padding: EdgeInsets.all(valueOrDefault( + () { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall) { + return 0.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointMedium) { + return 24.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointLarge) { + return 24.0; + } else { + return 0.0; + } + }(), + 0.0, + )), child: Container( width: 100.0, height: 100.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: - FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).alternate, + color: FlutterFlowTheme.of(context).customColor1, width: 0.5, ), ), @@ -282,8 +276,8 @@ Visita */ const AlignmentDirectional(0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'ya37l3jt' /* Cadastrar - Visitante */ + 'yymmdtyv' /* Cadastrar +Visitante */ , ), style: FlutterFlowTheme.of(context) @@ -310,318 +304,583 @@ Visita */ ), ), ), - () => Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).alternate, - width: 0.5, + () => Padding( + padding: EdgeInsets.all(valueOrDefault( + () { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall) { + return 0.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointMedium) { + return 24.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointLarge) { + return 24.0; + } else { + return 0.0; + } + }(), + 0.0, + )), + child: Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).customColor1, + width: 0.5, + ), ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Icon( - FFIcons.khome, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional( + 0.0, 0.0), + child: Icon( + FFIcons.khome, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), ), ), ), ), - ), - ], + ], + ), ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'h8s3adu8' /* Vincular + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'f2jbm9jz' /* Vincular Condomínio */ - , + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), ), - ), - ], + ], + ), ), - ), - ].divide(const SizedBox(height: 0.0)), + ].divide(const SizedBox(height: 0.0)), + ), ), ), ), - () => Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).alternate, - width: 0.5, + () => Padding( + padding: EdgeInsets.all(valueOrDefault( + () { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall) { + return 0.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointMedium) { + return 24.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointLarge) { + return 24.0; + } else { + return 0.0; + } + }(), + 0.0, + )), + child: Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).customColor1, + width: 0.5, + ), ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Icon( - FFIcons.kpets, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional( + 0.0, 0.0), + child: Icon( + FFIcons.kpets, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), ), ), ), ), - ), - ], + ], + ), ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'j6tfixen' /* Cadastrar + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'rs5a7h6m' /* Cadastrar Pet */ - , + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), ), - ), - ], + ], + ), ), - ), - ].divide(const SizedBox(height: 0.0)), + ].divide(const SizedBox(height: 0.0)), + ), ), ), ), - () => Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).alternate, - width: 0.5, + () => Padding( + padding: EdgeInsets.all(valueOrDefault( + () { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall) { + return 0.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointMedium) { + return 24.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointLarge) { + return 24.0; + } else { + return 0.0; + } + }(), + 0.0, + )), + child: Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).customColor1, + width: 0.5, + ), ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Icon( - FFIcons.kvector2, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional( + 0.0, 0.0), + child: Icon( + FFIcons.kvector1, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), ), ), ), ), - ), - ], + ], + ), ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - '9tli4i2x' /* QR Code -de Acesso */ - , + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'if2zuaok' /* Agendar +Visita */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), ), - ), - ], + ], + ), ), - ), - ].divide(const SizedBox(height: 0.0)), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + ), + () => Padding( + padding: EdgeInsets.all(valueOrDefault( + () { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall) { + return 0.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointMedium) { + return 24.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointLarge) { + return 24.0; + } else { + return 0.0; + } + }(), + 0.0, + )), + child: Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).customColor1, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional( + 0.0, 0.0), + child: Icon( + FFIcons.kvector3, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), + ), + ), + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'r4mjqq6s' /* Agendar +Visita */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + ), + () => Padding( + padding: EdgeInsets.all(valueOrDefault( + () { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall) { + return 0.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointMedium) { + return 24.0; + } else if (MediaQuery.sizeOf(context).width < + kBreakpointLarge) { + return 24.0; + } else { + return 0.0; + } + }(), + 0.0, + )), + child: Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).customColor1, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional( + 0.0, 0.0), + child: Icon( + FFIcons.kvector2, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), + ), + ), + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'cilu7ief' /* QR Code +de Acesso */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), ), ), ), @@ -655,7 +914,7 @@ de Acesso */ color: FlutterFlowTheme.of(context).primary, ), onPressed: () async { - await widget.changeMenuStyleAction?.call(); + await widget.changeMenuStyle?.call(); }, ), ), diff --git a/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart index 83d530d2..df34ecea 100644 --- a/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart +++ b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart @@ -921,6 +921,7 @@ class _ScheduleVisitDetailWidgetState extends State { await PhpGroup.postScheduleVisitCall.call( devUUID: FFAppState().devUUID, userUUID: FFAppState().userUUID, + cliUUID: FFAppState().cliUUID, atividade: 'putVisita', devDesc: widget.visitObsStr, idVisitante: widget.visitorStrList, @@ -931,7 +932,6 @@ class _ScheduleVisitDetailWidgetState extends State { functions.extractIdToStr(widget.visitResonStr!), idNAC: functions.extractIdToStr(widget.visitLevelStr!), obs: widget.visitObsStr, - cliID: FFAppState().cliUUID, ); if (PhpGroup.postScheduleVisitCall.error( (_model.postScheduleVisit?.jsonBody ?? ''), diff --git a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart index 32e250ab..883791c9 100644 --- a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart +++ b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart @@ -4,10 +4,12 @@ import 'view_visit_detail_widget.dart' show ViewVisitDetailWidget; import 'package:flutter/material.dart'; class ViewVisitDetailModel extends FlutterFlowModel { + /// Local state fields for this component. + + Color? statusColor; + /// State fields for stateful widgets in this component. - // Stores action output result for [Action Block - manageStatusColorAction] action in viewVisitDetail widget. - Color? visitStatusColor; // State field(s) for TextField widget. FocusNode? textFieldFocusNode1; TextEditingController? textController1; diff --git a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart index a19cff25..d48a2c31 100644 --- a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart +++ b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart @@ -4,7 +4,6 @@ import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import '/actions/actions.dart' as action_blocks; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -65,14 +64,23 @@ class _ViewVisitDetailWidgetState extends State { // On component load action. SchedulerBinding.instance.addPostFrameCallback((_) async { - _model.visitStatusColor = await action_blocks.manageStatusColorAction( - context, - visitStatusStr: widget.visitStatusStr, - ); + if (widget.visitStatusStr == 'A') { + _model.statusColor = FlutterFlowTheme.of(context).primary; + setState(() {}); + } else if ((widget.visitStatusStr == 'C') || + (widget.visitStatusStr == 'F') || + (widget.visitStatusStr == 'B') || + (widget.visitStatusStr == 'I')) { + _model.statusColor = FlutterFlowTheme.of(context).error; + setState(() {}); + } else { + _model.statusColor = FlutterFlowTheme.of(context).warning; + setState(() {}); + } }); - _model.textController1 ??= TextEditingController( - text: widget.visitTempStr == 'null' ? '' : widget.visitTempStr); + _model.textController1 ??= + TextEditingController(text: widget.visitorStrList); _model.textFieldFocusNode1 ??= FocusNode(); _model.textController2 ??= @@ -759,10 +767,7 @@ class _ViewVisitDetailWidgetState extends State { width: double.infinity, height: 35.0, decoration: BoxDecoration( - color: valueOrDefault( - _model.visitStatusColor, - FlutterFlowTheme.of(context).primary, - ), + color: _model.statusColor, borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(0.0), bottomRight: Radius.circular(0.0), diff --git a/lib/application_components/templates_components/menu_component/menu_component_model.dart b/lib/application_components/templates_components/menu_component/menu_component_model.dart index b7be1afb..1fe72b77 100644 --- a/lib/application_components/templates_components/menu_component/menu_component_model.dart +++ b/lib/application_components/templates_components/menu_component/menu_component_model.dart @@ -1,4 +1,3 @@ -import '/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart'; import '/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart'; import '/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart'; import '/flutter_flow/flutter_flow_util.dart'; @@ -35,23 +34,4 @@ class MenuComponentModel extends FlutterFlowModel { Future changeMenuStyle(BuildContext context) async { isGrid = !isGrid; } - - Future scheduleVisitOptAction(BuildContext context) async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const OptionSelectionModalWidget(), - ); - }, - ); - } - - Future registerVisitorOptAction(BuildContext context) async { - context.pushNamed('registerVisitorPage'); - } } diff --git a/lib/application_components/templates_components/menu_component/menu_component_widget.dart b/lib/application_components/templates_components/menu_component/menu_component_widget.dart index b03e32ff..b89f8671 100644 --- a/lib/application_components/templates_components/menu_component/menu_component_widget.dart +++ b/lib/application_components/templates_components/menu_component/menu_component_widget.dart @@ -50,14 +50,6 @@ class _MenuComponentWidgetState extends State { await _model.changeMenuStyle(context); setState(() {}); }, - registerVisitorAction: () async { - await _model.registerVisitorOptAction(context); - setState(() {}); - }, - scheduleVisitAction: () async { - await _model.scheduleVisitOptAction(context); - setState(() {}); - }, ), ); } else { @@ -66,18 +58,10 @@ class _MenuComponentWidgetState extends State { updateCallback: () => setState(() {}), updateOnChange: true, child: MenuStaggeredViewComponentWidget( - changeMenuStyleAction: () async { + changeMenuStyle: () async { await _model.changeMenuStyle(context); setState(() {}); }, - registerVisitorOptAction: () async { - await _model.registerVisitorOptAction(context); - setState(() {}); - }, - scheduleVisitOptAction: () async { - await _model.scheduleVisitOptAction(context); - setState(() {}); - }, ), ); } diff --git a/lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart b/lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart deleted file mode 100644 index 03f37209..00000000 --- a/lib/application_components/templates_components/visit_history_component/visit_history_component_model.dart +++ /dev/null @@ -1,12 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import 'visit_history_component_widget.dart' show VisitHistoryComponentWidget; -import 'package:flutter/material.dart'; - -class VisitHistoryComponentModel - extends FlutterFlowModel { - @override - void initState(BuildContext context) {} - - @override - void dispose() {} -} diff --git a/lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart b/lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart deleted file mode 100644 index b33ddd82..00000000 --- a/lib/application_components/templates_components/visit_history_component/visit_history_component_widget.dart +++ /dev/null @@ -1,388 +0,0 @@ -import '/application_components/molecular_components/opt_modal/opt_modal_widget.dart'; -import '/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart'; -import '/backend/api_requests/api_calls.dart'; -import '/flutter_flow/flutter_flow_icon_button.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/custom_functions.dart' as functions; -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_spinkit/flutter_spinkit.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:provider/provider.dart'; -import 'visit_history_component_model.dart'; -export 'visit_history_component_model.dart'; - -class VisitHistoryComponentWidget extends StatefulWidget { - const VisitHistoryComponentWidget({ - super.key, - this.parameter1, - }); - - final FFUploadedFile? parameter1; - - @override - State createState() => - _VisitHistoryComponentWidgetState(); -} - -class _VisitHistoryComponentWidgetState - extends State { - late VisitHistoryComponentModel _model; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => VisitHistoryComponentModel()); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - context.watch(); - - return Container( - width: double.infinity, - height: 900.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - FlutterFlowIconButton( - borderColor: Colors.transparent, - borderRadius: 20.0, - borderWidth: 1.0, - buttonSize: 40.0, - icon: Icon( - Icons.settings_sharp, - color: FlutterFlowTheme.of(context).primary, - size: 24.0, - ), - onPressed: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - context: context, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const OptModalWidget(), - ); - }, - ).then((value) => safeSetState(() {})); - }, - ), - ], - ), - Expanded( - child: Padding( - padding: const EdgeInsets.all(14.0), - child: FutureBuilder( - future: PhpGroup.getVisitsCall.call( - devUUID: FFAppState().devUUID, - userUUID: FFAppState().userUUID, - cliID: FFAppState().cliUUID, - atividade: 'getVisitas', - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: FlutterFlowTheme.of(context).primary, - size: 50.0, - ), - ), - ); - } - final gridViewGetVisitsResponse = snapshot.data!; - return Builder( - builder: (context) { - final visitHistory = (PhpGroup.getVisitsCall - .visitasList( - gridViewGetVisitsResponse.jsonBody, - ) - ?.toList() ?? - []) - .take(10) - .toList(); - return GridView.builder( - padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - crossAxisSpacing: 10.0, - mainAxisSpacing: 10.0, - childAspectRatio: 1.0, - ), - scrollDirection: Axis.vertical, - itemCount: visitHistory.length, - itemBuilder: (context, visitHistoryIndex) { - final visitHistoryItem = - visitHistory[visitHistoryIndex]; - return Container( - width: double.infinity, - height: double.infinity, - decoration: const BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(50.0), - bottomRight: Radius.circular(50.0), - topLeft: Radius.circular(25.0), - topRight: Radius.circular(25.0), - ), - shape: BoxShape.rectangle, - ), - child: Stack( - children: [ - Container( - width: double.infinity, - height: double.infinity, - decoration: BoxDecoration( - color: valueOrDefault( - () { - if (functions.jsonToStr(getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"A\"') { - return FlutterFlowTheme.of(context) - .success; - } else if (functions - .jsonToStr(getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"C\"') { - return FlutterFlowTheme.of(context) - .error; - } else if (functions - .jsonToStr(getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"I\"') { - return FlutterFlowTheme.of(context) - .warning; - } else { - return FlutterFlowTheme.of(context) - .primary; - } - }(), - FlutterFlowTheme.of(context).primary, - ), - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(10.0), - bottomRight: Radius.circular(10.0), - topLeft: Radius.circular(25.0), - topRight: Radius.circular(25.0), - ), - shape: BoxShape.rectangle, - ), - ), - InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - useSafeArea: true, - context: context, - builder: (context) { - return Padding( - padding: - MediaQuery.viewInsetsOf(context), - child: VisitDetailsModalWidget( - visitStatusStr: getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS ''', - ).toString(), - visitStartDateStr: getJsonField( - visitHistoryItem, - r'''$.VAW_DTINICIO''', - ).toString(), - visitEndDateStr: getJsonField( - visitHistoryItem, - r'''$.VAW_DTFIM''', - ).toString(), - visitReasonStr: getJsonField( - visitHistoryItem, - r'''$.MOT_DESCRICAO''', - ).toString(), - visitLevelStr: getJsonField( - visitHistoryItem, - r'''$.NAC_DESCRICAO''', - ).toString(), - visitTempStr: getJsonField( - visitHistoryItem, - r'''$.VTE_UNICA ''', - ).toString(), - visitObsStr: getJsonField( - visitHistoryItem, - r'''$.VAW_OBS''', - ).toString(), - visitorImgPath: - valueOrDefault( - 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( - visitHistoryItem, - r'''$.VTE_DOCUMENTO''', - ).toString()}&tipo=E', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - visitorStrList: getJsonField( - visitHistoryItem, - r'''$.VTE_DOCUMENTO''', - ).toString(), - visitIdStr: getJsonField( - visitHistoryItem, - r'''$.VAW_ID''', - ).toString(), - visitorJsonList: PhpGroup - .getVisitsCall - .visitasList( - gridViewGetVisitsResponse - .jsonBody, - ), - updateToggleIdx: () async { - setState(() {}); - }, - repeatVisitSchedule: () async {}, - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - child: ClipRRect( - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(25.0), - bottomRight: Radius.circular(25.0), - topLeft: Radius.circular(25.0), - topRight: Radius.circular(25.0), - ), - child: CachedNetworkImage( - fadeInDuration: - const Duration(milliseconds: 500), - fadeOutDuration: - const Duration(milliseconds: 500), - imageUrl: valueOrDefault( - 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( - visitHistoryItem, - r'''$.VTE_DOCUMENTO''', - ).toString()}&tipo=E', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - width: double.infinity, - height: double.infinity, - fit: BoxFit.cover, - ), - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, -1.0), - child: Container( - width: 200.0, - height: 20.0, - decoration: BoxDecoration( - color: valueOrDefault( - () { - if (functions.jsonToStr(getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"A\"') { - return FlutterFlowTheme.of(context) - .success; - } else if (functions - .jsonToStr(getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"C\"') { - return FlutterFlowTheme.of(context) - .error; - } else if (functions - .jsonToStr(getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"I\"') { - return FlutterFlowTheme.of(context) - .warning; - } else { - return FlutterFlowTheme.of(context) - .primary; - } - }(), - FlutterFlowTheme.of(context).primary, - ), - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(0.0), - bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(25.0), - topRight: Radius.circular(25.0), - ), - ), - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - getJsonField( - visitHistoryItem, - r'''$.VTE_NOME''', - ).toString(), - textAlign: TextAlign.center, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - color: FlutterFlowTheme.of(context) - .info, - fontSize: 12.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts.asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ), - ), - ], - ), - ); - }, - ); - }, - ); - }, - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart b/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart index 42495373..15cd8948 100644 --- a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart +++ b/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart @@ -5,7 +5,6 @@ import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; @@ -326,19 +325,8 @@ class _VisitorSearchComponentWidgetState ClipRRect( borderRadius: BorderRadius.circular(40.0), - child: CachedNetworkImage( - fadeInDuration: - const Duration(milliseconds: 500), - fadeOutDuration: - const Duration(milliseconds: 500), - imageUrl: - valueOrDefault( - 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( - visitorItem, - r'''$.VTE_DOCUMENTO''', - ).toString()}&tipo=E', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), + child: Image.asset( + 'assets/images/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', width: 60.0, height: 60.0, fit: BoxFit.cover, diff --git a/lib/application_pages/fast_pass_page/fast_pass_page_model.dart b/lib/application_pages/fast_pass_page/fast_pass_page_model.dart deleted file mode 100644 index 2b4d9d53..00000000 --- a/lib/application_pages/fast_pass_page/fast_pass_page_model.dart +++ /dev/null @@ -1,17 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import 'fast_pass_page_widget.dart' show FastPassPageWidget; -import 'package:flutter/material.dart'; - -class FastPassPageModel extends FlutterFlowModel { - /// State fields for stateful widgets in this page. - - final unfocusNode = FocusNode(); - - @override - void initState(BuildContext context) {} - - @override - void dispose() { - unfocusNode.dispose(); - } -} diff --git a/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart b/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart deleted file mode 100644 index 5edf4ae4..00000000 --- a/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart +++ /dev/null @@ -1,44 +0,0 @@ -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import 'package:flutter/material.dart'; -import 'fast_pass_page_model.dart'; -export 'fast_pass_page_model.dart'; - -class FastPassPageWidget extends StatefulWidget { - const FastPassPageWidget({super.key}); - - @override - State createState() => _FastPassPageWidgetState(); -} - -class _FastPassPageWidgetState extends State { - late FastPassPageModel _model; - - final scaffoldKey = GlobalKey(); - - @override - void initState() { - super.initState(); - _model = createModel(context, () => FastPassPageModel()); - } - - @override - void dispose() { - _model.dispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _model.unfocusNode.canRequestFocus - ? FocusScope.of(context).requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Scaffold( - key: scaffoldKey, - backgroundColor: FlutterFlowTheme.of(context).primaryBackground, - ), - ); - } -} diff --git a/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart b/lib/application_pages/forgot_password_page/forgot_password_page_model.dart similarity index 100% rename from lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart rename to lib/application_pages/forgot_password_page/forgot_password_page_model.dart diff --git a/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart b/lib/application_pages/forgot_password_page/forgot_password_page_widget.dart similarity index 97% rename from lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart rename to lib/application_pages/forgot_password_page/forgot_password_page_widget.dart index 51646517..b30452d5 100644 --- a/lib/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart +++ b/lib/application_pages/forgot_password_page/forgot_password_page_widget.dart @@ -52,7 +52,7 @@ class _ForgotPasswordPageWidgetState extends State { children: [ if (isWeb == false) Align( - alignment: const AlignmentDirectional(-1.0, 1.0), + alignment: const AlignmentDirectional(-1.0, -1.0), child: FlutterFlowIconButton( borderColor: Colors.transparent, borderRadius: 30.0, @@ -141,7 +141,7 @@ class _ForgotPasswordPageWidgetState extends State { padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'gfvplb0h' /* ESQUECEU SUA SENHA? */, + 'lpduiuif' /* ESQUECEU SUA SENHA? */, ), style: FlutterFlowTheme.of(context).headlineMedium.override( fontFamily: 'Outfit', @@ -158,7 +158,7 @@ class _ForgotPasswordPageWidgetState extends State { padding: const EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 4.0), child: Text( FFLocalizations.of(context).getText( - 'azssgpdi' /* Não se preucupe nós vamos te a... */, + '8t05j98w' /* Não se preucupe nós vamos te a... */, ), style: FlutterFlowTheme.of(context).labelMedium.override( fontFamily: 'Plus Jakarta Sans', @@ -182,7 +182,7 @@ class _ForgotPasswordPageWidgetState extends State { obscureText: false, decoration: InputDecoration( labelText: FFLocalizations.of(context).getText( - '0o139961' /* Email */, + '4gcoci7a' /* Email */, ), labelStyle: FlutterFlowTheme.of(context).labelMedium.override( @@ -195,7 +195,7 @@ class _ForgotPasswordPageWidgetState extends State { .containsKey('Plus Jakarta Sans'), ), hintText: FFLocalizations.of(context).getText( - 'aanw1fp3' /* digite o seu email..... */, + 'a7p2iikz' /* digite o seu email..... */, ), hintStyle: FlutterFlowTheme.of(context).labelMedium.override( @@ -296,7 +296,7 @@ class _ForgotPasswordPageWidgetState extends State { if (shouldSetState) setState(() {}); }, text: FFLocalizations.of(context).getText( - 'e7hdgc4q' /* Enviar */, + 'z9ghb8dz' /* Enviar */, ), options: FFButtonOptions( width: 270.0, diff --git a/lib/application_pages/home_page/home_page_widget.dart b/lib/application_pages/home_page/home_page_widget.dart index cfe4a776..592e11b6 100644 --- a/lib/application_pages/home_page/home_page_widget.dart +++ b/lib/application_pages/home_page/home_page_widget.dart @@ -14,7 +14,14 @@ import 'home_page_model.dart'; export 'home_page_model.dart'; class HomePageWidget extends StatefulWidget { - const HomePageWidget({super.key}); + const HomePageWidget({ + super.key, + required this.userUUID, + required this.devUUID, + }); + + final String? userUUID; + final String? devUUID; @override State createState() => _HomePageWidgetState(); @@ -829,16 +836,7 @@ class _HomePageWidgetState extends State { FFAppState().isLogged = false; setState(() {}); - context.goNamed( - 'onBoardingPage', - extra: { - kTransitionInfoKey: const TransitionInfo( - hasTransition: true, - transitionType: PageTransitionType.scale, - alignment: Alignment.bottomCenter, - ), - }, - ); + context.pushNamed('WelcomePage'); }, text: FFLocalizations.of(context).getText( 'xx0db4wi' /* Sair */, @@ -846,7 +844,7 @@ class _HomePageWidgetState extends State { options: FFButtonOptions( height: 40.0, padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), + 24.0, 0.0, 24.0, 0.0), iconPadding: const EdgeInsetsDirectional.fromSTEB( 0.0, 0.0, 0.0, 0.0), color: const Color(0x00D70000), @@ -900,7 +898,7 @@ class _HomePageWidgetState extends State { Expanded( child: Container( width: 100.0, - height: 100.0, + height: 120.0, decoration: const BoxDecoration( color: Color(0xFF1AAB5F), ), @@ -909,9 +907,8 @@ class _HomePageWidgetState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Align( - alignment: const AlignmentDirectional(0.0, 1.0), + alignment: const AlignmentDirectional(0.0, 0.0), child: Container( - height: 50.0, decoration: const BoxDecoration(), child: Align( alignment: const AlignmentDirectional(0.0, 0.0), @@ -935,7 +932,7 @@ class _HomePageWidgetState extends State { icon: const Icon( Icons.menu_rounded, color: Colors.white, - size: 28.0, + size: 34.0, ), onPressed: () async { scaffoldKey.currentState! @@ -1002,35 +999,10 @@ class _HomePageWidgetState extends State { ), ), ), - Align( - alignment: const AlignmentDirectional(0.0, 1.0), - child: Container( - width: 100.0, - height: 50.0, - decoration: const BoxDecoration(), - child: Align( - alignment: const AlignmentDirectional(1.0, 1.0), - child: FlutterFlowIconButton( - borderColor: - FlutterFlowTheme.of(context) - .primary, - borderRadius: 20.0, - borderWidth: 1.0, - buttonSize: 40.0, - fillColor: FlutterFlowTheme.of(context) - .accent1, - icon: Icon( - Icons.notifications_sharp, - color: - FlutterFlowTheme.of(context).info, - size: 24.0, - ), - onPressed: () { - print('IconButton pressed ...'); - }, - ), - ), - ), + Container( + width: 100.0, + height: 100.0, + decoration: const BoxDecoration(), ), ], ), diff --git a/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart b/lib/application_pages/login_page/login_page_model.dart similarity index 65% rename from lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart rename to lib/application_pages/login_page/login_page_model.dart index 9642203c..92a3fd94 100644 --- a/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_model.dart +++ b/lib/application_pages/login_page/login_page_model.dart @@ -1,10 +1,12 @@ +import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import 'sign_in_component_widget.dart' show SignInComponentWidget; +import 'login_page_widget.dart' show LoginPageWidget; import 'package:flutter/material.dart'; -class SignInComponentModel extends FlutterFlowModel { - /// State fields for stateful widgets in this component. +class LoginPageModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + final unfocusNode = FocusNode(); // State field(s) for emailAddress widget. FocusNode? emailAddressFocusNode; TextEditingController? emailAddressTextController; @@ -14,6 +16,8 @@ class SignInComponentModel extends FlutterFlowModel { TextEditingController? passwordTextController; late bool passwordVisibility; String? Function(BuildContext, String?)? passwordTextControllerValidator; + // Stores action output result for [Backend Call - API (login)] action in signInButtonLoginForm widget. + ApiCallResponse? smallDisplayApi; @override void initState(BuildContext context) { @@ -22,6 +26,7 @@ class SignInComponentModel extends FlutterFlowModel { @override void dispose() { + unfocusNode.dispose(); emailAddressFocusNode?.dispose(); emailAddressTextController?.dispose(); diff --git a/lib/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart b/lib/application_pages/login_page/login_page_widget.dart similarity index 80% rename from lib/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart rename to lib/application_pages/login_page/login_page_widget.dart index ab64048d..19b87afc 100644 --- a/lib/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart +++ b/lib/application_pages/login_page/login_page_widget.dart @@ -1,12 +1,15 @@ +import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; +import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_animations.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; -import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/random_data_util.dart' as random_data; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; import 'login_page_model.dart'; export 'login_page_model.dart'; @@ -88,6 +91,8 @@ class _LoginPageWidgetState extends State @override Widget build(BuildContext context) { + context.watch(); + return GestureDetector( onTap: () => _model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(_model.unfocusNode) @@ -141,26 +146,28 @@ class _LoginPageWidgetState extends State child: Text( FFLocalizations.of(context) .getText( - '0113wf5c' /* VAMOS LA! ENTRE COM A SUA CONT... */, + 'uem0mca5' /* VAMOS LA! ENTRE COM A SUA CONT... */, ), textAlign: TextAlign.start, - style: FlutterFlowTheme.of( - context) - .displaySmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 24.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), + style: + FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.normal, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), ), ), ), @@ -236,7 +243,7 @@ class _LoginPageWidgetState extends State FFLocalizations.of( context) .getText( - 'f2go5a71' /* Email */, + '90ls8ppo' /* Email */, ), labelStyle: FlutterFlowTheme.of( @@ -364,7 +371,7 @@ class _LoginPageWidgetState extends State FFLocalizations.of( context) .getText( - 'paon3y0v' /* Senha */, + 'rvlumyaw' /* Senha */, ), labelStyle: FlutterFlowTheme.of( @@ -507,21 +514,182 @@ class _LoginPageWidgetState extends State child: FFButtonWidget( onPressed: () async { - await action_blocks - .singInActionApp( - context, - emailAdress: _model - .emailAddressTextController - .text, - password: _model - .passwordTextController - .text, - ); + var shouldSetState = + false; + await Future + .wait([ + Future( + () async { + FFAppState() + .email = + _model + .emailAddressTextController + .text; + setState( + () {}); + }), + Future( + () async { + FFAppState() + .passwd = + _model + .passwordTextController + .text; + setState( + () {}); + }), + ]); + if ((FFAppState() + .email != + '') && + (FFAppState() + .passwd != + '')) { + FFAppState() + .devUUID = + random_data + .randomString( + 36, + 36, + false, + false, + true, + ); + setState(() {}); + _model.smallDisplayApi = + await PhpGroup + .loginCall + .call( + email: + FFAppState() + .email, + password: + FFAppState() + .passwd, + uuid: FFAppState() + .devUUID, + type: FFAppState() + .device, + description: + '', + ); + shouldSetState = + true; + FFAppState() + .userUUID = + PhpGroup + .loginCall + .userUUID( + (_model.smallDisplayApi + ?.jsonBody ?? + ''), + )!; + setState(() {}); + if (PhpGroup + .loginCall + .error( + (_model.smallDisplayApi + ?.jsonBody ?? + ''), + ) == + false) { + FFAppState() + .isLogged = + true; + setState( + () {}); + + context + .goNamed( + 'homePage', + queryParameters: + { + 'userUUID': + serializeParam( + FFAppState() + .userUUID, + ParamType + .String, + ), + 'devUUID': + serializeParam( + FFAppState() + .devUUID, + ParamType + .String, + ), + }.withoutNulls, + extra: { + kTransitionInfoKey: + const TransitionInfo( + hasTransition: + true, + transitionType: + PageTransitionType.fade, + ), + }, + ); + } else { + await showModalBottomSheet( + isScrollControlled: + true, + backgroundColor: + Colors + .transparent, + enableDrag: + false, + context: + context, + builder: + (context) { + return GestureDetector( + onTap: () => _model.unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: + Padding( + padding: + MediaQuery.viewInsetsOf(context), + child: + ThrowExceptionWidget( + msg: + PhpGroup.loginCall.msg( + (_model.smallDisplayApi?.jsonBody ?? ''), + )!, + ), + ), + ); + }, + ).then((value) => + safeSetState( + () {})); + + setState(() { + _model + .emailAddressTextController + ?.clear(); + _model + .passwordTextController + ?.clear(); + }); + } + } else { + if (shouldSetState) { + setState( + () {}); + } + return; + } + + if (shouldSetState) { + setState(() {}); + } }, text: FFLocalizations .of(context) .getText( - 'wmbzwstw' /* Entrar */, + '2d3903lt' /* Entrar */, ), options: FFButtonOptions( @@ -596,7 +764,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - 'j8567afe' /* Cadastrar */, + 'zj6pyujp' /* Cadastrar */, ), options: FFButtonOptions( @@ -682,7 +850,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - 'y3wd9q18' /* Entrar */, + 'iqhyif1d' /* Entrar */, ), options: FFButtonOptions( @@ -763,7 +931,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - 'j6ufb6sq' /* Cadastrar */, + '5x5bp2u1' /* Cadastrar */, ), options: FFButtonOptions( @@ -860,7 +1028,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - 'h85112qs' /* Você esqueceu a sua senha? */, + '1fqjz9q7' /* Você esqueceu a sua senha? */, ), style: TextStyle( color: FlutterFlowTheme @@ -872,7 +1040,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - 'di48hdaj' /* Recupere aqui */, + '7miyd406' /* Recupere aqui */, ), style: FlutterFlowTheme .of(context) @@ -938,7 +1106,7 @@ class _LoginPageWidgetState extends State ), Text( FFLocalizations.of(context).getText( - 'gx2fp6zq' /* Termo de Uso */, + '63xv5ewj' /* Termo de Uso */, ), style: FlutterFlowTheme.of(context) .bodyMedium diff --git a/lib/on_boarding/on_boarding_legacy/register_page/register_page_model.dart b/lib/application_pages/register_page/register_page_model.dart similarity index 89% rename from lib/on_boarding/on_boarding_legacy/register_page/register_page_model.dart rename to lib/application_pages/register_page/register_page_model.dart index 4583ef8e..46bc3a25 100644 --- a/lib/on_boarding/on_boarding_legacy/register_page/register_page_model.dart +++ b/lib/application_pages/register_page/register_page_model.dart @@ -1,3 +1,4 @@ +import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'register_page_widget.dart' show RegisterPageWidget; import 'package:flutter/material.dart'; @@ -32,6 +33,8 @@ class RegisterPageModel extends FlutterFlowModel { late bool passwordRegisterFormVisibility; String? Function(BuildContext, String?)? passwordRegisterFormTextControllerValidator; + // Stores action output result for [Backend Call - API (register)] action in SignUpButtonRegisterForm widget. + ApiCallResponse? registerCall; @override void initState(BuildContext context) { diff --git a/lib/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart b/lib/application_pages/register_page/register_page_widget.dart similarity index 81% rename from lib/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart rename to lib/application_pages/register_page/register_page_widget.dart index da8f34cc..16a5ef67 100644 --- a/lib/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart +++ b/lib/application_pages/register_page/register_page_widget.dart @@ -1,15 +1,15 @@ +import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_animations.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; -import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/random_data_util.dart' as random_data; import 'package:easy_debounce/easy_debounce.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:provider/provider.dart'; import 'register_page_model.dart'; export 'register_page_model.dart'; @@ -108,8 +108,6 @@ class _RegisterPageWidgetState extends State @override Widget build(BuildContext context) { - context.watch(); - return GestureDetector( onTap: () => _model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(_model.unfocusNode) @@ -160,7 +158,7 @@ class _RegisterPageWidgetState extends State padding: const EdgeInsets.all(4.0), child: Text( FFLocalizations.of(context).getText( - '2d8uulm3' /* INSIRA SEU EMAIL E SENHA, VAMO... */, + 'oxy0n1p4' /* INSIRA SEU EMAIL E SENHA, VAMO... */, ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) @@ -173,7 +171,7 @@ class _RegisterPageWidgetState extends State .primaryText, fontSize: 24.0, letterSpacing: 0.0, - fontWeight: FontWeight.w500, + fontWeight: FontWeight.normal, useGoogleFonts: GoogleFonts .asMap() .containsKey( @@ -256,7 +254,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - '8kjhi406' /* Nome */, + 'w0y3fz89' /* Nome */, ), labelStyle: FlutterFlowTheme .of(context) @@ -398,7 +396,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'ro4zkkxp' /* Email */, + '4bfdpd0o' /* Email */, ), labelStyle: FlutterFlowTheme .of(context) @@ -541,7 +539,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'lzgobioa' /* Senha */, + 'byjglkpk' /* Senha */, ), labelStyle: FlutterFlowTheme .of(context) @@ -667,25 +665,171 @@ class _RegisterPageWidgetState extends State 0.0, 0.0, 0.0, 16.0), child: FFButtonWidget( onPressed: () async { - await action_blocks - .signUpActionApp( - context, - name: _model - .nameRegisterFormTextController - .text, - passwd: _model - .passwordRegisterFormTextController - .text, - email: _model - .emailRegisterFormTextController - .text, - device: FFAppState().device, - ); + await Future.wait([ + Future(() async { + setState(() { + _model.emailRegisterFormTextController + ?.text = + _model + .emailRegisterFormTextController + .text; + }); + }), + Future(() async { + setState(() { + _model.passwordRegisterFormTextController + ?.text = + _model + .passwordRegisterFormTextController + .text; + }); + }), + Future(() async { + setState(() { + _model.nameRegisterFormTextController + ?.text = + _model + .nameRegisterFormTextController + .text; + }); + }), + ]); + if ((_model.emailRegisterFormTextController.text != '') && + (_model.passwordRegisterFormTextController + .text != + '') && + (_model.nameRegisterFormTextController + .text != + '')) { + _model.registerCall = + await PhpGroup + .registerCall + .call( + name: _model + .nameRegisterFormTextController + .text, + password: _model + .passwordRegisterFormTextController + .text, + email: _model + .emailRegisterFormTextController + .text, + token: random_data + .randomString( + 36, + 36, + false, + false, + true, + ), + uuid: random_data + .randomString( + 36, + 36, + false, + false, + true, + ), + tipo: _model.device, + descricao: random_data + .randomString( + 36, + 36, + true, + false, + false, + ), + ); + if (PhpGroup.registerCall + .error( + (_model.registerCall + ?.jsonBody ?? + ''), + ) == + false) { + context.goNamed( + 'LoginPage', + queryParameters: { + 'device': + serializeParam( + '', + ParamType.String, + ), + }.withoutNulls, + extra: { + kTransitionInfoKey: + const TransitionInfo( + hasTransition: true, + transitionType: + PageTransitionType + .fade, + ), + }, + ); + } else { + await showDialog( + context: context, + builder: + (alertDialogContext) { + return AlertDialog( + title: + const Text('ERROR2'), + content: + const Text('ERROR2'), + actions: [ + TextButton( + onPressed: () => + Navigator.pop( + alertDialogContext), + child: const Text( + 'ERROR2 '), + ), + ], + ); + }, + ); + setState(() { + _model + .passwordRegisterFormTextController + ?.clear(); + _model + .emailRegisterFormTextController + ?.clear(); + _model + .nameRegisterFormTextController + ?.clear(); + }); + } + } else { + await showDialog( + context: context, + builder: + (alertDialogContext) { + return AlertDialog( + title: const Text('ERROR1'), + content: + const Text('ERROR1'), + actions: [ + TextButton( + onPressed: () => + Navigator.pop( + alertDialogContext), + child: const Text( + 'ERROR1 '), + ), + ], + ); + }, + ); + } + + setState(() {}); }, text: FFLocalizations.of(context) .getText( - 'c7sfyeh8' /* Cadastrar-se */, + 'w9vrsnmf' /* Cadastrar-se */, ), options: FFButtonOptions( width: double.infinity, @@ -765,7 +909,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'jglpa1tr' /* Você já tem uma conta? */, + 'zep60lcd' /* Você já tem uma conta? */, ), style: TextStyle( color: FlutterFlowTheme @@ -778,7 +922,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'hfcm0td9' /* Clique aqui */, + 'tl8k1ld9' /* Clique aqui */, ), style: FlutterFlowTheme.of( @@ -836,7 +980,7 @@ class _RegisterPageWidgetState extends State ), Text( FFLocalizations.of(context).getText( - 'c3kno4t9' /* Termo de Uso */, + 'dbtzii7i' /* Termo de Uso */, ), style: FlutterFlowTheme.of(context) .bodyMedium diff --git a/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart b/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart index cb72f361..bd438bfb 100644 --- a/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart +++ b/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart @@ -14,7 +14,14 @@ import 'register_visitor_page_model.dart'; export 'register_visitor_page_model.dart'; class RegisterVisitorPageWidget extends StatefulWidget { - const RegisterVisitorPageWidget({super.key}); + const RegisterVisitorPageWidget({ + super.key, + required this.userUUID, + required this.devUUID, + }); + + final String? userUUID; + final String? devUUID; @override State createState() => diff --git a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart index 061b4853..e3316b73 100644 --- a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart +++ b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart @@ -1,14 +1,16 @@ -import '/components/select_header_component_widget.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/form_field_controller.dart'; import 'schedule_complete_visit_page_widget.dart' show ScheduleCompleteVisitPageWidget; +import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; class ScheduleCompleteVisitPageModel extends FlutterFlowModel { /// Local state fields for this page. + bool toggleIdx = true; + List visitorJsonList = []; void addToVisitorJsonList(dynamic item) => visitorJsonList.add(item); void removeFromVisitorJsonList(dynamic item) => visitorJsonList.remove(item); @@ -24,10 +26,11 @@ class ScheduleCompleteVisitPageModel /// State fields for stateful widgets in this page. final unfocusNode = FocusNode(); - // Model for selectHeaderComponent component. - late SelectHeaderComponentModel selectHeaderComponentModel; - // Stores action output result for [Action Block - toggleCurrentSelectionHeader] action in selectHeaderComponent widget. - bool? toggleIndexValue; + // State field(s) for Carousel widget. + CarouselController? carouselController; + + int carouselCurrentIndex = 1; + // State field(s) for TextField widget. FocusNode? textFieldFocusNode1; TextEditingController? textController1; @@ -52,15 +55,11 @@ class ScheduleCompleteVisitPageModel String? Function(BuildContext, String?)? textController3Validator; @override - void initState(BuildContext context) { - selectHeaderComponentModel = - createModel(context, () => SelectHeaderComponentModel()); - } + void initState(BuildContext context) {} @override void dispose() { unfocusNode.dispose(); - selectHeaderComponentModel.dispose(); textFieldFocusNode1?.dispose(); textController1?.dispose(); @@ -70,23 +69,4 @@ class ScheduleCompleteVisitPageModel textFieldFocusNode3?.dispose(); textController3?.dispose(); } - - /// Action blocks. - Future getVisitorsActionPage( - BuildContext context, { - List? visitorsJsonList, - }) async { - visitorJsonList = visitorsJsonList!.toList().cast(); - } - - Future toggleCurrentSelectionHeader( - BuildContext context, { - required bool? toggleIndexValue, - }) async { - if (toggleIndexValue == true) { - return true; - } - - return false; - } } diff --git a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart index 71159cbe..52258ac8 100644 --- a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart +++ b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart @@ -4,7 +4,6 @@ import '/application_components/templates_components/visit_details_modal/visit_d import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart'; import '/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart'; import '/backend/api_requests/api_calls.dart'; -import '/components/select_header_component_widget.dart'; import '/flutter_flow/flutter_flow_drop_down.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; @@ -12,8 +11,8 @@ import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; import '/flutter_flow/form_field_controller.dart'; import '/flutter_flow/custom_functions.dart' as functions; -import 'package:auto_size_text/auto_size_text.dart'; import 'package:cached_network_image/cached_network_image.dart'; +import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; @@ -83,13 +82,16 @@ class _ScheduleCompleteVisitPageWidgetState } }); - _model.textController1 ??= TextEditingController(); + _model.textController1 ??= TextEditingController( + text: widget.visitStartDateStr != null && widget.visitStartDateStr != '' + ? widget.visitStartDateStr + : ''); _model.textFieldFocusNode1 ??= FocusNode(); _model.textController2 ??= TextEditingController(); _model.textFieldFocusNode2 ??= FocusNode(); - _model.switchValue = true; + _model.switchValue = false; _model.textController3 ??= TextEditingController(); _model.textFieldFocusNode3 ??= FocusNode(); } @@ -112,209 +114,275 @@ class _ScheduleCompleteVisitPageWidgetState child: Scaffold( key: scaffoldKey, backgroundColor: FlutterFlowTheme.of(context).primaryBackground, - appBar: AppBar( - backgroundColor: FlutterFlowTheme.of(context).primaryBackground, - automaticallyImplyLeading: false, - leading: FlutterFlowIconButton( - borderColor: Colors.transparent, - borderRadius: 30.0, - borderWidth: 1.0, - buttonSize: 60.0, - icon: Icon( - Icons.keyboard_arrow_left, - color: FlutterFlowTheme.of(context).primaryText, - size: 30.0, - ), - onPressed: () async { - context.pop(); - }, - ), - title: Text( - FFLocalizations.of(context).getText( - '61lcxdgm' /* Agendar Visita */, - ), - style: FlutterFlowTheme.of(context).headlineMedium.override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 15.0, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'), - ), - ), - actions: const [], - centerTitle: true, - ), - body: SafeArea( - top: true, - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - wrapWithModel( - model: _model.selectHeaderComponentModel, - updateCallback: () => setState(() {}), - updateOnChange: true, - child: SelectHeaderComponentWidget( - toggleIndexValue: _model.toggleIndexValue, - selectToggle: (toggleIndex) async { - _model.toggleIndexValue = - await _model.toggleCurrentSelectionHeader( - context, - toggleIndexValue: toggleIndex, - ); - - setState(() {}); - }, - ), - ), - if (valueOrDefault( - _model.toggleIndexValue == true, - true, - )) - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Stack( - children: [ - Container( - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .primaryBackground, + body: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 30.0, 0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + _model.toggleIdx = true; + setState(() {}); + }, + child: Container( + width: 100.0, + height: 40.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(0.0), + bottomRight: Radius.circular(100.0), + topLeft: Radius.circular(0.0), + topRight: Radius.circular(100.0), ), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 20.0, 30.0, 0.0, 30.0), - child: Text( - FFLocalizations.of(context).getText( - 'qo0pg2at' /* Quais visitantes você deseja c... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'e4w9lbke' /* Criar Agendamento */, + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: FlutterFlowTheme.of(context).info, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + ), + Expanded( + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + _model.toggleIdx = false; + setState(() {}); + }, + child: Container( + width: 100.0, + height: 40.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(100.0), + bottomRight: Radius.circular(0.0), + topLeft: Radius.circular(100.0), + topRight: Radius.circular(0.0), + ), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + '47bsumoy' /* Histórico de Visitas */, + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: FlutterFlowTheme.of(context).info, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + ), + ], + ), + ), + Builder( + builder: (context) { + if (_model.toggleIdx == true) { + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 10.0, 0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(-1.0, -1.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 20.0, 20.0, 0.0, 20.0), + child: Text( + FFLocalizations.of(context).getText( + '15ekd1ge' /* Agendar Visita */, + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: 'Nunito', + fontSize: 21.0, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ), + ], + ), + ), + Stack( + children: [ + Container( + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Divider( + thickness: 0.5, + color: + FlutterFlowTheme.of(context).accent1, + ), + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 20.0, 30.0, 0.0, 30.0), + child: Text( + FFLocalizations.of(context).getText( + 'qo0pg2at' /* Quais visitantes você deseja c... */, ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), ), ), - if (_model.visitorJsonList.isNotEmpty) - Builder( - builder: (context) { - final visitorListView = _model - .visitorJsonList - .map((e) => e) - .toList(); - return ListView.separated( - padding: const EdgeInsets.fromLTRB( - 0, - 0, - 0, - 20.0, - ), - shrinkWrap: true, - scrollDirection: Axis.vertical, - itemCount: visitorListView.length, - separatorBuilder: (_, __) => - const SizedBox(height: 5.0), - itemBuilder: (context, - visitorListViewIndex) { - final visitorListViewItem = - visitorListView[ - visitorListViewIndex]; - return InkWell( - splashColor: - Colors.transparent, - focusColor: - Colors.transparent, - hoverColor: - Colors.transparent, - highlightColor: - Colors.transparent, - onTap: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: - Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode - .canRequestFocus - ? FocusScope.of( - context) - .requestFocus( - _model - .unfocusNode) - : FocusScope.of( - context) - .unfocus(), - child: Padding( - padding: MediaQuery - .viewInsetsOf( - context), - child: - const VisitorDetailsModalWidget(), - ), - ); - }, - ).then((value) => - safeSetState(() {})); - }, - onLongPress: () async { - _model - .removeFromVisitorJsonList( - visitorListViewItem); - setState(() {}); - }, - child: Container( - width: 100.0, - height: 70.0, - decoration: BoxDecoration( - color: FlutterFlowTheme - .of(context) - .secondaryBackground, - ), - child: Row( - mainAxisSize: - MainAxisSize.max, - children: [ - Container( - width: 50.0, - height: 50.0, - clipBehavior: - Clip.antiAlias, - decoration: - const BoxDecoration( - shape: - BoxShape.circle, - ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + if (_model.visitorJsonList.isNotEmpty) + Builder( + builder: (context) { + final visitorList = _model + .visitorJsonList + .map((e) => e) + .toList(); + return SizedBox( + width: double.infinity, + height: 180.0, + child: CarouselSlider.builder( + itemCount: visitorList.length, + itemBuilder: (context, + visitorListIndex, _) { + final visitorListItem = + visitorList[ + visitorListIndex]; + return Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 20.0), + child: InkWell( + splashColor: + Colors.transparent, + focusColor: + Colors.transparent, + hoverColor: + Colors.transparent, + highlightColor: + Colors.transparent, + onTap: () async { + await showModalBottomSheet( + isScrollControlled: + true, + backgroundColor: + Colors + .transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode + .canRequestFocus + ? FocusScope.of( + context) + .requestFocus(_model + .unfocusNode) + : FocusScope.of( + context) + .unfocus(), + child: Padding( + padding: MediaQuery + .viewInsetsOf( + context), + child: + const VisitorDetailsModalWidget(), + ), + ); + }, + ).then((value) => + safeSetState( + () {})); + }, + onLongPress: () async { + _model.removeFromVisitorJsonList( + visitorListItem); + setState(() {}); + }, + child: ClipRRect( + borderRadius: + BorderRadius + .circular( + 8.0), child: CachedNetworkImage( fadeInDuration: @@ -329,1310 +397,185 @@ class _ScheduleCompleteVisitPageWidgetState valueOrDefault< String>( 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( - visitorListViewItem, + visitorListItem, r'''$.VTE_DOCUMENTO''', ).toString()}&tipo=E', 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', ), + width: 200.0, + height: 100.0, fit: BoxFit.cover, ), ), - Column( - mainAxisSize: - MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment - .center, - children: [ - Text( - getJsonField( - visitorListViewItem, - r'''$.VTE_NOME''', - ).toString(), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context).bodyMediumFamily), - ), - ), - Text( - getJsonField( - visitorListViewItem, - r'''$.VTE_TIPO''', - ).toString(), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context).bodyMediumFamily), - ), - ), - ], - ), - ] - .divide(const SizedBox( - width: 30.0)) - .addToStart(const SizedBox( - width: 30.0)), - ), - ), - ); - }, - ); - }, - ), - Stack( - children: [ - Align( - alignment: - const AlignmentDirectional(0.01, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 0.0, 20.0), - child: FFButtonWidget( - onPressed: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: - FlutterFlowTheme.of( - context) - .primaryBackground, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode - .canRequestFocus - ? FocusScope.of( - context) - .requestFocus(_model - .unfocusNode) - : FocusScope.of( - context) - .unfocus(), - child: Padding( - padding: MediaQuery - .viewInsetsOf( - context), - child: - VisitorSearchComponentWidget( - getVisitors: - (visitorsParam) async { - _model.visitorJsonList = - visitorsParam! - .toList() - .cast< - dynamic>(); - setState(() {}); - }, - getDocs: - (docsParam) async { - _model.visitorStrList = - functions.strListToStr( - docsParam! - .toList()); - setState(() {}); - }, - ), - ), - ); - }, - ).then((value) => - safeSetState(() {})); - }, - text: '', - icon: Icon( - Icons.add, - color: FlutterFlowTheme.of( - context) - .primary, - size: 30.0, - ), - options: FFButtonOptions( - width: - MediaQuery.sizeOf(context) - .width * - 0.8, - height: 80.0, - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional - .fromSTEB(14.0, 0.0, - 0.0, 20.0), - color: FlutterFlowTheme.of( - context) - .primaryBackground, - textStyle: FlutterFlowTheme - .of(context) - .titleSmall - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .titleSmallFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .titleSmallFamily), ), - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .accent4, - width: 1.0, + ); + }, + carouselController: _model + .carouselController ??= + CarouselController(), + options: CarouselOptions( + initialPage: max( + 0, + min( + 1, + visitorList.length - + 1)), + viewportFraction: 0.5, + disableCenter: true, + enlargeCenterPage: true, + enlargeFactor: 0.25, + enableInfiniteScroll: true, + scrollDirection: + Axis.horizontal, + autoPlay: false, + onPageChanged: (index, _) => + _model.carouselCurrentIndex = + index, ), - borderRadius: - BorderRadius.circular( - 8.0), ), - ), - ), + ); + }, ), - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 50.0, 0.0, 0.0), - child: Container( - width: - MediaQuery.sizeOf(context) - .width * - 0.8, - height: 20.0, - decoration: const BoxDecoration(), - child: Align( - alignment: - const AlignmentDirectional( - 0.0, 0.0), - child: AutoSizeText( - FFLocalizations.of(context) - .getText( - 'i0jhuu3e' /* Clique para adicionar um visit... */, - ), - style: FlutterFlowTheme.of( - context) - .bodyMedium + ], + ), + Stack( + children: [ + Align( + alignment: + const AlignmentDirectional(0.01, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 20.0), + child: FFButtonWidget( + onPressed: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode + .canRequestFocus + ? FocusScope.of( + context) + .requestFocus(_model + .unfocusNode) + : FocusScope.of( + context) + .unfocus(), + child: Padding( + padding: MediaQuery + .viewInsetsOf( + context), + child: + VisitorSearchComponentWidget( + getVisitors: + (visitorsParam) async { + _model.visitorJsonList = + visitorsParam! + .toList() + .cast< + dynamic>(); + setState(() {}); + }, + getDocs: + (docsParam) async { + _model.visitorStrList = + functions.strListToStr( + docsParam! + .toList()); + setState(() {}); + }, + ), + ), + ); + }, + ).then((value) => + safeSetState(() {})); + }, + text: '', + icon: Icon( + Icons.add, + color: + FlutterFlowTheme.of(context) + .primary, + size: 30.0, + ), + options: FFButtonOptions( + width: 300.0, + height: 80.0, + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: + const EdgeInsetsDirectional + .fromSTEB(14.0, 0.0, + 0.0, 20.0), + color: + FlutterFlowTheme.of(context) + .primaryBackground, + textStyle: + FlutterFlowTheme.of(context) + .titleSmall .override( fontFamily: FlutterFlowTheme.of( context) - .bodyMediumFamily, + .titleSmallFamily, color: FlutterFlowTheme .of(context) .primaryText, + fontSize: 16.0, letterSpacing: 0.0, useGoogleFonts: GoogleFonts .asMap() .containsKey( FlutterFlowTheme.of( context) - .bodyMediumFamily), + .titleSmallFamily), ), - ), + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .primary, + width: 1.0, ), + borderRadius: + BorderRadius.circular(8.0), ), ), ), - ], - ), - ], - ), - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 20.0, 24.0, 0.0, 24.0), - child: Text( - FFLocalizations.of(context).getText( - 'z4ry3tge' /* Qual o período de validade da ... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), ), - ), - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( + Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Padding( padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 0.0, 0.0, 0.0), - child: Container( - width: 100.0, - height: 40.0, - decoration: const BoxDecoration(), - child: Align( - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Text( - FFLocalizations.of(context) - .getText( - 'hjp5mzbd' /* Inicio da Visita */, - ), - style: FlutterFlowTheme.of( - context) + 0.0, 50.0, 0.0, 0.0), + child: Text( + FFLocalizations.of(context) + .getText( + 'i0jhuu3e' /* Clique para adicionar um visit... */, + ), + style: + FlutterFlowTheme.of(context) .bodyMedium .override( fontFamily: FlutterFlowTheme.of( context) .bodyMediumFamily, - fontSize: 14.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - ), - Expanded( - child: Container( - width: 100.0, - height: 40.0, - decoration: const BoxDecoration(), - child: SizedBox( - height: double.infinity, - child: Stack( - children: [ - Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB( - 10.0, - 0.0, - 24.0, - 0.0), - child: TextFormField( - controller: _model - .textController1, - focusNode: _model - .textFieldFocusNode1, - autofocus: false, - obscureText: false, - decoration: - InputDecoration( - isDense: true, - labelStyle: - FlutterFlowTheme.of( - context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .labelMediumFamily, - color: FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context).labelMediumFamily), - ), - hintText: - FFLocalizations.of( - context) - .getText( - 'ce6xryf4' /* Quando você inicia a visita? */, - ), - hintStyle: - FlutterFlowTheme.of( - context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .labelMediumFamily, - color: FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context).labelMediumFamily), - lineHeight: - 1.0, - ), - enabledBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .accent4, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - focusedBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .primary, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - errorBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - suffixIcon: Icon( - Icons.date_range, - color: FlutterFlowTheme - .of(context) - .accent1, - ), - ), - style: - FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - lineHeight: - 1.0, - ), - textAlign: - TextAlign.center, - validator: _model - .textController1Validator - .asValidator( - context), - ), - ), - Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB( - 10.0, - 0.0, - 24.0, - 0.0), - child: InkWell( - splashColor: - Colors.transparent, - focusColor: - Colors.transparent, - hoverColor: - Colors.transparent, - highlightColor: - Colors.transparent, - onTap: () async { - final datePicked1Date = - await showDatePicker( - context: context, - initialDate: - getCurrentTimestamp, - firstDate: - getCurrentTimestamp, - lastDate: - DateTime(2050), - builder: (context, - child) { - return wrapInMaterialDatePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: - FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: - FlutterFlowTheme.of(context).headlineLargeFamily, - fontSize: - 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight.w600, - useGoogleFonts: - GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: 24.0, - ); - }, - ); - - TimeOfDay? - datePicked1Time; - if (datePicked1Date != - null) { - datePicked1Time = - await showTimePicker( - context: context, - initialTime: TimeOfDay - .fromDateTime( - getCurrentTimestamp), - builder: (context, - child) { - return wrapInMaterialTimePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: - FlutterFlowTheme.of(context).headlineLargeFamily, - fontSize: - 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight.w600, - useGoogleFonts: - GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: - 24.0, - ); - }, - ); - } - - if (datePicked1Date != - null && - datePicked1Time != - null) { - safeSetState(() { - _model.datePicked1 = - DateTime( - datePicked1Date - .year, - datePicked1Date - .month, - datePicked1Date - .day, - datePicked1Time! - .hour, - datePicked1Time - .minute, - ); - }); - } - setState(() { - _model.textController1 - ?.text = - dateTimeFormat( - 'd/M/y H:mm:ss', - _model - .datePicked1, - locale: FFLocalizations - .of(context) - .languageCode, - ); - }); - }, - child: Container( - width: - double.infinity, - height: 55.0, - decoration: - BoxDecoration( - borderRadius: - BorderRadius - .circular( - 8.0), - ), - ), - ), - ), - ], - ), - ), - ), - ), - ], - ), - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 20.0, 0.0, 0.0, 0.0), - child: Container( - width: 100.0, - height: 40.0, - decoration: const BoxDecoration(), - child: Align( - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Text( - FFLocalizations.of(context) - .getText( - 'jwsbk0xu' /* Fim da Visita */, - ), - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - fontSize: 14.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - ), - Expanded( - child: Container( - width: 100.0, - height: 40.0, - decoration: const BoxDecoration(), - child: SizedBox( - height: double.infinity, - child: Stack( - children: [ - Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB( - 10.0, - 0.0, - 24.0, - 0.0), - child: TextFormField( - controller: _model - .textController2, - focusNode: _model - .textFieldFocusNode2, - autofocus: false, - obscureText: false, - decoration: - InputDecoration( - isDense: true, - labelStyle: - FlutterFlowTheme.of( - context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .labelMediumFamily, - color: FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context).labelMediumFamily), - ), - hintText: - FFLocalizations.of( - context) - .getText( - 'lyfe46f6' /* Quando a visita terminá? */, - ), - hintStyle: - FlutterFlowTheme.of( - context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .labelMediumFamily, - color: FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context).labelMediumFamily), - lineHeight: - 1.0, - ), - enabledBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .accent4, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - focusedBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .primary, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - errorBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: - BorderSide( - color: FlutterFlowTheme - .of(context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius - .circular( - 8.0), - ), - suffixIcon: Icon( - Icons.date_range, - color: FlutterFlowTheme - .of(context) - .accent1, - ), - ), - style: - FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - lineHeight: - 1.0, - ), - textAlign: - TextAlign.center, - validator: _model - .textController2Validator - .asValidator( - context), - ), - ), - Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB( - 10.0, - 0.0, - 24.0, - 0.0), - child: InkWell( - splashColor: - Colors.transparent, - focusColor: - Colors.transparent, - hoverColor: - Colors.transparent, - highlightColor: - Colors.transparent, - onTap: () async { - final datePicked2Date = - await showDatePicker( - context: context, - initialDate: - getCurrentTimestamp, - firstDate: - getCurrentTimestamp, - lastDate: - DateTime(2050), - builder: (context, - child) { - return wrapInMaterialDatePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: - FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: - FlutterFlowTheme.of(context).headlineLargeFamily, - fontSize: - 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight.w600, - useGoogleFonts: - GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: 24.0, - ); - }, - ); - - TimeOfDay? - datePicked2Time; - if (datePicked2Date != - null) { - datePicked2Time = - await showTimePicker( - context: context, - initialTime: TimeOfDay - .fromDateTime( - getCurrentTimestamp), - builder: (context, - child) { - return wrapInMaterialTimePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: - FlutterFlowTheme.of(context).headlineLargeFamily, - fontSize: - 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight.w600, - useGoogleFonts: - GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: - 24.0, - ); - }, - ); - } - - if (datePicked2Date != - null && - datePicked2Time != - null) { - safeSetState(() { - _model.datePicked2 = - DateTime( - datePicked2Date - .year, - datePicked2Date - .month, - datePicked2Date - .day, - datePicked2Time! - .hour, - datePicked2Time - .minute, - ); - }); - } - setState(() { - _model.textController2 - ?.text = - dateTimeFormat( - 'd/M/y H:mm:ss', - _model - .datePicked2, - locale: FFLocalizations - .of(context) - .languageCode, - ); - }); - }, - child: Container( - width: - double.infinity, - height: 39.0, - decoration: - BoxDecoration( - borderRadius: - BorderRadius - .circular( - 8.0), - ), - ), - ), - ), - ], - ), - ), - ), - ), - ], - ), - ].divide(const SizedBox(height: 10.0)), - ), - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 20.0, 24.0, 0.0, 24.0), - child: Text( - FFLocalizations.of(context).getText( - 'p81uol2v' /* Quais são os motivos da visita... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 20.0, 0.0, 0.0, 0.0), - child: Container( - width: 100.0, - height: 42.0, - decoration: const BoxDecoration(), - child: Align( - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Text( - FFLocalizations.of(context) - .getText( - 'bbauep0b' /* Motivo da Visita */, - ), - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - fontSize: 14.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 24.0, 0.0), - child: Container( - width: 100.0, - height: 40.0, - decoration: const BoxDecoration(), - child: FutureBuilder< - ApiCallResponse>( - future: PhpGroup.getDadosCall - .call( - devUUID: - FFAppState().devUUID, - userUUID: - FFAppState().userUUID, - cliUUID: - FFAppState().cliUUID, - atividade: 'getDados', - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: FlutterFlowTheme - .of(context) - .primary, - size: 50.0, - ), - ), - ); - } - final dropDownGetDadosResponse = - snapshot.data!; - return FlutterFlowDropDown< - String>( - controller: _model - .dropDownValueController1 ??= - FormFieldController< - String>( - _model.dropDownValue1 ??= - '', - ), - options: List< - String>.from( - PhpGroup.getDadosCall - .reasonsJsonList( - dropDownGetDadosResponse - .jsonBody, - )! - .map((e) => - e.toString()) - .toList()), - optionLabels: PhpGroup - .getDadosCall - .reasonsMotDescStrList( - dropDownGetDadosResponse - .jsonBody, - )!, - onChanged: (val) => - setState(() => _model - .dropDownValue1 = - val), - width: double.infinity, - height: double.infinity, - textStyle: - FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - hintText: - FFLocalizations.of( - context) - .getText( - 'x1ij847i' /* Escolha um motivo aqui */, - ), - icon: Icon( - Icons - .keyboard_arrow_down_rounded, color: FlutterFlowTheme.of( context) - .accent1, - size: 24.0, - ), - elevation: 2.0, - borderColor: - FlutterFlowTheme.of( - context) - .accent4, - borderWidth: 0.5, - borderRadius: 10.0, - margin: - const EdgeInsetsDirectional - .fromSTEB( - 16.0, - 0.0, - 16.0, - 0.0), - hidesUnderline: true, - isOverButton: true, - isSearchable: false, - isMultiSelect: false, - ); - }, - ), - ), - ), - ), - ], - ), - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 20.0, 0.0, 0.0, 0.0), - child: Container( - width: 100.0, - height: 42.0, - decoration: const BoxDecoration(), - child: Align( - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Text( - FFLocalizations.of(context) - .getText( - 'etzbm8l5' /* Nível de Acesso */, - ), - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - fontSize: 14.0, + .primaryText, letterSpacing: 0.0, useGoogleFonts: GoogleFonts .asMap() @@ -1641,290 +584,62 @@ class _ScheduleCompleteVisitPageWidgetState context) .bodyMediumFamily), ), - ), - ), ), ), - Expanded( - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 24.0, 0.0), - child: Container( - width: 100.0, - height: 40.0, - decoration: const BoxDecoration(), - child: FutureBuilder< - ApiCallResponse>( - future: PhpGroup.getDadosCall - .call( - devUUID: - FFAppState().devUUID, - userUUID: - FFAppState().userUUID, - cliUUID: - FFAppState().cliUUID, - atividade: 'getDados', - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: FlutterFlowTheme - .of(context) - .primary, - size: 50.0, - ), - ), - ); - } - final dropDownGetDadosResponse = - snapshot.data!; - return FlutterFlowDropDown< - String>( - controller: _model - .dropDownValueController2 ??= - FormFieldController< - String>( - _model.dropDownValue2 ??= - '', - ), - options: List< - String>.from( - PhpGroup.getDadosCall - .levelJsonList( - dropDownGetDadosResponse - .jsonBody, - )! - .map((e) => - e.toString()) - .toList()), - optionLabels: PhpGroup - .getDadosCall - .levelNACDescricaoStrList( - dropDownGetDadosResponse - .jsonBody, - )!, - onChanged: (val) => - setState(() => _model - .dropDownValue2 = - val), - width: double.infinity, - height: double.infinity, - textStyle: - FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - hintText: - FFLocalizations.of( - context) - .getText( - 'kmgv5j7x' /* Escolha um nível de acesso aqu... */, - ), - icon: Icon( - Icons - .keyboard_arrow_down_rounded, - color: - FlutterFlowTheme.of( - context) - .accent1, - size: 24.0, - ), - elevation: 2.0, - borderColor: - FlutterFlowTheme.of( - context) - .accent4, - borderWidth: 0.5, - borderRadius: 10.0, - margin: - const EdgeInsetsDirectional - .fromSTEB( - 16.0, - 0.0, - 16.0, - 0.0), - hidesUnderline: true, - isOverButton: true, - isSearchable: false, - isMultiSelect: false, - ); - }, - ), - ), - ), + ), + ], + ), + Divider( + thickness: 0.5, + color: + FlutterFlowTheme.of(context).accent1, + ), + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 20.0, 30.0, 0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'z4ry3tge' /* Qual o período de validade da ... */, ), - ], + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), ), - ].divide(const SizedBox(height: 10.0)), - ), - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( + ), + Stack( + children: [ + Padding( padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 24.0, 0.0, 24.0), - child: Text( - FFLocalizations.of(context).getText( - 'mddp33o0' /* Visita se encerra após o prime... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 30.0, 0.0, 30.0, 20.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Flexible( - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 130.0, 0.0), - child: Text( - FFLocalizations.of(context) - .getText( - '68j9gw4h' /* Visita única */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Switch.adaptive( - value: _model.switchValue!, - onChanged: (newValue) async { - setState(() => _model - .switchValue = newValue); - }, - activeColor: - FlutterFlowTheme.of(context) - .success, - activeTrackColor: - FlutterFlowTheme.of(context) - .customColor4, - inactiveTrackColor: - FlutterFlowTheme.of(context) - .customColor4, - inactiveThumbColor: - FlutterFlowTheme.of(context) - .error, - ), - ], - ), - ), - ], - ), - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 20.0, 0.0, 0.0, 24.0), - child: Text( - FFLocalizations.of(context).getText( - '9rudpkq7' /* Você tem alguma observação sob... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 24.0, 0.0, 24.0, 0.0), - child: SizedBox( - width: double.infinity, + 24.0, 50.0, 24.0, 0.0), child: TextFormField( - controller: _model.textController3, + controller: _model.textController1, focusNode: - _model.textFieldFocusNode3, + _model.textFieldFocusNode1, autofocus: false, - textInputAction: - TextInputAction.next, obscureText: false, decoration: InputDecoration( - isDense: true, labelText: FFLocalizations.of(context) .getText( - '4rgpxrfe' /* Observações da Visita */, + '9mg9nv2j' /* Ínicio da Visita */, ), labelStyle: FlutterFlowTheme.of(context) @@ -1949,7 +664,7 @@ class _ScheduleCompleteVisitPageWidgetState hintText: FFLocalizations.of(context) .getText( - '7knytis2' /* Escreva as suas observações aq... */, + 'y5s85khj' /* Quando a visitas se inicia? */, ), hintStyle: FlutterFlowTheme.of(context) @@ -1975,11 +690,11 @@ class _ScheduleCompleteVisitPageWidgetState borderSide: BorderSide( color: FlutterFlowTheme.of( context) - .accent4, + .accent1, width: 0.5, ), borderRadius: - BorderRadius.circular(10.0), + BorderRadius.circular(8.0), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( @@ -1989,7 +704,7 @@ class _ScheduleCompleteVisitPageWidgetState width: 0.5, ), borderRadius: - BorderRadius.circular(10.0), + BorderRadius.circular(8.0), ), errorBorder: OutlineInputBorder( borderSide: BorderSide( @@ -1999,7 +714,7 @@ class _ScheduleCompleteVisitPageWidgetState width: 0.5, ), borderRadius: - BorderRadius.circular(10.0), + BorderRadius.circular(8.0), ), focusedErrorBorder: OutlineInputBorder( @@ -2010,10 +725,10 @@ class _ScheduleCompleteVisitPageWidgetState width: 0.5, ), borderRadius: - BorderRadius.circular(10.0), + BorderRadius.circular(8.0), ), suffixIcon: Icon( - Icons.text_fields, + Icons.hourglass_top, color: FlutterFlowTheme.of(context) .accent1, @@ -2026,9 +741,6 @@ class _ScheduleCompleteVisitPageWidgetState FlutterFlowTheme.of( context) .bodyMediumFamily, - color: FlutterFlowTheme.of( - context) - .primaryText, letterSpacing: 0.0, useGoogleFonts: GoogleFonts .asMap() @@ -2037,500 +749,1597 @@ class _ScheduleCompleteVisitPageWidgetState context) .bodyMediumFamily), ), - textAlign: TextAlign.start, - maxLines: null, + textAlign: TextAlign.center, validator: _model - .textController3Validator + .textController1Validator .asValidator(context), ), ), + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 24.0, 50.0, 24.0, 0.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + final datePicked1Date = + await showDatePicker( + context: context, + initialDate: + getCurrentTimestamp, + firstDate: getCurrentTimestamp, + lastDate: DateTime(2050), + builder: (context, child) { + return wrapInMaterialDatePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of( + context) + .info, + headerTextStyle: + FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .headlineLargeFamily, + fontSize: 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of( + context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of( + context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + iconSize: 24.0, + ); + }, + ); + + TimeOfDay? datePicked1Time; + if (datePicked1Date != null) { + datePicked1Time = + await showTimePicker( + context: context, + initialTime: + TimeOfDay.fromDateTime( + getCurrentTimestamp), + builder: (context, child) { + return wrapInMaterialTimePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of( + context) + .info, + headerTextStyle: + FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: FlutterFlowTheme.of( + context) + .headlineLargeFamily, + fontSize: 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of( + context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of( + context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + iconSize: 24.0, + ); + }, + ); + } + + if (datePicked1Date != null && + datePicked1Time != null) { + safeSetState(() { + _model.datePicked1 = DateTime( + datePicked1Date.year, + datePicked1Date.month, + datePicked1Date.day, + datePicked1Time!.hour, + datePicked1Time.minute, + ); + }); + } + setState(() { + _model.textController1?.text = + dateTimeFormat( + 'd/M/y H:mm:ss', + _model.datePicked1, + locale: FFLocalizations.of( + context) + .languageCode, + ); + }); + }, + child: Container( + width: double.infinity, + height: 50.0, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(8.0), + ), + ), + ), + ), + ], + ), + Stack( + children: [ + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 24.0, 50.0, 24.0, 0.0), + child: TextFormField( + controller: _model.textController2, + focusNode: + _model.textFieldFocusNode2, + autofocus: false, + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '4o0cbb70' /* Término da Visita */, + ), + labelStyle: + FlutterFlowTheme.of(context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .labelMediumFamily, + color: + FlutterFlowTheme.of( + context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .labelMediumFamily), + ), + hintText: + FFLocalizations.of(context) + .getText( + 'bhmgddc4' /* Quando a visita terminá? */, + ), + hintStyle: + FlutterFlowTheme.of(context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .labelMediumFamily, + color: + FlutterFlowTheme.of( + context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .labelMediumFamily), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .accent1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(8.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .primary, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(8.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(8.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(8.0), + ), + suffixIcon: Icon( + Icons.hourglass_bottom, + color: + FlutterFlowTheme.of(context) + .accent1, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + textAlign: TextAlign.center, + validator: _model + .textController2Validator + .asValidator(context), + ), + ), + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 24.0, 50.0, 24.0, 20.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + final datePicked2Date = + await showDatePicker( + context: context, + initialDate: + getCurrentTimestamp, + firstDate: getCurrentTimestamp, + lastDate: DateTime(2050), + builder: (context, child) { + return wrapInMaterialDatePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of( + context) + .info, + headerTextStyle: + FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .headlineLargeFamily, + fontSize: 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of( + context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of( + context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + iconSize: 24.0, + ); + }, + ); + + TimeOfDay? datePicked2Time; + if (datePicked2Date != null) { + datePicked2Time = + await showTimePicker( + context: context, + initialTime: + TimeOfDay.fromDateTime( + getCurrentTimestamp), + builder: (context, child) { + return wrapInMaterialTimePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of( + context) + .info, + headerTextStyle: + FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: FlutterFlowTheme.of( + context) + .headlineLargeFamily, + fontSize: 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of( + context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of( + context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of( + context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of( + context) + .primaryText, + iconSize: 24.0, + ); + }, + ); + } + + if (datePicked2Date != null && + datePicked2Time != null) { + safeSetState(() { + _model.datePicked2 = DateTime( + datePicked2Date.year, + datePicked2Date.month, + datePicked2Date.day, + datePicked2Time!.hour, + datePicked2Time.minute, + ); + }); + } + setState(() { + _model.textController2?.text = + dateTimeFormat( + 'd/M/y H:mm:ss', + _model.datePicked2, + locale: FFLocalizations.of( + context) + .languageCode, + ); + }); + }, + child: Container( + width: double.infinity, + height: 50.0, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(8.0), + ), + ), + ), + ), + ], + ), + Divider( + thickness: 0.5, + color: + FlutterFlowTheme.of(context).accent1, + ), + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 20.0, 30.0, 0.0, 30.0), + child: Text( + FFLocalizations.of(context).getText( + 'p81uol2v' /* Quais são os motivos da visita... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), ), - ], - ), - Container( - width: 100.0, - height: 54.0, - decoration: const BoxDecoration(), - ), - ], + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 30.0, 0.0, 30.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.end, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 20.0, 0.0, 0.0), + child: FutureBuilder< + ApiCallResponse>( + future: + PhpGroup.getDadosCall.call( + devUUID: FFAppState().devUUID, + userUUID: + FFAppState().userUUID, + cliUUID: FFAppState().cliUUID, + atividade: 'getDados', + ), + builder: (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: SpinKitCircle( + color: FlutterFlowTheme + .of(context) + .primary, + size: 50.0, + ), + ), + ); + } + final dropDownGetDadosResponse = + snapshot.data!; + return FlutterFlowDropDown< + String>( + controller: _model + .dropDownValueController1 ??= + FormFieldController< + String>( + _model.dropDownValue1 ??= + '', + ), + options: List.from( + PhpGroup.getDadosCall + .reasonsJsonList( + dropDownGetDadosResponse + .jsonBody, + )! + .map((e) => + e.toString()) + .toList()), + optionLabels: PhpGroup + .getDadosCall + .reasonsMotDescStrList( + dropDownGetDadosResponse + .jsonBody, + )!, + onChanged: (val) => + setState(() => _model + .dropDownValue1 = + val), + width: 300.0, + height: 56.0, + textStyle: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + hintText: + FFLocalizations.of( + context) + .getText( + 'x1ij847i' /* Escolha um motivo aqui */, + ), + icon: Icon( + Icons + .keyboard_arrow_down_rounded, + color: + FlutterFlowTheme.of( + context) + .accent1, + size: 24.0, + ), + fillColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + elevation: 2.0, + borderColor: + FlutterFlowTheme.of( + context) + .accent1, + borderWidth: 0.5, + borderRadius: 10.0, + margin: + const EdgeInsetsDirectional + .fromSTEB(16.0, 4.0, + 16.0, 4.0), + hidesUnderline: true, + isOverButton: true, + isSearchable: false, + isMultiSelect: false, + ); + }, + ), + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 30.0, 0.0, 30.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.end, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 20.0, 0.0, 20.0), + child: FutureBuilder< + ApiCallResponse>( + future: + PhpGroup.getDadosCall.call( + devUUID: FFAppState().devUUID, + userUUID: + FFAppState().userUUID, + cliUUID: FFAppState().cliUUID, + atividade: 'getDados', + ), + builder: (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: SpinKitCircle( + color: FlutterFlowTheme + .of(context) + .primary, + size: 50.0, + ), + ), + ); + } + final dropDownGetDadosResponse = + snapshot.data!; + return FlutterFlowDropDown< + String>( + controller: _model + .dropDownValueController2 ??= + FormFieldController< + String>( + _model.dropDownValue2 ??= + '', + ), + options: List.from( + PhpGroup.getDadosCall + .levelJsonList( + dropDownGetDadosResponse + .jsonBody, + )! + .map((e) => + e.toString()) + .toList()), + optionLabels: PhpGroup + .getDadosCall + .levelNACDescricaoStrList( + dropDownGetDadosResponse + .jsonBody, + )!, + onChanged: (val) => + setState(() => _model + .dropDownValue2 = + val), + width: 300.0, + height: 56.0, + textStyle: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + hintText: + FFLocalizations.of( + context) + .getText( + 'kmgv5j7x' /* Escolha um nível de acesso aqu... */, + ), + icon: Icon( + Icons + .keyboard_arrow_down_rounded, + color: + FlutterFlowTheme.of( + context) + .accent1, + size: 24.0, + ), + fillColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + elevation: 2.0, + borderColor: + FlutterFlowTheme.of( + context) + .accent1, + borderWidth: 0.5, + borderRadius: 10.0, + margin: + const EdgeInsetsDirectional + .fromSTEB(16.0, 4.0, + 16.0, 4.0), + hidesUnderline: true, + isOverButton: true, + isSearchable: false, + isMultiSelect: false, + ); + }, + ), + ), + ), + ], + ), + ), + Divider( + thickness: 0.5, + color: + FlutterFlowTheme.of(context).accent1, + ), + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 20.0, 30.0, 0.0, 30.0), + child: Text( + FFLocalizations.of(context).getText( + 'mddp33o0' /* Visita se encerra após o prime... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 30.0, 0.0, 30.0, 20.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Flexible( + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 130.0, 0.0), + child: Text( + FFLocalizations.of(context) + .getText( + '68j9gw4h' /* Visita única */, + ), + textAlign: TextAlign.start, + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Switch.adaptive( + value: _model.switchValue!, + onChanged: (newValue) async { + setState(() => _model + .switchValue = newValue); + }, + activeTrackColor: + FlutterFlowTheme.of(context) + .primary, + inactiveTrackColor: + FlutterFlowTheme.of(context) + .primaryText, + inactiveThumbColor: + FlutterFlowTheme.of(context) + .alternate, + ), + ], + ), + ), + Divider( + thickness: 0.5, + color: + FlutterFlowTheme.of(context).accent1, + ), + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 20.0, 30.0, 0.0, 30.0), + child: Text( + FFLocalizations.of(context).getText( + '9rudpkq7' /* Você tem alguma observação sob... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 24.0, 0.0, 24.0, 20.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model.textController3, + focusNode: _model.textFieldFocusNode3, + autofocus: false, + textInputAction: TextInputAction.next, + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '4rgpxrfe' /* Observações da Visita */, + ), + labelStyle: + FlutterFlowTheme.of(context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .labelMediumFamily, + color: + FlutterFlowTheme.of( + context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .labelMediumFamily), + ), + hintText: + FFLocalizations.of(context) + .getText( + '7knytis2' /* Escreva as suas observações aq... */, + ), + hintStyle: + FlutterFlowTheme.of(context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .labelMediumFamily, + color: + FlutterFlowTheme.of( + context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .labelMediumFamily), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of(context) + .accent1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(10.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of(context) + .primary, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(10.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of(context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(10.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of(context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(10.0), + ), + suffixIcon: Icon( + Icons.format_color_text, + color: + FlutterFlowTheme.of(context) + .accent1, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: + FlutterFlowTheme.of(context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + textAlign: TextAlign.start, + maxLines: null, + validator: _model + .textController3Validator + .asValidator(context), + ), + ), + ), + Container( + width: 100.0, + height: 54.0, + decoration: const BoxDecoration(), + ), + ], + ), + ), + ), + ], + ), + InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + if ((_model.textController1.text != '') && + (_model.textController2.text != '') && + (_model.dropDownValue1 != null && + _model.dropDownValue1 != '') && + (_model.dropDownValue2 != null && + _model.dropDownValue2 != '')) { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: VisitDetailsModalWidget( + visitStartDateStr: + _model.textController1.text, + visitEndDateStr: + _model.textController2.text, + visitReasonStr: _model.dropDownValue1, + visitLevelStr: _model.dropDownValue2, + visitTempStr: _model.switchValue == true + ? 'Sim' + : 'Não', + visitObsStr: + _model.textController3.text, + visitorStrList: _model.visitorStrList, + visitorJsonList: _model.visitorJsonList, + updateToggleIdx: () async {}, + repeatVisitSchedule: () async {}, + ), + ), + ); + }, + ).then((value) => safeSetState(() {})); + } else { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const ThrowExceptionWidget( + msg: 'Campos obrigatórios imcompletos.', + ), + ), + ); + }, + ).then((value) => safeSetState(() {})); + } + }, + child: Container( + width: double.infinity, + height: 40.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(0.0), + bottomRight: Radius.circular(0.0), + topLeft: Radius.circular(0.0), + topRight: Radius.circular(0.0), + ), + ), + alignment: const AlignmentDirectional(0.0, 1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Icon( + Icons.save_alt, + color: FlutterFlowTheme.of(context).info, + size: 24.0, + ), + ), + ), + ), + ], + ); + } else { + return Container( + width: double.infinity, + height: 900.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 20.0, + borderWidth: 1.0, + buttonSize: 40.0, + icon: Icon( + Icons.settings_sharp, + color: FlutterFlowTheme.of(context).primary, + size: 24.0, + ), + onPressed: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus( + _model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: + MediaQuery.viewInsetsOf(context), + child: const OptModalWidget(), + ), + ); + }, + ).then((value) => safeSetState(() {})); + }, + ), + ], + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(14.0), + child: FutureBuilder( + future: PhpGroup.getVisitsCall.call( + devUUID: FFAppState().devUUID, + userUUID: FFAppState().userUUID, + cliID: FFAppState().cliUUID, + atividade: 'getVisitas', + ), + builder: (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: SpinKitCircle( + color: FlutterFlowTheme.of(context) + .primary, + size: 50.0, + ), + ), + ); + } + final gridViewGetVisitsResponse = + snapshot.data!; + return Builder( + builder: (context) { + final visitHistory = + (PhpGroup.getVisitsCall + .visitasList( + gridViewGetVisitsResponse + .jsonBody, + ) + ?.toList() ?? + []) + .take(10) + .toList(); + return GridView.builder( + padding: EdgeInsets.zero, + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 10.0, + mainAxisSpacing: 10.0, + childAspectRatio: 1.0, + ), + scrollDirection: Axis.vertical, + itemCount: visitHistory.length, + itemBuilder: + (context, visitHistoryIndex) { + final visitHistoryItem = + visitHistory[visitHistoryIndex]; + return Container( + width: double.infinity, + height: double.infinity, + decoration: const BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: + Radius.circular(50.0), + bottomRight: + Radius.circular(50.0), + topLeft: Radius.circular(25.0), + topRight: Radius.circular(25.0), + ), + shape: BoxShape.rectangle, + ), + child: Stack( + children: [ + Container( + width: double.infinity, + height: double.infinity, + decoration: BoxDecoration( + color: + valueOrDefault( + () { + if (functions.jsonToStr( + getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"A\"') { + return FlutterFlowTheme + .of(context) + .success; + } else if (functions + .jsonToStr( + getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"C\"') { + return FlutterFlowTheme + .of(context) + .error; + } else if (functions + .jsonToStr( + getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"I\"') { + return FlutterFlowTheme + .of(context) + .warning; + } else { + return FlutterFlowTheme + .of(context) + .primary; + } + }(), + FlutterFlowTheme.of( + context) + .primary, + ), + borderRadius: + const BorderRadius.only( + bottomLeft: + Radius.circular(10.0), + bottomRight: + Radius.circular(10.0), + topLeft: + Radius.circular(25.0), + topRight: + Radius.circular(25.0), + ), + shape: BoxShape.rectangle, + ), + ), + InkWell( + splashColor: + Colors.transparent, + focusColor: + Colors.transparent, + hoverColor: + Colors.transparent, + highlightColor: + Colors.transparent, + onTap: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: + Colors.transparent, + enableDrag: false, + useSafeArea: true, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode + .canRequestFocus + ? FocusScope.of( + context) + .requestFocus( + _model + .unfocusNode) + : FocusScope.of( + context) + .unfocus(), + child: Padding( + padding: MediaQuery + .viewInsetsOf( + context), + child: + VisitDetailsModalWidget( + visitStatusStr: + getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS ''', + ).toString(), + visitStartDateStr: + getJsonField( + visitHistoryItem, + r'''$.VAW_DTINICIO''', + ).toString(), + visitEndDateStr: + getJsonField( + visitHistoryItem, + r'''$.VAW_DTFIM''', + ).toString(), + visitReasonStr: + getJsonField( + visitHistoryItem, + r'''$.MOT_DESCRICAO''', + ).toString(), + visitLevelStr: + getJsonField( + visitHistoryItem, + r'''$.NAC_DESCRICAO''', + ).toString(), + visitTempStr: + getJsonField( + visitHistoryItem, + r'''$.VTE_UNICA ''', + ).toString(), + visitObsStr: + getJsonField( + visitHistoryItem, + r'''$.VAW_OBS''', + ).toString(), + visitorImgPath: + valueOrDefault< + String>( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitHistoryItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + visitorStrList: + getJsonField( + visitHistoryItem, + r'''$.VTE_DOCUMENTO''', + ).toString(), + visitIdStr: + getJsonField( + visitHistoryItem, + r'''$.VAW_ID''', + ).toString(), + visitorJsonList: PhpGroup + .getVisitsCall + .visitasList( + gridViewGetVisitsResponse + .jsonBody, + ), + updateToggleIdx: + () async { + _model.toggleIdx = + true; + setState(() {}); + }, + repeatVisitSchedule: + () async {}, + ), + ), + ); + }, + ).then((value) => + safeSetState(() {})); + }, + child: ClipRRect( + borderRadius: + const BorderRadius.only( + bottomLeft: + Radius.circular(25.0), + bottomRight: + Radius.circular(25.0), + topLeft: + Radius.circular(25.0), + topRight: + Radius.circular(25.0), + ), + child: CachedNetworkImage( + fadeInDuration: const Duration( + milliseconds: 500), + fadeOutDuration: const Duration( + milliseconds: 500), + imageUrl: valueOrDefault< + String>( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitHistoryItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + width: double.infinity, + height: double.infinity, + fit: BoxFit.cover, + ), + ), + ), + Align( + alignment: + const AlignmentDirectional( + 0.0, -1.0), + child: Container( + width: 200.0, + height: 20.0, + decoration: BoxDecoration( + color: + valueOrDefault( + () { + if (functions.jsonToStr( + getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"A\"') { + return FlutterFlowTheme + .of(context) + .success; + } else if (functions + .jsonToStr( + getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"C\"') { + return FlutterFlowTheme + .of(context) + .error; + } else if (functions + .jsonToStr( + getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"I\"') { + return FlutterFlowTheme + .of(context) + .warning; + } else { + return FlutterFlowTheme + .of(context) + .primary; + } + }(), + FlutterFlowTheme.of( + context) + .primary, + ), + borderRadius: + const BorderRadius.only( + bottomLeft: + Radius.circular( + 0.0), + bottomRight: + Radius.circular( + 0.0), + topLeft: + Radius.circular( + 25.0), + topRight: + Radius.circular( + 25.0), + ), + ), + alignment: + const AlignmentDirectional( + 0.0, 0.0), + child: Text( + getJsonField( + visitHistoryItem, + r'''$.VTE_NOME''', + ).toString(), + textAlign: + TextAlign.center, + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + color: FlutterFlowTheme.of( + context) + .info, + fontSize: 12.0, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ], + ), + ); + }, + ); + }, + ); + }, ), ), ), ], ), - InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - if ((_model.textController1.text != '') && - (_model.textController2.text != '') && - (_model.dropDownValue1 != null && - _model.dropDownValue1 != '') && - (_model.dropDownValue2 != null && - _model.dropDownValue2 != '')) { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => - _model.unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf(context), - child: VisitDetailsModalWidget( - visitStartDateStr: - _model.textController1.text, - visitEndDateStr: - _model.textController2.text, - visitReasonStr: _model.dropDownValue1, - visitLevelStr: _model.dropDownValue2, - visitTempStr: _model.switchValue == true - ? 'Sim' - : 'Não', - visitObsStr: _model.textController3.text, - visitorStrList: _model.visitorStrList, - visitorJsonList: _model.visitorJsonList, - updateToggleIdx: () async {}, - repeatVisitSchedule: () async {}, - ), - ), - ); - }, - ).then((value) => safeSetState(() {})); - } else { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => - _model.unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const ThrowExceptionWidget( - msg: 'Campos obrigatórios imcompletos.', - ), - ), - ); - }, - ).then((value) => safeSetState(() {})); - } - }, - child: Container( - width: MediaQuery.sizeOf(context).width * 0.5, - height: 40.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primary, - borderRadius: BorderRadius.circular(10.0), - ), - alignment: const AlignmentDirectional(0.0, 1.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Icon( - Icons.save_alt, - color: FlutterFlowTheme.of(context).info, - size: 24.0, - ), - ), - ), - ), - ].addToEnd(const SizedBox(height: 30.0)), - ), - if (valueOrDefault( - _model.toggleIndexValue == false, - true, - )) - Container( - width: double.infinity, - height: 900.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - FlutterFlowIconButton( - borderColor: Colors.transparent, - borderRadius: 20.0, - borderWidth: 1.0, - buttonSize: 40.0, - icon: Icon( - Icons.settings_sharp, - color: FlutterFlowTheme.of(context).primary, - size: 24.0, - ), - onPressed: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: - MediaQuery.viewInsetsOf(context), - child: const OptModalWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - ), - ], - ), - FutureBuilder( - future: PhpGroup.getVisitsCall.call( - devUUID: FFAppState().devUUID, - userUUID: FFAppState().userUUID, - cliID: FFAppState().cliUUID, - atividade: 'getVisitas', - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: FlutterFlowTheme.of(context).primary, - size: 50.0, - ), - ), - ); - } - final wrapGetVisitsResponse = snapshot.data!; - return Builder( - builder: (context) { - final visitaWrap = PhpGroup.getVisitsCall - .visitasList( - wrapGetVisitsResponse.jsonBody, - ) - ?.toList() ?? - []; - return Wrap( - spacing: 2.0, - runSpacing: 1.0, - alignment: WrapAlignment.start, - crossAxisAlignment: WrapCrossAlignment.start, - direction: Axis.horizontal, - runAlignment: WrapAlignment.start, - verticalDirection: VerticalDirection.down, - clipBehavior: Clip.none, - children: List.generate(visitaWrap.length, - (visitaWrapIndex) { - final visitaWrapItem = - visitaWrap[visitaWrapIndex]; - return Card( - clipBehavior: Clip.antiAliasWithSaveLayer, - color: FlutterFlowTheme.of(context) - .secondaryBackground, - elevation: 5.0, - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(8.0), - ), - child: Container( - width: 350.0, - height: 115.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .secondaryBackground, - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Container( - width: 100.0, - height: 100.0, - decoration: const BoxDecoration(), - child: Column( - mainAxisSize: - MainAxisSize.max, - children: [ - Row( - mainAxisSize: - MainAxisSize.max, - children: [ - Text( - FFLocalizations.of( - context) - .getText( - 'd34nuw4w' /* Visitante: */, - ), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - Align( - alignment: - const AlignmentDirectional( - -1.0, -1.0), - child: Text( - FFLocalizations.of( - context) - .getText( - 'y8geteyc' /* Lucas Martin Mota */, - ), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ), - ].addToStart(const SizedBox( - width: 10.0)), - ), - Row( - mainAxisSize: - MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Text( - FFLocalizations.of( - context) - .getText( - 'gxdykms1' /* Morador: */, - ), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - Text( - FFLocalizations.of( - context) - .getText( - 'ue7wkm9r' /* Lucas Martin Mota */, - ), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ].addToStart(const SizedBox( - width: 10.0)), - ), - Row( - mainAxisSize: - MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Text( - FFLocalizations.of( - context) - .getText( - 'zs8s0wd3' /* Validade: */, - ), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - Text( - FFLocalizations.of( - context) - .getText( - 'z7fset9r' /* 16/10/2024 a 16/10/2024 */, - ), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of( - context) - .bodyMediumFamily, - fontSize: 13.0, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ].addToStart(const SizedBox( - width: 10.0)), - ), - Align( - alignment: - const AlignmentDirectional( - -1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB( - 10.0, - 0.0, - 0.0, - 0.0), - child: Container( - width: 200.0, - height: 27.0, - decoration: - BoxDecoration( - color: FlutterFlowTheme - .of(context) - .primary, - borderRadius: - BorderRadius - .circular( - 5.0), - ), - child: Align( - alignment: - const AlignmentDirectional( - 0.0, 0.0), - child: Text( - FFLocalizations.of( - context) - .getText( - 'fcb5avae' /* Agendamento Ativo */, - ), - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - color: FlutterFlowTheme.of( - context) - .info, - letterSpacing: - 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context).bodyMediumFamily), - ), - ), - ), - ), - ), - ), - ].divide( - const SizedBox(height: 2.0)), - ), - ), - ), - ClipRRect( - borderRadius: - BorderRadius.circular(0.0), - child: Image.network( - 'https://images.unsplash.com/photo-1599566150163-29194dcaad36?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w0NTYyMDF8MHwxfHNlYXJjaHwxNHx8cGVyc29ufGVufDB8fHx8MTcxNzc4MDk1Mnww&ixlib=rb-4.0.3&q=80&w=1080', - fit: BoxFit.cover, - ), - ), - ], - ), - ), - ); - }), - ); - }, - ); - }, - ), - ], - ), - ), - ], - ), + ); + } + }, + ), + ], ), ), ), diff --git a/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart index f9c25f93..90e61b98 100644 --- a/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart +++ b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart @@ -3,8 +3,6 @@ import '/application_components/organism_components/bottom_arrow_linked_locals_c import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/flutter_flow_widgets.dart'; -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; @@ -191,92 +189,93 @@ class _ScheduleProvisionalVisitPageWidgetState ), ), ), - Stack( - children: [ - FFButtonWidget( - onPressed: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus( - _model.unfocusNode) - : FocusScope.of(context) - .unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf( - context), - child: - const BottomArrowLinkedLocalsComponentWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - text: FFAppState().local, - options: FFButtonOptions( - width: 320.0, - height: 51.0, - padding: const EdgeInsetsDirectional.fromSTEB( - 24.0, 0.0, 24.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - color: FlutterFlowTheme.of(context) - .primaryBackground, - textStyle: FlutterFlowTheme.of(context) - .titleSmall - .override( - fontFamily: - FlutterFlowTheme.of(context) - .titleSmallFamily, - color: FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts.asMap() - .containsKey( - FlutterFlowTheme.of(context) - .titleSmallFamily), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 25.0, 0.0, 25.0, 0.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus( + _model.unfocusNode) + : FocusScope.of(context) + .unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf( + context), + child: + const BottomArrowLinkedLocalsComponentWidget(), ), - borderSide: BorderSide( + ); + }, + ).then((value) => safeSetState(() {})); + }, + child: Container( + width: double.infinity, + height: 51.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .secondaryBackground, + borderRadius: BorderRadius.circular(24.0), + border: Border.all( color: FlutterFlowTheme.of(context) .primaryText, width: 0.3, ), - borderRadius: BorderRadius.circular(24.0), ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 10.0, 0.0, 0.0), - child: Container( - width: 35.0, - height: 35.0, - clipBehavior: Clip.antiAlias, - decoration: const BoxDecoration( - shape: BoxShape.circle, - ), - child: CachedNetworkImage( - fadeInDuration: - const Duration(milliseconds: 100), - fadeOutDuration: - const Duration(milliseconds: 100), - imageUrl: valueOrDefault( - 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Container( + width: 35.0, + height: 35.0, + clipBehavior: Clip.antiAlias, + decoration: const BoxDecoration( + shape: BoxShape.circle, + ), + child: Image.network( + valueOrDefault( + 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + fit: BoxFit.cover, + ), ), - fit: BoxFit.cover, - ), + Text( + FFAppState().local, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ], ), ), - ], + ), ), ].addToEnd(const SizedBox(height: 20.0)), ), diff --git a/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_model.dart b/lib/application_pages/welcome_page/welcome_page_model.dart similarity index 100% rename from lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_model.dart rename to lib/application_pages/welcome_page/welcome_page_model.dart diff --git a/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart b/lib/application_pages/welcome_page/welcome_page_widget.dart similarity index 97% rename from lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart rename to lib/application_pages/welcome_page/welcome_page_widget.dart index 1ec859fe..9484ebf9 100644 --- a/lib/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart +++ b/lib/application_pages/welcome_page/welcome_page_widget.dart @@ -36,13 +36,16 @@ class _WelcomePageWidgetState extends State if (FFAppState().isLogged == true) { context.pushNamed( 'homePage', - extra: { - kTransitionInfoKey: const TransitionInfo( - hasTransition: true, - transitionType: PageTransitionType.fade, - duration: Duration(milliseconds: 0), + queryParameters: { + 'userUUID': serializeParam( + FFAppState().userUUID, + ParamType.String, ), - }, + 'devUUID': serializeParam( + FFAppState().devUUID, + ParamType.String, + ), + }.withoutNulls, ); } else { if (isAndroid == true) { @@ -144,7 +147,7 @@ class _WelcomePageWidgetState extends State children: [ Text( FFLocalizations.of(context).getText( - 'xflxvs9y' /* UMA EXPERIÊCIA COMPLETA */, + '3pl41wkq' /* UMA EXPERIÊCIA COMPLETA */, ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) @@ -164,7 +167,7 @@ class _WelcomePageWidgetState extends State alignment: const AlignmentDirectional(0.0, -1.0), child: Text( FFLocalizations.of(context).getText( - '5a86wzd1' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, + '13nhoxpg' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) @@ -262,7 +265,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of(context) .getText( - '65nuva6j' /* Entrar */, + 'zt5uc5g5' /* Entrar */, ), options: FFButtonOptions( width: double.infinity, @@ -320,7 +323,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of(context) .getText( - '9u6oaw01' /* Cadastrar */, + 'jteakpo0' /* Cadastrar */, ), options: FFButtonOptions( width: double.infinity, @@ -395,7 +398,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of( context) .getText( - 'd1qem43w' /* Entrar */, + 'qoc86gvo' /* Entrar */, ), options: FFButtonOptions( width: double.infinity, @@ -456,7 +459,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of( context) .getText( - 'bhowzv2u' /* Cadastrar */, + 'p5tgmj0c' /* Cadastrar */, ), options: FFButtonOptions( width: double.infinity, diff --git a/lib/backend/api_requests/api_calls.dart b/lib/backend/api_requests/api_calls.dart index 7204e476..33deadb3 100644 --- a/lib/backend/api_requests/api_calls.dart +++ b/lib/backend/api_requests/api_calls.dart @@ -21,7 +21,6 @@ class PhpGroup { static PostScheduleVisitorCall postScheduleVisitorCall = PostScheduleVisitorCall(); static PostScheduleVisitCall postScheduleVisitCall = PostScheduleVisitCall(); - static DebugCallCall debugCallCall = DebugCallCall(); static GetScheduleVisitCall getScheduleVisitCall = GetScheduleVisitCall(); static GetDadosCall getDadosCall = GetDadosCall(); static GetVisitorByDocCall getVisitorByDocCall = GetVisitorByDocCall(); @@ -30,6 +29,7 @@ class PhpGroup { PostProvVisitSchedulingCall(); static GetVisitsCall getVisitsCall = GetVisitsCall(); static DeleteVisitCall deleteVisitCall = DeleteVisitCall(); + static DebugCall debugCall = DebugCall(); } class LoginCall { @@ -341,7 +341,7 @@ class PostScheduleVisitCall { Future call({ String? devUUID = '', String? userUUID = '', - String? cliID = '', + String? cliUUID = '', String? atividade = '', String? devDesc = '', String? idVisitante = '', @@ -364,64 +364,7 @@ class PostScheduleVisitCall { params: { 'devUUID': devUUID, 'userUUID': userUUID, - 'cliID': cliID, - 'atividade': atividade, - 'idVisitante': idVisitante, - 'dtInicio': dtInicio, - 'dtFim': dtFim, - 'unica': unica, - 'idMotivo': idMotivo, - 'idNAC': idNAC, - 'obs': obs, - 'DevDesc': devDesc, - }, - bodyType: BodyType.X_WWW_FORM_URL_ENCODED, - returnBody: true, - encodeBodyUtf8: false, - decodeUtf8: false, - cache: false, - alwaysAllowBody: false, - ); - } - - bool? error(dynamic response) => castToType(getJsonField( - response, - r'''$.error''', - )); - String? errorMsg(dynamic response) => castToType(getJsonField( - response, - r'''$.error_msg''', - )); -} - -class DebugCallCall { - Future call({ - String? devUUID = '', - String? userUUID = '', - String? cliID = '', - String? atividade = '', - String? devDesc = '', - String? idVisitante = '', - String? dtInicio = '', - String? dtFim = '', - String? unica = '', - int? idMotivo, - int? idNAC, - String? obs = '', - }) async { - final baseUrl = PhpGroup.getBaseUrl(); - - return ApiManager.instance.makeApiCall( - callName: 'debugCall', - apiUrl: '$baseUrl/jonh.php', - callType: ApiCallType.POST, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - params: { - 'devUUID': devUUID, - 'userUUID': userUUID, - 'cliID': cliID, + 'cliID': cliUUID, 'atividade': atividade, 'DevDesc': devDesc, 'idVisitante': idVisitante, @@ -1420,6 +1363,26 @@ class DeleteVisitCall { )); } +class DebugCall { + Future call() async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'debug', + apiUrl: '$baseUrl/jonh.php', + callType: ApiCallType.POST, + headers: {}, + params: {}, + bodyType: BodyType.JSON, + returnBody: true, + encodeBodyUtf8: false, + decodeUtf8: false, + cache: false, + alwaysAllowBody: false, + ); + } +} + /// End PHP Group Code class ApiPagingParams { diff --git a/lib/backend/cloud_functions/cloud_functions.dart b/lib/backend/cloud_functions/cloud_functions.dart new file mode 100644 index 00000000..4f4e4d18 --- /dev/null +++ b/lib/backend/cloud_functions/cloud_functions.dart @@ -0,0 +1,23 @@ +import 'package:cloud_functions/cloud_functions.dart'; + +Future> makeCloudCall( + String callName, + Map input, +) async { + try { + final response = await FirebaseFunctions.instance + .httpsCallable(callName, options: HttpsCallableOptions()) + .call(input); + return response.data is Map + ? Map.from(response.data as Map) + : {}; + } on FirebaseFunctionsException catch (e) { + print( + 'Cloud call error!\n' + 'Code: ${e.code}\n' + 'Details: ${e.details}\n' + 'Message: ${e.message}', + ); + return {}; + } +} diff --git a/lib/backend/push_notifications/push_notifications_handler.dart b/lib/backend/push_notifications/push_notifications_handler.dart new file mode 100644 index 00000000..8aec8b70 --- /dev/null +++ b/lib/backend/push_notifications/push_notifications_handler.dart @@ -0,0 +1,154 @@ +import 'dart:async'; + +import 'serialization_util.dart'; +import '../backend.dart'; +import '../../flutter_flow/flutter_flow_theme.dart'; +import '../../flutter_flow/flutter_flow_util.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; + + +final _handledMessageIds = {}; + +class PushNotificationsHandler extends StatefulWidget { + const PushNotificationsHandler({super.key, required this.child}); + + final Widget child; + + @override + _PushNotificationsHandlerState createState() => + _PushNotificationsHandlerState(); +} + +class _PushNotificationsHandlerState extends State { + bool _loading = false; + + Future handleOpenedPushNotification() async { + if (isWeb) { + return; + } + + final notification = await FirebaseMessaging.instance.getInitialMessage(); + if (notification != null) { + await _handlePushNotification(notification); + } + FirebaseMessaging.onMessageOpenedApp.listen(_handlePushNotification); + } + + Future _handlePushNotification(RemoteMessage message) async { + if (_handledMessageIds.contains(message.messageId)) { + return; + } + _handledMessageIds.add(message.messageId); + + if (mounted) { + setState(() => _loading = true); + } + try { + final initialPageName = message.data['initialPageName'] as String; + final initialParameterData = getInitialParameterData(message.data); + final parametersBuilder = parametersBuilderMap[initialPageName]; + if (parametersBuilder != null) { + final parameterData = await parametersBuilder(initialParameterData); + context.pushNamed( + initialPageName, + pathParameters: parameterData.pathParameters, + extra: parameterData.extra, + ); + } + } catch (e) { + print('Error: $e'); + } finally { + if (mounted) { + setState(() => _loading = false); + } + } + } + + @override + void initState() { + super.initState(); + handleOpenedPushNotification(); + } + + @override + Widget build(BuildContext context) => _loading + ? Container( + color: FlutterFlowTheme.of(context).primary, + child: Image.asset( + 'assets/images/logo.svg', + fit: BoxFit.cover, + ), + ) + : widget.child; +} + +class ParameterData { + const ParameterData( + {this.requiredParams = const {}, this.allParams = const {}}); + final Map requiredParams; + final Map allParams; + + Map get pathParameters => Map.fromEntries( + requiredParams.entries + .where((e) => e.value != null) + .map((e) => MapEntry(e.key, e.value!)), + ); + Map get extra => Map.fromEntries( + allParams.entries.where((e) => e.value != null), + ); + + static Future Function(Map) none() => + (data) async => const ParameterData(); +} + +final parametersBuilderMap = + Function(Map)>{ + 'LoginPage': (data) async => ParameterData( + allParams: { + 'device': getParameter(data, 'device'), + }, + ), + 'ForgotPasswordPage': ParameterData.none(), + 'homePage': (data) async => ParameterData( + allParams: { + 'userUUID': getParameter(data, 'userUUID'), + 'devUUID': getParameter(data, 'devUUID'), + }, + ), + 'RegisterPage': ParameterData.none(), + 'WelcomePage': ParameterData.none(), + 'registerVisitorPage': (data) async => ParameterData( + allParams: { + 'userUUID': getParameter(data, 'userUUID'), + 'devUUID': getParameter(data, 'devUUID'), + }, + ), + 'scheduleCompleteVisitPage': (data) async => ParameterData( + allParams: { + 'visitorStrList': getParameter(data, 'visitorStrList'), + 'visitStartDateStr': getParameter(data, 'visitStartDateStr'), + 'visitEndDateStr': getParameter(data, 'visitEndDateStr'), + 'visitReasonStr': getParameter(data, 'visitReasonStr'), + 'visitLevelStr': getParameter(data, 'visitLevelStr'), + 'visitTempBol': getParameter(data, 'visitTempBol'), + 'visitObsStr': getParameter(data, 'visitObsStr'), + }, + ), + 'scheduleProvisionalVisitPage': ParameterData.none(), +}; + +Map getInitialParameterData(Map data) { + try { + final parameterDataStr = data['parameterData']; + if (parameterDataStr == null || + parameterDataStr is! String || + parameterDataStr.isEmpty) { + return {}; + } + return jsonDecode(parameterDataStr) as Map; + } catch (e) { + print('Error parsing parameter data: $e'); + return {}; + } +} diff --git a/lib/backend/push_notifications/push_notifications_util.dart b/lib/backend/push_notifications/push_notifications_util.dart new file mode 100644 index 00000000..0b1abbf9 --- /dev/null +++ b/lib/backend/push_notifications/push_notifications_util.dart @@ -0,0 +1,49 @@ +import 'dart:io' show Platform; + +import 'package:cloud_firestore/cloud_firestore.dart'; + +import '../../auth/firebase_auth/auth_util.dart'; +import '../cloud_functions/cloud_functions.dart'; + +import 'package:flutter/foundation.dart'; +import 'package:stream_transform/stream_transform.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; + +export 'push_notifications_handler.dart'; +export 'serialization_util.dart'; + +class UserTokenInfo { + const UserTokenInfo(this.userPath, this.fcmToken); + final String userPath; + final String fcmToken; +} + +Stream getFcmTokenStream(String userPath) => + Stream.value(!kIsWeb && (Platform.isIOS || Platform.isAndroid)) + .where((shouldGetToken) => shouldGetToken) + .asyncMap( + (_) => FirebaseMessaging.instance.requestPermission().then( + (settings) => settings.authorizationStatus == + AuthorizationStatus.authorized + ? FirebaseMessaging.instance.getToken() + : null, + )) + .switchMap((fcmToken) => Stream.value(fcmToken) + .merge(FirebaseMessaging.instance.onTokenRefresh)) + .where((fcmToken) => fcmToken != null && fcmToken.isNotEmpty) + .map((token) => UserTokenInfo(userPath, token!)); +final fcmTokenUserStream = authenticatedUserStream + .where((user) => user != null) + .map((user) => user!.reference.path) + .distinct() + .switchMap(getFcmTokenStream) + .map( + (userTokenInfo) => makeCloudCall( + 'addFcmToken', + { + 'userDocPath': userTokenInfo.userPath, + 'fcmToken': userTokenInfo.fcmToken, + 'deviceType': Platform.isIOS ? 'iOS' : 'Android', + }, + ), + ); diff --git a/lib/backend/push_notifications/serialization_util.dart b/lib/backend/push_notifications/serialization_util.dart new file mode 100644 index 00000000..cf084b69 --- /dev/null +++ b/lib/backend/push_notifications/serialization_util.dart @@ -0,0 +1,172 @@ +import 'dart:convert'; + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/material.dart'; + +import '/backend/backend.dart'; +import '/backend/schema/structs/index.dart'; + +import '../../flutter_flow/lat_lng.dart'; +import '../../flutter_flow/place.dart'; +import '../../flutter_flow/uploaded_file.dart'; + +/// SERIALIZATION HELPERS + +String dateTimeRangeToString(DateTimeRange dateTimeRange) { + final startStr = dateTimeRange.start.millisecondsSinceEpoch.toString(); + final endStr = dateTimeRange.end.millisecondsSinceEpoch.toString(); + return '$startStr|$endStr'; +} + +String placeToString(FFPlace place) => jsonEncode({ + 'latLng': place.latLng.serialize(), + 'name': place.name, + 'address': place.address, + 'city': place.city, + 'state': place.state, + 'country': place.country, + 'zipCode': place.zipCode, + }); + +String uploadedFileToString(FFUploadedFile uploadedFile) => + uploadedFile.serialize(); + +/// Converts the input value into a value that can be JSON encoded. +dynamic serializeParameter(dynamic value) { + switch (value.runtimeType) { + case DateTime: + return (value as DateTime).millisecondsSinceEpoch; + case DateTimeRange: + return dateTimeRangeToString(value as DateTimeRange); + case LatLng: + return (value as LatLng).serialize(); + case Color: + return (value as Color).toCssString(); + case FFPlace: + return placeToString(value as FFPlace); + case FFUploadedFile: + return uploadedFileToString(value as FFUploadedFile); + } + + if (value is DocumentReference) { + return value.path; + } + + if (value is FirestoreRecord) { + return (value as dynamic).reference.path; + } + + return value; +} + +String serializeParameterData(Map parameterData) => jsonEncode( + parameterData.map( + (key, value) => MapEntry( + key, + serializeParameter(value), + ), + )..removeWhere((k, v) => v == null), + ); + +/// END SERIALIZATION HELPERS + +/// DESERIALIZATION HELPERS + +DateTimeRange? dateTimeRangeFromString(String dateTimeRangeStr) { + final pieces = dateTimeRangeStr.split('|'); + if (pieces.length != 2) { + return null; + } + return DateTimeRange( + start: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.first)), + end: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.last)), + ); +} + +LatLng? latLngFromString(String? latLngStr) { + final pieces = latLngStr?.split(','); + if (pieces == null || pieces.length != 2) { + return null; + } + return LatLng( + double.parse(pieces.first.trim()), + double.parse(pieces.last.trim()), + ); +} + +FFPlace placeFromString(String placeStr) { + final serializedData = jsonDecode(placeStr) as Map; + final data = { + 'latLng': serializedData.containsKey('latLng') + ? latLngFromString(serializedData['latLng'] as String) + : const LatLng(0.0, 0.0), + 'name': serializedData['name'] ?? '', + 'address': serializedData['address'] ?? '', + 'city': serializedData['city'] ?? '', + 'state': serializedData['state'] ?? '', + 'country': serializedData['country'] ?? '', + 'zipCode': serializedData['zipCode'] ?? '', + }; + return FFPlace( + latLng: data['latLng'] as LatLng, + name: data['name'] as String, + address: data['address'] as String, + city: data['city'] as String, + state: data['state'] as String, + country: data['country'] as String, + zipCode: data['zipCode'] as String, + ); +} + +FFUploadedFile uploadedFileFromString(String uploadedFileStr) => + FFUploadedFile.deserialize(uploadedFileStr); + +T? getParameter(Map data, String paramName) { + try { + if (!data.containsKey(paramName)) { + return null; + } + final param = data[paramName]; + switch (T) { + case String: + return param; + case double: + return param.toDouble(); + case DateTime: + return DateTime.fromMillisecondsSinceEpoch(param) as T; + case DateTimeRange: + return dateTimeRangeFromString(param) as T; + case LatLng: + return latLngFromString(param) as T; + case Color: + return fromCssColor(param) as T; + case FFPlace: + return placeFromString(param) as T; + case FFUploadedFile: + return uploadedFileFromString(param) as T; + } + if (param is String) { + return FirebaseFirestore.instance.doc(param) as T; + } + return param; + } catch (e) { + print('Error parsing parameter "$paramName": $e'); + return null; + } +} + +Future getDocumentParameter( + Map data, + String paramName, + RecordBuilder recordBuilder, +) { + if (!data.containsKey(paramName)) { + return Future.value(null); + } + return FirebaseFirestore.instance + .doc(data[paramName]) + .get() + .then((s) => recordBuilder(s)); +} + +/// END DESERIALIZATION HELPERS diff --git a/lib/backend/schema/structs/device_struct.dart b/lib/backend/schema/structs/device_struct.dart deleted file mode 100644 index 03db22f3..00000000 --- a/lib/backend/schema/structs/device_struct.dart +++ /dev/null @@ -1,110 +0,0 @@ -// ignore_for_file: unnecessary_getters_setters - -import '/backend/schema/util/schema_util.dart'; - -import 'index.dart'; -import '/flutter_flow/flutter_flow_util.dart'; - -class DeviceStruct extends BaseStruct { - DeviceStruct({ - String? devUUID, - String? version, - String? description, - }) : _devUUID = devUUID, - _version = version, - _description = description; - - // "devUUID" field. - String? _devUUID; - String get devUUID => _devUUID ?? ''; - set devUUID(String? val) => _devUUID = val; - bool hasDevUUID() => _devUUID != null; - - // "version" field. - String? _version; - String get version => _version ?? ''; - set version(String? val) => _version = val; - bool hasVersion() => _version != null; - - // "description" field. - String? _description; - String get description => _description ?? ''; - set description(String? val) => _description = val; - bool hasDescription() => _description != null; - - static DeviceStruct fromMap(Map data) => DeviceStruct( - devUUID: data['devUUID'] as String?, - version: data['version'] as String?, - description: data['description'] as String?, - ); - - static DeviceStruct? maybeFromMap(dynamic data) => - data is Map ? DeviceStruct.fromMap(data.cast()) : null; - - Map toMap() => { - 'devUUID': _devUUID, - 'version': _version, - 'description': _description, - }.withoutNulls; - - @override - Map toSerializableMap() => { - 'devUUID': serializeParam( - _devUUID, - ParamType.String, - ), - 'version': serializeParam( - _version, - ParamType.String, - ), - 'description': serializeParam( - _description, - ParamType.String, - ), - }.withoutNulls; - - static DeviceStruct fromSerializableMap(Map data) => - DeviceStruct( - devUUID: deserializeParam( - data['devUUID'], - ParamType.String, - false, - ), - version: deserializeParam( - data['version'], - ParamType.String, - false, - ), - description: deserializeParam( - data['description'], - ParamType.String, - false, - ), - ); - - @override - String toString() => 'DeviceStruct(${toMap()})'; - - @override - bool operator ==(Object other) { - return other is DeviceStruct && - devUUID == other.devUUID && - version == other.version && - description == other.description; - } - - @override - int get hashCode => - const ListEquality().hash([devUUID, version, description]); -} - -DeviceStruct createDeviceStruct({ - String? devUUID, - String? version, - String? description, -}) => - DeviceStruct( - devUUID: devUUID, - version: version, - description: description, - ); diff --git a/lib/backend/schema/structs/index.dart b/lib/backend/schema/structs/index.dart index 0c01c05d..bc8583f6 100644 --- a/lib/backend/schema/structs/index.dart +++ b/lib/backend/schema/structs/index.dart @@ -1,4 +1,3 @@ export '/backend/schema/util/schema_util.dart'; export 'action_struct.dart'; -export 'device_struct.dart'; diff --git a/lib/components/image_cropper_model.dart b/lib/components/image_cropper_model.dart deleted file mode 100644 index 3d5fedec..00000000 --- a/lib/components/image_cropper_model.dart +++ /dev/null @@ -1,11 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import 'image_cropper_widget.dart' show ImageCropperWidget; -import 'package:flutter/material.dart'; - -class ImageCropperModel extends FlutterFlowModel { - @override - void initState(BuildContext context) {} - - @override - void dispose() {} -} diff --git a/lib/components/image_cropper_widget.dart b/lib/components/image_cropper_widget.dart deleted file mode 100644 index 90467078..00000000 --- a/lib/components/image_cropper_widget.dart +++ /dev/null @@ -1,64 +0,0 @@ -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/custom_code/widgets/index.dart' as custom_widgets; -import 'package:flutter/material.dart'; -import 'image_cropper_model.dart'; -export 'image_cropper_model.dart'; - -class ImageCropperWidget extends StatefulWidget { - const ImageCropperWidget({ - super.key, - required this.uploadImageFile, - }); - - final FFUploadedFile? uploadImageFile; - - @override - State createState() => _ImageCropperWidgetState(); -} - -class _ImageCropperWidgetState extends State { - late ImageCropperModel _model; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => ImageCropperModel()); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Container( - width: 500.0, - height: 500.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).secondaryBackground, - ), - child: SizedBox( - width: double.infinity, - height: double.infinity, - child: custom_widgets.ImageCropper( - width: double.infinity, - height: double.infinity, - imageFile: widget.uploadImageFile, - callBackAction: (url) async { - Navigator.pop(context, url); - }, - ), - ), - ); - } -} diff --git a/lib/components/legacy_local_component_model.dart b/lib/components/legacy_local_component_model.dart deleted file mode 100644 index 65087833..00000000 --- a/lib/components/legacy_local_component_model.dart +++ /dev/null @@ -1,12 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import 'legacy_local_component_widget.dart' show LegacyLocalComponentWidget; -import 'package:flutter/material.dart'; - -class LegacyLocalComponentModel - extends FlutterFlowModel { - @override - void initState(BuildContext context) {} - - @override - void dispose() {} -} diff --git a/lib/components/legacy_local_component_widget.dart b/lib/components/legacy_local_component_widget.dart deleted file mode 100644 index 54c3610d..00000000 --- a/lib/components/legacy_local_component_widget.dart +++ /dev/null @@ -1,167 +0,0 @@ -import '/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/custom_functions.dart' as functions; -import '/flutter_flow/random_data_util.dart' as random_data; -import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:provider/provider.dart'; -import 'legacy_local_component_model.dart'; -export 'legacy_local_component_model.dart'; - -class LegacyLocalComponentWidget extends StatefulWidget { - const LegacyLocalComponentWidget({super.key}); - - @override - State createState() => - _LegacyLocalComponentWidgetState(); -} - -class _LegacyLocalComponentWidgetState - extends State { - late LegacyLocalComponentModel _model; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => LegacyLocalComponentModel()); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - context.watch(); - - return Visibility( - visible: random_data.randomInteger(0, 10) != null, - child: Container( - height: 284.0, - decoration: const BoxDecoration(), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Stack( - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Material( - color: Colors.transparent, - elevation: 0.0, - child: Container( - width: double.infinity, - height: 119.0, - decoration: BoxDecoration( - color: const Color(0xFF1AAB5F), - border: Border.all( - color: const Color(0xFF1AAB5F), - ), - ), - ), - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Container( - width: 200.0, - height: 200.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - shape: BoxShape.circle, - ), - alignment: const AlignmentDirectional(0.0, 0.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(2.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - showModalBottomSheet( - isScrollControlled: true, - backgroundColor: const Color(0x00FFFFFF), - context: context, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const SizedBox( - height: double.infinity, - child: - BottomArrowLinkedLocalsComponentWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - child: ClipRRect( - borderRadius: BorderRadius.circular(200.0), - child: Image.network( - valueOrDefault( - 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - width: 300.0, - height: 200.0, - fit: BoxFit.cover, - alignment: const Alignment(0.0, 0.0), - errorBuilder: (context, error, stackTrace) => - Image.asset( - 'assets/images/error_image.svg', - width: 300.0, - height: 200.0, - fit: BoxFit.cover, - alignment: const Alignment(0.0, 0.0), - ), - ), - ), - ), - ), - ), - ), - ), - ), - ], - ), - Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - valueOrDefault( - functions.convertToUppercase(FFAppState().local), - 'NOME DO LOCAL', - ), - style: FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 20.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap().containsKey('Nunito'), - ), - ), - ], - ), - ], - ), - ), - ); - } -} diff --git a/lib/components/select_header_component_model.dart b/lib/components/select_header_component_model.dart deleted file mode 100644 index 4c60514f..00000000 --- a/lib/components/select_header_component_model.dart +++ /dev/null @@ -1,12 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import 'select_header_component_widget.dart' show SelectHeaderComponentWidget; -import 'package:flutter/material.dart'; - -class SelectHeaderComponentModel - extends FlutterFlowModel { - @override - void initState(BuildContext context) {} - - @override - void dispose() {} -} diff --git a/lib/components/select_header_component_widget.dart b/lib/components/select_header_component_widget.dart deleted file mode 100644 index 8f4f9339..00000000 --- a/lib/components/select_header_component_widget.dart +++ /dev/null @@ -1,185 +0,0 @@ -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'select_header_component_model.dart'; -export 'select_header_component_model.dart'; - -class SelectHeaderComponentWidget extends StatefulWidget { - const SelectHeaderComponentWidget({ - super.key, - required this.selectToggle, - bool? toggleIndexValue, - }) : toggleIndexValue = toggleIndexValue ?? true; - - final Future Function(bool toggleIndex)? selectToggle; - final bool toggleIndexValue; - - @override - State createState() => - _SelectHeaderComponentWidgetState(); -} - -class _SelectHeaderComponentWidgetState - extends State { - late SelectHeaderComponentModel _model; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => SelectHeaderComponentModel()); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Container( - height: 55.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await widget.selectToggle?.call( - true, - ); - }, - child: Container( - width: double.infinity, - height: 50.0, - decoration: const BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(0.0), - bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(0.0), - topRight: Radius.circular(0.0), - ), - ), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - '1gr8ztd5' /* Criar Agendamento */, - ), - style: FlutterFlowTheme.of(context).bodyMedium.override( - fontFamily: - FlutterFlowTheme.of(context).bodyMediumFamily, - color: FlutterFlowTheme.of(context).primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts.asMap().containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ), - ), - ), - if (widget.toggleIndexValue == true) - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 2.0, 0.0, 0.0), - child: Container( - width: double.infinity, - height: 2.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primary, - borderRadius: BorderRadius.circular(100.0), - ), - ), - ), - ], - ), - ), - ), - Expanded( - child: Container( - height: 55.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await widget.selectToggle?.call( - false, - ); - }, - child: Container( - width: double.infinity, - height: 50.0, - decoration: const BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(0.0), - bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(0.0), - topRight: Radius.circular(0.0), - ), - ), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'xjahsbjw' /* Histórico de Visitas */, - ), - style: FlutterFlowTheme.of(context).bodyMedium.override( - fontFamily: - FlutterFlowTheme.of(context).bodyMediumFamily, - color: FlutterFlowTheme.of(context).primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts.asMap().containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ), - ), - ), - if (widget.toggleIndexValue == false) - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 2.0, 0.0, 0.0), - child: Container( - width: double.infinity, - height: 2.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primary, - borderRadius: BorderRadius.circular(100.0), - ), - ), - ), - ], - ), - ), - ), - ], - ); - } -} diff --git a/lib/custom_code/actions/get_dev_u_u_i_d.dart b/lib/custom_code/actions/get_dev_u_u_i_d.dart deleted file mode 100644 index 6d4843e7..00000000 --- a/lib/custom_code/actions/get_dev_u_u_i_d.dart +++ /dev/null @@ -1,28 +0,0 @@ -// Automatic FlutterFlow imports -import '/backend/schema/structs/index.dart'; -import '/backend/schema/enums/enums.dart'; -import '/actions/actions.dart' as action_blocks; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import 'index.dart'; // Imports other custom actions -import '/flutter_flow/custom_functions.dart'; // Imports custom functions -import 'package:flutter/material.dart'; -// Begin custom action code -// DO NOT REMOVE OR MODIFY THE CODE ABOVE! - -import 'dart:io'; - -import 'package:device_info_plus/device_info_plus.dart'; - -Future getDevUUID() async { - var deviceInfo = DeviceInfoPlugin(); - if (Platform.isIOS) { - // import 'dart:io' - var iosDeviceInfo = await deviceInfo.iosInfo; - return iosDeviceInfo.identifierForVendor; // unique ID on iOS - } else if (Platform.isAndroid) { - var androidDeviceInfo = await deviceInfo.androidInfo; - print(AndroidDeviceInfo); - return androidDeviceInfo.serialNumber; // unique ID on Android - } -} diff --git a/lib/custom_code/actions/index.dart b/lib/custom_code/actions/index.dart index 2110f043..91a5451a 100644 --- a/lib/custom_code/actions/index.dart +++ b/lib/custom_code/actions/index.dart @@ -1,3 +1,2 @@ export 'convert_image_file_to_base64.dart' show convertImageFileToBase64; export 'convert_to_upload_file.dart' show convertToUploadFile; -export 'get_dev_u_u_i_d.dart' show getDevUUID; diff --git a/lib/custom_code/widgets/image_cropper.dart b/lib/custom_code/widgets/image_cropper.dart deleted file mode 100644 index 459c718b..00000000 --- a/lib/custom_code/widgets/image_cropper.dart +++ /dev/null @@ -1,179 +0,0 @@ -// Automatic FlutterFlow imports -import '/backend/schema/structs/index.dart'; -import '/backend/schema/enums/enums.dart'; -import '/actions/actions.dart' as action_blocks; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import 'index.dart'; // Imports other custom widgets -import '/custom_code/actions/index.dart'; // Imports custom actions -import '/flutter_flow/custom_functions.dart'; // Imports custom functions -import 'package:flutter/material.dart'; -// Begin custom widget code -// DO NOT REMOVE OR MODIFY THE CODE ABOVE! - -import 'package:crop_your_image/crop_your_image.dart'; -import 'package:google_fonts/google_fonts.dart'; -import '/backend/firebase_storage/storage.dart'; - -class ImageCropper extends StatefulWidget { - const ImageCropper({ - super.key, - this.width, - this.height, - this.imageFile, - this.callBackAction, - this.currentUserId, - }); - - final double? width; - final double? height; - final FFUploadedFile? imageFile; - final Future Function(String? url)? callBackAction; - final String? currentUserId; - - @override - State createState() => _ImageCropperState(); -} - -class _ImageCropperState extends State { - bool loading = false; - final _crop_controller = CropController(); - @override - Widget build(BuildContext context) { - return Stack( - children: [ - Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: widget.width ?? double.infinity, - height: (widget.height ?? 555) - 80, - child: Center( - child: Crop( - image: Uint8List.fromList(widget.imageFile!.bytes!), - controller: _crop_controller, - onCropped: (image) async { - final path = _getStoragePath(_firebasePathPrefix(), - widget.imageFile!.name!, false, 0); - uploadData(path, image).then((value) { - print('image cropped'); - widget.callBackAction!.call(value!); - loading = false; - }); - // add error handling here - }, - - aspectRatio: 1 / 1, - initialSize: 0.5, - // initialArea: Rect.fromLTWH(240, 212, 800, 600),\ - //initialAreaBuilder: (rect) => Rect.fromLTRB(rect.left + 80, rect.top + 80, rect.right - 80, rect.bottom - 80), - withCircleUi: true, - baseColor: Color.fromARGB(255, 0, 3, 22), - maskColor: Colors.white.withAlpha(100), - radius: 20, - - onMoved: (newRect) { - // do something with current cropping area. - }, - onStatusChanged: (status) { - // do something with current CropStatus - }, - cornerDotBuilder: (size, edgeAlignment) => - const DotControl(color: Colors.white), - interactive: true, - // fixArea: true, - ))), - Padding( - padding: EdgeInsetsDirectional.fromSTEB(8, 5, 8, 5), - child: ElevatedButton( - onPressed: () async { - if (!loading) { - setState(() { - loading = true; - }); - print('Button pressed ...'); - _crop_controller.crop(); - - //widget.loading = true; - } - }, - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - FlutterFlowTheme.of(context).primaryColor, - ), - padding: MaterialStateProperty.all( - EdgeInsets.zero, - ), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(100), - side: BorderSide.none, - ), - ), - ), - child: Container( - width: 250, - height: 50, - alignment: Alignment.center, - child: loading - ? CircularProgressIndicator( - valueColor: - AlwaysStoppedAnimation(Colors.white), - ) - : Text( - 'Crop', - style: FlutterFlowTheme.of(context) - .subtitle2 - .override( - fontFamily: 'Lexend', - color: Colors.white, - fontSize: 16, - fontWeight: FontWeight.normal, - useGoogleFonts: GoogleFonts.asMap() - .containsKey( - FlutterFlowTheme.of(context) - .subtitle2Family), - ), - ), - ), - )), - ]), - Positioned( - top: 4, - right: 4, - child: IconButton( - icon: Icon(Icons.close), - onPressed: () => Navigator.pop(context), - )) - ], - ); - } - - String _getStoragePath( - String? pathPrefix, - String filePath, - bool isVideo, [ - int? index, - ]) { - pathPrefix ??= _firebasePathPrefix(); - pathPrefix = _removeTrailingSlash(pathPrefix); - final timestamp = DateTime.now().microsecondsSinceEpoch; - final prefix = 'cropped-'; - // Workaround fixed by https://github.com/flutter/plugins/pull/3685 - // (not yet in stable). - final ext = isVideo ? 'mp4' : filePath.split('.').last; - final indexStr = index != null ? '_$index' : ''; - return '$pathPrefix/$prefix$timestamp$indexStr.$ext'; - } - - String? _removeTrailingSlash(String? path) => - path != null && path.endsWith('/') - ? path.substring(0, path.length - 1) - : path; - - String _firebasePathPrefix() => 'users/${widget.currentUserId}/uploads'; -} -// Set your widget name, define your parameter, and then add the -// boilerplate code using the green button on the right! diff --git a/lib/custom_code/widgets/index.dart b/lib/custom_code/widgets/index.dart deleted file mode 100644 index ec35fd3e..00000000 --- a/lib/custom_code/widgets/index.dart +++ /dev/null @@ -1 +0,0 @@ -export 'image_cropper.dart' show ImageCropper; diff --git a/lib/flutter_flow/flutter_flow_theme.dart b/lib/flutter_flow/flutter_flow_theme.dart index 7429aca2..e782c9ed 100644 --- a/lib/flutter_flow/flutter_flow_theme.dart +++ b/lib/flutter_flow/flutter_flow_theme.dart @@ -66,8 +66,6 @@ abstract class FlutterFlowTheme { late Color customColor1; late Color customColor2; late Color customColor3; - late Color customColor4; - late Color customColor5; @Deprecated('Use displaySmallFamily instead') String get title1Family => displaySmallFamily; @@ -166,7 +164,7 @@ class LightModeTheme extends FlutterFlowTheme { late Color accent1 = const Color(0xFF1AAB5F); late Color accent2 = const Color(0x4D000000); late Color accent3 = const Color(0xFFFFFFFF); - late Color accent4 = const Color(0xFF1AAB5F); + late Color accent4 = const Color(0xFFFFFFFF); late Color success = const Color(0xFF1AAB5F); late Color warning = const Color(0xFFF3C344); late Color error = const Color(0xFFD70000); @@ -175,8 +173,6 @@ class LightModeTheme extends FlutterFlowTheme { late Color customColor1 = const Color(0xFF000000); late Color customColor2 = const Color(0xFF1AAB5F); late Color customColor3 = const Color(0xFFFFFFFF); - late Color customColor4 = const Color(0xFFCFCFCF); - late Color customColor5 = const Color(0xFF979595); } abstract class Typography { @@ -573,8 +569,6 @@ class DarkModeTheme extends FlutterFlowTheme { late Color customColor1 = const Color(0xFFFFFFFF); late Color customColor2 = const Color(0xFFFFFFFF); late Color customColor3 = const Color(0xFF1AAB5F); - late Color customColor4 = const Color(0xFF232323); - late Color customColor5 = const Color(0xFF232323); } extension TextStyleHelper on TextStyle { diff --git a/lib/flutter_flow/internationalization.dart b/lib/flutter_flow/internationalization.dart index b4a5794a..b5c2dc8d 100644 --- a/lib/flutter_flow/internationalization.dart +++ b/lib/flutter_flow/internationalization.dart @@ -107,43 +107,43 @@ Locale createLocale(String language) => language.contains('_') final kTranslationsMap = >>[ // LoginPage { - '0113wf5c': { + 'uem0mca5': { 'pt': 'VAMOS LA! ENTRE COM A SUA CONTA', 'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT', }, - 'f2go5a71': { + '90ls8ppo': { 'pt': 'Email', 'en': 'Email', }, - 'paon3y0v': { + 'rvlumyaw': { 'pt': 'Senha', 'en': 'Password', }, - 'wmbzwstw': { + '2d3903lt': { 'pt': 'Entrar', 'en': 'Sign-In', }, - 'j8567afe': { + 'zj6pyujp': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, - 'y3wd9q18': { + 'iqhyif1d': { 'pt': 'Entrar', 'en': 'Sign-In', }, - 'j6ufb6sq': { + '5x5bp2u1': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, - 'h85112qs': { + '1fqjz9q7': { 'pt': 'Você esqueceu a sua senha?', 'en': 'Have you forgotten your password?', }, - 'di48hdaj': { + '7miyd406': { 'pt': ' Recupere aqui', 'en': 'recover here', }, - 'gx2fp6zq': { + '63xv5ewj': { 'pt': 'Termo de Uso', 'en': 'Terms of use', }, @@ -154,25 +154,25 @@ final kTranslationsMap = >>[ }, // ForgotPasswordPage { - 'gfvplb0h': { + 'lpduiuif': { 'pt': 'ESQUECEU SUA SENHA?', 'en': 'FORGOT YOUR PASSWORD?', }, - 'azssgpdi': { + '8t05j98w': { 'pt': 'Não se preucupe nós vamos te ajudar, digite o email cadastrado no aplicativo e clique em enviar.', 'en': 'Don\'t worry, we will help you, enter the email registered in the application and click send.', }, - '0o139961': { + '4gcoci7a': { 'pt': 'Email', 'en': 'Email', }, - 'aanw1fp3': { + 'a7p2iikz': { 'pt': 'digite o seu email.....', 'en': 'enter your email.....', }, - 'e7hdgc4q': { + 'z9ghb8dz': { 'pt': 'Enviar', 'en': 'To send', }, @@ -234,39 +234,39 @@ final kTranslationsMap = >>[ }, // RegisterPage { - '2d8uulm3': { + 'oxy0n1p4': { 'pt': 'INSIRA SEU EMAIL E SENHA, VAMOS TE CADASTRAR!', 'en': 'ENTER YOUR EMAIL AND PASSWORD, LET\'S REGISTER YOU!', }, - '8kjhi406': { + 'w0y3fz89': { 'pt': 'Nome', 'en': 'Name', }, - 'ro4zkkxp': { + '4bfdpd0o': { 'pt': 'Email', 'en': 'Email', }, - 'j5yny8ee': { + 'v0iobs5a': { 'pt': '', 'en': '', }, - 'lzgobioa': { + 'byjglkpk': { 'pt': 'Senha', 'en': 'Password', }, - 'c7sfyeh8': { + 'w9vrsnmf': { 'pt': 'Cadastrar-se', 'en': 'Sign-Up', }, - 'jglpa1tr': { + 'zep60lcd': { 'pt': 'Você já tem uma conta? ', 'en': 'You already have an account?', }, - 'hfcm0td9': { + 'tl8k1ld9': { 'pt': 'Clique aqui', 'en': 'Click here', }, - 'c3kno4t9': { + 'dbtzii7i': { 'pt': 'Termo de Uso', 'en': '', }, @@ -277,27 +277,27 @@ final kTranslationsMap = >>[ }, // WelcomePage { - 'xflxvs9y': { + '3pl41wkq': { 'pt': 'UMA EXPERIÊCIA COMPLETA', 'en': 'A COMPLETE EXPERIENCE', }, - '5a86wzd1': { + '13nhoxpg': { 'pt': 'COM CONFORTO ONDE VOCÊ ESTIVER.', 'en': 'WITH COMFORT WHEREVER YOU ARE.', }, - '65nuva6j': { + 'zt5uc5g5': { 'pt': 'Entrar', 'en': 'Sign-In', }, - '9u6oaw01': { + 'jteakpo0': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, - 'd1qem43w': { + 'qoc86gvo': { 'pt': 'Entrar', 'en': 'Sign-In', }, - 'bhowzv2u': { + 'p5tgmj0c': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, @@ -371,39 +371,43 @@ final kTranslationsMap = >>[ }, // scheduleCompleteVisitPage { + 'e4w9lbke': { + 'pt': 'Criar Agendamento', + 'en': 'Create Schedule', + }, + '47bsumoy': { + 'pt': 'Histórico de Visitas', + 'en': 'Visit History', + }, + '15ekd1ge': { + 'pt': 'Agendar Visita', + 'en': 'Schedule Visit', + }, 'qo0pg2at': { 'pt': 'Quais visitantes você deseja cadastrar?', 'en': 'Which visitors do you want to register?', }, 'i0jhuu3e': { 'pt': 'Clique para adicionar um visitante', - 'en': 'Click to add a visitor', + 'en': 'Click to add photo for visitor', }, 'z4ry3tge': { 'pt': 'Qual o período de validade da visita?', 'en': 'Visit Validity Period', }, - 'hjp5mzbd': { - 'pt': 'Inicio da Visita', - 'en': 'Start of Visit', + '9mg9nv2j': { + 'pt': 'Ínicio da Visita', + 'en': 'Start of the Visit', }, - '2in5sljf': { - 'pt': '', + 'y5s85khj': { + 'pt': 'Quando a visitas se inicia?', + 'en': 'When does the visit start?', + }, + '4o0cbb70': { + 'pt': 'Término da Visita', 'en': 'End of Visit', }, - 'ce6xryf4': { - 'pt': 'Quando você inicia a visita?', - 'en': 'When do you start the visit?', - }, - 'jwsbk0xu': { - 'pt': 'Fim da Visita', - 'en': 'End of Visit', - }, - '87rlxmbk': { - 'pt': '', - 'en': 'End of Visit', - }, - 'lyfe46f6': { + 'bhmgddc4': { 'pt': 'Quando a visita terminá?', 'en': 'When will the visit end?', }, @@ -411,10 +415,6 @@ final kTranslationsMap = >>[ 'pt': 'Quais são os motivos da visita?', 'en': 'What are the reasons for the visit?', }, - 'bbauep0b': { - 'pt': 'Motivo da Visita', - 'en': 'End of Visit', - }, 'x1ij847i': { 'pt': 'Escolha um motivo aqui', 'en': 'Choose a reason here', @@ -423,10 +423,6 @@ final kTranslationsMap = >>[ 'pt': 'Search for an item...', 'en': '', }, - 'etzbm8l5': { - 'pt': 'Nível de Acesso', - 'en': 'End of Visit', - }, 'kmgv5j7x': { 'pt': 'Escolha um nível de acesso aqui', 'en': 'Choose an access level here', @@ -455,50 +451,6 @@ final kTranslationsMap = >>[ 'pt': 'Escreva as suas observações aqui', 'en': 'Write your observations here', }, - 'bvioevav': { - 'pt': 'Ativo', - 'en': 'Active', - }, - '295oz5is': { - 'pt': '16/10/2024', - 'en': '16/10/2024', - }, - '07h0w8ki': { - 'pt': '16/10/2024', - 'en': '16/10/2024', - }, - 'd34nuw4w': { - 'pt': 'Visitante:', - 'en': 'Visitor:', - }, - 'y8geteyc': { - 'pt': ' Lucas Martin Mota', - 'en': 'Lucas Martin Mota', - }, - 'gxdykms1': { - 'pt': 'Morador:', - 'en': 'Resident:', - }, - 'ue7wkm9r': { - 'pt': ' Lucas Martin Mota', - 'en': 'Lucas Martin Mota', - }, - 'zs8s0wd3': { - 'pt': 'Validade:', - 'en': 'Validity:', - }, - 'z7fset9r': { - 'pt': ' 16/10/2024 a 16/10/2024', - 'en': ' 16/10/2024 a 16/10/2024', - }, - 'fcb5avae': { - 'pt': 'Agendamento Ativo', - 'en': 'Active Scheduling', - }, - '61lcxdgm': { - 'pt': 'Agendar Visita', - 'en': 'Schedule Visit', - }, 'v3mpyspm': { 'pt': 'scheduleVisit', 'en': '', @@ -559,20 +511,6 @@ final kTranslationsMap = >>[ 'en': '', }, }, - // onBoardingPage - { - '6exl3e75': { - 'pt': 'Home', - 'en': '', - }, - }, - // fastPassPage - { - 'koh6s96f': { - 'pt': 'Home', - 'en': '', - }, - }, // visitorDetailsModal { 'kqzf7nx2': { @@ -821,31 +759,47 @@ final kTranslationsMap = >>[ 'pt': 'Cadastrar \nPet', 'en': 'Register\npet', }, + 'xlp8dyn6': { + 'pt': 'Agendar \nVisita', + 'en': 'To schedule\nVisit', + }, 'l6b9o7yn': { 'pt': 'QR Code \nde Acesso', 'en': 'QR Code\nAccess', }, + '45gqx8e0': { + 'pt': 'Agenda \nAuto-Visita', + 'en': 'Schedule\nSelf-Visit', + }, }, // menuStaggeredViewComponent { - 'ee33l0ms': { - 'pt': 'Agendar \nVisita', - 'en': 'Schedule \nVisit', + 'jn7p6pj6': { + 'pt': 'Agenda \nAuto-Visita', + 'en': 'Schedule\nSelf-Visit', }, - 'ya37l3jt': { - 'pt': 'Cadastrar\n Visitante', - 'en': 'Register\n Visitor', + 'yymmdtyv': { + 'pt': 'Cadastrar\nVisitante', + 'en': 'Register\nVisitor', }, - 'h8s3adu8': { - 'pt': 'Vincular\nCondomínio', + 'f2jbm9jz': { + 'pt': 'Vincular \nCondomínio', 'en': 'Link\nCondominium', }, - 'j6tfixen': { - 'pt': 'Cadastrar\nPet', + 'rs5a7h6m': { + 'pt': 'Cadastrar \nPet', 'en': 'Register\npet', }, - '9tli4i2x': { - 'pt': 'QR Code\nde Acesso', + 'if2zuaok': { + 'pt': 'Agendar \nVisita', + 'en': 'To schedule\nVisit', + }, + 'r4mjqq6s': { + 'pt': 'Agendar \nVisita', + 'en': 'To schedule\nVisit', + }, + 'cilu7ief': { + 'pt': 'QR Code \nde Acesso', 'en': 'QR Code\nAccess', }, }, @@ -860,151 +814,6 @@ final kTranslationsMap = >>[ 'en': 'All', }, }, - // signInComponent - { - '9hbdjxrz': { - 'pt': 'VAMOS LA! ENTRE COM A SUA CONTA', - 'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT', - }, - '1ltg0ylb': { - 'pt': 'Email', - 'en': 'Email', - }, - '2x19ce8k': { - 'pt': 'Senha', - 'en': 'Password', - }, - 'k44tm7wo': { - 'pt': 'Entrar', - 'en': 'Sign-In', - }, - '14u7ipws': { - 'pt': 'Cadastrar', - 'en': 'Sign-Up', - }, - '1x926nsn': { - 'pt': 'Entrar', - 'en': 'Sign-In', - }, - 'jwvd4ai1': { - 'pt': 'Cadastrar', - 'en': 'Sign-Up', - }, - '05dx91ku': { - 'pt': 'Você esqueceu a sua senha?', - 'en': 'Have you forgotten your password?', - }, - 'p5c6d54y': { - 'pt': ' Recupere aqui', - 'en': 'recover here', - }, - 'olf967cj': { - 'pt': 'Termo de Uso', - 'en': 'Terms of use', - }, - }, - // signUpComponent - { - '49609olv': { - 'pt': 'INSIRA SEU EMAIL E SENHA, VAMOS TE CADASTRAR!', - 'en': 'ENTER YOUR EMAIL AND PASSWORD, LET\'S REGISTER YOU!', - }, - '3corpwhd': { - 'pt': 'Nome', - 'en': 'Name', - }, - '80wonb69': { - 'pt': 'Email', - 'en': 'Email', - }, - 'ws143wf4': { - 'pt': '', - 'en': '', - }, - '0firji8l': { - 'pt': 'Senha', - 'en': 'Password', - }, - 'rnvdwzei': { - 'pt': 'Cadastrar-se', - 'en': 'Sign-Up', - }, - 'a9smhn5b': { - 'pt': 'Você já tem uma conta? ', - 'en': 'You already have an account?', - }, - '09xv5ctc': { - 'pt': 'Clique aqui', - 'en': 'Click here', - }, - 'huygnka2': { - 'pt': 'Termo de Uso', - 'en': '', - }, - }, - // welcomeComponent - { - 'dsc9tuc8': { - 'pt': 'UMA EXPERIÊCIA COMPLETA', - 'en': 'A COMPLETE EXPERIENCE', - }, - '5bgqn16z': { - 'pt': 'COM CONFORTO ONDE VOCÊ ESTIVER.', - 'en': 'WITH COMFORT WHEREVER YOU ARE.', - }, - 'dynet730': { - 'pt': 'Entrar', - 'en': 'Sign-In', - }, - 'hha60cg7': { - 'pt': 'Cadastrar', - 'en': 'Sign-Up', - }, - 'zvtay8ee': { - 'pt': 'Entrar', - 'en': 'Sign-In', - }, - 'o6zob50a': { - 'pt': 'Cadastrar', - 'en': 'Sign-Up', - }, - }, - // forgotPasswordComponent - { - 'xxm3ajsy': { - 'pt': 'ESQUECEU SUA SENHA?', - 'en': 'FORGOT YOUR PASSWORD?', - }, - 'wu2f7yzo': { - 'pt': - 'Não se preucupe nós vamos te ajudar, digite o email cadastrado no aplicativo e clique em enviar.', - 'en': - 'Don\'t worry, we will help you, enter the email registered in the application and click send.', - }, - 'mtz8l7ft': { - 'pt': 'Email', - 'en': 'Email', - }, - 'w7y5wlnv': { - 'pt': 'digite o seu email.....', - 'en': 'enter your email.....', - }, - '74rnd5bu': { - 'pt': 'Enviar', - 'en': 'To send', - }, - }, - // selectHeaderComponent - { - '1gr8ztd5': { - 'pt': 'Criar Agendamento', - 'en': 'Create Schedule', - }, - 'xjahsbjw': { - 'pt': 'Histórico de Visitas', - 'en': 'Visit History', - }, - }, // Miscellaneous { 'i5smty81': { @@ -1015,14 +824,6 @@ final kTranslationsMap = >>[ 'pt': '', 'en': '', }, - '7zjyxhuq': { - 'pt': '', - 'en': '', - }, - 'd86ioepz': { - 'pt': '', - 'en': '', - }, 'lt3ssl76': { 'pt': '', 'en': '', diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index e3a792e2..47cb35a8 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -42,7 +42,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( ), ), ) - : const OnBoardingPageWidget(), + : const WelcomePageWidget(), routes: [ FFRoute( name: '_initialize', @@ -57,7 +57,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( ), ), ) - : const OnBoardingPageWidget(), + : const WelcomePageWidget(), ), FFRoute( name: 'LoginPage', @@ -77,7 +77,16 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( FFRoute( name: 'homePage', path: '/homePage', - builder: (context, params) => const HomePageWidget(), + builder: (context, params) => HomePageWidget( + userUUID: params.getParam( + 'userUUID', + ParamType.String, + ), + devUUID: params.getParam( + 'devUUID', + ParamType.String, + ), + ), ), FFRoute( name: 'RegisterPage', @@ -92,7 +101,16 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( FFRoute( name: 'registerVisitorPage', path: '/registerVisitorPage', - builder: (context, params) => const RegisterVisitorPageWidget(), + builder: (context, params) => RegisterVisitorPageWidget( + userUUID: params.getParam( + 'userUUID', + ParamType.String, + ), + devUUID: params.getParam( + 'devUUID', + ParamType.String, + ), + ), ), FFRoute( name: 'scheduleCompleteVisitPage', @@ -137,16 +155,6 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( name: 'scheduleProvisionalVisitPage', path: '/scheduleProvisionalVisitPage', builder: (context, params) => const ScheduleProvisionalVisitPageWidget(), - ), - FFRoute( - name: 'onBoardingPage', - path: '/onBoardingPage', - builder: (context, params) => const OnBoardingPageWidget(), - ), - FFRoute( - name: 'fastPassPage', - path: '/fastPassPage', - builder: (context, params) => const FastPassPageWidget(), ) ].map((r) => r.toRoute(appStateNotifier)).toList(), ); diff --git a/lib/index.dart b/lib/index.dart index d3cc0e80..588d205a 100644 --- a/lib/index.dart +++ b/lib/index.dart @@ -1,12 +1,12 @@ // Export pages -export '/on_boarding/on_boarding_legacy/login_page/login_page_widget.dart' +export '/application_pages/login_page/login_page_widget.dart' show LoginPageWidget; -export '/on_boarding/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart' +export '/application_pages/forgot_password_page/forgot_password_page_widget.dart' show ForgotPasswordPageWidget; export '/application_pages/home_page/home_page_widget.dart' show HomePageWidget; -export '/on_boarding/on_boarding_legacy/register_page/register_page_widget.dart' +export '/application_pages/register_page/register_page_widget.dart' show RegisterPageWidget; -export '/on_boarding/on_boarding_legacy/welcome_page/welcome_page_widget.dart' +export '/application_pages/welcome_page/welcome_page_widget.dart' show WelcomePageWidget; export '/application_pages/register_visitor_page/register_visitor_page_widget.dart' show RegisterVisitorPageWidget; @@ -14,7 +14,3 @@ export '/application_pages/schedule_complete_visit_page/schedule_complete_visit_ show ScheduleCompleteVisitPageWidget; export '/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart' show ScheduleProvisionalVisitPageWidget; -export '/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart' - show OnBoardingPageWidget; -export '/application_pages/fast_pass_page/fast_pass_page_widget.dart' - show FastPassPageWidget; diff --git a/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart b/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart deleted file mode 100644 index f82f5603..00000000 --- a/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_model.dart +++ /dev/null @@ -1,26 +0,0 @@ -import '/backend/api_requests/api_calls.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import 'forgot_password_component_widget.dart' - show ForgotPasswordComponentWidget; -import 'package:flutter/material.dart'; - -class ForgotPasswordComponentModel - extends FlutterFlowModel { - /// State fields for stateful widgets in this component. - - // State field(s) for emailAddress widget. - FocusNode? emailAddressFocusNode; - TextEditingController? emailAddressTextController; - String? Function(BuildContext, String?)? emailAddressTextControllerValidator; - // Stores action output result for [Backend Call - API (forgotPassword)] action in Button-Login widget. - ApiCallResponse? req; - - @override - void initState(BuildContext context) {} - - @override - void dispose() { - emailAddressFocusNode?.dispose(); - emailAddressTextController?.dispose(); - } -} diff --git a/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart b/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart deleted file mode 100644 index 9f889f97..00000000 --- a/lib/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart +++ /dev/null @@ -1,292 +0,0 @@ -import '/backend/api_requests/api_calls.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/flutter_flow_widgets.dart'; -import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'forgot_password_component_model.dart'; -export 'forgot_password_component_model.dart'; - -class ForgotPasswordComponentWidget extends StatefulWidget { - const ForgotPasswordComponentWidget({super.key}); - - @override - State createState() => - _ForgotPasswordComponentWidgetState(); -} - -class _ForgotPasswordComponentWidgetState - extends State { - late ForgotPasswordComponentModel _model; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => ForgotPasswordComponentModel()); - - _model.emailAddressTextController ??= TextEditingController(); - _model.emailAddressFocusNode ??= FocusNode(); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Align( - alignment: const AlignmentDirectional(0.0, 1.0), - child: Container( - width: double.infinity, - height: 300.0, - constraints: const BoxConstraints( - maxWidth: 570.0, - ), - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - ), - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // This row exists for when the "app bar" is hidden on desktop, having a way back for the user can work well. - if (responsiveVisibility( - context: context, - phone: false, - tablet: false, - )) - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 8.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - context.safePop(); - }, - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - const Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0.0, 12.0, 0.0, 12.0), - child: Icon( - Icons.arrow_back_rounded, - color: Color(0xFF15161E), - size: 24.0, - ), - ), - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0), - child: Text( - '', - style: - FlutterFlowTheme.of(context).bodyMedium.override( - fontFamily: 'Plus Jakarta Sans', - color: const Color(0xFF15161E), - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - ), - ), - ], - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'xxm3ajsy' /* ESQUECEU SUA SENHA? */, - ), - style: FlutterFlowTheme.of(context).headlineMedium.override( - fontFamily: 'Outfit', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 24.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap().containsKey('Outfit'), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 4.0), - child: Text( - FFLocalizations.of(context).getText( - 'wu2f7yzo' /* Não se preucupe nós vamos te a... */, - ), - style: FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap().containsKey('Plus Jakarta Sans'), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0), - child: SizedBox( - width: double.infinity, - child: TextFormField( - controller: _model.emailAddressTextController, - focusNode: _model.emailAddressFocusNode, - autofillHints: const [AutofillHints.email], - obscureText: false, - decoration: InputDecoration( - labelText: FFLocalizations.of(context).getText( - 'mtz8l7ft' /* Email */, - ), - labelStyle: - FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context).accent1, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - hintText: FFLocalizations.of(context).getText( - 'w7y5wlnv' /* digite o seu email..... */, - ), - hintStyle: - FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).accent1, - width: 2.0, - ), - borderRadius: BorderRadius.circular(12.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).accent3, - width: 2.0, - ), - borderRadius: BorderRadius.circular(12.0), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).error, - width: 2.0, - ), - borderRadius: BorderRadius.circular(12.0), - ), - focusedErrorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).error, - width: 2.0, - ), - borderRadius: BorderRadius.circular(12.0), - ), - filled: true, - fillColor: FlutterFlowTheme.of(context).primaryBackground, - contentPadding: - const EdgeInsetsDirectional.fromSTEB(24.0, 24.0, 20.0, 24.0), - suffixIcon: Icon( - Icons.email, - color: FlutterFlowTheme.of(context).accent1, - size: 22.0, - ), - ), - style: FlutterFlowTheme.of(context).bodyMedium.override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context).secondaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - maxLines: null, - keyboardType: TextInputType.emailAddress, - cursorColor: const Color(0xFF6F61EF), - validator: _model.emailAddressTextControllerValidator - .asValidator(context), - ), - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 0.0), - child: FFButtonWidget( - onPressed: () async { - var shouldSetState = false; - _model.req = await PhpGroup.forgotPasswordCall.call( - email: _model.emailAddressTextController.text, - ); - shouldSetState = true; - if (PhpGroup.forgotPasswordCall.error( - (_model.req?.jsonBody ?? ''), - ) == - false) { - Navigator.pop(context); - } else { - if (shouldSetState) setState(() {}); - return; - } - - if (shouldSetState) setState(() {}); - }, - text: FFLocalizations.of(context).getText( - '74rnd5bu' /* Enviar */, - ), - options: FFButtonOptions( - width: 270.0, - height: 50.0, - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), - color: const Color(0xFF1AAB5F), - textStyle: FlutterFlowTheme.of(context).titleSmall.override( - fontFamily: 'Plus Jakarta Sans', - color: Colors.white, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors.transparent, - width: 1.0, - ), - ), - showLoadingIndicator: false, - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart b/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart deleted file mode 100644 index f66a1974..00000000 --- a/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_model.dart +++ /dev/null @@ -1,45 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import '/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart'; -import '/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart'; -import '/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart'; -import 'on_boarding_page_widget.dart' show OnBoardingPageWidget; -import 'package:flutter/material.dart'; - -class OnBoardingPageModel extends FlutterFlowModel { - /// Local state fields for this page. - - String toggleIdx = 'welcome'; - - /// State fields for stateful widgets in this page. - - final unfocusNode = FocusNode(); - // Model for signInComponent component. - late SignInComponentModel signInComponentModel; - // Model for signUpComponent component. - late SignUpComponentModel signUpComponentModel; - // Model for welcomeComponent component. - late WelcomeComponentModel welcomeComponentModel; - - @override - void initState(BuildContext context) { - signInComponentModel = createModel(context, () => SignInComponentModel()); - signUpComponentModel = createModel(context, () => SignUpComponentModel()); - welcomeComponentModel = createModel(context, () => WelcomeComponentModel()); - } - - @override - void dispose() { - unfocusNode.dispose(); - signInComponentModel.dispose(); - signUpComponentModel.dispose(); - welcomeComponentModel.dispose(); - } - - /// Action blocks. - Future toggleOnBoardingActionPage( - BuildContext context, { - required String? toggleValue, - }) async { - toggleIdx = toggleValue!; - } -} diff --git a/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart b/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart deleted file mode 100644 index da799597..00000000 --- a/lib/on_boarding/on_boarding_beta/on_boarding_page/on_boarding_page_widget.dart +++ /dev/null @@ -1,131 +0,0 @@ -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart'; -import '/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart'; -import '/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:provider/provider.dart'; -import 'on_boarding_page_model.dart'; -export 'on_boarding_page_model.dart'; - -class OnBoardingPageWidget extends StatefulWidget { - const OnBoardingPageWidget({super.key}); - - @override - State createState() => _OnBoardingPageWidgetState(); -} - -class _OnBoardingPageWidgetState extends State { - late OnBoardingPageModel _model; - - final scaffoldKey = GlobalKey(); - - @override - void initState() { - super.initState(); - _model = createModel(context, () => OnBoardingPageModel()); - - // On page load action. - SchedulerBinding.instance.addPostFrameCallback((_) async { - if (FFAppState().isLogged == true) { - context.pushNamed( - 'homePage', - extra: { - kTransitionInfoKey: const TransitionInfo( - hasTransition: true, - transitionType: PageTransitionType.fade, - duration: Duration(milliseconds: 0), - ), - }, - ); - } else { - if (isAndroid == true) { - FFAppState().device = 'Android'; - setState(() {}); - } else if (isiOS == true) { - FFAppState().device = 'iOS'; - setState(() {}); - } else { - FFAppState().device = 'Web'; - setState(() {}); - } - } - }); - } - - @override - void dispose() { - _model.dispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - context.watch(); - - return GestureDetector( - onTap: () => _model.unfocusNode.canRequestFocus - ? FocusScope.of(context).requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Scaffold( - key: scaffoldKey, - backgroundColor: FlutterFlowTheme.of(context).primaryBackground, - body: SafeArea( - top: true, - child: Stack( - children: [ - if (_model.toggleIdx == 'SignIn') - wrapWithModel( - model: _model.signInComponentModel, - updateCallback: () => setState(() {}), - updateOnChange: true, - child: SignInComponentWidget( - toggleOnBoardingPageAction: (toggleValueSignInParam) async { - await _model.toggleOnBoardingActionPage( - context, - toggleValue: toggleValueSignInParam, - ); - setState(() {}); - }, - ), - ), - if (_model.toggleIdx == 'SignUp') - wrapWithModel( - model: _model.signUpComponentModel, - updateCallback: () => setState(() {}), - updateOnChange: true, - child: SignUpComponentWidget( - toggleOnBoardingPageAction: (toggleValueSignUpParam) async { - await _model.toggleOnBoardingActionPage( - context, - toggleValue: toggleValueSignUpParam, - ); - setState(() {}); - }, - ), - ), - if (_model.toggleIdx == 'welcome') - wrapWithModel( - model: _model.welcomeComponentModel, - updateCallback: () => setState(() {}), - updateOnChange: true, - child: WelcomeComponentWidget( - toggleOnboardingPageAction: - (toggleValueWelcomeParam) async { - await _model.toggleOnBoardingActionPage( - context, - toggleValue: toggleValueWelcomeParam, - ); - setState(() {}); - }, - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart b/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart deleted file mode 100644 index b6955b01..00000000 --- a/lib/on_boarding/on_boarding_beta/sign_in_component/sign_in_component_widget.dart +++ /dev/null @@ -1,899 +0,0 @@ -import '/flutter_flow/flutter_flow_animations.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/flutter_flow_widgets.dart'; -import '/on_boarding/on_boarding_beta/forgot_password_component/forgot_password_component_widget.dart'; -import '/actions/actions.dart' as action_blocks; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_animate/flutter_animate.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'sign_in_component_model.dart'; -export 'sign_in_component_model.dart'; - -class SignInComponentWidget extends StatefulWidget { - const SignInComponentWidget({ - super.key, - required this.toggleOnBoardingPageAction, - }); - - final Future Function(String toggleValueSignInParam)? - toggleOnBoardingPageAction; - - @override - State createState() => _SignInComponentWidgetState(); -} - -class _SignInComponentWidgetState extends State - with TickerProviderStateMixin { - late SignInComponentModel _model; - - final animationsMap = {}; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => SignInComponentModel()); - - _model.emailAddressTextController ??= TextEditingController(); - _model.emailAddressFocusNode ??= FocusNode(); - - _model.passwordTextController ??= TextEditingController(); - _model.passwordFocusNode ??= FocusNode(); - - animationsMap.addAll({ - 'containerOnPageLoadAnimation': AnimationInfo( - trigger: AnimationTrigger.onPageLoad, - effectsBuilder: () => [ - VisibilityEffect(duration: 1.ms), - FadeEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: 0.0, - end: 1.0, - ), - MoveEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(0.0, 140.0), - end: const Offset(0.0, 0.0), - ), - ScaleEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(0.9, 0.9), - end: const Offset(1.0, 1.0), - ), - TiltEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(-0.349, 0), - end: const Offset(0, 0), - ), - ], - ), - }); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - flex: 6, - child: Container( - width: 100.0, - height: double.infinity, - decoration: const BoxDecoration(), - alignment: const AlignmentDirectional(0.0, -1.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 35.0), - child: Container( - width: 548.0, - height: 112.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16.0), - ), - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: const AlignmentDirectional(0.0, 1.0), - child: Padding( - padding: const EdgeInsets.all(3.0), - child: Text( - FFLocalizations.of(context).getText( - '9hbdjxrz' /* VAMOS LA! ENTRE COM A SUA CONT... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .displaySmall - .override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context) - .primaryText, - fontSize: 24.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ), - Container( - width: 291.0, - height: 167.0, - decoration: const BoxDecoration(), - child: ClipRRect( - borderRadius: BorderRadius.circular(8.0), - child: Image.network( - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/sr43ucngg4a4/Vector.png', - width: 603.0, - height: 155.0, - fit: BoxFit.contain, - ), - ), - ), - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 34.0, 0.0, 34.0, 0.0), - child: Container( - width: double.infinity, - constraints: const BoxConstraints( - maxWidth: 570.0, - ), - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .primaryBackground, - borderRadius: BorderRadius.circular(12.0), - shape: BoxShape.rectangle, - ), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: SizedBox( - width: double.infinity, - child: TextFormField( - controller: _model - .emailAddressTextController, - focusNode: - _model.emailAddressFocusNode, - autofocus: false, - textCapitalization: - TextCapitalization.none, - textInputAction: - TextInputAction.next, - obscureText: false, - decoration: InputDecoration( - labelText: - FFLocalizations.of(context) - .getText( - '1ltg0ylb' /* Email */, - ), - labelStyle: FlutterFlowTheme.of( - context) - .labelLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .customColor1, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .success, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - suffixIcon: Icon( - Icons.email, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 22.0, - ), - ), - style: FlutterFlowTheme.of(context) - .bodyLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - keyboardType: - TextInputType.emailAddress, - validator: _model - .emailAddressTextControllerValidator - .asValidator(context), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: SizedBox( - width: double.infinity, - child: TextFormField( - controller: - _model.passwordTextController, - focusNode: _model.passwordFocusNode, - autofocus: false, - textInputAction: - TextInputAction.send, - obscureText: - !_model.passwordVisibility, - decoration: InputDecoration( - labelText: - FFLocalizations.of(context) - .getText( - '2x19ce8k' /* Senha */, - ), - labelStyle: FlutterFlowTheme.of( - context) - .labelLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .customColor1, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide( - color: Color(0xFF1AAB5F), - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - errorBorder: OutlineInputBorder( - borderSide: const BorderSide( - color: Color(0xFFFF5963), - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: const BorderSide( - color: Color(0xFFFF5963), - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - filled: true, - fillColor: - FlutterFlowTheme.of(context) - .primaryBackground, - suffixIcon: InkWell( - onTap: () => setState( - () => _model - .passwordVisibility = - !_model - .passwordVisibility, - ), - focusNode: FocusNode( - skipTraversal: true), - child: Icon( - _model.passwordVisibility - ? Icons - .visibility_outlined - : Icons - .visibility_off_outlined, - color: FlutterFlowTheme.of( - context) - .accent1, - size: 24.0, - ), - ), - ), - style: FlutterFlowTheme.of(context) - .bodyLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - validator: _model - .passwordTextControllerValidator - .asValidator(context), - ), - ), - ), - Builder( - builder: (context) { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall - ? true - : false) { - return Column( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - onPressed: ((_model.emailAddressTextController - .text == - '') && - (_model.passwordTextController - .text == - '')) - ? null - : () async { - await action_blocks - .singInActionApp( - context, - emailAdress: _model - .emailAddressTextController - .text, - password: _model - .passwordTextController - .text, - ); - setState(() {}); - }, - text: FFLocalizations.of( - context) - .getText( - 'k44tm7wo' /* Entrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - iconPadding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - color: - FlutterFlowTheme.of( - context) - .primary, - textStyle: - FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .info, - fontSize: 16.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: - Colors.transparent, - width: 1.0, - ), - borderRadius: - BorderRadius.circular( - 12.0), - disabledColor: - const Color(0x951AAB5F), - ), - showLoadingIndicator: false, - ), - ), - Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - onPressed: () async { - await widget - .toggleOnBoardingPageAction - ?.call( - 'SignUp', - ); - }, - text: FFLocalizations.of( - context) - .getText( - '14u7ipws' /* Cadastrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - iconPadding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - color: - FlutterFlowTheme.of( - context) - .customColor1, - textStyle: - FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .secondaryText, - fontSize: 16.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: - Colors.transparent, - width: 1.0, - ), - borderRadius: - BorderRadius.circular( - 12.0), - ), - showLoadingIndicator: false, - ), - ), - ], - ); - } else { - return Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - child: Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB(0.0, 0.0, - 0.0, 16.0), - child: FFButtonWidget( - onPressed: () { - print( - 'signInButtonLoginForm pressed ...'); - }, - text: FFLocalizations.of( - context) - .getText( - '1x926nsn' /* Entrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - iconPadding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - color: - FlutterFlowTheme.of( - context) - .accent1, - textStyle: - FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .secondaryText, - fontSize: - 16.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors - .transparent, - width: 1.0, - ), - borderRadius: - BorderRadius - .circular(12.0), - ), - showLoadingIndicator: - false, - ), - ), - ), - Expanded( - child: Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB(0.0, 0.0, - 0.0, 16.0), - child: FFButtonWidget( - onPressed: () async { - context.pushNamed( - 'RegisterPage'); - }, - text: FFLocalizations.of( - context) - .getText( - 'jwvd4ai1' /* Cadastrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - iconPadding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 0.0), - color: - FlutterFlowTheme.of( - context) - .customColor1, - textStyle: - FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .secondaryText, - fontSize: - 16.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors - .transparent, - width: 1.0, - ), - borderRadius: - BorderRadius - .circular(12.0), - ), - showLoadingIndicator: - false, - ), - ), - ), - ].divide(const SizedBox(width: 7.0)), - ); - } - }, - ), - - // You will have to add an action on this rich text to go to your login page. - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 12.0, 0.0, 12.0), - child: RichText( - textScaler: - MediaQuery.of(context).textScaler, - text: TextSpan( - children: [ - TextSpan( - text: - FFLocalizations.of(context) - .getText( - '05dx91ku' /* Você esqueceu a sua senha? */, - ), - style: TextStyle( - color: FlutterFlowTheme.of( - context) - .primaryText, - ), - ), - TextSpan( - text: - FFLocalizations.of(context) - .getText( - 'p5c6d54y' /* Recupere aqui */, - ), - style: - FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme - .of(context) - .primary, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: - FontWeight.normal, - useGoogleFonts: - GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - mouseCursor: - SystemMouseCursors.click, - recognizer: - TapGestureRecognizer() - ..onTap = () async { - await showModalBottomSheet( - isScrollControlled: - true, - backgroundColor: - Colors - .transparent, - context: context, - builder: (context) { - return Padding( - padding: MediaQuery - .viewInsetsOf( - context), - child: - const ForgotPasswordComponentWidget(), - ); - }, - ).then((value) => - safeSetState( - () {})); - }, - ) - ], - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Text( - FFLocalizations.of(context).getText( - 'olf967cj' /* Termo de Uso */, - ), - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ], - ), - ), - ), - ).animateOnPageLoad( - animationsMap['containerOnPageLoadAnimation']!), - ), - ), - ], - ), - ], - ), - ), - ), - ), - ), - ], - ); - } -} diff --git a/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart b/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart deleted file mode 100644 index 48fa5cb4..00000000 --- a/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_model.dart +++ /dev/null @@ -1,43 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import 'sign_up_component_widget.dart' show SignUpComponentWidget; -import 'package:flutter/material.dart'; - -class SignUpComponentModel extends FlutterFlowModel { - /// State fields for stateful widgets in this component. - - // State field(s) for nameRegisterForm widget. - FocusNode? nameRegisterFormFocusNode; - TextEditingController? nameRegisterFormTextController; - String? Function(BuildContext, String?)? - nameRegisterFormTextControllerValidator; - // State field(s) for emailRegisterForm widget. - FocusNode? emailRegisterFormFocusNode; - TextEditingController? emailRegisterFormTextController; - String? Function(BuildContext, String?)? - emailRegisterFormTextControllerValidator; - // State field(s) for passwordRegisterForm widget. - FocusNode? passwordRegisterFormFocusNode; - TextEditingController? passwordRegisterFormTextController; - late bool passwordRegisterFormVisibility; - String? Function(BuildContext, String?)? - passwordRegisterFormTextControllerValidator; - // Stores action output result for [Action Block - signUpActionApp] action in SignUpButtonRegisterForm widget. - bool? signUp; - - @override - void initState(BuildContext context) { - passwordRegisterFormVisibility = false; - } - - @override - void dispose() { - nameRegisterFormFocusNode?.dispose(); - nameRegisterFormTextController?.dispose(); - - emailRegisterFormFocusNode?.dispose(); - emailRegisterFormTextController?.dispose(); - - passwordRegisterFormFocusNode?.dispose(); - passwordRegisterFormTextController?.dispose(); - } -} diff --git a/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart b/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart deleted file mode 100644 index db82a230..00000000 --- a/lib/on_boarding/on_boarding_beta/sign_up_component/sign_up_component_widget.dart +++ /dev/null @@ -1,770 +0,0 @@ -import '/flutter_flow/flutter_flow_animations.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/flutter_flow_widgets.dart'; -import '/actions/actions.dart' as action_blocks; -import 'package:easy_debounce/easy_debounce.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_animate/flutter_animate.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:provider/provider.dart'; -import 'sign_up_component_model.dart'; -export 'sign_up_component_model.dart'; - -class SignUpComponentWidget extends StatefulWidget { - const SignUpComponentWidget({ - super.key, - required this.toggleOnBoardingPageAction, - }); - - final Future Function(String toggleValueSignUpParam)? - toggleOnBoardingPageAction; - - @override - State createState() => _SignUpComponentWidgetState(); -} - -class _SignUpComponentWidgetState extends State - with TickerProviderStateMixin { - late SignUpComponentModel _model; - - final animationsMap = {}; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => SignUpComponentModel()); - - _model.nameRegisterFormTextController ??= TextEditingController(); - _model.nameRegisterFormFocusNode ??= FocusNode(); - _model.nameRegisterFormFocusNode!.addListener(() => setState(() {})); - _model.emailRegisterFormTextController ??= TextEditingController(); - _model.emailRegisterFormFocusNode ??= FocusNode(); - _model.emailRegisterFormFocusNode!.addListener(() => setState(() {})); - _model.passwordRegisterFormTextController ??= TextEditingController(); - _model.passwordRegisterFormFocusNode ??= FocusNode(); - _model.passwordRegisterFormFocusNode!.addListener(() => setState(() {})); - animationsMap.addAll({ - 'containerOnPageLoadAnimation': AnimationInfo( - trigger: AnimationTrigger.onPageLoad, - effectsBuilder: () => [ - VisibilityEffect(duration: 1.ms), - FadeEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: 0.0, - end: 1.0, - ), - MoveEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(0.0, 140.0), - end: const Offset(0.0, 0.0), - ), - ScaleEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(0.9, 0.9), - end: const Offset(1.0, 1.0), - ), - TiltEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(-0.349, 0), - end: const Offset(0, 0), - ), - ], - ), - }); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - context.watch(); - - return Row( - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - flex: 6, - child: Container( - width: 100.0, - height: double.infinity, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - ), - alignment: const AlignmentDirectional(0.0, -1.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.all(4.0), - child: Container( - width: 669.0, - height: 112.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16.0), - ), - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - child: Align( - alignment: const AlignmentDirectional(0.0, -1.0), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Text( - FFLocalizations.of(context).getText( - '49609olv' /* INSIRA SEU EMAIL E SENHA, VAMO... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .displaySmall - .override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context) - .primaryText, - fontSize: 24.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ), - Container( - width: 291.0, - height: 167.0, - decoration: const BoxDecoration(), - child: ClipRRect( - borderRadius: BorderRadius.circular(8.0), - child: SvgPicture.network( - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/ug2zlyhca2sh/Frame_5.svg', - width: 603.0, - height: 155.0, - fit: BoxFit.contain, - ), - ), - ), - Column( - mainAxisSize: MainAxisSize.max, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(34.0), - child: Container( - width: double.infinity, - constraints: const BoxConstraints( - maxWidth: 570.0, - ), - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .primaryBackground, - borderRadius: BorderRadius.circular(12.0), - ), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: SizedBox( - width: double.infinity, - child: TextFormField( - controller: _model - .nameRegisterFormTextController, - focusNode: _model - .nameRegisterFormFocusNode, - onChanged: (_) => - EasyDebounce.debounce( - '_model.nameRegisterFormTextController', - const Duration(milliseconds: 2000), - () => setState(() {}), - ), - autofocus: false, - autofillHints: const [AutofillHints.name], - obscureText: false, - decoration: InputDecoration( - labelText: - FFLocalizations.of(context) - .getText( - '3corpwhd' /* Nome */, - ), - labelStyle: FlutterFlowTheme.of( - context) - .labelLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .customColor1, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .success, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - filled: true, - fillColor: - FlutterFlowTheme.of(context) - .primaryBackground, - suffixIcon: Icon( - Icons.person, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 22.0, - ), - ), - style: FlutterFlowTheme.of(context) - .bodyLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - keyboardType: TextInputType.name, - validator: _model - .nameRegisterFormTextControllerValidator - .asValidator(context), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: SizedBox( - width: double.infinity, - child: TextFormField( - controller: _model - .emailRegisterFormTextController, - focusNode: _model - .emailRegisterFormFocusNode, - onChanged: (_) => - EasyDebounce.debounce( - '_model.emailRegisterFormTextController', - const Duration(milliseconds: 2000), - () => setState(() {}), - ), - autofocus: false, - autofillHints: const [ - AutofillHints.email - ], - obscureText: false, - decoration: InputDecoration( - labelText: - FFLocalizations.of(context) - .getText( - '80wonb69' /* Email */, - ), - labelStyle: FlutterFlowTheme.of( - context) - .labelLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .primaryText, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .success, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - filled: true, - fillColor: - FlutterFlowTheme.of(context) - .primaryBackground, - suffixIcon: Icon( - Icons.email, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 22.0, - ), - ), - style: FlutterFlowTheme.of(context) - .bodyLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .customColor1, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - keyboardType: - TextInputType.emailAddress, - validator: _model - .emailRegisterFormTextControllerValidator - .asValidator(context), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: SizedBox( - width: double.infinity, - child: TextFormField( - controller: _model - .passwordRegisterFormTextController, - focusNode: _model - .passwordRegisterFormFocusNode, - onChanged: (_) => - EasyDebounce.debounce( - '_model.passwordRegisterFormTextController', - const Duration(milliseconds: 2000), - () => setState(() {}), - ), - autofocus: false, - autofillHints: const [ - AutofillHints.password - ], - obscureText: !_model - .passwordRegisterFormVisibility, - decoration: InputDecoration( - labelText: - FFLocalizations.of(context) - .getText( - '0firji8l' /* Senha */, - ), - labelStyle: FlutterFlowTheme.of( - context) - .labelLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .customColor1, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide( - color: Color(0xFF1AAB5F), - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - errorBorder: OutlineInputBorder( - borderSide: const BorderSide( - color: Color(0xFFFF5963), - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: const BorderSide( - color: Color(0xFFFF5963), - width: 0.5, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - filled: true, - fillColor: - FlutterFlowTheme.of(context) - .primaryBackground, - suffixIcon: InkWell( - onTap: () => setState( - () => _model - .passwordRegisterFormVisibility = - !_model - .passwordRegisterFormVisibility, - ), - focusNode: FocusNode( - skipTraversal: true), - child: Icon( - _model.passwordRegisterFormVisibility - ? Icons - .visibility_outlined - : Icons - .visibility_off_outlined, - color: FlutterFlowTheme.of( - context) - .accent1, - size: 24.0, - ), - ), - ), - style: FlutterFlowTheme.of(context) - .bodyLarge - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - validator: _model - .passwordRegisterFormTextControllerValidator - .asValidator(context), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - onPressed: () async { - var shouldSetState = false; - _model.signUp = await action_blocks - .signUpActionApp( - context, - name: _model - .nameRegisterFormTextController - .text, - passwd: _model - .passwordRegisterFormTextController - .text, - email: _model - .emailRegisterFormTextController - .text, - device: FFAppState().device, - ); - shouldSetState = true; - if (_model.signUp == true) { - await widget - .toggleOnBoardingPageAction - ?.call( - 'SignIn', - ); - } else { - if (shouldSetState) { - setState(() {}); - } - return; - } - - if (shouldSetState) { - setState(() {}); - } - }, - text: FFLocalizations.of(context) - .getText( - 'rnvdwzei' /* Cadastrar-se */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - color: FlutterFlowTheme.of(context) - .accent1, - textStyle: FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .secondaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors.transparent, - width: 1.0, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - showLoadingIndicator: false, - ), - ), - - // You will have to add an action on this rich text to go to your login page. - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 12.0, 0.0, 12.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await widget - .toggleOnBoardingPageAction - ?.call( - 'SignIn', - ); - }, - child: RichText( - textScaler: MediaQuery.of(context) - .textScaler, - text: TextSpan( - children: [ - TextSpan( - text: FFLocalizations.of( - context) - .getText( - 'a9smhn5b' /* Você já tem uma conta? */, - ), - style: TextStyle( - color: FlutterFlowTheme.of( - context) - .primaryText, - ), - ), - TextSpan( - text: FFLocalizations.of( - context) - .getText( - '09xv5ctc' /* Clique aqui */, - ), - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - 'Plus Jakarta Sans', - color: - FlutterFlowTheme.of( - context) - .primary, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: - FontWeight.w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - ) - ], - style: - FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ).animateOnPageLoad( - animationsMap['containerOnPageLoadAnimation']!), - ), - ), - ], - ), - Text( - FFLocalizations.of(context).getText( - 'huygnka2' /* Termo de Uso */, - ), - style: FlutterFlowTheme.of(context).bodyMedium.override( - fontFamily: - FlutterFlowTheme.of(context).bodyMediumFamily, - color: FlutterFlowTheme.of(context).secondaryText, - fontSize: 14.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts.asMap().containsKey( - FlutterFlowTheme.of(context).bodyMediumFamily), - ), - ), - ], - ), - ), - ), - ), - ), - ], - ); - } -} diff --git a/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart b/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart deleted file mode 100644 index e794a1dc..00000000 --- a/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_model.dart +++ /dev/null @@ -1,11 +0,0 @@ -import '/flutter_flow/flutter_flow_util.dart'; -import 'welcome_component_widget.dart' show WelcomeComponentWidget; -import 'package:flutter/material.dart'; - -class WelcomeComponentModel extends FlutterFlowModel { - @override - void initState(BuildContext context) {} - - @override - void dispose() {} -} diff --git a/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart b/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart deleted file mode 100644 index 125b6ee2..00000000 --- a/lib/on_boarding/on_boarding_beta/welcome_component/welcome_component_widget.dart +++ /dev/null @@ -1,456 +0,0 @@ -import '/flutter_flow/flutter_flow_animations.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/flutter_flow_widgets.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_animate/flutter_animate.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'welcome_component_model.dart'; -export 'welcome_component_model.dart'; - -class WelcomeComponentWidget extends StatefulWidget { - const WelcomeComponentWidget({ - super.key, - required this.toggleOnboardingPageAction, - }); - - final Future Function(String toggleValueWelcomeParam)? - toggleOnboardingPageAction; - - @override - State createState() => _WelcomeComponentWidgetState(); -} - -class _WelcomeComponentWidgetState extends State - with TickerProviderStateMixin { - late WelcomeComponentModel _model; - - final animationsMap = {}; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => WelcomeComponentModel()); - - animationsMap.addAll({ - 'containerOnPageLoadAnimation': AnimationInfo( - trigger: AnimationTrigger.onPageLoad, - effectsBuilder: () => [ - VisibilityEffect(duration: 1.ms), - FadeEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: 0.0, - end: 1.0, - ), - MoveEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(0.0, 140.0), - end: const Offset(0.0, 0.0), - ), - ScaleEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(0.9, 0.9), - end: const Offset(1.0, 1.0), - ), - TiltEffect( - curve: Curves.easeInOut, - delay: 0.0.ms, - duration: 300.0.ms, - begin: const Offset(-0.349, 0), - end: const Offset(0, 0), - ), - ], - ), - }); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: SafeArea( - child: Container( - width: 648.0, - height: 208.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16.0), - ), - alignment: const AlignmentDirectional(0.0, 0.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(14.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - FFLocalizations.of(context).getText( - 'dsc9tuc8' /* UMA EXPERIÊCIA COMPLETA */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .displaySmall - .override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context).accent1, - fontSize: 24.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w600, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, -1.0), - child: Text( - FFLocalizations.of(context).getText( - '5bgqn16z' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .displaySmall - .override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context) - .primaryText, - fontSize: 15.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w600, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - ), - ), - ], - ), - ), - ), - ), - ), - ), - Container( - width: 284.0, - height: 200.0, - decoration: const BoxDecoration(), - child: ClipRRect( - borderRadius: BorderRadius.circular(0.0), - child: SvgPicture.network( - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/lv1waa0etd3j/undraw_appreciate_it_re_yc8h_(1)_1.svg', - width: 603.0, - height: double.infinity, - fit: BoxFit.contain, - ), - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(34.0), - child: Container( - width: double.infinity, - constraints: const BoxConstraints( - maxWidth: 570.0, - ), - decoration: BoxDecoration( - boxShadow: const [ - BoxShadow( - blurRadius: 0.0, - color: Colors.transparent, - offset: Offset( - 0.0, - 0.0, - ), - ) - ], - borderRadius: BorderRadius.circular(12.0), - ), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Builder( - builder: (context) { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall - ? true - : false) { - return Column( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - onPressed: () async { - await widget - .toggleOnboardingPageAction - ?.call( - 'SignIn', - ); - }, - text: - FFLocalizations.of(context).getText( - 'dynet730' /* Entrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - color: FlutterFlowTheme.of(context) - .primary, - textStyle: FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: 'Plus Jakarta Sans', - color: - FlutterFlowTheme.of(context) - .info, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors.transparent, - width: 1.0, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - showLoadingIndicator: false, - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - onPressed: () async { - await widget - .toggleOnboardingPageAction - ?.call( - 'SignUp', - ); - }, - text: - FFLocalizations.of(context).getText( - 'hha60cg7' /* Cadastrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - color: FlutterFlowTheme.of(context) - .customColor1, - textStyle: FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: 'Plus Jakarta Sans', - color: - FlutterFlowTheme.of(context) - .customColor3, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors.transparent, - width: 1.0, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - showLoadingIndicator: false, - ), - ), - ], - ); - } else { - return Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - onPressed: () async { - context.pushNamed( - 'LoginPage', - queryParameters: { - 'device': serializeParam( - '', - ParamType.String, - ), - }.withoutNulls, - ); - }, - text: FFLocalizations.of(context) - .getText( - 'zvtay8ee' /* Entrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - color: FlutterFlowTheme.of(context) - .primary, - textStyle: FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .secondaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors.transparent, - width: 1.0, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - showLoadingIndicator: false, - ), - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - onPressed: () async { - context.pushNamed('RegisterPage'); - }, - text: FFLocalizations.of(context) - .getText( - 'o6zob50a' /* Cadastrar */, - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - padding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 0.0), - color: FlutterFlowTheme.of(context) - .primary, - textStyle: FlutterFlowTheme.of( - context) - .titleSmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: FlutterFlowTheme.of( - context) - .secondaryText, - fontSize: 16.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), - elevation: 3.0, - borderSide: const BorderSide( - color: Colors.transparent, - width: 1.0, - ), - borderRadius: - BorderRadius.circular(12.0), - ), - showLoadingIndicator: false, - ), - ), - ), - ].divide(const SizedBox(width: 7.0)), - ); - } - }, - ), - ], - ), - ), - ), - ).animateOnPageLoad( - animationsMap['containerOnPageLoadAnimation']!), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart b/lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart deleted file mode 100644 index d56459f4..00000000 --- a/lib/on_boarding/on_boarding_legacy/login_page/login_page_model.dart +++ /dev/null @@ -1,113 +0,0 @@ -import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; -import '/backend/api_requests/api_calls.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/custom_code/actions/index.dart' as actions; -import 'login_page_widget.dart' show LoginPageWidget; -import 'package:flutter/material.dart'; - -class LoginPageModel extends FlutterFlowModel { - /// State fields for stateful widgets in this page. - - final unfocusNode = FocusNode(); - // State field(s) for emailAddress widget. - FocusNode? emailAddressFocusNode; - TextEditingController? emailAddressTextController; - String? Function(BuildContext, String?)? emailAddressTextControllerValidator; - // State field(s) for password widget. - FocusNode? passwordFocusNode; - TextEditingController? passwordTextController; - late bool passwordVisibility; - String? Function(BuildContext, String?)? passwordTextControllerValidator; - - @override - void initState(BuildContext context) { - passwordVisibility = false; - } - - @override - void dispose() { - unfocusNode.dispose(); - emailAddressFocusNode?.dispose(); - emailAddressTextController?.dispose(); - - passwordFocusNode?.dispose(); - passwordTextController?.dispose(); - } - - /// Action blocks. - Future signInActionPage( - BuildContext context, { - required String? emailAdress, - required String? passwd, - }) async { - String? devUUID; - ApiCallResponse? loginCall; - - await Future.wait([ - Future(() async { - FFAppState().email = emailAdress!; - }), - Future(() async { - FFAppState().passwd = passwd!; - }), - ]); - if ((FFAppState().email != '') && - (FFAppState().passwd != '')) { - devUUID = await actions.getDevUUID(); - FFAppState().devUUID = devUUID!; - loginCall = await PhpGroup.loginCall.call( - email: FFAppState().email, - password: FFAppState().passwd, - uuid: FFAppState().devUUID, - type: FFAppState().device, - description: '', - ); - FFAppState().userUUID = FFAppState().userUUID; - if (PhpGroup.loginCall.error( - (loginCall.jsonBody ?? ''), - ) == - false) { - FFAppState().isLogged = true; - - context.goNamed( - 'homePage', - extra: { - kTransitionInfoKey: const TransitionInfo( - hasTransition: true, - transitionType: PageTransitionType.fade, - ), - }, - ); - } else { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => unfocusNode.canRequestFocus - ? FocusScope.of(context).requestFocus(unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf(context), - child: ThrowExceptionWidget( - msg: PhpGroup.loginCall.msg( - (loginCall?.jsonBody ?? ''), - )!, - ), - ), - ); - }, - ); - - FFAppState().email = ''; - FFAppState().passwd = ''; - FFAppState().update(() {}); - } - } else { - FFAppState().email = ''; - FFAppState().passwd = ''; - } - } -} diff --git a/pubspec.yaml b/pubspec.yaml index 19887d02..a0fbd98d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,13 +27,21 @@ dependencies: sdk: flutter auto_size_text: 3.0.0 cached_network_image: 3.3.1 + carousel_slider: 4.2.1 + cloud_functions: 4.6.7 + cloud_functions_platform_interface: 5.5.18 + cloud_functions_web: 4.7.1 collection: 1.18.0 - crop_your_image: 1.0.0 - device_info_plus: 9.1.2 dropdown_button2: 2.3.9 easy_debounce: 2.0.1 equatable: 2.0.5 file_picker: 6.1.1 + firebase_core: 2.26.0 + firebase_core_platform_interface: 5.0.0 + firebase_core_web: 2.11.5 + firebase_messaging: 14.7.18 + firebase_messaging_platform_interface: 4.5.26 + firebase_messaging_web: 3.6.7 flutter_animate: 4.1.1+1 flutter_cache_manager: 3.3.1 flutter_plugin_android_lifecycle: 2.0.17