import { FileUploadProps } from '@/components/file-upload'; import { NextMessageInput } from '@/components/message-input/next'; import MessageItem from '@/components/next-message-item'; import PdfDrawer from '@/components/pdf-drawer'; import { useClickDrawer } from '@/components/pdf-drawer/hooks'; import { RAGFlowAvatar } from '@/components/ragflow-avatar'; import { Button } from '@/components/ui/button'; import { MessageType } from '@/constants/chat'; import { useFetchAppConf } from '@/hooks/logic-hooks'; import { useFetchExternalAgentInputs, useUploadCanvasFileWithProgress, } from '@/hooks/use-agent-request'; import { cn } from '@/lib/utils'; import i18n from '@/locales/config'; import DebugContent from '@/pages/agent/debug-content'; import { useCacheChatLog } from '@/pages/agent/hooks/use-cache-chat-log'; import { useAwaitCompentData } from '@/pages/agent/hooks/use-chat-logic'; import { IInputs } from '@/pages/agent/interface'; import { useSendButtonDisabled } from '@/pages/chat/hooks'; import { buildMessageUuidWithRole } from '@/utils/chat'; import { isEmpty } from 'lodash'; import { RefreshCcw } from 'lucide-react'; import React, { forwardRef, useCallback, useState } from 'react'; import { useGetSharedChatSearchParams, useSendNextSharedMessage, } from '../hooks/use-send-shared-message'; import { ParameterDialog } from './parameter-dialog'; const ChatContainer = () => { const { sharedId: conversationId, locale, visibleAvatar, } = useGetSharedChatSearchParams(); const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } = useClickDrawer(); const { uploadCanvasFile, loading } = useUploadCanvasFileWithProgress(conversationId); const { addEventList, setCurrentMessageId, currentEventListWithoutMessageById, clearEventList, } = useCacheChatLog(); const { handlePressEnter, handleInputChange, value, sendLoading, scrollRef, messageContainerRef, derivedMessages, hasError, stopOutputMessage, findReferenceByMessageId, appendUploadResponseList, parameterDialogVisible, showParameterDialog, sendFormMessage, ok, resetSession, } = useSendNextSharedMessage(addEventList); const { buildInputList, handleOk, isWaitting } = useAwaitCompentData({ derivedMessages, sendFormMessage, canvasId: conversationId as string, }); const sendDisabled = useSendButtonDisabled(value); const appConf = useFetchAppConf(); const { data: inputsData } = useFetchExternalAgentInputs(); const [agentInfo, setAgentInfo] = useState({ avatar: '', title: '', inputs: {}, }); const handleUploadFile: NonNullable = useCallback( async (files, options) => { const ret = await uploadCanvasFile({ files, options }); appendUploadResponseList(ret.data, files); }, [appendUploadResponseList, uploadCanvasFile], ); React.useEffect(() => { if (locale && i18n.language !== locale) { i18n.changeLanguage(locale); } }, [locale, visibleAvatar]); React.useEffect(() => { const { avatar, title, inputs } = inputsData; setAgentInfo({ avatar, title, inputs: inputs, }); }, [inputsData, setAgentInfo]); React.useEffect(() => { if (inputsData && inputsData.inputs && !isEmpty(inputsData.inputs)) { showParameterDialog(); } }, [inputsData, showParameterDialog]); const handleInputsModalOk = (params: any[]) => { ok(params); }; const handleReset = () => { resetSession(); clearEventList(); }; if (!conversationId) { return
empty
; } return (
{appConf.appName}
{agentInfo.title}
{derivedMessages?.map((message, i) => { return ( {message.role === MessageType.Assistant && derivedMessages.length - 1 === i && ( )} {message.role === MessageType.Assistant && derivedMessages.length - 1 !== i && (
{message?.data?.tips}
{buildInputList(message)?.map((item) => item.value)}
)}
); })}
{visible && ( )} {parameterDialogVisible && ( )}
); }; export default forwardRef(ChatContainer);