diff --git a/project/frontend/src/components/channel/ChannelMessageBox.tsx b/project/frontend/src/components/channel/ChannelMessageBox.tsx index 88a94f91..b75c0373 100644 --- a/project/frontend/src/components/channel/ChannelMessageBox.tsx +++ b/project/frontend/src/components/channel/ChannelMessageBox.tsx @@ -1,8 +1,11 @@ -import { unwrap } from '@/api/unwrap'; import { ApiContext } from '@/app/_internal/provider/ApiContext'; -import { useCallback, useContext } from 'react'; -import { useQuery } from 'react-query'; -import { MessageContent, messageType } from '../dm/message/MessageContent'; +import useChannelMessage from '@/hooks/chat/useChannel'; +import { useContext } from 'react'; +import { + MessageContent, + MessageContentInterface, + messageType, +} from '../dm/message/MessageContent'; import { MessageSendBox } from '../dm/message/MessageSendBox'; import { ChannelInfo } from './ChannelInfo'; @@ -11,21 +14,15 @@ export function ChannleMessageBox({ }: Readonly<{ channelId: string }>) { const { api } = useContext(ApiContext); - const { isLoading, isError, data } = useQuery( - 'channelInfo', - useCallback( - async () => unwrap(await api.channelControllerFindChannelInfo(channelId)), - [api, channelId], - ), - ); + const { channelInfo, isLoading, channelMessage } = + useChannelMessage(channelId); if (isLoading) return
Loading...
; - if (isError || !data) return

알 수 없는 에러

; const localMe = localStorage.getItem('me'); const me = localMe ? JSON.parse(localMe) : null; - const myAuthority: any = data.members.filter((mem: any) => { + const myAuthority: any = channelInfo?.members.filter((mem: any) => { return mem.memberId === me?.id; }); if (isLoading) return
Loading...
; @@ -34,7 +31,7 @@ export function ChannleMessageBox({ <> @@ -42,6 +39,7 @@ export function ChannleMessageBox({ channelId={channelId} type={messageType.CHANNEL} myNickname={me?.nickname} + initData={channelMessage as MessageContentInterface[]} /> diff --git a/project/frontend/src/components/dm/message/MessageBox.tsx b/project/frontend/src/components/dm/message/MessageBox.tsx index f4b5a5d2..b39c45cb 100644 --- a/project/frontend/src/components/dm/message/MessageBox.tsx +++ b/project/frontend/src/components/dm/message/MessageBox.tsx @@ -1,7 +1,4 @@ -import { unwrap } from '@/api/unwrap'; -import { ApiContext } from '@/app/_internal/provider/ApiContext'; -import { useCallback, useContext } from 'react'; -import { useQuery } from 'react-query'; +import useDirectMessage from '@/hooks/chat/useDirectMessage'; import { MessageContent, messageType } from './MessageContent'; import { MessageSendBox } from './MessageSendBox'; import { UserInfo } from './UserInfo'; @@ -13,35 +10,32 @@ export function MessageBox({ readonly username: string; readonly channelId: string; }) { - const { api } = useContext(ApiContext); - const { isLoading, isError, data } = useQuery( - 'userByNickanme', - useCallback( - async () => unwrap(await api.usersControllerGetUsetByNickname(username)), - [api, username], - ), + const { isLoading, dmInfo, channelMessage } = useDirectMessage( + channelId, + username, ); - if (isLoading) return
로딩중... 👾
; - if (isError || !data) return

알 수 없는 에러

; + if (isLoading || !dmInfo) return
로딩중... 👾
; const localMe = localStorage.getItem('me'); const me = localMe ? JSON.parse(localMe) : null; + console.log(channelMessage); return ( <> - + ); } diff --git a/project/frontend/src/components/dm/message/MessageContent.tsx b/project/frontend/src/components/dm/message/MessageContent.tsx index fd9ebb3e..4f80c134 100644 --- a/project/frontend/src/components/dm/message/MessageContent.tsx +++ b/project/frontend/src/components/dm/message/MessageContent.tsx @@ -1,5 +1,5 @@ -import { useInitMessage } from '@/hooks/useInitMessage'; -import { useSocket } from '@/hooks/useSocket'; +import useInfScroll from '@/hooks/chat/useInfScroll'; +import { useSocket } from '@/hooks/chat/useSocket'; import { useEffect, useRef, useState } from 'react'; import { MyChat } from './MyChat'; import { OtherChat } from './OtherChat'; @@ -26,41 +26,69 @@ export interface MessageContentInterface { const isSystemMessage = (message: { type: string }) => ['leave', 'join'].includes(message.type); -const isMySessage = ( +const isMyMessage = ( msg1: { data: { member: { nickname: string } } }, msg2: { data: { member: { nickname: string } } }, ) => msg1.data.member.nickname === msg2.data.member.nickname; const calIsFirst = ( - mesaageList: { type: string; data: { member: { nickname: string } } }[], + messageList: { type: string; data: { member: { nickname: string } } }[], idx: number, -) => - idx === 0 || - isSystemMessage(mesaageList[idx - 1]) || - !isMySessage(mesaageList[idx - 1], mesaageList[idx]); +): boolean => { + if (idx === 0) return true; + const targetIndex = + messageList[idx - 1].type === 'scroll-target' ? idx - 2 : idx - 1; + return ( + isSystemMessage(messageList[targetIndex]) || + !isMyMessage(messageList[targetIndex], messageList[idx]) + ); +}; + +let render = { isSocketRender: true }; export function MessageContent({ channelId, type, myNickname, + initData, targetName, }: Readonly<{ channelId: string; type: messageType; myNickname: string; + initData: MessageContentInterface[]; targetName?: string; }>) { - const [messages, setMessages] = useState([]); - const messageEndRef = useRef(null); - useInitMessage(type, setMessages, channelId, targetName); - useSocket(type, setMessages, channelId, targetName); - + const [messages, setMessages] = useState(initData); + const [isLastPage, setIsLastPage] = useState(false); + const scrollTargetRef = useRef(null); + const messageStartRef = useRef(null); + useSocket(type, setMessages, channelId, targetName, render); + useInfScroll( + messageStartRef, + setMessages, + messages, + type, + channelId, + isLastPage, + setIsLastPage, + render, + targetName, + ); + useEffect(() => { + setMessages(initData); + }, [initData, channelId]); useEffect(() => { - messageEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + scrollTargetRef.current?.scrollIntoView({ behavior: 'auto' }); }, [messages]); - + render.isSocketRender = false; + console.log('messages : ', messages); + console.log('initmessage : ', initData); return (
+
{messages.map((message, idx) => { + if (message.type === 'scroll-target') + return
; if (message.type === 'leave' || message.type === 'join') { return (
); } diff --git a/project/frontend/src/components/dm/message/MyChat.tsx b/project/frontend/src/components/dm/message/MyChat.tsx index 40944b71..dbdbc316 100644 --- a/project/frontend/src/components/dm/message/MyChat.tsx +++ b/project/frontend/src/components/dm/message/MyChat.tsx @@ -9,8 +9,8 @@ export function MyChat({ return (

{message}

diff --git a/project/frontend/src/components/dm/message/OtherChat.tsx b/project/frontend/src/components/dm/message/OtherChat.tsx index 5784d144..1d99c8a4 100644 --- a/project/frontend/src/components/dm/message/OtherChat.tsx +++ b/project/frontend/src/components/dm/message/OtherChat.tsx @@ -55,10 +55,10 @@ export function OtherChat({ setGameMode={toggleGameMode} /> -
+
{isFirst === true ? (