diff --git a/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessage.tsx b/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessage.tsx index f7d8a9ae..3adcea3e 100644 --- a/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessage.tsx +++ b/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessage.tsx @@ -9,11 +9,11 @@ import type { ChatMessageInfoType } from "@/types/chat"; const ChatMessage = ({ chatMessageInfo }: ChatMessageInfoType) => { return ( - profileImg + profileImg - {chatMessageInfo.sender.nickname} + {chatMessageInfo.senderNickname} {convertToUTC(new Date(chatMessageInfo.sendTime)).date} diff --git a/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessageMine.tsx b/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessageMine.tsx index f9cb8306..14f15eed 100644 --- a/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessageMine.tsx +++ b/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatMessage/ChatMessageMine.tsx @@ -11,7 +11,7 @@ const ChatMessageMine = ({ chatMessageInfo }: ChatMessageInfoType) => { - {chatMessageInfo.sender.nickname} + {chatMessageInfo.senderNickname} {convertToUTC(new Date(chatMessageInfo.sendTime)).date} diff --git a/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatRoomContent.tsx b/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatRoomContent.tsx index 0dfd2510..3fc3aaf4 100644 --- a/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatRoomContent.tsx +++ b/packages/waggle-service/src/components/Connection/Chat/ChatRoomContent/ChatRoomContent.tsx @@ -1,4 +1,4 @@ -import { Fragment, useContext, useEffect, useState } from "react"; +import { Fragment, useContext, useEffect, useState, useRef } from "react"; import { Client } from "@stomp/stompjs"; @@ -15,8 +15,9 @@ import { ACCESS_TOKEN_KEY } from "@/constants/api"; import { useChatMessageListQuery } from "@/hooks/api/chat/useChatMessageListQuery"; import { useMemberInfoSaveQuery } from "@/hooks/api/member/useMemberInfoSaveQuery"; +import useObserver from "@/hooks/common/useObserver"; -// import type { ChatMessageType } from "@/types/chat"; +import type { ChatMessageType } from "@/types/chat"; import { chattingContentBoxStyle, @@ -39,16 +40,46 @@ const ChatRoomContent = () => { const { chatRoomId } = context; - const { chatMessageListData } = useChatMessageListQuery(chatRoomId); + const { chatMessageListData, fetchNextPage, hasNextPage, isFetching } = + useChatMessageListQuery(chatRoomId); - const { userUrl, memberId } = useMemberInfoSaveQuery(); + const observeRef = useObserver(async (entry, observer) => { + observer.unobserve(entry.target); - // const [messages, setMessages] = useState([]); + if (hasNextPage && !isFetching) { + fetchNextPage(); + } + }); + + const chatRef = useRef(null); + + const { userUrl } = useMemberInfoSaveQuery(); + + const [messages, setMessages] = useState([]); const [stompClient, setStompClient] = useState(null); const [newMessage, setNewMessage] = useState(""); const accessToken = localStorage.getItem(ACCESS_TOKEN_KEY); + const sendMessage = () => { + if (!stompClient) return; + + const chatMessage: ChatMessageRequest = { + chatMessageType: "TALK", + chatRoomId, + senderUserUrl: userUrl, + content: newMessage, + }; + + stompClient.publish({ + destination: "/publish/message", + body: JSON.stringify(chatMessage), + headers: { Authorization: `Bearer ${accessToken}` }, + }); + + setNewMessage(""); + }; + useEffect(() => { const client = new Client({ brokerURL: import.meta.env.VITE_SOCKET_URL, @@ -61,8 +92,6 @@ const ChatRoomContent = () => { // }, }); - setStompClient(client); - client.activate(); client.onConnect = () => { @@ -70,52 +99,41 @@ const ChatRoomContent = () => { `/subscribe/${chatRoomId}`, (message) => { const msg = JSON.parse(message.body); - console.log(msg); - // setMessages((prev) => [...prev, msg]); - // console.log(JSON.parse(message.body)); + setMessages((prev) => [msg, ...prev]); }, { Authorization: `Bearer ${accessToken}` } ); }; + setStompClient(client); + return () => { if (stompClient && stompClient.connected) { stompClient.deactivate(); } }; - }, []); + }, [chatRoomId]); - // const recvMessage = () => { - - // } - - const sendMessage = () => { - if (!stompClient) return; - - const chatMessage: ChatMessageRequest = { - chatMessageType: "TALK", - chatRoomId, - senderUserUrl: userUrl, - content: newMessage, - }; - - stompClient.publish({ - destination: "/publish/message", - body: JSON.stringify(chatMessage), - headers: { Authorization: `Bearer ${accessToken}` }, - }); - - setNewMessage(""); - }; + useEffect(() => { + !hasNextPage && + chatMessageListData.pages.forEach((value) => { + setMessages((prev) => [...value.result.chatMessages, ...prev]); + }); + }, [chatMessageListData]); return ( - - {chatMessageListData.pages.map((chatMessageData) => ( + +
+ {/* {chatMessageListData.pages.map((chatMessageData) => ( {chatMessageData.result.chatMessages.map((chatMessageInfo) => ( - {chatMessageInfo.sender.memberId === memberId ? ( + {chatMessageInfo.senderUserUrl === userUrl ? ( ) : ( @@ -123,11 +141,18 @@ const ChatRoomContent = () => { ))} - ))} - {/* {messages.map((data) => ( - ))} */} + {messages.map((chatMessageInfo, index) => ( + + {chatMessageInfo.senderUserUrl === userUrl ? ( + + ) : ( + + )} + + ))} +