You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

chat-box.tsx 3.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { NextMessageInput } from '@/components/message-input/next';
  2. import MessageItem from '@/components/message-item';
  3. import { MessageType } from '@/constants/chat';
  4. import {
  5. useFetchConversation,
  6. useFetchDialog,
  7. useGetChatSearchParams,
  8. } from '@/hooks/use-chat-request';
  9. import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
  10. import { buildMessageUuidWithRole } from '@/utils/chat';
  11. import {
  12. useGetSendButtonDisabled,
  13. useSendButtonDisabled,
  14. } from '../hooks/use-button-disabled';
  15. import { useCreateConversationBeforeUploadDocument } from '../hooks/use-create-conversation';
  16. import { useSendMessage } from '../hooks/use-send-chat-message';
  17. import { buildMessageItemReference } from '../utils';
  18. interface IProps {
  19. controller: AbortController;
  20. }
  21. export function ChatBox({ controller }: IProps) {
  22. const {
  23. value,
  24. // scrollRef,
  25. messageContainerRef,
  26. sendLoading,
  27. derivedMessages,
  28. handleInputChange,
  29. handlePressEnter,
  30. regenerateMessage,
  31. removeMessageById,
  32. stopOutputMessage,
  33. } = useSendMessage(controller);
  34. const { data: userInfo } = useFetchUserInfo();
  35. const { data: currentDialog } = useFetchDialog();
  36. const { createConversationBeforeUploadDocument } =
  37. useCreateConversationBeforeUploadDocument();
  38. const { conversationId } = useGetChatSearchParams();
  39. const { data: conversation } = useFetchConversation();
  40. const disabled = useGetSendButtonDisabled();
  41. const sendDisabled = useSendButtonDisabled(value);
  42. return (
  43. <section className="border-x flex flex-col p-5 flex-1 min-w-0">
  44. <div ref={messageContainerRef} className="flex-1 overflow-auto min-h-0">
  45. <div className="w-full">
  46. {derivedMessages?.map((message, i) => {
  47. return (
  48. <MessageItem
  49. loading={
  50. message.role === MessageType.Assistant &&
  51. sendLoading &&
  52. derivedMessages.length - 1 === i
  53. }
  54. key={buildMessageUuidWithRole(message)}
  55. item={message}
  56. nickname={userInfo.nickname}
  57. avatar={userInfo.avatar}
  58. avatarDialog={currentDialog.icon}
  59. reference={buildMessageItemReference(
  60. {
  61. message: derivedMessages,
  62. reference: conversation.reference,
  63. },
  64. message,
  65. )}
  66. // clickDocumentButton={clickDocumentButton}
  67. index={i}
  68. removeMessageById={removeMessageById}
  69. regenerateMessage={regenerateMessage}
  70. sendLoading={sendLoading}
  71. ></MessageItem>
  72. );
  73. })}
  74. </div>
  75. {/* <div ref={scrollRef} /> */}
  76. </div>
  77. <NextMessageInput
  78. disabled={disabled}
  79. sendDisabled={sendDisabled}
  80. sendLoading={sendLoading}
  81. value={value}
  82. onInputChange={handleInputChange}
  83. onPressEnter={handlePressEnter}
  84. conversationId={conversationId}
  85. createConversationBeforeUploadDocument={
  86. createConversationBeforeUploadDocument
  87. }
  88. stopOutputMessage={stopOutputMessage}
  89. />
  90. </section>
  91. );
  92. }