const unreadCount = async (room_id: string) => {
let { data: chat_messages, error } = await supabase
.from('chat_messages')
.select()
.eq('chat_room_id', room_id)
.eq('isNew', false);
return chat_messages?.length
};
결국 state를 하나 만들어 채팅방 리스트 UI를 map으로 그릴 때
index에 따라서 착착 들어가도록 했다.
mount 시 채팅방 목록 state가 생성되면,
그 채팅방 데이터들을 순회하며 읽지 않은 메세지를 unread state에 저장해둔다!
useEffect(() => {
// 각 채팅방 목록이 업데이트될 때마다 안 읽은 메세지 수를 가져오고 상태에 저장
if (rooms) {
Promise.all(rooms.map((room) => unreadCount(room.id))).then((counts) => {
setUnread(counts);
});
}
}, [rooms]);
// 채팅방 목록 UI
<ChatList>
// 채팅방 state를 map으로 순회하며 UI를 그린다.
{rooms?.map((room, i) => {
// ... 생략 ///
return (
// 채팅방 UI
<ListRoom>
// 채팅방 목록을 따라 각 방마다 안 읽은 메세지를 정리해 놓은
// unread[index]로 배치한다.
// 그럼 각 방에 대한 읽지 않은 메세지 수가 차례대로 ![](https://velog.velcdn.com/images/waffle_bear/post/febaf566-2e43-40ed-9dfb-b8b68b4213f6/image.gif)
나온다
<p> 새 메세지: {unread && unread[i]} </p>
</ListRoom>
);
})}
</ChatList>