๐ Task TODOLIST
- [x] ๋ง์ง๋ง ๋ฉ์ธ์ง ์ ์ฅํ๋ table ๋ง๋ค๊ธฐ
- [x] ์ปดํฌ๋ํธ mount ์ ์ด์ ๋ง์ง๋ง ๋ฉ์ธ์ง ๊ฐ์กฐ์ฒ๋ฆฌ
- [x] ์ปดํฌ๋ํธ unmount ์ ๋ง์ง๋ง ๋ฉ์ธ์ง ๊ธฐ์ต
โจ ๊ฐ๋ฐ ๋ด์ฉ
1. ๋ง์ง๋ง ๋ฉ์ธ์ง ์ ์ฅํ๋ table ๋ง๋ค๊ธฐ
Why(์ด์ )
๊ธฐ์กด ์ฑํ ๊ณผ ๊ด๋ จ๋ messages์ chatting_room ์ด๋ผ๋ 2๊ฐ์ table์ด ์์์ง๋ง,
๋ง์ง๋ง ๋ฉ์ธ์ง๋ ์ ์ ๋ง๋ค ๊ณ ์ ํ๊ณ ๋ค๋ฅธ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด table์ ์์ฑํ๋ ๊ฒ ๋ซ๋ค๋ ํ๋จ
what(๊ฒฐ๊ณผ)
remember_last_msg๋ผ๋ table์ ๋ง๋ค๊ณ ๊ตฌ์ฑ์์์ ๊ฐ type์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ๋ค.
2. ์ปดํฌ๋ํธ mount ์ ์ด์ ๋ง์ง๋ง ๋ฉ์ธ์ง ๊ฐ์กฐ์ฒ๋ฆฌ
Why(์ด์ )
๋ง์ง๋ง ๋ฉ์ธ์ง๊ฐ ๋ฌด์์ธ์ง ๊ทธ ๋ฉ์ธ์ง์ ๋ฐฐ๊ฒฝ์ ์ ํ๊ธฐ + ํ๋จ์ ๋ฌธ๊ตฌ ์ถ๊ฐ + ํด๋น div๊น์ง ์คํฌ๋กค ํ๊ณ ์ถ์๋ค.
How(๊ณผ์ )
(1) useEffect ์ ์์กด์ฑ ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด๋ก ํ์ฌ ์ฒ์ mount ์, DB์ ์ ์ฅ๋ ๋ง์ง๋ง ๋ฉ์ธ์ง์ id์ ์ผ์นํ๋ ๋ฉ์ธ์ง div๋ฅผ ๊ฐ์กฐ์ฒ๋ฆฌ ํ๋ค.
(2) ๊ฐ์กฐ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ๊ฐ ๋ฉ์ธ์ง์ ์ฐธ์กฐ๊ฐ ํ์ํ๋ค. useRef๋ก messages๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ๋ฃ์ ๋ค,
๊ฐ ๋ฉ์ธ์ง div์ ref๊ฐ์ ๋ถ์ฌํ๋ค.
const lastDivRefs = useRef(messages);
const ChatList = ({ user, chatRoomId }: { user: User | null; chatRoomId: string }) => {
return (
<>
{messages &&
messages.map((msg, idx) => (
<div key={msg.message_id} className="w-full">
{isNextDay(idx, messages) ? (
<div className="flex justify-center my-[16px] bg-[#D4D4D8] mx-auto w-36 px-[16px] py-[6px] rounded-full text-white">
<p className="font-extralight tracking-wide text-sm">{showingDate(msg.created_at)}</p>
</div>
) : null}
{msg.send_from === user?.id ? (
<MyChat msg={msg} idx={idx} lastDivRefs={lastDivRefs} /> -----> *
)
const MyChat = ({ msg, idx, lastDivRefs }: { msg: Message; idx: number; lastDivRefs: any }) => {
return (
<>
// ๊ฐ div์ ref๊ฐ ๋ถ์ฌ
<div id={msg.message_id} ref={lastDivRefs.current[idx]} className="flex gap-[8px] justify-end">
<div className="w-80 flex flex-col gap-1">
...
(3) ์์ผ๋ฉด ํด๋น ๋ฉ์ธ์ง๋ฅผ ๊ฐ์กฐ์ฒ๋ฆฌํ๋ค.
๋ง์ฝ ๋ง์ง๋ง์ผ๋ก ์ฝ์ ๋ฉ์ธ์ง๊ฐ ์ค์ ๋ง์ง๋ง ๋ฉ์ธ์ง๋ผ๋ฉด ๊ฐ์กฐ์ฒ๋ฆฌ ํ์ง ์๋๋ค.
๋ง์ฝ ๋ด๊ฐ ์ฐพ๋ ๋ง์ง๋ง ๋ฉ์ธ์ง์ id๊ฐ ํ๋ฉด์ ์๋ค๋ฉด ๊ทธ๋ฅ ์คํฌ๋กค ๋ค์ด.
// ์ฌ๊ธฐ๊น์ง ์ฝ์ผ์
จ์ต๋๋ค(์ฒ์ ๋ง์ดํธ ์์๋ง ์คํ)
useEffect(() => {
const scrollBox = scrollRef.current;
if (scrollBox && messages) {
// DB์ ๋ง์ง๋ง ๋ฉ์ธ์ง๋ก ์ ์ฅ๋ ๋ฉ์ธ์ง์ id๊ฐ ๋์ผํ div ๊ฐ ์๋ค๋ฉด ๊ฐ์กฐ์ฒ๋ฆฌ
const lastMsgValue = lastDivRefs?.current?.find((ref) => ref.message_id === lastMsgId);
const lastDiv = lastMsgValue && (lastMsgValue as any).current;
if (lastMsgId && lastMsgId !== messages[messages.length - 1].message_id && lastDiv) {
setLastCheckedDiv(lastDiv);
styleHere(lastDiv);
setIsScrolling(true);
} else {
// ๊ทธ ์ธ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํฌ๋กค ๋ค์ด
scrollBox.scrollTop = scrollBox.scrollHeight;
setCheckedLastMsg(true);
}
}
}, [lastMsgId]);
const styleHere = (lastDiv: HTMLElement) => {
lastDiv.style.backgroundColor = '#F2EAFA';
lastDiv.style.borderRadius = '5px';
lastDiv.scrollIntoView({ block: 'center' });
};
๐จ TroubleShotting
(1) ์ฒ์ mount ์ ์ฌ๊ธฐ๊น์ง ์ฝ์ผ์ จ์ต๋๋ค ๊ฐ์กฐ์ฒ๋ฆฌ๋ฅผ ๋ณด๊ณ , ๋ด๊ฐ ์คํฌ๋กค ๋ค์ด์ ํ์ง๋ ์์๋๋ฐ ์คํฌ๋กค ๋ค์ด์ด ๋์ด๋ฒ๋ฆฌ๋ ์ด์๊ฐ ์์๋ค.
Why(์ด์ )
๊ฐ์กฐ์ฒ๋ฆฌ๊ฐ ๋ ๊ฑธ ๋ณด๊ณ ๋ด๊ฐ ์คํฌ๋กค๋ค์ด ํ๋ ๊ทธ ์ฌ์ด์ ์๊ฐ์ ์ก์์ค state๊ฐ ์์๊ธฐ ๋๋ฌธ์, ๊ฐ์กฐ์ฒ๋ฆฌ์ ์คํฌ๋กค ๋ค์ด์ด ์์ฐจ์ ์ผ๋ก ์๋์ผ๋ก ์คํ๋ ๊ฒ์ด ์์ธ์ด์๋ค.
How(๊ณผ์ )
checkedLastMsg ๋ผ๋ state๋ฅผ ํ๋ ๋ง๋ค์ด์, ์ฌ๊ธฐ๊น์ง ์ฝ์์ต๋๋ค ๊ฐ์กฐ์ฒ๋ฆฌ๋ฅผ ํ์ธํ๋์ง ํ๋จํ๊ณ ,
์คํฌ๋กค ๋ค์ด์ ํ๋ ๊ทธ ์ฌ์ด ์์ ์ ์ปจํธ๋กค ํ๋ค.
const [checkedLastMsg, setCheckedLastMsg] = useState(false);
// ์คํฌ๋กค ๋ค์ด
useEffect(() => {
const scrollBox = scrollRef.current;
if (!isScrolling && messages) {
// ๋ง์ง๋ง์ผ๋ก ์ฝ์ ๋ฉ์ธ์ง(lastCheckedDiv)๊ฐ ํ๋ฉด์ ์์ ๋
if (lastCheckedDiv) {
// ๊ฐ์กฐ์ฒ๋ฆฌ๋ฅผ ๋ณด๊ณ ๋ ๋ค ์คํฌ๋กค์ ๋งจ ์๋๋ก ๋ด๋ฆฌ๋ฉด ๊ฐ์กฐ์ฒ๋ฆฌ ํด์
if (!checkedLastMsg) {
setCheckedLastMsg(true);
lastCheckedDiv.style.backgroundColor = '';
} else if (checkedLastMsg && prevMsgsLengthRef.current !== messages.length) {
// ๊ฐ์กฐ์ฒ๋ฆฌ๋ฅผ ๋ณด๊ณ ๋์ผ๋ง ํ์ธ์ผ๋ก๋ถํฐ ์๋ก์ด ๋ฉ์ธ์ง๊ฐ ์ถ๊ฐ๋์์ ๋ ์คํฌ๋กค ๋ค์ด๋๋๋ก
scrollBox.scrollTop = scrollBox.scrollHeight;
prevMsgsLengthRef.current = messages.length;
}
} else if (prevMsgsLengthRef.current !== messages.length || count === 0) {
// ์ด์ ๋ฉ์ธ์ง๊ฐ ํ๋ฉด์ ์๊ณ + ์๋ก์ด ๋ฉ์ธ์ง๊ฐ ์ถ๊ฐ๋๋ฉด ์คํฌ๋กค ๋ค์ด์ด ๋ฐ๋ผ๊ฐ๋๋ก
scrollBox.scrollTop = scrollBox.scrollHeight;
prevMsgsLengthRef.current = messages.length;
}
}
}, [messages, isScrolling]);
๐ธ ์คํฌ๋ฆฐ์ท
๊ฒฝ์ฐ์ ์ ์ง์ฅ์ด์๋ค.....
์์ค ๋จธ๋ฆฌ์ผ..