You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/web/src/components/ChatBox/ChatMessageList/index.tsx

57 lines
1.6 KiB
TypeScript

import React from 'react';
import {
ChatMessage,
getMessageTimeDiff,
shouldShowMessageTime,
} from 'pawchat-shared';
import { ChatMessageItem } from './Item';
import { Divider } from 'antd';
interface ChatMessageListProps {
messages: ChatMessage[];
}
export const ChatMessageList: React.FC<ChatMessageListProps> = React.memo(
(props) => {
return (
<div className="flex-1 overflow-y-scroll">
{props.messages.map((message, index, arr) => {
let showDate = true;
let showAvatar = true;
const messageCreatedAt = new Date(message.createdAt ?? '');
if (index > 0) {
// 当不是第一条数据时
// 进行时间合并
const prevMessage = arr[index - 1];
if (
!shouldShowMessageTime(
new Date(prevMessage.createdAt ?? ''),
messageCreatedAt
)
) {
showDate = false;
}
// 进行头像合并(在同一时间块下)
if (showDate === false) {
showAvatar = prevMessage.author !== message.author;
}
}
return (
<div key={message._id}>
{showDate && (
<Divider className="text-sm opacity-40 px-6 font-normal select-none">
{getMessageTimeDiff(messageCreatedAt)}
</Divider>
)}
<ChatMessageItem showAvatar={showAvatar} payload={message} />
</div>
);
})}
</div>
);
}
);
ChatMessageList.displayName = 'ChatMessageList';