| import React from 'react'; | |
| import { | |
| Card, | |
| Chat, | |
| Typography, | |
| Button, | |
| } from '@douyinfe/semi-ui'; | |
| import { | |
| MessageSquare, | |
| Eye, | |
| EyeOff, | |
| } from 'lucide-react'; | |
| import { useTranslation } from 'react-i18next'; | |
| import CustomInputRender from './CustomInputRender'; | |
| const ChatArea = ({ | |
| chatRef, | |
| message, | |
| inputs, | |
| styleState, | |
| showDebugPanel, | |
| roleInfo, | |
| onMessageSend, | |
| onMessageCopy, | |
| onMessageReset, | |
| onMessageDelete, | |
| onStopGenerator, | |
| onClearMessages, | |
| onToggleDebugPanel, | |
| renderCustomChatContent, | |
| renderChatBoxAction, | |
| }) => { | |
| const { t } = useTranslation(); | |
| const renderInputArea = React.useCallback((props) => { | |
| return <CustomInputRender {...props} />; | |
| }, []); | |
| return ( | |
| <Card | |
| className="h-full" | |
| bordered={false} | |
| bodyStyle={{ padding: 0, height: 'calc(100vh - 66px)', display: 'flex', flexDirection: 'column', overflow: 'hidden' }} | |
| > | |
| {/* 聊天头部 */} | |
| {styleState.isMobile ? ( | |
| <div className="pt-4"></div> | |
| ) : ( | |
| <div className="px-6 py-4 bg-gradient-to-r from-purple-500 to-blue-500 rounded-t-2xl"> | |
| <div className="flex items-center justify-between"> | |
| <div className="flex items-center gap-3"> | |
| <div className="w-10 h-10 rounded-full bg-white/20 backdrop-blur flex items-center justify-center"> | |
| <MessageSquare size={20} className="text-white" /> | |
| </div> | |
| <div> | |
| <Typography.Title heading={5} className="!text-white mb-0"> | |
| {t('AI 对话')} | |
| </Typography.Title> | |
| <Typography.Text className="!text-white/80 text-sm hidden sm:inline"> | |
| {inputs.model || t('选择模型开始对话')} | |
| </Typography.Text> | |
| </div> | |
| </div> | |
| <div className="flex items-center gap-2"> | |
| <Button | |
| icon={showDebugPanel ? <EyeOff size={14} /> : <Eye size={14} />} | |
| onClick={onToggleDebugPanel} | |
| theme="borderless" | |
| type="primary" | |
| size="small" | |
| className="!rounded-lg !text-white/80 hover:!text-white hover:!bg-white/10" | |
| > | |
| {showDebugPanel ? t('隐藏调试') : t('显示调试')} | |
| </Button> | |
| </div> | |
| </div> | |
| </div> | |
| )} | |
| {/* 聊天内容区域 */} | |
| <div className="flex-1 overflow-hidden"> | |
| <Chat | |
| ref={chatRef} | |
| chatBoxRenderConfig={{ | |
| renderChatBoxContent: renderCustomChatContent, | |
| renderChatBoxAction: renderChatBoxAction, | |
| renderChatBoxTitle: () => null, | |
| }} | |
| renderInputArea={renderInputArea} | |
| roleConfig={roleInfo} | |
| style={{ | |
| height: '100%', | |
| maxWidth: '100%', | |
| overflow: 'hidden' | |
| }} | |
| chats={message} | |
| onMessageSend={onMessageSend} | |
| onMessageCopy={onMessageCopy} | |
| onMessageReset={onMessageReset} | |
| onMessageDelete={onMessageDelete} | |
| showClearContext | |
| showStopGenerate | |
| onStopGenerator={onStopGenerator} | |
| onClear={onClearMessages} | |
| className="h-full" | |
| placeholder={t('请输入您的问题...')} | |
| /> | |
| </div> | |
| </Card> | |
| ); | |
| }; | |
| export default ChatArea; |