From 4564c329650cc69167a41db6510ae6d4ce2f2893 Mon Sep 17 00:00:00 2001 From: euxzy Date: Sun, 10 Aug 2025 14:36:39 +0700 Subject: [PATCH] feat(backoffice): slicing backoffice dimentorin --- .../public/images/asd687hwq6nds4dfjj2983.webp | Bin 0 -> 11540 bytes .../_components/chart/session-status.tsx | 52 +++ .../_components/chart/user-growth.tsx | 36 ++ .../(protected)/dashboard-dimentorin/page.tsx | 115 ++++++ .../backoffice/src/app/(protected)/layout.tsx | 2 +- .../backoffice-sidebar/backoffice-sidebar.tsx | 116 ++---- .../backoffice-wrapper/backoffice-wrapper.tsx | 51 +++ .../src/organisms/backoffice-wrapper/index.ts | 1 + libs/ui/src/organisms/index.ts | 1 + package-lock.json | 359 +++++++++++++++++- package.json | 1 + 11 files changed, 646 insertions(+), 88 deletions(-) create mode 100644 apps/backoffice/public/images/asd687hwq6nds4dfjj2983.webp create mode 100644 apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/session-status.tsx create mode 100644 apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx create mode 100644 apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx create mode 100644 libs/ui/src/organisms/backoffice-wrapper/backoffice-wrapper.tsx create mode 100644 libs/ui/src/organisms/backoffice-wrapper/index.ts diff --git a/apps/backoffice/public/images/asd687hwq6nds4dfjj2983.webp b/apps/backoffice/public/images/asd687hwq6nds4dfjj2983.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4555c9b1ec624bc85073a0c8c167d6133a92044 GIT binary patch literal 11540 zcmV+vE$h-!Nk&EtEdT&lMM6+kP&gm}EdT(}00Er=DnJ3?0X~sJn@Odkq9&&GYoO2) z31x0&oJ>&OQ$@D6&$?Z09eM{#ZyWgQ(SPV@^GW8f8cZz?P7V{Ql3u)-{>xLdYqBs?HFIKhgq_G>v0pZLp5g1BCyqU&4A< zn_`I!UCX8;@|teKX@^s5A00M4nBUjoHZ&JSw^YE6J+-_6-vA4glLNUnx@0fH-&|^X&Y_Rof=YNGI8pM__7<`&A1^MU_6z}35&Mc`719yh zEi~7sw=IzdAeINn9WB&v$joSo?tGsL3JN7Ub)u9gCanpX|2wJ%1jZr%+c8^J-DEi3 z3*nzrVkIQP#NC`ssE)l$J_}C1>9l2A!u&9jR)AbPo816@Qhr`mj*z+#I$kY{UYJQJ zQjzV(6z}*U+iSVV7cCictYRCjCO~_CAOErI(1AFTp51sM!ZWGTbE*KJtWu5XI^6T@oO~BS8;FnknLiXj*?2_6(-TrH_%!)w6?A#XK4|8j$Olb~K z5L_o+L@Ydg(8=JpTbEslbj*MMisWhAIa9+%=CNCbP5k%CCm5%fxrNu_tIRIyf;stH zEQO8%B_BmRi(lIZ6HF`HAZn#tA9c=x=#wepo5LJW6Me|V5U4RI(t6t(s62)!y-^R0 zojMQBI+$(`f9YY`~%ne7JvkZkzai z>$-K;SrT5%U|$Uq+GpQV#8sfZXXtx0c)a%(5lauW!l_~Dx+JOY%J1HYAo+h516RRxuy%fDWTDyCG10J zgI$$!!bySOEt->Y<&WC~BIYxFiGh_S^JXha*q>Ok{#lF_FLtovs+4Sc$s~T51A6eX z$q9@ZIHGKuC276~Fng~D*9ajOpt31QWK{GIYAzv{eexO$`Z8NOSn~XsNr^-;SuKQA zZrsAt(264mWt|Bh0GpYN4D7S^y#>Q#6dJyrc-U1UngQEMnT)j{D2u6q2m#+fKf2)6 zp|UBI7T}Jrr$##RYbg|XHd#qZhv;yZ1<#${SisS=dRlhF=?}z~tf2QmrFN+Cl+vE2 z8m7bIH}>kfzCK9k3wu+8qEMoeO_fM6AW4D-*De2c{1KmcaKT90F1L?8p5uZh$4LP^tYCkH{0z)oP(!1(eun*j60 zAGeStF^~Mi$)@X_ZXNf@6_BhnBa;4)QcAs+QUz~t{s(bRBu4st+IG3k*Abig8h^+wpI0K53&nWVRSkd$2V|&6at=T{U>MBC!X@cm zmKf4s-0$y873D`ni@PH<%u;qCuHBbS5x?Ff`8$L(HS!k7Ym&h#P{zh2QE@=UvKg1R z7L^}~{8>5wiu6hoSp*^P$nt){^3eBpIZGi0yagezvL9Fa07_7ZIx5lbzkr|7-+WW8 zWGoO)zBe~+-~8@HlpT1Ggb4TBWJ3=VE`jX2`aN+=U8`6d7gJEq5v}4AKir zcu*;I2E_^PE(gXq?2i{m3=jkGVNt+%^^#084TIS*$;6l0kn;GoobPXc$lHX`H&2$Xs^>}itoBrrh#k?2^ zEZ+k@4v@`h0azJYk01tdv1F7+6~Kc+8vHNuWcGkIpd~u;F}(L`aQYb192PRMmooqM z@)Hmx9f2aR!HU^1DzBL~kogxl!1^aRfYY^F>l^qcn!*TWbs84T! z{)Ed*q))Ozk{#K@W)lFRSUDRjIhOV;6$ve!nh^V=!Wkf^lGfjn@+e~Kd< z3gRAWG zqP(ar$hM;NEG~fXE1D(CjKyrJ`#h*#oztuu%gJ>DSVvkBb=;`h40GdP5V;PdglLFh z5~zPQIcTHY=^juQ&~^Tuq$9sSz>)M1Y9drsalF~g90izZpT7+cxg3JW{%A{!X^ek4 z37E1LXazI}%%U;T(WH{F8y_I@jH-N0`ffG!N^3lv0$Fn{t8pVO-(hclGUx=>}6qA!hL+HzAab*Hp8~P1 zu$=F2*2zTWn9R;5XWuAL8Ks7DD@eYmhkm9YGam291{rnhekRqDgbWpjHG@ff{IUo4 zes~uVNP5~83^OHjP?MOG(+^_xpQv)7v;dEZCu86bPu3j;t_Z+RPZsL4Lz`^-IEYyS zD!nhYs8M ztw@=32FEQ`7LzP+%}^BXp$n@EwOAO8TO7aeH?he$uLU=L%~MJM0wkTuB`H!#KGL5*E{@4KZXPxL21XBS+m^i2 zp&(|V(0)+@eqErSVeIyr?d7BK2u#+00_j2d1o$2S>}+d|*r;o>e|VY=ofYM78{DSA zY?8=W6(4761}MX%Ez`M^qWS&UlA1)5E~_^8BzhNjjV-4Dsj26tHxxOHy0x|wg>Upw zBghA#Ck>K{NSZm|3GyzzV~;F--4At==^tf7p@wH`8?G;6;``}&$<949tS}0zi z3Vqe4ZwD7oTsjT<9)FPm%qtq|(+JUB!7&fup_=XiEPFXvBCYj2V6G_aO^9Wpc|Hdg zA!)ir=vV^Z11;W!L12#8bVI65cjwgzEz;vP$&!j=L)u^#nFk+?XXEelcjyIeV3SMx zG6j=1`sZz&)Z9zc5b8GZSG>)OvR|VD-ZHF%T^-VQVW8H;)x|bIl9SLc?a^Tl3+L1gzaY z?eM8y%`;<_=EzLwpUx2eD#Hc`{ard$FB(QG6Ibh#|8?-T9H3e&UBH~NAMj6X`aS5j zl8#vuU~UjYYR#L~m!#H&QPKR7nE2ucLzF<2UvJkkipezLPSo(~# zEY?yBQUX-(>R&CFF{I#Jp#wu+0_i}rE(Vhl3;q>2hfeh=kV3m5_;#-n+58XBe45WQ z#k9fXwg?!7P;_24;BzV;7k?)g+3C&_>;i$(x3( zt%bw!=E$lPX$}B`E?Y^?>aOF4RLM)aF#R%SI3&a;((=i|;%lEw4ky%gkG}4nIuAx- zW<1??uJm#+TVa`iD)Uanc4hUNereA|ljkX?l$ixhO2wM8PDdE~9coK4EArYsQ1VCV z=3Om8{^UX>CF)R{$L0pEPM0ul6zA^lQ%*khQ3m8Y_B+P6e1oBo0^^Asi#`$NJQ$x| zXBdu+ml`P2aVr60d4bzRtkY9l6Ed~6vTIm_-k z^th!5D9bO<5Th!VVw&tdeAtZC{ge2UbZv$k`@!rWI=@3Yk0^9VqXk1Q6`2m$NR>Ps zSVP;cM*iqKx(+lyVyN6`W?VJ;u(_^CZ~bhyi{BZomF=w6mNoGbLfkq6bd5HPAcp4v z5x#5Kghw+TI|< zV{;nYZd0_u^R8~E?cc@j>5k+p6?}a2YTM@+Qe5>22TC>YDNOIC|HYb%;7>h(jIwhQ z2Vh>-O~)x$<}}tfV&kOto`N}9=XnB}w_03trw1)6wAdY-4P0dwFemJ0xdwS^GHJbI zC5BSO=DIMZBb)+Z6eW`*=5+?nC4XJHC)E5O6S)X4Q-9jyUivD!85+~ zU6K)ceY&+?DLqIEeL#T7n9qE+jsRJ9d{m|P=%W!XC|Os5`ZBSdmsm>?oCljtoQsjs25Aw5HBp>Q|{H^ZEB&$V_ZWbm1$bnsBi6FaL5R` zH;I~^1Xb-&+#Im*o^J+19a@mgsA#qBsioE&K;XnGFpI z=3lYI#OdvBs?tN)QQPLd*!x+T!;7E+mDdx4d3ms8%5(lZ00;#Ap(25gJCWG(8e~zm zuC_E&$bz zlggK|J>3i=65y?3JZn+#ub+wu;l}S{BI#CQ_S0k(aPTTyV{!;)B#B0E7vGeR?3lYB zsB-RQ1{us?7xkVLWt5K#p8S+^bssP~F(*2ef>}hvM_5cGuU!S5^u!o$x#1tiEhu27^ zH(4+)>ZI;+~QnYsNh&Y zfJrigAvIk0b>Y1Es0|B`=Hvfde8^ZOr(fioR6~B~@5jXGx@r%vs!ZK)qm)R)pWkHY zW+r1YJvACL`+v?Jy~e4Nh+M$ifI%&Zvpq8e=|A;Ozh6Z&8;uPXB3|+WSS!7KjvU9~ zH7!QQZsyO^FoNfYn@|)byp$WRG>{yO8x)@H#NZyuzc#|iI@?L((1KObdXq}>%z}__ zG7%|qo`=Rzbm@dp;pwA_)r7Q}8+PKn4GED0+OdD1YMqaSUQvu0(c4L+KRRwpZ`b}P zXEZ(A(tE!yv^@v=;_=l_`qP6YYZ;H~I{z-f94)`pCL%I-kQ@ z6U+4%1qEyVNcbRmEgNQ0g)EcIFX*bZR-l45@a)zBGeH=JtSwlu7n>+Jk1FPL9Aa~b z?8*o~uhbKan*E%~>ydQoXYBg|=W!25*q)?Xm<)PIBK{UWgwFpz_qqhFw21zzR`O=U z3_Ku$C%t_;Xbz-|w`SA48>b~2z%XVH#m!7bXu15oX+;PGhVqBeP;}?mlimRYWid>- z!6ori8p2Del+yohN7}r^jIR?;kuA5WXM@1}lY9#K$-)slw@~KuNroZqrZYP zrjLAK$-1%5+4!y|+eMqb`iPda*iO{J^209N44W6>#4Ez+8_a1ft;cuj>0$x#qC#iz z>LJ@kx(S~Nqa+25L+DKg6E*A z5Xlcr<_3$p#lfItx1&&asgtjpqKvQ+OyRxz&=)|(N4Rll@d_1Pa13(B;>ZV?$wkr; zuSRs)zN-JE;1K5iDX0Y;|ET572eb*Wh@J9m?xfN}3kB07H|o>14tsn#5WAFcm_H)0 zmy2?7`G2r}P3oi3(ykU}pk12voF=_>+g4Xm(eZY2#fnS10_iJi9VxVsM`Z z?=2^^P+3Z{M~*a$^`Qvptt=R?f|pmx|FSsj@N7umq1-GXndq$jbnc61f$zEO+F^dc%rs^S8CWer9_F zxUhG`GN*OM7$6HW>$t@=x#O`SzH1}tBMI>Gv& zbexZyKJcQ_5MJ_waDHd$`Lb0_OjfHCPyyZg#_M!thK30!;ZC3$_~6h;kxtuW*reo8 z!3{PWip!)?vQBSr52b4>ijQEHo}^mtyLN_&a~j^oL$u{MTSRTNkn|&_YxMU?+AVDX z*euxiXhGZB*lZT8P%@zRU}7u36OE{m!%WgQf*0qJ)!u$an+m?9RO2jq4j(GziKPHk z{__5(J#(BWNh{|2N&=FNvM*9t^|{PJn*(+% z)G*#;L+iNsZLZ4*iEHQ%g;QNb>%v~7Oer`#QO%yX&}0k@(*8Ll_{Q|3pm6}`8-olr z_8honuVkPxq5XAh2v^8LS`a*S9*t+2+nKjT&_>I!zcWtjfMSxQm+oX zUO*b%tMY^+Hf{S+5KFh$aj-I%X#iRLYT0gqku_i8JJzvZR)_;^V2Vr0N9V^t`da$1 z1H;-~QL(|i+m8yhGrwZAh1teCB*ezhr?^WdDSNWXi#2#-v1w$RY(DIz*g*AuY+2eN z?8m+@TMq47#bnu4SE$h*wnH_$E@~8nr$y)6Y_$GNu76eFpajgAg?4VgxuS3kB-GIK zEfQ1>vYqqxWK-1k_$CmqfPg0VjC2lIu4LQSeDi1m$yXf~v-+p>%vZ$_ zAI=EgC{#+_alPov!ewJS{>r4S)ItHP;nv1nyjGJD^F~CuN7ZjUgL(aA>1QYfDft+UQzk@PNW;4%x`bM1TbkMOkv@!dLt~ zmfLFz$s^ui0yPqA2OET`zxegSLqYX#fQ$k&Exyo+onP-UB%Frg>O0f0fO*EpW}~3n zpS02ulXI$*t9!eKI&_D*-&16)G#?K$F{i28&TIRmZk@pKwA?ts1$bV66d#5wkL4Ky z*FM@us*7$;WHB1L|3UX4s5=qnn3HONA;?+%mE+~OgAJG7IYoNAO}+C?BHn2}^9i;w z{t79*)@@+8wj8U{g{&#%GhX1s6n?}66_dV&oKU+ewbCw;h&?@x9eO_@^D-rPBqgVb z+S+AwNEb~HV!gxSq{zAif1YE#wYSlal`Y&DSt)1TEpt-v35CrQ-oeo+Pd0DyI|8mX zy=50v*DYo|uar&!CD(8U-R=}XAxPgA0D#=P(5KPDZffoIJulFw7`ZV$Eb|bkX$HuC z(CGdCWI49DMfA)pK8KOG(Y9*&7Hpf;MAh4Z_aasaKmU;(tpLrb?M_xEn}3CPU4%7X zn~1`2kKrw)qK~mr)`oU?a@?9>rx+jYZE`hrSaV$tmW8-fjM~;RVq;U(#K8Hq`2z|M zN3!9Q@d{|R&BWVqNC7N%5OPyyyODwFyIu)sk)z)qAURCQh9BwgL}{7p5kFd!H}KbcA{on`m(R<$WOBRRrFYFp5J>6K#fYHF z*Pvh2ue@EkT47I1O<0sjsE(fN=dRf;f71;f&MI8NDCI_HIm-Z~3qf6-&jCHRu^oYD z%6)Ix2IEy;)PqNK_LSi={2>|15M|Bu3YGAx2DR<{jk;ODOdHWj%zLm0IPMA=0{8U) zB~U$7>)TApQPX!dy5@05MqvP8^2&Q=afAZtl}=t69^9MYIq*ZX!l9eh0N+%_DDVz4 zg0z^P^UJjt3@=Ml!dqw`=UFTnWYJICsvRV7M9D-j==fS%MykoX9_M$8W)k#J#NgQB zJMmR~4}UdT)AjwOWYT}=8flw{bm8kMY^MA#K?!$ z!$_TdCYKGM9@2l;geUKFC-BGomG)KL$wj_&p7VH zHBiXmzgPtuwPzYYK@Ulm=To5JsN!Lh8jR4h>g3D9zH2|rZCmup51Rm;Kr$i&Klah& zqeqt^Zd!Vd{8z$xA**)icaCgjg8BH0V%>-`kqu4Lbz^{1ltA;BA4l`iM1BUVJmP@p zRk-FMQA6!K-VlRGdpruZOe3$G55_n+uj37l48wt8BSFGLRVB@c3LF8byQ)uz3o4(k zeEuMe_aIng<~f@fjN*~f!~D=jz)I)ZmGs#2Bd_@h@l=>H2S_OgTv)~%v28IP1D$q9 zaj4VV2O8`P(4k|j!)*;R;6c4QK{sIAz;d&_`V;5}nJo}5y z+UItn?8CeXzot0UA>pWBi97ASPuRD$gP?##_;7S=%+=D{R}ynSN8ww9k&voRWgcFz z1HH&12VhF*-Rm-yww=hbSYHxbEe9#7$xe@cDdpv48NCWiLffEa3LFR8{36DlI4aK< z;BAvLpd7Gy4BVbs$#r7^mHlnwfRLS#O(1P(-u+lHGezT^TQ}BtvF6kYue1g)F8t7H z7x<-nlO@l$%}E2=b_%*un9SsnB@;@Xv$ohF%D>-%-p&)G+0|#H??dA;|G+FzR{ZHM z6q#I}5XDC)+*pBySP4oAQ3Bo#<#NtuH&Nok987J`n?D;=NHid)5&-kcsY!l8R!Di^ z*w>NiBmb*?*RCbOe##eky1{;ls{GuHu<@`lF#8*UHq zef?w_D_p5nBx*cU9tE^19cNskEo9v@*RETtxPc`-n-y|agC{vVR9kig@*oZVL2XCx ziN$pSwQv-#A_ky{f(0B58B2}SUWGr=rXB96OLDo99=&AbZ|v*PkmR9V$d|XX@oLtR zdc7G(_&D67YBoQpfW4{UlZyQLxB?ZX>H=n@B`VW=Qiuo?cNuReO!6nt{R}C&r7Ipx zmy62qx$NTMDfcdUGwxV^5H_geRd~ptmE%4=JItuO2=djc6a3!V^PY11>6Zk&p4u*K zd;iT-T4-l-Ao_YHLvGu`mGgd%G>JtQ=5%M}QT3TwJ#3`1oW=&_R7Anke1J%GQjTh2 zmdD-79h!!3**ijA4CK5!a>3n}l|*(N;3WN?s8e%_#y zuWVjAx&ui;%)_o_n~5qT)wiL#-T#rw{D@t$bB!BrF$O+B3&R}I2Gku}Xp+I8c2LYM zLzQRg4S6ntLU{WKn*!FDz?hFvsMA>Y3MFx3Y;F5*xEqmmPMPX#<_FPBlR?gEgk6y6 z=eda}Hk@CMbmE!Tn9L>WDa_9>^NheH+j2iF;5E)h>g)ifo&FubTrT^q)Ug*%WQ4U` zkDl>B`|vq>nx0A`8fZ1Y8i7^-OMMwSJM+J^vd2$vuJ!*7xjr+!**JWSPesa<${$&a;{@1RxtJ+7FOzf z7trsm5MeEX(*SboxaW>LEv#~by>-FDi%Ef)jZen zPg2W(*^ASm{OZNKw!%=A7aeIZ=RkG?Ig#}y?wmG9Y;~p><{tLuQ;%rVXn!z8U&%bj zFGyK2-4QMx+4$+lg#cIKYOgPuEmvtSqZ(#xRJG^|R84780C8NLrIu0nEaU-xi0#P| z*EVHHNX@jt8oZ6?MPnX)hYWascJ(&^&&LFkY~8s^1+Hoj^wOHZ518S%o3~JFlychV zIxJnhI?;BBm+^}J{Cve<$_TJ+1f#wiwf1g3dAlrjgZuSm570%_S!I$_J8ZOnZlt2X zirWhaW8!1Hxx~n#=Fe3NrbUx(UOo1dnRtJ#rNf=XMWJ^QT1FxXCkaW|jR0)V+1&ES?h6?w& z4amnq!s0A~F=XYNIOsZtKR^H$>NpD{XUD|bzv7a~^sySJM^)y_z%X4@?H^$^fPeE= zVk@g)pSwPH_cRh|bn%c?_vOF@_bWsIMKB2@o{_ygwY8xPdp_pOWV)D#(k&Ov59^rI zJCD?;ovryM)jA`WzFOaV!04uD>t->|kW9+H2M7_(pMwW+0NNOULY%?T_y+`2sJgbJ z0|$A0K$hw-Q_?m-e2p4oz%1GsG49SF3`zd3q!H}lU3CNVZUU9rW$ezuva%tJ`DkS~ zjLTY9y>vz%P0%#v;U$Bs_rJiH$UFDG)1~MVS46uLnle1fkK^+hF3sT*W{z7eCa;-<5xI`mI*B#nRWVyI}>{Zfo7Ec)pM$@?Dm9uqUl_k zY5BoqSH$PY-0&q1Y!#Q!=(toJf!S}Huj2-bqccb=fhbczmK%dK6TQ<-vnr*Lv!jFg zviv}zXvf9Dw&9vxS{GK1P8cnme?&eEtSR8|qapVxRNi;K`ylFE&XX*IQHMF9Wm*>0 zzgZ0rI1Mc6sw*{y^cEdjARZzOVtG>lDl;-{JNB7yQ>$Ds7F=5X%L((G9fw+0evzZN z$Z^@zYE#!4=K&+L4?q1@ivzQ&=6N*9JpxHk^7_(y$?u480;NAKgHm5}L5Bu(BI)Wi zedp%fIjOb9+Rmi)KR%vtF5dOuPo^}XI(x7;-|Y60xpUx$`g;zFMCib%%{a@1NvT_= zkd5b|_?lGT6xYv05X1oikZCc?@p^e3)0jW^cW(uaT1NAg&H+fG0X*nFH!g;y(Y%quZkWO_tB5MjAbUV1 zHjD%7ml%~0JW~h1@5&Bt_&Q^JP-Fa*Tjm_R+(O|R!SpIusOGg+E~4Kxg%G6W;g(%I z?k4n1z{stD{z{UJjXx@I|AykydYYUegZfGzXe=>1mpA3Mz$%9FHSSy(R>9CqdnSN6h)73J zh%CJ-o}2&xHDo$$JFr9IU09oIJkpQ==ce3JKhzMs#0pb?AzYDl*X;>h!Cx}dY?dzn zdSJ=p-+-@@vyGvcf_{5uzq>i=bi-WYT1^oW7>4^OUK{?VcaAteY$^L!Fhs6Wt*Z2)ru zE$%XZ9&*cV1~DYaU8@TKYA(Fbz5_E{Jgg`ULp4&{+YnaB1RvqUv9CQ7V@ { + const radius = innerRadius + (outerRadius - innerRadius) * 0.5; + const x = cx + radius * Math.cos(-(midAngle ?? 0) * RADIAN); + const y = cy + radius * Math.sin(-(midAngle ?? 0) * RADIAN); + + return ( + cx ? 'start' : 'end'} dominantBaseline="central"> + {`${((percent ?? 1) * 100).toFixed(0)}%`} + + ); +}; + +export const SessionStatusChart = () => { + return ( + + + + {chartData.map((entry, index) => ( + + ))} + + + + + ) +} diff --git a/apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx new file mode 100644 index 0000000..2f6dd71 --- /dev/null +++ b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx @@ -0,0 +1,36 @@ +import { CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts" + +type ChartProps = { + name: string + activeUser: number + activeSession: number +} + +const chartData: ChartProps[] = [ + { name: "2014", activeUser: 0, activeSession: 0 }, + { name: "2015", activeUser: 15, activeSession: 25 }, + { name: "2016", activeUser: 30, activeSession: 40 }, + { name: "2017", activeUser: 45, activeSession: 55 }, + { name: "2018", activeUser: 60, activeSession: 70 }, + { name: "2019", activeUser: 75, activeSession: 85 }, + { name: "2020", activeUser: 90, activeSession: 95 }, + { name: "2021", activeUser: 85, activeSession: 80 }, + { name: "2022", activeUser: 95, activeSession: 90 }, + { name: "2023", activeUser: 100, activeSession: 100 }, +] + +export const UserGrowthChart = () => { + return ( + + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx new file mode 100644 index 0000000..e22b1d4 --- /dev/null +++ b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx @@ -0,0 +1,115 @@ +import { Button } from "@imphnen-frontend-service/ui/atoms"; +import { BackofficeWrapper } from "@imphnen-frontend-service/ui/organisms"; +import { For } from "@imphnen-frontend-service/utils"; +import { ReactElement } from "react"; +import { UserGrowthChart } from "./_components/chart/user-growth"; +import { SessionStatusChart } from "./_components/chart/session-status"; + +const Overview = () => { + return ( +
+

0

+

Total Users

+
+ ) +} + +export default function Components(): ReactElement { + return ( + +

Overview

+ +
+
+ + +
+ + {(_, index) => } + +
+
+ +
+ + +
+
+
+

User Growth

+
+
+ +
+
+

Session Status

+ +
+
+
+ +
+
+

Top 5 Mentors

+ +
+ + + + + + + + + + + + {(_, index) => ( + + + + + + )} + + +
No.Nama LengkapAvg Rating
{index + 1}Mursid Al-Catraz4.9
+
+
+ +
+

Top Booked Mentoring Topics

+ +
+ + + + + + + + + + + + {(_, index) => ( + + + + + + )} + + +
No.Nama LengkapTotal Sesi
{index + 1}Mursid Al-Catraz1000
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/apps/backoffice/src/app/(protected)/layout.tsx b/apps/backoffice/src/app/(protected)/layout.tsx index a770c99..bc53fd2 100644 --- a/apps/backoffice/src/app/(protected)/layout.tsx +++ b/apps/backoffice/src/app/(protected)/layout.tsx @@ -7,7 +7,7 @@ export const AppLayout: FC = (): ReactElement => {
-
+
diff --git a/libs/ui/src/organisms/backoffice-sidebar/backoffice-sidebar.tsx b/libs/ui/src/organisms/backoffice-sidebar/backoffice-sidebar.tsx index 676dce0..1a61783 100644 --- a/libs/ui/src/organisms/backoffice-sidebar/backoffice-sidebar.tsx +++ b/libs/ui/src/organisms/backoffice-sidebar/backoffice-sidebar.tsx @@ -11,12 +11,26 @@ import { import { Button } from '../../atoms'; import { FC, ReactElement } from 'react'; import { Link, useLocation } from 'react-router-dom'; -import { useSession } from '@imphnen-frontend-service/utils'; +import { cn, For, useSession } from '@imphnen-frontend-service/utils'; + +const MENUS = [ + { label: 'Dashboard & Set Gacha', href: '/dashboard', icon: }, + { label: 'Dashboard - Dimentorin', href: '/dashboard-dimentorin', icon: }, + { label: 'Gacha Roll', href: '/gacha-roll', icon: }, + { label: 'Permissions', href: '/permissions', icon: }, + { label: 'Roles', href: '/roles', icon: }, + { label: 'Data Akun', href: '/accounts', icon: }, + { label: 'Validasi Transaksi', href: '/transactions', icon: }, + { label: 'Data Pengiriman Hadiah', href: '/prizes', icon: }, +] export const BackofficeSidebar: FC = (): ReactElement => { const { signOut } = useSession(); const location = useLocation(); - const isActive = (path: string) => location.pathname.includes(path); + const isActive = (path: string) => { + if (path === '/dashboard' && location.pathname === '/dashboard-dimentorin') return false + return location.pathname.includes(path) + }; return (
diff --git a/libs/ui/src/organisms/backoffice-wrapper/backoffice-wrapper.tsx b/libs/ui/src/organisms/backoffice-wrapper/backoffice-wrapper.tsx new file mode 100644 index 0000000..1c2205a --- /dev/null +++ b/libs/ui/src/organisms/backoffice-wrapper/backoffice-wrapper.tsx @@ -0,0 +1,51 @@ +import { cn } from "@imphnen-frontend-service/utils" +import { Icon } from '@iconify/react' +import { FC, ReactElement, ReactNode } from "react" +import { Button } from "../../atoms" + +export type TBackofficeWrapperProps = { + children: ReactNode + title?: string + className?: string + classHeader?: string + classTitle?: string +} + +export const BackofficeWrapper: FC = ({ + children, + title, + className, + classHeader, + classTitle, +}): ReactElement => { + return ( +
+
+

{title}

+ +
+ +
+
+

Rizal Syaepulloh

+

Super Admin

+
+
+ Profile +
+
+
+
+ +
+ {children} +
+
+ ) +} diff --git a/libs/ui/src/organisms/backoffice-wrapper/index.ts b/libs/ui/src/organisms/backoffice-wrapper/index.ts new file mode 100644 index 0000000..ff297af --- /dev/null +++ b/libs/ui/src/organisms/backoffice-wrapper/index.ts @@ -0,0 +1 @@ +export * from './backoffice-wrapper'; diff --git a/libs/ui/src/organisms/index.ts b/libs/ui/src/organisms/index.ts index 20f6043..38e8964 100644 --- a/libs/ui/src/organisms/index.ts +++ b/libs/ui/src/organisms/index.ts @@ -5,3 +5,4 @@ export * from './backoffice-sidebar'; export * from './datatable'; export * from './filter'; export * from './controlled-field'; +export * from './backoffice-wrapper'; diff --git a/package-lock.json b/package-lock.json index 1b89f05..38f95dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "react-hook-form": "^7.56.4", "react-icons": "^5.5.0", "react-router-dom": "^7.3.0", + "recharts": "^3.1.2", "sharp": "^0.34.1", "sonner": "^2.0.3", "tailwind-merge": "^3.0.2", @@ -8070,6 +8071,32 @@ "node": ">=10" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", + "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@rollup/pluginutils": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", @@ -8879,6 +8906,12 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@standard-schema/utils": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", @@ -10971,6 +11004,69 @@ "@types/node": "*" } }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -11346,6 +11442,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@types/uuid": { "version": "9.0.8", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", @@ -16713,6 +16815,127 @@ "which": "bin/which" } }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -16861,6 +17084,12 @@ "dev": true, "license": "MIT" }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -17827,6 +18056,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-toolkit": { + "version": "1.39.8", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.39.8.tgz", + "integrity": "sha512-A8QO9TfF+rltS8BXpdu8OS+rpGgEdnRhqIVxO/ZmNvnXBYgOdSsxukT55ELyP94gZIntWJ+Li9QRrT2u1Kitpg==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -20840,6 +21079,16 @@ "node": ">=0.10.0" } }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/immutable": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", @@ -20978,6 +21227,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -28649,9 +28907,31 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, "license": "MIT" }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -28865,6 +29145,39 @@ "node": ">=0.10.0" } }, + "node_modules/recharts": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.1.2.tgz", + "integrity": "sha512-vhNbYwaxNbk/IATK0Ki29k3qvTkGqwvCgyQAQ9MavvvBwjvKnMTswdbklJpcOAoMPN/qxF3Lyqob0zO+ZXkZ4g==", + "license": "MIT", + "dependencies": { + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -28892,6 +29205,21 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -29094,6 +29422,12 @@ "dev": true, "license": "MIT" }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -32068,7 +32402,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, "license": "MIT" }, "node_modules/tinybench": { @@ -33841,6 +34174,28 @@ "extsprintf": "^1.2.0" } }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/vite": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.3.tgz", diff --git a/package.json b/package.json index c306c58..946e5ba 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "react-hook-form": "^7.56.4", "react-icons": "^5.5.0", "react-router-dom": "^7.3.0", + "recharts": "^3.1.2", "sharp": "^0.34.1", "sonner": "^2.0.3", "tailwind-merge": "^3.0.2",