From 386dd5c8374a598a918f924078572a172f49fd76 Mon Sep 17 00:00:00 2001 From: jungjunhyung99 <55770796+jungjunhyung99@users.noreply.github.com> Date: Mon, 24 Mar 2025 23:52:50 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20=EB=8C=93=EA=B8=80=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/images/comment_image.png | Bin 0 -> 14767 bytes src/assets/images/default_profile.png | Bin 0 -> 3909 bytes src/assets/images/profile_heart.png | Bin 0 -> 2342 bytes src/assets/three_dots.svg | 5 ++ .../molecules/commentCard/CommentCard.tsx | 47 +++++++++++++++ src/components/molecules/commentCard/index.ts | 1 + .../molecules/foldableSpan/FoldableImage.tsx | 54 ++++++++++++++++++ .../molecules/foldableSpan/index.ts | 1 + .../comment/components/Comment.stories.tsx | 47 +++++++++++++++ src/features/comment/components/Comment.tsx | 37 ++++++++++++ .../comment/components/CommentDropdown.tsx | 9 +++ src/features/comment/components/index.ts | 2 + src/hooks/useDropdown.ts | 36 ++++++++++++ src/utils/time.ts | 19 ++++++ 14 files changed, 258 insertions(+) create mode 100644 src/assets/images/comment_image.png create mode 100644 src/assets/images/default_profile.png create mode 100644 src/assets/images/profile_heart.png create mode 100644 src/assets/three_dots.svg create mode 100644 src/components/molecules/commentCard/CommentCard.tsx create mode 100644 src/components/molecules/commentCard/index.ts create mode 100644 src/components/molecules/foldableSpan/FoldableImage.tsx create mode 100644 src/components/molecules/foldableSpan/index.ts create mode 100644 src/features/comment/components/Comment.stories.tsx create mode 100644 src/features/comment/components/Comment.tsx create mode 100644 src/features/comment/components/CommentDropdown.tsx create mode 100644 src/features/comment/components/index.ts create mode 100644 src/hooks/useDropdown.ts diff --git a/src/assets/images/comment_image.png b/src/assets/images/comment_image.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e3f09b6c8c1e2bee7dc3a798e42d980706d70c GIT binary patch literal 14767 zcmV;gIZ(!lP)QiL1|n-V2O$Pw~y`VS06I3zh7 zR*=6q^ovE(6m^8;07S}yD3am_%gpzxs(WTZD^!8T&P;b# zSLMt1<(FUPd+kuy@zS@x^@)(&U-3Nm^HCH||J66XL4W^$|BgO8L)US*h>Qg{nXP_!gHH=Y|+rr zsGKA69P;q5=lax&h#I*eatb9P$0G{c*4)GtuUl& zqfX66gCcz91CLOj<8u(72d{PbqV=!zL2o_m(9hC`6Uk4P@V845MSt+zbI;vNzt(;V zz3{>d!rsp zJVhstpQKzaOV#~7s_pI2es!M;Jq4P5?JXL7kc3|wGu`$Z#bFe22 z=(^Ey9~$fB!BmuWph9FD86od7wgW6wvz03iY#>&n}bKY*XdL z3Gy>p+;~W9%L};w0A8FSALn92T5pPQIUZ#wD;L%#Kf){t>J-+ixSk9JFk%4D4e?oQ zY=`d(H|xUlsokbbCXd1K3%~hCt}$}@#I6{DD4)sEM?U&2h4{7FY|-(f6LjKPuO{O}O@@K*Npxw(5VuqWP& z!4=rx8}wWl5(5#!Q^eaSpr9214qBKc`|xlQBg%DQ7WjCLm%*T9GIE^^C_$?QN61lx zbBA)SQ0~~Flwl7uoc)`Vf`SJc*}NukU45OI9poBoNAkI2c;vtOwXc5LdFh3hrb9ot zd)Nr_4TSI%Sb$nVlUl8&Opj)(PRp~iG;{4es`xGq4VHn$E!y1N0B!?o*(y6#YAmeK z)JLA6<7dyn(}}h=*695!@6zDt5IlZ}dV5QP?>->J1x5!UJ{v~zVRVJgkb-tVb>Mux z)}WrzDGY+Em<~f{3kAw#F<2OYAZSnvv!@kd;7Vm`;<_6Rg^`p^6yv*KL4N1^Hh3)% z;8=@w8kq-Bjooz^n2O9>oXA2E2Arbjy#MfpU;h#edZBx2*@v6LYY9G)e$epfIGuR- zF?eT|g1tR>BqlqiaJ5#Y7L0TK{Tr0+1CGNO`+NJewzfj^voo}`w1^S(^+p`MsXTBt z2zdb8R7Btm<-T1&K~^4o|BdP{F4z@3=Fjqdo)I~LAT}f$fM*07o6qk8M%YmT%rY_< zOo!ZG{5x6uSqMnY1Sc`H-v2=;>3*#QZgKC3QFYsg@gDEMEPD}@V4N7-)9KFm8nM@4 z#Ik;#CeA%hTjfDoxp@OqcMI4_a&zOykHNEBw6Hi&3xJid4K{)RSwp~DYb;X#W{r-F zk5HxBfL*eb@9lxtwkeB&Dl=7I=vq&eO67pcn;7+Ajz$M=)45|u=$R+a)5gjoWyUkq16I>$?oku0 zhpFE_aJr575H$7yPi46#GJ!N?e8w~g0vH=G$D^IaUm3^QHavJOz?}x&sLLU(;ky13 zStDB$szs6s9;NJr^E%NX79=|;(>{H`!6#!Z;~C;a3-D=;qZ+ zv@&~-q6TBSLpzOtt}JiURujYN5gqkyMp#KeOyO}v|JBiGBpfyp*zKoh~T z!xSm6e9+-qey!6xF|d7amvRtO)8gNJO=P{8<0_@#nl!1)4%#A1~Nx| zU^Cx*dfuBW-b1;e)BL0NmT<~|Lk8lyOZjiFv2dmEg>_u1=% z1NYm_EYgNg!SjR6;iM9ngF)A~C+@~+&rm!2Y50pVz9-Lxn4XTAO7Fk^GBsE3 z(oh*m1@*{4ynAnj-ne<6wwod8wS<5IWQt8tHsS!-q%6EtSPU?=2i{yn*2#8Ywy+19 z_7AUJrB|<9r(gZ~3)HUeP!XS*LlV^5+Y-hh*%;$IvK-3Sy7I3plTk|tCSni{7 z(6;gMG1>z{zH)tr_S!HgvPBM%O+bk2_|)HDp(7JVG0g+o16$eM-Nn6!z}B_|zW%-v z((_@VY$V3YM8`G)U)&}(;6(8vDMVehgENAH_qp7A*<|@&tk_6f=~w+F4+YB&a7p2INis+@ZkRc93KQN@$)}p z;QYhV(!)MT=oVR+F-%0XkXKfcrcWHwIy?7uWN#d@ZlPf zsDSKlu(y}ySJyzx`r+k!@;psOb=DIykQ2YR9e~=wM=;#itX`U|e=|OLZf5-d{W16FfVzrPB=nR2m zgE?e(85nHg{sP3ECSYL~2FcQ3Wl%gg0FSQ2_NB6Ee0u|N4OkmC#mEuaOpRwoAkTTiMpW;R?AAbx7~OTv z;78)wJU|xT|22oTj%&O-?0Vj(F6$pWoDN!J^$&I!H`J465x8>sJZM{1#G@L#nx}sl z)@d7f+F$AwW`X1!o)ihb_LYj@&wVu1*GtEs)&a z%S(W!EdJ$e)B`+(4S0SwFEhsCbf%E)&^9cj=$%9|qlB^sWQ?5!oHWJw|0-jr6Q3?9 zVcYuMjHCOI0ONKFGxp7{uS!`K|7IjWW`M`N65*Bahm^--&}&g?xQ`0iL8Co;G(B~U zE*h)6rMg0x+tVWcrgw7rvr6TBCA9RfJ&>)S&$U`H?K-G$3FbDWOP=&X;Ar)K> zhIM-FUX!+~ZShDCw5+!T&ut^&VCj?%?J1v+07(&3>(m+LS@$9)*_=s?mDk-#2v z{4kx)M}@JY$-T}drfZA?==SFl?(Tu+VeITG!AU}!d;2v2t(ohVLF*oU-yuoN zfkY>DxDUi1yW85gx4Q_ ztBIlPZPVCWOS+*IO5$ra6N#OCm%jbmEM9}OfKU>(JNAI zAL+fPT;5X62-sTR*&vo)m~2EMi$<|`Jt#48jOxeiB+i7*Ycts#DgUMp1+%*{b1-r} z7*^cw7bOGXbPU>Iz%ST?>FUPmx_xmIo}wKyc7vwvaFMNE*#$EXLU! zFx5wZY~gj=^^n&0;GGbkj$k%?_{<5)!EGNoc8pFQKaL=|DODBM^^%*yXV-RDz!sar z?GYVB&$HKT{|ybLi{Iy{d|+9LYVStucg&y@b;hP{qo)2(4=}j>*FO*#%)?0;_CfHX zH>wxtI_lNztwWq8<~%CF3zxU{==B>5R0hSH937-nQ%7lRbQp#PTR^~EM{0fL#x1%v zyFh!5Kr+4yr>5xiv0-``mG>WAy+zNQJ1JG307*(VH!ek9fo}d>Ty3ikIdyY|@}<*w zT_iJ0Id*iYlW6rjsSh$nvxXxO66*W7;uC=d1qi_Zve4J*)mD@`K<_NhhpKFJT&RuO z6w`l|CtZWn_6TutL&y{}U>#e#z*R)^eNeVHFE7#6tMAcM=O3ceCr_gMRi`UguY+Ce z(L>XdQ~?gdns^`1hxZ;qEwUe&KHA?0c-SHb=gnmcrU;>WMHFgwS4Dy}Xq2@028j+Z z4Eu9BP`1Hd81o&&o~-D^e48CENTuor2F!U-G_Y^bOY+@#WIIn}gEz_OI;r0~k4P>m zOfb`wyvD#Z96UEYUZ!HEO^chmTrZ## zdu(`EQrjaiR2dR#)Cy@53S1GHqYwP9432;|k5U~v2pee&74$sdrnj#Q!{+6BxO{bT zViYNU9*koTT>Pli3i&!Dh{4NRFmxNn$sx#YudHHR`>h!dndXPOo8i*xtM+vqbI4KS zGyBpO2+L;l{MM>5tPt!l|(s=&#W6x0u^ z>vZb$X&M_FF~w9z+75P6L*z`1dpX#H`auH+M#dz_@%^>Ii}&H_wHjc7a`fu`ML`0l zi2Od0Xo1W8x!m{R)=j*v6#!eM_^g8t-h0o>@2;Gca5(`so>>4E39Q5uM zSGrjaZ8oIT<#46mILim=ITFkxO4=$oK?>Vsb#A_o$kaqtUS;2OjXNDgk=TAId+~8- z3ZC}vj*)UYktn8uq!1DruF5atsn*jsKG9S_R6$pmdc*J1G<)l-Vp{`MBUz4ryW#lxJ96ab2hjVgOqz| zZJkQEsUA}!jL8Ik4!F|JfeYttRJS18MncWn%(n|Ab%2yi+IcTTPDj4x2zL%m0MsKS zTlD4bDJd|>%njfWzES%g(7Duge4y~3=FbVax7<;6Wsb})YtNYOK?Y(xd2$2n1sh-! z)0q-&Z_o2cP^CN|H-7czWvP;kB7@|*VY$Db1_moqKde{b`OuWPhi+kWo7T3r=+wjj zf}N)0VU&0cvlFkMy}3?pXdaFT{}`w`yqi6a6PvChqPUgDN-j$GjDACu5CdTujvL!W zJD+qA?5wxHciXVrs}C*Cc3fC=kS2-V9BPozrj@p0E^eGtVAj>M_}~5cWtu_7r2%!$ zfdOi``T2!;%Co|UsJFSkNkgMYC<|=f-w)vVvr={O@f^SBrI%l&J$U-qa0Nx)BGTf# z1|qp66a{b%egVl0jLbk=5RF3Hd27{u^~}hT-{bg#e?6I%fQNLlVVS8UL#hJ0siBb` zKF9RuF%@LO=d&j7#u{|DvD1g2&^rC3(A3tt)9*APXWF&6xJc{3-rC9xogHwb2p!OTxf%M&yVvO6!a7Y2^-*7MQ3gP~in~bhXsTc<8nr8f>q$2fr{5gBxBJBo-wU*pok4?Znm~qu>GAku~&Te@q9ACXx*{>fGEM z-MMpzZr-{}TbRylZ1#?`6J?tE_yy_y=L$D#!da+vy(l}KFOSm>6t}sz=V*0x6+F0? zPMkUkct8-_Zpdp#PoAKGv2p6F43i5_uR)2s^wuT%hgU9(!OBH&??O&Ihhf39>3+m$ z#I3rhhUZ~So>A>8N@~NHJzO^g#bn78*TMtBvBNRxt;S)?9GuvJIszpO%5_ejU4~yM zTrw>3U?MtLUM;~=Q{xA!hQ4A_l3rKA04`s?EYR@IJMYllyZ32hW5WaiG6X-#oHkHU z-Px_7F4(7m0~gVQ09YBR(B}OWdic?&Y3cG$1y5&Z?jw0A)5(WU(=1>j-&>+#KnHu; z21KDI43jI5(6=w$q)o614yxQQ!cfE4$I;$3X)_OM9T_3xIpZ;F*ACRdLT_0M5BQyD zSZK07(J_qX97>#tr0gulc6^)s#)tH;xETqKp6L_m@OsaUE9fz%AJPTYVQ78m4SeM* zU#GXW>UNLChb;h@?QRM_EHzZPq9>i#<5EM2!O*A$7yr^Htk_h zZbPX%{n$hF#B(2~$HK4l;2c@GzGA6gx}D^FtcysyLu8ycX~gA65UGHzl4)qF*P-Fd1~NTm z7D1phRh`m6D>uwLzBrrB>o}X_9N=emDt+}UU!m7ue?1{q}M1KC=ZjvRRsuPR0_0XeSHv3Rh$Y^=!G& zC`>S&6n?a3>gm(W$S5-Fa=Hvn@!KL{4%Ud>hCMV3GF)?JX_I!K2Zv55yprpHjH{)A z0ebU3^yaN~8aaBLKK1LrOWD$>v<|G!tkAVf*XiqD|5JMJy`LZsEYV;8%?tECpoP7H zKf932P(K()9y5du&qoV0hr6Q|kd|*(n{<0_nO=GO9W|=M&66eQBd)aaN}~+l56ir+ z5t^h_;0i1qrd%c(2X#1@>v(bLtK%^E>^PmQC4CNC5SHWn-~WLy36VVk3$`EH3OMS) zK}>6Gipq<77Poe3eS06;gyd<`ozK&7s5~sn+Yev+0Wh&e6Q|D5C;$C#Py|j~t+#1( zYLM>TTBSe!?|)8z@}<9|zklgRpn9W_NORJgHwf4$KqJY)LuE}OvsbW;8Zy6kZ`_g3 z<4|(z?mXRHse-i(Lu$<{_PQGC7=j|R?j$tIn|Pd)%uH*H!`ivj!*zBz2FK;h=JgU@ zxrvgObC?uJ^>F3evGMtT4OBp0c<}|19Id`=TVc~iP8*sJS-1m(R#ExBIlBzp+%tl? z9$9eYM<%D}+Ksnh#J|DxFVg8po}foR{4pv|PS7AE)SEY#XklRw)DfJ#+M@ZHb-)c`Z-e&;G(zx*1#{Ni8G=FCm< zKyR9ZNZ(^mTK9@`Qb~xc!S8Wl{-A`sj{L6vK&Pu}#T27P%ek3@v4J z626|&R@|-aP5RDv{;2~J1dANgK5ItG8aSRBl;Bwo{B^q-(G3JLZfI4O~9s1!n|B7lG+%XE>q7>1kSMMp`^?g}qVsFsmaj7SVv^t|AJZ^*~P+rq=XKq2f z)-zcmzrI{Xnw7)_PS~GIOjqtM(8snm zX>e#nUc*Znc+E?tuSh{TLp5l`b!gEI;Pt}t9$x|cE!#1D#dvtn&dv_XUIpmXzO)oD zF4kHo2%wOA2LaF~PCBblYrOb`v@Y=9W@cw)t>g666b%km;`E*EnUUT+pXS<6~T3$vH zv@WX$ZQlqia1~pVMGdN1A=}{t`WWZl8J)Sh=aC1!LdYS*1)~*O6>Nja!du zw6g&b%FPO=)ihY~F2uQ*U-b7BXsA-wB@sM}S~cK*9Rs;ZOY6HL7O|1po0&?o+{y#T zi~HH&{CB=ymR^^ZS7?1>lg36zArBNxU{uIqgGqwz!kHqk)4+}qqf&HN79V+z_IVqM z$g{weDwFP(AXbT7vNJ~4cyVRo#M~d5cVSM)JzWqPxk^a zbr8D75^9B`<2B0Q_daOIA1)uK@BQSbltJXqR9u?7yCEZ<2sKvRacE*>n6`GSv@$AOyE;Ag@J;B zJ0iklV}tT%<+8c>_XOAc7(VRaDE({8@1OhpFVoY{{2Z;#-J~N!gOtZK<@9y3G765& z%Z%|_w@ov*wbBzKR^^?y&LHz?2xnW+W%V}X#EF=768@Q2Bt&sWr^+4~3a55HSk~)i685R|(hkQx zWI@02Y_Gq+{JiyQj@njO;Ux!_fmrXcQ_FfVPe=7|pPv5EQ}oN9{j9VJtU)*$uM`o? z`lS1_0r;2%-ku&Gp@ofQ`n4yX7PXGKuw-#YC*bvkyyphfxeLdS(6djS2R%ee4ZN>| zHr}3@qnBQNN0%XUof0r$lP2HSn6GmdEaa`X-lAK#Zkbr)$=|us&W7Mc|JJ^) znf7+3rWujVmJ>s(9;nV3m<}pEk>WhXJ5%_46C5B~@DlFD@I2d`9T|$INkJG_xV2Z! zQaq+kM<>SU7k}XwfPE;yPGo3nZd{fFvo68nObIFUAb9Rxvqql;4=U6GBr-?nBNxum zcV2skuFWg}E^0!(iWv{7cbU$gJ0TheUnuu(@XiOf7gor@0G&VgsB}5;z}&of1BHZr zNoE+1B*5{#i6*TqfeQ#e479PnM&JME?+J8F9GRdepL&vxA3rYlHatA6mO&`?1c#HL z7$+Sa>k}QrmLh>Swj&QBzfVlfTVj|V7)qSCH-clf$@;#0#+RV&)@zneeKV_lA>pkVmg^6 zA&!&qX5)ndi6-c?fuDHd3Hr=uJ|h^;GmRZ9BWhquRI*K#DKEE)j}}EjF*ZYqK$2X9 z8ynlHREErDd4|+0=xcSMv!^&?Di-!~^YG?h{Pd^jW1sj0g3d9j-MdUhuZ>bxpU9AN zH*V76+$^oEtihW$XtlXV4<9>D)04+h0Y5^yqN}8zxhUTZf|3uxDO2bbeOYRHcrI5S zq{)lVm|9(D0?}+V>34tUKhf1|?~`rAa!d4qT@5>SZHaPR}FMjchG>p0? zYu_2kIwR9)pTs4bQ&`5uhE}7uV+hesF55n*(B`3t`aCOKDkz0kwc4$G*3pVPuy^q26dk6h3!CWcr|bEL!*i5N6}@)VtY_#qm?6!jqxAmlXp>Qkmd*kP|PqQ(v9~-VGi-k%am*cH&X&>7}3k_^05>n?|9FVzv}7 z$ftxsb*pancP=_JE#%h}i#>w3u5))CjM)x~;B;t`79kWFVHn~)vVgMHA%`ZJ zU?gy2cY9$RD;4_@@Q{Sux=bY)ENi@yXUF>dJnaB3DkEc5>>HpSaNE&BAH6wujRr?Y zWJ@1Oi!<6R!%7>c*}SBU7sh%H2V?EHuLo5LtbFeDwZ&5!&ha6zp4<2CbQth3V_K-N z@hAP7YuBy`L*eH~h6h1K9bNqIbOy!rtVkdwqV#%M`Mi|(dp(8X^ZcQ9nJx#z!0aoR zo?iCiEby~;pE)^Az0Gy%%aU~I^R8dL+y(}CD4{63hiSO6+n_gp{3EDcU^o3mVGpHV zZb#@7%E(1hULeGs{5GI(tS`~h!YtK5>G-jWNAK9A1j4v!C!TR6)13vJ?|%1tap1Ps z-7V}#DQ{1|#ty*z!UBEd*=NC^dQ9HniH2`UU$+N$H}YF;gKPt+L4dfDsEvCqnJ&7M zOV|-<`Cy^Pb(O1Dia8qd_GmEQ4<^wgwY;WCR$ve{-5O$OVv@>EUNnmhWP1Gh-2TO# zqs(2U*@m++P`X;Z3T1C!wqD!b+@N+19GTaO1G8Je@wLSTD%M*PkfjA!0NTj6`1jb< zF-f(VD|b6d+8fgzZhuc3dmc0K?YG_pWgXYq!#yIRTXgQCU=IsLwh1W+44hC>))GlW zIkTCdgRmC#6fama*TfI=RZb|jv*n*ds1rRlkr9+rT#Ju(~A>VY39~VT0km3 zeF9Qt1;(XuT7j36p@j??T*qS%50M2jWHphotw8`{<)2|}mo*W@7|D7-3-90A-G)*JA?MsV>Kj}}P4EV7%yD+ulpx2i;k`;*+^<(xylpi@T3KAC zh1nTdpx@8y$#DaF_zXYSPm?DfqS0d~rMjI#S&LV0ZSsx@Y)szYj@!aAyt@LK;GKAB zI?0gf&wt}S>U64{exCU?&d-E^Ie#RYwb!vH9uXawA@*;s-JQp-B5+jE^P95C6tXz!6fAS}EbfiMFuYX76%^)X;sUF2z2X0^&S_La?ykSX>tJg5f zBafY@dv|Wp+u+m_14FW&G@bDcN`phF! zbmH8@!2F6RkC=i|pS;u5|5@{j39KYc~8J`5t$)Z%mmPX3vdJT5l$Aqe;4 z!Az@)`s4cQig?>01(zVT@qJ9!R4v?QII zWRj7v9jg9>a`@ZMpr7jXNUS&iYZNw7wXQZrse{~3c`oKM z4KzXR!w`=uFiH^^-w(#Z*RzLNQG+u)`_WHQe`QcMJK@(0)e=w3>MAN+bFr@^yCnSK zAN@Dkxke3Owr2};lNIaLbrg=p-(;)gyz~I%^Ga?h{45{?W`%VduPNr9&BWud?7UY@h@~VIK0M1)l#UYx#a$Q6mjlhnGHrH<7 zr&q4uqA7-#l}%drcBzWNy08ZxJzS!({0Ov;aiM{%=rO~|!l1{7M`WL)(Xk2ObB}1t zTueRr_(y2$#3{gmvH>0(ZXFUCm)2qQsk2Yg^kWxA8RYg@ z4ko<)re{`$vA6o9f(_Fy?)3LDAR|KqRLf^%4Gb5Sc{c<}~qlb~tSf^DMd=F(}e?lv~Zt1xV+NAuyjf$F@r&ppx+ zWX+ZztkLt-<3%~8$z$}|U;hnVnwdA12t6@h{I-bl3Mbt6&<9v(Gi1QycrTAEw~Cee z$Q5k#>E7KL6i+9h*p-P>!oi6X6!zq$A38wI(FeyCa>bdKADJ#?iXnnhdIH0j1J;s* zQQ2TD3~|#V@2DU(zOW?$ya?RpE?1xXMa*uzjwwFKPVQU?!F!rvO@d=vFfGk5m0XFEE;+*0dgLMlWBi6=ZG16-RY8&(B^`GuamOlxT^2zBv2 z)EF5wjuku`95*tX!vxx25=AkEiz_ja6So_rsb2E4pX}tQeZO9Z`|FECi0e0{u2x4N z{NI1^4SM&=d+|d1gwl|i8D?r>#LIoW%Rxpq934ct8P^U$*>$*t% zzP9#qe+Nli()(p1z%;YL0g$&>_A_Q-en#(?MYXsQ{b0GP`{1|u+$f`&q1{fQQ>Ehb zEG(^x@bi_g{x8)2YNoapb?LInOt6}9Uk_635XD&N(Un4lwxey@tnSL@gZJ;x(nDuY zQy(fNdkv;*d0C6X`*;Xf_BE4=RQwXaa8vT9>X9bRH7T#-YS*U|nblheo~)UZqq=e1 zbR`5GD7mfM6JS65p} zGft$fTal-`iZNT!tu^IBQCUX-mx16ibtFC3tSfuIwvAy zOCvtJ9TVH^LzQY$chg;>X|2{4V|gmAuP@Wy-gZX`#~L@yA8mIh!-wZPvO{_e)XB-f zh*03(g$}U`wsCvrF6i6{HTG+Cf94+TV|w#mOfF^((?8Bk85?EkFgpMTA=5b(##Lv; z70zZ6Q$h~pym-eAr9u?SY610lEBp(o6}iAw*fU-H6weW5Ua~5{_hPj&uCRDYEt!6X zvZaK!tLu4qw!z$Sr~?vhHkde;?&c8Nq)R4ES68e(Q`J%0L>=qt=XMqu!% zpZ~NhCL2YXECpX=YoV8v{STv4^7$szhpC9~*=>tmZG7<~$F98+A-;{6BoGj2kD;t} zalP2vTfE~KAS^J8f_Tp;ODEe>z2RLHBB?7%E3qB$w%ItvLY>peKw{QmN2vSIXq&)9 z8jsTzhP0uXvsz)EqyxyMF%)Bmjz5G*9?@o)p`E#VG%_+m8>oIygLU-t5;xb4x4Dmb zvYynmTN!LNy@8PlEO8ZsmAbacYDsT4kcAYkZV6<%K&_&8U?HpN%Mi|OSe4yk({?IF zrjjDR`(BLIAC$z1p$|(R?I?5yyY3Un=GU1-0}#nG6)5@WfoR43(^E%})710{nVS1s zt2F)4d0O1vq7x52CUT@NS)e8*viz4@#!TmrtNpb4v(P(@_HEL|JC+4mcA*!j_^#_% zLg|Z^?xsk2v2Th7cGH|hqfn^fBqJmzuAuXNZysVt81RB4R~1W7ze-9}x?}?Cc?^a` z#S0d#exsUXYRM-Q*bw@EhAZvVKIiUpbuivsncg@baYh2oD33_9IoUH zPJQz1De**4HokY zwaoe%sa&(6+Cl79d_Qian~Qs-%Oq?EYrKhxqYkD6>Gmz<3o26Xwhr0 zy%sYQ`3j~W5X|NUMEw3IpZE|SPe4_hpe!mV+}F|IeLDsQWK-B6-crW|Sd+fnl9Ih( z(aO!YtsOS#67>yE+LtJ1n@o)&ioX%aBy4s^GuwnH^;b@i;Jq37wjz^Wnw4@gc#&

3EGE$~0qi~^(I4rh*?sK1$ z8Xs3W1|TeDF?QTKP#LID2{l6wM%=4GX1Q=To1qk?<1Z*vY^0b8L|sh8UTfSI5NS0= ze>aJhqhErfLm8$#TF=3MZwv04&VSb|O-?ZzOABp+C-qiH%{df0VsEB|lG^K(Yn6wm zavnd)hD_vBUp$;uIq7sy<4=s~`a81+e*Wy4b2NE$O8PuTMo>NiRItQaC~(tEzZjW$ zYGAe#7W4XKzx7C?y$T%G2a>>OGBC$xjqHk%ru-qLf}3>|iW}Q>B~Pe9EM3%=O)|M) z+tvm2ju}9*10aJI8i^v=j6mawCmCSaZfaWZIvpFO*xbWUw-jgz-VxE<%_wbAs-{y$ z10Kbck0{9$6_eZ2y8Gl)PYEO8>I`pZ92hP>P=S#%j!w6BJDw>Tz}#39mZ=@69I6_y zn=lKbci4Neo%RNA#4o7>yAQ6eQVqQm$N3?x$Q_ASs?U!94Rob!Buh^KpONY#QQ$&~ zZAvGX-cRS}i=i`qZU$$Wa?E0(G+*W{iBr^;p*MCEqo{MGD7Pf=!58}ElOK|53CoDR zr6S-XBMswRDCK5GosN;Ve@Vep*JnFk+;poJ3{`@3>EIHyZc#}S6obcRNyEVe!hCxj z*?m`&Y*yQBLsjqWH+MQoKugYL7S%HwiF6rsmS=(&XwSGTg>$5~#_eQIynfNS1dR7y zbRF+NFPdF4A>SI2+E&6YQBbe;;;Pszd!UK{)L4&e$X6--Odfba>L0oH03vJW_drEZC1a1Ae3@kVYPrU=yYy?PDqJ z$1`z?JGo?#Z5c4u%p(}ujb5~GR(x)XC%4))^Tmrv+8vmxvaAH~G7{|gX1NWQr`D;H zXHeQdYVb9p0sfv@TtH8uS1FbGj#l1(NCT=2A2(}I`imMZ_mrHj%K)(lTcfd%=>%lA zkMHLGmc`iYFJ<-u`niB`D3!eLw z&}PJf+KxF=ucm62Tvv}-9R6fP&%Bn)kXa}IyotQ z6THrkKVWEZPzH#*Ml+u7^K7@5v;j3yvF>GRn?w!2|MIiXJ$Fw;r66oQ zkN12WirNJ(h}z^s`Wf6zM=-KI)6774stEnTV4OaEmdfDAvJ4JzG9uf~7i3_BpK@kq z_CK?oo6?}-s&pCJnw+s(l=57AV~U$rd$G%k1NFYBE197vfg_W#MP@@lVJpVa@?K#h zk*IpI_JOzTv6}}v8bcyOK_jx)ql<%>>NREEyDEWfKiTYCbCFA#zP{&WocMoRICgfn zo&%nKS=Mhz(vg?18nsK_Jo9BkR$GB1K z#(by7s80Nqd1R-%tADlASa$pp%9SJ_X~U~mJGxLljLc3n3MJAMBO9j#x|tQFu-wrY z;gS`N5}fA6rJiZ2hzuL!YLe?aGt{IP0mUyq^|62RgOqLQ{{gP1U{q;1^V|Rc002ov JPDHLkV1lw7v~2(Y literal 0 HcmV?d00001 diff --git a/src/assets/images/default_profile.png b/src/assets/images/default_profile.png new file mode 100644 index 0000000000000000000000000000000000000000..57f68fc840e5fa115b5b25a7dbcbf6172b7a319d GIT binary patch literal 3909 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 Tdtg(I00000NkvXXu0mjfMNmR_ literal 0 HcmV?d00001 diff --git a/src/assets/images/profile_heart.png b/src/assets/images/profile_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..409f19c7b950961819bd040032a9e40c0a513242 GIT binary patch literal 2342 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 literal 0 HcmV?d00001 diff --git a/src/assets/three_dots.svg b/src/assets/three_dots.svg new file mode 100644 index 0000000..b86fbc4 --- /dev/null +++ b/src/assets/three_dots.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/components/molecules/commentCard/CommentCard.tsx b/src/components/molecules/commentCard/CommentCard.tsx new file mode 100644 index 0000000..71aa721 --- /dev/null +++ b/src/components/molecules/commentCard/CommentCard.tsx @@ -0,0 +1,47 @@ +'use client'; + +import ThreeDot from '@/assets/three_dots.svg'; +import { detailDate } from '@/utils/time'; +import { CommentDropdown } from '@/features/comment/components'; +import { useDropdown } from '@/hooks/useDropdown'; + +interface CommentCardProps { + name: string; + text: string; + time: Date; +} + +export const CommentCard = ({ name, text, time }: CommentCardProps) => { + const { isDropdownOpen, handleToggleDropdown, dropdownRef, triggerRef } = + useDropdown(); + + const handleClick = (e: React.MouseEvent) => { + handleToggleDropdown(); + e.stopPropagation(); + }; + return ( +

+
+
+
+ {name} + {detailDate(time)} +
+
+ +
+
+ {isDropdownOpen && ( +
+ +
+ )} +
+ {text} +
+ ); +}; diff --git a/src/components/molecules/commentCard/index.ts b/src/components/molecules/commentCard/index.ts new file mode 100644 index 0000000..5d20360 --- /dev/null +++ b/src/components/molecules/commentCard/index.ts @@ -0,0 +1 @@ +export { CommentCard } from './CommentCard'; diff --git a/src/components/molecules/foldableSpan/FoldableImage.tsx b/src/components/molecules/foldableSpan/FoldableImage.tsx new file mode 100644 index 0000000..73d6fa3 --- /dev/null +++ b/src/components/molecules/foldableSpan/FoldableImage.tsx @@ -0,0 +1,54 @@ +'use client'; + +import DownArrow from '@/assets/down_arrow.svg'; +import TopArrow from '@/assets/top_arrow.svg'; +import { StaticImageData } from 'next/image'; +import { useState } from 'react'; +import Image from 'next/image'; + +interface FoldableImageProps { + spanText: string; + images: StaticImageData[]; +} + +export const FoldableImage = ({ spanText, images }: FoldableImageProps) => { + const [isOpen, setIsOpen] = useState(false); + + if (images.length <= 3) return null; + + if (isOpen) + return ( +
+
+ {images?.map((image) => ( + 이미지 + ))} +
+
setIsOpen(false)} + > + 접기 +
+
+ ); + + return ( +
+
+ {images + ?.slice(0, 3) + .map((image) => ( + 이미지 + ))} +
+
setIsOpen(true)} + > + {spanText} + +
+
+ ); +}; diff --git a/src/components/molecules/foldableSpan/index.ts b/src/components/molecules/foldableSpan/index.ts new file mode 100644 index 0000000..e66af13 --- /dev/null +++ b/src/components/molecules/foldableSpan/index.ts @@ -0,0 +1 @@ +export { FoldableImage } from './FoldableImage'; diff --git a/src/features/comment/components/Comment.stories.tsx b/src/features/comment/components/Comment.stories.tsx new file mode 100644 index 0000000..064b198 --- /dev/null +++ b/src/features/comment/components/Comment.stories.tsx @@ -0,0 +1,47 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import CommentImage from '@/assets/images/comment_image.png'; +import DefaultProfile from '@/assets/images/default_profile.png'; +import { Comment } from './'; + +const meta: Meta = { + title: 'Components/Comment', + component: Comment, +}; + +export default meta; +type Story = StoryObj; + +// 기본 카드 +export const Default: Story = { + args: { + name: '예신', + text: '여기 완전 좋다 그치? 여기로 가볼까?', + time: new Date(), + profile: DefaultProfile, + images: [ + CommentImage, + CommentImage, + CommentImage, + CommentImage, + CommentImage, + CommentImage, + CommentImage, + CommentImage, + CommentImage, + ], + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], +}; + +Default.parameters = { + design: { + type: 'figma', + url: 'https://www.figma.com/design/cr2DuY0vceiMI5LlqWdKR2/Wedvice_%EB%94%94%EC%9E%90%EC%9D%B8?node-id=1493-6711&t=C1C6AY6noGiQkf3h-4', + }, +}; diff --git a/src/features/comment/components/Comment.tsx b/src/features/comment/components/Comment.tsx new file mode 100644 index 0000000..a45f0e1 --- /dev/null +++ b/src/features/comment/components/Comment.tsx @@ -0,0 +1,37 @@ +import Image, { StaticImageData } from 'next/image'; +import { FoldableImage } from '../../../components/molecules/foldableSpan'; +import { CommentCard } from '@/components/molecules/commentCard'; + +interface CommentProps { + name: string; + profile: StaticImageData; + text: string; + time: Date; + images?: StaticImageData[]; +} + +export const Comment = ({ + name, + profile, + text, + time, + images = [], +}: CommentProps) => { + return ( +
+
+
+ 프로필 +
+
+ + + +
+
+
+ ); +}; diff --git a/src/features/comment/components/CommentDropdown.tsx b/src/features/comment/components/CommentDropdown.tsx new file mode 100644 index 0000000..beb4eb2 --- /dev/null +++ b/src/features/comment/components/CommentDropdown.tsx @@ -0,0 +1,9 @@ +export const CommentDropdown = () => { + return ( +
+ +
+ +
+ ); +}; diff --git a/src/features/comment/components/index.ts b/src/features/comment/components/index.ts new file mode 100644 index 0000000..5cbc54c --- /dev/null +++ b/src/features/comment/components/index.ts @@ -0,0 +1,2 @@ +export { CommentDropdown } from './CommentDropdown'; +export { Comment } from './Comment'; diff --git a/src/hooks/useDropdown.ts b/src/hooks/useDropdown.ts new file mode 100644 index 0000000..4d4aff2 --- /dev/null +++ b/src/hooks/useDropdown.ts @@ -0,0 +1,36 @@ +import { useState, useEffect, useRef } from 'react'; + +export const useDropdown = () => { + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + const dropdownRef = useRef(null); + const triggerRef = useRef(null); + + const handleToggleDropdown = (e?: React.MouseEvent) => { + if (e) e.stopPropagation(); + setIsDropdownOpen((prev) => !prev); + }; + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + // 여기 조건문을 통해 클릭한 영역이 ThreeDot이 아니면 dropdown 컴포넌트가 사라지도록 만듭니다. + if ( + dropdownRef.current && + !dropdownRef.current.contains(event.target as Node) && + triggerRef.current && + !triggerRef.current.contains(event.target as Node) + ) { + setIsDropdownOpen(false); + } + }; + + if (isDropdownOpen) { + document.addEventListener('mousedown', handleClickOutside); + } + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [isDropdownOpen]); + + return { isDropdownOpen, handleToggleDropdown, dropdownRef, triggerRef }; +}; diff --git a/src/utils/time.ts b/src/utils/time.ts index e2c6928..197721e 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -26,3 +26,22 @@ export const getFormattedYearMonth = (time: string) => { return `${year}년 ${month}월`; }; + +export const detailDate = (pastTime: Date) => { + const milliSeconds = + new Date().getMilliseconds() - pastTime.getMilliseconds(); + const seconds = milliSeconds / 1000; + if (seconds < 60) return `방금 전`; + const minutes = seconds / 60; + if (minutes < 60) return `${Math.floor(minutes)}분 전`; + const hours = minutes / 60; + if (hours < 24) return `${Math.floor(hours)}시간 전`; + const days = hours / 24; + if (days < 7) return `${Math.floor(days)}일 전`; + const weeks = days / 7; + if (weeks < 5) return `${Math.floor(weeks)}주 전`; + const months = days / 30; + if (months < 12) return `${Math.floor(months)}개월 전`; + const years = days / 365; + return `${Math.floor(years)}년 전`; +};