| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | 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; |
| |
|