UNPKG

@teamsparta/chat-ui

Version:
132 lines (126 loc) 3.19 kB
import React, { useEffect } from "react"; import * as S from "./ChatArea.style"; import { formatDate, formatTime } from "../common/date"; import MessageFeedback from "./MessageFeedback"; const ChatArea = ({ initialImage, useRef, handleThumbUp, handleThumbDown, messages, scrollToBottom, theme, }) => { useEffect(() => { scrollToBottom(); }, [messages]); const groupedMessages = groupMessagesByDate(messages); return ( <S.ChatArea ref={useRef} theme={theme}> {Object.keys(groupedMessages).map((date, index) => renderMessagesForDate( index, initialImage, handleThumbUp, handleThumbDown, date, groupedMessages[date], theme, ), )} </S.ChatArea> ); }; export default ChatArea; function groupMessagesByDate(messages) { const grouped = {}; messages.forEach((message) => { const date = formatDate(message.date); if (!grouped[date]) { grouped[date] = []; } grouped[date].push(message); }); return grouped; } function renderMessagesForDate( index, initialProfileImage, handleThumbUp, handleThumbDown, date, messages, theme, ) { return ( <div key={index}> {date !== "undefined" && ( <S.DateTextContainer> <S.DateTextLine theme={theme} /> <S.DateText>{date}</S.DateText> <S.DateTextLine theme={theme} /> </S.DateTextContainer> )} {messages.map((message, index) => renderMessages( initialProfileImage, handleThumbUp, handleThumbDown, message, index, theme, ), )} </div> ); } function renderMessages( initialProfileImage, handleThumbUp, handleThumbDown, message, index, theme, ) { if (message.role === "peer") { return ( /* 세로로 단락 구분하는 컨테이너 */ <S.PeerChatBubbleContainer key={index}> <S.ProfileImage src={message.profileSrc ? message.profileSrc : initialProfileImage} /> <S.ColumnContainer key={index}> <S.FlexContainer> <S.WhiteChatBubble theme={theme}> {message.content} </S.WhiteChatBubble> <S.TimeStamp> {formatTime(message.date.getHours(), message.date.getMinutes())} </S.TimeStamp> </S.FlexContainer> <MessageFeedback theme={theme} handleThumbUp={handleThumbUp} handleThumbDown={handleThumbDown} /> {/* 여기1*/} </S.ColumnContainer> </S.PeerChatBubbleContainer> ); } else if (message.role === "user") { return ( <S.UserChatBubbleContainer key={index}> <S.TimeStamp> {formatTime(message.date.getHours(), message.date.getMinutes())} </S.TimeStamp> <S.RedChatBubble theme={theme}>{message.content}</S.RedChatBubble> </S.UserChatBubbleContainer> ); } else if (message.role === "custom") { return ( <S.CustomChatBubbleContainer key={index}> {message.content} </S.CustomChatBubbleContainer> ); } }