index.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <div class="message-item">
  3. <MessageTip v-if="isMessageTip(message)" :data="handleTipMessageShowContext(message)" />
  4. <MessageBubble
  5. v-else-if="!message.isRevoked"
  6. :data="message"
  7. :isH5="env.isH5"
  8. :messagesList="messageList"
  9. :needGroupReceipt="displayGroupMessageReadReceipt"
  10. :needReplies="true"
  11. :needEmojiReact="displayEmojiReactions"
  12. @jumpID="jumpID"
  13. @resendMessage="resendMessage"
  14. @showReadReceiptDialog="showReadReceiptDialog"
  15. @showRepliesDialog="showRepliesDialog"
  16. >
  17. <MessageText v-if="message.type === types.MSG_TEXT" :data="handleTextMessageShowContext(message)" />
  18. <MessageImage
  19. v-if="message.type === types.MSG_IMAGE"
  20. :isH5="env.isH5"
  21. :data="handleImageMessageShowContext(message)"
  22. @uploading="uploading"
  23. @previewImage="previewImage"
  24. />
  25. <MessageVideo
  26. v-if="message.type === types.MSG_VIDEO"
  27. :isH5="env.isH5"
  28. :data="handleVideoMessageShowContext(message)"
  29. @uploading="uploading"
  30. />
  31. <MessageAudio v-if="message.type === types.MSG_AUDIO" :data="handleAudioMessageShowContext(message)" />
  32. <MessageFile v-if="message.type === types.MSG_FILE" :data="handleFileMessageShowContext(message)" />
  33. <MessageFace v-if="message.type === types.MSG_FACE" :data="handleFaceMessageShowContext(message)" :isH5="env.isH5"/>
  34. <MessageLocation v-if="message.type === types.MSG_LOCATION" :data="handleLocationMessageShowContext(message)" />
  35. <MessageCustom v-if="message.type === types.MSG_CUSTOM" :data="handleCustomMessageShowContext(message)" />
  36. <MessageMerger v-if="message.type === types.MSG_MERGER" :data="handleMergerMessageShowContext(message)" />
  37. <template #dialog>
  38. <MessageTool :message="message" :needEmojiReact="displayEmojiReactions" @handleMessage="handleMessage" />
  39. <MessageEmojiReact v-if="!env?.isH5 && displayEmojiReactions" :message="message" type="dropdown" />
  40. </template>
  41. </MessageBubble>
  42. <MessageRevoked v-else :isEdit="message.type === types.MSG_TEXT" :data="message" @edit="handleEdit(message)" />
  43. </div>
  44. </template>
  45. <script setup lang="ts">
  46. import { toRefs, defineProps, defineEmits } from 'vue';
  47. import MessageBubble from './message-bubble.vue';
  48. import MessageText from './message-text.vue';
  49. import MessageImage from './message-image.vue';
  50. import MessageVideo from './message-video.vue';
  51. import MessageAudio from './message-audio.vue';
  52. import MessageFile from './message-file.vue';
  53. import MessageFace from './message-face.vue';
  54. import MessageLocation from './message-location.vue';
  55. import MessageMerger from './message-merger.vue';
  56. import MessageCustom from './message-custom.vue';
  57. import MessageTip from './message-tip.vue';
  58. import MessageTool from './message-tool.vue';
  59. import MessageEmojiReact from './message-emoji-react.vue';
  60. import MessageRevoked from './message-revoked.vue';
  61. import {
  62. handleTextMessageShowContext,
  63. handleImageMessageShowContext,
  64. handleVideoMessageShowContext,
  65. handleAudioMessageShowContext,
  66. handleFileMessageShowContext,
  67. handleFaceMessageShowContext,
  68. handleLocationMessageShowContext,
  69. handleMergerMessageShowContext,
  70. handleTipMessageShowContext,
  71. handleCustomMessageShowContext,
  72. isMessageTip,
  73. } from '../utils/utils';
  74. import { Message } from '@tencentcloud/chat';
  75. import constant from '../../constant';
  76. const props = defineProps({
  77. message: {
  78. type: Object,
  79. default: () => ({}),
  80. },
  81. beforeMessage: {
  82. type: Object,
  83. default: () => ({}),
  84. },
  85. types: {
  86. type: Object,
  87. default: () => ({}),
  88. },
  89. env: {
  90. type: Object,
  91. default: () => ({}),
  92. },
  93. messageList: {
  94. type: Array,
  95. default: () => [],
  96. },
  97. // 开关控制位
  98. displayGroupMessageReadReceipt: {
  99. type: Boolean,
  100. default: true,
  101. },
  102. displayEmojiReactions: {
  103. type: Boolean,
  104. default: true,
  105. },
  106. });
  107. const emits = defineEmits(['handleEditor', 'showDialog', 'uploading', 'jumpID','resendMessage']);
  108. const { message, types, env, messageList, displayGroupMessageReadReceipt, displayEmojiReactions } = toRefs(props);
  109. const handleEdit = (message: any) => {
  110. emits('handleEditor', message, 'reedit');
  111. };
  112. const handleMessage = (message: Message, type: string) => {
  113. if (!message || !type) {
  114. return;
  115. }
  116. switch (type) {
  117. case constant.handleMessage.forward:
  118. emits('showDialog', message, constant.handleMessage.forward);
  119. break;
  120. case constant.handleMessage.reference:
  121. emits('handleEditor', message, constant.handleMessage.reference);
  122. break;
  123. case constant.handleMessage.reply:
  124. emits('handleEditor', message, constant.handleMessage.reply);
  125. break;
  126. default:
  127. break;
  128. }
  129. };
  130. const previewImage = (message: Message) => {
  131. if (message) {
  132. emits('showDialog', message, 'previewImage');
  133. }
  134. };
  135. const showReadReceiptDialog = (message: Message) => {
  136. if (message) {
  137. emits('showDialog', message, 'receipt');
  138. }
  139. };
  140. const showRepliesDialog = (message: Message) => {
  141. if (message) {
  142. emits('showDialog', message, 'replies');
  143. }
  144. };
  145. const jumpID = (messageID: string) => {
  146. if (messageID) {
  147. emits('jumpID', messageID);
  148. }
  149. };
  150. const uploading = () => {
  151. emits('uploading');
  152. };
  153. const resendMessage = (message: Message) => {
  154. if (message) {
  155. emits('resendMessage', message);
  156. }
  157. }
  158. </script>
  159. <style lang="scss" scoped>
  160. @import url('../../../styles/common.scss');
  161. @import url('../../../styles/icon.scss');
  162. .message-item {
  163. display: flex;
  164. flex-direction: column;
  165. }
  166. </style>