diff --git a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.less b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.less index 351427280a79f05e182c030ffcd2ed2467f61ca1..b3d17f1e1e11a1d83342eed4f371bf875d1d89a2 100644 --- a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.less +++ b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.less @@ -8,6 +8,7 @@ } .footer { text-align: right; + padding-top: 16px; .nextButton { background-color: @purple; } @@ -17,8 +18,9 @@ padding-top: 60px; } .uploader { - display: block; - height: 200px; + :global(.ant-upload) { + height: 126px; + } } .hiddenUploader { :global(.ant-upload-drag) { @@ -29,6 +31,17 @@ font-size: 40px; align-items: end; } + .uploaderButton { + padding: 10px; + vertical-align: middle; + height: 40px; + } + .uploaderIcon { + svg { + width: 20px; + height: 20px; + } + } .deleteIcon { font-size: 20px; } diff --git a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx index 27d248695bed5fa84cf284f12bfc426216a64f84..b3e5a7a88fc252b104804bdcc2d562c1a8cf1762 100644 --- a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx @@ -1,5 +1,6 @@ import { ReactComponent as SelectFilesEndIcon } from '@/assets/svg/select-files-end.svg'; import { ReactComponent as SelectFilesStartIcon } from '@/assets/svg/select-files-start.svg'; +import { KnowledgeRouteKey } from '@/constants/knowledge'; import { useDeleteDocumentById, useFetchKnowledgeDetail, @@ -10,14 +11,14 @@ import { useFetchTenantInfo, useSelectParserList, } from '@/hooks/userSettingHook'; - import uploadService from '@/services/uploadService'; +import { isFileUploadDone } from '@/utils/documentUtils'; import { ArrowLeftOutlined, + CloudUploadOutlined, DeleteOutlined, EditOutlined, FileDoneOutlined, - InboxOutlined, } from '@ant-design/icons'; import { Button, @@ -43,8 +44,6 @@ import { } from 'react'; import { Link, useDispatch, useNavigate } from 'umi'; -import { KnowledgeRouteKey } from '@/constants/knowledge'; -import { isFileUploadDone } from '@/utils/documentUtils'; import styles from './index.less'; const { Dragger } = Upload; @@ -290,9 +289,9 @@ const KnowledgeUploadFile = () => { [styles.hiddenUploader]: !isUpload, })} > - <p className="ant-upload-drag-icon"> - <InboxOutlined /> - </p> + <Button className={styles.uploaderButton}> + <CloudUploadOutlined className={styles.uploaderIcon} /> + </Button> <p className="ant-upload-text"> Click or drag file to this area to upload </p> diff --git a/web/src/pages/add-knowledge/components/knowledge-testing/testing-result/index.tsx b/web/src/pages/add-knowledge/components/knowledge-testing/testing-result/index.tsx index 86ef8e825953504e90ff79eda2add66462142145..9277418c848e567d1effe86cd9220285ce1367b9 100644 --- a/web/src/pages/add-knowledge/components/knowledge-testing/testing-result/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-testing/testing-result/index.tsx @@ -27,7 +27,7 @@ const ChunkTitle = ({ item }: { item: ITestingChunk }) => { {similarityList.map((x) => ( <Space key={x.field}> <span className={styles.similarityCircle}> - {((item[x.field] as number) * 100).toFixed(2)}% + {((item[x.field] as number) * 100).toFixed(2)} </span> <span className={styles.similarityText}>{x.label}</span> </Space> diff --git a/web/src/pages/chat/chat-container/index.tsx b/web/src/pages/chat/chat-container/index.tsx index b0a3ca8543b94c9a2bc0e1ea697aee695d19b129..e7cd63e19f35e6b63e80f202e022e6ffb6a82ee0 100644 --- a/web/src/pages/chat/chat-container/index.tsx +++ b/web/src/pages/chat/chat-container/index.tsx @@ -4,7 +4,6 @@ import NewDocumentLink from '@/components/new-document-link'; import DocumentPreviewer from '@/components/pdf-previewer'; import { MessageType } from '@/constants/chat'; import { useSelectFileThumbnails } from '@/hooks/knowledgeHook'; -import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; import { useSelectUserInfo } from '@/hooks/userSettingHook'; import { IReference, Message } from '@/interfaces/database/chat'; import { IChunk } from '@/interfaces/database/knowledge'; @@ -21,7 +20,7 @@ import { Space, } from 'antd'; import classNames from 'classnames'; -import { ChangeEventHandler, useCallback, useMemo, useState } from 'react'; +import { useCallback, useMemo } from 'react'; import Markdown from 'react-markdown'; import reactStringReplace from 'react-string-replace'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; @@ -243,35 +242,19 @@ const MessageItem = ({ }; const ChatContainer = () => { - const [value, setValue] = useState(''); const { ref, currentConversation: conversation, addNewestConversation, + removeLatestMessage, } = useFetchConversationOnMount(); - const { sendMessage } = useSendMessage(); + const { handleInputChange, handlePressEnter, value, loading } = + useSendMessage(conversation, addNewestConversation, removeLatestMessage); const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } = useClickDrawer(); - const loading = useOneNamespaceEffectsLoading('chatModel', [ - 'completeConversation', - ]); useGetFileIcon(); - const handlePressEnter = () => { - if (!loading) { - setValue(''); - addNewestConversation(value); - sendMessage(value.trim()); - } - }; - - const handleInputChange: ChangeEventHandler<HTMLInputElement> = (e) => { - const value = e.target.value; - const nextValue = value.replaceAll('\\n', '\n').replaceAll('\\t', '\t'); - setValue(nextValue); - }; - return ( <> <Flex flex={1} className={styles.chatContainer} vertical> diff --git a/web/src/pages/chat/hooks.ts b/web/src/pages/chat/hooks.ts index b3e83bcd277639df2ae0b93a23aff32190092751..877c91a17b2a9959c2e611094230da4878e8b020 100644 --- a/web/src/pages/chat/hooks.ts +++ b/web/src/pages/chat/hooks.ts @@ -7,7 +7,14 @@ import { IConversation, IDialog } from '@/interfaces/database/chat'; import { IChunk } from '@/interfaces/database/knowledge'; import { getFileExtension } from '@/utils'; import omit from 'lodash/omit'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { + ChangeEventHandler, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; import { useDispatch, useSearchParams, useSelector } from 'umi'; import { v4 as uuid } from 'uuid'; import { ChatSearchParams } from './constants'; @@ -432,6 +439,16 @@ export const useSelectCurrentConversation = () => { }); }, []); + const removeLatestMessage = useCallback(() => { + setCurrentConversation((pre) => { + const nextMessages = pre.message.slice(0, -2); + return { + ...pre, + message: nextMessages, + }; + }); + }, []); + const addPrologue = useCallback(() => { if (dialogId !== '' && conversationId === '') { const prologue = dialog.prompt_config?.prologue; @@ -459,7 +476,7 @@ export const useSelectCurrentConversation = () => { setCurrentConversation(conversation); }, [conversation]); - return { currentConversation, addNewestConversation }; + return { currentConversation, addNewestConversation, removeLatestMessage }; }; export const useFetchConversation = () => { @@ -501,7 +518,7 @@ export const useScrollToBottom = (currentConversation: IClientConversation) => { export const useFetchConversationOnMount = () => { const { conversationId } = useGetChatSearchParams(); const fetchConversation = useFetchConversation(); - const { currentConversation, addNewestConversation } = + const { currentConversation, addNewestConversation, removeLatestMessage } = useSelectCurrentConversation(); const ref = useScrollToBottom(currentConversation); @@ -515,16 +532,45 @@ export const useFetchConversationOnMount = () => { fetchConversationOnMount(); }, [fetchConversationOnMount]); - return { currentConversation, addNewestConversation, ref }; + return { + currentConversation, + addNewestConversation, + ref, + removeLatestMessage, + }; +}; + +export const useHandleMessageInputChange = () => { + const [value, setValue] = useState(''); + + const handleInputChange: ChangeEventHandler<HTMLInputElement> = (e) => { + const value = e.target.value; + const nextValue = value.replaceAll('\\n', '\n').replaceAll('\\t', '\t'); + setValue(nextValue); + }; + + return { + handleInputChange, + value, + setValue, + }; }; -export const useSendMessage = () => { +export const useSendMessage = ( + conversation: IClientConversation, + addNewestConversation: (message: string) => void, + removeLatestMessage: () => void, +) => { + const loading = useOneNamespaceEffectsLoading('chatModel', [ + 'completeConversation', + ]); const dispatch = useDispatch(); const { setConversation } = useSetConversation(); const { conversationId } = useGetChatSearchParams(); - const conversation: IClientConversation = useSelector( - (state: any) => state.chatModel.currentConversation, - ); + const { handleInputChange, value, setValue } = useHandleMessageInputChange(); + // const conversation: IClientConversation = useSelector( + // (state: any) => state.chatModel.currentConversation, + // ); const fetchConversation = useFetchConversation(); const { handleClickConversation } = useClickConversationCard(); @@ -549,10 +595,15 @@ export const useSendMessage = () => { if (retcode === 0) { if (id) { + // new conversation handleClickConversation(id); } else { fetchConversation(conversationId); } + } else { + // cancel loading + setValue(message); + removeLatestMessage(); } }, [ @@ -561,6 +612,8 @@ export const useSendMessage = () => { conversationId, fetchConversation, handleClickConversation, + removeLatestMessage, + setValue, ], ); @@ -579,7 +632,20 @@ export const useSendMessage = () => { [conversationId, setConversation, sendMessage], ); - return { sendMessage: handleSendMessage }; + const handlePressEnter = () => { + if (!loading) { + setValue(''); + addNewestConversation(value); + handleSendMessage(value.trim()); + } + }; + + return { + handlePressEnter, + handleInputChange, + value, + loading, + }; }; export const useGetFileIcon = () => { diff --git a/web/src/pages/login/index.tsx b/web/src/pages/login/index.tsx index 6050822d4fc6046cc76f2c45c593e1906c9b55f5..cb6aa4130e577d78196c959c3bbe92a58dc68772 100644 --- a/web/src/pages/login/index.tsx +++ b/web/src/pages/login/index.tsx @@ -115,7 +115,11 @@ const Login = () => { label="Password" rules={[{ required: true, message: 'Please input value' }]} > - <Input.Password size="large" placeholder="Please input value" /> + <Input.Password + size="large" + placeholder="Please input value" + onPressEnter={onCheck} + /> </Form.Item> {title === 'login' && ( <Form.Item name="remember" valuePropName="checked"> diff --git a/web/src/pages/login/model.ts b/web/src/pages/login/model.ts index 8faf0778df8c83ed053d03b177d54bf3bff65009..eaa92fb265031baf79e7dfb04bcb8add803bbafb 100644 --- a/web/src/pages/login/model.ts +++ b/web/src/pages/login/model.ts @@ -51,7 +51,7 @@ const model: DvaModel<LoginModelState> = { console.log(); const { retcode } = data; if (retcode === 0) { - message.success('注册ć功ďĽ'); + message.success('Registered!'); } return retcode; },