From 9103cba49b1236b3a7d7cfa7b47d0f0457fa8831 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:27:10 +0900 Subject: [PATCH 01/72] npm install --- src/App.css | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/App.css b/src/App.css index 74b5e05..83b7c5e 100644 --- a/src/App.css +++ b/src/App.css @@ -1,38 +1,38 @@ .App { - text-align: center; + text-align: center; } .App-logo { - height: 40vmin; - pointer-events: none; + height: 40vmin; + pointer-events: none; } @media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } + .App-logo { + animation: App-logo-spin infinite 20s linear; + } } .App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; } .App-link { - color: #61dafb; + color: #61dafb; } @keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } } From d4ade2873d8b3ae12b551c76c66eccb9552d1e30 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:41:06 +0900 Subject: [PATCH 02/72] =?UTF-8?q?feat:=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 27 +++++++++++++++++++++++++++ src/components/ChatBody.tsx | 25 +++++++++++++++++++++++++ src/components/ChatBottom.tsx | 16 ++++++++++++++++ src/components/ChatHead.tsx | 17 +++++++++++++++++ src/index.tsx | 4 ++-- src/item/profile_mini.png | Bin 0 -> 880 bytes 6 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/ChattingRoom.tsx create mode 100644 src/components/ChatBody.tsx create mode 100644 src/components/ChatBottom.tsx create mode 100644 src/components/ChatHead.tsx create mode 100644 src/item/profile_mini.png diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx new file mode 100644 index 0000000..cb054a2 --- /dev/null +++ b/src/ChattingRoom.tsx @@ -0,0 +1,27 @@ +import React, { useState, useEffect, useRef } from 'react'; +import ChatHead from './components/ChatHead'; +import ChatBody from './components/ChatBody'; +import ChatBottom from './components/ChatBottom'; + +interface Message { + id: number; + from: string; + content: string; + date: string; +} + +interface User { + name: string; + image: './item/profile_mini.png'; +} + +const initialUsers: User[] = [ + { name: '이지인', image: './item/profile_mini.png' }, + { name: '이영인', image: './item/profile_mini.png' }, +]; + +function ChattingRoom() { + return
; +} + +export default ChattingRoom; diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx new file mode 100644 index 0000000..3c8af7b --- /dev/null +++ b/src/components/ChatBody.tsx @@ -0,0 +1,25 @@ +import React from 'react'; + +interface Message { + id: number; + from: string; + content: string; + date: string; +} + +interface ChatBodyProps { + messages: Message[]; + currentUser: string; +} + + + +const ChatBody: React.FC = () => { + return ( +
+
+ ); + }; + + export default ChatBody; + \ No newline at end of file diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx new file mode 100644 index 0000000..0c8b5c0 --- /dev/null +++ b/src/components/ChatBottom.tsx @@ -0,0 +1,16 @@ +import React, { useState, KeyboardEvent, ChangeEvent } from 'react'; + +interface ChatBottomProps { + onSendMessage: (messageContent: string) => void; +} + +const ChatBottom: React.FC = () => { + + return ( +
+ +
+ ); +}; + +export default ChatBottom; \ No newline at end of file diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx new file mode 100644 index 0000000..40be695 --- /dev/null +++ b/src/components/ChatHead.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +interface User { + name: string; + image: '../item/profile_mini.png'; +} + +interface ChatHeadProps { + user: User; + onUserClick: () => void; +} + +const ChatHead: React.FC = () => { + return
; +}; + +export default ChatHead; diff --git a/src/index.tsx b/src/index.tsx index d10be77..6d60180 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,13 +1,13 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; -import App from './App'; +import ChattingRoom from './ChattingRoom'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement ); root.render( - + ); diff --git a/src/item/profile_mini.png b/src/item/profile_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..0942828a98a42ec7849c54ddcc0354b6469161f0 GIT binary patch literal 880 zcmV-$1CRWPP)D!RBogLlRrypv z27>|J-`A<%ACMa*5^*{{ena7K*m0~BWIP^Ix%|yFz&fC8HY2r=zUd#WR*P!2`pWb# zQK$2hdc8iKoTS-8${_W6ed&q@c`0n@?yj=DPbi&ElOu=uq(!>J-6EPtZ z7MDSYF@?fM29^m~h&BHLsZ^?tftksiN+E>&em|X`zmtx^TF6Kn27Xj!6I;zrdl;+Dfv>N ze`(!rS7~s+-y^r`_0+yGj9;c}R0NBtPHc`JaamUb8ItD4LR51GIaybVvEL#S`de(L(kiK5$2N;Zk+c-rgS&C!uF# zG8t*_uv#{iddqjDFU}~49hu_s80kkxuleNkuK+UPJ9Caxs#a?ofpFsIV8w&A)WZe2 zT#hrt3&C0!7w_rdAi_Y_)Q-pF>}Kx1)?*veu~;m624NM_J)h6p+$c_I3<8Vb0z{#Z zr)_2u<}MaL@mh&Qg4cysXI4ZzqIY-KxpjLXkzwMu&g!U$7xVdy{+BdOv;E-GtpD8E z*`e8N`!HBzKA+p(Y0n2?z&2slK|pJpo)`%8`FuX|LW{+M=UoS}5k$ap{abBxT^R70000 Date: Thu, 28 Mar 2024 23:43:31 +0900 Subject: [PATCH 03/72] feat: ChatBody (messages, currentUser) --- src/components/ChatBody.tsx | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx index 3c8af7b..2ad7b86 100644 --- a/src/components/ChatBody.tsx +++ b/src/components/ChatBody.tsx @@ -1,25 +1,29 @@ import React from 'react'; interface Message { - id: number; - from: string; - content: string; - date: string; + id: number; + from: string; + content: string; + date: string; } interface ChatBodyProps { - messages: Message[]; - currentUser: string; + messages: Message[]; + currentUser: string; } +const ChatBody: React.FC = ({ messages, currentUser }) => { + return ( +
+ {messages.map((message) => ( +
+
{message.from}
+
{message.content}
+
{message.date}
+
+ ))} +
+ ); +}; - -const ChatBody: React.FC = () => { - return ( -
-
- ); - }; - - export default ChatBody; - \ No newline at end of file +export default ChatBody; From aba84cc045623a35f5fa4261d561e15a77d1fa64 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:46:24 +0900 Subject: [PATCH 04/72] feat: ChatHead --- src/components/ChatHead.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index 40be695..5576aa2 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -10,8 +10,17 @@ interface ChatHeadProps { onUserClick: () => void; } -const ChatHead: React.FC = () => { - return
; +const ChatHead: React.FC = ({ user, onUserClick }) => { + return ( +
+ Profile +

{user.name}

+
+ ); }; export default ChatHead; From cd156af78fb269e6d558356815c665ad44d9140d Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:49:11 +0900 Subject: [PATCH 05/72] =?UTF-8?q?feat:ChatBottom=20(input=20jsx=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatBottom.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx index 0c8b5c0..176b649 100644 --- a/src/components/ChatBottom.tsx +++ b/src/components/ChatBottom.tsx @@ -1,16 +1,15 @@ import React, { useState, KeyboardEvent, ChangeEvent } from 'react'; interface ChatBottomProps { - onSendMessage: (messageContent: string) => void; + onSendMessage: (messageContent: string) => void; } -const ChatBottom: React.FC = () => { - - return ( -
- -
- ); +const ChatBottom: React.FC = ({ onSendMessage }) => { + return ( +
+ +
+ ); }; -export default ChatBottom; \ No newline at end of file +export default ChatBottom; From fffb3c4fda092d84c4d807bfa49180e0a25dbb5f Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:50:39 +0900 Subject: [PATCH 06/72] =?UTF-8?q?feat=20:=20ChatBottom=20-=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=20Input=20=EC=83=81=ED=83=9C=EA=B4=80=EB=A6=AC=20useS?= =?UTF-8?q?tate=20=ED=9B=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatBottom.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx index 176b649..2e4a6e2 100644 --- a/src/components/ChatBottom.tsx +++ b/src/components/ChatBottom.tsx @@ -5,6 +5,9 @@ interface ChatBottomProps { } const ChatBottom: React.FC = ({ onSendMessage }) => { + + const [inputValue, setInputValue] = useState(''); + return (
From c2cc99aacac8dd1c66236ed578444d4b6d2f5782 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:54:11 +0900 Subject: [PATCH 07/72] =?UTF-8?q?feat:=20ChatBottom=20-=20handleKeyPress()?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80,=20onKeyPress=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatBottom.tsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx index 2e4a6e2..e173746 100644 --- a/src/components/ChatBottom.tsx +++ b/src/components/ChatBottom.tsx @@ -5,12 +5,25 @@ interface ChatBottomProps { } const ChatBottom: React.FC = ({ onSendMessage }) => { + const [inputValue, setInputValue] = useState(''); + + const handleKeyPress = (event: KeyboardEvent) => { + if (event.key === 'Enter' && inputValue.trim()) { + onSendMessage(inputValue.trim()); + setInputValue(''); + } + }; - const [inputValue, setInputValue] = useState(''); - return (
- + ) => + setInputValue(e.target.value) + } + onKeyPress={handleKeyPress} + />
); }; From 69526dacdd7d7e254b3a0debcb6003e56ff8b4ed Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:56:33 +0900 Subject: [PATCH 08/72] =?UTF-8?q?feat:=20ChattingRoom=20-=20=ED=98=84?= =?UTF-8?q?=EC=9E=AC=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC,=20=ED=98=84=EC=9E=AC=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EA=B8=B0=EB=A1=9D=20=EC=83=81=ED=83=9C=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=9B=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index cb054a2..dbfbe9e 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -20,7 +20,14 @@ const initialUsers: User[] = [ { name: '이영인', image: './item/profile_mini.png' }, ]; +const initialMessages: Message[] = []; + function ChattingRoom() { + // 현재 사용자 상태 관리 + const [currentUserIndex, setCurrentUserIndex] = useState(0); + // 현재 메시지 기롥 상태 관리 + const [messages, setMessages] = useState([]); + const currentUser = initialUsers[currentUserIndex]; return
; } From a4f6e30146a4cb153e1a8c0432267e457313818f Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:10:10 +0900 Subject: [PATCH 09/72] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0,?= =?UTF-8?q?=20ChattingRoom=20-=20sendMessage,=20toggleUser=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {src => public}/item/profile_mini.png | Bin src/ChattingRoom.tsx | 29 ++++++++++++++++++++++---- src/components/ChatHead.tsx | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) rename {src => public}/item/profile_mini.png (100%) diff --git a/src/item/profile_mini.png b/public/item/profile_mini.png similarity index 100% rename from src/item/profile_mini.png rename to public/item/profile_mini.png diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index dbfbe9e..3554a19 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -12,12 +12,12 @@ interface Message { interface User { name: string; - image: './item/profile_mini.png'; + image: string; } const initialUsers: User[] = [ - { name: '이지인', image: './item/profile_mini.png' }, - { name: '이영인', image: './item/profile_mini.png' }, + { name: '이지인', image: '/item/profile_mini.png' }, + { name: '이영인', image: '/item/profile_mini.png' }, ]; const initialMessages: Message[] = []; @@ -28,7 +28,28 @@ function ChattingRoom() { // 현재 메시지 기롥 상태 관리 const [messages, setMessages] = useState([]); const currentUser = initialUsers[currentUserIndex]; - return
; + + const sendMessage = (messageContent: string) => { + const newMessage: Message = { + id: Date.now(), + from: currentUser.name, + content: messageContent, + date: new Date().toISOString(), + }; + setMessages([...messages, newMessage]); + }; + + const toggleUser = () => { + setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); + }; + + return ( +
+ + + +
+ ); } export default ChattingRoom; diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index 5576aa2..85891d5 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -2,7 +2,7 @@ import React from 'react'; interface User { name: string; - image: '../item/profile_mini.png'; + image: string; } interface ChatHeadProps { From 5e0ee0ab132aa8099606a41575b394a8676d9beb Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:22:44 +0900 Subject: [PATCH 10/72] =?UTF-8?q?feat:=20time=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=B4=EC=84=9C=20=EC=B1=84=ED=8C=85?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=2000:00=20=ED=98=95=EC=8B=9D=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=91=9C=EC=8B=9C=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index 3554a19..eda1625 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -30,11 +30,24 @@ function ChattingRoom() { const currentUser = initialUsers[currentUserIndex]; const sendMessage = (messageContent: string) => { + const today = new Date().toLocaleDateString('ko-KR', { + year: 'numeric', + month: 'long', + day: 'numeric', + weekday: 'long', + }); + + const time = new Date().toLocaleTimeString('ko-KR', { + hour: '2-digit', + minute: '2-digit', + hour12: false, + }); + const newMessage: Message = { id: Date.now(), from: currentUser.name, content: messageContent, - date: new Date().toISOString(), + date: time, }; setMessages([...messages, newMessage]); }; From f6c9db325f23007aac8721c820ff7c9fd3dad497 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 01:17:56 +0900 Subject: [PATCH 11/72] =?UTF-8?q?feat:ChattingRoom-useRef=EB=A1=9C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=95=98=EB=8B=A8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index eda1625..b5ea94a 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -28,6 +28,13 @@ function ChattingRoom() { // 현재 메시지 기롥 상태 관리 const [messages, setMessages] = useState([]); const currentUser = initialUsers[currentUserIndex]; + // 메세지 목록 끝으로 스크롤 + const messagesEndRef = useRef(null); + + useEffect(() => { + // 메시지가 추가될 때마다 스크롤을 하단으로 이동 + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); const sendMessage = (messageContent: string) => { const today = new Date().toLocaleDateString('ko-KR', { @@ -61,6 +68,7 @@ function ChattingRoom() { +
); } From 407bfef7ac800041a11b1580e6a8bf0ba1ddf655 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 01:20:20 +0900 Subject: [PATCH 12/72] =?UTF-8?q?feat:ChattingRoom-=20=EB=8D=94=EB=AF=B8?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=A1=9C=EB=93=9C=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4,=20useEffect=ED=9B=85=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EB=A1=9C=EC=BB=AC=20=EC=8A=A4=ED=86=A0=EB=A6=AC=EC=A7=80?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index b5ea94a..93572cf 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -31,6 +31,20 @@ function ChattingRoom() { // 메세지 목록 끝으로 스크롤 const messagesEndRef = useRef(null); + useEffect(() => { + // localStorage에서 메시지 데이터 로드 + const savedMessages = localStorage.getItem('messages'); + if (savedMessages) { + setMessages(JSON.parse(savedMessages)); + } + }, []); + + useEffect(() => { + // 메시지 데이터를 localStorage에 저장 + localStorage.setItem('messages', JSON.stringify(messages)); + }, [messages]); + + useEffect(() => { // 메시지가 추가될 때마다 스크롤을 하단으로 이동 messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); From e42d1eeae9ff66fff2a0c396f664c8922a58c056 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 01:41:34 +0900 Subject: [PATCH 13/72] =?UTF-8?q?feat:=EB=A1=9C=EC=BB=AC=20=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EC=A7=80=EC=97=90=EC=84=9C=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?useEffect->useState=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=B4,=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20=EB=8D=94=EB=AF=B8=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=88=84=EC=A0=81=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index 93572cf..2f0b1dc 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -26,24 +26,19 @@ function ChattingRoom() { // 현재 사용자 상태 관리 const [currentUserIndex, setCurrentUserIndex] = useState(0); // 현재 메시지 기롥 상태 관리 - const [messages, setMessages] = useState([]); + const [messages, setMessages] = useState(() => { + // 로컬 스토리지에서 초기 메시지 로드 + const savedMessages = localStorage.getItem('messages'); + return savedMessages ? JSON.parse(savedMessages) : []; + }); const currentUser = initialUsers[currentUserIndex]; // 메세지 목록 끝으로 스크롤 const messagesEndRef = useRef(null); - useEffect(() => { - // localStorage에서 메시지 데이터 로드 - const savedMessages = localStorage.getItem('messages'); - if (savedMessages) { - setMessages(JSON.parse(savedMessages)); - } - }, []); - - useEffect(() => { - // 메시지 데이터를 localStorage에 저장 - localStorage.setItem('messages', JSON.stringify(messages)); - }, [messages]); - + useEffect(() => { + // 메시지 데이터를 localStorage에 저장 + localStorage.setItem('messages', JSON.stringify(messages)); + }, [messages]); useEffect(() => { // 메시지가 추가될 때마다 스크롤을 하단으로 이동 @@ -70,7 +65,9 @@ function ChattingRoom() { content: messageContent, date: time, }; - setMessages([...messages, newMessage]); + + // 기존 메시지 배열에 새 메시지 추가 + setMessages((prevMessages) => [...prevMessages, newMessage]); }; const toggleUser = () => { From 42fcfa97ab9d609a86dcb08bc0a6a1b55eb691ce Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 02:30:56 +0900 Subject: [PATCH 14/72] =?UTF-8?q?style:=20styled-components=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 124 ++++++++++++++++++++++++++++++++ package.json | 1 + src/components/ChatBody.tsx | 53 +++++++++++--- src/components/ChatBottom.tsx | 21 ++++-- src/components/ChatHead.tsx | 9 +-- src/style/ChatBodyStyle.tsx | 38 ++++++++++ src/style/ChatBottomStyle.tsx | 23 ++++++ src/style/ChatHeadStyle.tsx | 16 +++++ src/style/ChattingRoomStyle.tsx | 3 + 9 files changed, 271 insertions(+), 17 deletions(-) create mode 100644 src/style/ChatBodyStyle.tsx create mode 100644 src/style/ChatBottomStyle.tsx create mode 100644 src/style/ChatHeadStyle.tsx create mode 100644 src/style/ChattingRoomStyle.tsx diff --git a/package-lock.json b/package-lock.json index c27bbe4..b518622 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "styled-components": "^6.1.8", "typescript": "^4.9.5", "web-vitals": "^2.1.4" } @@ -2288,6 +2289,24 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -4290,6 +4309,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, + "node_modules/@types/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==" + }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.9", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", @@ -5750,6 +5774,14 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -6182,6 +6214,14 @@ "postcss": "^8.4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -6372,6 +6412,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -15719,6 +15769,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -16260,6 +16315,70 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz", + "integrity": "sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==", + "dependencies": { + "@emotion/is-prop-valid": "1.2.1", + "@emotion/unitless": "0.8.0", + "@types/stylis": "4.2.0", + "css-to-react-native": "3.2.0", + "csstype": "3.1.2", + "postcss": "8.4.31", + "shallowequal": "1.1.0", + "stylis": "4.3.1", + "tslib": "2.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -16275,6 +16394,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", diff --git a/package.json b/package.json index ea335d3..6f5afcf 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "styled-components": "^6.1.8", "typescript": "^4.9.5", "web-vitals": "^2.1.4" }, diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx index 2ad7b86..9d0b854 100644 --- a/src/components/ChatBody.tsx +++ b/src/components/ChatBody.tsx @@ -1,4 +1,10 @@ import React from 'react'; +import { + ChatBodyContainer, + TimeDisplay, + DateSeparator, + ChatMessageBox, +} from '../style/ChatBodyStyle'; interface Message { id: number; @@ -12,17 +18,46 @@ interface ChatBodyProps { currentUser: string; } +const formatDate = (dateString: string) => { + const date = new Date(dateString); + return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`; +}; + +const formatTime = (dateString: string) => { + const date = new Date(dateString); + return `${date.getHours().toString().padStart(2, '0')}:${date + .getMinutes() + .toString() + .padStart(2, '0')}`; +}; + const ChatBody: React.FC = ({ messages, currentUser }) => { + let lastDate = ''; + return ( -
- {messages.map((message) => ( -
-
{message.from}
-
{message.content}
-
{message.date}
-
- ))} -
+ + {messages.map((message, index) => { + const messageDate = formatDate(message.date); + let displayDateSeparator = false; + if (messageDate !== lastDate) { + lastDate = messageDate; + displayDateSeparator = true; + } + + return ( + + {displayDateSeparator && ( + {messageDate} + )} + + {formatTime(message.date)} +
{message.from}
+
{message.content}
+
+
+ ); + })} +
); }; diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx index e173746..0e9e74d 100644 --- a/src/components/ChatBottom.tsx +++ b/src/components/ChatBottom.tsx @@ -1,5 +1,11 @@ import React, { useState, KeyboardEvent, ChangeEvent } from 'react'; +import { + ChatBottomContainer, + ChatInput, + SendButton, +} from '../style/ChatBottomStyle'; + interface ChatBottomProps { onSendMessage: (messageContent: string) => void; } @@ -9,14 +15,20 @@ const ChatBottom: React.FC = ({ onSendMessage }) => { const handleKeyPress = (event: KeyboardEvent) => { if (event.key === 'Enter' && inputValue.trim()) { + sendMessage(); + } + }; + + const sendMessage = () => { + if (inputValue.trim()) { onSendMessage(inputValue.trim()); - setInputValue(''); + setInputValue(''); } }; return ( -
- + ) => @@ -24,7 +36,8 @@ const ChatBottom: React.FC = ({ onSendMessage }) => { } onKeyPress={handleKeyPress} /> -
+ + ); }; diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index 85891d5..77dd734 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { ChatHeadContainer, UserImage, UserName } from '../style/ChatHeadStyle'; interface User { name: string; @@ -12,14 +13,14 @@ interface ChatHeadProps { const ChatHead: React.FC = ({ user, onUserClick }) => { return ( -
- + < UserImage src={user.image} alt='Profile' style={{ width: '50px', height: '50px', borderRadius: '50%' }} /> -

{user.name}

-
+ {user.name} + ); }; diff --git a/src/style/ChatBodyStyle.tsx b/src/style/ChatBodyStyle.tsx new file mode 100644 index 0000000..280751a --- /dev/null +++ b/src/style/ChatBodyStyle.tsx @@ -0,0 +1,38 @@ +import styled, { css } from 'styled-components'; + +export const ChatMessageBox = styled.div<{ isCurrentUser: boolean }>` + padding: 10px; + margin: 5px; + border-radius: 8px; + background-color: lightgray; + align-self: flex-start; + + ${(props) => + props.isCurrentUser && + css` + background-color: lightblue; + align-self: flex-end; + `} +`; + +export const ChatBodyContainer = styled.div` + display: flex; + flex-direction: column; +`; + +export const DateSeparator = styled.div` + width: 7.625rem; + height: 1.3125rem; + flex-shrink: 0; + border-radius: 0.25rem; + background: #D9D9D9; + color: #000; + text-align: center; + margin: 10px auto; // 정중앙 정렬 +`; + +export const TimeDisplay = styled.span` + display: block; // 메시지 박스 위에 표시 + text-align: center; // 정중앙 정렬 + margin-bottom: 5px; +`; \ No newline at end of file diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx new file mode 100644 index 0000000..074444b --- /dev/null +++ b/src/style/ChatBottomStyle.tsx @@ -0,0 +1,23 @@ +import styled from 'styled-components'; + +export const ChatBottomContainer = styled.div` + display: flex; + align-items: center; + padding: 10px; +`; + +export const ChatInput = styled.input` + flex-grow: 1; + margin-right: 8px; + padding: 8px; + border-radius: 4px; + border: 1px solid #ccc; +`; + +export const SendButton = styled.button` + padding: 8px 16px; + border-radius: 4px; + border: none; + background-color: #007bff; + color: white; +`; diff --git a/src/style/ChatHeadStyle.tsx b/src/style/ChatHeadStyle.tsx new file mode 100644 index 0000000..270b73e --- /dev/null +++ b/src/style/ChatHeadStyle.tsx @@ -0,0 +1,16 @@ +import styled from 'styled-components'; + +export const ChatHeadContainer = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px; +`; + +export const UserImage = styled.img` + width: 50px; + height: 50px; + border-radius: 50%; +`; + +export const UserName = styled.h2``; diff --git a/src/style/ChattingRoomStyle.tsx b/src/style/ChattingRoomStyle.tsx new file mode 100644 index 0000000..c041e24 --- /dev/null +++ b/src/style/ChattingRoomStyle.tsx @@ -0,0 +1,3 @@ +import styled from 'styled-components'; + +export const ChatRoomContainer = styled.div``; From b64bbc12068871f56045b0fa947f11884dba036e Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 02:36:12 +0900 Subject: [PATCH 15/72] =?UTF-8?q?fix:ChattingRoom-sendMessage()=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20->=20=EC=8B=9C=EA=B0=84,=EB=82=A0=EC=A7=9C?= =?UTF-8?q?=20Nan=20=ED=91=9C=EC=8B=9C=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 35 +++++++++++------------------------ src/components/ChatBody.tsx | 12 ++++++------ 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index 2f0b1dc..a7c657d 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -45,30 +45,17 @@ function ChattingRoom() { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); - const sendMessage = (messageContent: string) => { - const today = new Date().toLocaleDateString('ko-KR', { - year: 'numeric', - month: 'long', - day: 'numeric', - weekday: 'long', - }); - - const time = new Date().toLocaleTimeString('ko-KR', { - hour: '2-digit', - minute: '2-digit', - hour12: false, - }); - - const newMessage: Message = { - id: Date.now(), - from: currentUser.name, - content: messageContent, - date: time, - }; - - // 기존 메시지 배열에 새 메시지 추가 - setMessages((prevMessages) => [...prevMessages, newMessage]); - }; + const sendMessage = (messageContent: string) => { + const newMessage: Message = { + id: Date.now(), + from: currentUser.name, + content: messageContent, + date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용 + }; + + setMessages((prevMessages) => [...prevMessages, newMessage]); + }; + const toggleUser = () => { setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx index 9d0b854..9484755 100644 --- a/src/components/ChatBody.tsx +++ b/src/components/ChatBody.tsx @@ -18,13 +18,13 @@ interface ChatBodyProps { currentUser: string; } -const formatDate = (dateString: string) => { - const date = new Date(dateString); +const formatDate = (isoDateString: string) => { + const date = new Date(isoDateString); return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`; }; -const formatTime = (dateString: string) => { - const date = new Date(dateString); +const formatTime = (isoDateString: string) => { + const date = new Date(isoDateString); return `${date.getHours().toString().padStart(2, '0')}:${date .getMinutes() .toString() @@ -47,12 +47,12 @@ const ChatBody: React.FC = ({ messages, currentUser }) => { return ( {displayDateSeparator && ( - {messageDate} + {formatDate(message.date)} )} - {formatTime(message.date)}
{message.from}
{message.content}
+ {formatTime(message.date)}
); From 220266aece4c59dcf5ecc114033d53c3875eb474 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 02:53:09 +0900 Subject: [PATCH 16/72] =?UTF-8?q?feat:=20sendButton=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/item/micIcon.png | Bin 0 -> 601 bytes public/item/sendIcon.png | Bin 0 -> 754 bytes src/ChattingRoom.tsx | 21 ++++++++++----------- src/components/ChatBottom.tsx | 13 +++++++++++-- src/style/ChatBottomStyle.tsx | 15 ++++++++++----- 5 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 public/item/micIcon.png create mode 100644 public/item/sendIcon.png diff --git a/public/item/micIcon.png b/public/item/micIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..d58f6ed09ff8baf0e3c017c6a4ee235951f778b3 GIT binary patch literal 601 zcmV-f0;c_mP)M z!cY)>ZGm>HlRD82CScPr;HJ?8Mk52x4mh(oOQO32(M<*u*&xwGC)nKVU?Lk#ve|(M zQd<9g0s$$dpo@twA^G&D@7-PR-U;n?+lB`;-UZZ}5W#RPh zlt8*9qo}*Lo)c=q+(VaGYFk z3E0y5qYNVJ{rLjPu*pe@Ai8dGf&*5ziLBUN?$OUq0+OKtX}K;U6`FQfN3+{2%7`$F zAh#s4bSc0*N8)~@sTMcC;EIi#{VvZqU-P5*?8D3Phc^Lo%lM^&?52s6L~m4rT4S&e z5-h8s`B6h0l>=NX73zBvAW(gGuN7`+Btj97gEBj1k(1jNlAp-LOeY%meL$Jyt9~A3 zbj@ZW7FJl7k<0QA9JFw@)8%)w;Ax|g5S6E>OFVMgW@O{zJ7N|*O%#1djge9(kyv)a ngjf81vs=h?s6B(mVljOI*;(W7Cno<700000NkvXXu0mjf9zq6D literal 0 HcmV?d00001 diff --git a/public/item/sendIcon.png b/public/item/sendIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..05bec3ecd390cbf7392afa130de0845ebb3b3c67 GIT binary patch literal 754 zcmVA0&dluEiS1i^eYtg>v}fyfwD0Zg?080?DZ<3Z8MYv>jsyWc`}FkHoIp(PlAaTK zo}i0kgd%RTtgu>yNgwAJ(A&!k!e%QU;U@M;h^#lOCiaPVk4Sg03M+i z;~p@0q=lKl0#@JEujSz?NG0Fy%?D^6@n2ZcNs9^Vcb<2;v7(3HtG6Bh)Yo)8g$*&E zri3LBnRNIRRxCiAL3S|1ck)85fbBKs#2F@h1Y_o?vfzNLx>`#RXE^Do0`eRORdK-X zZ-H2YxIOhe)b)<8+MJe=wdV;o k$ZrpTQhTn?c;WW^KfiJ6wK+~L?EnA(07*qoM6N<$f+(6)UH||9 literal 0 HcmV?d00001 diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index a7c657d..0c02e56 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -45,17 +45,16 @@ function ChattingRoom() { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); - const sendMessage = (messageContent: string) => { - const newMessage: Message = { - id: Date.now(), - from: currentUser.name, - content: messageContent, - date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용 - }; - - setMessages((prevMessages) => [...prevMessages, newMessage]); - }; - + const sendMessage = (messageContent: string) => { + const newMessage: Message = { + id: Date.now(), + from: currentUser.name, + content: messageContent, + date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용 + }; + + setMessages((prevMessages) => [...prevMessages, newMessage]); + }; const toggleUser = () => { setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx index 0e9e74d..b2f8dc2 100644 --- a/src/components/ChatBottom.tsx +++ b/src/components/ChatBottom.tsx @@ -6,6 +6,9 @@ import { SendButton, } from '../style/ChatBottomStyle'; +const sendIcon = '/item/sendIcon.png'; +const micIcon = 'item/micIcon.png'; + interface ChatBottomProps { onSendMessage: (messageContent: string) => void; } @@ -22,10 +25,13 @@ const ChatBottom: React.FC = ({ onSendMessage }) => { const sendMessage = () => { if (inputValue.trim()) { onSendMessage(inputValue.trim()); - setInputValue(''); + setInputValue(''); } }; + // 입력된 텍스트에 따라 이미지 결정 + const buttonImage = inputValue.trim() ? sendIcon : micIcon; + return ( = ({ onSendMessage }) => { } onKeyPress={handleKeyPress} /> - + ); }; diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx index 074444b..9da37da 100644 --- a/src/style/ChatBottomStyle.tsx +++ b/src/style/ChatBottomStyle.tsx @@ -14,10 +14,15 @@ export const ChatInput = styled.input` border: 1px solid #ccc; `; -export const SendButton = styled.button` - padding: 8px 16px; - border-radius: 4px; +export const SendButton = styled.button<{ backgroundImage: string }>` + width: 40px; + height: 40px; + border-radius: 20px; border: none; - background-color: #007bff; - color: white; + background-color: transparent; + background-image: url(${(props) => props.backgroundImage}); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + cursor: pointer; `; From a437490629cb661b698efb8efdb6c21fe7467def Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 04:50:09 +0900 Subject: [PATCH 17/72] =?UTF-8?q?style:=EC=83=81=EB=8C=80=EB=B0=A9?= =?UTF-8?q?=EC=9D=BC=EB=95=8C=EB=A7=8C=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B3=B4=EC=9D=B4=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=EC=A0=95,=20=EA=B0=81=EC=A2=85=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=20fixing=EC=A4=91..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/item/chatBottom.png | Bin 0 -> 2659 bytes public/item/chatHead.png | Bin 0 -> 2711 bytes src/ChattingRoom.tsx | 21 ++++++++------- src/components/ChatBody.tsx | 9 ++++--- src/components/ChatBottom.tsx | 9 +++---- src/components/ChatHead.tsx | 2 +- src/style/ChatBodyStyle.tsx | 34 +++++++++++++++++++++--- src/style/ChatBottomStyle.tsx | 45 ++++++++++++++++++-------------- src/style/ChatHeadStyle.tsx | 16 ++++++++---- src/style/ChattingRoomStyle.tsx | 7 ++++- 10 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 public/item/chatBottom.png create mode 100644 public/item/chatHead.png diff --git a/public/item/chatBottom.png b/public/item/chatBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5a89932f5816287f21364900af92febb58de8616 GIT binary patch literal 2659 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 J0HNm^`(H{+KPLbH literal 0 HcmV?d00001 diff --git a/public/item/chatHead.png b/public/item/chatHead.png new file mode 100644 index 0000000000000000000000000000000000000000..a72c9ebf06b297a9a857299afd38ae246074ad3a GIT binary patch literal 2711 zcmb7Gc|6n!8~;s;B9W_%BW=5tYqb^L$W6|{x+YgBjEuocW;wA%I`wn~A%-f;y znscM0sdu7=TDV(1JhNcd3UL|3$zKR>UFPvhiQ z6~N%Z#Ac!lM41kQlJ9_-!bo6_?c;X8Lggk|cGwvm%V$k<(a%|9m5vDrr*0G~mh8ON zCoP>iihF3PjtPvX@fFys{AptBWD6JFv83WWht=L-_n?|HQf7RQMMEbt{ip4OtY9t* zYJd;;?AcyUZ!9ycsC=0kuBh$U4<$GK)e(aow{y$KvEvH=32j4Er?=baaowWk63*1e zE<3mr!%9D!RYfs%bdgB(pl2|yp@E?26s)A_h>WJEl8mwtzVdB*rQXmK(+8S&AhWAo zvnj@G=)UksdwY1Ww+p2RG!cfFjRGqwp13d_!y5RoqLZW}z8ZtW;|USjO(pS#2y!av zr(Z9o*IqCW6Poc-T;cIp^nro1-uZ0DY_o1pb+_tWVj!pyhl9npbk;a(zO|GGH#?Fh zNhH#G(Jx8(=K-@$A=tr^{K0pve#P2eju#>_w(I>GY=t@;aT;!o|DC_pp^yc;p0!f_ z;8i8vQ`A6}^$HdxGWvt`k}!(zb^$>@=&mX=En}M4fM4oA`u>gw#0ly?qMAvK*%`E4 zqSk%NgY+vr_H2A0%|2tm_3hmjkFxdARacCkG->_T6J1g zC^YHC3p>K9htyK302q7{B#wQkTH>)-g%4szy1t&m`hHmHQhf*+SP!33twrzaXivm! zuafbBWR>cVIQYc0JogZ9OB6i^k1H1olyQBhxPEGXB!$Squv0h}(#LA)CAPO$>w604=FU@)q4Kd^ zRAN5PdP0MmGm*%6Rzt5_6k*og8exs_-%2uHFH+w09<(x2n6=NCQx1)Ey*^*pyq6+K zJ%PhiUfZI!FkSVsoa{O={qu{U2dAK?cWGSoLNxw6-pmCa5z;UI4Nxhye<9TTe5n)n zXEIR+y*bEQmikt-pX$qf`>ZKZxBb+tf5k+;R($4=yQb|PZvYda6Su!m<8^VDJ6^MF z`%Zx1x>&XOVuo~=zP~=$)S%TTTN7rleV|?0y*b~Ab|&aV?ijqKgs>=Z%L;3PCE#M zvKKuTy)491bt});+@!&vqoJ`Yc9%{d0q0){Zu2;A`_UR{;kInWxP}69V!C zmBfDM$d(;)=^JhS(3w_ht;6A z_+{M?P&xs&C-3{K>|ZbMxLVnU(a4Q$Sl#&=yZ2o~xSt(OuGlV7#r!z7{n6*>&BrD3 z;I(j+-7@?DCxsZzZToGmgrSHw%+ecoUNFmp{COu^LA~- zxS>;p260~?0~0c{zn*Jyn+HKjr)@E$2#XqzBOwS;S|z)bU8%j`kYnPL{U9`BMzTy| zb${(CW=y&(2rR)gZWFNh^9YxfIn)fJMf>mP6};K`+&yMR+~W7`vbI~#*>-k#S_vEs zxBD^^1%bwCxx&Y0RA7tLUCd380Xjd}KzbnV)GL2~Q3VdPVK` zBZ@tEq5zDP{Lw4Cy(fHbm6^t$kTOG$eo^9*n8*@U0bnJ~Zrhl^vmcUXFi(r1J}rzd zh3og364AQdxMXMpO?np3+QF?s_unmwHU?F?%+m1aKk$s!6+_)jPT#Y=# zmaRep7V30Vqele~Hj$wm^$V|eA&1dAHiVYZceK$bz#$c@y56&4Y16a44N_EW&7tyA`N0{*#lOj6~Q#MRbexX|OR zWHRF?T;wPQQoNyi1XxN@-kh!pt-k`a-8>CZ@6PE9GWjdhBYiGI>&A`y#l^+Q?N#Sy t^nTO%lhzq(wM$F>?(e+g=Ek@5uNxTXIv0eVKl~#BOEX(jtg-i#{{bfTNJ; { - const newMessage: Message = { - id: Date.now(), - from: currentUser.name, - content: messageContent, - date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용 - }; - - setMessages((prevMessages) => [...prevMessages, newMessage]); - }; + const sendMessage = (messageContent: string) => { + const newMessage: Message = { + id: Date.now(), + from: currentUser.name, + content: messageContent, + date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용 + }; + + setMessages((prevMessages) => [...prevMessages, newMessage]); + }; + const toggleUser = () => { setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx index 9484755..e596cbb 100644 --- a/src/components/ChatBody.tsx +++ b/src/components/ChatBody.tsx @@ -1,9 +1,12 @@ + import React from 'react'; import { ChatBodyContainer, TimeDisplay, DateSeparator, ChatMessageBox, + UserProfileImage + } from '../style/ChatBodyStyle'; interface Message { @@ -49,11 +52,11 @@ const ChatBody: React.FC = ({ messages, currentUser }) => { {displayDateSeparator && ( {formatDate(message.date)} )} + {formatTime(message.date)} -
{message.from}
{message.content}
- {formatTime(message.date)}
+ ); })} @@ -61,4 +64,4 @@ const ChatBody: React.FC = ({ messages, currentUser }) => { ); }; -export default ChatBody; +export default ChatBody; \ No newline at end of file diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx index b2f8dc2..e74790c 100644 --- a/src/components/ChatBottom.tsx +++ b/src/components/ChatBottom.tsx @@ -6,8 +6,8 @@ import { SendButton, } from '../style/ChatBottomStyle'; -const sendIcon = '/item/sendIcon.png'; -const micIcon = 'item/micIcon.png'; +const sendIcon = '/item/sendIcon.png'; +const micIcon = '/item/micIcon.png'; interface ChatBottomProps { onSendMessage: (messageContent: string) => void; @@ -42,10 +42,7 @@ const ChatBottom: React.FC = ({ onSendMessage }) => { } onKeyPress={handleKeyPress} /> - + ); }; diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index 77dd734..4526bde 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -14,7 +14,7 @@ interface ChatHeadProps { const ChatHead: React.FC = ({ user, onUserClick }) => { return ( - < UserImage + ` - padding: 10px; +display:inline-block; + padding: 5px; + width:196px; margin: 5px; border-radius: 8px; - background-color: lightgray; + background-color: #EDEDED; align-self: flex-start; + font-size: 16px; + border-radius: 20px 20px 5px 20px; + + ${(props) => props.isCurrentUser && css` - background-color: lightblue; + background-color: #DCF7C5; align-self: flex-end; `} `; export const ChatBodyContainer = styled.div` + display: flex; flex-direction: column; + margin-top: 96px; + margin-bottom:80px; + + + +`; + +export const UserProfileImage = styled.img<{ isCurrentUser: boolean }>` + width: 20px; + height: 20px; + border-radius: 50%; + margin-right: 0px; /* 메시지 박스와의 간격 */ + display:inline-block; + + ${(props) => + props.isCurrentUser && + css` + display:none; + `} `; export const DateSeparator = styled.div` @@ -35,4 +61,6 @@ export const TimeDisplay = styled.span` display: block; // 메시지 박스 위에 표시 text-align: center; // 정중앙 정렬 margin-bottom: 5px; + font-size: 12px; + `; \ No newline at end of file diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx index 9da37da..bb8bd25 100644 --- a/src/style/ChatBottomStyle.tsx +++ b/src/style/ChatBottomStyle.tsx @@ -1,28 +1,35 @@ import styled from 'styled-components'; +// ChatBottomContainer를 div로 변경하여 컨테이너로 사용 export const ChatBottomContainer = styled.div` - display: flex; - align-items: center; - padding: 10px; +position: fixed; +bottom: 0; +width: 375px; +height: 80px; + + + flex-shrink: 0; + + background-image: url('/item/chatBottom.png'); + background-size: cover; `; export const ChatInput = styled.input` - flex-grow: 1; - margin-right: 8px; - padding: 8px; - border-radius: 4px; - border: 1px solid #ccc; + width: 14.25rem; + height: 2rem; + flex-shrink: 0; + font-size: 14px; + + border-radius: 1rem; + border: 0.5px solid var(--gray, #8d8d8f); + opacity: 0.4496; + background: var(--white, #fff); `; -export const SendButton = styled.button<{ backgroundImage: string }>` - width: 40px; - height: 40px; - border-radius: 20px; - border: none; - background-color: transparent; - background-image: url(${(props) => props.backgroundImage}); - background-repeat: no-repeat; - background-position: center; - background-size: cover; +export const SendButton = styled.img` + width: 1.5rem; + height: 1.5rem; + flex-shrink: 0; cursor: pointer; -`; + border: none; +`; \ No newline at end of file diff --git a/src/style/ChatHeadStyle.tsx b/src/style/ChatHeadStyle.tsx index 270b73e..0cb6b6f 100644 --- a/src/style/ChatHeadStyle.tsx +++ b/src/style/ChatHeadStyle.tsx @@ -1,16 +1,22 @@ import styled from 'styled-components'; export const ChatHeadContainer = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px; +width: 375px; +height: 96px; +position: fixed; +top: 0px; + + flex-shrink: 0; + background-image: url('/item/chatHead.png'); + background-size: cover; `; export const UserImage = styled.img` width: 50px; height: 50px; border-radius: 50%; + `; -export const UserName = styled.h2``; +export const UserName = styled.h2`font-size: 16px; +`; diff --git a/src/style/ChattingRoomStyle.tsx b/src/style/ChattingRoomStyle.tsx index c041e24..dad78ae 100644 --- a/src/style/ChattingRoomStyle.tsx +++ b/src/style/ChattingRoomStyle.tsx @@ -1,3 +1,8 @@ import styled from 'styled-components'; -export const ChatRoomContainer = styled.div``; +export const ChatRoomContainer = styled.div` + width: 375px; + height: 812px; + background: var(--white, #fff); + +`; From 995e3e5a9d9a3fccff9aff25792240294001a64d Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:26:42 +0900 Subject: [PATCH 18/72] . --- src/style/ChatBottomStyle.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx index bb8bd25..55884fa 100644 --- a/src/style/ChatBottomStyle.tsx +++ b/src/style/ChatBottomStyle.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components'; export const ChatBottomContainer = styled.div` position: fixed; bottom: 0; -width: 375px; +width: 100%; height: 80px; @@ -15,14 +15,15 @@ height: 80px; `; export const ChatInput = styled.input` - width: 14.25rem; +width: 60%; + height: 2rem; flex-shrink: 0; font-size: 14px; - + margin-left:11%; border-radius: 1rem; border: 0.5px solid var(--gray, #8d8d8f); - opacity: 0.4496; + opacity: 0.5; background: var(--white, #fff); `; From ea208c02c97b82c51bb5b6ed22ec3013d1c15fce Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:52:53 +0900 Subject: [PATCH 19/72] =?UTF-8?q?style:=20=ED=94=BC=EA=B7=B8=EB=A7=88=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=20=EA=B5=AC=ED=98=84(=ED=94=BD?= =?UTF-8?q?=EC=85=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/item/chatBottom.png | Bin 2659 -> 1244 bytes src/App.css | 38 --------------------- src/components/ChatBody.tsx | 1 + src/components/ChatBottom.tsx | 1 + src/components/ChatHead.tsx | 2 +- src/index.css | 13 -------- src/style/ChatBodyStyle.tsx | 57 +++++++++++++++++++++++++------- src/style/ChatBottomStyle.tsx | 46 ++++++++++++++------------ src/style/ChatHeadStyle.tsx | 20 +++++++++-- src/style/ChattingRoomStyle.tsx | 1 + 10 files changed, 90 insertions(+), 89 deletions(-) diff --git a/public/item/chatBottom.png b/public/item/chatBottom.png index 5a89932f5816287f21364900af92febb58de8616..402dc135081af881cfe24b1038b08049a34ef74f 100644 GIT binary patch literal 1244 zcmeAS@N?(olHy`uVBq!ia0y~yU@Ql+131`#VM%xNb!1@J*w6hZkrl`-^mK6ysbGA2*WPDNs?33p&)=M4l=al~LfyshO36mCDfoo$jwk<4O@LRXm6bTFS(B8SF^V6-;}m_<_iwV?=oNVt~B2GbYQJ@#p(CIWhy4} ziK9{gmisVQ8rM=D@@|&39UZT2~~V)K|C={m!{FJ1<$jJdyoZris)_6LF#M zbN5D7ZL$61@0ZBV78<3m_hftR)q(znQ5<{Jn#D5Azap>-CkR`ZRWd}>}4yp|K^)-G?;y<$TVwz>H3TRZqC1VcYWQv zC(ow~{n)r>3DC&+e|IYL`K7+Cllg3Yo$vPj`d#;`KW>>)*K;>t^NqmuS5#V z*j@DC{`zHwayD=FS1xYp(@-@qGTZhlv+mcM@_%z?`_+mkY!>>qw?FnyECY{)exbbM zBfc+}vJJPYJin(qnP2_xuYWVYIWC?2XH%&6+E)+5_rLlZ{y*jAeUtBNR_|m?pS<1G zFV6D!7C)8eeZNz#zPA6jYU$g0zrO148{KbnCTM)RQx(^6_r|L)spX#x zWBVok_iw(|oXfu2QF}u@q_ODkzWbJ2w%FYF(e7?{XP=&TfBo{;=OuThCzp3<-Y-15 z$9jtP`_}h!+-yC#`+F~aK6!2H+0HLNU;pkjj0t#q&yQQo4p7EXn%! zedfx4y#-FCES=Uzwi;ZvndNMM@>bg4&hD1Ie|?{aygH@b-pN8Ut~hJY zoviom@@kFkGd^+r`Og3C_U@#x`ZddE*URlcpT7FI*y_rkug{xb{&e-)N_~T{OaFgm z@7}%JzgDQaczN;cz0=d%ez%v-wtZm2$Hy0>si*SJfARt5W)00ZH*cKJmXW*li{(pL z)Q!y>`>XFsMLyzY=UH~et|fBf8T|#ilN`d|Ii6(RA0T|~=g~Ls7Hyo&cIwJohnG(4 z-0b9j>cnT9IeJWC*}Iir|I90I`Wx|Lt(x85#-N$I8PKyDTFx5??t=de(^^7*`&h?x Q0}CStPgg&ebxsLQ03rukYXATM literal 2659 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 J0HNm^`(H{+KPLbH diff --git a/src/App.css b/src/App.css index 83b7c5e..e69de29 100644 --- a/src/App.css +++ b/src/App.css @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx index e596cbb..f8d3424 100644 --- a/src/components/ChatBody.tsx +++ b/src/components/ChatBody.tsx @@ -37,6 +37,7 @@ const formatTime = (isoDateString: string) => { const ChatBody: React.FC = ({ messages, currentUser }) => { let lastDate = ''; + return ( {messages.map((message, index) => { diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx index e74790c..1196a9f 100644 --- a/src/components/ChatBottom.tsx +++ b/src/components/ChatBottom.tsx @@ -36,6 +36,7 @@ const ChatBottom: React.FC = ({ onSendMessage }) => { ) => setInputValue(e.target.value) diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index 4526bde..de552db 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -17,7 +17,7 @@ const ChatHead: React.FC = ({ user, onUserClick }) => { {user.name} diff --git a/src/index.css b/src/index.css index ec2585e..e69de29 100644 --- a/src/index.css +++ b/src/index.css @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/src/style/ChatBodyStyle.tsx b/src/style/ChatBodyStyle.tsx index dea019f..7f20506 100644 --- a/src/style/ChatBodyStyle.tsx +++ b/src/style/ChatBodyStyle.tsx @@ -2,23 +2,40 @@ import styled, { css } from 'styled-components'; export const ChatMessageBox = styled.div<{ isCurrentUser: boolean }>` display:inline-block; - padding: 5px; + padding: 8px 9px 8px 9px; + width:196px; - margin: 5px; + margin-left:30px; border-radius: 8px; background-color: #EDEDED; align-self: flex-start; - font-size: 16px; - border-radius: 20px 20px 5px 20px; - + border-radius: 20px 20px 20px 5px; + color: var(--dark-gray, #4E5058); +font-family: "Noto Sans KR"; +font-size: 16px; +font-style: normal; +font-weight: 400; +line-height: 150%; /* 24px */ +letter-spacing: -0.41px; ${(props) => props.isCurrentUser && css` + border-radius: 20px 20px 5px 20px; background-color: #DCF7C5; align-self: flex-end; - `} + margin-right:5px; + ` + } + + ${(props) => + !props.isCurrentUser && + css` + + + ` + } `; export const ChatBodyContainer = styled.div` @@ -26,7 +43,9 @@ export const ChatBodyContainer = styled.div` display: flex; flex-direction: column; margin-top: 96px; - margin-bottom:80px; + margin-bottom:85px; + width: 375px; + @@ -37,30 +56,44 @@ export const UserProfileImage = styled.img<{ isCurrentUser: boolean }>` height: 20px; border-radius: 50%; margin-right: 0px; /* 메시지 박스와의 간격 */ + margin-left: 5px; /* 메시지 박스와의 간격 */ display:inline-block; + margin-top:-10px; + position:relative; + z-index:-5; + ${(props) => props.isCurrentUser && css` display:none; + `} `; export const DateSeparator = styled.div` - width: 7.625rem; - height: 1.3125rem; - flex-shrink: 0; - border-radius: 0.25rem; - background: #D9D9D9; +width: 122px; +height: 21px; +flex-shrink: 0; +border-radius: 4px; +background: var(--medium-gray, #D9D9D9); color: #000; text-align: center; margin: 10px auto; // 정중앙 정렬 + font-family: "Noto Sans KR"; +font-size: 12px; +font-style: normal; +font-weight: 500; +line-height: 180%; /* 18px */ + + `; export const TimeDisplay = styled.span` display: block; // 메시지 박스 위에 표시 text-align: center; // 정중앙 정렬 margin-bottom: 5px; + margin-top:5px; font-size: 12px; `; \ No newline at end of file diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx index 55884fa..d64758e 100644 --- a/src/style/ChatBottomStyle.tsx +++ b/src/style/ChatBottomStyle.tsx @@ -2,35 +2,37 @@ import styled from 'styled-components'; // ChatBottomContainer를 div로 변경하여 컨테이너로 사용 export const ChatBottomContainer = styled.div` -position: fixed; -bottom: 0; -width: 100%; -height: 80px; - - + position: fixed; + bottom: 0; + width: 375px; + height: 80px; flex-shrink: 0; - + background-image: url('/item/chatBottom.png'); background-size: cover; `; export const ChatInput = styled.input` -width: 60%; - - height: 2rem; + width: 275px; + height: 32px; flex-shrink: 0; - font-size: 14px; - margin-left:11%; - border-radius: 1rem; - border: 0.5px solid var(--gray, #8d8d8f); - opacity: 0.5; - background: var(--white, #fff); + font-size: 14px; + margin-left: 11%; + border-radius: 16px; + border: 0.5px solid #8e8e93; + padding: 0px 0px 0px 7px; + opacity: 0.4496; + margin-top: 8px; + background: #fff; `; export const SendButton = styled.img` - width: 1.5rem; - height: 1.5rem; - flex-shrink: 0; - cursor: pointer; - border: none; -`; \ No newline at end of file + width: 30px; + height: 30px; + flex-shrink: 0; + cursor: pointer; + border: none; + position: absolute; + margin-top: 9px; + margin-left: 4px; +`; diff --git a/src/style/ChatHeadStyle.tsx b/src/style/ChatHeadStyle.tsx index 0cb6b6f..db1b9fb 100644 --- a/src/style/ChatHeadStyle.tsx +++ b/src/style/ChatHeadStyle.tsx @@ -5,6 +5,10 @@ width: 375px; height: 96px; position: fixed; top: 0px; +display:flex; +justify-content:flex-start; +align-items:center; + flex-shrink: 0; background-image: url('/item/chatHead.png'); @@ -12,11 +16,21 @@ top: 0px; `; export const UserImage = styled.img` - width: 50px; - height: 50px; +margin-left:45px; +margin-right:10px; +margin-top:30px; border-radius: 50%; + width: 10px; + height: 40px; + + + `; -export const UserName = styled.h2`font-size: 16px; +export const UserName = styled.h2` +font-size: 16px; +margin-top:47px; +font-style: normal; +font-weight: 500; `; diff --git a/src/style/ChattingRoomStyle.tsx b/src/style/ChattingRoomStyle.tsx index dad78ae..c8b70ff 100644 --- a/src/style/ChattingRoomStyle.tsx +++ b/src/style/ChattingRoomStyle.tsx @@ -4,5 +4,6 @@ export const ChatRoomContainer = styled.div` width: 375px; height: 812px; background: var(--white, #fff); + `; From 3e9b3990335a3197230303bb35f9dbe31a9be77f Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:59:32 +0900 Subject: [PATCH 20/72] =?UTF-8?q?feat:ChatBody.tsx-displayMinuteSeparator?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatBody.tsx | 14 +++++++++++++- src/style/ChatBodyStyle.tsx | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx index f8d3424..8ced6f0 100644 --- a/src/components/ChatBody.tsx +++ b/src/components/ChatBody.tsx @@ -36,24 +36,36 @@ const formatTime = (isoDateString: string) => { const ChatBody: React.FC = ({ messages, currentUser }) => { let lastDate = ''; + let lastMinute = ''; return ( {messages.map((message, index) => { const messageDate = formatDate(message.date); + const messageMinute = formatTime(message.date); let displayDateSeparator = false; + let displayMinuteSeparator = false; + if (messageDate !== lastDate) { lastDate = messageDate; displayDateSeparator = true; } + if (messageMinute !== lastMinute) { + lastMinute = messageMinute; + displayMinuteSeparator = true; + } + return ( {displayDateSeparator && ( {formatDate(message.date)} )} - {formatTime(message.date)} + {displayMinuteSeparator && ( + {formatTime(message.date)} + )} +
{message.content}
diff --git a/src/style/ChatBodyStyle.tsx b/src/style/ChatBodyStyle.tsx index 7f20506..32d93fb 100644 --- a/src/style/ChatBodyStyle.tsx +++ b/src/style/ChatBodyStyle.tsx @@ -6,6 +6,8 @@ display:inline-block; width:196px; margin-left:30px; + margin-bottom:5px; + margin-top:5px; border-radius: 8px; background-color: #EDEDED; align-self: flex-start; From 5ac25d5646507dc6e3b1758bb510bb695a2c92b2 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 18:19:35 +0900 Subject: [PATCH 21/72] setting:jason-server --- package-lock.json | 6 ++++++ package.json | 1 + src/ChattingRoom.tsx | 25 ++++++++++++++----------- src/dummy.json | 3 +++ 4 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 src/dummy.json diff --git a/package-lock.json b/package-lock.json index b518622..d0755a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@types/node": "^16.18.91", "@types/react": "^18.2.69", "@types/react-dom": "^18.2.22", + "nodejs": "^0.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", @@ -12673,6 +12674,11 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, + "node_modules/nodejs": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/nodejs/-/nodejs-0.0.0.tgz", + "integrity": "sha512-1V+0HwaB/dhxzidEFc4uJ3k52gLI4B6YBZgJIofjwYCSAkD6CI0me6TDBT2QM2nbGWNxCHcq9/wVynzQYZOhUg==" + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/package.json b/package.json index 6f5afcf..5e6fc8e 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@types/node": "^16.18.91", "@types/react": "^18.2.69", "@types/react-dom": "^18.2.22", + "nodejs": "^0.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index a7c657d..2a5c4fb 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect, useRef } from 'react'; import ChatHead from './components/ChatHead'; import ChatBody from './components/ChatBody'; import ChatBottom from './components/ChatBottom'; +import dummy from './dummy.json'; interface Message { id: number; @@ -38,6 +39,9 @@ function ChattingRoom() { useEffect(() => { // 메시지 데이터를 localStorage에 저장 localStorage.setItem('messages', JSON.stringify(messages)); + + //dummy.message = JSON.stringify(messages); + //console.log(dummy.message); }, [messages]); useEffect(() => { @@ -45,17 +49,16 @@ function ChattingRoom() { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); - const sendMessage = (messageContent: string) => { - const newMessage: Message = { - id: Date.now(), - from: currentUser.name, - content: messageContent, - date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용 - }; - - setMessages((prevMessages) => [...prevMessages, newMessage]); - }; - + const sendMessage = (messageContent: string) => { + const newMessage: Message = { + id: Date.now(), + from: currentUser.name, + content: messageContent, + date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용 + }; + + setMessages((prevMessages) => [...prevMessages, newMessage]); + }; const toggleUser = () => { setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); diff --git a/src/dummy.json b/src/dummy.json new file mode 100644 index 0000000..e62f743 --- /dev/null +++ b/src/dummy.json @@ -0,0 +1,3 @@ +{ + "messages": [] + } \ No newline at end of file From 8b2318ffd0f6c4f6a88fa06fa7bdb2d89d5f25a7 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 18:58:31 +0900 Subject: [PATCH 22/72] =?UTF-8?q?feat:=EC=B4=88=EA=B8=B0=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20dummy.json=EC=97=90=EC=84=9C=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 6 ++++-- src/dummy.json | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index 2a5c4fb..fdca42e 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -29,8 +29,10 @@ function ChattingRoom() { // 현재 메시지 기롥 상태 관리 const [messages, setMessages] = useState(() => { // 로컬 스토리지에서 초기 메시지 로드 - const savedMessages = localStorage.getItem('messages'); - return savedMessages ? JSON.parse(savedMessages) : []; + // const savedMessages = localStorage.getItem('messages'); + const savedMessages = dummy; + //return savedMessages ? JSON.parse(savedMessages) : []; + return savedMessages; }); const currentUser = initialUsers[currentUserIndex]; // 메세지 목록 끝으로 스크롤 diff --git a/src/dummy.json b/src/dummy.json index e62f743..782935e 100644 --- a/src/dummy.json +++ b/src/dummy.json @@ -1,3 +1,35 @@ -{ - "messages": [] - } \ No newline at end of file + + +[ + { + "id": 1711705694689, + "from": "이지인", + "content": "국가는 농수산물의 수급균형과 유통구조의 개선에 노력하여", + "date": "2024-03-29T09:48:14.689Z" + }, + { + "id": 1711705702873, + "from": "이영인", + "content": "가격안정을 도모함으로써 농·어민의 이익을 보호한다.", + "date": "2024-03-29T09:48:22.873Z" + }, + { + "id": 1711705711651, + "from": "이지인", + "content": "정당은 그 목적·조직과 활동이 민주적이어야 하며,", + "date": "2024-03-29T09:48:31.651Z" + }, + { + "id": 1711705718508, + "from": "이지인", + "content": "국민의 정치적 의사형성에 참여", + "date": "2024-03-29T09:48:38.508Z" + }, + { + "id": 1711705726747, + "from": "이영인", + "content": "하는데 필요한 조직을 가져야 한다.", + "date": "2024-03-29T09:48:46.747Z" + } + +] \ No newline at end of file From 881f972f7dfd03325125327cecd89eeae7237580 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:04:52 +0900 Subject: [PATCH 23/72] =?UTF-8?q?feat=20README.md=20-=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20=EB=A7=81=ED=81=AC=20=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 82b92ad..ec33c8f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # 서론 +배포 링크 : https://react-messenger-19th-taupe.vercel.app/ + 안녕하세요 🙌🏻 19기 프론트 운영진 배성준입니다. 이번 미션에서는 드디어 투두리스트에서 벗어나 새로운 프로젝트인 **messenger** 만들기를 진행합니다. 이번주는 특별히 **디자이너와의 협업**으로 진행되는 미션입니다. 디자이너분께서 열심히 리디자인 한 메신저 프로젝트를 여러분들께서 구현해주시면 됩니다. From 92b8fce5600d048310d94cb4c676551286bec415 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:34:31 +0900 Subject: [PATCH 24/72] =?UTF-8?q?feat:=20userImage=EB=8F=84=20=20ChatBodyP?= =?UTF-8?q?rops=EB=A1=9C=20=EC=A0=84=EB=8B=AC=ED=95=98=EC=97=AC,=20current?= =?UTF-8?q?User,=20body=20=ED=94=84=EB=A1=9C=ED=95=84=EC=97=90=EB=8F=84=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/item/profile_mini2.png | Bin 0 -> 18783 bytes src/ChattingRoom.tsx | 4 ++-- src/components/ChatBody.tsx | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 public/item/profile_mini2.png diff --git a/public/item/profile_mini2.png b/public/item/profile_mini2.png new file mode 100644 index 0000000000000000000000000000000000000000..c2841564344d6db9918055a268d5a6456ed8965e GIT binary patch literal 18783 zcmV(?K-a&CP)J0W~OHbV^P5TnE6F= zFc=tU7){xLVZ$&;x$U;>wwt7Tq10NcXi036O{$V>6UpeyWhR{+;f*_$*=hFyk+�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͋|q2|pV%4XsK%J0 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 a9{&}P5(pCZCLx;u0000 - +
diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx index 8ced6f0..758b262 100644 --- a/src/components/ChatBody.tsx +++ b/src/components/ChatBody.tsx @@ -19,6 +19,7 @@ interface Message { interface ChatBodyProps { messages: Message[]; currentUser: string; + userImage: string; } const formatDate = (isoDateString: string) => { @@ -34,7 +35,7 @@ const formatTime = (isoDateString: string) => { .padStart(2, '0')}`; }; -const ChatBody: React.FC = ({ messages, currentUser }) => { +const ChatBody: React.FC = ({ messages,userImage, currentUser}) => { let lastDate = ''; let lastMinute = ''; @@ -69,7 +70,7 @@ const ChatBody: React.FC = ({ messages, currentUser }) => {
{message.content}
- +
); })} From db159235bd72c38ed5cdb828335ca5c2fbb842d6 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 21:20:32 +0900 Subject: [PATCH 25/72] =?UTF-8?q?feat:chatbody=20props=EB=A1=9C=20currentU?= =?UTF-8?q?ser=EA=B0=80=20=EC=95=84=EB=8B=8C,=20otherUser=20profile=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ChattingRoom.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx index ad870b9..37f699e 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.tsx @@ -35,6 +35,9 @@ function ChattingRoom() { return savedMessages; }); const currentUser = initialUsers[currentUserIndex]; + const otherUserIndex = (currentUserIndex + 1) % initialUsers.length; + const otherUser = initialUsers[otherUserIndex]; + // 메세지 목록 끝으로 스크롤 const messagesEndRef = useRef(null); @@ -69,7 +72,11 @@ function ChattingRoom() { return (
- +
From 6536e109583d6c9f1642ac3b8f22e65629fb9b4b Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 22:34:39 +0900 Subject: [PATCH 26/72] =?UTF-8?q?feat=20README.md=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 122 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index ec33c8f..28c50a6 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,98 @@ -# 서론 +# 🥳 배포 링크 -배포 링크 : https://react-messenger-19th-taupe.vercel.app/ +https://react-messenger-19th-taupe.vercel.app/ -안녕하세요 🙌🏻 19기 프론트 운영진 배성준입니다. 이번 미션에서는 드디어 투두리스트에서 벗어나 새로운 프로젝트인 **messenger** 만들기를 진행합니다. +# ⚙️ 구현 기능 -이번주는 특별히 **디자이너와의 협업**으로 진행되는 미션입니다. 디자이너분께서 열심히 리디자인 한 메신저 프로젝트를 여러분들께서 구현해주시면 됩니다. +image -동시에, 이번주부터는 새로 **TypeScript**를 적용해보려고 합니다. +![화면 기록 2024-03-29 오후 9 20 44 (1)](https://github.com/CEOS-Developers/react-messenger-19th/assets/101055312/f5128e75-1798-4afd-b183-713668a26bb6) -프로젝트의 규모가 커지게 될 수록, 컴포넌트가 가지는 props의 종류 또한 다양해지게 됩니다. 무지성 코딩을 하다보면 가끔 이 props의 구성과 이름, 어떤 타입이 들어가야 하는지 헷갈리기 마련이죠. 보통 그럴 때 다시 컴포넌트 정의 부분으로 돌아가 props의 구성을 보고 오곤 합니다. +## React Hooks 사용 -하지만 이럴 때, typescript를 적용한다면 컴포넌트의 구성과 그 이름, 심지어 타입까지 한번에 자동완성으로 편리하게 관리할 수 있고, 생산성이 증대되겠죠. +1. **useState**: ChatBottom 컴포넌트에서 사용자가 입력한 메시지 값을 관리 등 컴포넌트의 상태를 관리하기 위해 사용했습니다. +2. **useEffect**: UI와 관련 없는 부수 효과를 수행하기 위해 사용했습니다. 예시로, ChattingRoom 컴포넌트가 마운트될 때 서버에서 메시지 목록을 불러오거나, 메시지 목록이 업데이트될 때마다 자동으로 스크롤 위치를 조정할 때 사용했습니다. +3. **useRef**: DOM 요소에 직접 접근하기 위해 사용되는 훅입니다. 새 메시지가 추가될 때마다 채팅 목록의 스크롤을 가장 아래로 이동시키기 위해 messagesEndRef를 사용했습니다. -또한, **React Hooks**에 조금 더 익숙해지는 것을 목표로 합니다. 여러 Hook들이 있지만 그 중에서도 `useState`, `useEffect`, `useRef`를 중점적으로 사용해 보는 미션인데요, React를 사용하면서 굉장히 자주 쓰이는 Hook들이기 때문에 이 부분을 집중적으로 공부해 보아요! +- 작동 방식 : messagesEndRef는 채팅 목록 끝 참조 → useEffect 훅을 통해, 메시지가 추가될 때마다, current가 가리키는 DOM 요소(채팅 목록 끝)로 스크롤을 이동시킴 -그럼 이번 미션도 파이팅입니다!!🎉 +```typescript +const messagesEndRef = useRef(null); -# 미션 +//.. +useEffect(() => { + // 메시지가 추가될 때마다 스크롤을 하단으로 이동 + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); +}, [messages]); +``` -## Key Questions +# ✅ Key Questions -- JavaScript를 사용할때에 비해 TypeScript를 사용할 때의 장점은 무엇인가요? -- 디자이너로부터 전달받은 피그마 링크 혹은, 피그마 캡처본 -- 컴포넌트를 분리한 기준은 무엇인가요? -- 디자인 시스템을 적용하면서 느낀 점은 무엇인가요? -- 디자이너와 소통하며 느낀점은 무엇인가요? +## JavaScript를 사용할때에 비해 TypeScript를 사용할 때의 장점은 무엇인가요? -## 미션 목표 +1. 타입 체크를 통한 오류 예방 -- TypeScript를 사용해봅시다. -- useState로 컴포넌트의 상태를 관리합니다. -- useEffect와 useRef의 사용법을 이해합니다. -- styled-components를 통한 CSS-in-JS 및 CSS Preprocessor의 사용법에 익숙해집니다. +```typescript +interface Message { + id: number; + from: string; + content: string; + date: string; +} -## 기한 +interface ChatBodyProps { + messages: Message[]; + currentUser: string; + userImage: string; +} -2024년 3월 29일 금요일 +const [messages, setMessages] = useState([]); +``` -## 필수 구현 기능 +ChatBodyProps 인터페이스는 ChatBody 컴포넌트가 받아야 할 props의 구조와 타입을 명시적으로 정의해주기 때문에, +컴포넌트에 잘못된 타입의 props를 전달하거나 전달하지 않았을 경우, 컴파일 단계에서 바로 오류를 발견할 수 있습니다. -- 피그마를 보고 [결과화면](https://3th-fb-messenger.netlify.app)과 같이 구현합니다. -- 디자인 시스템을 구축합니다. -- 채팅방 상단의 프로필을 클릭하면 사용자를 변경할 수 있습니다. -- 메세지를 보내면 채팅방 하단으로 스크롤을 이동시킵니다. -- 메세지에 유저 정보(프로필 사진, 이름)를 표시합니다. -- user와 message 데이터를 json 파일에 저장합니다. -- UI는 **반응형을 제외**하고 피그마파일을 따라서 진행합니다. +또한 메시지를 추가하는 함수 내에서 newMessage 객체를 생성할 때, Message 인터페이스에서 요구하는 속성을 빼먹거나 잘못된 타입을 사용하면 TypeScript 컴파일러가 즉시 오류를 표시하기 떄문에, 런타임 오류를 방지하고, 실수 가능성을 줄입니다. -### 추가 구현 기능 +2. 코드 자동 완성 및 리팩토링 용이 + 컴포넌트에 어떤 props를 전달해야 하는지 쉽게 알 수 있고, 이는 개발 효율성을 높입니다. + 또한 특정 인터페이스의 구조를 변경해야 한다면, TypeScript를 사용하면 해당 인터페이스를 사용하는 모든 곳을 찾아 수정해야 함을 알 수 있기 때문에, 더욱 안전하고 빠른 리팩토링이 가능합니다. -- 더블 클릭 하면 감정표현을 추가합니다. -- 그 외 추가하고 싶은 기능이 있다면 마음껏 추가해 주세요! +3. 코드 의도와 구조 명확화 + 인터페이스를 통해 코드의 의도와 구조를 다른 개발자에게 명확히 전달할 수 있어 코드의 가독성이 향상됩니다. -참고로 이번 과제는 다음주까지 이어지는 과제이므로 **확장성**을 충분히 고려해 주세요. 참고로 **4주차 과제에서는 유저 및 기능 추가와 Routing을** 진행합니다. 이를 위해 [recoil](https://recoiljs.org/ko/)이나 [redux](https://ko.redux.js.org/introduction/getting-started/)를 이용한 상태관리를 미리 해보시는 것을 추천합니다!! 모두 공식문서 많이 읽어보시고 자신만의 상태관리 조합도 찾아보면 재밌을 거에요 XD +## 디자이너로부터 전달받은 피그마 링크 혹은, 피그마 캡처본 -## 링크 및 참고자료 +스크린샷 2024-03-29 오후 7 16 01 -- [React docs - Hook](https://ko.reactjs.org/docs/hooks-intro.html) -- [React의 Hooks 완벽 정복하기](https://velog.io/@velopert/react-hooks#1-usestate) -- [useEffect 완벽 가이드](https://overreacted.io/ko/a-complete-guide-to-useeffect/) -- [코딩 컨벤션](https://ui.toast.com/fe-guide/ko_CODING-CONVENTION) -- [타입스크립트 핸드북](https://joshua1988.github.io/ts/intro.html) -- [리액트 프로젝트에서 타입스크립트 사용하기 (시리즈)](https://velog.io/@velopert/series/react-with-typescript) -- [디자인 시스템 구축기](https://yozm.wishket.com/magazine/detail/1830/) -- [[영상] : 컴포넌트에 대한 이해](https://www.youtube.com/watch?v=21eiJc90ggo) -- [Styled Component로 디자인 시스템 구축하기](https://zaat.dev/blog/building-a-design-system-in-react-with-styled-components/) -- [ts 절대경로 설정하기](https://tesseractjh.tistory.com/232) +## 컴포넌트를 분리한 기준은 무엇인가요? + +1. 각 컴포넌트를 UI 영역별 & 기능별로 분리했습니다. + 단일 책임 원칙에 따라 한 가지 기능만 수행하도록 설계했습니다. + +- **ChatHead**: 채팅방의 상단에 위치한 사용자 프로필을 표시합니다. 사용자 이름과 이미지를 포함합니다. +- **ChatBody**: 채팅방에서의 대화 내용을 표시합니다. 메시지마다 시간과 날짜, 사용자 프로필 이미지를 표시할 수 있도록 구현했습니다. +- **ChatBottom**: 메시지 입력창과 전송 버튼을 포함합니다. 사용자 입력을 받고, 'Enter' 키나 전송 버튼 클릭 시 메시지를 전송하는 기능을 구현했습니다. + +2. 또한, 버튼, 입력 필드같이, 사용자 이벤트에 따라, 특정 기능을 하고, 자주 사용되는 UI들도 재사용이 용이하게 별도의 컴포넌트로 분리했습니다. + +## 디자인 시스템을 적용하면서 느낀 점은 무엇인가요? + +디자인 시스템을 적용함으로써 UI의 일관성을 유지할 수 있었던 것 같습니다. +또한, 개발 과정에서도 확실히 편리함을 느꼈습니다. +우선, 디자인 시스템을 통해 개발자와 디자이너 간의 커뮤니케이션이 명확해졌고, 일관된 디자인 언어를 공유할 수 있었습니다. +또한, UX/UI적인 고민을 덜어 개발에만 집중할 수 있어 좋았던 것 같습니다. +디자인 시스템을 활용하면서 서비스를 만들 때는 정말 여러 UI 요소들이 있다는 것을 느꼈습니다. 이러한 UI 요소들은 모두 교체 가능성이 있으므로, 서비스의 규모가 커질수록, 나중에 UI 요소들을 교체하기 편하게 컴포넌트를 분리하고 가독성 있는 코드를 짜는 것이 중요하다는 깨달음을 얻었습니다. + +## 디자이너와 소통하며 느낀점은 무엇인가요? + +피그마에 만들어주신 UI를 가지고 개발하면서, 혼자 개발하고, UI까지 만들 때와는 퀄리티가 다른 결과물이 나온 것 같다는 생각이 듭니다. +특히, 메시지를 입력할 때는 아이콘이 보내기 버튼이고, 입력하지 않을 때는 마이크 아이콘인 것은, 너무 당연한 UX이나, 일상 속에서는 신경쓰지 않고 지나쳤었는데, 피그마에서 UI 하나하나를 가져다 개발하면서, 정말 이는 사용자 친화적인 것 같다는 생각이 들었습니다. + +# 💡 느낀 점 + +처음에는 json에 데이터를 저장한다는게, 새로 입력된 대화 내역도 업데이트해야 한다고 생각해, 어떻게 구현할지 감이 잡히지 않아, +우선은 로컬 스토리지와 useEffect를 사용하여 대화 내역을 저장하고 관리하는 것을 구현했습니다. +json에 더미 데이터를 저장해야하는 것을 이어서 계속 고민해보다가 백엔드도 구현해야 하는건가?...라는 생각을 하며 json-server를 통해 json 데이터를 업데이트하는 법을 계속해서 시도했었습니다. +그런데, 초기 데이터만 json 파일에 저장하고, 이를 불러오는 것이란 걸 알고, 안심하며 초기 메시지 로드 하는 부분을 로컬 스토리지에서, -> json 파일에서 json 객체를 가져오는 것으로 수정했습니다. +이를 통해, json에 새로 입력된 대화 내역도 업데이트해야 하는 것도 구현해보고 싶다는 생각이 너무 커져서, 중간고사 이후에 이 부분을 구현하는게 기대가 됩니다. From 0f5786665a67c3b25e71f32973918d456c0ceafc Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 29 Mar 2024 22:37:08 +0900 Subject: [PATCH 27/72] =?UTF-8?q?feat=20README.md=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- image.png | Bin 0 -> 294367 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 image.png diff --git a/README.md b/README.md index 28c50a6..0843903 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ https://react-messenger-19th-taupe.vercel.app/ # ⚙️ 구현 기능 -image +image ![화면 기록 2024-03-29 오후 9 20 44 (1)](https://github.com/CEOS-Developers/react-messenger-19th/assets/101055312/f5128e75-1798-4afd-b183-713668a26bb6) diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..b085d62995edb03aa669bbd3dc854e722d5448d1 GIT binary patch literal 294367 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

d5PgIBv5*P^v?rX!jAuhmrQhheNu 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

U5!h{&MB)Wv1L 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 Date: Fri, 3 May 2024 22:12:16 +0900 Subject: [PATCH 28/72] =?UTF-8?q?feat=20:=20=ED=99=95=EC=9E=A5=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EA=B5=AC=EC=A1=B0=20=EC=84=A4=EC=A0=95,?= =?UTF-8?q?=20=EB=9D=BC=EC=9A=B0=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 20 +++++++++++++++----- src/components/Navbar.tsx | 0 src/pages/ Profile.tsx | 0 src/pages/ChattingList.tsx | 0 src/pages/ChattingRoom.tsx | 0 src/pages/userList.tsx | 0 src/state/chatListState.ts | 19 +++++++++++++++++++ src/state/messageState.ts | 16 ++++++++++++++++ src/state/userProfileState.ts | 15 +++++++++++++++ src/state/userState.ts | 23 +++++++++++++++++++++++ 10 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 src/components/Navbar.tsx create mode 100644 src/pages/ Profile.tsx create mode 100644 src/pages/ChattingList.tsx create mode 100644 src/pages/ChattingRoom.tsx create mode 100644 src/pages/userList.tsx create mode 100644 src/state/chatListState.ts create mode 100644 src/state/messageState.ts create mode 100644 src/state/userProfileState.ts create mode 100644 src/state/userState.ts diff --git a/src/App.tsx b/src/App.tsx index bd79c18..7c6b54b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,9 +1,19 @@ -function App() { +// src/App.tsx + +import React from 'react'; +import { Route, Routes } from 'react-router-dom'; + +const App = () => { return ( -
-

19기 프론트엔드 파이팅!!! 디자인과 사이좋게 지내요~~~

-
+ <> + + + + + + + ); -} +}; export default App; diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/ Profile.tsx b/src/pages/ Profile.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/ChattingList.tsx b/src/pages/ChattingList.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/userList.tsx b/src/pages/userList.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/state/chatListState.ts b/src/state/chatListState.ts new file mode 100644 index 0000000..8871bc3 --- /dev/null +++ b/src/state/chatListState.ts @@ -0,0 +1,19 @@ +// src/state/chatListState.ts + +import { atom } from 'recoil'; + +interface ChatRoom { + id: string; + partner: string; + unreadCount: number; +} + +export const chatListState = atom({ + key: 'chatListState', + default: [ + { id: 'room1', partner: '김모씨', unreadCount: 3 }, + { id: 'room2', partner: '박모씨', unreadCount: 1 }, + { id: 'room3', partner: '최모씨', unreadCount: 1 }, + // 추가 대화방 정보 + ], +}); \ No newline at end of file diff --git a/src/state/messageState.ts b/src/state/messageState.ts new file mode 100644 index 0000000..9116ff5 --- /dev/null +++ b/src/state/messageState.ts @@ -0,0 +1,16 @@ +// src/state/messageState.ts + +import { atom } from 'recoil'; + +interface Message { + id: number; + from: string; + to: string; + content: string; + date: string; +} + +export const messagesByRoomId = (userId: string) => atom({ + key: `messages_${userId}`, + default: [], +}); diff --git a/src/state/userProfileState.ts b/src/state/userProfileState.ts new file mode 100644 index 0000000..2111b5d --- /dev/null +++ b/src/state/userProfileState.ts @@ -0,0 +1,15 @@ +// src/state/userProfileState.ts + +import { atom } from 'recoil'; + +export const userProfileState = atom({ + key: 'userProfileState', + default: { + name: '김모씨', + phone: '82) 10-1234-5678', + image: '', + github: 'https://github.com/jinnyleeis', + instagram: 'https://www.instagram.com/', + } + } +); diff --git a/src/state/userState.ts b/src/state/userState.ts new file mode 100644 index 0000000..e6c8bed --- /dev/null +++ b/src/state/userState.ts @@ -0,0 +1,23 @@ +// src/state/userState.ts + +import { atom } from 'recoil'; + +interface User { + id: string; + name: string; + image: string; +} + +export const currentUserState = atom({ + key: 'currentUser', + default: 'User1', +}); + +export const userListState = atom({ + key: 'userListState', + default: [ + { id: '1', name: '김모씨', image: '' }, + { id: '2', name: '박모씨', image: '' }, + { id: '3', name: '최모씨', image: '' } + ], +}); From 140e98f050a99f446aabd0b713a5ae66cd6e4362 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 22:14:07 +0900 Subject: [PATCH 29/72] =?UTF-8?q?feat=20:=20chattinglist=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingList.tsx | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/pages/ChattingList.tsx b/src/pages/ChattingList.tsx index e69de29..190adee 100644 --- a/src/pages/ChattingList.tsx +++ b/src/pages/ChattingList.tsx @@ -0,0 +1,49 @@ +// src/pages/ChattingList.tsx + +import React from 'react'; +import { Link } from 'react-router-dom'; +import { useRecoilValue } from 'recoil'; +import { chatListState } from '../state/chatListState'; // 대화 목록 상태 +import styled from 'styled-components'; + +const ChatListContainer = styled.div` + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; +`; + +const ChatItem = styled(Link)` + width: 100%; + padding: 10px; + margin: 5px 0; + background-color: #f0f0f0; + color: black; + text-decoration: none; + border-radius: 5px; + white-space: pre-line; + + &:hover { + background-color: #e0e0e0; + } +`; + + +const ChattingList = () => { + const chatList = useRecoilValue(chatListState); // Recoil 상태에서 대화 목록을 가져옴 + + return ( + + {chatList.map((chat) => ( + + {`${chat.partner}`} + {'\n'} + ({chat.unreadCount} unread messages) + + + ))} + + ); +}; + +export default ChattingList; From bcda057137814a3c4916cb042ee5e732dc1c325a Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 22:15:36 +0900 Subject: [PATCH 30/72] =?UTF-8?q?feat=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=BC=88=EB=8C=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ Profile.tsx | 104 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/src/pages/ Profile.tsx b/src/pages/ Profile.tsx index e69de29..93ff2d1 100644 --- a/src/pages/ Profile.tsx +++ b/src/pages/ Profile.tsx @@ -0,0 +1,104 @@ +import React from 'react'; +import { useRecoilState } from 'recoil'; +import { userProfileState } from '../state/userProfileState'; +import styled from 'styled-components'; + +interface Profile { + name: string; + phone: string; + image: string; + github: string; + instagram: string; +} + +const ProfileContainer = styled.div` + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; +`; + +const ProfileImage = styled.img` + width: 100px; + height: 100px; + border-radius: 50%; + margin-bottom: 20px; +`; + +const ProfileField = styled.div` + margin: 10px 0; +`; + +const Input = styled.input` + padding: 10px; + margin-top: 5px; + width: 200px; + border-radius: 5px; + border: 1px solid #ccc; +`; + +const Button = styled.button` + padding: 10px 20px; + margin-top: 20px; + background-color: #4caf50; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; +`; + +// 바로가기 링크를 감싸는 스타일된 컴포넌트 +const ShortcutLink = styled.a` + display: flex; + align-items: center; + text-decoration: none; + color: #333; + margin-top: 10px; +`; + +// 로고 이미지 스타일링 +const InstagramLogo = styled.img` + width: 30px; + height: 30px; + margin-right: 10px; +`; + +const GitHubLogo = styled.img` + width: 30px; + height: 30px; + margin-right: 10px; +`; + +const Profile = () => { + const [profile, setProfile] = useRecoilState(userProfileState); + + const handleChange = (event: React.ChangeEvent) => { + const { name, value } = event.target; + setProfile((prev) => ({ ...prev, [name]: value })); + }; + + return ( + + + +
{profile.name}
+
+ +
{profile.phone}
+
+ + + 인스타그램 + + + + 깃허브 + +
+ ); +}; + +export default Profile; From b483af91a9121301e4a54446e7ff29d670c22cc3 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 22:16:11 +0900 Subject: [PATCH 31/72] =?UTF-8?q?feat=20:=20=EC=9C=A0=EC=A0=80=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=BC=88?= =?UTF-8?q?=EB=8C=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/userList.tsx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/pages/userList.tsx b/src/pages/userList.tsx index e69de29..982808f 100644 --- a/src/pages/userList.tsx +++ b/src/pages/userList.tsx @@ -0,0 +1,24 @@ +// src/pages/UserList.tsx + +import React from 'react'; +import { useRecoilValue } from 'recoil'; +import { userListState } from '../state/userState'; + +interface User { + id: string; + name: string; +} + +const UserList = () => { + const users = useRecoilValue(userListState); + + return ( +
    + {users.map((user) => ( +
  • {user.name}
  • + ))} +
+ ); +}; + +export default UserList; From ab168ec404aed62c4c6a1e03c2cd3525c71ba1b1 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 22:16:47 +0900 Subject: [PATCH 32/72] =?UTF-8?q?feat=20:=20=EC=B1=84=ED=8C=85=20=EB=A3=B8?= =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=BC=EB=B6=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom.tsx | 73 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index e69de29..bd94130 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -0,0 +1,73 @@ +// src/pages/ChattingRoom.tsx + +import React, { useEffect } from 'react'; +import { useParams } from 'react-router-dom'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { messagesByRoomId } from '../state/messageState'; +import { userListState } from '../state/userState'; +import ChatHead from '../components/ChatHead'; +import ChatBody from '../components/ChatBody'; +import ChatBottom from '../components/ChatBottom'; + +interface Message { + id: number; + from: string; + to: string; + content: string; + date: string; +} + +const ChattingRoom = () => { + const { userId } = useParams<{ userId: string }>(); + const userList = useRecoilValue(userListState); + const currentUser = userList.find((user) => user.id === userId); + const [messages, setMessages] = useRecoilState( + messagesByRoomId(userId ?? '') + ); + + useEffect(() => { + const storedMessages = localStorage.getItem(`messages_${userId}`); + if (storedMessages) { + setMessages(JSON.parse(storedMessages)); + } + }, [userId, setMessages]); + + const sendMessage = (content: string, from: string, to: string) => { + const newMessage = { + id: Date.now(), + from, + to, + content, + date: new Date().toISOString(), + }; + + // 메시지 로컬 스토리지에서 가져오기 이전에 Undefined 여부 확인 + const updatedMessages = messages ? [...messages, newMessage] : [newMessage]; + setMessages(updatedMessages); + + // 메시지 로컬 스토리지에서 가져오기 이전에 Undefined 여부 확인 -updating localStorage + const storedMessages = messages ? [...messages, newMessage] : [newMessage]; + localStorage.setItem(`messages_${userId}`, JSON.stringify(storedMessages)); + }; + + return ( +
+ {}} + /> + + + sendMessage(content, currentUser?.name ?? '', userId ?? '') + } + /> +
+ ); +}; + +export default ChattingRoom; From 30438678076384ef8dd66254077e9bafad61e77b Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 22:28:33 +0900 Subject: [PATCH 33/72] =?UTF-8?q?feat=20:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 14 +++++++--- src/components/Navbar.tsx | 34 +++++++++++++++++++++++++ src/index.tsx | 23 ++++++++++------- src/pages/{ Profile.tsx => Profile.tsx} | 2 +- 4 files changed, 59 insertions(+), 14 deletions(-) rename src/pages/{ Profile.tsx => Profile.tsx} (97%) diff --git a/src/App.tsx b/src/App.tsx index 7c6b54b..4405df0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,16 +2,22 @@ import React from 'react'; import { Route, Routes } from 'react-router-dom'; +import ChattingRoom from './pages/ChattingRoom'; +import UserList from './pages/UserList'; +import ChattingList from './pages/ChattingList'; +import Profile from './pages/Profile'; +import Navbar from './components/Navbar'; const App = () => { return ( <> - - - - + } /> + } /> + } /> + } /> + ); }; diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index e69de29..73a1885 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -0,0 +1,34 @@ +// src/components/Navbar.tsx + +import React from 'react'; +import { Link } from 'react-router-dom'; +import styled from 'styled-components'; + +const NavbarContainer = styled.div` + position: fixed; + bottom: 0; + width: 375px; + height: 80px; + flex-shrink: 0; + + background-image: url('/item/chatBottom.png'); + background-size: cover; +`; + +const NavbarLink = styled(Link)` + text-decoration: none; + color: black; + font-weight: bold; +`; + +const Navbar = () => { + return ( + + 친구 목록 + 대화 목록 + 내 프로필 + + ); +}; + +export default Navbar; diff --git a/src/index.tsx b/src/index.tsx index 6d60180..1b3a55b 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,13 +1,18 @@ +// src/index.tsx import React from 'react'; -import ReactDOM from 'react-dom/client'; +import ReactDOM from 'react-dom'; +import App from './App'; +import { BrowserRouter as Router } from 'react-router-dom'; +import { RecoilRoot } from 'recoil'; import './index.css'; -import ChattingRoom from './ChattingRoom'; -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); -root.render( - - - +ReactDOM.render( + + + + + + + , + document.getElementById('root') ); diff --git a/src/pages/ Profile.tsx b/src/pages/Profile.tsx similarity index 97% rename from src/pages/ Profile.tsx rename to src/pages/Profile.tsx index 93ff2d1..4468cd0 100644 --- a/src/pages/ Profile.tsx +++ b/src/pages/Profile.tsx @@ -87,7 +87,7 @@ const Profile = () => {
{profile.name}
-
{profile.phone}
+
{profile.phone}
From 5ce84f6c3cd2ac05980789ab4e8ef5aaa723b396 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 22:31:12 +0900 Subject: [PATCH 34/72] =?UTF-8?q?feat=20:=20=EA=B8=B0=EC=A1=B4=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=20=EB=A3=B8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatHead.tsx | 5 ++++- src/components/Navbar.tsx | 35 +++++++++++++++++------------------ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index de552db..8d929b1 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -11,7 +11,10 @@ interface ChatHeadProps { onUserClick: () => void; } -const ChatHead: React.FC = ({ user, onUserClick }) => { +const ChatHead: React.FC = ({ + user, + onUserClick = () => {}, +}) => { return ( { - return ( - - 친구 목록 - 대화 목록 - 내 프로필 - - ); + return ( + + 친구 목록 + 대화 목록 + 내 프로필 + + ); }; export default Navbar; From 88097a950042e4e99040c601537d82539182a745 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 23:00:12 +0900 Subject: [PATCH 35/72] =?UTF-8?q?feat=20:=20useLocation=20=ED=9B=85?= =?UTF-8?q?=EC=9D=84=20=ED=86=B5=ED=95=9C=20navbar=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EB=B6=80=20=EB=A0=8C=EB=8D=94=EB=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 8 ++++++-- src/components/Navbar.tsx | 20 +++++++++++++------- src/index.tsx | 17 +++++++++-------- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 4405df0..ad48a5f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ // src/App.tsx import React from 'react'; -import { Route, Routes } from 'react-router-dom'; +import { Route, Routes,useLocation } from 'react-router-dom'; import ChattingRoom from './pages/ChattingRoom'; import UserList from './pages/UserList'; import ChattingList from './pages/ChattingList'; @@ -9,6 +9,9 @@ import Profile from './pages/Profile'; import Navbar from './components/Navbar'; const App = () => { + const { pathname } = useLocation(); + const isChattingRoomPage = pathname.startsWith('/chattingroom'); + return ( <> @@ -17,9 +20,10 @@ const App = () => { } /> } /> - + {isChattingRoomPage ? null : } ); }; + export default App; diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 9cb4336..41d2d6a 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -8,24 +8,30 @@ const NavbarContainer = styled.div` display: flex; justify-content: space-around; position: fixed; - bottom: 0; - width: 100%; + font-size:20px; + width: 375px; + bottom:-33px; + height: 80px; background: #f0f0f0; - padding: 10px 0; + padding-top: 30px; + + + `; const NavbarLink = styled(Link)` text-decoration: none; color: black; - font-weight: bold; + + `; const Navbar = () => { return ( - 친구 목록 - 대화 목록 - 내 프로필 + 친구 + 대화 + 프로필 ); }; diff --git a/src/index.tsx b/src/index.tsx index 1b3a55b..6bda164 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -7,12 +7,13 @@ import { RecoilRoot } from 'recoil'; import './index.css'; ReactDOM.render( - - - - - - - , - document.getElementById('root') + + + + + + + , + + document.getElementById('root') ); From 1d3b67a1af2b78651f5e9be3811c2cc4ff504b30 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 23:07:16 +0900 Subject: [PATCH 36/72] =?UTF-8?q?feat=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=EC=97=90=EC=84=9C=20->=20=EB=8C=80=ED=99=94=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EA=B0=80=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatHead.tsx | 39 ++++++++++++++++++++----------------- src/pages/ChattingRoom.tsx | 2 +- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index 8d929b1..f895174 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -1,30 +1,33 @@ import React from 'react'; +import { useHistory } from 'react-router-dom'; import { ChatHeadContainer, UserImage, UserName } from '../style/ChatHeadStyle'; interface User { - name: string; - image: string; + name: string; + image: string; } interface ChatHeadProps { - user: User; - onUserClick: () => void; + user: User; } -const ChatHead: React.FC = ({ - user, - onUserClick = () => {}, -}) => { - return ( - - - {user.name} - - ); +const ChatHead: React.FC = ({ user }) => { + const history = useHistory(); + + const handleUserClick = () => { + history.push('/chattinglist'); + }; + + return ( + + + {user.name} + + ); }; export default ChatHead; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index bd94130..c559f1f 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -54,7 +54,7 @@ const ChattingRoom = () => {
{}} + //onUserClick={() => {}} /> Date: Fri, 3 May 2024 23:21:09 +0900 Subject: [PATCH 37/72] =?UTF-8?q?feat=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=EC=97=90=EC=84=9C=20->=20=EB=8C=80=ED=99=94=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatHead.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index f895174..c54e6e4 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -1,21 +1,17 @@ import React from 'react'; -import { useHistory } from 'react-router-dom'; import { ChatHeadContainer, UserImage, UserName } from '../style/ChatHeadStyle'; +import { useNavigate } from 'react-router-dom'; interface User { name: string; image: string; } -interface ChatHeadProps { - user: User; -} - -const ChatHead: React.FC = ({ user }) => { - const history = useHistory(); +const ChatHead: React.FC<{ user: User }> = ({ user }) => { + const navigate = useNavigate(); const handleUserClick = () => { - history.push('/chattinglist'); + navigate(`/chattinglist`); }; return ( From 7476b1e3e3dd0c5df1ca6fcc6458c2025ee90be0 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 23:41:45 +0900 Subject: [PATCH 38/72] =?UTF-8?q?feat=20:=20=EC=83=81=EB=8B=A8=20navbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 64 +++++++++++++++++++++++ package.json | 2 + src/App.tsx | 4 +- src/{ChattingRoom.tsx => ChattingRoom.js} | 3 +- src/components/NavbarHead.tsx | 37 +++++++++++++ src/pages/ChattingList.tsx | 2 +- src/pages/ChattingRoom.tsx | 2 +- src/state/chatListState.ts | 8 +-- 8 files changed, 113 insertions(+), 9 deletions(-) rename src/{ChattingRoom.tsx => ChattingRoom.js} (97%) create mode 100644 src/components/NavbarHead.tsx diff --git a/package-lock.json b/package-lock.json index d0755a5..4769908 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,9 @@ "nodejs": "^0.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.23.0", "react-scripts": "5.0.1", + "recoil": "^0.7.7", "styled-components": "^6.1.8", "typescript": "^4.9.5", "web-vitals": "^2.1.4" @@ -3358,6 +3360,14 @@ } } }, + "node_modules/@remix-run/router": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", + "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -8912,6 +8922,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hamt_plus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", + "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -14920,6 +14935,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", + "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", + "dependencies": { + "@remix-run/router": "1.16.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", + "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", + "dependencies": { + "@remix-run/router": "1.16.0", + "react-router": "6.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -15024,6 +15069,25 @@ "node": ">=8.10.0" } }, + "node_modules/recoil": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz", + "integrity": "sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==", + "dependencies": { + "hamt_plus": "1.0.2" + }, + "peerDependencies": { + "react": ">=16.13.1" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", diff --git a/package.json b/package.json index 5e6fc8e..1ee9965 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,9 @@ "nodejs": "^0.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.23.0", "react-scripts": "5.0.1", + "recoil": "^0.7.7", "styled-components": "^6.1.8", "typescript": "^4.9.5", "web-vitals": "^2.1.4" diff --git a/src/App.tsx b/src/App.tsx index ad48a5f..ed1d2a0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,13 @@ // src/App.tsx import React from 'react'; -import { Route, Routes,useLocation } from 'react-router-dom'; +import { Route, Routes, useLocation } from 'react-router-dom'; import ChattingRoom from './pages/ChattingRoom'; import UserList from './pages/UserList'; import ChattingList from './pages/ChattingList'; import Profile from './pages/Profile'; import Navbar from './components/Navbar'; +import NavbarHead from './components/NavbarHead'; const App = () => { const { pathname } = useLocation(); @@ -25,5 +26,4 @@ const App = () => { ); }; - export default App; diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.js similarity index 97% rename from src/ChattingRoom.tsx rename to src/ChattingRoom.js index 37f699e..b0af876 100644 --- a/src/ChattingRoom.tsx +++ b/src/ChattingRoom.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useRef } from 'react'; +/*import React, { useState, useEffect, useRef } from 'react'; import ChatHead from './components/ChatHead'; import ChatBody from './components/ChatBody'; import ChatBottom from './components/ChatBottom'; @@ -84,3 +84,4 @@ function ChattingRoom() { } export default ChattingRoom; +*/ diff --git a/src/components/NavbarHead.tsx b/src/components/NavbarHead.tsx new file mode 100644 index 0000000..67d1cae --- /dev/null +++ b/src/components/NavbarHead.tsx @@ -0,0 +1,37 @@ +// src/components/NavbarHead.tsx + +import React from 'react'; +import { Link } from 'react-router-dom'; +import styled from 'styled-components'; + +const NavbarHeadContainer = styled.div` + display: flex; + justify-content: space-around; + position: fixed; + font-size:20px; + width: 375px; + top:-30px; + height: 56px; + background: #f0f0f0; + padding-top: 30px; + + + +`; + +const NavbarHeadLink = styled(Link)` + text-decoration: none; + color: black; + + +`; + +const NavbarHead = () => { + return ( + + 대화 + + ); +}; + +export default NavbarHead; diff --git a/src/pages/ChattingList.tsx b/src/pages/ChattingList.tsx index 190adee..c2166f4 100644 --- a/src/pages/ChattingList.tsx +++ b/src/pages/ChattingList.tsx @@ -38,7 +38,7 @@ const ChattingList = () => { {`${chat.partner}`} {'\n'} - ({chat.unreadCount} unread messages) + ({chat.recentMsg} 최근 메시지) ))} diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index c559f1f..36ed54e 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -54,7 +54,7 @@ const ChattingRoom = () => {
{}} + // onUserClick={() => {}} /> ({ key: 'chatListState', default: [ - { id: 'room1', partner: '김모씨', unreadCount: 3 }, - { id: 'room2', partner: '박모씨', unreadCount: 1 }, - { id: 'room3', partner: '최모씨', unreadCount: 1 }, + { id: 'room1', partner: '김모씨', recentMsg: 3 }, + { id: 'room2', partner: '박모씨', recentMsg: 1 }, + { id: 'room3', partner: '최모씨', recentMsg: 1 }, // 추가 대화방 정보 ], }); \ No newline at end of file From 2f5e5040193cfd0d9ea2796587c16fc941bf90c7 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Fri, 3 May 2024 23:43:44 +0900 Subject: [PATCH 39/72] . --- src/components/NavbarHead.tsx | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/src/components/NavbarHead.tsx b/src/components/NavbarHead.tsx index 67d1cae..eec589c 100644 --- a/src/components/NavbarHead.tsx +++ b/src/components/NavbarHead.tsx @@ -5,33 +5,24 @@ import { Link } from 'react-router-dom'; import styled from 'styled-components'; const NavbarHeadContainer = styled.div` - display: flex; - justify-content: space-around; - position: fixed; - font-size:20px; - width: 375px; - top:-30px; - height: 56px; - background: #f0f0f0; - padding-top: 30px; - - - + display: flex; + justify-content: space-around; + position: fixed; + font-size: 20px; + width: 375px; + top: -30px; + height: 56px; + background: #f0f0f0; + padding-top: 30px; `; const NavbarHeadLink = styled(Link)` - text-decoration: none; - color: black; - - + text-decoration: none; + color: black; `; const NavbarHead = () => { - return ( - - 대화 - - ); + return 대화; }; export default NavbarHead; From 51417c9398e2488149546b5a15f61e67e4ace3ea Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sat, 4 May 2024 14:52:42 +0900 Subject: [PATCH 40/72] =?UTF-8?q?feat=20:=20=EB=8C=80=ED=99=94,=20?= =?UTF-8?q?=EC=B9=9C=EA=B5=AC=EB=AA=A9=EB=A1=9D=20=EB=91=98=20=EB=8B=A4=20?= =?UTF-8?q?=EB=8F=99=EC=9D=BC=ED=95=9C=20userliststate=20atom=EC=9D=84=20?= =?UTF-8?q?=EC=B0=B8=EC=A1=B0=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingList.tsx | 34 ++++++------ src/pages/ChattingRoom.tsx | 109 +++++++++++++++++-------------------- src/state/userState.ts | 35 +++++++----- 3 files changed, 85 insertions(+), 93 deletions(-) diff --git a/src/pages/ChattingList.tsx b/src/pages/ChattingList.tsx index c2166f4..8e9a465 100644 --- a/src/pages/ChattingList.tsx +++ b/src/pages/ChattingList.tsx @@ -3,7 +3,8 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; -import { chatListState } from '../state/chatListState'; // 대화 목록 상태 +import { userListState } from '../state/userState'; +//import { chatListState } from '../state/chatListState'; // 대화 목록 상태 import styled from 'styled-components'; const ChatListContainer = styled.div` @@ -30,20 +31,17 @@ const ChatItem = styled(Link)` const ChattingList = () => { - const chatList = useRecoilValue(chatListState); // Recoil 상태에서 대화 목록을 가져옴 - - return ( - - {chatList.map((chat) => ( - - {`${chat.partner}`} - {'\n'} - ({chat.recentMsg} 최근 메시지) - - - ))} - - ); -}; - -export default ChattingList; + const userList = useRecoilValue(userListState); + + return ( +
+ {userList.map((user) => ( +
+ {user.name} +
+ ))} +
+ ); + }; + + export default ChattingList; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index 36ed54e..daac9c3 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -1,73 +1,62 @@ -// src/pages/ChattingRoom.tsx - -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; -import { useRecoilState, useRecoilValue } from 'recoil'; -import { messagesByRoomId } from '../state/messageState'; +import { useRecoilValue } from 'recoil'; import { userListState } from '../state/userState'; import ChatHead from '../components/ChatHead'; import ChatBody from '../components/ChatBody'; import ChatBottom from '../components/ChatBottom'; interface Message { - id: number; - from: string; - to: string; - content: string; - date: string; + id: number; + from: string; + to: string; + content: string; + date: string; } const ChattingRoom = () => { - const { userId } = useParams<{ userId: string }>(); - const userList = useRecoilValue(userListState); - const currentUser = userList.find((user) => user.id === userId); - const [messages, setMessages] = useRecoilState( - messagesByRoomId(userId ?? '') - ); - - useEffect(() => { - const storedMessages = localStorage.getItem(`messages_${userId}`); - if (storedMessages) { - setMessages(JSON.parse(storedMessages)); - } - }, [userId, setMessages]); - - const sendMessage = (content: string, from: string, to: string) => { - const newMessage = { - id: Date.now(), - from, - to, - content, - date: new Date().toISOString(), - }; - - // 메시지 로컬 스토리지에서 가져오기 이전에 Undefined 여부 확인 - const updatedMessages = messages ? [...messages, newMessage] : [newMessage]; - setMessages(updatedMessages); - - // 메시지 로컬 스토리지에서 가져오기 이전에 Undefined 여부 확인 -updating localStorage - const storedMessages = messages ? [...messages, newMessage] : [newMessage]; - localStorage.setItem(`messages_${userId}`, JSON.stringify(storedMessages)); - }; - - return ( -
- {}} - /> - - - sendMessage(content, currentUser?.name ?? '', userId ?? '') - } - /> -
- ); + const { userId } = useParams<{ userId: string }>(); + const userList = useRecoilValue(userListState); + const currentUser = userList.find((user) => user.id === userId); + const [messages, setMessages] = useState([]); + + useEffect(() => { + const storedMessages = localStorage.getItem(`messages_${userId}`); + if (storedMessages) { + setMessages(JSON.parse(storedMessages)); + } + }, [userId]); + + const sendMessage = (content: string, from: string, to: string) => { + const newMessage = { + id: Date.now(), + from, + to, + content, + date: new Date().toISOString(), + }; + + const updatedMessages = [...messages, newMessage]; + setMessages(updatedMessages); + + localStorage.setItem(`messages_${userId}`, JSON.stringify(updatedMessages)); + }; + + return ( +
+ + + + sendMessage(content, currentUser?.name ?? '', userId ?? '') + } + /> +
+ ); }; export default ChattingRoom; diff --git a/src/state/userState.ts b/src/state/userState.ts index e6c8bed..16240d6 100644 --- a/src/state/userState.ts +++ b/src/state/userState.ts @@ -2,22 +2,27 @@ import { atom } from 'recoil'; -interface User { - id: string; - name: string; - image: string; +export interface Message { + id: number; + from: string; + to: string; + content: string; + date: string; } -export const currentUserState = atom({ - key: 'currentUser', - default: 'User1', -}); +interface User { + id: string; + name: string; + image: string; + chatHistory?: Message[]; // 대화 내역 수정 +} -export const userListState = atom({ - key: 'userListState', - default: [ - { id: '1', name: '김모씨', image: '' }, - { id: '2', name: '박모씨', image: '' }, - { id: '3', name: '최모씨', image: '' } - ], +export const userListState = atom({ + key: 'userListState', + default: [ + { id: '1', name: '김모씨', image: '', chatHistory: [] }, + { id: '2', name: '박모씨', image: '', chatHistory: [] }, + { id: '3', name: '최모씨', image: '', chatHistory: [] }, + { id: '4', name: '최모씨', image: '', chatHistory: [] }, + ], }); From 6847c1a1a45d4b597b29e060cf6a46fb7f33ea9b Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sat, 4 May 2024 16:19:08 +0900 Subject: [PATCH 41/72] =?UTF-8?q?feat=20:=20=EB=A1=9C=EC=BB=AC=20=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EC=A7=80=EC=97=90=20=EB=8C=80=ED=99=94?= =?UTF-8?q?=EC=83=81=EB=8C=80=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=A0=80=EC=9E=A5,=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom.tsx | 21 +++++++++++++++------ src/state/messageState.ts | 16 ++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index daac9c3..8cab177 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; import { userListState } from '../state/userState'; +import { messagesState } from '../state/messageState'; import ChatHead from '../components/ChatHead'; import ChatBody from '../components/ChatBody'; import ChatBottom from '../components/ChatBottom'; @@ -16,31 +17,39 @@ interface Message { const ChattingRoom = () => { const { userId } = useParams<{ userId: string }>(); - const userList = useRecoilValue(userListState); - const currentUser = userList.find((user) => user.id === userId); + const messagesStateValue = useRecoilValue(messagesState); const [messages, setMessages] = useState([]); useEffect(() => { + // 로컬 스토리지에서 이전 메시지 가져오기 const storedMessages = localStorage.getItem(`messages_${userId}`); if (storedMessages) { + // 이전 메시지가 있으면 파싱하여 상태에 설정 setMessages(JSON.parse(storedMessages)); } - }, [userId]); + }, [userId]); // userId가 변경될 때마다 이펙트 재실행 + + + const userList = useRecoilValue(userListState); + const currentUser = userList.find(user => user.id === userId); const sendMessage = (content: string, from: string, to: string) => { - const newMessage = { + const newMessage: Message = { id: Date.now(), from, to, content, date: new Date().toISOString(), }; - + + // 이전 메시지 배열과 새로운 메시지를 합침 const updatedMessages = [...messages, newMessage]; setMessages(updatedMessages); - + + // localStorage에 업데이트된 메시지 저장 localStorage.setItem(`messages_${userId}`, JSON.stringify(updatedMessages)); }; + return (
diff --git a/src/state/messageState.ts b/src/state/messageState.ts index 9116ff5..1a79adc 100644 --- a/src/state/messageState.ts +++ b/src/state/messageState.ts @@ -3,14 +3,14 @@ import { atom } from 'recoil'; interface Message { - id: number; - from: string; - to: string; - content: string; - date: string; + id: number; + from: string; + to: string; + content: string; + date: string; } -export const messagesByRoomId = (userId: string) => atom({ - key: `messages_${userId}`, - default: [], +export const messagesState = atom<{ [key: string]: Message[] } | undefined>({ + key: 'messagesState', + default: undefined, }); From 1895dee4a13f08945b91b9eaf09a7647b4fdbac1 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sat, 4 May 2024 16:39:49 +0900 Subject: [PATCH 42/72] =?UTF-8?q?feat=20:=20=EC=83=81=EB=8B=A8=EB=B0=94=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=B3=84=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EB=B6=80=20=EB=94=94=EC=9E=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 1 + src/components/NavbarHead.tsx | 44 ++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index ed1d2a0..c1f86bf 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,6 +15,7 @@ const App = () => { return ( <> + } /> } /> diff --git a/src/components/NavbarHead.tsx b/src/components/NavbarHead.tsx index eec589c..c2ddc5b 100644 --- a/src/components/NavbarHead.tsx +++ b/src/components/NavbarHead.tsx @@ -1,28 +1,34 @@ // src/components/NavbarHead.tsx import React from 'react'; -import { Link } from 'react-router-dom'; -import styled from 'styled-components'; +import { Link, useLocation } from 'react-router-dom'; -const NavbarHeadContainer = styled.div` - display: flex; - justify-content: space-around; - position: fixed; - font-size: 20px; - width: 375px; - top: -30px; - height: 56px; - background: #f0f0f0; - padding-top: 30px; -`; +const NavbarHead = () => { + const { pathname } = useLocation(); + let navText; -const NavbarHeadLink = styled(Link)` - text-decoration: none; - color: black; -`; + switch (pathname) { + case '/chattingroom': + navText = 'Chatting Room'; + break; + case '/userlist': + navText = 'User List'; + break; + case '/chattinglist': + navText = 'Chatting List'; + break; + case '/profile': + navText = 'Profile'; + break; + default: + navText = ''; + } -const NavbarHead = () => { - return 대화; + return ( +
+ {navText} +
+ ); }; export default NavbarHead; From 11bb23565d39b276ae570c6f2c5e92fc272f5f72 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sat, 4 May 2024 17:06:12 +0900 Subject: [PATCH 43/72] =?UTF-8?q?=EC=83=81=EB=8B=A8=EB=B0=94=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=EB=B6=80=20=EB=94=94=EC=9E=90=EC=9D=B8=20styled-compo?= =?UTF-8?q?nent=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/NavbarHead.tsx | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/components/NavbarHead.tsx b/src/components/NavbarHead.tsx index c2ddc5b..19944c0 100644 --- a/src/components/NavbarHead.tsx +++ b/src/components/NavbarHead.tsx @@ -1,7 +1,20 @@ // src/components/NavbarHead.tsx import React from 'react'; -import { Link, useLocation } from 'react-router-dom'; +import { useLocation } from 'react-router-dom'; +import styled from 'styled-components'; + +const NavbarHeadContainer = styled.div` + display: flex; + justify-content: space-around; + position: fixed; + font-size: 20px; + width: 375px; + top: -33px; + height: 80px; + background: #f0f0f0; + padding-top: 30px; +`; const NavbarHead = () => { const { pathname } = useLocation(); @@ -24,11 +37,7 @@ const NavbarHead = () => { navText = ''; } - return ( -
- {navText} -
- ); + return {navText}; }; export default NavbarHead; From 97e8a6ac9b6a42f4e28e32071a8718bc39cf3019 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sat, 4 May 2024 17:22:08 +0900 Subject: [PATCH 44/72] =?UTF-8?q?style.=20:=20navbar,=20page=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index c1f86bf..83d0e63 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,3 @@ -// src/App.tsx - import React from 'react'; import { Route, Routes, useLocation } from 'react-router-dom'; import ChattingRoom from './pages/ChattingRoom'; @@ -10,21 +8,23 @@ import Navbar from './components/Navbar'; import NavbarHead from './components/NavbarHead'; const App = () => { - const { pathname } = useLocation(); - const isChattingRoomPage = pathname.startsWith('/chattingroom'); + const { pathname } = useLocation(); + const isChattingRoomPage = pathname.startsWith('/chattingroom'); - return ( - <> - - - } /> - } /> - } /> - } /> - - {isChattingRoomPage ? null : } - - ); + return ( + <> + +
+ + } /> + } /> + } /> + } /> + +
+ {!isChattingRoomPage && } + + ); }; export default App; From 3b8a210b9c00ffd829dd4b491748d4cff55acfde Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sat, 4 May 2024 17:36:42 +0900 Subject: [PATCH 45/72] =?UTF-8?q?feat:=20chathead=EB=8A=94=20app=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EA=B4=80=EB=A6=AC=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 36 +++++++------- src/pages/ChattingRoom.tsx | 96 ++++++++++++++++++-------------------- 2 files changed, 65 insertions(+), 67 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 83d0e63..934b074 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,25 +6,29 @@ import ChattingList from './pages/ChattingList'; import Profile from './pages/Profile'; import Navbar from './components/Navbar'; import NavbarHead from './components/NavbarHead'; +import ChatHead from './components/ChatHead'; +import ChatBody from './components/ChatBody'; +import ChatBottom from './components/ChatBottom'; const App = () => { - const { pathname } = useLocation(); - const isChattingRoomPage = pathname.startsWith('/chattingroom'); + const { pathname } = useLocation(); + const isChattingRoomPage = pathname.startsWith('/chattingroom'); - return ( - <> - -
- - } /> - } /> - } /> - } /> - -
- {!isChattingRoomPage && } - - ); + return ( + <> + {isChattingRoomPage ? : } +
+ + } /> + } /> + } /> + } /> + +
+ {!isChattingRoomPage && } + + + ); }; export default App; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index 8cab177..e2490dd 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -8,64 +8,58 @@ import ChatBody from '../components/ChatBody'; import ChatBottom from '../components/ChatBottom'; interface Message { - id: number; - from: string; - to: string; - content: string; - date: string; + id: number; + from: string; + to: string; + content: string; + date: string; } const ChattingRoom = () => { - const { userId } = useParams<{ userId: string }>(); - const messagesStateValue = useRecoilValue(messagesState); - const [messages, setMessages] = useState([]); + const { userId } = useParams<{ userId: string }>(); + const messagesStateValue = useRecoilValue(messagesState); + const [messages, setMessages] = useState([]); - useEffect(() => { - // 로컬 스토리지에서 이전 메시지 가져오기 - const storedMessages = localStorage.getItem(`messages_${userId}`); - if (storedMessages) { - // 이전 메시지가 있으면 파싱하여 상태에 설정 - setMessages(JSON.parse(storedMessages)); - } - }, [userId]); // userId가 변경될 때마다 이펙트 재실행 - + useEffect(() => { + // 로컬 스토리지에서 이전 메시지 가져오기 + const storedMessages = localStorage.getItem(`messages_${userId}`); + if (storedMessages) { + // 이전 메시지가 있으면 파싱하여 상태에 설정 + setMessages(JSON.parse(storedMessages)); + } + }, [userId]); // userId가 변경될 때마다 이펙트 재실행 - const userList = useRecoilValue(userListState); - const currentUser = userList.find(user => user.id === userId); + const userList = useRecoilValue(userListState); + const currentUser = userList.find((user) => user.id === userId); - const sendMessage = (content: string, from: string, to: string) => { - const newMessage: Message = { - id: Date.now(), - from, - to, - content, - date: new Date().toISOString(), - }; - - // 이전 메시지 배열과 새로운 메시지를 합침 - const updatedMessages = [...messages, newMessage]; - setMessages(updatedMessages); - - // localStorage에 업데이트된 메시지 저장 - localStorage.setItem(`messages_${userId}`, JSON.stringify(updatedMessages)); - }; - + const sendMessage = (content: string, from: string, to: string) => { + const newMessage: Message = { + id: Date.now(), + from, + to, + content, + date: new Date().toISOString(), + }; - return ( -
- - - - sendMessage(content, currentUser?.name ?? '', userId ?? '') - } - /> -
- ); + // 이전 메시지 배열과 새로운 메시지를 합침 + const updatedMessages = [...messages, newMessage]; + setMessages(updatedMessages); + + // localStorage에 업데이트된 메시지 저장 + localStorage.setItem(`messages_${userId}`, JSON.stringify(updatedMessages)); + }; + + return ( + <> + + + + sendMessage(content, currentUser?.name ?? '', userId ?? '') + } + /> + + ); }; export default ChattingRoom; From bd526d02f8daff3405e0987612e2c8f8852d6c91 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sat, 4 May 2024 19:09:33 +0900 Subject: [PATCH 46/72] =?UTF-8?q?feat=20:=20=ED=95=98=EB=8B=A8=20smooth=20?= =?UTF-8?q?scroll=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom.tsx | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index e2490dd..485d9b6 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useId, useState, useRef } from 'react'; import { useParams } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; import { userListState } from '../state/userState'; @@ -17,9 +17,13 @@ interface Message { const ChattingRoom = () => { const { userId } = useParams<{ userId: string }>(); + console.log(useId); + const messagesStateValue = useRecoilValue(messagesState); const [messages, setMessages] = useState([]); + const messagesEndRef = useRef(null); + useEffect(() => { // 로컬 스토리지에서 이전 메시지 가져오기 const storedMessages = localStorage.getItem(`messages_${userId}`); @@ -29,8 +33,18 @@ const ChattingRoom = () => { } }, [userId]); // userId가 변경될 때마다 이펙트 재실행 + useEffect(() => { + // 메시지가 추가될 때마다 스크롤을 하단으로 이동 + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); + + // 메세지 목록 끝으로 스크롤 + const userList = useRecoilValue(userListState); - const currentUser = userList.find((user) => user.id === userId); + const otherUser = userList.find((user) => user.id === userId); + console.log(otherUser); + const otherUserIndex = otherUser?.id; + console.log(otherUserIndex); const sendMessage = (content: string, from: string, to: string) => { const newMessage: Message = { @@ -51,11 +65,15 @@ const ChattingRoom = () => { return ( <> - - + +
- sendMessage(content, currentUser?.name ?? '', userId ?? '') + sendMessage(content, otherUser?.name ?? '', userId ?? '') } /> From 29e2420b3c88d142ec968a6d3fcf9f056354beba Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 11:44:57 +0900 Subject: [PATCH 47/72] =?UTF-8?q?fix=20:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=8C=80=EC=86=8C=EB=AC=B8=EC=9E=90=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 9 ++++++--- src/pages/ChattingRoom.tsx | 27 +++++++++++++++++++++++---- src/state/userState.ts | 6 ++++++ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 934b074..de82409 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Route, Routes, useLocation } from 'react-router-dom'; import ChattingRoom from './pages/ChattingRoom'; -import UserList from './pages/UserList'; +import UserList from './pages/userList'; import ChattingList from './pages/ChattingList'; import Profile from './pages/Profile'; import Navbar from './components/Navbar'; @@ -16,7 +16,11 @@ const App = () => { return ( <> - {isChattingRoomPage ? : } + {isChattingRoomPage ? ( + + ) : ( + + )}
} /> @@ -26,7 +30,6 @@ const App = () => {
{!isChattingRoomPage && } - ); }; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index 485d9b6..88434b5 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useId, useState, useRef } from 'react'; import { useParams } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; import { userListState } from '../state/userState'; +import { userProfileState } from '../state/userProfileState'; import { messagesState } from '../state/messageState'; import ChatHead from '../components/ChatHead'; import ChatBody from '../components/ChatBody'; @@ -40,11 +41,27 @@ const ChattingRoom = () => { // 메세지 목록 끝으로 스크롤 + + + // 유저 관리 + // 현재 사용자 상태 관리 + const [currentUserIndex, setCurrentUserIndex] = useState(0); const userList = useRecoilValue(userListState); const otherUser = userList.find((user) => user.id === userId); - console.log(otherUser); - const otherUserIndex = otherUser?.id; - console.log(otherUserIndex); + + const currentUser = userList[0] + console.log(currentUser); + //console.log(otherUser); + const otherUserIndex = (otherUser?.id); + + + + //console.log(otherUserIndex); + + const toggleUser = () => { + setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); + }; + const sendMessage = (content: string, from: string, to: string) => { const newMessage: Message = { @@ -59,12 +76,14 @@ const ChattingRoom = () => { const updatedMessages = [...messages, newMessage]; setMessages(updatedMessages); + // localStorage에 업데이트된 메시지 저장 localStorage.setItem(`messages_${userId}`, JSON.stringify(updatedMessages)); }; return ( <> + {
- sendMessage(content, otherUser?.name ?? '', userId ?? '') + sendMessage(content, otherUser?.name ?? '', userId ??'') } /> diff --git a/src/state/userState.ts b/src/state/userState.ts index 16240d6..7803b64 100644 --- a/src/state/userState.ts +++ b/src/state/userState.ts @@ -20,9 +20,15 @@ interface User { export const userListState = atom({ key: 'userListState', default: [ + { id: '0', name: '김모씨', image: '', chatHistory: [] }, { id: '1', name: '김모씨', image: '', chatHistory: [] }, { id: '2', name: '박모씨', image: '', chatHistory: [] }, { id: '3', name: '최모씨', image: '', chatHistory: [] }, { id: '4', name: '최모씨', image: '', chatHistory: [] }, ], }); + +export const currentUserState = atom({ + key: 'currentUserState', + default: { id: '0', name: '김모씨', image: '', chatHistory: [] }, +}); From 8e74bb898eeda08196ea3b920553e41afce76648 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 11:48:58 +0900 Subject: [PATCH 48/72] fix : config.json --- tsconfig.json | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index a273b0c..7c03434 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,26 +1,20 @@ { - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx" - }, - "include": [ - "src" - ] + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + // "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"] } From aa4c09934e55679fc966010392722f5fc38be6a1 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 12:07:50 +0900 Subject: [PATCH 49/72] =?UTF-8?q?feat=20:=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=96=91=EC=B8=A1=20=EC=A0=84=EC=86=A1=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=EC=A4=91=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingList.tsx | 31 +++++++++++++++---------------- src/pages/ChattingRoom.tsx | 26 +++++++++++--------------- src/pages/userList.tsx | 3 ++- src/state/userState.ts | 3 ++- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/pages/ChattingList.tsx b/src/pages/ChattingList.tsx index 8e9a465..4020eb4 100644 --- a/src/pages/ChattingList.tsx +++ b/src/pages/ChattingList.tsx @@ -22,26 +22,25 @@ const ChatItem = styled(Link)` color: black; text-decoration: none; border-radius: 5px; - white-space: pre-line; + white-space: pre-line; &:hover { background-color: #e0e0e0; } `; - const ChattingList = () => { - const userList = useRecoilValue(userListState); - - return ( -
- {userList.map((user) => ( -
- {user.name} -
- ))} -
- ); - }; - - export default ChattingList; + const userList = useRecoilValue(userListState); + + return ( +
+ {userList.slice(1).map((user) => ( +
+ {user.name} +
+ ))} +
+ ); +}; + +export default ChattingList; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index 88434b5..26883dd 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -41,28 +41,25 @@ const ChattingRoom = () => { // 메세지 목록 끝으로 스크롤 - - - // 유저 관리 - // 현재 사용자 상태 관리 + // 유저 관리 + // 현재 사용자 상태 관리 const [currentUserIndex, setCurrentUserIndex] = useState(0); + const userList = useRecoilValue(userListState); + // 대화 상대방 const otherUser = userList.find((user) => user.id === userId); - - const currentUser = userList[0] + // 유저 리스트 1번째 + const currentUser = userList[0]; console.log(currentUser); - //console.log(otherUser); - const otherUserIndex = (otherUser?.id); - - + console.log(otherUser); + const otherUserIndex = otherUser?.id; //console.log(otherUserIndex); - const toggleUser = () => { + const toggleUser = () => { setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); }; - const sendMessage = (content: string, from: string, to: string) => { const newMessage: Message = { id: Date.now(), @@ -76,14 +73,13 @@ const ChattingRoom = () => { const updatedMessages = [...messages, newMessage]; setMessages(updatedMessages); - // localStorage에 업데이트된 메시지 저장 localStorage.setItem(`messages_${userId}`, JSON.stringify(updatedMessages)); }; return ( <> - + {
- sendMessage(content, otherUser?.name ?? '', userId ??'') + sendMessage(content, currentUser?.id ?? '', userId ?? '') } /> diff --git a/src/pages/userList.tsx b/src/pages/userList.tsx index 982808f..073b1db 100644 --- a/src/pages/userList.tsx +++ b/src/pages/userList.tsx @@ -11,10 +11,11 @@ interface User { const UserList = () => { const users = useRecoilValue(userListState); + //users.slice(0); return (
    - {users.map((user) => ( + {users.slice(1).map((user) => (
  • {user.name}
  • ))}
diff --git a/src/state/userState.ts b/src/state/userState.ts index 7803b64..d153ebf 100644 --- a/src/state/userState.ts +++ b/src/state/userState.ts @@ -20,7 +20,8 @@ interface User { export const userListState = atom({ key: 'userListState', default: [ - { id: '0', name: '김모씨', image: '', chatHistory: [] }, + // 0번은 current user - 메신저 앱 주인으로 설정 + { id: '0', name: '이영인', image: '', chatHistory: [] }, { id: '1', name: '김모씨', image: '', chatHistory: [] }, { id: '2', name: '박모씨', image: '', chatHistory: [] }, { id: '3', name: '최모씨', image: '', chatHistory: [] }, From e01d095341fe5596600b5d048ccf8e7e719dcb30 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 12:09:47 +0900 Subject: [PATCH 50/72] =?UTF-8?q?feat=20:=20current=20user=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=9A=B0=EC=B8=A1=EC=97=90=20=EB=82=98?= =?UTF-8?q?=ED=83=80=EB=82=98=EA=B2=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index 26883dd..b21d579 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -83,7 +83,7 @@ const ChattingRoom = () => {
Date: Sun, 5 May 2024 12:19:53 +0900 Subject: [PATCH 51/72] =?UTF-8?q?feat=20:=20=ED=86=A0=EA=B8=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5,=20=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 3 ++- src/components/ChatHead.tsx | 13 +++++++++++-- src/pages/ChattingRoom.tsx | 5 ++++- src/style/ChatHeadStyle.tsx | 12 ++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index de82409..7b119fb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,7 +17,8 @@ const App = () => { return ( <> {isChattingRoomPage ? ( - + + // ) : ( )} diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index c54e6e4..c6671b8 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { ChatHeadContainer, UserImage, UserName } from '../style/ChatHeadStyle'; +import { ChatHeadContainer, UserImage, UserName, SendButton} from '../style/ChatHeadStyle'; import { useNavigate } from 'react-router-dom'; interface User { @@ -7,7 +7,15 @@ interface User { image: string; } -const ChatHead: React.FC<{ user: User }> = ({ user }) => { +interface ChatHeadProps { + user: User; + onUserClick: () => void; +} + +const buttonImage = '/item/sendIcon.png'; + + +const ChatHead:React.FC = ({ user, onUserClick })=> { const navigate = useNavigate(); const handleUserClick = () => { @@ -16,6 +24,7 @@ const ChatHead: React.FC<{ user: User }> = ({ user }) => { return ( + { return ( <> - + Date: Sun, 5 May 2024 13:14:57 +0900 Subject: [PATCH 52/72] =?UTF-8?q?feat=20:=20=EC=B1=84=ED=8C=85=EB=A3=B8=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=ED=86=A0=EA=B8=80=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatHead.tsx | 44 ++++++++++++++++++++----------------- src/pages/ChattingRoom.tsx | 23 +++++++++++-------- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index c6671b8..e0b004a 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -1,10 +1,15 @@ import React from 'react'; -import { ChatHeadContainer, UserImage, UserName, SendButton} from '../style/ChatHeadStyle'; +import { + ChatHeadContainer, + UserImage, + UserName, + SendButton, +} from '../style/ChatHeadStyle'; import { useNavigate } from 'react-router-dom'; interface User { - name: string; - image: string; + name: string; + image: string; } interface ChatHeadProps { @@ -12,27 +17,26 @@ interface ChatHeadProps { onUserClick: () => void; } -const buttonImage = '/item/sendIcon.png'; +const buttonImage = '/item/sendIcon.png'; +const ChatHead: React.FC = ({ user, onUserClick }) => { + const navigate = useNavigate(); -const ChatHead:React.FC = ({ user, onUserClick })=> { - const navigate = useNavigate(); + const handleUserClick = () => { + navigate(`/chattinglist`); + }; - const handleUserClick = () => { - navigate(`/chattinglist`); - }; - - return ( - + return ( + - - {user.name} - - ); + + {user.name} + + ); }; export default ChatHead; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index ea61a68..ad13d62 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -43,21 +43,26 @@ const ChattingRoom = () => { // 유저 관리 // 현재 사용자 상태 관리 - const [currentUserIndex, setCurrentUserIndex] = useState(0); const userList = useRecoilValue(userListState); // 대화 상대방 const otherUser = userList.find((user) => user.id === userId); - // 유저 리스트 1번째 - const currentUser = userList[0]; + + const otherUserIndex = Number(otherUser?.id); + + const [currentUserIndex, setCurrentUserIndex] = useState(0); + const [counterUserIndex, setCounterUserIndex] = useState(otherUserIndex); + + let currentUser = userList[currentUserIndex]; + let counterUser = userList[counterUserIndex]; + console.log(currentUser); - console.log(otherUser); - const otherUserIndex = otherUser?.id; //console.log(otherUserIndex); const toggleUser = () => { - setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0)); + setCurrentUserIndex(counterUserIndex); + setCounterUserIndex(currentUserIndex); }; const sendMessage = (content: string, from: string, to: string) => { @@ -80,18 +85,18 @@ const ChattingRoom = () => { return ( <>
- sendMessage(content, currentUser?.id ?? '', userId ?? '') + sendMessage(content, currentUser?.id ?? '', counterUser?.id ?? '') } /> From 5ceb6236732d8cd41c56b403ddec2dc09ad23b52 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 13:23:15 +0900 Subject: [PATCH 53/72] =?UTF-8?q?feat=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/item/back.png | Bin 0 -> 288 bytes src/components/ChatHead.tsx | 2 +- src/state/userState.ts | 35 ++++++++++++++++++++++---- src/style/ChatHeadStyle.tsx | 49 ++++++++++++++++-------------------- 4 files changed, 53 insertions(+), 33 deletions(-) create mode 100644 public/item/back.png diff --git a/public/item/back.png b/public/item/back.png new file mode 100644 index 0000000000000000000000000000000000000000..b15dad23e73f3655e61d371b8436242699e4eb55 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#t)4E9Ar*{Ur+M=^7zngQdta0BI;4B#9P1IU zm;-)uT91@kw782aC2jfqV!ns@r`oey=7zmbpK_d~Yewnakif8K!s0O>c4eN;;Ewvx zqVBn7*S3kmH3!!Rx;QjibFU~+XJpS4EqJ(}iPJ)3LQ`{7W}M4|1rA2@n{2$#t})bQ zRP9*wL60|_Y1)g(`o1USyecZ!T%UQ(DHC*mw8wX)&=t!C9wtvO)o-6v_~Kx_r@G{2 er!DW(PcsV4-6_%}C>{^=0E4HipUXO@geCw2jA#b{ literal 0 HcmV?d00001 diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx index e0b004a..65a9ce1 100644 --- a/src/components/ChatHead.tsx +++ b/src/components/ChatHead.tsx @@ -17,7 +17,7 @@ interface ChatHeadProps { onUserClick: () => void; } -const buttonImage = '/item/sendIcon.png'; +const buttonImage = '/item/back.png'; const ChatHead: React.FC = ({ user, onUserClick }) => { const navigate = useNavigate(); diff --git a/src/state/userState.ts b/src/state/userState.ts index d153ebf..a0fd3dc 100644 --- a/src/state/userState.ts +++ b/src/state/userState.ts @@ -21,11 +21,36 @@ export const userListState = atom({ key: 'userListState', default: [ // 0번은 current user - 메신저 앱 주인으로 설정 - { id: '0', name: '이영인', image: '', chatHistory: [] }, - { id: '1', name: '김모씨', image: '', chatHistory: [] }, - { id: '2', name: '박모씨', image: '', chatHistory: [] }, - { id: '3', name: '최모씨', image: '', chatHistory: [] }, - { id: '4', name: '최모씨', image: '', chatHistory: [] }, + { + id: '0', + name: '이영인', + image: '/item/profile_mini2.png', + chatHistory: [], + }, + { + id: '1', + name: '김모씨', + image: '/item/profile_mini.png', + chatHistory: [], + }, + { + id: '2', + name: '박모씨', + image: '/item/profile_mini.png', + chatHistory: [], + }, + { + id: '3', + name: '최모씨', + image: '/item/profile_mini.png', + chatHistory: [], + }, + { + id: '4', + name: '최모씨', + image: '/item/profile_mini.png', + chatHistory: [], + }, ], }); diff --git a/src/style/ChatHeadStyle.tsx b/src/style/ChatHeadStyle.tsx index ab1e0b1..646d544 100644 --- a/src/style/ChatHeadStyle.tsx +++ b/src/style/ChatHeadStyle.tsx @@ -1,14 +1,13 @@ import styled from 'styled-components'; export const ChatHeadContainer = styled.div` -width: 375px; -height: 96px; -position: fixed; -top: 0px; -display:flex; -justify-content:flex-start; -align-items:center; - + width: 375px; + height: 96px; + position: fixed; + top: 0px; + display: flex; + justify-content: flex-start; + align-items: center; flex-shrink: 0; background-image: url('/item/chatHead.png'); @@ -16,33 +15,29 @@ align-items:center; `; export const UserImage = styled.img` -margin-left:45px; -margin-right:10px; -margin-top:30px; - border-radius: 50%; - - width: 10px; - height: 40px; - - + margin-left: 45px; + margin-right: 10px; + margin-top: 30px; + border-radius: 50%; + width: 10px; + height: 40px; `; export const UserName = styled.h2` -font-size: 16px; -margin-top:47px; -font-style: normal; -font-weight: 500; + font-size: 16px; + margin-top: 47px; + font-style: normal; + font-weight: 500; `; - export const SendButton = styled.img` - width: 30px; - height: 30px; + width: 25px; + height: 25px; flex-shrink: 0; cursor: pointer; border: none; position: absolute; - margin-top: 9px; - margin-left: 4px; -`; \ No newline at end of file + margin-top: 28px; + margin-left: 14px; +`; From d5b2ea007e3ebb02bd95a8a775707b31545f99de Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 14:18:44 +0900 Subject: [PATCH 54/72] =?UTF-8?q?style=20:chatbottom=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/github_logo.png | Bin 0 -> 1681 bytes public/instagram_logo.png | Bin 0 -> 3649 bytes public/item/chatFalse.png | Bin 0 -> 838 bytes public/item/chatTrue.png | Bin 0 -> 862 bytes public/item/profileFalse.png | Bin 0 -> 1217 bytes public/item/profileTrue.png | Bin 0 -> 1287 bytes public/item/userFalse.png | Bin 0 -> 1015 bytes public/item/userTrue.png | Bin 0 -> 1037 bytes src/App.tsx | 9 +- src/components/Navbar.tsx | 90 ++++++++++++++------ src/pages/ChattingRoom.tsx | 4 +- src/pages/Profile.tsx | 27 +++--- src/state/userProfileState.ts | 19 ++--- src/style/ChatBodyStyle.tsx | 154 +++++++++++++++------------------- src/style/ChatBottomStyle.tsx | 2 +- src/style/GlobalStyle.tsx | 9 ++ 16 files changed, 180 insertions(+), 134 deletions(-) create mode 100644 public/github_logo.png create mode 100644 public/instagram_logo.png create mode 100644 public/item/chatFalse.png create mode 100644 public/item/chatTrue.png create mode 100644 public/item/profileFalse.png create mode 100644 public/item/profileTrue.png create mode 100644 public/item/userFalse.png create mode 100644 public/item/userTrue.png create mode 100644 src/style/GlobalStyle.tsx diff --git a/public/github_logo.png b/public/github_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d97dc61f3048ffd180c0c5a34d0ecdb521c64753 GIT binary patch literal 1681 zcmaJ>`CHNl82@5nDjhS-Eh>E`%d#?U9vv!9XPRc_BLV7gX@_JA(+rPHG_RRGW^7sN zGOdOe`V~AlR5W#Yr541Y5S~LPnFn48O0)d|d!OfhKgaugp6C7Pz3c1avCRNs006)? z&ogd*006;la92IujX55ao3;V^k!J#;0RRU7(h#8F$u}D&B-+oz6#)D9PHl+I1ebFz z0Km+Ft%X1VK-b*U&E-NI_-2+($Kx9TZo>#8jWQVP8?AZ*wMS>JTM{0c;iyowt3>!ev zV4~|z`vDG+{k{J^=>gzG4h9FCjuHvt1`?dCfIMplL^OSw<5}QzMRLa4;;4%g=jlo2KeoV$j`b>zLJG%lG3- zJ6sD_EfB4Mlw4k|AS_27A$TN&E z1i5rY!SaD1rz+bCg@lI<;DCC7d6)YpR-W+yJnW+6pLNrVq^pTD1j3&Ruj7f-bZrSV z_<6vC2L9yq!y=P?aak|hL@^{cDdA!NIqFAl#~%9yFrubmu(NqNmT8y>+D`nKWbqjU z+^--Z;iCl}(g>mYHvy9?bv7d|AX;t|6I9P6UjYxd?qL{%4oITCv-+7}wL?@(W&LD_ zI;)EAgVBijC-7UoI_CY-_?-@Uy9I9rDMOo>|MWv(q`ku9ulVw;n1rXfLye!d{GQIr zH(AHZ?nyB1C&f6vcxz&)jx|3+e_$XNBwe_L@{-V~Hbt!Yx3&_jw==b~-a zn(zzp#)maWmD4Tgc!Lm&h}VaUXzw4lC4e47wQGR@yhn#jxJ)8@TqenV?627(>OGq5 zZ)EQ?D8k-yZd5Zv6Dr!HU^TrW;91ckXsI-Ex%Kn{qRWX31)MZW{2( z5lzz?LxaZ(ol@jYzU*Q1?BURCpBW`*&5DR^Td<@NG2u$QFu`&f$LnH4!w=W(D&0ar z43Ws$aiF7iYnhc>G|9X((7iNSM$0}wQuAc3VAk|jQ=iPUlRb$kDM zW&3Mi;wzM)C)lTdOsKCJ$nLy)>Sq^|XpZ^s_48x(d z+d1M{98DrM>Kb}mEe8aY&+)zK++CPB2?fgPslio;`Vs1&LN5Q2ZcFzFT>1Iu zz*G}TtPNc4=sWl{XM_hl={({en^wz+(Z(8!BV&;VuPC34g%SLSxu#RRDw|FG8B}E0 zW6HGM0ilEcd5iUvOI3cu%Wp1W3g4Zxf&5_VxB0^>+9Yw6{M=quo36F$F|Cmu6wjnz zT@k2TMV+8lDJV@Jl&H{~Kxhq@s8^! zeibGPrA7cgxj^;pr+aI5{>1OD9pBe093K0WYUU3q#xg@~Voo-b9$j$myahhVFaVIb z-AS*T`H>3PexQs>hu5U0eW>B+*#e6XxeeT$^&3&nhyL#!|F>J5vnp&o7NXl@%lo1| MPy4umuE8n)0wM1>xc~qF literal 0 HcmV?d00001 diff --git a/public/instagram_logo.png b/public/instagram_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..611e5af70178b57dbabc6fd6eae404f5fdea2acc GIT binary patch literal 3649 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 K!U%5&jr|XLChbQ6 literal 0 HcmV?d00001 diff --git a/public/item/chatFalse.png b/public/item/chatFalse.png new file mode 100644 index 0000000000000000000000000000000000000000..957f544687933cef0e155a896211b2340c1b7605 GIT binary patch literal 838 zcmV-M1G)T(P)L|l3>R2O|6E{ zS(Ysjh#&$fY?p)2OJOe$BEgi`Q3#;2g(s3V$iaMtn0g(O_2@0I zJPJ~Xv8j4?w(i>tZ-KO48-bt|TkynNAkVK|gkuk$cnhp}Cvp^hD>j)1!r|SwLSTV# zc=xSXg9`*g(YL~aGPmj>bo*xT#9QEUiE9L6wQ^tJiNsYKkMp^DH?`^6?`J#kMB=JZ z+$V^+zsDg2NCa9`4k7f8PESrU@AYTMBKnJq+(CeeV-zuhh*uCmhr7XndBZ+3io1jm zi9im_%PCHhggF_P4F;NNSw$j{J6_wlYB`xY=j?o3@Jd;x)9fq})hM4^{bIRXx0w!y zy(t1A5l9*oS@2-KwzDhbfFqGeBoc}IgIIe1xjOS_d8H7e@?_T7AW_ML+50{Q!`~RV z?$b@P^!`qzO-diO%W`II`MHTrhI|AeQi0}lmwxFsPcwShhJoxZv(g zAQfnsI7S7dr=Hszqx18;QLiWMO^D?R3eJ2ZlBbZr;eCV#gW;=fB(eU{8oF85I~)vp zmX^4!h^6Nj&#OXUTL{;6kE$wF=1vkYKQbw4QKNvL5fc8S(TqHn$N%`*e(xEGL?V$$K#XZrb6}4jsXCy7#U-De zCU6s$jZ@&n+Chdu1QBS=(_M%BIR#WVsn1S~cpZiiT7ohZ*Uph!T#VL6RQNMGckbT9 zm(QQZP()SWL(@2NaL@4PRJBE_2^4X>_27@HNR>G#bB<>D5sGl}+2@=b!IKmUP~2N6 z!#Q~b1-u2yR)F7IP&PtV;G%6Wyalo&O#~u`Gw?(~V6uxqBuMw*iMPNcfO#%)3T-Ql zperL7{%tFaU@}E8{M*)8WHJOIQD|FZA5`@nFXJZg#9LqrXAuaF;465d;;Pk58) zredB$JJ^9IDy|wAnwL<9dte<3s0ajZoIsbpwXePBpP&}eGhA}eq5sYfdQf5u3K-KW z=a|74x_#aE_Vfi5Q8CduW?oLQ9AzX#0d~zl^31nWOv1_ zlk%*{s*N-P+v`vf$j+D9VY*e$%H9>S!;wfN5{X3qK_tDuuFM!yW}>$OWt2Rb1=2}i z`yvx2=Y0%@KQM6JFVg!vD|L8e=Gqk1mAZ3gvWpaC4~nP?oMYP*e(5q#)BCm7HVZMbcaZGmgjEv#$Ic1VAaGzaEJoXr{+ZYpf)3 z)ArE5sSoXGo#kgsaeTf{@v1_D3zWn#=iniQPJfo+>w$UF5iu;U@f3C><$V5D!d3=F z)J>G#yj84*ywa)T8PQc}!Yv9kOe}S1p2k``JunS-W5ivCNF)-8L?UW@2j3m`^G8HUBLDyZ07*qoM6N<$f&pZKcmMzZ literal 0 HcmV?d00001 diff --git a/public/item/profileFalse.png b/public/item/profileFalse.png new file mode 100644 index 0000000000000000000000000000000000000000..f3fa692e74d8748fe802f3ab1b6941474c9e3a20 GIT binary patch literal 1217 zcmV;y1U~zTP)`ir(C`-&i+1P)Y*kwl{)2}907j;U2@udS z0ipv&VgLzH#1MWZalg+oC^dF~+__TK`$(40cjvRees|})_lOhoJl3cCw=2%QW=s7{i}X0z|ARr+}k zaZHBqnVQOtl4K$z5m;{AwzW@4#=K>TLv&Lj*e(?aoMk^h%xy>#+Z~c1|e>oe8gRK%ODbo#0|^3#Ceh;2?z^h>*18~D`Nq- z(b?JMo6nP!`f#k_j9qmzS5cw6yFilJizqf81teg9M3E$gltw+0l`> zo>5OuPH1Om2OpqJVIwRMxs3-kim?#-eb^E|A?1AIt(tK*)l4`2s9t zRjb-F?7s7EWOoRmul!XV*Mb@Ey{H%0LR|^h2;DCVAVeEHKexT^hy2HnweVOiwn&2z z+~bOlfBE9{YKsIB63AnRqd=NwKS%g^f~^AE7@THj6nD>BP1}gYZicjBU1yx)1I(1m zv;c8zRm*uXyczNg5)>&UFcP7{*%`6#vVN25q+y+_El{yiA;)@n`3yN5+nTp5>OP%C ze*T=}Nhe)DesSG{(=LtzHA&L~-Pm0`77HvlI6~`MvA}t-Y#JvElS;u`pRI>ek0+b+ zc1eJyhj}e*t&KOR;&{eTr=cSXb(~)X#Ak46V1k+;iTs6m>~3IEN$a}i=i(@0hBir| fP$(1%#l86r%Q3{m@ZegR00000NkvXXu0mjfJ0>#8 literal 0 HcmV?d00001 diff --git a/public/item/profileTrue.png b/public/item/profileTrue.png new file mode 100644 index 0000000000000000000000000000000000000000..21786f902d572ff2fa656d24b3c378ff2e5f3eed GIT binary patch literal 1287 zcmV+i1^D`jP)8=Q6!Lp6ck@TT)=w)x#1A!0>>nuAkK{&Il`$nm!zDw z%>hA?>YyBo1X2zzagh=>m-a?{%T{W3`kw7gU3<5UJ+p_Z^OH83%-bE$n>X`j-Wx!p z(P%W9R~G{@V%v7ohq**Qk`q80t%rZMVLgNQFZsYG6|Fu#yDDH5-?gqh`nO)Y3xz0E@C&=JDj>e2qS-B*xRgeA z+QQg7Z{z&=b2vI`biZPf6+fG@vbbNbZ9@^trfAD@{(5))uxVmp;aXF{PHOk+*xLF9 z|Mw~ivgXQ`v#|~ZD6t@~x%RZ|vE0}5U&5N2?D^)xg*P!edJ%v9z1t%*V9aE!?2UT8 z)_^1lD1e;FD*a7%*9X%w3YJeyq{CWFvXg=Wq!ny?%wm}AQrEN$WBPLV0I&z0@EChl+hl#3`wLFB(Ir|l7)E69u5xviVHeO`qG$c8Pm|+E2N%ol2)0t-7!v_!X$Ie}N zo`<+mp`eQwj5I6B`(4u8_XJ_!?2k+B1V1|CjQ}*N8kD6t+?Cslkde$n3 zQ;g*&8BF6>a@1IrjC>CT2q9K1%Tf|9 zDNR}I?d_EkiNq=-@O^(RlgX5z2<17MdcD4E7zQiZZzRwl%dM%hTtF;IC$eOkELo!B z!dc#@0jZvxoGg;%Tqq{iv>_`>owrHZJXwbi<$+aQs&`4LZSubB53tEbg}6)I3O1ALZb`=-U`3-x&4)$KqCLF3>9wMXtiI$ zfGCIuMbbD;-E&zibxIwl+>GtIAJNRGn$4rzmh-bC_()1h(Iw6{l@BSBuR;M*7UWKl z6*=kj-YsXd+`gyCb2)gYozf`wel4W$9nM1Rc~QV)3(s-X-z6vq`Ih$G;v5amSW6_5 zbeYNtEfW-Z0K25mMyhRQ}2+|i=EG9 zYtn7KGjZR*YroR;{*%^Bh3*G$P&>PRtAq4T&BcI7TJX41x5-^<3R$9(zp5?jDdirLJ2ZoAO49LI=w(joCWVF1H<|)Wd2JH^g zw9Ao|-7p987=Ci-bczNT)V?@`1Oo@WZHE$>e<4N4Qm?N?Z4pm95Ns8NB5w)gph{3k xtPy=b*iGy9rZ{+@ZaEt(&}cLojYiWqPXObft>*3#zq$Yb002ovPDHLkV1kxPVgLXD literal 0 HcmV?d00001 diff --git a/public/item/userFalse.png b/public/item/userFalse.png new file mode 100644 index 0000000000000000000000000000000000000000..699ce49bb7d4473a950873acffdcb3ffdc992b1b GIT binary patch literal 1015 zcmVH1bqKBGI1RI zC5gG28~tW7^2f^2YNge#1d+vJu~;mY{}w?8@qNFAqPN}BF#fopU-%n%o)_fFL-s<- zcB6<~u7h$u8hHycfDr{{L*H=OI`kgzI=8ppDpO~S=aYiZdQfsknl#7&XlS2ulw)8O zKYd?8xmfJs!FNd$BML%+^OE;%IecSehm_K6(wH5f?5Dj)wlqx8M=*r7l7D30fNCOiJ1}MTZxy>e8 z%ga*P1K(FhTS0dJympnzot#kY@?nuu*-X7!9g@X}li6(Ou2@1Wu-L~9Mahf*imDN^ zJZWG=LAGKPMK5{p8;$5o2XJ(QIa#IQ&eM}WAq`H*5Y46-!jd5xf0aDLbqFuW5lN7i zm7&{D_Q0q!fm|7KR*vCV_n8z?QV?rXA4R`Rj;)vUyiACd;NkrE=wFZmN(!dets=1a zzj9e8Mal!i^okTvQm~?fV7Y+HWL?w&-%?7OR27_8l#9I|oY4|i4@d)i>xC51@}lqW z`AfsuSsW;Taqsu{pW7C7IP@)x#bU8oEdK}&0yyu>Jk#2tR>jz+Q-=0-D>xuer%HUn z6z7GU8Sr`FfqH9G=Yk2w4?v;V7&%~z;yg~Q5Jj$$31C}MJST~7PF>7%nE&@q3=Fs6>r_VE1U+zkpkbq+9*aX3kOWfJ2{pvDJ7e2N=pfa2ulT3OnW6N7o6aoeb}6UqZQ-OmF(~0CS&K$=$VO zazCB=zcG|MbR>)pQK^(8J!bkDEE82ql1+1@Wg>F2js;fLIwex&7z$!%TJUdO4*h`O l+Y-RCWU*K*7K`O5`~?dahG9MTMe_gv002ovPDHLkV1f-~#Jd0h literal 0 HcmV?d00001 diff --git a/public/item/userTrue.png b/public/item/userTrue.png new file mode 100644 index 0000000000000000000000000000000000000000..e58b9a6f726a82d449b77acad11b110e8f772b63 GIT binary patch literal 1037 zcmV+o1oHcdP)hAzzG5;AiNZ&eG%mVm>Y0|`UvSun?A(q zu0Mifuq|6+I>YEU)7r7uvRAv(?n(d-hr{7;I9@FtEF#3tAO`lS*~7GP^*}E;kn%dJ zl3&6TeC|VSD_{hAM!`G3mDe*^z>0#IVs~^pc<#OrY?6{;@!BV`b4-Vmsy0c$5H!c2dQjQ_(PpRWZFvN<2?FjkO0c%+~j6(pH$KK8UaW3BxG z3@}!(2SjASd6OKu+dUtbP>r(X_F;grg6Z_H9-8EQERrd|hh?K|>B&|d^7OqHpjq^^ z;r>iYnS7{}-#Pe)&}(@v<=2)SvW^u6vmkz1b-&yJoZXOHYkausQ_MVp0dHUlAHiXa zzhou#CBMdFlLGcpIaSMkf6OwV6C~+f3TH6AmCLhx{*GXP)m)TG^GnVtdAu!T?wSqH zjCi)xm3I`dlx&Os67ME7pf@Pq4GWD&NWutC%Wle6i__RR!YVeZIlDFGt~cbSvZ@Mc zgRz2X;>_hyb+Gs0jitPjd@jV^P$8bG%#9m9@65-aQxmuCtRP!0#@o9*1*>^Mcq6Yj z`FuRy-Crs-Lp!3Z+=|eF&S63!m^LZLa7f@|GWoPujv0`(FVK-r3T}y=iP9)}*m`-- zX9aO5*qyh;u0RJmDd-pCRvkQ9@UcyaRQ=A!_}cEd4(Lq~kBM@uDPRB2=Hc)h9mk+| zt|ymP4nBP88CC_|SEUjcxpbP;g|f}mE7~E~ zba~-h@hoitV4q|TU=gbp%xb>_uHF3PW3N^g)OnuPbAG`xRu+DX@c2t>H`Q;mfk|80 zeFZ;)WnRKXFFeFlPQ4G~bU%XERA#x0J~RFXEJOD{&~Z+6Uua|NI>+)P6VS5Xd`!v> zq?~biGbxuqZf+4oS>6}!>_00000NkvXX Hu0mjfOXcEv literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx index 7b119fb..bb46c4e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,6 +9,8 @@ import NavbarHead from './components/NavbarHead'; import ChatHead from './components/ChatHead'; import ChatBody from './components/ChatBody'; import ChatBottom from './components/ChatBottom'; +import GlobalStyle from './style/GlobalStyle'; + const App = () => { const { pathname } = useLocation(); @@ -16,12 +18,15 @@ const App = () => { return ( <> + + {isChattingRoomPage ? ( - - // + ) : ( + // )} +
} /> diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 41d2d6a..769af49 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,39 +1,81 @@ // src/components/Navbar.tsx import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link, useLocation } from 'react-router-dom'; import styled from 'styled-components'; const NavbarContainer = styled.div` - display: flex; - justify-content: space-around; - position: fixed; - font-size:20px; - width: 375px; - bottom:-33px; - height: 80px; - background: #f0f0f0; - padding-top: 30px; - - - + display: flex; + justify-content: space-around; + position: fixed; + font-size: 20px; + width: 375px; + bottom: -33px; + height: 80px; + background: #f0f0f0; + padding-top: 30px; `; const NavbarLink = styled(Link)` - text-decoration: none; - color: black; - - + text-decoration: none; + color: black; +`; + +const NavButton = styled.img` +position: fixed; +bottom: 4px; +margin-left: -35px; + /* width: 30px; +height: 30px; +margin-right: 10px; */ `; const Navbar = () => { - return ( - - 친구 - 대화 - 프로필 - - ); + const { pathname } = useLocation(); + let userPageButton; + let chatPageButton; + let profilePageButton; + + switch (pathname) { + case '/chattingroom': + userPageButton = '/item/back.png'; + chatPageButton = '/item/back.png'; + profilePageButton = '/item/profileFalse.png'; + break; + case '/userlist': + userPageButton = '/item/userTrue.png'; + chatPageButton = '/item/chatFalse.png'; + profilePageButton = '/item/profileFalse.png'; + break; + case '/chattinglist': + userPageButton = '/item/userFalse.png'; + chatPageButton = '/item/chatTrue.png'; + profilePageButton = '/item/profileFalse.png'; + break; + case '/profile': + userPageButton = '/item/userFalse.png'; + chatPageButton = '/item/chatFalse.png'; + profilePageButton = '/item/profileTrue.png'; + break; + default: + userPageButton = '/item/userFalse.png'; + chatPageButton = '/item/chatFalse.png'; + profilePageButton = '/item/profileFalse.png'; + } + + return ( + + + + + + + + + + + + ); }; export default Navbar; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index ad13d62..ddd3492 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -7,6 +7,8 @@ import { messagesState } from '../state/messageState'; import ChatHead from '../components/ChatHead'; import ChatBody from '../components/ChatBody'; import ChatBottom from '../components/ChatBottom'; +import { ChatRoomContainer } from '../style/ChattingRoomStyle'; +import styled from 'styled-components'; interface Message { id: number; @@ -91,7 +93,7 @@ const ChattingRoom = () => {
{ @@ -87,15 +94,13 @@ const Profile = () => {
{profile.name}
-
{profile.phone}
+
{profile.phone}
- 인스타그램 - 깃허브 ); diff --git a/src/state/userProfileState.ts b/src/state/userProfileState.ts index 2111b5d..d1c263e 100644 --- a/src/state/userProfileState.ts +++ b/src/state/userProfileState.ts @@ -3,13 +3,12 @@ import { atom } from 'recoil'; export const userProfileState = atom({ - key: 'userProfileState', - default: { - name: '김모씨', - phone: '82) 10-1234-5678', - image: '', - github: 'https://github.com/jinnyleeis', - instagram: 'https://www.instagram.com/', - } - } -); + key: 'userProfileState', + default: { + name: '이영인', + phone: '82) 10-1234-5678', + image: '/item/profile_mini2.png', + github: 'https://github.com/jinnyleeis', + instagram: 'https://www.instagram.com/', + }, +}); diff --git a/src/style/ChatBodyStyle.tsx b/src/style/ChatBodyStyle.tsx index 32d93fb..b583baa 100644 --- a/src/style/ChatBodyStyle.tsx +++ b/src/style/ChatBodyStyle.tsx @@ -1,101 +1,85 @@ import styled, { css } from 'styled-components'; export const ChatMessageBox = styled.div<{ isCurrentUser: boolean }>` -display:inline-block; - padding: 8px 9px 8px 9px; - - width:196px; - margin-left:30px; - margin-bottom:5px; - margin-top:5px; - border-radius: 8px; - background-color: #EDEDED; - align-self: flex-start; - border-radius: 20px 20px 20px 5px; - - color: var(--dark-gray, #4E5058); -font-family: "Noto Sans KR"; -font-size: 16px; -font-style: normal; -font-weight: 400; -line-height: 150%; /* 24px */ -letter-spacing: -0.41px; - - ${(props) => - props.isCurrentUser && - css` - border-radius: 20px 20px 5px 20px; - background-color: #DCF7C5; - align-self: flex-end; - margin-right:5px; - ` - } - - ${(props) => - !props.isCurrentUser && - css` - - - ` - } + display: inline-block; + padding: 8px 9px 8px 9px; + + width: 196px; + margin-left: 30px; + margin-bottom: 5px; + margin-top: 5px; + border-radius: 8px; + background-color: #ededed; + align-self: flex-start; + border-radius: 20px 20px 20px 5px; + + color: var(--dark-gray, #4e5058); + font-family: 'Noto Sans KR'; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 150%; /* 24px */ + letter-spacing: -0.41px; + + ${(props) => + props.isCurrentUser && + css` + border-radius: 20px 20px 5px 20px; + background-color: #dcf7c5; + align-self: flex-end; + margin-right: 5px; + `} + + ${(props) => !props.isCurrentUser && css``} `; export const ChatBodyContainer = styled.div` + display: flex; + flex-direction: column; + margin-top: 96px; - display: flex; - flex-direction: column; - margin-top: 96px; - margin-bottom:85px; - width: 375px; - - - - + margin-bottom: 400px; + width: 375px; `; export const UserProfileImage = styled.img<{ isCurrentUser: boolean }>` - width: 20px; - height: 20px; - border-radius: 50%; - margin-right: 0px; /* 메시지 박스와의 간격 */ - margin-left: 5px; /* 메시지 박스와의 간격 */ - display:inline-block; - margin-top:-10px; - position:relative; - z-index:-5; - - - ${(props) => - props.isCurrentUser && - css` - display:none; - - `} + width: 20px; + height: 20px; + border-radius: 50%; + margin-right: 0px; /* 메시지 박스와의 간격 */ + margin-left: 5px; /* 메시지 박스와의 간격 */ + display: inline-block; + margin-top: -10px; + position: relative; + z-index: -5; + + ${(props) => + props.isCurrentUser && + css` + display: none; + `} `; export const DateSeparator = styled.div` -width: 122px; -height: 21px; -flex-shrink: 0; -border-radius: 4px; -background: var(--medium-gray, #D9D9D9); - color: #000; - text-align: center; - margin: 10px auto; // 정중앙 정렬 - font-family: "Noto Sans KR"; -font-size: 12px; -font-style: normal; -font-weight: 500; -line-height: 180%; /* 18px */ - - + width: 122px; + height: 21px; + flex-shrink: 0; + border-radius: 4px; + background: var(--medium-gray, #d9d9d9); + color: #000; + text-align: center; + margin: 10px auto; // 정중앙 정렬 + font-family: 'Noto Sans KR'; + font-size: 12px; + font-style: normal; + font-weight: 500; + line-height: 180%; /* 18px */ `; export const TimeDisplay = styled.span` - display: block; // 메시지 박스 위에 표시 - text-align: center; // 정중앙 정렬 - margin-bottom: 5px; - margin-top:5px; - font-size: 12px; - -`; \ No newline at end of file + display: block; // 메시지 박스 위에 표시 + text-align: center; // 정중앙 정렬 + margin-bottom: 5px; + margin-top: 5px; + font-size: 12px; +`; diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx index d64758e..02b1ec2 100644 --- a/src/style/ChatBottomStyle.tsx +++ b/src/style/ChatBottomStyle.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components'; // ChatBottomContainer를 div로 변경하여 컨테이너로 사용 export const ChatBottomContainer = styled.div` position: fixed; - bottom: 0; + bottom: 280px; width: 375px; height: 80px; flex-shrink: 0; diff --git a/src/style/GlobalStyle.tsx b/src/style/GlobalStyle.tsx new file mode 100644 index 0000000..8b6c87d --- /dev/null +++ b/src/style/GlobalStyle.tsx @@ -0,0 +1,9 @@ +import { createGlobalStyle } from 'styled-components'; + +const GlobalStyle = createGlobalStyle` + +*{font-family: "Noto Sans KR"}; + +`; + +export default GlobalStyle; From 2c699612174dcc6d9c4499eff3607c06d39940dc Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 14:21:14 +0900 Subject: [PATCH 55/72] =?UTF-8?q?feat=20:=20navbar=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Navbar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 769af49..e0f0ab2 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: -33px; + bottom: 280px; height: 80px; background: #f0f0f0; padding-top: 30px; @@ -23,7 +23,7 @@ const NavbarLink = styled(Link)` const NavButton = styled.img` position: fixed; -bottom: 4px; +bottom:320px; margin-left: -35px; /* width: 30px; height: 30px; From 0576b7a5f06fa9e8570be948b81160ca6d38ca91 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 15:07:33 +0900 Subject: [PATCH 56/72] style : navbar head --- src/components/NavbarHead.tsx | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/components/NavbarHead.tsx b/src/components/NavbarHead.tsx index 19944c0..4475fdb 100644 --- a/src/components/NavbarHead.tsx +++ b/src/components/NavbarHead.tsx @@ -6,14 +6,24 @@ import styled from 'styled-components'; const NavbarHeadContainer = styled.div` display: flex; - justify-content: space-around; + justify-content: flex-start; position: fixed; font-size: 20px; + padding-left: 15px; width: 375px; top: -33px; height: 80px; - background: #f0f0f0; + background: #fffff; padding-top: 30px; + +`; +const NavbarHeadTexts=styled.div` +background: #fffff; +padding-top: 30px; +font-family: 'Noto Sans KR'; +font-size: 20px; +font-style: normal; +font-weight: 500; `; const NavbarHead = () => { @@ -22,22 +32,25 @@ const NavbarHead = () => { switch (pathname) { case '/chattingroom': - navText = 'Chatting Room'; + navText = ''; break; case '/userlist': - navText = 'User List'; + navText = '친구 목록'; break; case '/chattinglist': - navText = 'Chatting List'; + navText = '대화'; break; case '/profile': - navText = 'Profile'; + navText = '내 프로필'; break; default: navText = ''; } - return {navText}; + return( + + {navText} + ); }; export default NavbarHead; From 9ebeb70632b80ac9b145a58a118b66d6cb1a2937 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 15:35:29 +0900 Subject: [PATCH 57/72] style : userist page --- public/item/searchbar.png | Bin 0 -> 1943 bytes public/item/userbg.png | Bin 0 -> 960 bytes src/pages/userList.tsx | 68 ++++++++++++++++++++++++++++++++------ 3 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 public/item/searchbar.png create mode 100644 public/item/userbg.png diff --git a/public/item/searchbar.png b/public/item/searchbar.png new file mode 100644 index 0000000000000000000000000000000000000000..64f91ee76405a764fa9a560bc1a4bca6c8c2e81a GIT binary patch literal 1943 zcmV;I2Wa?-P)&oLMqEaY$+zStBGh_NUCB}+eA31iHG*0hhEyGr#8Ly>(rz@HL*Rk ziEWHc)I_i<+Qh{adyw`Z!GZ_ZHek|)#DG*#p!0t=FU$_Ju(La?eEfgOIJ-0Nyfa>Y zJoCKI`)**yLLA`GlP6DPYHCWi>FH@9gb1(fGJLUs@_Pkxf$n(iS0vkhMx)a_zg*FXzr((7lt& z$_i;a^rpmOyM=hCr{@oeL~5j>qCyBEE03JzdiMMUORVi0skXMhB|D7M-V2T3M}_54yZJUk*JBO|hY{d!ACKU)%Rx1?Jt2M+9&rQr7MUKJ4thf8E)Vp1nXY}v9| zqS2@diV#8yO-^z>_0t*IUk-_o)-qgd@6J9gMg6^u)~t6TgA5$o2i z4Z7LW07wfoHN~X4xk(5i1_DCJruk#DM`j3r`Sj=q!H;hG&E>x!O76j11qn4 zTlZ*-9ByrGjg^XMoYxllUpy1~K~#(Sy`$3f0HA#pBDlt1b|8czp1T_sKl_(cHjzm+IYN61=ZA) zN*fFf4QW3RAC4R1@wf~QK2VVvnWD}0>v8?;6fC5TrN^-c`}gnDy%8&pBM%Ij;~btD z{S6EZXrBiUzLC}+WZKbjQKR$L)udkl$F(~tU5Y=Nz31&zsAOrw0thwH8;n! zEzUbjz97GpjCanv_mwMG=bcMQa--|AkBC-VTJ}kK`P^Fq#Ed@%hgV1bh}O-u!E=-^{}Wc*dE;`egm-~qQl@7B1}jYkzOKk-?e>DPmjvUE>;6X1<4_@ zH9*vE^|D54gM&k^&*auW+Crdi=gf6Z5JlU?YQH}OO9)xMLSAYh zS!@s_1dIG;Ticp{WEnaNap13Iatmi`RX~8hyD%lZ%0C>+1L#Psmy!=jpEy z?5Cf6ESIkQDmSd?^_(SGgP9Whddq7%ORMWfD!MI%U;$qJAyq`L$XnV6sqoyHrj%A! zSEogm_5mp5SMAek2L|p6A%tWiuZ3GsW`)IBuwkMA))fHu$px6D1qv|rtBjDfgKz7(LbQ;o+pH}JHnwNC4uYNh_IoK5lamv= z8LF!{>g#xi{);or1;lo;`b>X#+x5 z5x)EqffrC!;0KUjTU&+74z;ZSB}!Ow5Fp>`EaV4fa0}N#bdWS6N?d180YIK;i*^t( zmNSI>a9_-%f?&OZ{?M;kCebXBh+}xxmA(coA!Lrg!-o%NWQ7CinSm<^3X;u6R3_qG z=o)+9elEgozc>0Ngsd(CqoboU`~_G-2=R|#Fo=ym080oVexhReIRiH+r1gb=bgCbeoJ*4g7uxf&qYsi`TIEcS#DLQ-JRs;H<) dw@gI={{!&aI>1n_kL>^e002ovPDHLkV1l0^kWT;r literal 0 HcmV?d00001 diff --git a/public/item/userbg.png b/public/item/userbg.png new file mode 100644 index 0000000000000000000000000000000000000000..8572ea4036105de240f032a8f9b3bb3fe20f3a3f GIT binary patch literal 960 zcmeAS@N?(olHy`uVBq!ia0y~yV2lQ`ojBNl_sHcl#NCo5DJJuZ`;SvWvF7{No>B7{x z!$VF*(??42<)kaq4o(pamP}IR*=j^WnI||qcv72Xg^{u z4LNeWX0hJmHT{)yeqKBNp8fQhxET-qKF=>czq9z+-Fz(uo~wVD4qWKebzs`a>Y=cW zf%Ax%LgNi46@lmmmL%>84mpfM9i&Pw*cH6}+_bOHw@u?N*AtVQRla{ELx@o0-^XA6 zKRveBO|mvU@#cr0_NjrN3-ylfe6!o+-mmWG`a;k5mZW$_?kuR>S}Y#DVAa-ivuP)f zot*jqxz!HA|3Kcx4-K9=1uP= zn}+Hg{cULbKq>ZjdY5MB+2`fwdhYSZT1S1;lYITE_K4Vuw3jEYZ|+Pi=x&dR-h`btM8%Ys=FN6Y#W)br=*tZzPftkZ~NBkQWp3;+IH+@#)jbk6eMxktrT z=pKKOon { - const users = useRecoilValue(userListState); - //users.slice(0); + const users = useRecoilValue(userListState); + const [searchTerm, setSearchTerm] = useState(''); + + const filteredUsers = users + .filter((user) => + user.name.toLowerCase().includes(searchTerm.toLowerCase()) + ) + .slice(1); // 첫 번째 유저를 제외하고 필터링 return ( -
    - {users.slice(1).map((user) => ( -
  • {user.name}
  • - ))} -
+ <> + setSearchTerm(e.target.value)} + /> +
    + {filteredUsers.map((user) => ( + + + {user.name} + + ))} +
+ ); }; From 0afbe71051f89a4394ff276723f5e9824716d66c Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:26:01 +0900 Subject: [PATCH 58/72] style : chatbottom mask --- src/App.tsx | 11 ++- src/components/NavbarHead.tsx | 1 + src/pages/ChattingList.tsx | 148 +++++++++++++++++++++++++------- src/pages/ChattingRoom.tsx | 42 +++++---- src/pages/Profile.tsx | 28 ++++-- src/style/ChatBottomStyle.tsx | 1 + src/style/ChatHeadStyle.tsx | 5 +- src/style/ChattingRoomStyle.tsx | 7 +- src/style/GlobalStyle.tsx | 1 + 9 files changed, 187 insertions(+), 57 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index bb46c4e..9cc8c8c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,15 @@ import ChatHead from './components/ChatHead'; import ChatBody from './components/ChatBody'; import ChatBottom from './components/ChatBottom'; import GlobalStyle from './style/GlobalStyle'; +import styled from 'styled-components'; +const BottomBackground = styled.div` + bottom: 100px; + background-color: #fffff; + widht: 385px; + height: 300px; + z-index:100; +`; const App = () => { const { pathname } = useLocation(); @@ -18,7 +26,6 @@ const App = () => { return ( <> - {isChattingRoomPage ? ( @@ -36,6 +43,8 @@ const App = () => {
{!isChattingRoomPage && } + + ); }; diff --git a/src/components/NavbarHead.tsx b/src/components/NavbarHead.tsx index 4475fdb..653d5a8 100644 --- a/src/components/NavbarHead.tsx +++ b/src/components/NavbarHead.tsx @@ -15,6 +15,7 @@ const NavbarHeadContainer = styled.div` height: 80px; background: #fffff; padding-top: 30px; + `; const NavbarHeadTexts=styled.div` diff --git a/src/pages/ChattingList.tsx b/src/pages/ChattingList.tsx index 4020eb4..96c11ea 100644 --- a/src/pages/ChattingList.tsx +++ b/src/pages/ChattingList.tsx @@ -1,46 +1,132 @@ -// src/pages/ChattingList.tsx - -import React from 'react'; +import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; import { userListState } from '../state/userState'; -//import { chatListState } from '../state/chatListState'; // 대화 목록 상태 import styled from 'styled-components'; const ChatListContainer = styled.div` - padding: 20px; - display: flex; - flex-direction: column; - align-items: center; + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; + width: 300px; + `; const ChatItem = styled(Link)` - width: 100%; - padding: 10px; - margin: 5px 0; - background-color: #f0f0f0; - color: black; - text-decoration: none; - border-radius: 5px; - white-space: pre-line; - - &:hover { - background-color: #e0e0e0; - } + width: 100%; + padding: 10px; + margin: 5px 0; + background-color: #fffff; + color: black; + text-decoration: none; + border-radius: 5px; + white-space: pre-line; + /*background-image: url('/path/to/background-image.jpg');*/ + display: flex; + align-items: center; + + + &:hover { + background-color: #fffff; + } +`; + +const ProfileImage = styled.img` + width: 50px; + height: 50px; + border-radius: 50%; + margin-right: 20px; +`; + +const ChatDetails = styled.div` + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: flex-start; + width: 100%; + +`; + +const LastMessage = styled.div` + display: flex; + justify-content: space-between; + width: 100%; + font-size: 14px; + color: grey; `; +const MessageTime = styled.span` + font-size: 12px; + color: darkgray; + margin-left: auto; + margin-right: 5px; +`; + +const SearchInput = styled.input` + background-image: url('/item/searchbar.png'); + background-repeat: no-repeat; + width: 260px; + height: 21px; + padding: 10px 43px; + margin-bottom: 0px; + margin-left: 5px; + border: none; +`; + +const getLastMessageAndTime = (userId: string) => { + const messagesString = localStorage.getItem(`messages_${userId}`); + if (messagesString) { + const messages = JSON.parse(messagesString); + if (messages.length > 0) { + const lastMessage = messages[messages.length - 1]; + const messageTime = new Date(lastMessage.date).toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + hour12: true + }); + return { content: lastMessage.content, time: messageTime }; + } + } + return { content: '대화를 시작하지 않았습니다.', time: '' }; +}; + const ChattingList = () => { - const userList = useRecoilValue(userListState); - - return ( -
- {userList.slice(1).map((user) => ( -
- {user.name} -
- ))} -
- ); + const userList = useRecoilValue(userListState); + const [searchTerm, setSearchTerm] = useState(''); + + const filteredUsers = userList + .filter((user) => + user.name.toLowerCase().includes(searchTerm.toLowerCase()) + ) + .slice(1); // 첫 번째 유저를 제외하고 필터링 + + return ( + <> + setSearchTerm(e.target.value)} + /> + + {filteredUsers.map((user) => ( + + + +
{user.name}
+ + {getLastMessageAndTime(user.id).content} + {getLastMessageAndTime(user.id).time} + +
+
+ ))} +
+ + ); }; export default ChattingList; diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index ddd3492..64d4522 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -18,6 +18,15 @@ interface Message { date: string; } +const ChatBottomMask = styled.div` + position: fixed; + bottom: 0; + width: 100%; // 뷰포트 전체 너비 사용 + height: 360px; // ChatBottom의 높이와 동일하게 설정 + background-color: white; // 흰색 배경 + z-index: 1; // ChatBottom보다 낮은 z-index 설정 +`; + const ChattingRoom = () => { const { userId } = useParams<{ userId: string }>(); console.log(useId); @@ -86,21 +95,24 @@ const ChattingRoom = () => { return ( <> - - -
- - sendMessage(content, currentUser?.id ?? '', counterUser?.id ?? '') - } - /> + + + + // 메시지 하단에 흰색 마스크 추가 +
+ + sendMessage(content, currentUser?.id ?? '', counterUser?.id ?? '') + } + /> + ); }; diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index 6a3f3c8..d501fcc 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -32,8 +32,26 @@ const ProfileImage = styled.img` margin-bottom: 20px; `; -const ProfileField = styled.div` +const ProfileFieldName = styled.div` margin: 10px 0; + text-align: center; +font-family: "Noto Sans KR"; +font-size: 24px; +font-style: normal; +font-weight: 500; +line-height: normal; +letter-spacing: 0.33px; +`; + +const ProfileFieldPhone = styled.div` +color: var(--gray, #8D8D8F); +text-align: center; +font-family: "Noto Sans KR"; +font-size: 15px; +font-style: normal; +font-weight: 400; +line-height: normal; +letter-spacing: -0.2px; `; const Input = styled.input` @@ -90,12 +108,12 @@ const Profile = () => { src={profile.image || '/default-profile.png'} alt='프로필 이미지' /> - +
{profile.name}
-
- + +
{profile.phone}
-
+ diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx index 02b1ec2..29e2787 100644 --- a/src/style/ChatBottomStyle.tsx +++ b/src/style/ChatBottomStyle.tsx @@ -10,6 +10,7 @@ export const ChatBottomContainer = styled.div` background-image: url('/item/chatBottom.png'); background-size: cover; + z-index: 2; `; export const ChatInput = styled.input` diff --git a/src/style/ChatHeadStyle.tsx b/src/style/ChatHeadStyle.tsx index 646d544..a0c4346 100644 --- a/src/style/ChatHeadStyle.tsx +++ b/src/style/ChatHeadStyle.tsx @@ -12,6 +12,7 @@ export const ChatHeadContainer = styled.div` flex-shrink: 0; background-image: url('/item/chatHead.png'); background-size: cover; + `; export const UserImage = styled.img` @@ -38,6 +39,6 @@ export const SendButton = styled.img` cursor: pointer; border: none; position: absolute; - margin-top: 28px; - margin-left: 14px; + margin-top: 30px; + margin-left: 10px; `; diff --git a/src/style/ChattingRoomStyle.tsx b/src/style/ChattingRoomStyle.tsx index c8b70ff..5eb6497 100644 --- a/src/style/ChattingRoomStyle.tsx +++ b/src/style/ChattingRoomStyle.tsx @@ -2,8 +2,9 @@ import styled from 'styled-components'; export const ChatRoomContainer = styled.div` width: 375px; - height: 812px; + height: 212px; background: var(--white, #fff); - - + display: flex; + + `; diff --git a/src/style/GlobalStyle.tsx b/src/style/GlobalStyle.tsx index 8b6c87d..bc89290 100644 --- a/src/style/GlobalStyle.tsx +++ b/src/style/GlobalStyle.tsx @@ -3,6 +3,7 @@ import { createGlobalStyle } from 'styled-components'; const GlobalStyle = createGlobalStyle` *{font-family: "Noto Sans KR"}; + `; From a7901bb67e4b0a602ba6daa7b055fdbbffb1f321 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:28:08 +0900 Subject: [PATCH 59/72] =?UTF-8?q?style=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom.tsx | 2 +- src/state/userState.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index 64d4522..84435fb 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -105,7 +105,7 @@ const ChattingRoom = () => { userImage={counterUser?.image ?? ''} currentUser={currentUser?.id ?? currentUser?.id} /> - // 메시지 하단에 흰색 마스크 추가 +
diff --git a/src/state/userState.ts b/src/state/userState.ts index a0fd3dc..54f79ba 100644 --- a/src/state/userState.ts +++ b/src/state/userState.ts @@ -51,6 +51,12 @@ export const userListState = atom({ image: '/item/profile_mini.png', chatHistory: [], }, + { + id: '5', + name: '정모씨', + image: '/item/profile_mini.png', + chatHistory: [], + }, ], }); From 285d80a2f6c2e57e3faad4f8b906072c4b5f86b1 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:32:40 +0900 Subject: [PATCH 60/72] , --- src/App.tsx | 8 +------- src/components/Navbar.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 9cc8c8c..aa1ce6c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -12,13 +12,7 @@ import ChatBottom from './components/ChatBottom'; import GlobalStyle from './style/GlobalStyle'; import styled from 'styled-components'; -const BottomBackground = styled.div` - bottom: 100px; - background-color: #fffff; - widht: 385px; - height: 300px; - z-index:100; -`; + const App = () => { const { pathname } = useLocation(); diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index e0f0ab2..87ab999 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 280px; + bottom: 250px; height: 80px; background: #f0f0f0; padding-top: 30px; @@ -22,9 +22,9 @@ const NavbarLink = styled(Link)` `; const NavButton = styled.img` -position: fixed; -bottom:320px; -margin-left: -35px; + position: fixed; + bottom: 320px; + margin-left: -35px; /* width: 30px; height: 30px; margin-right: 10px; */ From 1dd3fbbcaffc5a54cfd80de269c6d3c563b11b62 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:34:20 +0900 Subject: [PATCH 61/72] , --- src/state/userState.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/state/userState.ts b/src/state/userState.ts index 54f79ba..a0fd3dc 100644 --- a/src/state/userState.ts +++ b/src/state/userState.ts @@ -51,12 +51,6 @@ export const userListState = atom({ image: '/item/profile_mini.png', chatHistory: [], }, - { - id: '5', - name: '정모씨', - image: '/item/profile_mini.png', - chatHistory: [], - }, ], }); From fc11fe488df1faca7a63c0d198134d410c97a9d9 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:34:59 +0900 Subject: [PATCH 62/72] . --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 87ab999..0fa616d 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 250px; + bottom: 280px; height: 80px; background: #f0f0f0; padding-top: 30px; From 1efb92840f218838985e75c0f9753544a89fe44b Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:35:53 +0900 Subject: [PATCH 63/72] . --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 0fa616d..69e0bf0 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -23,7 +23,7 @@ const NavbarLink = styled(Link)` const NavButton = styled.img` position: fixed; - bottom: 320px; + bottom: 280px; margin-left: -35px; /* width: 30px; height: 30px; From 176a02cad517b91a2521aba04cfb782df47e1801 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:36:50 +0900 Subject: [PATCH 64/72] Revert "." This reverts commit 1efb92840f218838985e75c0f9753544a89fe44b. --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 69e0bf0..0fa616d 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -23,7 +23,7 @@ const NavbarLink = styled(Link)` const NavButton = styled.img` position: fixed; - bottom: 280px; + bottom: 320px; margin-left: -35px; /* width: 30px; height: 30px; From 7cf6c18fee4a5afcab8694432238a063893f27b6 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:37:06 +0900 Subject: [PATCH 65/72] Revert "." This reverts commit fc11fe488df1faca7a63c0d198134d410c97a9d9. --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 0fa616d..87ab999 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 280px; + bottom: 250px; height: 80px; background: #f0f0f0; padding-top: 30px; From 231fa5e645031a82bf6f1011433cd6ca569f0903 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:37:42 +0900 Subject: [PATCH 66/72] . --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 87ab999..61dd982 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 250px; + bottom: 220px; height: 80px; background: #f0f0f0; padding-top: 30px; From 28f62ca501b4ebcc1b929578f0673121f80c129c Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:38:38 +0900 Subject: [PATCH 67/72] Update Navbar.tsx --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 61dd982..b7e3f05 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 220px; + bottom: 20px; height: 80px; background: #f0f0f0; padding-top: 30px; From e007ccc3fab464a4d6e9ea7b205aa94e8b9f1675 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:39:36 +0900 Subject: [PATCH 68/72] Update Navbar.tsx --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index b7e3f05..ed1bb40 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -11,7 +11,7 @@ const NavbarContainer = styled.div` font-size: 20px; width: 375px; bottom: 20px; - height: 80px; + height: 50px; background: #f0f0f0; padding-top: 30px; `; From 81f5176a55ee35f74466f6d78620d8a3c932825d Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:40:10 +0900 Subject: [PATCH 69/72] Update Navbar.tsx --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index ed1bb40..1a2acd2 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 20px; + bottom: 220px; height: 50px; background: #f0f0f0; padding-top: 30px; From 7798ebfd06032dfb31e16c4752159dd143ab8f9a Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:41:37 +0900 Subject: [PATCH 70/72] Update Navbar.tsx --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 1a2acd2..ce98b3e 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 220px; + bottom: 260px; height: 50px; background: #f0f0f0; padding-top: 30px; From 47ef2747ef7800ff6cc8bb6ac528cbd6c7e36a42 Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 16:43:22 +0900 Subject: [PATCH 71/72] Update Navbar.tsx --- src/components/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index ce98b3e..2401871 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ const NavbarContainer = styled.div` position: fixed; font-size: 20px; width: 375px; - bottom: 260px; + bottom: 300px; height: 50px; background: #f0f0f0; padding-top: 30px; From 344372b6e6949cc1a359a83eeadc77aaf8b970ab Mon Sep 17 00:00:00 2001 From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com> Date: Sun, 5 May 2024 19:11:05 +0900 Subject: [PATCH 72/72] =?UTF-8?q?fix.=20:=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EB=B0=B0=EC=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChattingRoom.tsx | 70 +++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/pages/ChattingRoom.tsx b/src/pages/ChattingRoom.tsx index 84435fb..38b217c 100644 --- a/src/pages/ChattingRoom.tsx +++ b/src/pages/ChattingRoom.tsx @@ -19,12 +19,12 @@ interface Message { } const ChatBottomMask = styled.div` - position: fixed; - bottom: 0; - width: 100%; // 뷰포트 전체 너비 사용 - height: 360px; // ChatBottom의 높이와 동일하게 설정 - background-color: white; // 흰색 배경 - z-index: 1; // ChatBottom보다 낮은 z-index 설정 + position: fixed; + bottom: 0; + width: 100%; // 뷰포트 전체 너비 사용 + height: 360px; // ChatBottom의 높이와 동일하게 설정 + background-color: white; // 흰색 배경 + z-index: 1; // ChatBottom보다 낮은 z-index 설정 `; const ChattingRoom = () => { @@ -45,17 +45,7 @@ const ChattingRoom = () => { } }, [userId]); // userId가 변경될 때마다 이펙트 재실행 - useEffect(() => { - // 메시지가 추가될 때마다 스크롤을 하단으로 이동 - messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); - }, [messages]); - - // 메세지 목록 끝으로 스크롤 - - // 유저 관리 - // 현재 사용자 상태 관리 - - const userList = useRecoilValue(userListState); + const userList = useRecoilValue(userListState); // 대화 상대방 const otherUser = userList.find((user) => user.id === userId); @@ -67,6 +57,18 @@ const ChattingRoom = () => { let currentUser = userList[currentUserIndex]; let counterUser = userList[counterUserIndex]; + + useEffect(() => { + // 메시지가 추가될 때마다 스크롤을 하단으로 이동 + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages, currentUserIndex, counterUserIndex]); + + // 메세지 목록 끝으로 스크롤 + + // 유저 관리 + // 현재 사용자 상태 관리 + + console.log(currentUser); //console.log(otherUserIndex); @@ -95,24 +97,22 @@ const ChattingRoom = () => { return ( <> - - - - -
- - sendMessage(content, currentUser?.id ?? '', counterUser?.id ?? '') - } - /> - + + + +
+ + sendMessage(content, currentUser?.id ?? '', counterUser?.id ?? '') + } + /> ); };