mirror of
https://github.com/csunny/DB-GPT.git
synced 2025-07-23 12:21:08 +00:00
Co-authored-by: Fangyin Cheng <staneyffer@gmail.com> Co-authored-by: 谨欣 <echo.cmy@antgroup.com> Co-authored-by: 严志勇 <yanzhiyong@tiansuixiansheng.com> Co-authored-by: yanzhiyong <932374019@qq.com>
94 lines
2.8 KiB
TypeScript
94 lines
2.8 KiB
TypeScript
import { ChatContext } from '@/app/chat-context';
|
|
import { apiInterceptors, newDialogue } from '@/client/api';
|
|
import { STORAGE_INIT_MESSAGE_KET } from '@/utils';
|
|
import { Button, Input } from 'antd';
|
|
import cls from 'classnames';
|
|
import { useRouter } from 'next/router';
|
|
import { useContext, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
function ChatInput() {
|
|
const { setCurrentDialogInfo } = useContext(ChatContext);
|
|
const { t } = useTranslation();
|
|
const router = useRouter();
|
|
|
|
const [userInput, setUserInput] = useState<string>('');
|
|
const [isFocus, setIsFocus] = useState<boolean>(false);
|
|
const [isZhInput, setIsZhInput] = useState<boolean>(false);
|
|
|
|
const onSubmit = async () => {
|
|
const [, res] = await apiInterceptors(newDialogue({ chat_mode: 'chat_normal' }));
|
|
if (res) {
|
|
setCurrentDialogInfo?.({
|
|
chat_scene: res.chat_mode,
|
|
app_code: res.chat_mode,
|
|
});
|
|
localStorage.setItem(
|
|
'cur_dialog_info',
|
|
JSON.stringify({
|
|
chat_scene: res.chat_mode,
|
|
app_code: res.chat_mode,
|
|
}),
|
|
);
|
|
localStorage.setItem(STORAGE_INIT_MESSAGE_KET, JSON.stringify({ id: res.conv_uid, message: userInput }));
|
|
router.push(`/chat/?scene=chat_normal&id=${res.conv_uid}`);
|
|
}
|
|
setUserInput('');
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className={`flex flex-1 h-12 p-2 pl-4 items-center justify-between bg-white dark:bg-[#242733] dark:border-[#6f7f95] rounded-xl border-t border-b border-l border-r ${
|
|
isFocus ? 'border-[#0c75fc]' : ''
|
|
}`}
|
|
>
|
|
<Input.TextArea
|
|
placeholder={t('input_tips')}
|
|
className='w-full resize-none border-0 p-0 focus:shadow-none'
|
|
value={userInput}
|
|
autoSize={{ minRows: 1 }}
|
|
onKeyDown={e => {
|
|
if (e.key === 'Enter') {
|
|
if (e.shiftKey) {
|
|
return;
|
|
}
|
|
if (isZhInput) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
if (!userInput.trim()) {
|
|
return;
|
|
}
|
|
onSubmit();
|
|
}
|
|
}}
|
|
onChange={e => {
|
|
setUserInput(e.target.value);
|
|
}}
|
|
onFocus={() => {
|
|
setIsFocus(true);
|
|
}}
|
|
onBlur={() => setIsFocus(false)}
|
|
onCompositionStart={() => setIsZhInput(true)}
|
|
onCompositionEnd={() => setIsZhInput(false)}
|
|
/>
|
|
<Button
|
|
type='primary'
|
|
className={cls('flex items-center justify-center w-14 h-8 rounded-lg text-sm bg-button-gradient border-0', {
|
|
'opacity-40 cursor-not-allowed': !userInput.trim(),
|
|
})}
|
|
onClick={() => {
|
|
if (!userInput.trim()) {
|
|
return;
|
|
}
|
|
onSubmit();
|
|
}}
|
|
>
|
|
{t('sent')}
|
|
</Button>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default ChatInput;
|