From ad34d95e7bbaac537d415bd93b58b5d8972fb73e Mon Sep 17 00:00:00 2001 From: Igor Barcik Date: Fri, 2 Feb 2024 18:09:59 +0100 Subject: [PATCH] Update 'login' machanism. Implement triggering store events into useLocalStorage hook --- bun.lockb | Bin 209294 -> 188964 bytes docs/servimainUI.excalidraw | 306 +++++++++--------- package.json | 5 - src/App.tsx | 24 +- src/components/atoms/MenuContainer.tsx | 8 +- src/components/organisms/LogoutButton.tsx | 12 +- src/components/templates/HomePageTemplate.tsx | 40 --- .../templates/LoginPageTemplate.tsx | 4 +- src/hooks/useLocalStorage.ts | 51 ++- src/pages/HomePage.tsx | 27 -- src/pages/LoginPage.tsx | 2 +- src/pages/MainOverlayPage.tsx | 22 ++ src/pages/OrdersPage.tsx | 12 + src/routes/routes.tsx | 20 +- 14 files changed, 266 insertions(+), 267 deletions(-) delete mode 100644 src/components/templates/HomePageTemplate.tsx delete mode 100644 src/pages/HomePage.tsx create mode 100644 src/pages/MainOverlayPage.tsx create mode 100644 src/pages/OrdersPage.tsx diff --git a/bun.lockb b/bun.lockb index 1b90782640f9c62b5f15d68efd61e77c796902f8..13aaf517b29289a50450e64454a01b02572c541e 100755 GIT binary patch delta 33828 zcmeHw33yHC-u>QN4mlyF1_?38kdVlHGH@b6%s~k;3xbeI5<^0q#85F0yS(PHs-;>( z6+tUhOG{f+ikD~FLOtcj z^GhZ-@Mr_+IZ4W&AWKq3aMpwonTc6R(yAr9YB_Q&x|lsCDJ^+aj+AKFDPUIwp5r7* z)xe`u(uXtQZWZ+KsmW={8Hrh0TVY$_?``m4XGy98dpEc;xPhT}MWCv%?O>*BbJ5~C z@?GG-PyTg-KSzK{u(MFqTHrBYmU=b($%Ej@1h#`2&q(NBrentc8j)BaGo7j^SXId( zX($0gjWV)lqJiJ7Cd zP)W$0BefN#4NLn$Bb{qD)^n*3o&G_=e`R}y@|nR5s#%R24g5h z=DQ&QHd_TS2UK!ESX$ELY{|?hpsC)>b(`t_50Me8^RcXMatcj~^p+&_c>YB&^GTeX zoQ_78M*HaH90I1Uw9s2MH90lOcjR#CXXs4kJ?N}gVpdMth;hl;anMbAV>&WF$#j{PmVy24>2IU{*BW zh=))q$td#m06m=}h|hGLgY**rfj&nK9Qn84;DEabW(Mzpp95zG>n&)G@>d^Bt9vINHolUn8(KJiXZ5 zKtilhxo}Csu*g4!4B59AVUtgRS<}%GdVvnYpBb86YmT99s0apq{`p8fUTAB*f_1=L zJIDHAdz>9;7o##g~i_?TgD17p_a&jmLCr+_hA z^1FapffnHU;7SJnVAuUW20Q4n2M#8<0?d-l1G9!nS;HqJr;L>D#p)%$0%q5I0CofK zH}sbbdx_!iF!XVT9uMYdjy7x`FjrHzSgD`pAwyuocRJ_^e*xxLc;B#hftkQMFvHCO zb1+RX{D&I;T@5?DgF4n)&#}6P-tswVY(`0H4V&c-1akq4 z^bH1Y1G6(nCM9KHI!YGURbW58_qz4h(|r`L*YQ(u6NDR^<*UsY)FmS^Gs}_m9y}_; z;~tov_5I;_w^*lg6y7?aFV2qA*xTsrjDc`dU))r6IpSWVY-bunVp?9 zQc{r)E1HxwAv+o6Ny-{OAt^IQicHkgP0B*EqTKli$1$)MI?JC8o6~Z`aNQo6J|a6a zIW1{q((nmf>{GLto1}hR(W>~^)JrHz#z=h}^aW!Z%O8v+I3A z*sPihm{rX}x-7!IK6+oB12bMyR!VYOHugfJiJy+w023X3t2!z*bo{G4?xUhupMSgb(oaEtP zw=xlM{76hm9GO(=ug19gIsO;dfPZHRaOD4I*MP~Hdi_R$xt3(->J2c&;0Q45-x18t zH&^7{NT2=Om_JtId}7 z&d`V9W-x2q58-NnE#TT*peA2~-KYxx-8oF`@rZB;i`X%@IbzpYHd@zgs>pZoj zNMhlKhc?RW0ZeCM#-gL%ZBeJp z4pbjCj8a~AQX?AKl|P)++(vdeL_N?bN}j1cY80h>WKkm;+hr#;r*V`VqaMI-cr=bu zu9R0JyzFv6HODJT*;zp?^0F&8DySvU8mr+=qO2*nfr>?*iW=R}W<3I{JuF$31H;ru zO`_z1YIxHq>sl;x5zw90;wCn0B3hVM1+_TAW_=k}YgpyA6mA=qg_hi0&1n{8nTs*o zS3R5%X}t;;c6O$NnDwwa&~j1>8r!VNuwr0oB~kWPQj40~t@j}68OzAH1v-gYRZwY- zHY_b;d9!-JJ4(6ds+M@$D2DZ2sfDt-qlfi&Ldh-TV8v)P+5uOXnY!g$SP|;s#*uP;^-;?xWp_0-!q+al zt2w?=)^QkGUCf}?y|9>|tQLFQQM#?qSNAMkp!4(W& zMQgk@u-IH$eC3LpTGYy}w5y>OHL+WkV9o_=#XAlcJ5+BYt9rmc%F-Q+I||<<(z*yP zwkOg^uqhX7s<{Dn*;PFd5M>>S1t|_*PV8}IcP%v{(5~F9rRE0OEgqP8s3rQdH(X4> zN$dMHu%7gw^$IK;hVrXuofVDQ`y?xC9xQ+ODO%6(fYnn^#mA;R_E2+!?UrDy7j|Z1 z$%LytUCLXv)rb(g^;ZZS6c{P!(GaX;Y!>t{dMyihEoyP6FlSFanm%mX z8k*)><|kIH7g*fm5E@$l2;6Ta@)9Xv`Yz*U)BBumPjQ z-jQ-!^*~sZyi|P@7G*sSm1!c3mreP#o|+qOw|1*9No_ST+Q(*H4ND&i1MYp|lU zY@F`XfaRkB+jQfHnqk zF`dy&{_3OXC}nhWH6q5YtZlC5#@MarnwwL+ps`K1sE=Zzti7;s>jMayGRs@dZD+S$ zhsc8K)63IGEoyJKPVmtiL{_7{!<=E1R;^MCHMfIZ>D)ps0_C?*OFG!CpSCc=bGdVG zsdtg27T9e{&z5RYtX)~zQZ0$KTOPo#qxv{D(%QyXk5f)92((!XU~w>1RHK{Ply-h< zL@&Fg2p!f}eQb-gR&Ax1p{gpkvRS*p>WsjWHZN3I>>L!ff0#3jNxFe)(E)RhZLC$! z`W7sXP)s0in{wM60f19@|(TGG$1 zJPcJM66{KtP0a;OwW&o3cI%rqy-(YmsX1AiK2_D%=erwLL(2v9($P@is&@xU3b^)<(@8Y`0{iv)Zwk z)_rj4{fh~&JZz&z46!Ty>}u{1EafQf05xw&q$LZk1kLr~6Rio>g6B1D5?sSH*XM8z z(p*8P&PdHA;2NU2etF{RjSA`E-hfN@b!~6vkpx#?#;_iQ%NV91Hbw5BMhv%G%5}uv zp|%+wY3T%4N4Q!$!O>ZhEz0y@nZ!BDTxIJ*`;iT@S z))_7>J?kpC^x=#3TX`W)%^hR64(}mJ7&iHCYIHA~vbBd=0`UgKmJsz5j2k8n=Z?M% zj)aq`V4yd(SvSD)houc9>nE_#x}4@1j&8m5l^&-ptot#r7|)p#M48=7Eg5UK7D42A z*Y+yw!zWfWjsT(0t3~7N%7o|Dl5uv+p64a0pSC=>^j33I?A9^8pX@(gC0m|$<)Rt(mIkZgu)!{Z?j&8h5o}hFKA@5HtDBV zOX5CjjfZ7~wA-vp3`-yUr~9e7>2_R(2wP|JY*d0_}Fr&UIr{i=<|_=g|#qQLS$3>NzoqY)d$tA?L;*P(npTwC|+jL^>o5V7lahs6npih0|tIZym( zZHL9K*3KB#A7QZ@v@TMbjZ{mf*sU{1>Lr7Sv9TYPF;dXtcVS^#VwlsfZ4wqqEhF~S z8d#X>Y;lzH7OZ&9Dvk=1N2x`5cIyt@9bi`KqfYr9VyfL5G+M77N{iw40xZ2D(80>5 zqt%jWc5B@+SjZ6%)x*(a?ie-KVYj{mkqwAO!pZb!U2L9gCdS?v0}F#0@nn?!H&}hN z2=vPytJe!-4x8g^W7UWPY*S;^T#&~&wWz>u9Xrk}E{2zKa2$hJOCT~8^c%#u6t!r& zU0Il-M#R~zM^g0umb80@2eA4gB$gxG4#lTxGpBK+vOZNUnqjv#NYe)nniBmo3Kj<( zsu*BXUP@DQXWErpX=>3-yEP;INmIh_qjWW577h~``lgF!gE%xpEt+Llc4ep~@Oub9 z_L;WgD*ofu+!yRh)_Aq(1-te5czs?VBh-6YrW!HZt{l%)b3wmnszsonEVX2|-7+qV zYyIQdk(Qls;dlqv-{I=4x!Pu%zO&%cwU6M^!_}Bz`VN3g_uULvcP;MSCtCPK?qf{3 z5H8*KJY0Gzo|DYDNpR_9+4e;H87@6W+sS5(*>H8$(mM;6o^PETGu#-sbZr-0?bOEu zBbEC(YRLk-GB;O^SZKFi$VFJR9M+H+nM7ExTD*}mPMMgPYXPPTAEK56B zL$xe6!G*mD;cw8T*TlzW@tdWc=~0N8aHTPXlbG-&vd(CxM z)AHaOI2)6InvyYFEfIE0yFyGh^|6Sw2)JT3*JZed&}Hp7N1yCiaIpN$hNUmBTqcjf z3f9`FV3N)HcUY{PzWD^q)hnlOOrv3iz^@`Ftz|2$K<&eUi*SWO$HLw%%z2(ZJ+(Vh zOAlDMgF&&jJaNU&Hwvh1pRbmzwp+iWpp~GwmCe#}0TxcJ)KlTILB|3TYg6_tP)pX> zl?Mydh_!a*`GsmO=*5L<(OSFp;zE5~;9e5-YqChMgPU5MhY7z(&0S|#PA^i6Kou9O zC7_taYQ%cGHFL4PhH4*cC`T5nMeFUBT1!}fyhf4M(QtJ_0kqZB@(!#%;##KsT-7(= ztO}1QQG4nIy_4HTy*k#zd8xi%VAE=3v-E=%r9SQxsT^IZMr@4e)l$;78vOo8mSOt> zHGy_O1)vMSt1Op;jrk@qJeGY)R@ZK^a(1h7}a0`|kPy44!IulNlVVt9Ct$6?N_IS`8U%q7jNr z8>^LeX{?^!T?-$PUf$HKGew8)r7^?i1LOjL7nv2CK?7G=rjD5=l~Ysq)KaJJsp@co zg`uOB6&omXq>KQhx7@%6@W=^GwkhPUS#S!0ET-V;Pq$h4F9*x_Ju=>xX7F<2&%nIMO!pEET$jA?ivho+g^SFRe?bWtr{eDI58FA^^kGH3E{^e)Yjjs1cZ6jrr>-rsQS#H!=LljMv<-$xP43 zu*r0`(Au94!-Gs`OT#A9>5E@X(BII@G9|8C?1~65YaC^SBeTW2fUAJ}8@kC3)A7H_ zwUBX!k?~XP_*WkPpLE;5EZH*)Pz^OHKuu(|?$%mr%dO7;F0_80ftVZxvy8SN)A<5^ zaX9j^7TWXht0{OF4THI@?K5mL(>Va9#AlRv{Rum?fCr6;hm8o&VtT!8`2Rc1pzj#r z$t+m0VUy`R%6Ue|F++Hl1}-w4$MK89`-EYi1hd8;)6-x&KQZjG%nZ*OI+@OMhW&&& zL3uq9jDVjSI=P&>V1F%dCU?p3{lefc4ZaNKMOM_)uhi1E-fs-wZw=pnhgsPhM)4?YGEEmjzOmP^Fso})1fi74fw@{{tZ3ApRx~MvnDICne&j?VK*#bd^PG&;EU`jSaFU#}~Gs1;~8Q%`(;O+zFY#Rt> z0TavNoXIBPv$-tMXfUs`Og-7~A7^l?5sqR1dpC5?={4z&gjn)8@?Up!Y>Ip~1yBI+ zBC{`M(7;uesm}ubx}#&u;3|8E$C>rkUw3p~XaiS99l)Y!{bu;*B#wo zcXZFZbK@X+>fTec|GJ}N%lyL~AGfW)?&#PG|IVEpTaV#*rYd_UN1gUxcXVutXWi-X z4Exs|-CuWff8EiQxudiF7w_oytSWBotJe6jtLprttD5>_S9z9t;KzRIepq$yc9mzV z$#?syWA3`Dr(w-eJ?`~W-SPN&-o38!JoO~36R<*l?kX=(3x4jWPX5VN{T9|DHQ;_f zwfWDk>azP?HD~CcBEkm0|A_uU3YA1GZ}w*at-aDsn%uLWXdd!a-rJ3Zat%A+;)m z!{PvihZO2ogYb?>t_I9>oAtX3K$g2+Fm^ewn*#g1$IS9u^&T|mtE+I7L#C6P(~S`r_SzmY_v zdf;y*kxTwg5@*SOlY~!w@C`{!C*PFBCGz)@2y6hpC5gG@+mg6Wz9WfZQI{F@|(lOLl6$iJfnnt}g73xH)w6gNZ5%EF^LND<>n<-|#nlW6D- zvWOgz*k1>EU-m}7RS@1j(49pA$to_ATtq+%P(?9^R7qSTxr*?XpvqzisfxHssw$#= zLDj@cQgv~U^qlDI2XYe|Nj1bHQccmT6{wbYmEEtf^eEbL*WqwA)yI`ydVgT#YqazO(FOOLuev$f+6guaG63g z;T-~DOfv`zLLhjHixk|OLueBUp@oO3PGZCIE2C$5O#z^2oaAcgtde)I0AxAycz-F1_jqh2;riCB!m^d5Drs_ z6xP-dI{86JZ4IG~I6&bcg}QAZM2X}!5MF5o;WUM4;ekJk5()kg^6U`WiIWtZ10eWD zLFgcIq9E+2aG63!;oTO(m_P^%+Cu0oE>dt0g3u-!LRT>-8o~(*cPMlh;V}><2SZpJ z1EGhwNuhZNgzoJi^b#xELAXHSF@@fub9)Gdp%8YohY&9wQ3$g^7~BCuKk;e@{JKHG zH5NjD(LWZ#3a*uhDGU_Wju1M9LrCoiVX!zr;UR^(ogfSq$(_b2joiJT%#~K3POkO5Yokx?hu-{h42f7@gh17!UYOj;vi&+dlU+zA;kB9FhOkW zfe}AZJR(gJy?TNsi&sfGLhc3175zz5#4gfQVSOHyClX21!~v2+RO=1O7s;doQB0aH zJojx<7;q6t?t-po)7G3cEpw9{^#Q*f;<}Sa%4Pfe?h~ zH4wrL3VSK66!IVlE8-v|4T7**?4r=A2ZS1fA*>aNgHgV9;s9yAs5S(&K_rtliel0x z;V~4nS&S#WBu(ittVZy($Vw+r&lEb`dZf^qQDM+99ryUKimb zKyQd8q@Cg>X_tr|3EC}IlJAL-77XGK?qBLU>OBrpXfCT!VL<0DI5^; zXb3C%Lr5A8;h@+>q0;~eHO4?VEE2~+cu3(mg?B`?WC*VegfJl)La`{OkT3{Bld%wv ziSc70I1h$!p2Bg_a2$mF6lRTs@V+=hVayN+At?|}ih>jf?n5DbOW{KikP6`hg=MJ_ zPK#?4CJ%$qAq~REVo4f==7|t~p>Re-r$e|vVM{uMbK)L_!r>6&Ga#H78#5q;jeuYo z58-psYdnM-6!t<;F3Lj5#1^??B$T8~c@oC<w_XRb)7=NOkKO!aBZ)}$SL9zMg z>t(fTsiI_xyo#B+l(va@d#T*iLu&^#yPm)PZ!8|PH`=wLQl6iOG?^kQFO%aG@Q`J4 zjK?o{>J{IBX>rUy?yiduLbS4e$ZXIM+JEPfekwpKvVjiDqUQ>^fklf;L6w)!!5OB~ zD*1$EIi5GHCLT|bBh^j~oA2v6Tiz-E_4~ix0*&R0VV|+*@My)CvY7r@j;odnn^Fx; z#+T{h+GF`SN1h?`bFA8i*EDDx5By}kfuZFa;rPvDb3@Y}iGiD+=$KzVPB+5w8_PeK z2rfPVgCFhNQu7m`nY!lCJ}7Hp1e|3AxVnh%2U(HpivRp16d_d+8wKPtXuXp0Q3I&5bK!nN4Y z@TI8a0*y6aVrXt~^BZkmOAU=3aM93IJ|Ki2?Tg+^hWMhP@%gDQ3~d=S=I0K4WoRo5 z%>&w1LtAacWmmpvXlo3u4zy*4wiX(l4lJS4azk8i1gs0K9l&dYq1A)CgQnogPD85? z+X6SQO@`J0ZY~;Z-pz*A5N@lXy<}*Opt;D#6R}$iu`xt`EX3<&L*qAK51_HxwnAeo zGyy(=#unOUXiechV`w{!xXqxQG}3$B&^UNMFtj(!2b8=a@{tEN?@k1yzYp+^q3t#z zw}AG&5qXcH@vHP(hW4hR`9kBf8|;R?hUN$NN@(ncw+yWnpJd>}AM6G`--RFkag+2u z9k})zS^(VGkoezIo;?4>k&oR&yZ8(kqXYqbc#vJg$G)iH`FQQo$wuHqh86;MHMp6- zbl4C>;eLq1up9Uc7@HbT%4v^7vK!3jy29XY2!Covjkw`(^BE8}x%s$P1l)YUgiZdg z5iSz$dT_JFkF)=oNo(K`0yUR$y)MpG-_P| z7P>9?3K&29yAn-f;lDC8KAw>daN1rqG(M^^4qySUL31#240j?VXd&13rVgbGe zvzs^o*)sI|&ItEB+-w~LV!?!58%`W>HwYqPagGv`alDqA4CQEaZTVF zz&X#k%Tdfh%c;nz$JxSh69e%3&hbDdkOgD|6M%`pWFQCNXJJ|Ti`Q*I~;d3ZeT-!VL&2q2Z`SW_{8HY z$oy4+qn(4BgP9LIzP7w{&q3D^Rx0hR#sfOY`a7*18LAzU*sMFX`dIUO1B zIqdQFj!~=bSen0~7 z5%T4ZUIB0hutQ6(KxLo`AOo!dKKlO^a22=)d;z=*d<@{hI)}uk>8b%W0Pg7b0X`b| zF~CO#xhr!Q{t)1X$_;ciuomEBqs@_tH}Dz~+y-#f7!CdkJP|wr!1f`%2fPmy1KjTp z0S>OJYY|`{FbS9paE;>{#r2Bo6W28^q+B>>AW}8pYq+lieDu!;_71qm0B7Mo3gpAR z4j2z`8|n{mk$nz+H2`i?+?GCc;MZw@`_VCAJpys77y@{}t__?4Qeme7Nq{Hp*5D|h zEiei84e%}CEKmgSi9Q}Nze5Y%f`2@CC-j$qxxfsdJah+7TNQy8z#kBwL!`do^N8>O z_!-~*1nPyeEAHuIbxB<`*NP;~|LHmz} zgO7mnNN@nC3r}t*z5sXnB7klaC*WoQ`vBCKNiCpk;@nai0cM=Cex}CFcM$u3FdRbx zcSJBFdX;gf!*3)o3P=Hx0d9^uoXB7tOqzhIQLcp3%MFwFbFrmpyfGCXO858*bOscb8lwJ~dd z3gIpT8~|LH#{yzwEv1&&Sxd1vzBDARy_bNCzy;uQ;4|Pn@F{Q(-~w_6_yqVExDWgc z`~=(s?gBpoKLB@t+rTa0d*CL(h3IdtTx$l~o1gAj)65oalv9M0qc(73>I;l%>%&^9wJ4P3U}09Se-P$e+80xs#*0WNaf z__zU5r%kR2xFI~(s5$@_KQ0qo4w?W>fo6a=5DWwYJ^7T`&MEy%pss!*U?{+m$aS?p zkih;oYsSGh7~r|;e`@dzKw5t?_)szQzdHi4xt|_<97uxzv%fe~5`kgB2w)5_8W;s6 z0Ws*hIDm@;^$Z{#NCwgX`i}*t0x7^aAejU24d8WP8L$AD4`c!pfLKJz26M&90&A;| z;}1??O7kGi1?B*Sz--_JU=}bFm;p=&3V?io!)+Rn2TTQ~0J%U8Fd3KxOaxv8mI6zF zMZiLUtLb8m(P%VO80ONt1McO(YXFz=P2jD-7T_g-5jOy<0mfYgX2Y%oRsaGp<86d{ zJ+KZ~3+S2Z;n%=^5BY0}FhM59h-M(#0YD(I8UAH6Wy0LBUIsH^7M_J>obBLk0DI^a zfCYLLFw-hqLC0=*>;lXhz6m#*jG65O*mTdTp&9S#8k)_`7GVt;-^`em*aL8rV}ZdA zZMQ3%*--@82kZyl0+0?(l{n>NS+w?2 z+(nv~Qaj{F1hZn=O>vJbNuJ$jlp+ra2=fc{^OqjNrwV-9zTy|K`rZbA_}Kh{;U`rP zhrJY!I&O;oHJQDJ-}Qbsi@rgC5I=uERHVMRhX8m?qGA(J8_}eRGStc&k>`+Jl3370 z>5gx_zi6Ta;cLArO%bM0)ESHqc4C?;!F5ywWRWI&CVz6RaL7+cH_$HtC6d;NB@Fzs z*bef16X7Z%+}zBuhX;4L`5wXrA%BE>r<}OjROzOiEGPV$Dej@?jI4V+I=1(a)9_UY z8LXG|JNQ&a8vVC7{@!)g#6$22)qU=l6H}Wh-SGYYz+B{+FTQSu;?5C{9w?`ObCh!x z+8Ldk|9!6!Q+m#8J`HhEd%tijz{1fS4P?FsijSHn;ijitoOgm$Bya zQ|ARRS>+e!jaU&eS&_}u%r}knf9D6wnk#pjBQ^9n`_6p#NWWg6b|3uH zNpX6pQc<>xTPTvJ`5uy2a(+(_+E6FjNvkot=5woP;G?+LDM80oMa~aPri?k7@ZuIl z{u)XxC@vzprQ*@U+eL5ik^PSyT~}p;MUma0)Ib39T_o}6ZhPgXSM84?h3Vbi2O%&e z@&jD%-SUZbb5i8CP}uaV#X%o5wE5bT$0_p8j7IG*X$`H77#Hy)0)$*gc>LrKkk@<> z`}g%32w)6V^9?7rM-GU;-1PPr}-+BxK>9u zd36) z5v}|b4@I9X?qax~60GRc&s}aScKJOCf`>r<@KXx@(bEIT>}`cGjm6*rNZTeR4N$s^ zp8ij#;vx3?E4AyGFGq4Gm_U3C*-f6k|Qe?b)7p)-z{eo~(5t{>0GHuPNDeeR)b+K4g z3{<*@n6E~eH}b_@hc2D`3eyU6Cj_gl`4W}c6};DV-@JRPmYTLC%ohs~73sB4}y(~9g znOo(v&&p#0ZS>M-x*k9&ZYt|%>pOBn3;S_pd>?CUK>0_`7VF(0<))4OI>?wVRksLikl z#Z7$DOL0<;_==P+2(G=W1PyZR+Wh6Ii-O8)Mbdiymao{r5axSg79V~o^X&)kzpaJP zR%&lQv9KGO=XMvRx?=NN-c@P9Ci|yMlzcyNw-?I#ZzriN^b=LPBgSSwJjJDqQVRV= zTV$my^A|^+N1@D@)MWbo6gc9KzB^GUe?P3&xPjFQ6=;T3t_O%O8Ph1Nk#eA?`4X2Q z7w`JTZKyp5DcJll0Bsz~rB!$;<0n-xUuLsr_q_Q5l`Pc|9m@ba>|&s}%A(&26!sJp z)p#FH{x>^2uGmvNlM6hD1423n3BNdWosnUA4%y6LF_qfEV6ig}shkQHA0;Cd^W`{W zLWaKFs^y(!NQLVPQn?;1erJrOAtJB`CYJg7oXEMGz6@;ms2Cx!oG_$*cJMUcr}H3f z`E)mzmm4F1KURCR-HlN3CXxt!#?}&~hcMrO~I(S>riSdySzlDd{obT_0IN&37bl0{o!S# z%jOIhw|iopG+)Ydt5O4xiqo3}B80Ki=u3`rK2q$QptzwG148Pw7Wor3cZivvr}>ti zXt(XjwcqGF1qpD~L>9)NGW+2lCdgA`w?=(b;Xj-aPYvI||NQV3O?xZ3Ufy>7#F~4_wRLb(4McB}Zy)7w`5~@|AgZ5!(knXTIp?pj*xAgBPuw?j#5Mh5PY{ zZ@vm>?;p2+a;g16lTx3L?c()5IHa0y4=SI1c4W#&KP#mn%=ZiJY2q~4|HiE6N_|>H ziQf>{(|jY*yhV@K>}y=@`_d38QNlkSshjUGvNhWg7WnHYv85rl;Z6h}W#vaz=rt;{ z@Z`u+pJP#C8slC?2v3Bla{Wv|%iliytu%!B=A^>R)y*y!cE+D@nDq_sAWk8!r}^ff z6BT-j*c+)won)+C;eG*u($Ege`yz4kRYUG2B>~TW5SmmPzdse9zLEjaBQu+x%vaQlIEpQLi83nr~)G8Mf(< z&z2m(N!hHn`R=CSHGi{Ksqgln)W;DkQV`eEeA`o@(`#dfR*RTi8seo`v4N?Z?}sY> zcF8Nx)#~{7(h%kwq)t4@uRryrc(v5$O04*San1M5gmydi*2bl8=9Y#q-?rq@#zhIO zki***F6x+}m*Pb01eDBtKhv~DdrsA_T)UC6OxW<>HR41DLMSdh#M}g|hP8W$x5-{T z#7|&P^UYAnUB}gEwRBFt786SnZd`kaw*3*JC+=Q(G?+E$#IS;HF5kQHK!Q~-#J_(J zv9Ldm7OQ)RFZ*LDGT#Q3b8qj3FQN|NzRMpAEY7w#+*aW!Qa|*Hm;v~ElClTO(aO0# z;_3iY#C*ZfwZbp5cg20+jN%0Q;rNadcf4pY4i%{#FZ>1~r1?6bHgOp_b!Q!Itu;yj zN*)vyFVYzD?Yd$rLMnsf#qxnDrhZuOW^O=AcD(2|2>$u;V$>k)rE0wRi1wy#>==R;t;t11n>n|=b?VSTflFwkV7$KE|gT=OCSV5D9ET46x@^l%d-{+@# z*Bid=#o;{^nL7_^Dn%v=|KS)rdlU7sv*N|J?|!;J!5!I!U`XJ|hen?^T=DUW9j@O+ zZvbeGoGCnIr2lgB*dXB}28$DLc z9E(}??>3QpsQL1+nwI``;^QjQ3cCqy3Iy`w2J_WsK}$#E7O&lqr^t6w^-o^Pr-@UD z>uJ6WEicfo{?X^kaRb0iYE7B?E_DSl|@Q@uGp!1{V)Y25f&@fzZKKJ#p(#l_j^ zDpP;v*+>iVl99R^dAsr01*-~6Q{Nve{3amoGtWj^T=V^#&eiNK_RBAxDvf(DR!l`) zPxGa9RocaVQKikDFtev^l78Rg9@;Ti|D3b#k}hc@HmH-7CpQV^i}5Ng?a-&%%nKb$ zeX?`K??~OaclsB(Xxj~P={8Xhsj+^C<*pcabANJoWyupCA!exga=JGk)w{Gff8Bob zg9%@M^L2L8sJGv}vv~ZM+PuTe!#6x3!gCU8Z@$Rx*4Qa8SR+E$m(GN#d7>vmglg~7 zL*Mq#ed+KoHLko~8p3?pUB~Mw9ej%S9WZ?YrHEXy4sn$a^2CuG@WnjQHXol-1{rPY zwtO-^DZ%}G`N>Lq@TG{#9f9k z-ym3J`|qz!Smjk&4-tqPHnVKTT`fx@`sUzMNkhON6rpVYV3^e~#PU2<7==}kT;<#+ z9j)Iamr2_El0o~JHt3%kB+zUSElsm}&-?@h>v%xOhtow%+~WU9^~_=OuLcFawbF0r z^?GieAznvYlv`@Z(9L*o#Y zr*;f7{j+Hc&hP)tp?YfSpA6Ly>AyZyLpU7b^8RV4niJPe?96-iNc|6rWOn6$bEIlT zGdqk$5#=3ahANe(Mi@S6ddYze^;sVVJvIEEs^tFJ;`U6m#D&?SY61A}Y|&sA*sV|u zDNq8%{d}dmOHiTy*{~T%KZTb@(gTmeQTTX)5~M`V5j~Nns6HJxY+HrzbZBelis937 zl5vP-)0NSR{wdqjDYz^5`iO2bkiA)~U+0N@*q-J)Fe}7OnUvxELyRJaVq@iSGYV?l zZ?&@E!*kKQ2$K- z@cjF+Za?PW>rV4isF;Pq>xI%AWaZUGV*U$g1oKs%8_pDEoT;3)5C!6=+W0uixS8bF zHkV#deE!dWH#=euzN#qm-K^)o{%*GHji#GOoQo5(exvD*Z>Uz!RSL|nw7x4R!sekf z&_*fbfr7?r7gb62$-+b2lWCqtcY)j`3?0K z@l#&vx4nT!P1u!S7u1Tc{D)icl}2L8d?m`Uu)8kL3=26WPpZoj{B4b`_3#@?l;-zwNL4z?DH>D8kO5O;X|co Rl-O`W3EX$wrQFG;{||;?l?wm> delta 47549 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%0Af3ms2TSL(!H^k1I?xMs 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 D&{dbk diff --git a/docs/servimainUI.excalidraw b/docs/servimainUI.excalidraw index 3f2190b..c1870fe 100644 --- a/docs/servimainUI.excalidraw +++ b/docs/servimainUI.excalidraw @@ -263,8 +263,8 @@ }, { "type": "text", - "version": 859, - "versionNonce": 531548862, + "version": 860, + "versionNonce": 1169460443, "isDeleted": false, "id": "97fLf76gEdKS_GvQ6ALpU", "fillStyle": "solid", @@ -286,7 +286,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007569, + "updated": 1706874741849, "link": null, "locked": false, "fontSize": 36, @@ -459,8 +459,8 @@ }, { "type": "text", - "version": 170, - "versionNonce": 260491298, + "version": 171, + "versionNonce": 122389077, "isDeleted": false, "id": "lIMGkmHcJPDoBybM182aS", "fillStyle": "solid", @@ -480,7 +480,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007569, + "updated": 1706874741849, "link": null, "locked": false, "fontSize": 20, @@ -531,8 +531,8 @@ }, { "type": "text", - "version": 843, - "versionNonce": 658686718, + "version": 844, + "versionNonce": 115620219, "isDeleted": false, "id": "czL3rOtvV4NqzRGs0GVjq", "fillStyle": "cross-hatch", @@ -554,7 +554,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007570, + "updated": 1706874741850, "link": null, "locked": false, "fontSize": 16, @@ -569,8 +569,8 @@ }, { "type": "text", - "version": 613, - "versionNonce": 1971155938, + "version": 614, + "versionNonce": 1941073845, "isDeleted": false, "id": "UyOYTvi_ehfK_7ZeUqKNh", "fillStyle": "cross-hatch", @@ -592,7 +592,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007570, + "updated": 1706874741850, "link": null, "locked": false, "fontSize": 16, @@ -653,8 +653,8 @@ }, { "type": "text", - "version": 585, - "versionNonce": 1110291262, + "version": 586, + "versionNonce": 716526107, "isDeleted": false, "id": "b5cYSaZuXHVCg_wgIGqyf", "fillStyle": "cross-hatch", @@ -677,7 +677,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007570, + "updated": 1706874741852, "link": null, "locked": false, "fontSize": 16, @@ -724,8 +724,8 @@ }, { "type": "text", - "version": 721, - "versionNonce": 120104866, + "version": 722, + "versionNonce": 60076309, "isDeleted": false, "id": "vK17TLw3lSPYKis4oRv10", "fillStyle": "cross-hatch", @@ -748,7 +748,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007571, + "updated": 1706874741852, "link": null, "locked": false, "fontSize": 16, @@ -795,8 +795,8 @@ }, { "type": "text", - "version": 771, - "versionNonce": 1523620734, + "version": 772, + "versionNonce": 840586939, "isDeleted": false, "id": "YaQApvBsokdg3uc1F-yqm", "fillStyle": "cross-hatch", @@ -819,7 +819,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007571, + "updated": 1706874741852, "link": null, "locked": false, "fontSize": 16, @@ -866,8 +866,8 @@ }, { "type": "text", - "version": 896, - "versionNonce": 1823957858, + "version": 897, + "versionNonce": 1416087157, "isDeleted": false, "id": "DpHSN121nXDlx6NRNdrhz", "fillStyle": "cross-hatch", @@ -889,7 +889,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007571, + "updated": 1706874741853, "link": null, "locked": false, "fontSize": 16, @@ -904,8 +904,8 @@ }, { "type": "text", - "version": 575, - "versionNonce": 1735162814, + "version": 576, + "versionNonce": 1538639707, "isDeleted": false, "id": "dD_ckfrdnLxCAC6Xr96mr", "fillStyle": "cross-hatch", @@ -927,7 +927,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007571, + "updated": 1706874741853, "link": null, "locked": false, "fontSize": 16, @@ -2046,8 +2046,8 @@ }, { "type": "text", - "version": 613, - "versionNonce": 1886955298, + "version": 614, + "versionNonce": 955330517, "isDeleted": false, "id": "TWGywr2MmOeMW4gs8000_", "fillStyle": "solid", @@ -2067,7 +2067,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007572, + "updated": 1706874741853, "link": null, "locked": false, "fontSize": 20, @@ -2111,8 +2111,8 @@ }, { "type": "text", - "version": 642, - "versionNonce": 1847743486, + "version": 643, + "versionNonce": 1843012603, "isDeleted": false, "id": "xBzNkZFVCqb_jKgjmeqPR", "fillStyle": "solid", @@ -2132,7 +2132,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007572, + "updated": 1706874741854, "link": null, "locked": false, "fontSize": 36, @@ -2350,8 +2350,8 @@ }, { "type": "text", - "version": 659, - "versionNonce": 987460322, + "version": 660, + "versionNonce": 256273717, "isDeleted": false, "id": "ZROg7dmoN-YH48DAzVkVm", "fillStyle": "solid", @@ -2371,7 +2371,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007573, + "updated": 1706874741854, "link": null, "locked": false, "fontSize": 16, @@ -2596,8 +2596,8 @@ }, { "type": "text", - "version": 787, - "versionNonce": 150152254, + "version": 788, + "versionNonce": 1082780827, "isDeleted": false, "id": "27g6d6zkbFMakk4yjYlMe", "fillStyle": "solid", @@ -2622,7 +2622,7 @@ "type": "arrow" } ], - "updated": 1706857007573, + "updated": 1706874741854, "link": null, "locked": false, "fontSize": 16, @@ -2637,8 +2637,8 @@ }, { "type": "text", - "version": 821, - "versionNonce": 242140834, + "version": 822, + "versionNonce": 1456275093, "isDeleted": false, "id": "2n275KB8dVMGKR5z78AzE", "fillStyle": "solid", @@ -2658,7 +2658,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007573, + "updated": 1706874741854, "link": null, "locked": false, "fontSize": 16, @@ -2673,8 +2673,8 @@ }, { "type": "text", - "version": 858, - "versionNonce": 1774185598, + "version": 859, + "versionNonce": 125280571, "isDeleted": false, "id": "HtmF7uDtsZerEiCY9Wrr2", "fillStyle": "solid", @@ -2694,7 +2694,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007573, + "updated": 1706874741855, "link": null, "locked": false, "fontSize": 16, @@ -2867,8 +2867,8 @@ }, { "type": "text", - "version": 425, - "versionNonce": 65118818, + "version": 426, + "versionNonce": 104489973, "isDeleted": false, "id": "lHG7_KEcLq8Jnlob9oJs-", "fillStyle": "cross-hatch", @@ -2893,7 +2893,7 @@ "type": "arrow" } ], - "updated": 1706857007574, + "updated": 1706874741855, "link": null, "locked": false, "fontSize": 16, @@ -2960,8 +2960,8 @@ }, { "type": "text", - "version": 639, - "versionNonce": 1581886654, + "version": 640, + "versionNonce": 1543881179, "isDeleted": false, "id": "DLa0lPVXghvlzyQUiLnzi", "fillStyle": "cross-hatch", @@ -2986,7 +2986,7 @@ "type": "arrow" } ], - "updated": 1706857007574, + "updated": 1706874741855, "link": null, "locked": false, "fontSize": 16, @@ -3097,8 +3097,8 @@ }, { "type": "text", - "version": 867, - "versionNonce": 1174603298, + "version": 868, + "versionNonce": 563354965, "isDeleted": false, "id": "X6ZL8ZTMvlKjWI3ba1hvI", "fillStyle": "solid", @@ -3118,7 +3118,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007574, + "updated": 1706874741856, "link": null, "locked": false, "fontSize": 16, @@ -3167,8 +3167,8 @@ }, { "type": "text", - "version": 761, - "versionNonce": 1412523262, + "version": 762, + "versionNonce": 122080891, "isDeleted": false, "id": "ZEo99QAbAO47p8--HBfd-", "fillStyle": "solid", @@ -3188,7 +3188,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007574, + "updated": 1706874741856, "link": null, "locked": false, "fontSize": 20, @@ -3203,8 +3203,8 @@ }, { "type": "text", - "version": 808, - "versionNonce": 1304556002, + "version": 809, + "versionNonce": 271559349, "isDeleted": false, "id": "CkCABc8KuyOn0P-BdVmd6", "fillStyle": "solid", @@ -3224,7 +3224,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007575, + "updated": 1706874741856, "link": null, "locked": false, "fontSize": 20, @@ -3239,8 +3239,8 @@ }, { "type": "text", - "version": 1019, - "versionNonce": 1559762238, + "version": 1020, + "versionNonce": 201148187, "isDeleted": false, "id": "myQuI1HagifoucfsqyYKJ", "fillStyle": "solid", @@ -3260,7 +3260,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007575, + "updated": 1706874741856, "link": null, "locked": false, "fontSize": 20, @@ -3275,8 +3275,8 @@ }, { "type": "text", - "version": 815, - "versionNonce": 506291618, + "version": 816, + "versionNonce": 850562069, "isDeleted": false, "id": "-Yf8k6Dj3Lj-jOgr249Af", "fillStyle": "solid", @@ -3296,7 +3296,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007575, + "updated": 1706874741857, "link": null, "locked": false, "fontSize": 20, @@ -3311,8 +3311,8 @@ }, { "type": "text", - "version": 852, - "versionNonce": 838778238, + "version": 853, + "versionNonce": 1889250235, "isDeleted": false, "id": "IoXP3HH9PXErWUBPpkQME", "fillStyle": "solid", @@ -3332,7 +3332,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007575, + "updated": 1706874741857, "link": null, "locked": false, "fontSize": 20, @@ -3347,8 +3347,8 @@ }, { "type": "text", - "version": 1072, - "versionNonce": 7627106, + "version": 1073, + "versionNonce": 957497717, "isDeleted": false, "id": "NFjnbU6And4fMiUyl8kGC", "fillStyle": "solid", @@ -3368,7 +3368,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007575, + "updated": 1706874741857, "link": null, "locked": false, "fontSize": 20, @@ -3383,8 +3383,8 @@ }, { "type": "text", - "version": 1111, - "versionNonce": 948329918, + "version": 1112, + "versionNonce": 1229225051, "isDeleted": false, "id": "87zM95Ly4uuN74flGhu5I", "fillStyle": "solid", @@ -3404,7 +3404,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007576, + "updated": 1706874741857, "link": null, "locked": false, "fontSize": 20, @@ -3851,8 +3851,8 @@ }, { "type": "text", - "version": 781, - "versionNonce": 1072031010, + "version": 782, + "versionNonce": 949242581, "isDeleted": false, "id": "bFWjBJqnUAi5N3n2ZWux_", "fillStyle": "solid", @@ -3872,7 +3872,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007576, + "updated": 1706874741858, "link": null, "locked": false, "fontSize": 20, @@ -4008,8 +4008,8 @@ }, { "type": "text", - "version": 1092, - "versionNonce": 95417854, + "version": 1093, + "versionNonce": 30030075, "isDeleted": false, "id": "AngCsxgQFZ8FlJDffEu--", "fillStyle": "solid", @@ -4029,7 +4029,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007576, + "updated": 1706874741858, "link": null, "locked": false, "fontSize": 36, @@ -4044,8 +4044,8 @@ }, { "type": "text", - "version": 1123, - "versionNonce": 1710289122, + "version": 1124, + "versionNonce": 30287925, "isDeleted": false, "id": "y_U_FPL_9JR3gVTy88NCf", "fillStyle": "solid", @@ -4065,7 +4065,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007577, + "updated": 1706874741858, "link": null, "locked": false, "fontSize": 28, @@ -4080,8 +4080,8 @@ }, { "type": "text", - "version": 1158, - "versionNonce": 1652327998, + "version": 1159, + "versionNonce": 1739547035, "isDeleted": false, "id": "mOf1HdeIlUxFfE7a1VcGR", "fillStyle": "solid", @@ -4101,7 +4101,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007577, + "updated": 1706874741859, "link": null, "locked": false, "fontSize": 28, @@ -4116,8 +4116,8 @@ }, { "type": "text", - "version": 1090, - "versionNonce": 1982104738, + "version": 1091, + "versionNonce": 916806037, "isDeleted": false, "id": "DR4VwW8oFIQ4bTi23EuNf", "fillStyle": "solid", @@ -4137,7 +4137,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007577, + "updated": 1706874741859, "link": null, "locked": false, "fontSize": 28, @@ -4152,8 +4152,8 @@ }, { "type": "text", - "version": 771, - "versionNonce": 1338838654, + "version": 772, + "versionNonce": 1948677691, "isDeleted": false, "id": "J9irHVDB_SLk4-2nUzUsU", "fillStyle": "solid", @@ -4173,7 +4173,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007578, + "updated": 1706874741859, "link": null, "locked": false, "fontSize": 16, @@ -4188,8 +4188,8 @@ }, { "type": "text", - "version": 795, - "versionNonce": 707764322, + "version": 796, + "versionNonce": 542072565, "isDeleted": false, "id": "c19gjwN8b8L3I0q4go5Bf", "fillStyle": "cross-hatch", @@ -4209,7 +4209,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007578, + "updated": 1706874741859, "link": null, "locked": false, "fontSize": 16, @@ -4224,8 +4224,8 @@ }, { "type": "text", - "version": 826, - "versionNonce": 174231230, + "version": 827, + "versionNonce": 1444017883, "isDeleted": false, "id": "oW9r6Oj1KNFEDfDrTobE0", "fillStyle": "cross-hatch", @@ -4245,7 +4245,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007578, + "updated": 1706874741860, "link": null, "locked": false, "fontSize": 16, @@ -4260,8 +4260,8 @@ }, { "type": "text", - "version": 853, - "versionNonce": 769737762, + "version": 854, + "versionNonce": 1162983509, "isDeleted": false, "id": "3FPR-httcvZJQOpdp5nlq", "fillStyle": "cross-hatch", @@ -4281,7 +4281,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007578, + "updated": 1706874741860, "link": null, "locked": false, "fontSize": 16, @@ -4296,8 +4296,8 @@ }, { "type": "text", - "version": 828, - "versionNonce": 249431806, + "version": 829, + "versionNonce": 1006920571, "isDeleted": false, "id": "Q5UuTLzxJDwFmgRxTm2kC", "fillStyle": "cross-hatch", @@ -4317,7 +4317,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007578, + "updated": 1706874741860, "link": null, "locked": false, "fontSize": 16, @@ -4332,8 +4332,8 @@ }, { "type": "text", - "version": 575, - "versionNonce": 1529376738, + "version": 576, + "versionNonce": 1065477557, "isDeleted": false, "id": "Wz3mVdVr-D1sldEkuMc-C", "fillStyle": "solid", @@ -4353,7 +4353,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007579, + "updated": 1706874741860, "link": null, "locked": false, "fontSize": 16, @@ -4368,8 +4368,8 @@ }, { "type": "text", - "version": 703, - "versionNonce": 499152702, + "version": 704, + "versionNonce": 1581267995, "isDeleted": false, "id": "5BRLdUcImdXd-sAkul1NW", "fillStyle": "solid", @@ -4389,7 +4389,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007579, + "updated": 1706874741860, "link": null, "locked": false, "fontSize": 16, @@ -4404,8 +4404,8 @@ }, { "type": "text", - "version": 735, - "versionNonce": 1981031330, + "version": 736, + "versionNonce": 1376085781, "isDeleted": false, "id": "NIRZl827FKmclhhKsmfJG", "fillStyle": "solid", @@ -4425,7 +4425,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007579, + "updated": 1706874741861, "link": null, "locked": false, "fontSize": 16, @@ -4440,8 +4440,8 @@ }, { "type": "text", - "version": 767, - "versionNonce": 1063968638, + "version": 768, + "versionNonce": 1220018363, "isDeleted": false, "id": "nwfWQopAIVcO11jOf_vRF", "fillStyle": "solid", @@ -4461,7 +4461,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007579, + "updated": 1706874741861, "link": null, "locked": false, "fontSize": 16, @@ -4592,8 +4592,8 @@ }, { "type": "text", - "version": 702, - "versionNonce": 1758682978, + "version": 703, + "versionNonce": 1062321269, "isDeleted": false, "id": "rzBAAYkybbEjgW-X1nldy", "fillStyle": "solid", @@ -4613,7 +4613,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007580, + "updated": 1706874741861, "link": null, "locked": false, "fontSize": 28, @@ -4628,8 +4628,8 @@ }, { "type": "text", - "version": 718, - "versionNonce": 1209941950, + "version": 719, + "versionNonce": 1695428955, "isDeleted": false, "id": "oxovXJjAobce88xbeLU8R", "fillStyle": "solid", @@ -4651,7 +4651,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007580, + "updated": 1706874741861, "link": null, "locked": false, "fontSize": 28, @@ -4666,8 +4666,8 @@ }, { "type": "text", - "version": 707, - "versionNonce": 2142577442, + "version": 708, + "versionNonce": 1596745173, "isDeleted": false, "id": "bsapaFzL8TDKJ9MbrtJEa", "fillStyle": "solid", @@ -4689,7 +4689,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007580, + "updated": 1706874741862, "link": null, "locked": false, "fontSize": 28, @@ -4704,8 +4704,8 @@ }, { "type": "text", - "version": 754, - "versionNonce": 1543215102, + "version": 755, + "versionNonce": 1150635515, "isDeleted": false, "id": "98b_U589sHYl_q_k7dRbc", "fillStyle": "solid", @@ -4729,7 +4729,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007580, + "updated": 1706874741862, "link": null, "locked": false, "fontSize": 28, @@ -4744,8 +4744,8 @@ }, { "type": "text", - "version": 452, - "versionNonce": 623406818, + "version": 453, + "versionNonce": 1957356341, "isDeleted": false, "id": "PMAVESvlWDWmWj93013fH", "fillStyle": "solid", @@ -4765,7 +4765,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007581, + "updated": 1706874741862, "link": null, "locked": false, "fontSize": 28, @@ -4838,8 +4838,8 @@ }, { "type": "text", - "version": 98, - "versionNonce": 1929635902, + "version": 99, + "versionNonce": 709875355, "isDeleted": false, "id": "IQb1FgS9Z9XPkqAlLeR35", "fillStyle": "solid", @@ -4859,7 +4859,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007581, + "updated": 1706874741863, "link": null, "locked": false, "fontSize": 28, @@ -4874,8 +4874,8 @@ }, { "type": "text", - "version": 138, - "versionNonce": 498877090, + "version": 139, + "versionNonce": 1144173717, "isDeleted": false, "id": "uoXtQ_5jmNBJ6aOSh8TG7", "fillStyle": "solid", @@ -4895,7 +4895,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007581, + "updated": 1706874741863, "link": null, "locked": false, "fontSize": 28, @@ -4910,8 +4910,8 @@ }, { "type": "text", - "version": 122, - "versionNonce": 1561866366, + "version": 123, + "versionNonce": 1425034043, "isDeleted": false, "id": "YKlce3NhSAO2cOpVFM--B", "fillStyle": "solid", @@ -4931,7 +4931,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007583, + "updated": 1706874741863, "link": null, "locked": false, "fontSize": 16, @@ -4946,8 +4946,8 @@ }, { "type": "text", - "version": 163, - "versionNonce": 1142922850, + "version": 164, + "versionNonce": 1769560565, "isDeleted": false, "id": "j_Vkhf5mLxVsrltY5uihc", "fillStyle": "solid", @@ -4967,7 +4967,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007583, + "updated": 1706874741863, "link": null, "locked": false, "fontSize": 16, @@ -4982,8 +4982,8 @@ }, { "type": "text", - "version": 795, - "versionNonce": 1173975230, + "version": 796, + "versionNonce": 148450267, "isDeleted": false, "id": "u50Phb99MTDiTPuc37JeQ", "fillStyle": "solid", @@ -5003,7 +5003,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007583, + "updated": 1706874741864, "link": null, "locked": false, "fontSize": 28, @@ -5142,8 +5142,8 @@ }, { "type": "text", - "version": 775, - "versionNonce": 1159823906, + "version": 776, + "versionNonce": 1837388629, "isDeleted": false, "id": "wNiAAV6zgGuZTvY5864FZ", "fillStyle": "solid", @@ -5163,7 +5163,7 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1706857007584, + "updated": 1706874741864, "link": null, "locked": false, "fontSize": 36, @@ -5371,8 +5371,8 @@ }, { "type": "text", - "version": 112, - "versionNonce": 961063166, + "version": 113, + "versionNonce": 1511848059, "isDeleted": false, "id": "vR3E88Ypr64zTJDIqP-Pw", "fillStyle": "solid", @@ -5397,7 +5397,7 @@ "type": "arrow" } ], - "updated": 1706857007584, + "updated": 1706874741864, "link": null, "locked": false, "fontSize": 16, diff --git a/package.json b/package.json index d11567e..2da940e 100644 --- a/package.json +++ b/package.json @@ -3,17 +3,12 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@hookform/resolvers": "^3.3.2", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-tooltip": "^1.0.7", "@tanstack/react-table": "^8.10.7", "axios": "^1.6.1", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.0", "daisyui": "latest", "echarts": "^5.4.3", "i18next": "^23.7.18", "i18next-browser-languagedetector": "^7.2.0", - "lucide-react": "^0.320.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.48.2", diff --git a/src/App.tsx b/src/App.tsx index 3d9b0b0..7201d4a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,3 @@ -// TODO: - [x] Rewrite new switch generating function based on custom routes object -// TODO: - [x] Make condition for base path in Router, for "/" in main.base_path don't add to Router -// TODO: - [x] Rewrite DevControlPanel to use custom routes object - import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Outlet, useLocation, useNavigate } from "react-router-dom"; @@ -15,16 +11,28 @@ function App() { const navigate = useNavigate(); const location = useLocation(); - // Effect to change language based on state useEffect(() => { + // Load language from local storage i18n.changeLanguage(language); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [language]); - // Redirect to login page if not logged in + + // Here was a problem with detecting updates of isLoggedIn state. Solution was to manually trigger events on storage change when storage was updated. + // Refer to useLocalStorage hook in ./hooks/useLocalStorage.ts at line 39 for more details useEffect(() => { - if (!isLoggedIn && location.pathname !== "/login") { + // Redirections based on login state + if (!isLoggedIn) { + console.log("NOT LOGGED IN"); navigate("/login"); } - }, [isLoggedIn]); + if (isLoggedIn && location.pathname === "/login") { + console.log("LOGGED IN"); + navigate("/orders"); + } else { + console.log(`ALREADY ${!isLoggedIn ? "NOT " : ""}LOGGED IN`); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isLoggedIn, navigate]); // Conditional rendering based on base path return ; diff --git a/src/components/atoms/MenuContainer.tsx b/src/components/atoms/MenuContainer.tsx index 0056a3c..9f9095a 100644 --- a/src/components/atoms/MenuContainer.tsx +++ b/src/components/atoms/MenuContainer.tsx @@ -19,10 +19,10 @@ const MenuContainer: React.FC = ({ }) => { const chooseContainerPosition = useCallback(() => { const commonClasses = `z-50 menu bg-base-300 rounded-box gap-4 absolute ${horizontal ? "menu-horizontal" : ""} `; - if (position === "top-left") return commonClasses + "top-4 left-4"; - if (position === "top-right") return commonClasses + "top-4 right-4"; - if (position === "bottom-left") return commonClasses + "bottom-4 left-4"; - if (position === "bottom-right") return commonClasses + "bottom-4 right-4"; + if (position === "top-left") return commonClasses + "top-2 left-2"; + if (position === "top-right") return commonClasses + "top-2 right-2"; + if (position === "bottom-left") return commonClasses + "bottom-2 left-2"; + if (position === "bottom-right") return commonClasses + "bottom-2 right-2"; }, [horizontal, position]); const overlayButtonContainer = () => { diff --git a/src/components/organisms/LogoutButton.tsx b/src/components/organisms/LogoutButton.tsx index 35a3595..2a3afb3 100644 --- a/src/components/organisms/LogoutButton.tsx +++ b/src/components/organisms/LogoutButton.tsx @@ -1,21 +1,21 @@ import { useTranslation } from "react-i18next"; import { FiLogOut } from "react-icons/fi"; -import { useNavigate } from "react-router-dom"; import useLocalStorage from "../../hooks/useLocalStorage"; import RoundButtonBase from "../atoms/RoundButtonBase"; import IconBase from "../molecules/IconBase"; const LogoutButton = () => { const [, setIsLoggedIn] = useLocalStorage("isLoggedIn", false); - const navigate = useNavigate(); const { t } = useTranslation(); + + const handleLogout = () => { + setIsLoggedIn(false); + }; + return ( { - setIsLoggedIn(false); - navigate("/login"); - }, + onClick: handleLogout, }} tooltipText={t("button.action.logout")} > diff --git a/src/components/templates/HomePageTemplate.tsx b/src/components/templates/HomePageTemplate.tsx deleted file mode 100644 index cf7cfeb..0000000 --- a/src/components/templates/HomePageTemplate.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { useTranslation } from "react-i18next"; -import MenuContainer from "../atoms/MenuContainer"; -import LogoutButton from "../organisms/LogoutButton"; -import ThemeButton from "../organisms/ThemeButton"; -import LanguageButton from "../organisms/LanguageButton"; - -export interface HomePageTemplateProps { - buttonLabel: string; - buttonOnClick: () => void; - value: number; -} - -const HomePageTemplate = (props: HomePageTemplateProps) => { - const { t } = useTranslation(); - return ( -
- - - - - -
-

HomePage

-
-
- {t("homePage.counter")}: {props.value} -
- -
-
-
- ); -}; - -export default HomePageTemplate; diff --git a/src/components/templates/LoginPageTemplate.tsx b/src/components/templates/LoginPageTemplate.tsx index 0356009..fdb6020 100644 --- a/src/components/templates/LoginPageTemplate.tsx +++ b/src/components/templates/LoginPageTemplate.tsx @@ -51,10 +51,10 @@ const LoginPageTemplate = ({
diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts index e3a6e72..1a74f74 100644 --- a/src/hooks/useLocalStorage.ts +++ b/src/hooks/useLocalStorage.ts @@ -1,26 +1,18 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; /** - * Custom hook for persisting state in local storage. + * useLocalStorage is a custom hook that allows you to work with LocalStorage like useState. + * It also syncs data between tabs in real-time. * - * This hook works similarly to the standard `useState` hook but also stores the state in local storage, - * allowing the state to persist across browser sessions. The state is initialized from local storage - * if it exists; otherwise, it falls back to the provided initial value. + * @param {string} key - A unique identifier for the localStorage entry. + * @param {T} initialValue - The initial value for the localStorage entry. * - * @template T The type of the value to be stored. - * @param {string} key The key under which the value is stored in local storage. - * @param {T} initialValue The initial value to be used if there is no item in local storage with the given key. - * @returns {[T, (value: T | ((val: T) => T)) => void]} A tuple containing: - * - `storedValue`: the current value stored in local storage. - * - `setValue`: a function to set the value, which updates both the local state and local storage. - * - * @example - * const [name, setName] = useLocalStorage("name", "Initial Name"); - * // Use setName to update the name and it will be stored in local storage. + * @returns {Array} An array where the first item is the stored value and the second item is a setter function. */ const useLocalStorage = ( key: string, initialValue: T, ): [T, (value: T) => void] => { + // Store the initial value in localStorage or return the current value const [storedValue, setStoredValue] = useState(() => { try { const item = window.localStorage.getItem(key); @@ -31,16 +23,45 @@ const useLocalStorage = ( } }); + // Define a setter function for the storedValue const setValue = (value: T) => { try { const valueToStore = value instanceof Function ? value(storedValue) : value; setStoredValue(valueToStore); + + // Store the new value in localStorage window.localStorage.setItem(key, JSON.stringify(valueToStore)); + + // Manually trigger a storage event + const storageEvent = new StorageEvent("storage", { + key: key, + oldValue: JSON.stringify(storedValue), + newValue: JSON.stringify(valueToStore), + storageArea: localStorage, + }); + window.dispatchEvent(storageEvent); } catch (error) { console.log(error); } }; + // Add an event listener for the storage event + useEffect(() => { + const handleStorageChange = (e: StorageEvent) => { + if (e.key === key && e.newValue !== null) { + setStoredValue(JSON.parse(e.newValue)); + } + }; + + window.addEventListener("storage", handleStorageChange); + + // Cleanup function + return () => { + window.removeEventListener("storage", handleStorageChange); + }; + }, [key]); + + // Return the stored value and the setter function return [storedValue, setValue]; }; diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx deleted file mode 100644 index 7b10178..0000000 --- a/src/pages/HomePage.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Outlet } from "react-router-dom"; -import HomePageTemplate from "../components/templates/HomePageTemplate"; - -const HomePage = () => { - const [counter, setCounter] = useState(0); - const { t } = useTranslation(); - - return ( - <> - { - if (counter >= 10) { - setCounter(0); - return; - } else setCounter(counter + 1); - }} - value={counter} - /> - - - ); -}; - -export default HomePage; diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx index 0b35ead..87e2903 100644 --- a/src/pages/LoginPage.tsx +++ b/src/pages/LoginPage.tsx @@ -7,11 +7,11 @@ const LoginPage = () => { const navigate = useNavigate(); const handleLogin = () => { setIsLoggedIn(true); - navigate("/"); }; const onClickGetStarted = () => { navigate("/more"); }; + return ( { + return ( +
+ + + + + + +
+ ); +}; + +export default MainOverlayPage; diff --git a/src/pages/OrdersPage.tsx b/src/pages/OrdersPage.tsx new file mode 100644 index 0000000..37f4e26 --- /dev/null +++ b/src/pages/OrdersPage.tsx @@ -0,0 +1,12 @@ +import { useEffect } from "react"; +import { useLoaderData } from "react-router-dom"; + +const OrdersPage = () => { + const users = useLoaderData(); + useEffect(() => { + console.log("OrdersPage -> useEffect"); + }); + return
{JSON.stringify(users)}
; +}; + +export default OrdersPage; diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 9ccbb1e..020a906 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,8 +1,9 @@ -import HomePage from "../pages/HomePage"; -import LoginPage from "../pages/LoginPage"; import { RouteObject } from "react-router-dom"; -import NotFound_404 from "../pages/NotFound_404"; import App from "../App"; +import LoginPage from "../pages/LoginPage"; +import MainOverlayPage from "../pages/MainOverlayPage"; +import NotFound_404 from "../pages/NotFound_404"; +import OrdersPage from "../pages/OrdersPage"; // ----- ROUTES CONFIGURATION ----- // Configuration of the application's route structure @@ -12,11 +13,18 @@ const routes: RouteObject[] = [ element: , children: [ { - path: "/", - element: , + element: , + children: [ + { + path: "/orders", + element: , + loader: () => + fetch("https://dummyjson.com/users").then((res) => res.json()), + }, + ], }, { - path: "login", + path: "/login", element: , }, ],