index.vue 6.2 KB

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