From 652e83bf38426cd29c394db5271bd77ebb8882a4 Mon Sep 17 00:00:00 2001 From: petegregoryy Date: Thu, 24 Jul 2025 22:59:50 +0100 Subject: [PATCH] add data service and homepage data retrieval --- .vscode/settings.json | 1 + lib/assets/fonts/Tomatoes-O8L8.ttf | Bin 0 -> 206768 bytes lib/components/login/login.dart | 6 ++- lib/components/pages/dashboard.dart | 58 ++++++++++++++++++++++++++++ lib/main.dart | 54 ++++++++++++++++++-------- lib/services/apiService.dart | 1 - lib/services/authservice.dart | 6 ++- lib/services/dataService.dart | 51 ++++++++++++++++++++++++ 8 files changed, 157 insertions(+), 20 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 lib/assets/fonts/Tomatoes-O8L8.ttf create mode 100644 lib/components/pages/dashboard.dart create mode 100644 lib/services/dataService.dart diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/lib/assets/fonts/Tomatoes-O8L8.ttf b/lib/assets/fonts/Tomatoes-O8L8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b82f99a7ee6a1b007f224c645324a281f64e6f24 GIT binary patch literal 206768 zcmeFZcX%B~xj#O$<@DV>WlwK=dOwoRQSXu^%aSEowq#rGcHCF4#BqX^B zA)yxo0h|N~E%ZydlyK=6!lhg~fdEOgzt8NEoDlfJ{p0sMzvuTn-+9k$J3F&8@4Ri^ zd3OmVggCJg2$`IlU9tM&{2U>ss|lgSRkKaCogXM}!SPMFYx}y9srfyhIs7Cc=64bz z{&45v9p{DqoXioDFXP(7J1;t>iQf^wPe^Mg?q9y=yuF8y<)v0an!Z8^_uqRDUApJu z{kFg2|Emf2U&r_DI($j@?6007M7oub&_nxn@7N`GY7gUi4wP@-hYO|;>wm!c2+q^{ z4j;Q@?VVq~ALl$i2r%|HDTOm`>B{irq(%k_ zdBG(70c|LW5AwS;LOdVC4fHwT9oXTN?njYv{ny4mK|I_KNsbGXB)xFq%iKp6)^RKJ z&(Rz71)6?IIxik7NQSOi2`xnk||Dk`0egxF=EB#6OZo+fJ`U~`H zB+ZA&3Qk%$%{48gxQ>P8;(-1q{%a_+p#MeKqJNtY=nLEj^~d>xdY!*Z|2;oMD1WE^ zI(|t16@LR6GGC^DpZ_8e`MU_mAJ>1x?<7t9>vf$zO`5nr5eFC6U*i6xF9_>^onJ5f zUigK+AU>*ppNr}bpspJ7E`EsKPrpbWravI}a8u+IeJA-O{W;G6N*<+mlVkK*ayu6x z598i-T#S5@kmnB*^4A~ZoUrz?%-YM^%IaqAF`j)3q1->p42QtqE3<(=hQn9nv-o2; zd}Rji82-*?{3pB_cp1ldynu{;GJMj9$O)qz3=hZ#o*1rJ1|Ef7`XAY`Wxf6<)3c51 zOZ{R0pUvo((Kqyy{*qXhj*aob7+}0B2F@|IOV4I_X5-1NCI3NFOM85&L1X z*T5NY^XfgrBggRbf7r8Ua^EL8V-Gqs=mWU?mwV6;qg6&n#@+`SWo`f7;-1kg&JFqn z9Wxr^-oEf=(^ngKVB^B@@#;OJeMXmO_lwUkXbkkfv}a>!&;`co@AjZs#v6=wjXk4Z z;BpD4OMAv|2G0SnOZYYRjCU~R1}}lu4Z2`s&S>Oc?7=5|gICZ$#)~Nb%Dr&j!k2}Q zE_|6!A>W7bWxUAvu9Vn6*Bt2$xJFzN>{S9xMN57O*T&1Ap>^H$jXj7+Zz{*OU56pJaP&DtnBGv+r@;7 zwB9(z(Fi-LkFW|}ktT6G!XAjk?!^%+ws;qNQqSbeMS6OS8y7e1Ic&YUv&w1YZ)$A(#fmlh)M$&*AckFNk;buu{Mn)t3vuXwfgY0dKNA~K z^yi74ICYF9aqE9167lHI5t(?QK^5ZDe@~nwfUS!J_1_UU3F*Hj9um=iLsSyge@(n3 zuK$Yoh^GIN_(>Am07>cpLxLo&|AK@_R{uE(lbrrD5+McsrzA>>`hSxcDeFHWaZACn|$(SJlzq^|!LNt0Inha^MV^&gNd>CnOZqzl_T>DIqT3ZzH>E-8{e z{X3*Y`t@&nJm}8Nm|I5{talw75djnolNLoBduhm z{vV``OzB@G?PMC;4l<*Eg>;hD`j<%;nbp5Uy2+gW@1%#U)xSu3$$I?@q>s$&pC|of zBenx%lm0nq(JlIC$q?D9e})W`ZThFlGO|N|nv9Th^iPpdvJ2bgWVilFGDi05pCBv9 zKKx4i|sTyU;i*!MULuEk{NPLe}b$g7wV6b zHRK}w44EaD=pQ0;d4iZr0yLwv$`*cak0CR{b619CEwCi}?U`lDn&xkrD593c1VZz2cD8?Ze@?$;kChsgu_8_5y! zp#Bg!mpr6DNX{b<>;Fd1CvVapAV;SO$Zg~c`t{^?^6&a}v?pE@{E2Zxtn}Tzkav%Ajekr-1 z{Ficagv7`^me> z3;I6t9`d5Tmz*XG*uIzO`X2H=O7-33{gl&pk;kZ@?}Sbk^>fGvsY%~KK1410c5;SV zv3;D{^=;${>d?26C#kG&As?oSzL|W4I`vKDqtvZ$Bu`NfwjZNjeFOP8_388E6EvW& zhYc0f*O5=ru)dZ&O(Xgo`818{v*a^0j_qfurmrENqe*==`8-YOGvo_2qpu=gq*;BM z{5#F*Q{+pupih!7(;~KCp=Es~`6{jG6R;?n^l|bv+N`f2U#B&FjC_OE_2uN7v=!TD zXuCd2zC}Cq5%Qn3OJ7F5O}q7B@*Uc%50UTEK7EjUj}GVq*L%p1>6qS4o~7e@7x@XD&^yV0)0No%luqd#2oa}^@ zHVKGD0@fwFRYc{imj<3BGXtaZsNQZyXRx=jeu!4H)od|vVdAZ3mw_b#I5J^WWwUHH z+e{4DbsH+R0VSvxIIu7bF9Dj3WVP5G7F6gK1?*(t$_h-`&@JEz`E0WLffE$Qg9IMq ziE4lVkbxCFQ|uN8kYlp~ymsvE=!(T*k)0;c1iOo&3N6HhS5Yihr+pDm267BMEfSc? zWHvFRm{{xVcDvPK_j~M$f@-W5MYJjo8%Eq>l1*lYCqXeYV0{8^fMIloA;JKg#b&V@ z7%=lTi>E;|R)!mk&1rF>eiH+RNk&F?h9?;Sq@2YP8X~gMx3aN9ITfcilm)7dV(eew zi8Zg093jw|*$O-vH07|cp)!HMY#=PB!^%j?ZUguoY!CEVC9C2xfhN#*&>Vg?Ga)vY z(`s{peT-yKkwH{ot46YzL2Y1bJl5fG*d#~D>u@?zjm_#b*_@KmHQ)w#!f3MovQ`5? zCK8@$5Q#x5c2Km{z=c_`Tf7aLfiN)R50}Mdu{g{O*!2d+z(fq|7;RSHB8VazeVbKQ zY$)f$sU2lejfoXw{}O>w{$i3Mpk%PWXtjX!*qEa;CeSw|g4re66cCYvK~QpF3!KvT)0qZV> z$s?QD3Bkjdne~^ox&aEB!H(?4x!r2F+6)0^5gb;3gJwYapnZqO>akiS3j>CuhL{sY zvkNuj$)K4f!0;m3?TXWeasiy$Q5Mx0#n>q(;%MGtQZ&#R2FPRwO1X?Y-XeHu)Ew2*(OKKCe-S)p&FwYJ0+qGl)spq zNyhUIv>!Zy@kBKaGi0|}0%3Wb4s=ddBt??rP9RD#1NUx+>bEjHfiEDMEno_UC$B^D zD^deb25K0d%=RTLS*;#Wq}7b)I-O3*?Mz0TUa!m$<+Vs&w`^8G5Gn)@V`i_70Ul<6 z8_#6C2QtAH=&(z&1vs#YiajDP;t9C1%YM7xZg*N4Fh!tP7ywTyz#%Qw$M#UOk^@h7 zdnA;L;#5Xi37UWvWB(Epqx{9>N<#qR;U)*;2@A-FDQnQT4CeK_By>)3%1&8HxD-WJ zSVKLMH)xe*8H&q56-JT}+3%O6pi^#;sev3rE-exm(*-J!Vl(5pE|*L8xY99~-;Zh} z$#0ST9@ZfVxB;HPvaG*oHNy?S4-IG2ExGRbSObb(BW{| z7yy$7mKdH4tb;3TF9Xyp;}eI+E2CW8VwMz?m2HYq45uvp@HUUwns4uw#SqJ*qU$m_DAa(jS@J@9?V!GOsnwA|*!Gud$iT#`#t z*zGQd$t5M65Iq2}CjJOZVUUQO0aFCVT_7FQ8vtK0N?ZafB)AL-;PWeP$(6ENWEaXh z9WE;?hEpdoJMjNv@>ZAxfB~R5AjNH743+{#;IKj>I3ixB-=(-c4DzbSL9Z)M7H4<^T-7aUu z=8E_|HdGGWz=8rjM`Q+gm;rvpuP_l zaTj#3fpv_w<7Kef*yuZ*fso6icyiFXZj^OP9vdshP6<$VHU;X8n%$DsB}0na{Vx1x zci3b*C|%Y9?y$$@^{IfW-|O}I>~6^&cE?f@`U+tRCbc;vRU$;yG`A<^cLNPb22&f% z=UO6MXad#kmTW+<-|tt${(8}`X{g5I)*K!!?6dnI3}Z6vM2x29WPpbm5XLh-;CIG< z;Ch$W<-zTCpJMhoiylMxsIpJ?xzv;^<#PFD241@tRWbnS#N-$xkz0Nl>~>@P-QlRm z=kk^9Hn$gLRmEo%!>LNFY(y7RxEpMvsEWX&{bmHNO`M6weKX zLcUn2yE&9j`+YvIFD-e~v49kmR3)h}JJD`UyBT=F_9}7=&t%692zUY>Z$JV#EkSpa zfib(!8FU6cft)Aj@r0ZV{0={i83xdRNr38AoiBsKfpd&}JmEvR8cqW!>vIMqRt%>; zVsoRHiz(U~U}?W)Ueamx|arFtdV;ezgRI&%@9=2wH^KqwIEjD$kLu;g?4G+(;t z3~hG8Lv{w7gamRqpT8LOdyHft$H0?%mU3OGfY0Z2;JJ}VB#?;o*CV+cs`2}C zvOlMVrk$`8fhX2q*6IdmUd`(Vzk~m<4XQ!aACduXOGvFV(F1UWU12p?REw$_ zaWP;R3Zv36bPMWDJAHl-&RLKooC6Xme^?E*Ne*8SWdrVz%!=VOKx`f~Z!u{jU~E^w z*csw3X$45HjrBWyy4hBokU@09{qRxOj?`C$Q zWGi_Y1YJQ_z#Vj@{pkQZZa~Br@da_a67^W4zRs}208i8t^+l?_s?QhqFkl#pIvF?| zs5kEp1Q{hRfui6Xkj{l-zG#mk2O=mN_Cys{45wk@@PhIeQ(`&rkpES*fm6RwCFDMXsuRM3RW?Q^=JW7Ig-Y~wApNVF{-X^^QQ{0s>mGWeU(n6Dg< zgjEGhmrkeS#q_G7bgdSPgG_7gXswWNCEO8j6I2DP7Dp|>01s26$c1nr9K})0!?s#T z3q=!d6!6)T!J)WpfG_DwhP1X&TPT$FF^D_kPTU2MWp5QVN1_q$%iwb198j#plA**1 zw62D-abLp4is3X)q(JO!DsEJQia+jmMuSdAP%T7*(U`{zwVm+!1Dyq}DG|-&QrT2? zrjX5~a~{pFHEC^q{!}XEQG;%{P8)tp!Jw*_D)I-PQ7m;oMUKvTRap71C9N#uk- z6U{^uSrrg;WTWFLrvbrSFc;1AMf;-BLXbh)llJ7i450km0&RXRp#@$Bj|b-oE!A94 z=AzjtXx$9Trh-|O74x{`DWZgvXH)eYh?ih8=+eS&DdMYWVJ)FTZF@oKq5ev$p4Rfk zY%yDyuM`XUqBj*x)l=QW!E83`^@UZx-{T8rgM?)J`%~%RN~$pc267DM)0PM~6z<5S zk|7T;Q>j$4t(9|DSNi)=O*-B0PxsdgzM?-B>JBkG(XI5y7~o+Lkf~rjSx=^M)PTH} z*U|+aAR-mxGg-F*;bOR`<%hLlO{;_%DHDEUghN|1ragL(%d*?czoGWh*C2Xyu2 ztEtLnzb{)x*fV01t~6 zk$dyK`BD@RW80=|Q?}F+Y6-R^oGqEH6|VtWO{-;_rnA%8Y^%ng8mIn)DSRS8?H#awjBgtSS8i>T3}kJ;^>;d3*2-E1d8jm0s>ZAFCXH?Dg?gdd8fgu;rd)0L-7Qd4fMi>;tx%uK&*k%- zNd~o0Ez}le;PWNM6XROBT28(UP_tD))9~`9_I&HXP_SGt%;lR?tzlLy6f89pZ?@@d zT6RYu7s#}vgH5@RT8Ixd<*LoGL^Ky~OJ%YfhwCfbntJ*=`#O8C9_sJy?vK^e^@-Zt zjx_oj*K*NBGOVRL(}Z+x+*ohhF;s61Kn5x;ZCD;nxy6*t&2-jl*+{)!9~v6!Tsd^d zMME1mc60*$8xw6CSN6vH6Sd4-HqY#J-^Mb7dZqy@TUNHTrI(TNp*PNo#iF%N5-7KyO)DP?m&1jQe59=$^;J^it>xDCL`EwmdvnFo?(wdf z{*nHXJI6!psN7L zcNOM3<~n-vOEBCv+}1Oa9!ZT*snbf+5+YYt%S4L8-SW@fkC*hX9vkB`{d?O3bE=IUT zaD^hWEK5urJSIkf0yNq`PBiq7ufOW**~qq6U0*z<5gMg28mAgf&?HUKG|jx~&M+br zqKHh06OAMgiI74BLI#lsIYbKN5pPgLoIx4!1y#fqG$Wp%hB$%|)G=z*(@(?b6OV{U zk(h`XQ5IH2SJ)9%At9PVK@^1x(Gwm-O?VM4;YXB25YZ8ccU)}67~%rP5f88uaR5_T z|6hd_{~4_J&tjc_Emro|VO@VCR`NGv1%E46?zdyb{v52-@4^cG9<0p&ZE9OQ?L#aA z!HW9DfBW~V&h}$Xe<}TF=>V(f1Z(b>V-5aNtk2(pv)5w%`xMs0SvrjM{v(K+VCf*@ z00`E@8|iwiyq~~&{MA^WzY^>97hD|M`doI2Vx#9f+vtMw~@2qAUgwIWdU1 z34!}4if_iTh;e{h7NgK*V1o5}3;KE)TJu({X+K8JkZ+Rjk>8L%k(aOr8mA>XPFK_Q zbQ`^jzJ?2OpW(h2yB;%vpcd7#+KBdu_7?4(e?~~u3npDR8p&#J#*-PIS?$|_$)(yq zL_S8oMSehjNB)f32`HwDu%b0|o^D6&0q)b>w_;bL_J9^KYJbyW?c@a>(OW?(A%f+X zh({raMj?oMA^Jo5=k@#aTM%{dHwiHfNQgNgh%X@e%)$%o{70Am@HpH5aLW&iKivMq ztv@(v0dI&eF7gihi-0Z&sDm`3r`QFg6`-Drfc1wE74R6&-$y=+?Tg?pf&ESU>7cP+ zPFJw~QlkCFQ7dSkClUXQV7RCx*L@@mw59me#+#WB4Bbb6GHD@J7!)OD^g zwo{0tXah#4LAz_vzF9A?-*vxmDkZ0JTk z0;>l_aQn#(sNuk34cHr(nqI<9VtJ)@n$OP6ubw}B^+@>i;K+t>BB70*{@Bd?>5q+s z6B{<*F4NhTqQzJ24=lFXj5eE!_}|i~Wp@7bVE8oIaPlOpb9O$JIDPfWli`!-$Kv@J z^08N4pybsT1{W^?6Q~227(GL;o ziK9fHf)TbB=35(#JU9x7yYv){vMZpBCU7macqIhYw$ZrKxCdIu^LIC?ue#|eJYnD8 z6nhF*-=cg<(LtO2Aozc)^$@T%|CIxJJtbcJLIs&}ezlXt@O~Hye#w z0Y$}H&aPO{sP$0b9cS;cLfNt_OQp~k`gg^+zbnSSs@PL#WTP)j6+MLpHu|!31+7N> z2Qi~Bq|q0&3f6BKmU9Q9Xvd*L8^^eeH&6(73UA|l`s_VzuefLF4%kb==Wv3X^woQ!6yxGK=`}vOc7-yELxu4>Qn#{P){;F~v_^+SK8fRvcPo}vlOrnl{ zGyY%)C}Z;VQ?Bk2oUvGt-}{a(rE_>R3az4e*5BLa@kJDY zGZhBcG{u^Orl2-4HJPyUloMTQLh)20rbM-?x3{AroBgrW!UL|HI=B`~T(Ok!S|Qoe zQA>;OTKLaP+)d>;M?Kk&M0qOdTRvs#1Si5HTo_qeDwNXb`SMh}_T+I<@HW_dVDn`~rWbQ5WyRcg%*h>+- z{Zk=Askwy$M_yItfEL=mh!k%OxDY$~sgL0-SLJiret`}Ki&3Xp@yVgQhjV)4RyAJV zFqEeK<=Va->xK&g;uZu+J96V)V{Khw6Iz?7kF2HN670d0>WhbbQh*D@MRTbbHcJCD z>(Yfh$E8|(+OmRTviT%!%i11Fw7$XecxdDYn2 zmSdn~nBm3>&?=A4Y zfLkapo1L8u2f~s_c}WiRjjqgu3Sq>R)u(rIBgOf(Q}N*&&l~4CtZc{WbG#>6DyFd9 zPJIDeF&D5{3LSkN1xr0=YcKix)AOHs`U5wu;`phK75Ck9`z2d~1N*0nlq>a(^_6*_ z5;4_R%#4&h;i%0!-4^aBhj~tp*K^7JdscG8!wBFbkEyNfIn^33CVu@zN4vnkB>?OR%jaSmF}q zToNo|33jtYoLh!Ou)G8@ClT&^jFB7TmO|xEg1b409-;IEX1^BF;c|B|ioO)H>4*F>(8HNy)ZZ_fA-PmW$_;`x zWkKGI;2DuqM*h6t*DnB5Ib4#dAN0;{$Z>L@5*6LnL^^K1=f!QVjH`BF=eoX_3E@v1 zP4~}j-&c1?9L@GltQ-l{qmik0e~ROl4Yyu+?ELMM3q9#&vFfrMB2QX|#s`W#XMGY2 z{m~+&Tj8O%2Oazi2?w12)>J-Y`{Bau6C&0=R;^jt9Y<`g

P8cWU)2Ei_rr@7T3< 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Ɖ%j;nI*Dy~;8 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∾Nzv}T!oIFYl;CMG7XG_r{Jh%k{_4D34aXSB^NMN z#cP22rH$b6O+ppV|P*exzTdEesJj!ij z-F6IfJBGOvf!1uS+s3+WtlReMeiLA)Hr8!p-RO$oGK{d$&4{-EI|@CP2qr~za1rS` zpdts;2Rv3!z|Tf5f3ErXnr{TpFPMT%V~cTtfifO3BH| z7Jyv)x#Gno!;}p!>9V0<(;Nf?pa8GB-$^lF3GBDAZX4^iv2Gjdwy|y->$b6O8|${Q zZdXV{5PMZZ7=GE*Vm8)oW8F5^z1d;MFt;`-wPTovl5l7yKgF0hYe6lhMfGZK?c3a( zZb<_53O1)G=y?p@%UTepWH=C>^HvM?gKbJ5JAq%}B;v?p>*x^nwno5&l(?LTW2b5Q&+_>voSu5EDKI@nXPCC>HKEjXyk(A# zp7LpdEx^PE;}nSjYBjPtAR7Xh8=&)xC1N(#ZSU9Z<*61#oUpNOvX7zJ0z}Zpx^1i* z?ue2d!`zNx4kZieS!}G^#=32++s3+iw3OReH&=~f?4~LM?5Du}h7T102TaewS}&tm5;GRpPyQV~kZ@$5{0fjMX6j+TSr&|0Tv6 ze!*DNvy7!07;CWo$9Nzw{Oycy`$u z93N$DxeEu%v4Y{~!hvtCc!9B%H8_yZ%0Du;svHOMS#4OyT9l~=`K?zN+wdr38&QVM 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 literal 0 HcmV?d00001 diff --git a/lib/components/login/login.dart b/lib/components/login/login.dart index 5e3e691..229e693 100644 --- a/lib/components/login/login.dart +++ b/lib/components/login/login.dart @@ -167,7 +167,11 @@ class _LoginPanelContentState extends State { } class RegisterPanelContent extends StatelessWidget { - const RegisterPanelContent({required this.onBack, required this.authService}); + const RegisterPanelContent({ + super.key, + required this.onBack, + required this.authService, + }); final VoidCallback onBack; final AuthService authService; void register() {} diff --git a/lib/components/pages/dashboard.dart b/lib/components/pages/dashboard.dart new file mode 100644 index 0000000..8924fa4 --- /dev/null +++ b/lib/components/pages/dashboard.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:mileograph_flutter/services/authservice.dart'; +import 'package:mileograph_flutter/services/dataService.dart'; + +import 'package:provider/provider.dart'; + +class Dashboard extends StatelessWidget { + const Dashboard({super.key}); + @override + Widget build(BuildContext context) { + final data = context.watch(); + final auth = context.watch(); + return DashboardHeader(auth: auth, data: data); + } +} + +class DashboardHeader extends StatelessWidget { + const DashboardHeader({super.key, required this.auth, required this.data}); + + final AuthService auth; + final DataService data; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + Text( + auth.fullName ?? "Unknown", + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + Text.rich( + TextSpan( + children: [ + TextSpan(text: "Total Mileage: "), + TextSpan( + text: data.homepageStats?.totalMileage.toString() ?? "0", + ), + ], + ), + ), + Text.rich( + TextSpan( + children: [ + TextSpan(text: DateTime.now().year.toString()), + TextSpan(text: " Mileage: "), + TextSpan(text: data.getMileageForCurrentYear().toString()), + ], + ), + ), + ], + ), + ], + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index c497338..911ae18 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,8 +2,10 @@ import 'package:flutter/material.dart'; import 'package:mileograph_flutter/services/apiService.dart'; import 'package:mileograph_flutter/services/authservice.dart'; import 'package:mileograph_flutter/services/dataService.dart'; + import 'package:provider/provider.dart'; import 'components/login/login.dart'; +import 'components/pages/dashboard.dart'; late ApiService api; @@ -39,13 +41,13 @@ void main() { } class AppRoot extends StatelessWidget { + const AppRoot({super.key}); + @override Widget build(BuildContext context) { return Consumer( builder: (context, auth, child) { - return auth.isLoggedIn - ? MyHomePage(title: "Mileograph") - : LoginScreen(); + return auth.isLoggedIn ? MyHomePage() : LoginScreen(); }, ); } @@ -92,7 +94,7 @@ class MyApp extends StatelessWidget { } class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); + const MyHomePage({super.key}); // This widget is the home page of your application. It is stateful, meaning // that it has a State object (defined below) that contains fields that affect @@ -103,8 +105,6 @@ class MyHomePage extends StatefulWidget { // used by the build method of the State. Fields in a Widget subclass are // always marked "final". - final String title; - @override State createState() => _MyHomePageState(); } @@ -120,13 +120,22 @@ class _MyHomePageState extends State { ]; bool loggedIn = false; + bool _fetched = false; @override void didChangeDependencies() { super.didChangeDependencies(); - final data = context.read(); - if (data.homepageStats == null) { - data.fetchHomepageStats(); + + if (!_fetched) { + _fetched = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + final data = context.read(); + final auth = context.read(); + api.setTokenProvider(() => auth.token); + if (data.homepageStats == null) { + data.fetchHomepageStats(); + } + }); } } @@ -135,6 +144,7 @@ class _MyHomePageState extends State { Widget currentPage; final data = context.watch(); + final auth = context.read(); if (data.homepageStats != null) { currentPage = contentPages[pageIndex]; @@ -160,9 +170,26 @@ class _MyHomePageState extends State { backgroundColor: Theme.of(context).colorScheme.inversePrimary, // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. - title: Text(widget.title), + title: Text.rich( + TextSpan( + children: [ + TextSpan(text: "Mile"), + TextSpan( + text: "O", + style: TextStyle(color: Colors.red), + ), + TextSpan(text: "graph"), + ], + style: TextStyle( + decoration: TextDecoration.none, + color: Colors.white, + fontFamily: "Tomatoes", + ), + ), + ), actions: [ IconButton(onPressed: null, icon: Icon(Icons.account_circle)), + IconButton(onPressed: auth.logout, icon: Icon(Icons.logout)), ], ), bottomNavigationBar: NavigationBar( @@ -189,10 +216,3 @@ class _MyHomePageState extends State { ); } } - -class Dashboard extends StatelessWidget { - Dashboard({super.key}); - Widget build(BuildContext context) { - return Text("Logged in"); - } -} diff --git a/lib/services/apiService.dart b/lib/services/apiService.dart index 933fabb..5f0baa4 100644 --- a/lib/services/apiService.dart +++ b/lib/services/apiService.dart @@ -1,6 +1,5 @@ import 'dart:convert'; import 'package:http/http.dart' as http; -import 'package:mileograph_flutter/services/authservice.dart'; typedef TokenProvider = String? Function(); diff --git a/lib/services/authservice.dart b/lib/services/authservice.dart index d204009..23e7366 100644 --- a/lib/services/authservice.dart +++ b/lib/services/authservice.dart @@ -1,4 +1,3 @@ -import 'package:provider/provider.dart'; import 'package:flutter/foundation.dart'; import 'package:mileograph_flutter/objects/objects.dart'; import 'package:mileograph_flutter/services/apiService.dart'; @@ -65,4 +64,9 @@ class AuthService extends ChangeNotifier { email: userResponse['email'], ); } + + void logout() { + _user = null; + notifyListeners(); + } } diff --git a/lib/services/dataService.dart b/lib/services/dataService.dart new file mode 100644 index 0000000..6a07cd0 --- /dev/null +++ b/lib/services/dataService.dart @@ -0,0 +1,51 @@ +import 'package:flutter/foundation.dart'; +import 'package:mileograph_flutter/objects/objects.dart'; +import 'package:mileograph_flutter/services/apiService.dart'; // assumes you've moved HomepageStats + submodels to a separate file + +class DataService extends ChangeNotifier { + final ApiService api; + + DataService({required this.api}); + + HomepageStats? _homepageStats; + HomepageStats? get homepageStats => _homepageStats; + + bool _isHomepageLoading = false; + bool get isHomepageLoading => _isHomepageLoading; + + Future fetchHomepageStats() async { + _isHomepageLoading = true; + notifyListeners(); + + try { + final json = await api.get('/stats/homepage'); + _homepageStats = HomepageStats.fromJson(json); + } catch (e) { + debugPrint('Failed to fetch homepage stats: $e'); + _homepageStats = null; + } finally { + _isHomepageLoading = false; + notifyListeners(); + } + } + + void clear() { + _homepageStats = null; + notifyListeners(); + } + + double getMileageForCurrentYear() { + final currentYear = DateTime.now().year; + return getMileageForYear(currentYear) ?? 0; + } + + double? getMileageForYear(int year) { + return _homepageStats?.yearlyMileage + .firstWhere( + (entry) => entry.year == year, + orElse: () => YearlyMileage(year: null, mileage: 0), + ) + .mileage ?? + 0; + } +}