index.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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://oss.dayaedu.com/news-info/07/1690787574969.png'" onerror="this.src='https://oss.dayaedu.com/news-info/07/1690787574969.png'" />
  42. </div>
  43. </div>
  44. </DialogTUI> -->
  45. </div>
  46. </template>
  47. <script setup lang="ts">
  48. import { toRefs, defineProps, defineEmits, ref, onMounted } 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. import manage from "../manage-components/manage.vue";
  80. const props = defineProps({
  81. message: {
  82. type: Object,
  83. default: () => ({}),
  84. },
  85. beforeMessage: {
  86. type: Object,
  87. default: () => ({}),
  88. },
  89. types: {
  90. type: Object,
  91. default: () => ({}),
  92. },
  93. env: {
  94. type: Object,
  95. default: () => ({}),
  96. },
  97. messageList: {
  98. type: Array,
  99. default: () => [],
  100. },
  101. // 开关控制位
  102. displayGroupMessageReadReceipt: {
  103. type: Boolean,
  104. default: true,
  105. },
  106. displayEmojiReactions: {
  107. type: Boolean,
  108. default: true,
  109. },
  110. });
  111. const TUIServer = manage?.TUIServer;
  112. const dialogShow = ref(false);
  113. const dialogMessageList = ref([] as any);
  114. const emits = defineEmits(["handleEditor", "showDialog", "uploading", "jumpID", "resendMessage"]);
  115. const { message, types, env, messageList, displayGroupMessageReadReceipt, displayEmojiReactions } = toRefs(props);
  116. onMounted(async () => {
  117. // 处理显示tip消息,不显示名称的问题
  118. if (props.message?.payload?.operatorID && props.message?.payload?.operatorID.indexOf("KT") != -1) {
  119. const operatorInfo = await TUIServer.getUserProfile([props.message?.payload?.operatorID]);
  120. console.log(operatorInfo, "operatorInfo");
  121. message.value.payload.operatorID = operatorInfo.data[0]?.nick;
  122. if (props.message?.payload?.newGroupProfile?.ownerID) {
  123. const newOperatorInfo = await TUIServer.getUserProfile([props.message?.payload?.newGroupProfile?.ownerID]);
  124. message.value.payload.newGroupProfile.ownerID = newOperatorInfo.data[0]?.nick;
  125. }
  126. } else if (props.message?.payload?.operatorID === "mec_admin") {
  127. message.value.payload.operatorID = "";
  128. }
  129. });
  130. const handleEdit = (message: any) => {
  131. emits("handleEditor", message, "reedit");
  132. };
  133. const handleMessage = (message: Message, type: string) => {
  134. if (!message || !type) {
  135. return;
  136. }
  137. switch (type) {
  138. case constant.handleMessage.forward:
  139. emits("showDialog", message, constant.handleMessage.forward);
  140. break;
  141. case constant.handleMessage.reference:
  142. emits("handleEditor", message, constant.handleMessage.reference);
  143. break;
  144. case constant.handleMessage.reply:
  145. emits("handleEditor", message, constant.handleMessage.reply);
  146. break;
  147. default:
  148. break;
  149. }
  150. };
  151. const previewImage = (message: Message) => {
  152. if (message) {
  153. emits("showDialog", message, "previewImage");
  154. }
  155. };
  156. const showReadReceiptDialog = (message: Message) => {
  157. if (message) {
  158. emits("showDialog", message, "receipt");
  159. }
  160. };
  161. const showRepliesDialog = (message: Message) => {
  162. if (message) {
  163. emits("showDialog", message, "replies");
  164. }
  165. };
  166. const jumpID = (messageID: string) => {
  167. if (messageID) {
  168. emits("jumpID", messageID);
  169. }
  170. };
  171. const uploading = () => {
  172. emits("uploading");
  173. };
  174. const resendMessage = (message: Message) => {
  175. if (message) {
  176. emits("resendMessage", message);
  177. }
  178. };
  179. </script>
  180. <style lang="scss" scoped>
  181. @import url("../../../styles/common.scss");
  182. @import url("../../../styles/icon.scss");
  183. .message-item {
  184. display: flex;
  185. flex-direction: column;
  186. }
  187. </style>