diff --git a/src/api/service/chat-service/index.ts b/src/api/service/chat-service/index.ts index 3bdeea6d..a6e01732 100644 --- a/src/api/service/chat-service/index.ts +++ b/src/api/service/chat-service/index.ts @@ -5,6 +5,8 @@ import { GetChatMessagesParams, GetChatMessagesResponse, GetChatRoomsResponse, + ReadMessagesParams, + ReadMessagesResponse, } from '@/types/service/chat'; export const chatServiceRemote = () => ({ @@ -27,4 +29,9 @@ export const chatServiceRemote = () => ({ }, }); }, + + // 메세지 읽음 처리 + readMessages: async ({ roomId }: ReadMessagesParams) => { + return apiV1.put(`/chat/rooms/${roomId}/read`); + }, }); diff --git a/src/app/chat/[roomId]/ChatRoomPage.tsx b/src/app/chat/[roomId]/ChatRoomPage.tsx index b204bce6..193e3ba1 100644 --- a/src/app/chat/[roomId]/ChatRoomPage.tsx +++ b/src/app/chat/[roomId]/ChatRoomPage.tsx @@ -6,6 +6,7 @@ import { DEFAULT_PROFILE_IMAGE } from 'constants/default-images'; import { ChatHeader, ChatInput, MyChat, OtherChat } from '@/components/pages/chat'; import { UserList } from '@/components/pages/chat/chat-user-list'; import { useGetChatMessages } from '@/hooks/use-chat'; +import { useReadMessages } from '@/hooks/use-chat/use-chat-read'; import { useChatSocket } from '@/hooks/use-chat/use-chat-socket'; import { ChatMessage } from '@/types/service/chat'; @@ -82,14 +83,9 @@ interface IProps { const ChatRoomPage = ({ accessToken, roomId, userId }: IProps) => { const [isUserListOpen, setIsUserListOpen] = useState(false); const [chatMessages, setChatMessages] = useState([]); - const { data: previousMessages } = useGetChatMessages(roomId); - - useEffect(() => { - if (!previousMessages) return; - // eslint-disable-next-line react-hooks/set-state-in-effect - setChatMessages([...previousMessages.messages].reverse()); - }, [previousMessages]); + const { data: previousMessages } = useGetChatMessages(roomId); + const { mutate: readMessages } = useReadMessages(roomId, userId); const { messages: newMessages, sendMessage, @@ -103,6 +99,19 @@ const ChatRoomPage = ({ accessToken, roomId, userId }: IProps) => { setChatMessages((prev) => [...prev, message]); }, }); + + useEffect(() => { + if (!isConnected) return; + + readMessages(); + }, [isConnected, readMessages, newMessages]); + + useEffect(() => { + if (!previousMessages) return; + // eslint-disable-next-line react-hooks/set-state-in-effect + setChatMessages([...previousMessages.messages].reverse()); + }, [previousMessages]); + console.log(newMessages); const handleSubmit = (text: string) => { diff --git a/src/components/pages/chat/chat-list/index.tsx b/src/components/pages/chat/chat-list/index.tsx index 2e892d16..d027d2ac 100644 --- a/src/components/pages/chat/chat-list/index.tsx +++ b/src/components/pages/chat/chat-list/index.tsx @@ -2,6 +2,9 @@ import Image from 'next/image'; import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; + +import { useQueryClient } from '@tanstack/react-query'; import { DEFAULT_PROFILE_IMAGE } from 'constants/default-images'; import { useGetChatList } from '@/hooks/use-chat/use-chat-list'; @@ -15,13 +18,20 @@ interface IProps { export const ChatList = ({ userId }: IProps) => { const router = useRouter(); - + const queryClient = useQueryClient(); const handleClick = (chatId: number) => { router.push(`/chat/${chatId}`); }; const { data: chatList } = useGetChatList({ userId }); + console.log(chatList); + // 현재 방식은 tanstack query를 이용해서 단지 목록 조회 + // but, 소켓 통신을 하고 있는 상황이므로 목록 역시 소켓을 열어서 페이지에 머물러 있을 때도 실시간으로 확인 가능하도록 + useEffect(() => { + queryClient.invalidateQueries({ queryKey: ['chatList', userId] }); + }, [chatList, userId]); + return (