From 1b04382a9b46ae4ab50c9ba52df3b8da8c83db37 Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Wed, 7 Feb 2024 21:23:47 +0800 Subject: [PATCH] fix: chat agent mode content copy (#2418) --- .../base/chat/chat/answer/agent-content.tsx | 15 +- .../base/chat/chat/answer/basic-content.tsx | 3 +- .../base/chat/chat/answer/index.tsx | 35 ++-- .../components/base/chat/chat/answer/more.tsx | 3 +- .../base/chat/chat/answer/operation.tsx | 22 ++- .../chat/chat/answer/suggested-questions.tsx | 3 +- .../components/base/chat/chat/chat-input.tsx | 171 +++++++++--------- web/app/components/base/chat/chat/hooks.ts | 12 -- web/app/components/base/chat/chat/index.tsx | 8 + .../components/base/chat/chat/question.tsx | 24 ++- .../components/base/chat/chat/try-to-ask.tsx | 3 +- 11 files changed, 166 insertions(+), 133 deletions(-) diff --git a/web/app/components/base/chat/chat/answer/agent-content.tsx b/web/app/components/base/chat/chat/answer/agent-content.tsx index 99f5f526d1..c895332816 100644 --- a/web/app/components/base/chat/chat/answer/agent-content.tsx +++ b/web/app/components/base/chat/chat/answer/agent-content.tsx @@ -1,23 +1,24 @@ import type { FC } from 'react' +import { memo } from 'react' import type { ChatItem, VisionFile, } from '../../types' -import { useChatContext } from '../context' import { Markdown } from '@/app/components/base/markdown' import Thought from '@/app/components/app/chat/thought' import ImageGallery from '@/app/components/base/image-gallery' +import type { Emoji } from '@/app/components/tools/types' type AgentContentProps = { item: ChatItem + responsing?: boolean + allToolIcons?: Record } const AgentContent: FC = ({ item, + responsing, + allToolIcons, }) => { - const { - allToolIcons, - isResponsing, - } = useChatContext() const { annotation, agent_thoughts, @@ -45,7 +46,7 @@ const AgentContent: FC = ({ )} @@ -58,4 +59,4 @@ const AgentContent: FC = ({ ) } -export default AgentContent +export default memo(AgentContent) diff --git a/web/app/components/base/chat/chat/answer/basic-content.tsx b/web/app/components/base/chat/chat/answer/basic-content.tsx index fea192b7d7..d041b9d631 100644 --- a/web/app/components/base/chat/chat/answer/basic-content.tsx +++ b/web/app/components/base/chat/chat/answer/basic-content.tsx @@ -1,4 +1,5 @@ import type { FC } from 'react' +import { memo } from 'react' import type { ChatItem } from '../../types' import { Markdown } from '@/app/components/base/markdown' @@ -19,4 +20,4 @@ const BasicContent: FC = ({ return } -export default BasicContent +export default memo(BasicContent) diff --git a/web/app/components/base/chat/chat/answer/index.tsx b/web/app/components/base/chat/chat/answer/index.tsx index 2c2b06c1e2..088336c00b 100644 --- a/web/app/components/base/chat/chat/answer/index.tsx +++ b/web/app/components/base/chat/chat/answer/index.tsx @@ -1,8 +1,13 @@ -import type { FC } from 'react' +import type { + FC, + ReactNode, +} from 'react' +import { memo } from 'react' import { useTranslation } from 'react-i18next' -import type { ChatItem } from '../../types' -import { useChatContext } from '../context' -import { useCurrentAnswerIsResponsing } from '../hooks' +import type { + ChatConfig, + ChatItem, +} from '../../types' import Operation from './operation' import AgentContent from './agent-content' import BasicContent from './basic-content' @@ -12,23 +17,27 @@ import { AnswerTriangle } from '@/app/components/base/icons/src/vender/solid/gen import LoadingAnim from '@/app/components/app/chat/loading-anim' import Citation from '@/app/components/app/chat/citation' import { EditTitle } from '@/app/components/app/annotation/edit-annotation-modal/edit-item' +import type { Emoji } from '@/app/components/tools/types' type AnswerProps = { item: ChatItem question: string index: number + config?: ChatConfig + answerIcon?: ReactNode + responsing?: boolean + allToolIcons?: Record } const Answer: FC = ({ item, question, index, + config, + answerIcon, + responsing, + allToolIcons, }) => { const { t } = useTranslation() - const { - config, - answerIcon, - } = useChatContext() - const responsing = useCurrentAnswerIsResponsing(item.id) const { content, citation, @@ -83,7 +92,11 @@ const Answer: FC = ({ } { hasAgentThoughts && ( - + ) } { @@ -108,4 +121,4 @@ const Answer: FC = ({ ) } -export default Answer +export default memo(Answer) diff --git a/web/app/components/base/chat/chat/answer/more.tsx b/web/app/components/base/chat/chat/answer/more.tsx index 0aad9b9b6a..03fa7b2aed 100644 --- a/web/app/components/base/chat/chat/answer/more.tsx +++ b/web/app/components/base/chat/chat/answer/more.tsx @@ -1,4 +1,5 @@ import type { FC } from 'react' +import { memo } from 'react' import { useTranslation } from 'react-i18next' import type { ChatItem } from '../../types' import { formatNumber } from '@/utils/format' @@ -42,4 +43,4 @@ const More: FC = ({ ) } -export default More +export default memo(More) diff --git a/web/app/components/base/chat/chat/answer/operation.tsx b/web/app/components/base/chat/chat/answer/operation.tsx index a47a9ccd0c..9d9cf2735e 100644 --- a/web/app/components/base/chat/chat/answer/operation.tsx +++ b/web/app/components/base/chat/chat/answer/operation.tsx @@ -1,8 +1,11 @@ import type { FC } from 'react' -import { useState } from 'react' +import { + memo, + useMemo, + useState, +} from 'react' import { useTranslation } from 'react-i18next' import type { ChatItem } from '../../types' -import { useCurrentAnswerIsResponsing } from '../hooks' import { useChatContext } from '../context' import CopyBtn from '@/app/components/app/chat/copy-btn' import { MessageFast } from '@/app/components/base/icons/src/vender/solid/communication' @@ -34,17 +37,24 @@ const Operation: FC = ({ onFeedback, } = useChatContext() const [isShowReplyModal, setIsShowReplyModal] = useState(false) - const responsing = useCurrentAnswerIsResponsing(item.id) const { id, isOpeningStatement, - content, + content: messageContent, annotation, feedback, + agent_thoughts, } = item const hasAnnotation = !!annotation?.id const [localFeedback, setLocalFeedback] = useState(feedback) + const content = useMemo(() => { + if (agent_thoughts?.length) + return agent_thoughts.reduce((acc, cur) => acc + cur.thought, '') + + return messageContent + }, [agent_thoughts, messageContent]) + const handleFeedback = async (rating: 'like' | 'dislike' | null) => { if (!config?.supportFeedback || !onFeedback) return @@ -56,7 +66,7 @@ const Operation: FC = ({ return (
{ - !isOpeningStatement && !responsing && ( + !isOpeningStatement && ( = ({ ) } -export default Operation +export default memo(Operation) diff --git a/web/app/components/base/chat/chat/answer/suggested-questions.tsx b/web/app/components/base/chat/chat/answer/suggested-questions.tsx index 1064809254..dd8e79b8f4 100644 --- a/web/app/components/base/chat/chat/answer/suggested-questions.tsx +++ b/web/app/components/base/chat/chat/answer/suggested-questions.tsx @@ -1,4 +1,5 @@ import type { FC } from 'react' +import { memo } from 'react' import type { ChatItem } from '../../types' import { useChatContext } from '../context' @@ -32,4 +33,4 @@ const SuggestedQuestions: FC = ({ ) } -export default SuggestedQuestions +export default memo(SuggestedQuestions) diff --git a/web/app/components/base/chat/chat/chat-input.tsx b/web/app/components/base/chat/chat/chat-input.tsx index 2c8a308b0d..ac958b0d2c 100644 --- a/web/app/components/base/chat/chat/chat-input.tsx +++ b/web/app/components/base/chat/chat/chat-input.tsx @@ -1,5 +1,6 @@ import type { FC } from 'react' import { + memo, useRef, useState, } from 'react' @@ -126,100 +127,102 @@ const ChatInput: FC = ({ ) return ( -
- { - visionConfig?.enabled && ( - <> -
- = visionConfig.number_limits} - /> -
-
-
- -
- - ) - } -