From fc14716bb371577603ad9400f1fff379367bc416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B5=ED=9D=AC=20=EA=B9=80?= Date: Mon, 23 Dec 2024 06:14:41 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 173 +----------------- package.json | 1 - public/KakaoTalk_20241222_175154359.jpg | Bin 0 -> 12095 bytes public/logo_blue.png | Bin 0 -> 25536 bytes src/app/admin/chat/page.jsx | 72 -------- src/app/admin/chats/[id]/page.jsx | 30 +++ src/app/admin/chats/page.jsx | 82 +++++++++ .../_main/product/relatedProducts/index.jsx | 3 - .../customPaginationSilder/index.jsx | 36 +++- src/components/chat.jsx | 81 ++++++++ src/components/logo.jsx | 4 +- src/layout/_admin/sidebar/index.jsx | 8 + 12 files changed, 236 insertions(+), 254 deletions(-) create mode 100644 public/KakaoTalk_20241222_175154359.jpg create mode 100644 public/logo_blue.png delete mode 100644 src/app/admin/chat/page.jsx create mode 100644 src/app/admin/chats/[id]/page.jsx create mode 100644 src/app/admin/chats/page.jsx create mode 100644 src/components/chat.jsx diff --git a/package-lock.json b/package-lock.json index ea11178..7e2269f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "picshop", + "name": "uie", "version": "0.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "picshop", + "name": "uie", "version": "0.0.2", "dependencies": { "@babel/eslint-parser": "^7.23.10", @@ -59,7 +59,6 @@ "redux-persist": "^6.0.0", "server-only": "^0.0.1", "simplebar-react": "^3.2.4", - "socket.io": "^4.8.1", "socket.io-client": "^4.8.1", "stripe": "^14.9.0", "stylis": "^4.3.0", @@ -1985,21 +1984,6 @@ "tslib": "^2.8.0" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -2346,28 +2330,6 @@ "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", "license": "MIT" }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", @@ -2763,15 +2725,6 @@ ], "license": "MIT" }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, "node_modules/bcrypt": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", @@ -3108,15 +3061,6 @@ "license": "MIT", "peer": true }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/core-js": { "version": "3.39.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", @@ -3128,19 +3072,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -3436,27 +3367,6 @@ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "license": "MIT" }, - "node_modules/engine.io": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", - "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", - "license": "MIT", - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, "node_modules/engine.io-client": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", @@ -3500,27 +3410,6 @@ "node": ">=10.0.0" } }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -7325,55 +7214,6 @@ "node": ">= 10" } }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/socket.io-client": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", @@ -8154,15 +7994,6 @@ "uuid": "dist/esm/bin/uuid" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vite-compatible-readable-stream": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/vite-compatible-readable-stream/-/vite-compatible-readable-stream-3.6.1.tgz", diff --git a/package.json b/package.json index 88f5101..cf6e227 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,6 @@ "redux-persist": "^6.0.0", "server-only": "^0.0.1", "simplebar-react": "^3.2.4", - "socket.io": "^4.8.1", "socket.io-client": "^4.8.1", "stripe": "^14.9.0", "stylis": "^4.3.0", diff --git a/public/KakaoTalk_20241222_175154359.jpg b/public/KakaoTalk_20241222_175154359.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b4573b282bd6ddc37184839f6083d639b3eec48 GIT binary patch literal 12095 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 ANdN!< literal 0 HcmV?d00001 diff --git a/public/logo_blue.png b/public/logo_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6cdeaefe36c208a2b21eced0db3e2777ca1af42b GIT binary patch literal 25536 zcmeHuc{J4T+y6ad-zi11R7xmJk$o8?DN2?KVI(24ui1t|CDf;6$@(cvWh=@umXS|X ziV2~tktodAXY9ZGJ=6F5Jm+`LbIx;qe>~^>o@35&%-qYhyzc9|?(4eVGq+4n8S-$7 zZ~_2$jE)~Q1Aq;W{IRpb5rw}`G{Jv6{0z?fnR{OL3v}>t0=kzxFFNfqy6WKUWai{> zDcJkHlO_O;7mbeUS_FNYY(Syl7X01y5;8kNb@R1}z$OBl2y7y-iNGcTn+R+ou!+DX z0-FeIBCv_TCIbJf5x{>XJRVU_U`l9=y)*d9g1-{o!Gkqr$&tk@-4;5z?d~(;ESH_Z zIb0sP(Pfu0n-`lg%e!Llw9i2gn0M(8FGdWi_%eNRNe6KqURCwI8vm=Y`fn*WbWbV< zG+lk&cdDgjo-1OZ)Xtb3&kwwQR5b?&tF64Tzxtui(eZ}r_bRKlmbs1DZtCc2DCR^u zO_Le)#QNJ}LCm3Fj+7eFlIs4y-)M7jJ@V<~X!IPdEW>aCQB`Us&7FLxe?*6{;ZA;W zm^!qht!>HKcVsDZ8{l>D8>~V~+7e z9V_FJ8)Lfxu}*o7a<v}?me1_u+E*7HrQK0njYcik{O zYi`!3Uu%%J#Zqk`+1J;pTJ18yb4PUQ5BzV^d#9-GF1|?s;TU-kB)grnv) zJi~vTDl0Yh3<(@v3= z@8JqFiDVxqmFPK=3jpz60+P%E_}$ogu;PvNd^(`~Bg2ywTpSZu>Gv?~HN8*;;@A5M zKTma&l?d(iPso19YkYoXFRlgtNoY7$pz~BI`eiL~42ZrpJi)=PhX6CL(rn z?82fDV2a;@&(U3b^I0LjroWosO@JAE%M9tv8r4x&qNXf&9rF+G@-2&Ax_ojY;hh%b zvgqIMsfQNX3-ljdS-t8?#oG*^u)W%FwdzDnM6zJQ6Z^Z@dPz2Q~H=3E%w$ zyyL5Ihf8nzGVdTpCb4ixV=M;sZ8y-DTz1}&Iw*gB9F14Lz#1A;cDGIUXZmbA3nzpS z_(}|^u@gxN6n*XH+>$NeqgE)dxZCSKJHH)5$GY0QzVGyhY?X%Ju-qZ>LJ&xUQQqRS z-mS}Tw*XwFZ{jt#64!UlYE<^ysu5JH>3$TbQ5C}I=`-V88Z{^9YG#wr#B5udCQUnR zduSj45f^QRM0SJg5{3B~Y7!b>72DRBv)up7*&*wFUk?H|r|&tJ8-V+&Dm55@`p!oo z{8d9r)K|-`0Eiq~5XHG%hm$vL$|pjtpDM_`w~KBU|wB zUH!+#UmtmpE_3rr2hwCH#3g$ZgB?3j-$~(;n(_iq5<&&yYOL@ zFr39j)WgrXf0ScD%xQr1ynC{26#((PR-w@ScnAFVt#rDJ<#xtrkD-9D%-k+Sceu_g zMFXDB9g+?=s$7@8Q}xc<(*Sqp0yA4YLmFOlAsq>BCVdLFz!`zXu^(<z6A+ z-z4b}XzFbo#8pJG0<$kw3H|k?U3Be+?sdhzkDc{#-V5+p%5t+Eh!>#ilbJ`p^HrD? z?0PqK?NHSbZjuyZJ;$<*Zv8J!K1kfl{-=t^8aEFEfJ~R#l)mKT?hJNrP(Ia>&gzoF zK!JG=29PRsejZ-yH^Ikn5TSg)u-$NoQr(Z11=s_>6(j1mM(l@1Hu9Thd(=7KnVBbVY#&Q0RjVnX5zxdm$C|j z@V0q0yR5I)dWREuUGxv1t;@;>k&|>9L6;}q{>T%Jkc%j+I5!`P14DuyEi=_0jqKv; z?|$ONK{9xu_Q8uY0mv0PVW4K0#mWuDPA| zykR%n_clI&Z!QQFd74ADn~t8LTOv4B$oFQaB(yxuB7|90a|>^2Q$(<>NGvFR0?;dAq@_^(sG&AVdruGqXQ{^#zB znXA&p` z+f^12#5&BMvbmS~siMc#MsXW{p;o|FH+Sp!JmJ57b)XbMUYu zgUESrf$M2~0HIe74YleebtFmbQ6-H?}Ld)%)%0vN|BzA5TV`%?x&lOFTEdUDyghd!6 zG#lKj!g{Nw6v5rxV?&7x0z#1bpCZnzUh$_PEGL+s&854+Dv(jEiBlf$1|X_7L$1QN z5nTN<=m1*)0fdZ00KC62&HAUVHid=706knCe^K0fbA={YNQ1*au5D$pDZ4sJ>0$Hq1p|ebC52W3ufk9}0hFLgE&R zn^951!>P-IBuxI_t~cU3Eaic487vkLb7I^Xr@bDo!VHKvwS>{a+H_TM5eJasy{C5f zzbky_&#)0uHpq?Q&ibR$!bLOB5NR|MaP)Wnw+4-??(6_B@U2j2tI!+Wf1%N{ga#>0 zsO$R}R)VWdaaZTc21MHGCH8C{h7jKm;?cm-r`MjDO$kd^PL*`+kX2H0(meo<4MR}^ z80~??xmE&cp1g@H@k)zp@o_56QS`I}Ll`xAQiLzlAUsXOPy zJ90|uPerTx5>Cq)#uF(Tgh&+ryLHkCVO?J8PYpbj3b{SiYTaSF!?%?T+M4T6e{rv>l`e@; zFbvaDR0l*w$VdXVw|j;DUDB^5Ji68?tSMJAwst10_tqQOPU%Y?8SE!-Z(ESxdq5vO z!f?iP)B3IX;vS9cu((g%EbfUgXdti6YW#nsZF6eW6NWM5HB`xr8?t~A5wQMpgFy=b zk~|^;t*;8+3IMny1MbE^PiUsds|Q}MOci#<;&;%1c>gN>QpT_%KF#k5gAyDC0Qu}C zo2kIq;&lo6`*WPD704sJnSqKU9QOw*e8%~-jDBDVb$@}fLv zf#Xf|=9jintwwV_Z2H1`;5<8#C=+(|k7@}B`$9dPWE(6Ku{3n&a+PwOHC%=}h(w8@ z`<*se&(Qza_Z7tr8htJ^G?D`PJIVSw$p)8!@WalyGI9FC4F^iXGf|c(X}q}LLEb#E zy`1Ogcd=`6a31CrX0u{(KWf}=@ugO0Zmn87O)-%ZyNwg}k!@niH_Fqy9;af!^iSuf zvF1<&@XQo2)gCbfV9jLWkOra+o+e1-ZcY1s^UhzM;^1_%~Q1Wkt__3u~t9odaT9*#;*xE53Dcn;NURAp817b zqnvlm!#{b~!23F(X@lD+8r>*w-eYcT$7-=|kQ z<>07kJX%aXTCVae7%>0kub;DPbX`SRF#r6uurpw!T>SA2 z8mnSu-?Z#Z*Ww7&V&B~MI5`{`$5|(S3@l}chwPX&PB(!E7pBy93UUL%()itXukJYP z`63kJ?RRf+UtxDy$ETowu|3_jrH2)=ol*IhFt?#Fr@OKar^jyx)$f+Kba~Ku8bF?7 znMZoc#b4u5LuG*!+OnclJQd>rnPl&QjLY`7=0WHKDV|G*?EceW0Q^KNQ2Q5DM$iN< z+r-!m2Pq?T4%dg~G7iiP=o^Q$Unu*G#uKPQniWn#A_|a<={>aY#cyS-kGdMSV?gN7 z)~h8tj_pCOBM=Qb*`mn43LIMN(o9^YIDodTo=XM+vZ6I-A zO_`-6F+p)V?+M(zgYV?=;4r|dqZ^JB{g|7MmiDoiT2B6L@O~9#wCZ+-467mH(XLXNSpTCKs?)WE6@*= z` za~S|07y)jvBNEih(GtTXD^~o%fzY)L}jA^mb*3@AMJek99txa=N4yaSo9_B_i_>iqLHCMB3@fq= z=#PDBuC@9eTL8ItjR>_Jg`;2;inil2i-b)C#)_==7EE88v0IiW$FNBJy?_`HIE=zP z$eBMvi8*x$)ZChBLpCKrVmlymgC)q|djY?U><7dOAMT2 z2;jnw&k-$qljw;cl)TgU;V<#!;vdf0OO=5m#t2GEP_KkRP91H>Y}Andod`tgf}242 z!=VGKv^$Zk_->i7+f58&v}1rfIwdir+xy%yO&{67A}hR+o*8+$RS9k*s-SVwErrt~ zimW2QE^mIO?HpY`A{Fv@*xrp&hT~@iDXCBA0xf6`*7P_z#75r~5!RYi>-hUJTZy7wpdc4GEH_HY(&2u}h#=dDnLy3i=}SR&&ppq=837~B?qr);$l zISC>Y++QqmOfn(;GN2{=Ido_#RaeGAI5a!MQ%68wLc~BEL90y_ZUFvpG6y-M-<@8k zYZBU2xgb|4p*NJ!hDUM>l@)^Xlr{VEj9p6CnwX_mfqnW_xB#EefzNS&b?5l%7dY!< zn28L6Fvh^B(5%GtB6GBoO92_gQ#caGk6%0y-~YtawK}&Nt-P?btw$xKsp% z>CAa}h?JFn1<1~QE<*+Z70QO5^Y#=8RM{qaMW^ICJ9ryMtqCu1UXEs9a$pP4*SfMa zY$1dJuL?#pRX&|W(gje8hV({G?rTo1#uu@0V?X;)DFuHu9)ZOx1ce2vcWbFqC5~XQ zFLvcKRM6{{--i6K;vEK6gqgk_sgQo_q!}}g&S{825t(X&yE9fZy+fmE6 z8YO+y=?hohi-O#3TAs@>= zIa&1|Wet~>T2tAw7Nf?E$Q2Leq$X8k1$3c3XjU zVB)jMAfXwnOTWwM799(OD}AlM&g4yZOS=H;eI@4g_Fo+$0)8Usb{PWhz7H8HDoJ9C zpK&kyd>2tJ_u@VzsAz>4X9U0n_yqyLME%ke>HD*siNt#S{p?=y@++;7kIl6^oh9G` zTo^Nv7&ewuCqMKZ_fpg6H>xK$Na1(v@H?U2gL^6Zw!id^zK%aVKqB*@`vZrK4`|M>HC(Eq z!2Qaj9D+xR4Rzw%M7c^3Cin$-k@GEG_~mUc%)&!_P0`9pJ$hy*1E!r2ruE%{KM)Gm zgi_EGsTurt)32=z{>sMzw`N{fYdS&ELmHc1 zfHl)s{P!gKl>D72R$M>zq3PK8*im|lK-|ubkK7OMS;6(LZ!GC`+4b|X04D}rL)t=f z*^03y0Isp@?4$d)p&c637}O-skB|%78|&YIc4{s! z`G!BFi^m1UI|0qk2pW#o>U?zV0v;8V6tr=iN^;1JEm=Xbeq0M&bTa*H=;Tu-+Wll0 z01l-bj7=KUNnm)rdomC{|24GlQB%MF+kL7c#t&EQI6&c^(+QOYmCSLglL#l`b`E@G zvU>3w2m!wm8r^a@gaQ{fcMQtzF1`(Qd#x0Mox*h49ms z!>?B++{mm<*ai-xQ1>&FO38MtOhieS1{8V^HwqE*p0#R%=TmsTAmMFcyU<32sme6QCTsSlDd4=@yprE)@3{Ubq*fvf2{Yv|TR;CC=4o34V`XP5 z;$TK@!HVDWq;*issnS24vIN(F@;h)5L6g_#*_H^xM@fCuctMcZ>5Tf~(fH>*z|Cyj#^~GBZKQux@5|G;uSe4&Mk4GHeJ?&(t zvjv~<&aFz~=|6+K@!<#+7Znty^iZ(o6M=h!Pd?|^M-xH+-Nr$#B-*3T^z>8=dZ@CT zKWaj7St^?Nh8h2`#jS#17vcC4xpS~E{fUe}%(<+)a{awo0U(*Ft*$-WGI(ei!6RD| znsn0+mbL7A{O}8o8Y>v;;V5Fnpv+;zqsB;rGZvWjn%+ zXN6hT3Ix%K4^X&@;a95Bb;-K470Ji+t56-LtnQzn>Amf*I|VIJ^~Wogu+OWiyD>x&j)*LO zmwu%D#*?8RXdpF|ci^)viCfT2g^|-#tFf6(cUSspqaj`yEp9xm7Q<&CT@^@oLVX}E zF^Nu?8;#4BgF)GGzr=oK)*zPel(K`(kSs72Mqx;tT}*aHoRJC;$s;pqsd|GtQPWfz zwi)pnQ#x%QNW1IZ1Zt=5QaL=Spd&JW{}t1w};@;Om!tZ)HW;T7I{P%!IOZy{FEJ^ zYBW*h+02vPyZY?hq?_H1XZmbezf;WHYZrD6x*_@?C9O;DQf0C_zKCtLruR_39xgjz zMmTy9^Ju6$bIAT;~ltew*cA_{}UX!$LaZdRw=z{aSso!*fC_^#mfR z>|WS{k_~%t)ui!DF28CKN9f;z*mFOAu|z~)PD4F6qBij{v{!)I8_~75_Zlo{iVKBT zOmY_s>o@t+a>rqWI`{k}^`FMjMC69ZHiKqac7s^*TB1Uykc+$A(vCva+h_M|F0+w zp%R0N4vwgWaC^!4uuNGbW`J8jSXys=c;);)JEsTgWV5jhGeF=k(b?}ExTBD|A~MFH zhdA0>#vNdJ>zt8TV8jnzO?=Ti$*lS&9i695&y7cF+Y+-7inIhs@&i1+$JzO^GqO+T z$Ug9_->)8?}rvCLb_MB*SAgx3G|z5UHLi{UQ`!;AhHE9=;;=Lz#n_viKR z<9^K9TwrUVXMoe}D2(Z|>!eWK)`=(6D$zt}WrZi#9gIYlCcn*I`!%rWpiSioZh;QIPtV7|W5Yh*uGy zuPKGug=q~;AJ|RymnyUl%KM`>kW}XcO7mxIvAvE+@FT)>w-UVwItw$&XLsvWh0rC2 zIv)10Vo&wJ4H;I4cb}lQR)}#>tSju1-SW|zU97Agzm{z^zAGSll^{F!FxzRkF)_)k zYH`3VMvN`b;g;X*kt%y2-z39&bka@AQf+1K5Y?QtK#*q~-~dcJER5J|1Y}l?CeZl{ zk<^0jS zlM4AlFNWbuKQZ%PwcCVdDL80%|_Oy6QGTF{vljpzqX3K<;B+@!C^U&Hc@!ReV(c zah>yOXIRg#EKIrG>V6$mJN;D@ddI7o-CKvYAyore-r{1u8Er*PNi2YC6klIrk~Q3Q zE1PcJ#3GNIQwBhbQUZ3pYb%4;Le2%Uc>+FqFv zkClX>aS*+r7`{~C3DaG3+M~KVedh69$8|p{DLG8*sYy>>Q{*(M@U%CumW-}rD^@8@ zn#iU%F*CpGOA$qWm`W9K)Rc%6DaQ3CSK7k*Xy<75kJX}Re_Q!qzHnqx}c$u{$nR%T3atgj1 zo&Y~~a5iA2LdMcmMdC23%N=8tpx41;Opv%~er~$65hF(kf1(iFu{Tm_`0M$l0F8w1 zL|-R-k^O!a;)9^Uh%Cwqc?}S&Kk1dZfA*Y7_01DC<%5KjcO|;ja)-YdWcjt5=5cgh zPpzk6VVK-9XdiWG*7j~5hiKEp+axpMsp3>L?!;2z^ye@M(9Gzw!IzLqddHZO%`e`&}s!%xk18&N(> zcR5OR)qWW5F2(1EklzfYmc|~jc6lrfG4QbSnU?P3|<6DAHiM9jg9%Z(`_4-BSNZ!iH(O_{|6|lfY>`qe`mwX$r-` zr8=~uu0%E?qCVeV?{pH{+Bahx=*V@BYRR4u0^uNT5|!n!X&{eyp={_bgi1mF`=o18oJo$%zj-CJ=jg91hY)l$#dad=Oz@R>mpcS zI3R_oN9K$`r|QY+GfHV{T>7g(zKrC@nQuz7mhMZVI$o2=!>iOPY-CUe9xWX2uX{QX zm?ud3?e+?!DC-!8@`N8`1rJ6vwe!UfF!|kwZlm$A{@{t-)22tBDRY@rOkb52O~duj zzJ98uv?rIjPQ>OBRMzAsi_TqZ6BGW*n^74K<(Y6(l$$wh#sRW1zshEl4r8g%V@X@+ zO&sl~%+x1Au z@@c02+9?N}bAGXIzx#qm=8l;5EXD6hhkqQ&Z_Vxi3vin~!vXLoxH}GCsK)1Lte@ln z-wv>B^IlO~4=xq~B@c^pbhsi==gaQF#>=)POO9*}ct?m~B&Z1^^6^$y1+2sm?X+2# zm$=v3gDzJjq9|&yfb8v$Y1}`S*wpm^H%TD)pA)}X>&$rY&be-*r)R$XO5-3(t^Umn zu+awvSjFH4IexdZVSB}On)5fmGSq5^Z8s$ne)&t;r2ttoZ~*0Z9SCP%_c81}t*e3| zhE<27dMaU^&5bm+{Y7LM^N;oN573fR`Zz(st$ zmWZe_=cqakpC4dRJ}T1=t8@B&+hx%fyKE=?*3hL~b@R+XlM7V@(+%l&^pdpATf>qk z8#ngLIv=_&0IyrwUB>YdGAP(F*x&aa_tLoGomF4VGqm8ax<~U;Grc%Mo)ds**xr?q zUc#gtOdMV}pPtanCbaX}oEq_;x*!7yfg#spSSCSvHYuIASD%Ss*>YW35yasP?ua@b zC40A7Pl8vfMImPgS8cv5wneVpzopVS8(r)RmlVRsirIVAjxPlxz;9*V$;DG1?~PRX zBy!snwq*y3$213)6+EBLyP&v8QWf1&-xa2BOrR58zn5PVLxZ60=q}iUHhrqJ9m<`< z5mjOVz1qs9Yf0;)e*L& zU^Hm>6=}?;1pY{|I3@3w?FTUB%&Y_kjUtWv+Ru-7kZve}37`8VaylFlkt!+M{0>U( z3W75Gy{DW2{jiBKqze<9y-E{ITv3t!s(dEXAr~|3hvLJ152^+Npz)pU4oLuB&EiRV zBD$FAV;v;s`sOHmoJld~HK`evv~KuAL}%^6l?#0R&;p07s8K^%`dfbj&6Ng>QUk@I zZ~F&S;at^|yJG_O*}-(iLi_M!Xi%ju1&5zt_A7}sm~TUg-!0~WR6DeVytwmEJw~V+ zejIjQO+AbaWQUE%7ZOoJ<;D5rZ8#C;dgAshgIUGn&LyeENeEP8!_9G|Lt6X5P!UXL z2$dSQdz&k3%>@cRD24G0UIH4|)@jeLw~7CX_0`$2G3gI~`zLU2=Ia7>N45<#uEI~X zyJ+2&3zp2cll0=07H2QuQIoW^ zX_(&av$`Qg%UGUfD<4lC*+V`iwv_ceTSAqHQURhos!>-P>Z*Tap`lDw(c!I#)yv!4KlI4JIgIJ03<2-MfNye!_Q6 zhL!<~)Y-8+;eBfY-w3>JX=&5D?M|0u$RVfCd;EU=YLI|BY&jFpTJ0CMR)`iv4vT9P zsL$WI7w*1zq+B6%>pESN_x|DGujaS<>yS)F77Z#COh3;Z{ashX-aGNexVw8KC?n&kwnivCk-{r! zS@vtHqMR_V&R&3LkAbQDZ%*YsB6d=1QPep5S#*-l$vb)-(O(Bi5pVZ+hWJ#{Ri&3uOMS-*4Dmx~9L&I&Q*&dj{ zrTbxbxsxNkPH8KvKFmVx^|mfA?_w+c=KIe|B~RmTvD9D7>T$i4hD7(Ceh47WvTQZ1 z!SkU^WHq$naZLxzwyn$PLQ3$(Ac_tz#n#zV-_AbeMI$_TqO8a4oZHK3EmSAM=**1< z3+y<(pwvWUeBmRk$vyaHDDat{VeYGa5nN62Xc(bD8}ua8c-X)f3apQj5*#oWuyz+n z^S{A5&%IVvONht<%D(4^h&lyO2Bbl3dQ>oOpx71kp;jGHod`j3VF!ErOANL z@`l{;-IRk$wsne(=`LM3%?H!G#_1ycpn^Sx4Yore-J@=D^gaX*K6?VCQKIbm^4|&A zo_8*pid<@w@x8BzNQehLtSAhqc~g7j#)eoLE~r4(lF-_l)gV%bOcG%?9fdO?7fG(_ z=t^IBDM*&r;|;k^wnHYf4G_Y*YJ#V1bd*LOuLM6{Gb;$`{<@MyVy;zmqU-hzT079V z+bu|r^=$C6HV-=O6fi8I>)E#*)^|C`Q+j~yhRA0d%zk_0deXs*GkS0=;)q3tiq#Lf zXu?J^RYm<8LJ8lFtkU-x^YRhm&tHgH(OE6~))!M1yfPOXaXE}3kSsK6X;N*rYSjjH zjY!Lhs6QE3(_bYqzD}dWyC9t<5QK*nNf3!|_pCaHCtXBjbn~@|z$OBl2y7y-iNJq} zzRx1)e}3bY3jLwkf4O#ZViSQ)1U3=aL|_wvO$0U(*hF9xf&X6+Ae!8~EA%eF S<}WfLv5~>4qs4l-sQ&{KNB { - // Socket.io 클라이언트 초기화 - socket = io({ path: '/api/socketio' }); - - // 서버와 연결 확인 - socket.on('connect', () => { - console.log('Connected to server'); - }); - - // 서버에서 메시지를 받는 이벤트 처리 - socket.on('message', (data) => { - setMessages((prevMessages) => [...prevMessages, data]); - }); - - // 컴포넌트 언마운트 시 소켓 연결 종료 - return () => { - if (socket) { - socket.disconnect(); - } - }; - }, []); - - const sendMessage = () => { - if (!socket) { - console.error('Socket not initialized'); - return; - } - - if (input.trim()) { - const message = { user: '셀러테스트', text: input }; - - // 메시지 서버로 전송 - socket.emit('message', message); - setMessages((prevMessages) => [...prevMessages, message]); - setInput(''); - } - }; - - return ( -
-
- {messages.map((msg, index) => ( -
- {msg.user}: {msg.text} -
- ))} -
-
- setInput(e.target.value)} - placeholder="입력" - style={{height:'32px', borderRadius:'8px', width:'250px'}} - /> - -
-
- ); -} diff --git a/src/app/admin/chats/[id]/page.jsx b/src/app/admin/chats/[id]/page.jsx new file mode 100644 index 0000000..f8711e7 --- /dev/null +++ b/src/app/admin/chats/[id]/page.jsx @@ -0,0 +1,30 @@ +import React from 'react'; + +// components +import HeaderBreadcrumbs from 'src/components/headerBreadcrumbs'; +import UsersDetails from 'src/components/_admin/users/userDetails'; + +export default function page({ params }) { + return ( + <> + + + + ); +} diff --git a/src/app/admin/chats/page.jsx b/src/app/admin/chats/page.jsx new file mode 100644 index 0000000..eddf99a --- /dev/null +++ b/src/app/admin/chats/page.jsx @@ -0,0 +1,82 @@ +'use client' + +import React, { useEffect, useState } from 'react'; +import { Stack, Box, Button } from '@mui/material'; +import { io } from 'socket.io-client'; + +const socket = io('http://localhost:5100'); // 서버 URL + +function AdminChatPage() { + const [messages, setMessages] = useState([]); + const [filter, setFilter] = useState(''); // 사용자 이메일 필터링 + const [message, setMessage] = useState(''); // 보낼 메시지 + const [targetEmail, setTargetEmail] = useState(''); // 대상 이메일 + + useEffect(() => { + // 관리자 방에 참여 + socket.emit('joinAdmin'); + + // 모든 메시지 가져오기 + fetch(`${process.env.BASE_URL}/v1/chat/admin/messages`) + .then((res) => res.json()) + .then((data) => setMessages(data)); + + // 실시간 메시지 수신 + socket.on('message', (data) => { + setMessages((prev) => [...prev, data]); + }); + + return () => { + socket.off('message'); + }; + }, []); + + + const sendMessage = () => { + if (!targetEmail || !message) { + alert('대상 이메일과 메시지를 입력하세요.'); + return; + } + + const msg = { username: 'arkiun@naver.com', message, targetEmail }; + socket.emit('message', msg); + setMessage(''); + }; + + const filteredMessages = filter + ? messages.filter((msg) => msg.username.includes(filter)) + : messages; + + return ( + + setFilter(e.target.value)} + /> + + {filteredMessages.map((msg, idx) => ( +
+ {msg.username}: {msg.message} +
+ ))} +
+ setTargetEmail(e.target.value)} + /> + setMessage(e.target.value)} + /> + +
+ ); +} + +export default AdminChatPage; diff --git a/src/components/_main/product/relatedProducts/index.jsx b/src/components/_main/product/relatedProducts/index.jsx index d5e668a..521cbba 100644 --- a/src/components/_main/product/relatedProducts/index.jsx +++ b/src/components/_main/product/relatedProducts/index.jsx @@ -27,9 +27,6 @@ export default function RelatedProducts({ ...props }) { Related Products - - Lorem Ipsum Is Simply Dummy Text Of The Printing And Typesetting Industry. - ); diff --git a/src/components/carousels/customPaginationSilder/index.jsx b/src/components/carousels/customPaginationSilder/index.jsx index d08b421..d59241a 100644 --- a/src/components/carousels/customPaginationSilder/index.jsx +++ b/src/components/carousels/customPaginationSilder/index.jsx @@ -4,11 +4,14 @@ import PropTypes from 'prop-types'; import { useState } from 'react'; import BlurImage from 'src/components/blurImage'; // mui -import { Box, Stack, Typography, Button } from '@mui/material'; +import { Box, Stack, Typography, Button, Modal, IconButton } from '@mui/material'; +import { MdClear } from 'react-icons/md'; + // framer motion import { motion, AnimatePresence } from 'framer-motion'; // styles import RootStyled from './styled'; +import ChatApp from 'src/components/chat'; const variants = { enter: (direction) => { @@ -50,9 +53,10 @@ ProductDetailsCarousel.propTypes = { function ProductDetailsCarousel({ ...props }) { const { item, meta } = props; + const [modal, setModal] = useState(); // JSON 문자열인 meta를 객체 배열로 파싱 - const annotations = typeof meta === 'string' ? JSON.parse(meta) : meta; + const annotations = meta && typeof meta === 'string' ? JSON.parse(meta) : meta; return (
@@ -69,7 +73,8 @@ function ProductDetailsCarousel({ ...props }) { )} {/* 저장된 금액 표시 */} - {annotations.map((annotation, idx) => ( + + {annotations ? annotations.map((annotation, idx) => ( - ))} + )) : ''} + { modal && + + + + setModal(false)} + sx={{ + position: 'absolute', + right: 5, + top: 5, + zIndex: 111 + }} + > + + + + + + + }
); } diff --git a/src/components/chat.jsx b/src/components/chat.jsx new file mode 100644 index 0000000..d792c6a --- /dev/null +++ b/src/components/chat.jsx @@ -0,0 +1,81 @@ +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { io } from 'socket.io-client'; +import { useSelector } from 'react-redux'; + +const socket = io(process.env.BASE_URL); // 서버 URL + +function ChatApp() { + const { user } = useSelector(({ user }) => user); + const userEmail = user.email; + const adminEmail = 'arkiun@naver.com'; // 관리자 이메일 + const [messages, setMessages] = useState([]); + const [message, setMessage] = useState(''); + const [username] = useState(userEmail); + + useEffect(() => { + // 사용자 방에 참여 + socket.emit('join', userEmail); + + // 기존 메시지 가져오기 + fetch(`${process.env.BASE_URL}/v1/chat/messages?email=${username},${adminEmail}`) + .then((res) => res.json()) + .then((data) => setMessages(data)); + + // 실시간 메시지 수신 + socket.on('message', (data) => { + setMessages((prev) => [...prev, data]); + }); + + return () => { + socket.off('message'); + }; + }, [username, adminEmail]); + + const sendMessage = () => { + const msg = { username: username, message, targetEmail: adminEmail }; // 관리자 이메일 + socket.emit('message', msg); + setMessage(''); + }; + + return ( + + + + {messages.map((msg, idx) => ( +
+ {msg.username}: {msg.message} +
+ ))} +
+ + setMessage(e.target.value)} + /> + + +
+
+ ); +} + +export default ChatApp; diff --git a/src/components/logo.jsx b/src/components/logo.jsx index 29ebfa7..66ef418 100644 --- a/src/components/logo.jsx +++ b/src/components/logo.jsx @@ -15,13 +15,13 @@ export const Logo = () => { width: 150, height: 'auto', '> img': { - height:36, + height:56, width: 'auto' } }} onClick={() => push('/')} > - logo + logo ); }; diff --git a/src/layout/_admin/sidebar/index.jsx b/src/layout/_admin/sidebar/index.jsx index 04b467a..ff2e591 100644 --- a/src/layout/_admin/sidebar/index.jsx +++ b/src/layout/_admin/sidebar/index.jsx @@ -38,6 +38,7 @@ import { BsBuildings } from 'react-icons/bs'; // components import Scrollbar from 'src/components/Scrollbar'; +import { ChatBubble, ChatBubbleOutline } from '@mui/icons-material'; // Dashboard Side NevLinks export const navlinks = [ @@ -95,6 +96,13 @@ export const navlinks = [ slug: 'users', icon: , isSearch: true + }, + { + id: 8, + title: 'Chats', + slug: 'chats', + icon: , + isSearch: true } // { // id: 8,