결과

full code
https://github.com/suminllll/chatting-sample
내용
- 채팅방에 들어가면 전에 대화했던 내용이 그대로 불러와짐
- 이전내용 중에 내가 친 메세지들은 오른쪽에 표시
- 채팅을 치면 내가 보낸 메세지는 오른쪽으로 출력
코드
client
const { user } = useGuard();
const [messages, setMessages] = useState([]);
const [messages, setMessages] = useState([]);
useEffect(() => {
new Promise(async (res, rej) => {
const url = `/rooms/chat/${props.roomNo}/message`;
const result = await httpRequest("GET", url);
const data = result.data;
if (result.success) {
data.map((data) => {
if (data.member_no === user?.member_no) {
data.isMyMessage = true;
return data;
} else {
return data;
}
});
setMessages(data);
}
});
}, [user]);
socket.on("/rooms/message", (data) => {
console.log(
"서버에서 채팅내용 받기",
data.data,
data.data.memberNo,
user?.member_no
);
const notice = {
...data.data,
isMyMessage:
data.data.memberNo === user?.member_no &&
data.data?.type === "USER_TEXT",
};
setMessages((messages) => [...messages, notice]);
});
const handleMessage = (e) => {
e.preventDefault();
setMessage(e.target.value);
};
const handleSend = () => {
if (message) {
if (message.length === 0) {
alert("채팅 내용을 입력해주세요.");
return;
}
socket.emit("/rooms/message", {
chat: message,
roomNo: props.roomNo,
memberNo: user?.member_no,
nick: user?.nick,
type: "USER_TEXT",
});
setIsTyping(false);
setMessage("");
}
};
return(
<>
<div key={key} className="chat_otherMsg">
<div className={isMyMessage ? "myMsg" : "otherMsg"}>
<div className="imgBox">
<img alt="profileImg" src="/img/profile.jpeg" />
</div>
<div style={{ flex: 1 }} />
<ul className="chat_chatWrap">
<div className="chat_chatBox">
<li className={isMyMessage ? "chat_my_profileName" : "profileName"}>
{nick}
</li>
<li className="time">{time}</li>
</div>
<li className="chat_chatList">{chat}</li>
</ul>
</div>
</div>
<div className="chatInputWrap">
<input
className="chatInput"
placeholder="Write a message.."
onChange={handleMessage}
onKeyUp={handleEnterOnMessage}
value={message}
/>
<button className="sendButton" onClick={handleSend}>
Send
</button>
</div>
</>
)
server
socket.on("/rooms/message", (data) => {
console.log("채팅받음", data);
const { roomNo, memberNo, chat } = data;
_db
.qry(
`INSERT INTO chat(member_no, room_no, chat, sended) VALUES (:memberNo, :roomNo, :chat, now())`,
data
)
.then(() => {
io.in(roomNo).emit("/rooms/message", { data });
});
});