@teamsparta/chat-ui
Version:
simple chat-ui
132 lines (126 loc) • 3.19 kB
JSX
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>
);
}
}