chat-wrapper.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { useCallback, useEffect, useMemo } from 'react'
  2. import Chat from '../chat'
  3. import type {
  4. ChatConfig,
  5. OnSend,
  6. } from '../types'
  7. import { useChat } from '../chat/hooks'
  8. import { useChatWithHistoryContext } from './context'
  9. import Header from './header'
  10. import ConfigPanel from './config-panel'
  11. import {
  12. fetchSuggestedQuestions,
  13. getUrl,
  14. stopChatMessageResponding,
  15. } from '@/service/share'
  16. const ChatWrapper = () => {
  17. const {
  18. appParams,
  19. appPrevChatList,
  20. currentConversationId,
  21. currentConversationItem,
  22. inputsForms,
  23. newConversationInputs,
  24. handleNewConversationCompleted,
  25. isMobile,
  26. isInstalledApp,
  27. appId,
  28. appMeta,
  29. handleFeedback,
  30. currentChatInstanceRef,
  31. } = useChatWithHistoryContext()
  32. const appConfig = useMemo(() => {
  33. const config = appParams || {}
  34. return {
  35. ...config,
  36. supportFeedback: true,
  37. } as ChatConfig
  38. }, [appParams])
  39. const {
  40. chatList,
  41. handleSend,
  42. handleStop,
  43. isResponsing,
  44. suggestedQuestions,
  45. } = useChat(
  46. appConfig,
  47. undefined,
  48. appPrevChatList,
  49. taskId => stopChatMessageResponding('', taskId, isInstalledApp, appId),
  50. )
  51. useEffect(() => {
  52. if (currentChatInstanceRef.current)
  53. currentChatInstanceRef.current.handleStop = handleStop
  54. }, [])
  55. const doSend: OnSend = useCallback((message, files) => {
  56. const data: any = {
  57. query: message,
  58. inputs: currentConversationId ? currentConversationItem?.inputs : newConversationInputs,
  59. conversation_id: currentConversationId,
  60. }
  61. if (appConfig?.file_upload?.image.enabled && files?.length)
  62. data.files = files
  63. handleSend(
  64. getUrl('chat-messages', isInstalledApp, appId || ''),
  65. data,
  66. {
  67. onGetSuggestedQuestions: responseItemId => fetchSuggestedQuestions(responseItemId, isInstalledApp, appId),
  68. onConversationComplete: currentConversationId ? undefined : handleNewConversationCompleted,
  69. isPublicAPI: !isInstalledApp,
  70. },
  71. )
  72. }, [
  73. appConfig,
  74. currentConversationId,
  75. currentConversationItem,
  76. handleSend,
  77. newConversationInputs,
  78. handleNewConversationCompleted,
  79. isInstalledApp,
  80. appId,
  81. ])
  82. const chatNode = useMemo(() => {
  83. if (inputsForms.length) {
  84. return (
  85. <>
  86. <Header
  87. isMobile={isMobile}
  88. title={currentConversationItem?.name || ''}
  89. />
  90. {
  91. !currentConversationId && (
  92. <div className={`mx-auto w-full max-w-[720px] ${isMobile && 'px-4'}`}>
  93. <div className='mb-6' />
  94. <ConfigPanel />
  95. <div
  96. className='my-6 h-[1px]'
  97. style={{ background: 'linear-gradient(90deg, rgba(242, 244, 247, 0.00) 0%, #F2F4F7 49.17%, rgba(242, 244, 247, 0.00) 100%)' }}
  98. />
  99. </div>
  100. )
  101. }
  102. </>
  103. )
  104. }
  105. return (
  106. <Header
  107. isMobile={isMobile}
  108. title={currentConversationItem?.name || ''}
  109. />
  110. )
  111. }, [
  112. currentConversationId,
  113. inputsForms,
  114. currentConversationItem,
  115. isMobile,
  116. ])
  117. return (
  118. <Chat
  119. config={appConfig}
  120. chatList={chatList}
  121. isResponsing={isResponsing}
  122. chatContainerInnerClassName={`mx-auto pt-6 w-full max-w-[720px] ${isMobile && 'px-4'}`}
  123. chatFooterClassName='pb-4'
  124. chatFooterInnerClassName={`mx-auto w-full max-w-[720px] ${isMobile && 'px-4'}`}
  125. onSend={doSend}
  126. onStopResponding={handleStop}
  127. chatNode={chatNode}
  128. allToolIcons={appMeta?.tool_icons || {}}
  129. onFeedback={handleFeedback}
  130. suggestedQuestions={suggestedQuestions}
  131. />
  132. )
  133. }
  134. export default ChatWrapper