From 1a8c25f09203ef1ddd3d7230bc8d0f1c4bd31087 Mon Sep 17 00:00:00 2001 From: Lanskikh Date: Mon, 7 Jul 2025 11:12:02 +0500 Subject: [PATCH] upd --- public/images/empty_ghost.png | Bin 0 -> 13793 bytes src/components/Button.tsx | 2 +- src/components/SessionCommentItem.tsx | 59 +++++++++++++++- src/components/SessionComments.tsx | 2 +- src/components/icons/SendIcon.tsx | 4 +- src/components/modals/ClientModal.tsx | 68 ++++++++++++++++--- src/components/modals/CreateSessionModal.tsx | 8 +-- src/components/modals/EndSessionModal.tsx | 30 +++++--- src/components/modals/SessionModal.tsx | 10 +-- src/types/Comment.ts | 2 + src/types/Server.ts | 2 +- 11 files changed, 152 insertions(+), 35 deletions(-) create mode 100644 public/images/empty_ghost.png diff --git a/public/images/empty_ghost.png b/public/images/empty_ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..b59f875e67543358d3dfbdc4e4a4655aa9b28c6a GIT binary patch literal 13793 zcmdUW_di?TA3uo@J2tfvRij30d#e&D71XQ|YVTS_&6bMURMo7l_G-nZMb)akXN*#_ zO6{UH-|O@J`TGZae@ODky{~)D>zwl%&)2wbbhK2dDQ-{@5fM?Vp_TQBh=^l>k3N(X zxI)qC}ry8aNW>GAFY7m1(isiKI=207M&KO_!Hno2}Ol`)j(RuCd0 zDIYauC4E2Qtq)J4OegApE3(tTM5Uvly^tbGt~L&6C7m8Gf7)^t59Ftd14(2&T2xj3 zSHX{0ILV&4S+vAH`iFlyo6e84)MVBVpXcG~wr7Z7Q^p_Uvdr{#}v|?r2jUr zwl5ScOY zS6lb@Ob%Fj`#nq7e)Ygyx-ZdT&aYvkdaPiCE2vG3q3kJJv=!CJx|i*8=R0vJDJHX@ zfk$&AZ5N_RNl7b99dA9C+R6X(|7+{TJ}FVb+ZW=41g4OTHdd>YMOi@$i;6}DzxK$$qo&_yaQA@SHmr_l)(L-z&OuMyEN2HZJGWg5aq%hKcN>V66E zgu(Q9s+Vxy=htT0h5M)I@kkJa1Ko51eG>XU}7 zcI&6{>I^NR_rj$*v*i$Byu)-QgWrGa&*d)M&m+&LitNq+Wb%z2e0$L*&eAwrrID)Z zK?5+JEsl6{f|q1q%$;O{B^-w8CgK#s)7F)tUF2n^G-zZVv( z=+#DF~XE*yf8bP;WAsNi(@wd zROl}oxRN$rD~bu#J(UeXbt>_jo*j~w#<;X&5OtNjVK8w76^2{3ns3@2gHR2N6{|FX ze#~;aQvV{f7$LyRE^C-B^GtdtWW5uNhNePaw0+u-bJs800VIJ)1g0l*F+f95U2CI{ zr+qy^U;-{e!p7B9qXyi%XfkD4>|VT>X{^_TvVj?4di+lgDF(A&e#?xtZlMsv{x`~m za*6<<{^S=KeRf?|+ZRA03kwVTze+<9QV)m`-Xn3pqH>@OP*qdII2VySZn;lF5#jxw|>*aebv0CLG_2QkG`<=vZ!OJIA6s(4<3FN(`qH@c= z*K%7ErD8n2vbwq&B91*ou*tZ6>`qKvZSWMSK?pKz$a2u3pik-0b0UG@0h>UyiXob7 z;{l7QmYogB&b82)C~HSiH->0F7iLBhre5m{TU!G5VRZ+dFO5N?KNV)N=@W(p#uc+y zbD?B39I@iaZ>n^=4Z0Y zbk{d5HZ2<)dwU&MnUiRcc)yoT{!{x~lRI|bA|xCJ(Ww}by?ZFMrVbLFNR@FT`B&Qw zZ!p2|rV85x#Nab!pIjM-sJ2rm2=ys{C!>qch_E)J3$Yx};+_a$J3RW)0uqaMRfT>e zr+|KpFEbZ>{&%66-H%NaUucCv)F9EW*W!vCFcb6jY^Uj%R00`m z0lX4#-O1NT%5HBR*N}sa{j|20ST$5vNzB4jQ2L~gZAK;%`rb88Fv2b(^m``e|FSCg zqF|GnVM+JkzdpIM`OmIT5Om*%3=$#soC$zviviq0!1s)&MTILIhPZk($|r?f_d8#v zWezGTeeNEz4G;E0q1o3W-z$RWNS8fsbqUiv+7V)CESG<-*30pm{pdy57&$p2Gjwco z^fh`K39E8jsIIP7VzN|zmNXwTY5W;mpOTg~I`6LpIF|>j`GwVPk67QoA9!hR&sR*3 zdpzUZLh@a%;^Bo4AWib%?F2^#%Fs@w2@b_q@;(aw21&0q0k!)p;2h<~Ec~{(0ZWNM z$WS7Fjm4xH=}J0;E_keQ#b2Bq^;Oz*<(|QWX@@$UH(rKkE4<=12NyE&bVnaWw*)e& zk$7NszOa`C0_w;$qDYyUl|_pVgb!MC1a&H*3+}#4em}5)-DdV_aup}I3oL0$GR@;MvV6+8yVn(Gne%qGjvo{-2TEa2^bWR zg?nT9e~5frfaNMy*}l>|GDEhO({2h=(JaTj0)Z{1O=j4xa~rt*OzZlQpO#B}y%4T%N+N-VeC79hc^ z^B4T@>Tp~8>)Qtm{C_72h?{-MvbYEB>zzFRyEn{aW8?Ia7GFq?&Vb43eM}wHP!9*8 zdM)9XiyD*+^O4}U3&+Br0j2;$VYgs*4#q$EqBVnzS6Mk0et|-(=^(p{TSP{;=DT%* ze=@QRkLy=j1!}(C;pNm;g$FL|^Vl*9z-{##R^JH|R3DS%qf6BpUfbTPU)ts3M6Fw- z+m52I?~?}ndGe+3>(pCYMFS-|qx2YZ(4*hC41h`VMx~w|+XlP*NDAVftIYGS^{c?e z<6*C{3lDCuHs5T=f=~~0ga{<4E_*4W_B=sQ{IA2AmB0Ybg+N|oZ!y#~1L|QIKx4Jw zCI9v?SbaOcYeGcy<-g6I^C|Q4$!;zSKh0;2dk;6Sx_G6%!ei+G(bHW^lc{P~gu~U8 z)*758EOl)wZ&#@Orc0M=-8=8IxQst$RlSck!X#=z*%-_!SM9D9##;;Wu$@mVTC9#m z)D(&eMrS}q5B3`8k2_`Pudce|Zk8QMiG)R6`_K2pM@)mmW2TtjLs`k!rgW@@EugMd zZtn4MvyMCkWVQr8h@(ju9RJ7D-E=muG31G%r=^t)fGzUWa| zz^*~>i&d2)lMVQk{vVd!7f6RVr?EBR~_U~WK{1+G#B@*0wSNt z%PNkCs=j3n@O6_!_e5(du@{pC%kp90SJx+)dfA0LI>E1t=RF~Z`Lb4&@6M@-VS^XIEF zBZs_{H{G7|_Q5ade9z(V=8LUozh-Kk-we@>Ic4R!sUZa5ytJH^_!#_l35!L5SOb@X zl_cVF#4G;OfXC+L0`OXtD4ub2W?}jG z;;=kO^Id3rU1b9btpzYI6dv*$7MpDTLa>38A2!8G2QS3(CJ-Fyt!XMd#k60VMzOyY z`KcxfkW${S#M8Q<#2l&u7n(q~;T~czZ;MJ&-qadlDeC;ZNb{IL4zYK4UZT)6*VOek z+(fPWl6yps+-=9Ia!;9YChpB=b32g@m4LEdlf286#mCfame4Am>nNP8B)mFx(>n({ z5X6Gbs!&N>R=3-XXE9 z;+5tvx1>%E#tCs|`4egf?ng@j zMm2u56BM058~`&z@B+A!zAM%bDO*+JYBc$#p?vA#ob_W{aEGU^$Ize7wA56OH@>GX z)+j*nXR~GWhME`@_9Zu#dlQ9pcje!nsXIKjO)XGZ&$qJ_e1Vrb(=2V3g>yxdL}XUf zlJ@{$wl1Z5r(5rcSmAgfbWLy0NG;Ee?W#MP0-Y9{66{4p$@@`;8Ovm?s9ATM6RR%( zZ?`wZxBS=Azbjc`ye=OJ$nx+pnKQB~l&4ivk|sAxDUB(l>mI)S0L3l7r-Q_)sdBKB z4eC_8{I&m62C$E3)||JyP(3MDDKbQxNHe>)f8OQwvWZg$hHht*9n$kI3oJ)6A5C0d zoaOcL4RJr?F|MjSNO9&^>3qljvDGVp#_%qujI3iMFJST2wK; zDU&=hcqApM2G_W2HkMnU_n5@?7;cX!nD09yV zVlN^v{?o>ZI+u@EL%n=iVli8go)Qvv(7xD!A{Y?udwW_W6m7%VjXqkIj zO!2L-A&%?Gg*-Biof3#p!en!>kEA(0>dNdL93+YeZBn^}uIeF$AI*v%{a_9w(b*zB zXacf|hftDZ}g@ zAl+ZfrzHSS(9pIvH8NKEvwgTRnYV$So0y4_^}ufYY6%99*rSgO6#h~`hi|Zty@OEZ zBh~NRJD}%hjP1$4c@tQ(zjR6Ketr`FOheeT(TSMMLCwhLNG=D?KLxhrg-^tUeb#P; z9i-A4S(dpk)Bbe_06DxyHkT=L@n04{W6V?*`4BFz>)KzyPsnBdtsRHA#hy8!f_H+< zF~{feb?%EO%RtrDFc_r?JV90ap_du)zA%9*v&+t+bu0H<`ILMms}pA~ow;pB< z*k^JCDey>+(5<>M%fJ+4`Jwwqre3Mc@(vsEBVwgr@gVDe?A4*`?luL+h$QwBAuk&` zFh#d5R`JyTY_PFRh-mUPGfmpZuWC!X{SrgU$^IfAB>4tFVlkD5`wj?En)nWiR<+>7 z(LN9tiZAM$xHW+ZxjOjcS@Yb`O8rjL+3C=iy1KRVR6w@JH}O1h4M+OwddU)sWMeUj zPg)=3q+;J45}rJRsGCrW#Qqy&Qhm@E9uDcz$T$qH9}WJFCw2=EM@-GG%``0?QYi)aX-k zAElkCkBELH>XH#MNi6%`^k~!?aa?vcMXP&7Oo(REAmgjx0ClcgjE?;2P_q6wGlfR( zOJ~OG7*A~l00F7d-`+J;67a?nE1hi(Uh8_R^Xz3R2q2EHNsX3uQdm&$b*64Py-PV% zh2idQK+Tuj#>en^ZqNSr5qyt9sN`0moA7h%d^NzJWJ!grb6Pnw0Q^czFm8t3`HJR@ zSidP_!>#u5tBEYeXA|7wJtnDZQtOmB9?Uk>%|J$+_Rg+oKSa0^RxX?f zk=}5k?Z3v5jqm-9sE9;LTh+y@2Xy40h_*`#?JUgzS656aA#_{Y=Sdp7kjTxxKQZ1w zJW-l=lV&d^HI+Ql{qp?elC=8e(e|UKEsklptFDO0ki}H5VabXULO4YYK7W7pzd>9& zF0bC2fWcj!_x_SfYE{gN0JbfW_p9&f&v*rOX8nvxTT8Eg&hNr%1_i zgDMDs3m-u7_TiXTFF?8SRp3@Z-KPQ#sp%@A+6pJOd|$}hZ&MwR8U#}dA9Rpuf_X3^nej=oGKS1T%5T{K^wUA$W1tFM+p;dUtZ)QBu>IvY0w|u)V4z56GeuQ%AAM6{)WYsT%FIBi4MQLJcwD%aGbjK=@?%T1X#ktG3AqV z*y!yDYi<=A$dvpN=(k6@OeE>sgUQ~|NPUL?0#ChQne}AeAuf_^h?LBgPW89ptV=2~ z1d<0VhWFNRdEb=dZcs5&JKZO;N2jQSdZ^$`BvZaf1(**rH}zbU>uBim+ZUPERs7qY zOFwbYWdO+}mDG}>ODM%=8lMj{A~MGk;_)#@KVJ^5H>gu)7;QCx(6nw&lniwhZJP4M z>=G%NT@)jhFXGvSdMHM+SQ;v!dzmVgB)r;AMSok#xL174tiUDW8|u2vFCRatdw|rD zcq~JBm?^}ZyTtJOnq9~8>O>V8W(3!0B0Zk=Ie{#)pZ5XW+=kwpq;~Jd-~N_jc4#*M z&_X@#Ml$gTae^a(z(*7MdQKZ26?{AtopaCn1_vK;kj$tK-O*I7v(eRMYHI3~Nt#`@)JoX?z6R>dsiR;&Bp-vDu=GfWp&D&k0u6XI$k&TrbdqP) zotSz!RLgFZ-rOc04>YjzJ}Yhkoh)--u|`okJ6YPZ6q?X^lxmLRVT|4sa~K9n5m@tj zuP3Qt7Eh{C4q7?6yY9uwujIT9*=l9OL@C;PAY&s|Mgx^1GZs17kL%3n58+|b6{trV z?!N~=q()MDJgPi+?i*(tjv1raPj3o~tqe9-20LW>FVmUq6FavBWCCXB_p((Syi?CX zEKAzKMZ5xO?*A*%*M*or2! z-$sb9rgE%;j%>Oq@TIjpNzBEnO!M@WTl=D?jq$u9uty}2UJ6 zcX9eElQVe02lp3WbJNT{tM&Vx-$srFE%AecGT5bEa6qO-jyv!`clygS3$G_;?A~PU z``LLO2uol%DYguO6jW3K*<*c|S3s=O$NsDlp;os9C*YY$%lL>Wa9LCW4`*X6x?;GWofk%7@9YZtWqR|S)V27wo@Xww-t1ff@v~W+^ctl9 zXMc$@p}k%ZP^1h1cAmzy(oVSf!;(Pcd40XHO$qxTQ=D?eEt1 zq_plAzWp$eCgq&pv*xQ5Bh+-qv8O!5_4!8WmtG)#w8EI~EV; zIGPU%QY7RYoh(%8!4?b_ojs#EA=1nF1D^$paVh+qYCN95KlnaWI>g`okQ{3-F^n9k z9p;oOOLt39nluxX9kZQXsLe~|DU>@UdI(O>b06c=FmDR*&#qhoBH-nKj0rl{=b)6q zAJ&e+$119N=e@Gu!zLCVpV0!K%X@$=)fT2BBSKe7_eO)XZlmlg52XfpH(oRTZ6))LnqAt@IS~8tqhPr(43hNegp&dSKfL#zP{q~N=BK3?@+==# zgFNRU;E}DES(4Vm(1sWwo%?X|Y2Y}eut7CDaa9$JK}}slOMM4o$Pva2MNnr8i6yCy zy%s4TE_ondt+44wY~CEhj0*|I*aa2=sD+gbk#DsiS?RrGiUEy&AZf);wlEr`1K&CqrvlN%) zvknGoPrIY1$XK?g73%3EB<~SC_K_9BPlm3G5CTb9`20_Y{_63&vFyiTft$7eazsF& z-ONXH-9kLwP|2q9wWVaNBm8=3cirD_8Y1F>j21I^fikLs!Y^VyluZ`)hTP)6 z;^mHKFr2yf+K?}Va=Bv{NF?5^D7A(3wIO1r zfjww;=Ealp$?)}tw$2rH*@&`b@A<$Zm1LPYuY?+ECOVP3;|y3{ghzjI4g}TBD!?JH zs>BkK3dQnN+t0dc0rk1Fotv`(AnsPNS|#b}Le2DCqK5MDFyo3Fw@7miQ;z+F7&hu) zC?^LvSV*HmNIV11F_oV_%HH>g`mp|(j>j=nt1$r%Z_(P*q^B$4CqNKkYK8=? z-$GQKnkLg;+JVdX(J9kp1Ua$)pN~a+C?r;d=j>?5SHW$AQ0k+Ekf<~v4P6`fUEvR| zr1~)P8?;B0Zz^5zF_%WT?Us4Me{@4K?we-&zkhHj`vyyTN*vz!VzxiQne|*1il~+F zL?F0gBd_fD-vyR%3V zKbD_a_^juiwB^b6DeG#XH8c);?MG9T`w8dPlHD~1)c9Y3_;@iQfMjY0((N8QzA6`*txiFQI^rnJ2EcRigDzAUV`x4I^NXc=L z#}U|KzZxs8H`MKS%YHSUUWvVffjrko3oPR+CCY^ zo!W3eRc0tIM^w2J-K*ca#h6Hh{GO|S?r>nbXk0uwz-5+QW)B?f;MLd-nCtJR7l*c2 zY6JcKQ~}(ar8_?+Kc~QGm5}!n&L{}Px2I}JNgUqT)t4?5wivJe{Pr^RbG)rVj#<~~ z;l|nb{4&#e`bTodZmD}PXIEyRr1-`pBg$D+PMRD?7xvLrR0s&<G0($`4NHwAtLN@OqR(s(J|Ejnt4vuc?6{IThb+rnf~ z!8Oo9@LmE?gB-|nt;_*&JNPp$PF32_HxPZeDgx0rRGc2wdT^n2?+R}M^}f%;K4CSa zCh%9IF?s|+c!fMHO0^<@9=Wef61*H;=@upTh+;NCVyK6a*Fm=Zi%`B4;OfDmSkbaN zx$lPLuPh!noD+!gB2asd&k*r-HjF5|i6FMw>-mIh6muO6Zo^4;B4(RSLbw0m5@SO-@WoCZz#B$ob` zZRYW36kS{zrL;)mH)Kmz#t7`blKgAXl2|uA&#$~LDM4)69&N1xkqx{@_7AE7CDiUL z0KXiOx#v#$h)ysIz?yuuswtdTL^a6x);+KG_m1IyRFHPXq<(hy+StEX`1kNc!^NE{ zqyT(9yKXpFs0P&-4qD=VJ-}XUkj5CX~j7rH8B7|a@0DjIn(7W5pO&Yfi;v@f%n|0 zls3rsXaH>0LSZbvW9gi*1pi0OV#vJlK%%1mn9K}w;@+N;J>zBLPYP+bsCc_I$zGu_ z3To!%%HLk&9LT)jwgNf16?!V`JZsVtDXR};KLi%*) zg~jDBi?EgNi=EaS?GnId(o5xq{^*T+qV1XepsI>X^+&kMk%1To!5rw_NE}N@WEthh!AO3+e;r0)kN(?serpg~ML_dTs&lJ8AZW|f&Q7AMbdQt*XR)w}XE2-YW~kL2o@Vr)!_I(9 z2LD@g<>s(A9_2**L=x{&+84hk8uby2{*0yv3ByQ+Cc?b|IHhjf-XXUu_k)A1QY%6Z z)ffy~V&VMO=JB~hY2v?b=Ril|9JVWg$H*mx$94XEXe5#LdwGCH(DkRzC*_jCw-|08 zQs!AByDxWB+huV#lfD?@Sb&8sg_$qP{y0YxMFJp#33(@hR|9-CX-H=!j%x;PgYIF1 zSVjh7ZNb$1ZvhJCSn)X{xEgX{6)5h-)-VY%y!8VCyZG-969!&`stSJR4_KU$!(2!T zwDEgj0n?ftB@|tST>H$c848H|6eRhe^WWBw`bt}*2u(&0ORd5JN}OFFiSr8G_qpv# z<}i%7iE1Jv!>%nvDv$!x1k*(|E`8HVl|l|e8J0A{`>Y{5!RbPk>^A{hq5n#V~+%| zVpWV~B31G;(sIsoRdyPg5{++KsWQI*6}V9`A#wGZ>xDo=~pFhz4Ka>Xin5njK)D+B2|-s|FynKc56S+t)(+u4#b z?DomyTUG5l&+9({nJxzT!|}(ht)XOR`?^a6Adky_|7Yg6-0jxHj*&DjCCYYf=JsOs zE@SDJHq;>!DI(_of(NL)4kvL(LlB_%}f57ExN76HjOGp4P` zDKen0ag#Bvn*s=IwMngjH(&boN~#z&<`mIgx^fl-(LFK@98vMUF^_iY%ciIa>x!hvz2WUGl}~E z*u4vDq9Y&C+WAR}8y2r?^8lLdd=6gHH9YfS@hg1_0$GN)+-|WqHQ1y~zxV3(Q@TYz z6f!cz#$k|XBvn{wlWB>G5q8DuV%FPoLNs*%*ia@jZYlRN%LkKx_CHmXGh*NZm`7kk z=&YwfL)9Z8t!EB&w7hJyugn00k$r?QcgvFG*BMRzxlzob%94kfI zS@uuNL&eRED5SlhIJYQ+_>S-bB*&h4Y4x!lcEZYKd*p10hYR-Z&a1t*Rlv*whPEco zFowtS`fEm0cluj^zKYo9=^+#2FK%-X#*{et?Z0Eo^lmyzZ1AttLoBD~LIX{DlFx;A zmXCJkx!=D@ZH-`x)VGdcA^?RPiTmX@(@Qd4i1g%u&;vYp(KJC9*)^wl+)A5d+g3?Q z+80T^=wDlwG+$6sm7Z;TmWh&(+b2^4Eh7_*ky8$cp!fab)M+j z-;bTXga~DF(Pb;S`SpjF5#8_(I$6)-<(=GWPNX@ zL+(o%xpIwe^alX7$kTAC^V9a%p%c+SmM%46WRgVi$8+wt3J_pE9P~O>^GmA(Am<1w(sDhhn5Ty-9|G8$v4B z9*{&@Mnds8T`W$mQ}invb5j;4&{4n)?P-*~#2P%R_*jE*){s$GbEH$aU9ofxY8QYw zSBWzN@IejAv&e^z_n&dGW5`rSCUx6pZid00t#y0$B}^$g9TzV;92w}qZ}3bEqJnSj zo^F(rdGGyvxucSNqlK%3`i)I)SMeGZUBDfB(1P(K4I<1>)kyq2_)IoRJ#=+y_EW%? z;>EhQGkK;Ekd}Az`dC)q80^L3zSRRYeqkT=vBf$&1E&3kg63+!`QpiLb&sP%;7vLkoHKQTS zJejmvfj{e@O+pZ1Itp~3l~96D75M7BDClDHlG9-*Gco+?IOft-^2RvZ4^35vCa@%p zaNc*f8;*jWW12E*W&x+`Mc^;qtExb@&ls7`67Y}p!^^9SBL}zCke%MPwvaGTJI!!d zO-eLAgLrW32fH!X(Dnz)?fT!DCPNE-ZI9Fr*S&v3lE{Q%nrxkCNr}qApIUaXxAgMO zNs_4WymcMBCoLV}k{*5PKp=^85RMS?JAcE^vv-_zbrwXe4`uo2&c%|z!-a&be5Y01 zoG%irF<=Q->epzg3OlTtCsvj7@&{z4)!TseM#HG2~wKM z6k$h=`E)~*O{7|?p0=2>Z}Y32VaVC&P`{^@EAyxmP!M@7dKui|ar!K1W1fvv>ej)t zmmbWtePA~s(}*QRPHcC+l?l8%VALl2dlmF4J!7oTFq3N0WMP^LbJO@Wrp z#ZKH`Nf_w83d#ou)fJPv$(cYt5Mn6P>A8}}`)SjG2=2)@?&Y`sa9He@pD%=o@rvjZ~tAtc^C|To#a}( z8mD;bBtxvRatCNn-1F*qK>X&x*ADed!XlV59sew}O4OohmIe0X9i-pqUtZLwQc(4i zzrAvzVX>WKbk6&Dr-y!tEd~bdORfkopcmP78f{jdXlqaS}Y)1`X=krbxAe-Iny@cZwKb9s-(oo|e0GD@GE z>w;C-%)0f(H*UF8#l}U1sB=S?x#^X`p{r(z1fQj||q{W%?dLg^-S_RYNB({9b9 z5C`9IGv&#Bu7R%=u;t07EV;iB^V#O7n1sZ#@Zi}ZZ4fKdPV4;|`+>AI1#h~K=>oIa zWUu&Uk8c{$F`r5l)N9rhQ;En{Xl2T$Vn|+322Y+IFUM#Y0+n-3a)@f1rgX!*Nn69J z<)cMbN0}dmbpfM(M{~ZfP15jYUk$e#_XmT|+yiQz#S|E7N?cR%sTm; z5d$$K|Nen({mmVsHK796*4F(Y#XIw-gfFLUbY#*FI4BpbZe=T9qt*9_OK)KpUe?6O zK0MQyAE&nBg;&j}`QzCQNfi?I;yDc<#cOsU4VPs;zTyl0PZVc0J?lMb_Mi*e^#Z7c z#GyADS@!qK=)GuhPo;ts&C_BDfF`j_v3*_ToSLe%axyY9y_%V90#X3jFfnrfy$+T$ z_QT?++Z=qx$|Q3xBc}8%qrrBgwt!#ymXpLsWC+F6vG;4Xz6{H@v?=%eN2x^vHxUah z%O3w4_J{<~f1r2x{EV2JTA3uBPddrSBG8}-NU%RlRhY`|?+i4?rnHC$r&CUDMHTbH z8N2Zz>3`nvXR;d0Zcf@YG{-Bq`*=&m0VPFVPdkVZn=#*YE6Q15wF{j0?BCYg*(U~2 za$!!K>LUls*?JYnz(-V!vHyr4gOj>r^SIe5ZtSN%m#)xNA}Ir;ZpC*9B<+@Q@|~ik zKt#YQ`<@Bzi={!&^P&5bU&M)i@+-GT`4{7k7kb+qKpO3gaRB`2OKv(S7|)tGW*E&Y zDlFuoYuyw0^Rw;wVqN`cDRsl5dH~T=7GRN}aHP|-uEVU9+IJ057lGS+F#6-4m61@j z$1Qwh2;F#P5~bgTldqA=FxrtJ5<_-tgbH?pTxfu&)yC2aDG678P0Kw{l z3M^qX&Q2pg;Q&q@;p{VUGe({Vs1BBYL4hdOzRq84Bk_D%$_v|j2qDUrIX}S79sZ7p z0{xT;Q&Lfy(@i6ZtG1Kpio()Ym+`?U&}XgOGNkHWRhLAAI?b1d<*G~zvHMdsHJ##NYa9KBuEh&=>*))8cq50|jX4xYq!nx?~s#v8C zk`KI@wmY#2>)QP&+~S? z&ONYUF!EtGm3C!;z4n8X`8Ep&U1EIMORE2-6eRXB2u*tUW0K|!!+?IWtbr%(AQM#u>K2nzy8f{)r^guw%5*dj~ zDMPK{!-pym>s-O6+rm!uvmRZXx|Op6OF3{%lvZU~O9d??JTF$KdW3=Wn;Ot;gEm~4 z(a{~5h>H)7l?MtUao84A%c!BClUT};9kH?M6xvMRto8#0$8IeqK%{IUW-=Bt8qHf^ zZ)2F^rlB4JbUwB+Y3l~PaLv}ydczQs50X8nQYNw1<1cidVy15w^J+FbABlP8^~JcH z0qD-i{f2IP`GF~tOpp#}kOna^n|`WGDTy1md&f(zN)MyM*hA8cmJ}Vn*J=Yj#m_Cp zTR1-(BsuF3Kj%u^7YI_TVn_EodQi zr5O)76As;8C^wn|-J% z)rYtqxL>o|T!VmUFoqL+z>sJDKp_sV%Gf|W%>ozubyzF+xf@a z=%;DdCW13YXw)U>)J8@}`KL9<$<6ZW~gEaSee&I+n$vmhj$evP1 z1;gU0p^?USpUQCQC)xhT=h24Y52uC#)G(mu`TzN4vvdWXLY!s`dEQq8-pC?SQ_)f` ILs^FWAL$QHjsO4v literal 0 HcmV?d00001 diff --git a/src/components/Button.tsx b/src/components/Button.tsx index a927df7..27fd380 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -27,7 +27,7 @@ function Button({ onClick?.(e); }} className={clsx( - "transition-all flex outline-none 2xl:gap-[0.556vw] gap-2 items-center justify-center font-medium disabled:bg-[#F6F6F6] disabled:text-[#D6D6D6]", + "transition-all flex outline-none 2xl:gap-[0.556vw] gap-2 items-center justify-center font-medium disabled:bg-[#F6F6F6] disabled:!text-[#D6D6D6]", variant === "critical" && "text-[#FF4517] bg-[#FEF3F2] hover:bg-[#FEE4E2]", variant === "secondary" && diff --git a/src/components/SessionCommentItem.tsx b/src/components/SessionCommentItem.tsx index aeb8692..4107981 100644 --- a/src/components/SessionCommentItem.tsx +++ b/src/components/SessionCommentItem.tsx @@ -1,11 +1,64 @@ import { motion } from "motion/react"; import { Comment } from "../types/Comment"; -import { format } from "date-fns"; +import { format, isToday } from "date-fns"; +import { Session } from "../types/Session"; +import { ru } from "date-fns/locale"; +import ChevronRightIcon from "./icons/ChevronRightIcon"; +import useModalStore from "../stores/useModalStore"; +import SessionModal from "./modals/SessionModal"; +import { useQuery } from "@tanstack/react-query"; +import api from "../utils/api"; + +function SessionCommentItem({ + comment, + session, +}: { + comment: Comment; + session?: Session; +}) { + const { setModal } = useModalStore(); + + const { data: files } = useQuery({ + queryKey: ["file-list", comment.sessionId], + enabled: !!session, + queryFn: () => + api + .get("files", { + searchParams: { sessionId: comment.sessionId }, + }) + .json<{ filename: string; size: number }[]>(), + }); -function SessionCommentItem({ comment }: { comment: Comment }) { return (
+ {session && ( +
setModal()} + > +
+
+

+ Сеанс{" "} + {isToday(new Date(session.createdAt)) + ? "Сегодня" + : `от ${format(new Date(session.createdAt), "dd MMMM", { + locale: ru, + })}`} +

+ {files && ( +

+ {files?.length}{" "} + {files?.length === 1 ? "документ" : "документов"} +

+ )} +
+
+ +
+
+ )}

{comment.manager.fullname}

@@ -18,7 +71,7 @@ function SessionCommentItem({ comment }: { comment: Comment }) {

-
+
); } diff --git a/src/components/SessionComments.tsx b/src/components/SessionComments.tsx index bfab89a..86439c7 100644 --- a/src/components/SessionComments.tsx +++ b/src/components/SessionComments.tsx @@ -158,7 +158,7 @@ function SessionComments({ sessionId }: { sessionId: string }) { onKeyDown={handleKeyDown} /> diff --git a/src/components/icons/SendIcon.tsx b/src/components/icons/SendIcon.tsx index 6a699a6..f94ff4f 100644 --- a/src/components/icons/SendIcon.tsx +++ b/src/components/icons/SendIcon.tsx @@ -3,13 +3,13 @@ function SendIcon() {

{client.name}

-
+
@@ -123,8 +124,12 @@ function ClientModal({ client }: { client: Client }) {

-
-
+ {client.managers.map((manager) => ( +
+ ))}
-
+
+ {client.sessions + .filter((session) => session.comments.length) + .map((session) => ( +
+

+ {isToday(new Date(session.createdAt)) + ? "Сегодня" + : format(new Date(session.createdAt), "dd MMMM", { + locale: ru, + })} +

+
+ {session.comments.map((comment) => ( + + ))} +
+
+ ))} + {(client.sessions.length === 0 || + client.sessions.filter((session) => session.comments.length) + .length === 0) && ( +
+
+ +
+
+

+ Пока что пусто +

+

+ Здесь отображаются все комментарии по сеансам с текущим + клиентом +

+
+
+ )} +
); diff --git a/src/components/modals/CreateSessionModal.tsx b/src/components/modals/CreateSessionModal.tsx index 3696ae1..a8c6e5c 100644 --- a/src/components/modals/CreateSessionModal.tsx +++ b/src/components/modals/CreateSessionModal.tsx @@ -46,7 +46,7 @@ export default function CreateSessionModal({ targetServerId, client }: Props) { useEffect(() => { setSelectedApp( selectedServer?.sessions?.[0]?.app || - selectedServer?.apps?.[0].app || + selectedServer?.appsToServers?.[0].app || null ); }, [selectedServer]); @@ -244,15 +244,15 @@ export default function CreateSessionModal({ targetServerId, client }: Props) {

Выберите параметры сеанса

{selectedServer && - selectedServer?.apps && - selectedServer?.apps?.length > 0 && ( + selectedServer?.appsToServers && + selectedServer?.appsToServers?.length > 0 && ( app)} + projects={selectedServer?.appsToServers.map(({ app }) => app)} selectedProject={selectedApp} setSelectedProject={setSelectedApp} /> diff --git a/src/components/modals/EndSessionModal.tsx b/src/components/modals/EndSessionModal.tsx index c1f6d6d..b1e1529 100644 --- a/src/components/modals/EndSessionModal.tsx +++ b/src/components/modals/EndSessionModal.tsx @@ -1,28 +1,42 @@ -import { useMutation } from "@tanstack/react-query"; -import { useQueryClient } from "@tanstack/react-query"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; import useModalStore from "../../stores/useModalStore"; import { Session } from "../../types/Session"; import Button from "../Button"; import CurrentSessionModal from "./CurrentSessionModal"; import api from "../../utils/api"; import SpinIcon from "../icons/SpinIcon"; +import SessionModal from "./SessionModal"; +import { Server } from "../../types/Server"; function EndSessionModal({ session }: { session: Session }) { const queryClient = useQueryClient(); - const { setModal } = useModalStore(); + + const { setModal, setPosition } = useModalStore(); const { mutate: endSession, isPending } = useMutation({ mutationKey: ["sessions", session.id], mutationFn: () => - api.put(`sessions/${session.id}`, { json: { status: "ending" } }), + api + .put(`sessions/${session.id}`, { json: { status: "ending" } }) + .json(), onMutate: () => { - queryClient.invalidateQueries({ queryKey: ["sessions"] }); - queryClient.invalidateQueries({ queryKey: ["last-started"] }); - queryClient.invalidateQueries({ queryKey: ["servers"] }); + // queryClient.invalidateQueries({ queryKey: ["sessions"] }); + // queryClient.invalidateQueries({ queryKey: ["last-started"] }); + // queryClient.invalidateQueries({ queryKey: ["servers"] }); + setModal(null); }, onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["servers"] }); queryClient.invalidateQueries({ queryKey: ["last-sessions"] }); - setModal(null); + queryClient.invalidateQueries({ queryKey: ["sessions"] }); + const servers = queryClient.getQueryData(["servers"]); + const updatedSession = servers + ?.find((s) => s.id === session.serverId) + ?.sessions?.find((s) => s.id === session.id); + if (updatedSession) { + setPosition("right"); + setModal(); + } }, }); diff --git a/src/components/modals/SessionModal.tsx b/src/components/modals/SessionModal.tsx index b666658..9586110 100644 --- a/src/components/modals/SessionModal.tsx +++ b/src/components/modals/SessionModal.tsx @@ -15,8 +15,8 @@ import DownloadIcon from "../icons/DownloadIcon"; import ShareIcon from "../icons/ShareIcon"; function SessionModal({ session }: { session: Session }) { - const { data } = useQuery({ - queryKey: ["file-list"], + const { data: files } = useQuery({ + queryKey: ["file-list", session.id], queryFn: () => api .get("files", { @@ -122,13 +122,13 @@ function SessionModal({ session }: { session: Session }) {
- {data && ( + {files && (

Документы по сеансу - +

- +