Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

index.tsx 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import MessageItem from '@/components/message-item';
  2. import DocumentPreviewer from '@/components/pdf-previewer';
  3. import { MessageType } from '@/constants/chat';
  4. import { Drawer, Flex, Spin } from 'antd';
  5. import {
  6. useClickDrawer,
  7. useCreateConversationBeforeUploadDocument,
  8. useFetchConversationOnMount,
  9. useGetFileIcon,
  10. useGetSendButtonDisabled,
  11. useSendButtonDisabled,
  12. useSendMessage,
  13. } from '../hooks';
  14. import { buildMessageItemReference } from '../utils';
  15. import MessageInput from '@/components/message-input';
  16. import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
  17. import { memo } from 'react';
  18. import styles from './index.less';
  19. const ChatContainer = () => {
  20. const {
  21. ref,
  22. currentConversation: conversation,
  23. addNewestConversation,
  24. removeLatestMessage,
  25. addNewestAnswer,
  26. conversationId,
  27. loading,
  28. } = useFetchConversationOnMount();
  29. const {
  30. handleInputChange,
  31. handlePressEnter,
  32. value,
  33. loading: sendLoading,
  34. } = useSendMessage(
  35. conversation,
  36. addNewestConversation,
  37. removeLatestMessage,
  38. addNewestAnswer,
  39. );
  40. const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } =
  41. useClickDrawer();
  42. const disabled = useGetSendButtonDisabled();
  43. const sendDisabled = useSendButtonDisabled(value);
  44. useGetFileIcon();
  45. const { data: userInfo } = useFetchUserInfo();
  46. const { createConversationBeforeUploadDocument } =
  47. useCreateConversationBeforeUploadDocument();
  48. return (
  49. <>
  50. <Flex flex={1} className={styles.chatContainer} vertical>
  51. <Flex flex={1} vertical className={styles.messageContainer}>
  52. <div>
  53. <Spin spinning={loading}>
  54. {conversation?.message?.map((message, i) => {
  55. return (
  56. <MessageItem
  57. loading={
  58. message.role === MessageType.Assistant &&
  59. sendLoading &&
  60. conversation?.message.length - 1 === i
  61. }
  62. key={message.id}
  63. item={message}
  64. nickname={userInfo.nickname}
  65. avatar={userInfo.avatar}
  66. reference={buildMessageItemReference(conversation, message)}
  67. clickDocumentButton={clickDocumentButton}
  68. index={i}
  69. ></MessageItem>
  70. );
  71. })}
  72. </Spin>
  73. </div>
  74. <div ref={ref} />
  75. </Flex>
  76. <MessageInput
  77. disabled={disabled}
  78. sendDisabled={sendDisabled}
  79. sendLoading={sendLoading}
  80. value={value}
  81. onInputChange={handleInputChange}
  82. onPressEnter={handlePressEnter}
  83. conversationId={conversationId}
  84. createConversationBeforeUploadDocument={
  85. createConversationBeforeUploadDocument
  86. }
  87. ></MessageInput>
  88. </Flex>
  89. <Drawer
  90. title="Document Previewer"
  91. onClose={hideModal}
  92. open={visible}
  93. width={'50vw'}
  94. >
  95. <DocumentPreviewer
  96. documentId={documentId}
  97. chunk={selectedChunk}
  98. visible={visible}
  99. ></DocumentPreviewer>
  100. </Drawer>
  101. </>
  102. );
  103. };
  104. export default memo(ChatContainer);