import { ChatContext } from '@/app/chat-context'; import { apiInterceptors, getDocumentList } from '@/client/api'; import { IDocument } from '@/types/knowledge'; import { SendOutlined } from '@ant-design/icons'; import { Button, Input } from 'antd'; import { PropsWithChildren, useContext, useEffect, useMemo, useRef, useState } from 'react'; import DocList from '../chat/doc-list'; import DocUpload from '../chat/doc-upload'; import PromptBot from './prompt-bot'; type TextAreaProps = Omit[0], 'value' | 'onPressEnter' | 'onChange' | 'onSubmit'>; interface Props { onSubmit: (val: string) => void; handleFinish?: (val: boolean) => void; loading?: boolean; placeholder?: string; } function CompletionInput({ children, loading, onSubmit, handleFinish, placeholder, ...props }: PropsWithChildren) { const { dbParam, scene } = useContext(ChatContext); const [userInput, setUserInput] = useState(''); const showUpload = useMemo(() => scene === 'chat_knowledge', [scene]); const [documents, setDocuments] = useState([]); const uploadCountRef = useRef(0); useEffect(() => { showUpload && fetchDocuments(); }, [dbParam]); async function fetchDocuments() { if (!dbParam) { return null; } const [_, data] = await apiInterceptors( getDocumentList(dbParam, { page: 1, page_size: uploadCountRef.current, }), ); setDocuments(data?.data || []); } const onUploadFinish = async () => { uploadCountRef.current += 1; await fetchDocuments(); }; return (
{showUpload && ( )} { if (!userInput.trim()) return; if (e.keyCode === 13) { if (e.shiftKey) { e.preventDefault(); setUserInput(state => state + '\n'); return; } onSubmit(userInput); setTimeout(() => { setUserInput(''); }, 0); } }} onChange={e => { if (typeof props.maxLength === 'number') { setUserInput(e.target.value.substring(0, props.maxLength)); return; } setUserInput(e.target.value); }} placeholder={placeholder} />
); } export default CompletionInput;