| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | 
							- import React, { useMemo, useEffect, ReactElement } from 'react';
 
- import cls from 'classnames';
 
- import type { ChatBoxProps } from '../interface';
 
- import ChatBoxAvatar from './chatBoxAvatar';
 
- import ChatBoxTitle from './chatBoxTitle';
 
- import ChatBoxContent from './chatBoxContent';
 
- import ChatBoxAction from './chatBoxAction';
 
- import { cssClasses, strings } from '@douyinfe/semi-foundation/chat/constants';
 
- const { PREFIX_CHAT_BOX } = cssClasses;
 
- const { ROLE, CHAT_ALIGN } = strings;
 
- const ChatBox = React.memo((props: ChatBoxProps) => {
 
-     const { message, lastChat, align, toast, mode,
 
-         roleConfig, 
 
-         onMessageBadFeedback, 
 
-         onMessageGoodFeedback,
 
-         onMessageCopy, 
 
-         onChatsChange,
 
-         onMessageDelete,
 
-         onMessageReset,
 
-         chatBoxRenderConfig = {}, 
 
-         customMarkDownComponents,
 
-         previousMessage,
 
-         markdownRenderProps
 
-     } = props;
 
-     const { renderChatBoxAvatar, renderChatBoxAction, 
 
-         renderChatBoxContent, renderChatBoxTitle,
 
-         renderFullChatBox
 
-     } = chatBoxRenderConfig;
 
-     const continueSend = useMemo(() => {
 
-         return message?.role === previousMessage?.role;
 
-     }, [message.role, previousMessage]);
 
-     const info = useMemo(() => {
 
-         let info = {};
 
-         if (roleConfig) {
 
-             info = roleConfig[message.role] ?? {};
 
-         }
 
-         return info;
 
-     }, [message.role, roleConfig]);
 
-     const avatarNode = useMemo(() => {
 
-         return (<ChatBoxAvatar
 
-             continueSend={continueSend}
 
-             role={info} 
 
-             message={message}
 
-             customRenderFunc={renderChatBoxAvatar}
 
-         />);
 
-     }, [info, message, renderChatBoxAvatar]);
 
-     const titleNode = useMemo(() => {
 
-         return (<ChatBoxTitle 
 
-             role={info} 
 
-             message={message}
 
-             customRenderFunc={renderChatBoxTitle}
 
-         />);
 
-     }, [info, message, renderChatBoxTitle]);
 
-     const contentNode = useMemo(() => {
 
-         return (<ChatBoxContent
 
-             mode={mode}
 
-             role={info}
 
-             message={message}
 
-             customMarkDownComponents={customMarkDownComponents}
 
-             customRenderFunc={renderChatBoxContent}
 
-             markdownRenderProps={markdownRenderProps}
 
-         />);
 
-     }, [message, info, renderChatBoxContent, mode]);
 
-     const actionNode = useMemo(() => {
 
-         return (<ChatBoxAction 
 
-             toast={toast}
 
-             role={info} 
 
-             message={message}
 
-             lastChat={lastChat}
 
-             onMessageBadFeedback={onMessageBadFeedback}
 
-             onMessageCopy={onMessageCopy}
 
-             onChatsChange={onChatsChange}
 
-             onMessageDelete={onMessageDelete}
 
-             onMessageGoodFeedback={onMessageGoodFeedback}
 
-             onMessageReset={onMessageReset}
 
-             customRenderFunc={renderChatBoxAction}
 
-         />);
 
-     }, [message, info, lastChat, onMessageBadFeedback, onMessageGoodFeedback, onMessageCopy, onChatsChange, onMessageDelete, onMessageReset, renderChatBoxAction]);
 
-     const containerCls = useMemo(() => cls(PREFIX_CHAT_BOX, {
 
-         [`${PREFIX_CHAT_BOX}-right`]: message.role === ROLE.USER && align === CHAT_ALIGN.LEFT_RIGHT,
 
-     }
 
-     ), [message.role, align]);
 
-     if (typeof renderFullChatBox !== 'function') {
 
-         return (<div
 
-             className={containerCls}
 
-         >
 
-             {avatarNode}
 
-             <div
 
-                 className={`${PREFIX_CHAT_BOX}-wrap`}
 
-             >
 
-                 {!continueSend && titleNode}
 
-                 {contentNode}
 
-                 {actionNode}
 
-             </div>
 
-         </div>);
 
-     } else {
 
-         return renderFullChatBox({
 
-             message,
 
-             role: info,
 
-             defaultNodes: {
 
-                 avatar: avatarNode,
 
-                 title: titleNode,
 
-                 content: contentNode,
 
-                 action: actionNode,
 
-             },
 
-             className: containerCls
 
-         }) as ReactElement;
 
-     }
 
- });
 
- export default ChatBox;
 
 
  |