import { ChatContentContext } from '@/pages/chat'; import { LoadingOutlined } from '@ant-design/icons'; import { Button, Input, Spin } from 'antd'; import classNames from 'classnames'; import { useSearchParams } from 'next/navigation'; import React, { useContext, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import ToolsBar from './ToolsBar'; const ChatInputPanel: React.FC<{ ctrl: AbortController }> = ({ ctrl }) => { const { t } = useTranslation(); const { scrollRef, replyLoading, handleChat, appInfo, currentDialogue, temperatureValue, maxNewTokensValue, resourceValue, refreshDialogList, } = useContext(ChatContentContext); const searchParams = useSearchParams(); // const scene = searchParams?.get('scene') ?? ''; // unused const select_param = searchParams?.get('select_param') ?? ''; const [userInput, setUserInput] = useState(''); const [isFocus, setIsFocus] = useState(false); const [isZhInput, setIsZhInput] = useState(false); const submitCountRef = useRef(0); const paramKey: string[] = useMemo(() => { return appInfo.param_need?.map(i => i.type) || []; }, [appInfo.param_need]); const onSubmit = async () => { submitCountRef.current++; setTimeout(() => { scrollRef.current?.scrollTo({ top: scrollRef.current?.scrollHeight, behavior: 'smooth', }); setUserInput(''); }, 0); await handleChat(userInput, { app_code: appInfo.app_code || '', ...(paramKey.includes('temperature') && { temperature: temperatureValue }), ...(paramKey.includes('max_new_tokens') && { max_new_tokens: maxNewTokensValue }), select_param, ...(paramKey.includes('resource') && { select_param: typeof resourceValue === 'string' ? resourceValue : JSON.stringify(resourceValue) || currentDialogue.select_param, }), }); // 如果应用进来第一次对话,刷新对话列表 if (submitCountRef.current === 1) { await refreshDialogList(); } }; return (
{ if (e.key === 'Enter') { if (e.shiftKey) { return; } if (isZhInput) { return; } e.preventDefault(); if (!userInput.trim() || replyLoading) { return; } onSubmit(); } }} onChange={e => { setUserInput(e.target.value); }} onFocus={() => { setIsFocus(true); }} onBlur={() => setIsFocus(false)} onCompositionStart={() => setIsZhInput(true)} onCompositionEnd={() => setIsZhInput(false)} />
); }; export default ChatInputPanel;