From a430284aa21e3ae1f0d5654e55b2ad2852519cc2 Mon Sep 17 00:00:00 2001 From: wwf <yearningwang@iqtogether.com> Date: 星期三, 04 六月 2025 15:17:49 +0800 Subject: [PATCH] 初始化 --- app/components/base/chat/embedded-chatbot/hooks.tsx | 149 +++++++++++-------------------------------------- 1 files changed, 35 insertions(+), 114 deletions(-) diff --git a/app/components/base/chat/embedded-chatbot/hooks.tsx b/app/components/base/chat/embedded-chatbot/hooks.tsx index 7efbc95..0a8bc09 100644 --- a/app/components/base/chat/embedded-chatbot/hooks.tsx +++ b/app/components/base/chat/embedded-chatbot/hooks.tsx @@ -11,12 +11,10 @@ import produce from 'immer' import type { ChatConfig, - ChatItem, Feedback, } from '../types' import { CONVERSATION_ID_INFO } from '../constants' -import { buildChatItemTree, getProcessedInputsFromUrlParams, getProcessedSystemVariablesFromUrlParams } from '../utils' -import { getProcessedFilesFromResponse } from '../../file-uploader/utils' +import { getPrevChatList, getProcessedInputsFromUrlParams } from '../utils' import { fetchAppInfo, fetchAppMeta, @@ -34,34 +32,6 @@ import { changeLanguage } from '@/i18n/i18next-config' import { InputVarType } from '@/app/components/workflow/types' import { TransferMethod } from '@/types/app' -import { addFileInfos, sortAgentSorts } from '@/app/components/tools/utils' -import { noop } from 'lodash-es' - -function getFormattedChatList(messages: any[]) { - const newChatList: ChatItem[] = [] - messages.forEach((item) => { - const questionFiles = item.message_files?.filter((file: any) => file.belongs_to === 'user') || [] - newChatList.push({ - id: `question-${item.id}`, - content: item.query, - isAnswer: false, - message_files: getProcessedFilesFromResponse(questionFiles.map((item: any) => ({ ...item, related_id: item.id }))), - parentMessageId: item.parent_message_id || undefined, - }) - const answerFiles = item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [] - newChatList.push({ - id: item.id, - content: item.answer, - agent_thoughts: addFileInfos(item.agent_thoughts ? sortAgentSorts(item.agent_thoughts) : item.agent_thoughts, item.message_files), - feedback: item.feedback, - isAnswer: true, - citation: item.retriever_resources, - message_files: getProcessedFilesFromResponse(answerFiles.map((item: any) => ({ ...item, related_id: item.id }))), - parentMessageId: `question-${item.id}`, - }) - }) - return newChatList -} export const useEmbeddedChatbot = () => { const isInstalledApp = false @@ -72,62 +42,24 @@ }, [appInfo]) const appId = useMemo(() => appData?.app_id, [appData]) - const [userId, setUserId] = useState<string>() - const [conversationId, setConversationId] = useState<string>() useEffect(() => { - getProcessedSystemVariablesFromUrlParams().then(({ user_id, conversation_id }) => { - setUserId(user_id) - setConversationId(conversation_id) - }) - }, []) - - useEffect(() => { - const setLanguageFromParams = async () => { - // Check URL parameters for language override - const urlParams = new URLSearchParams(window.location.search) - const localeParam = urlParams.get('locale') - - // Check for encoded system variables - const systemVariables = await getProcessedSystemVariablesFromUrlParams() - const localeFromSysVar = systemVariables.locale - - if (localeParam) { - // If locale parameter exists in URL, use it instead of default - changeLanguage(localeParam) - } - else if (localeFromSysVar) { - // If locale is set as a system variable, use that - changeLanguage(localeFromSysVar) - } - else if (appInfo?.site.default_language) { - // Otherwise use the default from app config - changeLanguage(appInfo.site.default_language) - } - } - - setLanguageFromParams() + if (appInfo?.site.default_language) + changeLanguage(appInfo.site.default_language) }, [appInfo]) - const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, Record<string, string>>>(CONVERSATION_ID_INFO, { + const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, string>>(CONVERSATION_ID_INFO, { defaultValue: {}, }) - const allowResetChat = !conversationId - const currentConversationId = useMemo(() => conversationIdInfo?.[appId || '']?.[userId || 'DEFAULT'] || conversationId || '', - [appId, conversationIdInfo, userId, conversationId]) + const currentConversationId = useMemo(() => conversationIdInfo?.[appId || ''] || '', [appId, conversationIdInfo]) const handleConversationIdInfoChange = useCallback((changeConversationId: string) => { if (appId) { - let prevValue = conversationIdInfo?.[appId || ''] - if (typeof prevValue === 'string') - prevValue = {} setConversationIdInfo({ ...conversationIdInfo, - [appId || '']: { - ...prevValue, - [userId || 'DEFAULT']: changeConversationId, - }, + [appId || '']: changeConversationId, }) } - }, [appId, conversationIdInfo, setConversationIdInfo, userId]) + }, [appId, conversationIdInfo, setConversationIdInfo]) + const [showConfigPanelBeforeChat, setShowConfigPanelBeforeChat] = useState(true) const [newConversationId, setNewConversationId] = useState('') const chatShouldReloadKey = useMemo(() => { @@ -143,11 +75,9 @@ const { data: appConversationData, isLoading: appConversationDataLoading, mutate: mutateAppConversationData } = useSWR(['appConversationData', isInstalledApp, appId, false], () => fetchConversations(isInstalledApp, appId, undefined, false, 100)) const { data: appChatListData, isLoading: appChatListDataLoading } = useSWR(chatShouldReloadKey ? ['appChatList', chatShouldReloadKey, isInstalledApp, appId] : null, () => fetchChatList(chatShouldReloadKey, isInstalledApp, appId)) - const [clearChatList, setClearChatList] = useState(false) - const [isResponding, setIsResponding] = useState(false) const appPrevChatList = useMemo( () => (currentConversationId && appChatListData?.data.length) - ? buildChatItemTree(getFormattedChatList(appChatListData.data)) + ? getPrevChatList(appChatListData.data) : [], [appChatListData, currentConversationId], ) @@ -223,10 +153,7 @@ useEffect(() => { // init inputs from url params - (async () => { - const inputs = await getProcessedInputsFromUrlParams() - setInitInputs(inputs) - })() + setInitInputs(getProcessedInputsFromUrlParams()) }, []) useEffect(() => { const conversationInputs: Record<string, any> = {} @@ -279,17 +206,6 @@ return conversationItem }, [conversationList, currentConversationId, pinnedConversationList]) - const currentConversationLatestInputs = useMemo(() => { - if (!currentConversationId || !appChatListData?.data.length) - return newConversationInputsRef.current || {} - return appChatListData.data.slice().pop().inputs || {} - }, [appChatListData, currentConversationId]) - const [currentConversationInputs, setCurrentConversationInputs] = useState<Record<string, any>>(currentConversationLatestInputs || {}) - useEffect(() => { - if (currentConversationItem) - setCurrentConversationInputs(currentConversationLatestInputs || {}) - }, [currentConversationItem, currentConversationLatestInputs]) - const { notify } = useToastContext() const checkInputsRequired = useCallback((silent?: boolean) => { let hasEmptyInput = '' @@ -328,27 +244,37 @@ return true }, [inputsForms, notify, t]) - const handleStartChat = useCallback((callback?: any) => { + const handleStartChat = useCallback(() => { if (checkInputsRequired()) { + setShowConfigPanelBeforeChat(false) setShowNewConversationItemInList(true) - callback?.() } - }, [setShowNewConversationItemInList, checkInputsRequired]) - const currentChatInstanceRef = useRef<{ handleStop: () => void }>({ handleStop: noop }) + }, [setShowConfigPanelBeforeChat, setShowNewConversationItemInList, checkInputsRequired]) + const currentChatInstanceRef = useRef<{ handleStop: () => void }>({ handleStop: () => { } }) const handleChangeConversation = useCallback((conversationId: string) => { currentChatInstanceRef.current.handleStop() setNewConversationId('') handleConversationIdInfoChange(conversationId) - if (conversationId) - setClearChatList(false) - }, [handleConversationIdInfoChange, setClearChatList]) - const handleNewConversation = useCallback(async () => { + + if (conversationId === '' && !checkInputsRequired(true)) + setShowConfigPanelBeforeChat(true) + else + setShowConfigPanelBeforeChat(false) + }, [handleConversationIdInfoChange, setShowConfigPanelBeforeChat, checkInputsRequired]) + const handleNewConversation = useCallback(() => { currentChatInstanceRef.current.handleStop() - setShowNewConversationItemInList(true) - handleChangeConversation('') - handleNewConversationInputsChange(await getProcessedInputsFromUrlParams()) - setClearChatList(true) - }, [handleChangeConversation, setShowNewConversationItemInList, handleNewConversationInputsChange, setClearChatList]) + setNewConversationId('') + + if (showNewConversationItemInList) { + handleChangeConversation('') + } + else if (currentConversationId) { + handleConversationIdInfoChange('') + setShowConfigPanelBeforeChat(true) + setShowNewConversationItemInList(true) + handleNewConversationInputsChange({}) + } + }, [handleChangeConversation, currentConversationId, handleConversationIdInfoChange, setShowConfigPanelBeforeChat, setShowNewConversationItemInList, showNewConversationItemInList, handleNewConversationInputsChange]) const handleNewConversationCompleted = useCallback((newConversationId: string) => { setNewConversationId(newConversationId) @@ -366,7 +292,6 @@ appInfoError, appInfoLoading, isInstalledApp, - allowResetChat, appId, currentConversationId, currentConversationItem, @@ -382,6 +307,8 @@ appPrevChatList, pinnedConversationList, conversationList, + showConfigPanelBeforeChat, + setShowConfigPanelBeforeChat, setShowNewConversationItemInList, newConversationInputs, newConversationInputsRef, @@ -395,11 +322,5 @@ chatShouldReloadKey, handleFeedback, currentChatInstanceRef, - clearChatList, - setClearChatList, - isResponding, - setIsResponding, - currentConversationInputs, - setCurrentConversationInputs, } } -- Gitblit v1.8.0