123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- import { useCallback, useEffect, useMemo } from 'react'
- import Chat from '../chat'
- import type {
- ChatConfig,
- OnSend,
- } from '../types'
- import { useChat } from '../chat/hooks'
- import { useChatWithHistoryContext } from './context'
- import Header from './header'
- import ConfigPanel from './config-panel'
- import {
- fetchSuggestedQuestions,
- getUrl,
- stopChatMessageResponding,
- } from '@/service/share'
- const ChatWrapper = () => {
- const {
- appParams,
- appPrevChatList,
- currentConversationId,
- currentConversationItem,
- inputsForms,
- newConversationInputs,
- handleNewConversationCompleted,
- isMobile,
- isInstalledApp,
- appId,
- appMeta,
- handleFeedback,
- currentChatInstanceRef,
- } = useChatWithHistoryContext()
- const appConfig = useMemo(() => {
- const config = appParams || {}
- return {
- ...config,
- supportFeedback: true,
- opening_statement: currentConversationId ? currentConversationItem?.introduction : (config as any).opening_statement,
- } as ChatConfig
- }, [appParams, currentConversationItem?.introduction, currentConversationId])
- const {
- chatList,
- handleSend,
- handleStop,
- isResponsing,
- suggestedQuestions,
- } = useChat(
- appConfig,
- {
- inputs: (currentConversationId ? currentConversationItem?.inputs : newConversationInputs) as any,
- promptVariables: inputsForms,
- },
- appPrevChatList,
- taskId => stopChatMessageResponding('', taskId, isInstalledApp, appId),
- )
- useEffect(() => {
- if (currentChatInstanceRef.current)
- currentChatInstanceRef.current.handleStop = handleStop
- }, [])
- const doSend: OnSend = useCallback((message, files) => {
- const data: any = {
- query: message,
- inputs: currentConversationId ? currentConversationItem?.inputs : newConversationInputs,
- conversation_id: currentConversationId,
- }
- if (appConfig?.file_upload?.image.enabled && files?.length)
- data.files = files
- handleSend(
- getUrl('chat-messages', isInstalledApp, appId || ''),
- data,
- {
- onGetSuggestedQuestions: responseItemId => fetchSuggestedQuestions(responseItemId, isInstalledApp, appId),
- onConversationComplete: currentConversationId ? undefined : handleNewConversationCompleted,
- isPublicAPI: !isInstalledApp,
- },
- )
- }, [
- appConfig,
- currentConversationId,
- currentConversationItem,
- handleSend,
- newConversationInputs,
- handleNewConversationCompleted,
- isInstalledApp,
- appId,
- ])
- const chatNode = useMemo(() => {
- if (inputsForms.length) {
- return (
- <>
- <Header
- isMobile={isMobile}
- title={currentConversationItem?.name || ''}
- />
- {
- !currentConversationId && (
- <div className={`mx-auto w-full max-w-[720px] ${isMobile && 'px-4'}`}>
- <div className='mb-6' />
- <ConfigPanel />
- <div
- className='my-6 h-[1px]'
- style={{ background: 'linear-gradient(90deg, rgba(242, 244, 247, 0.00) 0%, #F2F4F7 49.17%, rgba(242, 244, 247, 0.00) 100%)' }}
- />
- </div>
- )
- }
- </>
- )
- }
- return (
- <Header
- isMobile={isMobile}
- title={currentConversationItem?.name || ''}
- />
- )
- }, [
- currentConversationId,
- inputsForms,
- currentConversationItem,
- isMobile,
- ])
- return (
- <Chat
- config={appConfig}
- chatList={chatList}
- isResponsing={isResponsing}
- chatContainerInnerClassName={`mx-auto pt-6 w-full max-w-[720px] ${isMobile && 'px-4'}`}
- chatFooterClassName='pb-4'
- chatFooterInnerClassName={`mx-auto w-full max-w-[720px] ${isMobile && 'px-4'}`}
- onSend={doSend}
- onStopResponding={handleStop}
- chatNode={chatNode}
- allToolIcons={appMeta?.tool_icons || {}}
- onFeedback={handleFeedback}
- suggestedQuestions={suggestedQuestions}
- />
- )
- }
- export default ChatWrapper
|