lex hai 1 ano
pai
achega
a1b468945c

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/index-03537d21.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/index-0c3af764.js


+ 2 - 2
dist/index.html

@@ -6,8 +6,8 @@
   <link rel="icon" type="image/svg+xml" href="./vite.svg" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <title>IM</title>
-  <script type="module" crossorigin src="./assets/index-d82e1aac.js"></script>
-  <link rel="stylesheet" href="./assets/index-c8c610a7.css">
+  <script type="module" crossorigin src="./assets/index-0c3af764.js"></script>
+  <link rel="stylesheet" href="./assets/index-03537d21.css">
 </head>
 
 <body>

+ 54 - 49
src/TUIKit/TUIComponents/container/TUIChat/components/index.vue

@@ -15,50 +15,54 @@
       @showRepliesDialog="showRepliesDialog"
     >
       <MessageText v-if="message.type === types.MSG_TEXT" :data="handleTextMessageShowContext(message)" />
-      <MessageImage
-        v-if="message.type === types.MSG_IMAGE"
-        :isH5="env.isH5"
-        :data="handleImageMessageShowContext(message)"
-        @uploading="uploading"
-        @previewImage="previewImage"
-      />
-      <MessageVideo
-        v-if="message.type === types.MSG_VIDEO"
-        :isH5="env.isH5"
-        :data="handleVideoMessageShowContext(message)"
-        @uploading="uploading"
-      />
+      <MessageImage v-if="message.type === types.MSG_IMAGE" :isH5="env.isH5" :data="handleImageMessageShowContext(message)" @uploading="uploading" @previewImage="previewImage" />
+      <MessageVideo v-if="message.type === types.MSG_VIDEO" :isH5="env.isH5" :data="handleVideoMessageShowContext(message)" @uploading="uploading" />
       <MessageAudio v-if="message.type === types.MSG_AUDIO" :data="handleAudioMessageShowContext(message)" />
       <MessageFile v-if="message.type === types.MSG_FILE" :data="handleFileMessageShowContext(message)" />
-      <MessageFace v-if="message.type === types.MSG_FACE" :data="handleFaceMessageShowContext(message)" :isH5="env.isH5"/>
+      <MessageFace v-if="message.type === types.MSG_FACE" :data="handleFaceMessageShowContext(message)" :isH5="env.isH5" />
       <MessageLocation v-if="message.type === types.MSG_LOCATION" :data="handleLocationMessageShowContext(message)" />
       <MessageCustom v-if="message.type === types.MSG_CUSTOM" :data="handleCustomMessageShowContext(message)" />
       <MessageMerger v-if="message.type === types.MSG_MERGER" :data="handleMergerMessageShowContext(message)" />
+      <!-- @click="
+          () => {
+            dialogShow = true;
+            dialogMessageList = message.payload.messageList || [];
+          }
+        " -->
       <template #dialog>
         <MessageTool :message="message" :needEmojiReact="displayEmojiReactions" @handleMessage="handleMessage" />
-        <MessageEmojiReact v-if="!env?.isH5 && displayEmojiReactions" :message="message" type="dropdown" />
+        <!-- <MessageEmojiReact v-if="!env?.isH5 && displayEmojiReactions" :message="message" type="dropdown" /> -->
       </template>
     </MessageBubble>
     <MessageRevoked v-else :isEdit="message.type === types.MSG_TEXT" :data="message" @edit="handleEdit(message)" />
+
+    <!-- <DialogTUI :show="dialogShow" :isHeaderShow="false" :is-footer-show="false" @update:show="(e) => (dialogShow = e)">
+      <div v-for="(item, index) in dialogMessageList" :key="index">
+        <div class="dialogItem">
+          <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'" />
+        </div>
+      </div>
+    </DialogTUI> -->
   </div>
 </template>
 
 <script setup lang="ts">
-import { toRefs, defineProps, defineEmits } from 'vue';
-import MessageBubble from './message-bubble.vue';
-import MessageText from './message-text.vue';
-import MessageImage from './message-image.vue';
-import MessageVideo from './message-video.vue';
-import MessageAudio from './message-audio.vue';
-import MessageFile from './message-file.vue';
-import MessageFace from './message-face.vue';
-import MessageLocation from './message-location.vue';
-import MessageMerger from './message-merger.vue';
-import MessageCustom from './message-custom.vue';
-import MessageTip from './message-tip.vue';
-import MessageTool from './message-tool.vue';
-import MessageEmojiReact from './message-emoji-react.vue';
-import MessageRevoked from './message-revoked.vue';
+import { toRefs, defineProps, defineEmits, ref } from "vue";
+import MessageBubble from "./message-bubble.vue";
+import MessageText from "./message-text.vue";
+import MessageImage from "./message-image.vue";
+import MessageVideo from "./message-video.vue";
+import MessageAudio from "./message-audio.vue";
+import MessageFile from "./message-file.vue";
+import MessageFace from "./message-face.vue";
+import MessageLocation from "./message-location.vue";
+import MessageMerger from "./message-merger.vue";
+import MessageCustom from "./message-custom.vue";
+import MessageTip from "./message-tip.vue";
+import MessageTool from "./message-tool.vue";
+import MessageEmojiReact from "./message-emoji-react.vue";
+import MessageRevoked from "./message-revoked.vue";
+import DialogTUI from "../../../components/dialogTUi/index.vue";
 
 import {
   handleTextMessageShowContext,
@@ -72,9 +76,9 @@ import {
   handleTipMessageShowContext,
   handleCustomMessageShowContext,
   isMessageTip,
-} from '../utils/utils';
-import { Message } from '@tencentcloud/chat';
-import constant from '../../constant';
+} from "../utils/utils";
+import { Message } from "@tencentcloud/chat";
+import constant from "../../constant";
 
 const props = defineProps({
   message: {
@@ -107,12 +111,13 @@ const props = defineProps({
     default: true,
   },
 });
-
-const emits = defineEmits(['handleEditor', 'showDialog', 'uploading', 'jumpID','resendMessage']);
+const dialogShow = ref(false);
+const dialogMessageList = ref([] as any);
+const emits = defineEmits(["handleEditor", "showDialog", "uploading", "jumpID", "resendMessage"]);
 const { message, types, env, messageList, displayGroupMessageReadReceipt, displayEmojiReactions } = toRefs(props);
-
+console.log(props.messageList, "message", props.message, "121212");
 const handleEdit = (message: any) => {
-  emits('handleEditor', message, 'reedit');
+  emits("handleEditor", message, "reedit");
 };
 
 const handleMessage = (message: Message, type: string) => {
@@ -121,13 +126,13 @@ const handleMessage = (message: Message, type: string) => {
   }
   switch (type) {
     case constant.handleMessage.forward:
-      emits('showDialog', message, constant.handleMessage.forward);
+      emits("showDialog", message, constant.handleMessage.forward);
       break;
     case constant.handleMessage.reference:
-      emits('handleEditor', message, constant.handleMessage.reference);
+      emits("handleEditor", message, constant.handleMessage.reference);
       break;
     case constant.handleMessage.reply:
-      emits('handleEditor', message, constant.handleMessage.reply);
+      emits("handleEditor", message, constant.handleMessage.reply);
       break;
     default:
       break;
@@ -136,41 +141,41 @@ const handleMessage = (message: Message, type: string) => {
 
 const previewImage = (message: Message) => {
   if (message) {
-    emits('showDialog', message, 'previewImage');
+    emits("showDialog", message, "previewImage");
   }
 };
 
 const showReadReceiptDialog = (message: Message) => {
   if (message) {
-    emits('showDialog', message, 'receipt');
+    emits("showDialog", message, "receipt");
   }
 };
 
 const showRepliesDialog = (message: Message) => {
   if (message) {
-    emits('showDialog', message, 'replies');
+    emits("showDialog", message, "replies");
   }
 };
 
 const jumpID = (messageID: string) => {
   if (messageID) {
-    emits('jumpID', messageID);
+    emits("jumpID", messageID);
   }
 };
 
 const uploading = () => {
-  emits('uploading');
+  emits("uploading");
 };
 
 const resendMessage = (message: Message) => {
   if (message) {
-    emits('resendMessage', message);
+    emits("resendMessage", message);
   }
-}
+};
 </script>
 <style lang="scss" scoped>
-@import url('../../../styles/common.scss');
-@import url('../../../styles/icon.scss');
+@import url("../../../styles/common.scss");
+@import url("../../../styles/icon.scss");
 .message-item {
   display: flex;
   flex-direction: column;

+ 145 - 319
src/TUIKit/TUIComponents/container/TUIChat/components/message-bubble.vue

@@ -1,177 +1,91 @@
 <template>
-  <div
-    class="message-bubble"
-    :class="[message.flow === 'in' ? '' : 'reverse']"
-    ref="htmlRefHook"
-  >
-    <img
-      class="avatar"
-      :src="
-        message?.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'"
-    />
+  <div class="message-bubble" :class="[message.flow === 'in' ? '' : 'reverse']" ref="htmlRefHook">
+    <img class="avatar" :src="message?.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'" />
     <main class="message-area">
-      <label
-        class="name"
-        v-if="message.flow === 'in' && message.conversationType === 'GROUP'"
-      >
+      <label class="name" v-if="message.flow === 'in' && message.conversationType === 'GROUP'">
         {{ message.nameCard || message.nick || message.from }}
       </label>
-      <div
-        :class="handleImageOrVideoBubbleStyle(message)"
-        @click.prevent.right="toggleDialog"
-      >
-        <div
-          class="message-replie-area"
-          :class="[
-            message?.flow === 'in' ? '' : 'message-replies-area-reverse'
-          ]"
-          v-if="
-            message?.cloudCustomData &&
-            referenceMessage &&
-            referenceMessage?.messageRootID
-          "
-          @click="showRepliesDialog(message, false)"
-        >
-          <MessageReference
-            :message="message"
-            :referenceMessage="referenceMessage"
-            :referenceForShow="referenceForShow"
-            :url="url"
-            :face="face"
-            :allMessageID="allMessageID"
-            type="reply"
-          />
+      <div :class="handleImageOrVideoBubbleStyle(message)" @click.prevent.right="toggleDialog">
+        <div class="message-replie-area" :class="[message?.flow === 'in' ? '' : 'message-replies-area-reverse']" v-if="message?.cloudCustomData && referenceMessage && referenceMessage?.messageRootID" @click="showRepliesDialog(message, false)">
+          <MessageReference :message="message" :referenceMessage="referenceMessage" :referenceForShow="referenceForShow" :url="url" :face="face" :allMessageID="allMessageID" type="reply" />
         </div>
         <slot />
         <div v-if="dropdown" ref="dropdownRef" class="dropdown-inner">
-          <div
-            class="dialog"
-            :class="[message.flow === 'in' ? '' : 'dialog-right']"
-            @click="dropdown = false"
-          >
+          <div class="dialog" :class="[message.flow === 'in' ? '' : 'dialog-right']" @click="dropdown = false">
             <slot name="dialog" />
           </div>
         </div>
-        <MessageEmojiReact
-          :message="message"
-          type="content"
-          v-if="needEmojiReact && isEmojiReactionInMessage(message)"
-        />
+        <MessageEmojiReact :message="message" type="content" v-if="needEmojiReact && isEmojiReactionInMessage(message)" />
       </div>
     </main>
-    <label
-      class="message-label fail"
-      v-if="message.status === 'fail'"
-      @click="resendMessage(message)"
-    >
-      !
-    </label>
-    <label
+    <label class="message-label fail" v-if="message.status === 'fail'" @click="resendMessage(message)"> ! </label>
+    <!-- <label
       class="message-label"
       :class="readReceiptStyle(message)"
       v-if="showReadReceiptTag(message)"
       @click="showReadReceiptDialog(message)"
     >
       <span>{{ readReceiptCont(message) }}</span>
-    </label>
+    </label> -->
   </div>
-  <div
-    class="message-reference-area"
-    :class="[message.flow === 'in' ? '' : 'message-reference-area-reverse']"
-    v-if="
-      message?.cloudCustomData &&
-      referenceMessage &&
-      !referenceMessage?.messageRootID
-    "
-    @click="jumpToAim(referenceMessage)"
-  >
-    <MessageReference
-      :message="message"
-      :referenceMessage="referenceMessage"
-      :referenceForShow="referenceForShow"
-      :url="url"
-      :face="face"
-      :allMessageID="allMessageID"
-      type="reference"
-    />
+  <div class="message-reference-area" :class="[message.flow === 'in' ? '' : 'message-reference-area-reverse']" v-if="message?.cloudCustomData && referenceMessage && !referenceMessage?.messageRootID" @click="jumpToAim(referenceMessage)">
+    <MessageReference :message="message" :referenceMessage="referenceMessage" :referenceForShow="referenceForShow" :url="url" :face="face" :allMessageID="allMessageID" type="reference" />
   </div>
-  <label
-    class="message-replies"
-    :class="[message.flow === 'in' ? '' : 'message-replies-reverse']"
-    v-if="replies?.length"
-    @click="showRepliesDialog(message, true)"
-  >
+  <label class="message-replies" :class="[message.flow === 'in' ? '' : 'message-replies-reverse']" v-if="replies?.length" @click="showRepliesDialog(message, true)">
     <i class="icon icon-msg-replies"></i>
-    <span>{{ replies?.length + $t('TUIChat.条回复') }}</span>
+    <span>{{ replies?.length + $t("TUIChat.条回复") }}</span>
   </label>
 </template>
 
 <script lang="ts">
-import { decodeText } from '../utils/decodeText';
-import constant from '../../constant';
-import {
-  defineComponent,
-  watchEffect,
-  reactive,
-  toRefs,
-  ref,
-  nextTick,
-  watch
-} from 'vue';
-import { onClickOutside, onLongPress, useElementBounding } from '@vueuse/core';
-import { deepCopy, JSONToObject } from '../utils/utils';
-import { handleErrorPrompts } from '../../utils';
-import TUIChat from '../index.vue';
-import MessageReference from './message-reference.vue';
-import { Message } from '../interface';
-import { TUIEnv } from '../../../../TUIPlugin';
-import MessageEmojiReact from './message-emoji-react.vue';
-import TIM from '../../../../TUICore/tim/index';
+import { decodeText } from "../utils/decodeText";
+import constant from "../../constant";
+import { defineComponent, watchEffect, reactive, toRefs, ref, nextTick, watch } from "vue";
+import { onClickOutside, onLongPress, useElementBounding } from "@vueuse/core";
+import { deepCopy, JSONToObject } from "../utils/utils";
+import { handleErrorPrompts } from "../../utils";
+import TUIChat from "../index.vue";
+import MessageReference from "./message-reference.vue";
+import { Message } from "../interface";
+import { TUIEnv } from "../../../../TUIPlugin";
+import MessageEmojiReact from "./message-emoji-react.vue";
+import TIM from "../../../../TUICore/tim/index";
 
 const messageBubble = defineComponent({
   props: {
     data: {
       type: Object,
-      default: () => ({})
+      default: () => ({}),
     },
     messagesList: {
       type: Array,
-      default: () => []
+      default: () => [],
     },
     isH5: {
       type: Boolean,
-      default: false
+      default: false,
     },
     needGroupReceipt: {
       type: Boolean,
-      default: false
+      default: false,
     },
     needReplies: {
       type: Boolean,
-      default: true
+      default: true,
     },
     flow: {
       type: String,
-      default: ''
+      default: "",
     },
     needEmojiReact: {
       type: Boolean,
-      default: false
-    }
+      default: false,
+    },
   },
-  emits: [
-    'jumpID',
-    'resendMessage',
-    'showReadReceiptDialog',
-    'showRepliesDialog',
-    'dropDownOpen'
-  ],
+  emits: ["jumpID", "resendMessage", "showReadReceiptDialog", "showRepliesDialog", "dropDownOpen"],
   components: {
     MessageReference,
-    MessageEmojiReact
+    MessageEmojiReact,
   },
   setup(props: any, ctx: any) {
     const { t } = (window as any).TUIKitTUICore.config.i18n.useI18n();
@@ -184,63 +98,38 @@ const messageBubble = defineComponent({
       type: {},
       referenceMessage: {},
       referenceForShow: {},
-      allMessageID: '',
+      allMessageID: "",
       needGroupReceipt: false,
       needReplies: true,
       replies: [],
       face: [],
-      url: '',
-      needEmojiReact: false
+      url: "",
+      needEmojiReact: false,
     });
 
     watchEffect(() => {
       data.type = constant;
       data.messagesList = props.messagesList;
       data.needEmojiReact = props.needEmojiReact;
-      data.message = deepCopy(
-        data.messagesList?.find(
-          (item: any) => (item as any)?.ID === props.message?.ID
-        ) || props.data
-      );
+      data.message = deepCopy(data.messagesList?.find((item: any) => (item as any)?.ID === props.message?.ID) || props.data);
       data.needGroupReceipt = props.needGroupReceipt;
       data.needReplies = props.needReplies;
       if ((data.message as any).cloudCustomData) {
         const messageIDList: any[] = [];
-        const cloudCustomData = JSONToObject(
-          (data.message as any).cloudCustomData
-        );
+        const cloudCustomData = JSONToObject((data.message as any).cloudCustomData);
         data.replies = cloudCustomData?.messageReplies?.replies || [];
-        data.referenceMessage = cloudCustomData.messageReply
-          ? cloudCustomData.messageReply
-          : '';
-        for (
-          let index = 0;
-          index < (data.messagesList as any).length;
-          index++
-        ) {
+        data.referenceMessage = cloudCustomData.messageReply ? cloudCustomData.messageReply : "";
+        for (let index = 0; index < (data.messagesList as any).length; index++) {
           // To determine whether the referenced message is still in the message list, the corresponding field of the referenced message is displayed if it is in the message list. Otherwise, messageabstract/messagesender is displayed
           messageIDList.push((data.messagesList as any)[index].ID);
           (data as any).allMessageID = JSON.stringify(messageIDList);
-          if (
-            (data.messagesList as any)[index].ID ===
-            (data.referenceMessage as any)?.messageID
-          ) {
+          if ((data.messagesList as any)[index].ID === (data.referenceMessage as any)?.messageID) {
             data.referenceForShow = (data.messagesList as any)[index];
-            if (
-              (data.referenceMessage as any).messageType === constant.typeText
-            ) {
-              (data as any).face = decodeText(
-                (data.referenceForShow as any).payload
-              );
+            if ((data.referenceMessage as any).messageType === constant.typeText) {
+              (data as any).face = decodeText((data.referenceForShow as any).payload);
             }
-            if (
-              (data.referenceMessage as any).messageType === constant.typeFace
-            ) {
-              (
-                data as any
-              ).url = `https://web.sdk.qcloud.com/im/assets/face-elem/${
-                (data.referenceForShow as any).payload.data
-              }@2x.png`;
+            if ((data.referenceMessage as any).messageType === constant.typeFace) {
+              (data as any).url = `https://web.sdk.qcloud.com/im/assets/face-elem/${(data.referenceForShow as any).payload.data}@2x.png`;
             }
           }
         }
@@ -256,50 +145,34 @@ const messageBubble = defineComponent({
     const toggleDialog = (e: any) => {
       dropdown.value = !dropdown.value;
       if (dropdown.value) {
-        ctx.emit('dropDownOpen', dropdownRef);
+        ctx.emit("dropDownOpen", dropdownRef);
         nextTick(() => {
           const dialogDom = (dropdownRef as any)?.value?.children[0];
-          const dialogElement = document.getElementsByClassName(
-            'dialog-item'
-          )[0] as HTMLElement;
+          const dialogElement = document.getElementsByClassName("dialog-item")[0] as HTMLElement;
           const parentDom = (dropdownRef as any)?.value?.offsetParent;
           const parentBound = useElementBounding(parentDom);
-          const messageListDom = document.getElementById(
-            'messageEle'
-          ) as HTMLElement;
+          const messageListDom = document.getElementById("messageEle") as HTMLElement;
           const messageListBound = useElementBounding(messageListDom);
           const leftRange = messageListBound?.left?.value;
-          const rightRange =
-            messageListBound?.left?.value +
-            (messageListDom as any).clientWidth -
-            dialogDom.clientWidth +
-            76;
+          const rightRange = messageListBound?.left?.value + (messageListDom as any).clientWidth - dialogDom.clientWidth + 76;
           const topRange = messageListBound?.top?.value;
-          const bottomRange =
-            messageListBound?.top?.value +
-            (messageListDom as any).clientHeight -
-            dialogDom.clientHeight;
+          const bottomRange = messageListBound?.top?.value + (messageListDom as any).clientHeight - dialogDom.clientHeight;
           const { clientX, clientY } = e;
           if (data?.env?.isH5) {
             if (parentBound?.top?.value <= dialogElement?.clientHeight) {
               dialogDom.style.bottom = `-${dialogElement?.clientHeight}Px`;
             } else {
-              if (data?.message?.flow === 'in') {
+              if (data?.message?.flow === "in") {
                 dialogDom.style.top = `-${dialogElement?.clientHeight - 20}Px`;
               } else {
                 dialogDom.style.top = `-${dialogElement?.clientHeight}Px`;
               }
             }
-            const centerWidth =
-              parentBound?.left?.value + parentBound?.width?.value / 2;
-            if (
-              centerWidth > dialogElement.clientWidth / 2 &&
-              centerWidth <
-                messageListDom?.clientWidth - dialogElement.clientWidth / 2
-            ) {
-              dialogDom.style.left = 'calc(50% - 135Px)';
+            const centerWidth = parentBound?.left?.value + parentBound?.width?.value / 2;
+            if (centerWidth > dialogElement.clientWidth / 2 && centerWidth < messageListDom?.clientWidth - dialogElement.clientWidth / 2) {
+              dialogDom.style.left = "calc(50% - 135Px)";
             } else if (centerWidth <= dialogElement.clientWidth / 2) {
-              dialogDom.style.left = '-20Px';
+              dialogDom.style.left = "-20Px";
             } else {
               dialogDom.style.left = `-${dialogElement.clientWidth / 2 + 10}Px`;
             }
@@ -307,44 +180,27 @@ const messageBubble = defineComponent({
           }
           switch (true) {
             case clientX > leftRange && clientX < rightRange:
-              dialogDom.style.left = `${Math.max(
-                e.clientX - parentBound?.left?.value - 76,
-                -40
-              )}Px`;
+              dialogDom.style.left = `${Math.max(e.clientX - parentBound?.left?.value - 76, -40)}Px`;
               break;
             case clientX <= leftRange:
-              dialogDom.style.left = '20Px';
+              dialogDom.style.left = "20Px";
               break;
             case clientX >= rightRange:
-              dialogDom.style.right = `${Math.max(
-                parentBound?.left?.value +
-                  parentDom?.clientWidth -
-                  e.clientX -
-                  256,
-                -10
-              )}Px`;
+              dialogDom.style.right = `${Math.max(parentBound?.left?.value + parentDom?.clientWidth - e.clientX - 256, -10)}Px`;
               break;
           }
           switch (true) {
             case clientY > topRange && clientY < bottomRange:
               dialogDom.style.top = `${e.clientY - parentBound?.top?.value}Px`;
-              dialogDom.style.cssText = dialogDom.style.cssText.replace(
-                'align-items:end;',
-                ''
-              );
+              dialogDom.style.cssText = dialogDom.style.cssText.replace("align-items:end;", "");
               break;
             case clientY <= topRange:
-              dialogDom.style.top = '0Px';
-              dialogDom.style.cssText = dialogDom.style.cssText.replace(
-                'align-items:end;',
-                ''
-              );
+              dialogDom.style.top = "0Px";
+              dialogDom.style.cssText = dialogDom.style.cssText.replace("align-items:end;", "");
               break;
             case clientY >= bottomRange:
-              dialogDom.style.bottom = `${
-                parentBound?.top?.value + parentDom?.clientHeight - e.clientY
-              }Px`;
-              dialogDom.style.cssText += 'align-items:end;';
+              dialogDom.style.bottom = `${parentBound?.top?.value + parentDom?.clientHeight - e.clientY}Px`;
+              dialogDom.style.cssText += "align-items:end;";
               break;
           }
         });
@@ -352,13 +208,10 @@ const messageBubble = defineComponent({
     };
 
     const jumpToAim = (message: any) => {
-      if (
-        (data.referenceMessage as any)?.messageID &&
-        data.allMessageID.includes((data.referenceMessage as any)?.messageID)
-      ) {
-        ctx.emit('jumpID', (data.referenceMessage as any).messageID);
+      if ((data.referenceMessage as any)?.messageID && data.allMessageID.includes((data.referenceMessage as any)?.messageID)) {
+        ctx.emit("jumpID", (data.referenceMessage as any).messageID);
       } else {
-        const message = t('TUIChat.无法定位到原消息');
+        const message = t("TUIChat.无法定位到原消息");
         handleErrorPrompts(message, props);
       }
     };
@@ -375,99 +228,73 @@ const messageBubble = defineComponent({
     onLongPress(htmlRefHook, toggleDialogH5);
 
     const resendMessage = (message: any) => {
-      ctx.emit('resendMessage', message);
+      ctx.emit("resendMessage", message);
     };
 
     const showReadReceiptTag = (message: any) => {
-      if (
-        message.flow === 'out' &&
-        message.status === 'success' &&
-        message.needReadReceipt
-      ) {
+      if (message.flow === "out" && message.status === "success" && message.needReadReceipt) {
         return true;
       }
       return false;
     };
 
     const readReceiptStyle = (message: any) => {
-      if (
-        message?.readReceiptInfo?.isPeerRead ||
-        (message?.readReceiptInfo?.isPeerRead === undefined &&
-          message?.isPeerRead) ||
-        message?.readReceiptInfo?.unreadCount === 0
-      ) {
-        return '';
+      if (message?.readReceiptInfo?.isPeerRead || (message?.readReceiptInfo?.isPeerRead === undefined && message?.isPeerRead) || message?.readReceiptInfo?.unreadCount === 0) {
+        return "";
       }
-      return 'unRead';
+      return "unRead";
     };
 
     const readReceiptCont = (message: any) => {
       switch (message.conversationType) {
         case TUIServer.TUICore.TIM.TYPES.CONV_C2C:
-          if (
-            message?.readReceiptInfo?.isPeerRead ||
-            (message?.readReceiptInfo?.isPeerRead === undefined &&
-              message?.isPeerRead)
-          ) {
-            return t('TUIChat.已读');
+          if (message?.readReceiptInfo?.isPeerRead || (message?.readReceiptInfo?.isPeerRead === undefined && message?.isPeerRead)) {
+            return t("TUIChat.已读");
           }
-          return t('TUIChat.未读');
+          return t("TUIChat.未读");
         case TUIServer.TUICore.TIM.TYPES.CONV_GROUP:
           if (message.readReceiptInfo.unreadCount === 0) {
-            return t('TUIChat.全部已读');
+            return t("TUIChat.全部已读");
           }
-          if (
-            message.readReceiptInfo.readCount === 0 ||
-            (message.readReceiptInfo.unreadCount === undefined &&
-              message.readReceiptInfo.readCount === undefined)
-          ) {
-            return t('TUIChat.未读');
+          if (message.readReceiptInfo.readCount === 0 || (message.readReceiptInfo.unreadCount === undefined && message.readReceiptInfo.readCount === undefined)) {
+            return t("TUIChat.未读");
           }
-          return `${message.readReceiptInfo.readCount + t('TUIChat.人已读')}`;
+          return `${message.readReceiptInfo.readCount + t("TUIChat.人已读")}`;
         default:
-          return '';
+          return "";
       }
     };
 
     const showReadReceiptDialog = (message: any) => {
-      ctx.emit('showReadReceiptDialog', message, 'receipt');
+      ctx.emit("showReadReceiptDialog", message, "receipt");
     };
 
     const showRepliesDialog = (message: any, isRoot: boolean) => {
       if (isRoot) {
-        ctx.emit('showRepliesDialog', message, 'replies');
+        ctx.emit("showRepliesDialog", message, "replies");
         return;
       }
       if ((data.referenceMessage as any)?.messageRootID) {
-        const message = data.messagesList?.find(
-          (item: Message) =>
-            item.ID === (data.referenceMessage as any)?.messageRootID
-        );
+        const message = data.messagesList?.find((item: Message) => item.ID === (data.referenceMessage as any)?.messageRootID);
         if (message) {
-          ctx.emit('showRepliesDialog', message, 'replies');
+          ctx.emit("showRepliesDialog", message, "replies");
           return;
         } else {
-          const message = t('TUIChat.无法定位到原消息');
+          const message = t("TUIChat.无法定位到原消息");
           handleErrorPrompts(message, props);
         }
       }
     };
 
     const handleImageOrVideoBubbleStyle = (message: Message) => {
-      const classNameList = ['content'];
+      const classNameList = ["content"];
       if (!message) return classNameList;
       classNameList.push(`content-${data.message.flow}`);
-      if (
-        data.message.type === TIM.TYPES.MSG_IMAGE &&
-        !isEmojiReactionInMessage(message)
-      ) {
-        classNameList.push('content-image');
+      if (data.message.type === TIM.TYPES.MSG_IMAGE && !isEmojiReactionInMessage(message)) {
+        classNameList.push("content-image");
       }
-      if (
-        data.message.type === TIM.TYPES.MSG_VIDEO &&
-        !isEmojiReactionInMessage(message)
-      ) {
-        classNameList.push('content-video');
+      if (data.message.type === TIM.TYPES.MSG_VIDEO && !isEmojiReactionInMessage(message)) {
+        classNameList.push("content-video");
       }
       return classNameList;
     };
@@ -475,8 +302,7 @@ const messageBubble = defineComponent({
     const isEmojiReactionInMessage = (message: Message) => {
       try {
         if (!message?.cloudCustomData) return;
-        const reactList = JSONToObject(message?.cloudCustomData)?.messageReact
-          ?.reacts;
+        const reactList = JSONToObject(message?.cloudCustomData)?.messageReact?.reacts;
         if (!reactList || Object.keys(reactList).length === 0) return false;
         return true;
       } catch (err) {
@@ -500,31 +326,31 @@ const messageBubble = defineComponent({
       showRepliesDialog,
       handleImageOrVideoBubbleStyle,
       isEmojiReactionInMessage,
-      TIM
+      TIM,
     };
-  }
+  },
 });
 export default messageBubble;
 </script>
 <style lang="scss" scoped>
-@import url('../../../styles/common.scss');
-@import url('../../../styles/icon.scss');
+@import url("../../../styles/common.scss");
+@import url("../../../styles/icon.scss");
 .reverse {
   flex-direction: row-reverse;
   justify-content: flex-start;
 }
 .avatar {
-  width: 36Px;
-  height: 36Px;
-  border-radius: 5Px;
+  width: 36px;
+  height: 36px;
+  border-radius: 5px;
 }
 .message-bubble {
   width: 100%;
   display: flex;
-  padding-bottom: 5Px;
+  padding-bottom: 5px;
 }
 .line-left {
-  border: 1Px solid rgba(0, 110, 255, 0.5);
+  border: 1px solid rgba(0, 110, 255, 0.5);
 }
 .message-reference-area {
   display: flex;
@@ -532,14 +358,14 @@ export default messageBubble;
   border-radius: 0.5rem;
   border-radius: 0.63rem;
   align-self: start;
-  margin-left: 44Px;
-  margin-right: 8Px;
+  margin-left: 44px;
+  margin-right: 8px;
   &-show {
     width: 100%;
     display: flex;
     flex-direction: inherit;
     justify-content: center;
-    padding: 6Px;
+    padding: 6px;
     p {
       font-family: PingFangSC-Regular;
       font-weight: 400;
@@ -547,7 +373,7 @@ export default messageBubble;
       color: #999999;
       letter-spacing: 0;
       word-break: keep-all;
-      padding-right: 5Px;
+      padding-right: 5px;
     }
     span {
       height: 1.25rem;
@@ -563,27 +389,27 @@ export default messageBubble;
 .message-replies {
   display: flex;
   align-self: start;
-  margin-left: 44Px;
-  margin-right: 8Px;
-  padding: 2Px;
+  margin-left: 44px;
+  margin-right: 8px;
+  padding: 2px;
   color: #999999;
-  font-size: 10Px;
+  font-size: 10px;
   i {
-    margin: 4Px;
+    margin: 4px;
   }
   span {
-    line-height: 20Px;
+    line-height: 20px;
   }
 }
 .message-reference-area-reverse,
 .message-replies-reverse {
   align-self: end;
-  margin-right: 44Px;
-  margin-left: 8Px;
+  margin-right: 44px;
+  margin-left: 8px;
 }
 .message-img {
-  max-width: min(calc(100vw - 180Px), 300Px);
-  max-height: min(calc(100vw - 180Px), 300Px);
+  max-width: min(calc(100vw - 180px), 300px);
+  max-height: min(calc(100vw - 180px), 300px);
 }
 .message-video-cover {
   display: inline-block;
@@ -591,11 +417,11 @@ export default messageBubble;
   &::before {
     position: absolute;
     z-index: 1;
-    content: '';
-    width: 0Px;
-    height: 0Px;
-    border: 15Px solid transparent;
-    border-left: 20Px solid #ffffff;
+    content: "";
+    width: 0px;
+    height: 0px;
+    border: 15px solid transparent;
+    border-left: 20px solid #ffffff;
     top: 0;
     left: 0;
     bottom: 0;
@@ -604,24 +430,24 @@ export default messageBubble;
   }
 }
 .message-videoimg {
-  max-width: min(calc(100vw - 160Px), 300Px);
-  max-height: min(calc(100vw - 160Px), 300Px);
+  max-width: min(calc(100vw - 160px), 300px);
+  max-height: min(calc(100vw - 160px), 300px);
 }
 .face-box {
   display: flex;
   align-items: center;
 }
 .text-img {
-  width: 20Px;
-  height: 20Px;
+  width: 20px;
+  height: 20px;
 }
 .message-audio {
-  padding-left: 10Px;
+  padding-left: 10px;
   display: flex;
   align-items: center;
   position: relative;
   .icon {
-    margin: 0 4Px;
+    margin: 0 4px;
   }
   audio {
     width: 0;
@@ -632,22 +458,22 @@ export default messageBubble;
   flex-direction: row-reverse;
 }
 .message-area {
-  max-width: calc(100% - 54Px);
+  max-width: calc(100% - 54px);
   position: relative;
   display: flex;
   flex-direction: column;
-  padding: 0 8Px;
+  padding: 0 8px;
   .name {
-    padding-bottom: 4Px;
+    padding-bottom: 4px;
     font-weight: 400;
     font-size: 0.8rem;
     color: #999999;
     letter-spacing: 0;
   }
   .reference-content {
-    padding: 12Px;
+    padding: 12px;
     font-weight: 400;
-    font-size: 14Px;
+    font-size: 14px;
     color: burlywood;
     letter-spacing: 0;
     word-wrap: break-word;
@@ -677,9 +503,9 @@ export default messageBubble;
     }
   }
   .content {
-    padding: 12Px;
+    padding: 12px;
     font-weight: 400;
-    font-size: 14Px;
+    font-size: 14px;
     color: #000000;
     letter-spacing: 0;
     word-wrap: break-word;
@@ -687,22 +513,22 @@ export default messageBubble;
     width: fit-content;
     &-in {
       background: #fbfbfb;
-      border-radius: 0Px 10Px 10Px 10Px;
+      border-radius: 0px 10px 10px 10px;
     }
     &-out {
       background: #dceafd;
-      border-radius: 10Px 0Px 10Px 10Px;
+      border-radius: 10px 0px 10px 10px;
     }
     &-image {
-      padding: 0Px;
+      padding: 0px;
       height: fit-content;
-      border-radius: 10Px 0Px 10Px 10Px;
+      border-radius: 10px 0px 10px 10px;
     }
     &-video {
-      padding: 0Px;
+      padding: 0px;
       height: fit-content;
       background: transparent;
-      border-radius: 10Px;
+      border-radius: 10px;
     }
   }
 }
@@ -710,14 +536,14 @@ export default messageBubble;
   align-self: flex-end;
   font-family: PingFangSC-Regular;
   font-weight: 400;
-  font-size: 12Px;
+  font-size: 12px;
   color: #b6b8ba;
   word-break: keep-all;
 }
 .fail {
-  width: 15Px;
-  height: 15Px;
-  border-radius: 15Px;
+  width: 15px;
+  height: 15px;
+  border-radius: 15px;
   background: red;
   color: #ffffff;
   display: flex;

+ 134 - 304
src/TUIKit/TUIComponents/container/TUIChat/index.vue

@@ -1,59 +1,20 @@
 <template>
-  <div
-    class="TUIChat"
-    :class="[env.isH5 ? 'TUIChat-H5' : '']"
-    v-if="conversationType === 'chat'"
-  >
+  <div class="TUIChat" :class="[env.isH5 ? 'TUIChat-H5' : '']" v-if="conversationType === 'chat'">
     <header class="TUIChat-header">
       <i class="icon icon-back" @click="back" v-if="env.isH5"></i>
-      <TypingHeader
-        :needTyping="needTyping"
-        :conversation="conversation"
-        :messageList="messageList"
-        ref="typingRef"
-      />
+      <TypingHeader :needTyping="needTyping" :conversation="conversation" :messageList="messageList" ref="typingRef" />
       <aside class="setting">
-        <Manage
-          v-if="conversation.groupProfile"
-          :conversation="conversation"
-          :userInfo="userInfo"
-          :isH5="env.isH5"
-        />
-        <Replies
-          :message="currentMessage"
-          :conversation="conversation"
-          :show="repliesDialogStatus"
-          :isH5="env.isH5"
-          :messageList="messageList"
-          @closeDialog="closeDialog"
-          ref="repliesDialog"
-        />
+        <Manage v-if="conversation.groupProfile" :conversation="conversation" :userInfo="userInfo" :isH5="env.isH5" />
+        <Replies :message="currentMessage" :conversation="conversation" :show="repliesDialogStatus" :isH5="env.isH5" :messageList="messageList" @closeDialog="closeDialog" ref="repliesDialog" />
       </aside>
     </header>
     <div class="TUIChat-main">
-      <ul
-        class="TUI-message-list"
-        @click="dialogID = ''"
-        ref="messageEle"
-        id="messageEle"
-      >
-        <p
-          class="message-more"
-          @click="getHistoryMessageList"
-          v-if="!isCompleted"
-        >
-          {{ $t('TUIChat.查看更多') }}
+      <ul class="TUI-message-list" @click="dialogID = ''" ref="messageEle" id="messageEle">
+        <p class="message-more" @click="getHistoryMessageList" v-if="!isCompleted">
+          {{ $t("TUIChat.查看更多") }}
         </p>
-        <li
-          v-for="(item, index) in messages"
-          :key="index"
-          :id="item?.ID"
-          ref="messageAimID"
-        >
-          <MessageTimestamp
-            :currTime="item?.time"
-            :prevTime="index > 0 ? messages[index - 1]?.time : 0"
-          ></MessageTimestamp>
+        <li v-for="(item, index) in messages" :key="index" :id="item?.ID" ref="messageAimID">
+          <MessageTimestamp :currTime="item?.time" :prevTime="index > 0 ? messages[index - 1]?.time : 0"></MessageTimestamp>
           <MessageItem
             :message="item"
             :env="env"
@@ -68,29 +29,15 @@
             @resendMessage="resendMessage"
           ></MessageItem>
         </li>
-        <div
-          class="to-bottom-tip"
-          v-if="needToBottom"
-          @click="scrollToTarget('bottom')"
-        >
+        <div class="to-bottom-tip" v-if="needToBottom" @click="scrollToTarget('bottom')">
           <i class="icon icon-bottom-double"></i>
           <div class="to-bottom-tip-cont">
             <span>{{ toBottomTipCont }}</span>
           </div>
         </div>
       </ul>
-      <div
-        class="dialog dialog-conversation"
-        v-if="forwardStatus && messageComponents.Forward"
-      >
-        <component
-          :is="'Forward'"
-          :list="conversationData.list"
-          :message="currentMessage"
-          :show="forwardStatus"
-          :isH5="env.isH5"
-          @update:show="(e: any) => (forwardStatus = e)"
-        >
+      <div class="dialog dialog-conversation" v-if="forwardStatus && messageComponents.Forward">
+        <component :is="'Forward'" :list="conversationData.list" :message="currentMessage" :show="forwardStatus" :isH5="env.isH5" @update:show="(e: any) => (forwardStatus = e)">
           <template #left="{ data }">
             <img class="avatar" :src="conversationData.handleAvatar(data)" />
             <label class="name">{{ conversationData.handleName(data) }}</label>
@@ -104,38 +51,14 @@
         </component>
       </div>
       <div class="dialog dialog-conversation">
-        <ReadReceiptDialog
-          :message="currentMessage"
-          :conversation="conversation"
-          :show="receiptDialogStatus"
-          :isH5="env.isH5"
-          @closeDialog="closeDialog"
-          ref="readReceiptDialog"
-        />
+        <ReadReceiptDialog :message="currentMessage" :conversation="conversation" :show="receiptDialogStatus" :isH5="env.isH5" @closeDialog="closeDialog" ref="readReceiptDialog" />
       </div>
-      <imagePreviewer
-        v-if="showImagePreview"
-        :currentImage="currentImagePreview"
-        :imageList="imageList"
-        @close="showImagePreview = false"
-      />
+      <imagePreviewer v-if="showImagePreview" :currentImage="currentImagePreview" :imageList="imageList" @close="showImagePreview = false" />
     </div>
-    <div
-      class="TUIChat-footer"
-      :class="[isMute && 'disabled', env.isH5 && 'TUIChat-H5-footer']"
-    >
+    <div class="TUIChat-footer" :class="[isMute && 'disabled', env.isH5 && 'TUIChat-H5-footer']">
       <div class="func" id="func">
         <main class="func-main">
-          <component
-            v-for="(item, index) in pluginComponentList"
-            :key="index"
-            :isMute="isMute"
-            :is="item"
-            :isH5="env.isH5"
-            :conversation="conversation"
-            parentID="func"
-            @send="handleSend"
-          ></component>
+          <component v-for="(item, index) in pluginComponentList" :key="index" :isMute="isMute" :is="item" :isH5="env.isH5" :conversation="conversation" parentID="func" @send="handleSend"></component>
         </main>
       </div>
       <MessageInput
@@ -155,11 +78,11 @@
     </div>
     <div v-show="showResend" class="mask" @click="showResend = false">
       <div class="mask-main">
-        <header>{{ $t('TUIChat.确认重发该消息?') }}</header>
+        <header>{{ $t("TUIChat.确认重发该消息?") }}</header>
         <footer>
-          <p @click="showResend = false">{{ $t('TUIChat.取消') }}</p>
+          <p @click="showResend = false">{{ $t("TUIChat.取消") }}</p>
           <i></i>
-          <p @click="submit">{{ $t('TUIChat.确定') }}</p>
+          <p @click="submit">{{ $t("TUIChat.确定") }}</p>
         </footer>
       </div>
     </div>
@@ -168,95 +91,71 @@
     <header class="TUIChat-header">
       <h1>{{ conversationName }}</h1>
     </header>
-    <MessageSystem
-      :data="messages"
-      :types="types"
-      @application="handleApplication"
-    />
+    <MessageSystem :data="messages" :types="types" @application="handleApplication" />
   </div>
   <slot v-else-if="slotDefault" />
 </template>
 
 <script lang="ts">
-import {
-  defineComponent,
-  reactive,
-  toRefs,
-  ref,
-  computed,
-  nextTick,
-  watch,
-  useSlots,
-  onMounted,
-  watchEffect
-} from 'vue';
-import { MessageSystem, MessageItem, MessageTimestamp } from './components';
-import { onClickOutside } from '@vueuse/core';
-import { Manage } from './manage-components';
-
-import {
-  handleAvatar,
-  handleName,
-  getImgLoad,
-  isTypingMessage,
-  deepCopy,
-  isMessageTip,
-  handleReferenceForShow
-} from './utils/utils';
-
-import { getComponents } from './index';
-
-import { useStore } from 'vuex';
-import constant from '../constant';
-import { handleErrorPrompts } from '../utils';
-import Link from '../../../utils/link';
-import { Message } from './interface';
-import { Conversation } from '../TUIConversation/interface';
-
-import MessageInput from './message-input';
+import { defineComponent, reactive, toRefs, ref, computed, nextTick, watch, useSlots, onMounted, watchEffect } from "vue";
+import { MessageSystem, MessageItem, MessageTimestamp } from "./components";
+import { onClickOutside } from "@vueuse/core";
+import { Manage } from "./manage-components";
+
+import { handleAvatar, handleName, getImgLoad, isTypingMessage, deepCopy, isMessageTip, handleReferenceForShow } from "./utils/utils";
+
+import { getComponents } from "./index";
+
+import { useStore } from "vuex";
+import constant from "../constant";
+import { handleErrorPrompts } from "../utils";
+import Link from "../../../utils/link";
+import { Message } from "./interface";
+import { Conversation } from "../TUIConversation/interface";
+
+import MessageInput from "./message-input";
 
 const TUIChat: any = defineComponent({
-  name: 'TUIChat',
+  name: "TUIChat",
   components: {
     MessageSystem,
     MessageTimestamp,
     Manage,
     MessageInput,
-    MessageItem
+    MessageItem,
   },
   props: {
     isMsgNeedReadReceipt: {
       type: Boolean,
-      default: false
+      default: false,
     },
     isNeedTyping: {
       type: Boolean,
-      default: true
+      default: true,
     },
     isNeedEmojiReact: {
       type: Boolean,
-      default: true
+      default: true,
     },
     currentModal: {
       type: String,
-      default: 'message'
-    }
+      default: "message",
+    },
   },
   setup(props) {
     const { TUIServer } = TUIChat;
     const GroupServer = TUIServer?.TUICore?.TUIServer?.TUIGroup;
     const ProfileServer = TUIServer?.TUICore?.TUIServer?.TUIProfile;
-    const VuexStore =
-      (TUIServer.TUICore.isOfficial && useStore && useStore()) || {};
+    const VuexStore = (TUIServer.TUICore.isOfficial && useStore && useStore()) || {};
     const { t } = (window as any).TUIKitTUICore.config.i18n.useI18n();
     const data = reactive({
       messageList: [] as Message[],
       conversation: {} as Conversation,
-      text: '',
-      atText: '',
+      text: "",
+      atText: "",
       types: TUIServer.TUICore.TIM.TYPES,
       currentMessage: {} as Message,
-      dialogID: '',
+      dialogID: "",
       forwardStatus: false,
       receiptDialogStatus: false,
       repliesDialogStatus: false,
@@ -266,35 +165,35 @@ const TUIChat: any = defineComponent({
       userInfoView: false,
       userInfo: {
         isGroup: false,
-        list: []
+        list: [],
       },
       selfInfo: {},
-      messageComponents: getComponents('message'),
+      messageComponents: getComponents("message"),
       isShow: false,
-      muteText: '您已被管理员禁言',
+      muteText: "您已被管理员禁言",
       isFirstSend: true,
       isFirstRender: true,
       showGroupMemberList: false,
       reference: {
         message: {} as Message,
-        content: '',
+        content: "",
         type: 0, // message type
-        show: '' // 'reference' or 'reply'
+        show: "", // 'reference' or 'reply'
       },
       historyReference: false,
-      referenceID: '',
+      referenceID: "",
       allMemberList: [],
       env: TUIServer.TUICore.TUIEnv,
       showResend: false,
       resendMessage: {},
       inputBlur: false,
       inputComposition: false,
-      inputCompositionCont: '',
+      inputCompositionCont: "",
       needTyping: props.isNeedTyping,
       needReadReceipt: false,
       peerNeedReceipt: false,
       needToBottom: false,
-      toBottomTipCont: '',
+      toBottomTipCont: "",
       messageInView: [] as Message[],
       readSet: new Set(),
       isUserAction: false,
@@ -302,12 +201,12 @@ const TUIChat: any = defineComponent({
         scrollTop: 0,
         scrollHeight: 0,
         scrollTopMin: Infinity,
-        scrollTopMax: 0
+        scrollTopMax: 0,
       },
       isMsgNeedReadReceipt: false,
       isNeedEmojiReact: false,
       dropDownRef: null,
-      typingRef: null
+      typingRef: null,
     });
 
     const slotDefault = !!useSlots().default;
@@ -316,33 +215,22 @@ const TUIChat: any = defineComponent({
     // Using the setMessageRead method of the TUIConversion module
     const setMessageRead = async (conversationID: string | undefined) => {
       if (!conversationID) return;
-      await TUIServer?.TUICore?.TUIServer?.TUIConversation?.setMessageRead(
-        conversationID
-      );
+      await TUIServer?.TUICore?.TUIServer?.TUIConversation?.setMessageRead(conversationID);
       return;
     };
 
     const sendMessageReadReceipt = async (messageList: Message[]) => {
-      const needReceiptMessageList = messageList.filter(
-        (item: Message) =>
-          item?.flow === 'in' &&
-          item?.needReadReceipt &&
-          !data.readSet.has(item?.ID)
-      );
+      const needReceiptMessageList = messageList.filter((item: Message) => item?.flow === "in" && item?.needReadReceipt && !data.readSet.has(item?.ID));
       if (needReceiptMessageList.length) {
-        await TUIServer?.sendMessageReadReceipt(needReceiptMessageList).then(
-          () => {
-            needReceiptMessageList.forEach((item: Message) =>
-              data.readSet.add(item?.ID)
-            );
-          }
-        );
+        await TUIServer?.sendMessageReadReceipt(needReceiptMessageList).then(() => {
+          needReceiptMessageList.forEach((item: Message) => data.readSet.add(item?.ID));
+        });
       }
       await setMessageRead(data?.conversation?.conversationID);
     };
 
     const pluginComponentList: any = [];
-    Object.keys(getComponents('send')).forEach((name: any) => {
+    Object.keys(getComponents("send")).forEach((name: any) => {
       pluginComponentList.push(name);
     });
 
@@ -360,7 +248,7 @@ const TUIChat: any = defineComponent({
     const conversationData = {
       list: [],
       handleAvatar,
-      handleName
+      handleName,
     };
 
     const dialog: any = ref();
@@ -372,20 +260,19 @@ const TUIChat: any = defineComponent({
     const conversationType = computed(() => {
       const { conversation } = data;
       if (!conversation?.conversationID) {
-        return '';
+        return "";
       }
       if (conversation?.type === TUIServer.TUICore.TIM.TYPES.CONV_SYSTEM) {
-        return 'system';
+        return "system";
       }
-      return 'chat';
+      return "chat";
     });
 
     const isMute = computed(() => {
       const { conversation } = data;
       if (conversation?.type === TUIServer.TUICore.TIM.TYPES.CONV_GROUP) {
         const userRole = conversation?.groupProfile?.selfInfo.role;
-        const isMember =
-          userRole === TUIServer.TUICore.TIM.TYPES.GRP_MBR_ROLE_MEMBER;
+        const isMember = userRole === TUIServer.TUICore.TIM.TYPES.GRP_MBR_ROLE_MEMBER;
         if (isMember && conversation?.groupProfile?.muteAllMembers) {
           // data.muteText = "管理员开启全员禁言";
           return true;
@@ -414,35 +301,31 @@ const TUIChat: any = defineComponent({
         data.scroll.scrollHeight = 0;
         data.scroll.scrollTopMin = Infinity;
         data.scroll.scrollTopMax = 0;
-        data.text = '';
-        data.atText = '';
+        data.text = "";
+        data.atText = "";
         data.reference = {
           message: {} as Message,
-          content: '',
+          content: "",
           type: 0,
-          show: ''
+          show: "",
         };
       },
       {
-        deep: true
+        deep: true,
       }
     );
 
     watch(isMute, (newVal: any, oldVal: any) => {
       const { conversation } = data;
-      if (
-        newVal &&
-        conversation?.type === TUIServer.TUICore.TIM.TYPES.CONV_GROUP
-      ) {
+      if (newVal && conversation?.type === TUIServer.TUICore.TIM.TYPES.CONV_GROUP) {
         const userRole = conversation?.groupProfile?.selfInfo.role;
-        const isMember =
-          userRole === TUIServer.TUICore.TIM.TYPES.GRP_MBR_ROLE_MEMBER;
+        const isMember = userRole === TUIServer.TUICore.TIM.TYPES.GRP_MBR_ROLE_MEMBER;
         if (isMember && conversation?.groupProfile?.muteAllMembers) {
-          data.muteText = '管理员开启全员禁言';
+          data.muteText = "管理员开启全员禁言";
         }
         const time: number = new Date().getTime();
         if ((data.selfInfo as any)?.muteUntil * 1000 - time > 0) {
-          data.muteText = '您已被管理员禁言';
+          data.muteText = "您已被管理员禁言";
         }
       }
     });
@@ -452,11 +335,7 @@ const TUIChat: any = defineComponent({
       return handleName(conversation);
     });
 
-    const messages = computed(() =>
-      data.messageList.filter(
-        (item: any) => !item.isDeleted && !isTypingMessage(item)
-      )
-    );
+    const messages = computed(() => data.messageList.filter((item: any) => !item.isDeleted && !isTypingMessage(item)));
     const imageList = computed(() =>
       messages?.value?.filter((item: Message) => {
         return !item.isRevoked && item.type === data.types.MSG_IMAGE;
@@ -465,10 +344,7 @@ const TUIChat: any = defineComponent({
 
     const needGroupReceipt = computed(() => {
       const { conversation, needReadReceipt } = data;
-      if (
-        conversation?.type === TUIServer.TUICore.TIM.TYPES.CONV_C2C ||
-        needReadReceipt
-      ) {
+      if (conversation?.type === TUIServer.TUICore.TIM.TYPES.CONV_C2C || needReadReceipt) {
         return true;
       }
       return false;
@@ -478,8 +354,7 @@ const TUIChat: any = defineComponent({
       messages,
       (newVal: Array<Message>, oldVal: Array<Message>) => {
         nextTick(() => {
-          const isTheSameMessage =
-            newVal[newVal.length - 1]?.ID === oldVal[oldVal.length - 1]?.ID;
+          const isTheSameMessage = newVal[newVal.length - 1]?.ID === oldVal[oldVal.length - 1]?.ID;
           if (newVal.length === 0 || isTheSameMessage) {
             return;
           }
@@ -495,10 +370,8 @@ const TUIChat: any = defineComponent({
         if (data.historyReference) {
           for (let index = 0; index < messages.value.length; index++) {
             if (messages?.value[index]?.ID === data?.referenceID) {
-              scrollToTarget('target', messageAimID.value[index]);
-              messageAimID.value[index]
-                .getElementsByClassName('content')[0]
-                .classList.add('reference-content');
+              scrollToTarget("target", messageAimID.value[index]);
+              messageAimID.value[index].getElementsByClassName("content")[0].classList.add("reference-content");
             }
           }
           data.historyReference = false;
@@ -513,11 +386,8 @@ const TUIChat: any = defineComponent({
         setTimeout(() => {
           // scrolling end
           if (newVal === messageEle?.value?.scrollTop) {
-            if (
-              data.scroll.scrollTopMin !== Infinity &&
-              data.scroll.scrollTopMax !== 0
-            ) {
-              sendMessageReadInView('scroll');
+            if (data.scroll.scrollTopMin !== Infinity && data.scroll.scrollTopMax !== 0) {
+              sendMessageReadInView("scroll");
             }
             data.scroll.scrollTopMin = Infinity;
             data.scroll.scrollTopMax = 0;
@@ -532,11 +402,11 @@ const TUIChat: any = defineComponent({
         () => messageEle?.value,
         () => {
           if (messageEle?.value) {
-            messageEle.value.addEventListener('scroll', onScrolling);
+            messageEle.value.addEventListener("scroll", onScrolling);
           }
         },
         {
-          deep: true
+          deep: true,
         }
       );
     });
@@ -549,10 +419,8 @@ const TUIChat: any = defineComponent({
       if (data.isFirstSend) {
         data.isFirstSend = false;
       }
-      data.reference.show = '';
-      TUIServer.TUICore.isOfficial &&
-        VuexStore?.commit &&
-        VuexStore?.commit('handleTask', 0);
+      data.reference.show = "";
+      TUIServer.TUICore.isOfficial && VuexStore?.commit && VuexStore?.commit("handleTask", 0);
     };
 
     const handleItem = (item: any) => {
@@ -573,8 +441,7 @@ const TUIChat: any = defineComponent({
 
     const forwardMessage = (message: Message) => {
       data.currentMessage = message;
-      conversationData.list =
-        TUIServer.TUICore.getStore().TUIConversation.conversationList;
+      conversationData.list = TUIServer.TUICore.getStore().TUIConversation.conversationList;
       data.forwardStatus = true;
     };
 
@@ -584,7 +451,7 @@ const TUIChat: any = defineComponent({
         message,
         content: replyObj?.referenceMessageForShow,
         type: replyObj?.referenceMessageType,
-        show: type
+        show: type,
       };
     };
 
@@ -616,7 +483,7 @@ const TUIChat: any = defineComponent({
 
     const getHistoryMessageList = async () => {
       await TUIServer.getHistoryMessageList().then(() => {
-        scrollToTarget('target', messageEle?.value?.firstElementChild);
+        scrollToTarget("target", messageEle?.value?.firstElementChild);
       });
     };
 
@@ -626,18 +493,11 @@ const TUIChat: any = defineComponent({
       // If the referenced message is in the current messageList, you can jump directly. Otherwise, you need to pull the historical message
       for (let index = 0; index < messages.value.length; index++) {
         list.push(messages?.value[index]?.ID);
-        if (
-          list.indexOf(messageID) !== -1 &&
-          messages.value[index]?.ID === messageID
-        ) {
-          scrollToTarget('target', messageAimID.value[index]);
-          messageAimID.value[index]
-            .getElementsByClassName('content')[0]
-            .classList.remove('reference-content');
+        if (list.indexOf(messageID) !== -1 && messages.value[index]?.ID === messageID) {
+          scrollToTarget("target", messageAimID.value[index]);
+          messageAimID.value[index].getElementsByClassName("content")[0].classList.remove("reference-content");
           nextTick(() => {
-            messageAimID.value[index]
-              .getElementsByClassName('content')[0]
-              .classList.add('reference-content');
+            messageAimID.value[index].getElementsByClassName("content")[0].classList.add("reference-content");
           });
         }
       }
@@ -663,13 +523,13 @@ const TUIChat: any = defineComponent({
     const handleEditor = (message: Message, type: string) => {
       if (!message || !type) return;
       switch (type) {
-        case 'reference':
+        case "reference":
           referOrReplyMessage(message, type);
           break;
-        case 'reply':
+        case "reply":
           referOrReplyMessage(message, type);
           break;
-        case 'reedit':
+        case "reedit":
           if (message?.payload?.text) {
             messageInput?.value?.reEdit(message?.payload?.text);
           }
@@ -682,28 +542,23 @@ const TUIChat: any = defineComponent({
     const showDialog = async (message: Message, type: string) => {
       if (!message?.ID || !type) return;
       switch (type) {
-        case 'receipt':
-          if (
-            message.conversationType !==
-              TUIServer.TUICore.TIM.TYPES.CONV_GROUP ||
-            message.readReceiptInfo?.unreadCount === 0
-          ) {
+        case "receipt":
+          if (message.conversationType !== TUIServer.TUICore.TIM.TYPES.CONV_GROUP || message.readReceiptInfo?.unreadCount === 0) {
             return;
           }
           data.currentMessage = message;
           data.receiptDialogStatus = true;
           break;
-        case 'replies':
+        case "replies":
           data.currentMessage = message;
           data.repliesDialogStatus = true;
           break;
-        case 'forward':
+        case "forward":
           data.currentMessage = message;
-          conversationData.list =
-            TUIServer.TUICore.getStore().TUIConversation.conversationList;
+          conversationData.list = TUIServer.TUICore.getStore().TUIConversation.conversationList;
           data.forwardStatus = true;
           break;
-        case 'previewImage':
+        case "previewImage":
           data.showImagePreview = !data.showImagePreview;
           data.currentImagePreview = message;
           break;
@@ -715,11 +570,11 @@ const TUIChat: any = defineComponent({
     const closeDialog = async (type: string) => {
       if (!type) return;
       switch (type) {
-        case 'receipt':
+        case "receipt":
           data.currentMessage = {};
           data.receiptDialogStatus = false;
           break;
-        case 'replies':
+        case "replies":
           data.currentMessage = {};
           data.repliesDialogStatus = false;
           break;
@@ -731,17 +586,14 @@ const TUIChat: any = defineComponent({
     const handleScroll = () => {
       if (data.isFirstRender) {
         data.needToBottom = false;
-        scrollToTarget('bottom');
+        scrollToTarget("bottom");
         data.isFirstRender = false;
         return;
       }
       if (messageEle.value) {
         const { scrollHeight, scrollTop, clientHeight } = messageEle.value;
-        if (
-          scrollHeight - (scrollTop + clientHeight) <= clientHeight ||
-          messages.value[messages.value.length - 1]?.flow === 'out'
-        ) {
-          scrollToTarget('bottom');
+        if (scrollHeight - (scrollTop + clientHeight) <= clientHeight || messages.value[messages.value.length - 1]?.flow === "out") {
+          scrollToTarget("bottom");
         } else {
           handleToBottomTip(true);
         }
@@ -749,7 +601,7 @@ const TUIChat: any = defineComponent({
     };
 
     const scrollToTarget = (type: string, targetElement?: HTMLElement) => {
-      messageEle?.value?.removeEventListener('scroll', onScrolling);
+      messageEle?.value?.removeEventListener("scroll", onScrolling);
       data.isUserAction = true;
       switch (type) {
         case constant.scrollType.toBottom:
@@ -760,24 +612,24 @@ const TUIChat: any = defineComponent({
             } else {
               messageEle?.value?.lastElementChild?.scrollIntoView(false);
             }
-            getImgLoad(messageEle?.value, 'message-img', async () => {
+            getImgLoad(messageEle?.value, "message-img", async () => {
               if (data?.env?.isH5) {
                 handleH5Scroll();
               } else {
                 messageEle?.value?.lastElementChild?.scrollIntoView(false);
               }
-              messageEle.value.addEventListener('scroll', onScrolling);
-              await sendMessageReadInView('page');
+              messageEle.value.addEventListener("scroll", onScrolling);
+              await sendMessageReadInView("page");
             });
           });
           break;
         case constant.scrollType.toTarget:
           nextTick(() => {
             targetElement?.scrollIntoView(false);
-            getImgLoad(messageEle?.value, 'message-img', async () => {
+            getImgLoad(messageEle?.value, "message-img", async () => {
               targetElement?.scrollIntoView(false);
-              messageEle.value.addEventListener('scroll', onScrolling);
-              await sendMessageReadInView('page');
+              messageEle.value.addEventListener("scroll", onScrolling);
+              await sendMessageReadInView("page");
             });
           });
 
@@ -788,9 +640,9 @@ const TUIChat: any = defineComponent({
     };
 
     const handleH5Scroll = () => {
-      if (document?.getElementById('app')?.style) {
-        (document.getElementById('app') as any).style.marginBottom = ``;
-        (document.getElementById('app') as any).style.height = `100%`;
+      if (document?.getElementById("app")?.style) {
+        (document.getElementById("app") as any).style.marginBottom = ``;
+        (document.getElementById("app") as any).style.height = `100%`;
       }
       messageEle.value.scrollTop = messageEle.value.scrollHeight;
     };
@@ -800,12 +652,8 @@ const TUIChat: any = defineComponent({
       if (needGroupReceipt.value) {
         data.scroll.scrollHeight = scrollHeight;
         data.scroll.scrollTop = scrollTop;
-        data.scroll.scrollTopMin = data.isUserAction
-          ? data.scroll.scrollTopMin
-          : Math.min(data.scroll.scrollTopMin, data.scroll.scrollTop);
-        data.scroll.scrollTopMax = data.isUserAction
-          ? data.scroll.scrollTopMax
-          : Math.max(data.scroll.scrollTopMax, data.scroll.scrollTop);
+        data.scroll.scrollTopMin = data.isUserAction ? data.scroll.scrollTopMin : Math.min(data.scroll.scrollTopMin, data.scroll.scrollTop);
+        data.scroll.scrollTopMax = data.isUserAction ? data.scroll.scrollTopMax : Math.max(data.scroll.scrollTopMax, data.scroll.scrollTop);
       }
       if (scrollHeight - (scrollTop + clientHeight) > clientHeight) {
         handleToBottomTip(true);
@@ -819,15 +667,10 @@ const TUIChat: any = defineComponent({
       switch (needToBottom) {
         case true:
           data.needToBottom = true;
-          if (
-            data?.conversation?.unreadCount &&
-            data?.conversation?.unreadCount > 0
-          ) {
-            data.toBottomTipCont = `${data?.conversation?.unreadCount} ${t(
-              'TUIChat.条新消息'
-            )}`;
+          if (data?.conversation?.unreadCount && data?.conversation?.unreadCount > 0) {
+            data.toBottomTipCont = `${data?.conversation?.unreadCount} ${t("TUIChat.条新消息")}`;
           } else {
-            data.toBottomTipCont = t('TUIChat.回到最新位置');
+            data.toBottomTipCont = t("TUIChat.回到最新位置");
           }
           break;
         case false:
@@ -868,27 +711,16 @@ const TUIChat: any = defineComponent({
       await sendMessageReadReceipt(data.messageInView);
     };
 
-    const isInView = (
-      type: string,
-      dom: HTMLElement,
-      viewStart: number,
-      viewEnd: number
-    ) => {
+    const isInView = (type: string, dom: HTMLElement, viewStart: number, viewEnd: number) => {
       const containerTop = messageEle.value.getBoundingClientRect().top;
       const containerBottom = messageEle.value.getBoundingClientRect().bottom;
       const { top, bottom } = dom.getBoundingClientRect();
       const { offsetTop, clientHeight } = dom;
       switch (type) {
         case constant.inViewType.page:
-          return (
-            Math.round(top) >= Math.round(containerTop) &&
-            Math.round(bottom) <= Math.round(containerBottom)
-          );
+          return Math.round(top) >= Math.round(containerTop) && Math.round(bottom) <= Math.round(containerBottom);
         case constant.inViewType.scroll:
-          return (
-            Math.round(offsetTop) >= Math.round(viewStart) &&
-            Math.round(offsetTop + clientHeight) <= Math.round(viewEnd)
-          );
+          return Math.round(offsetTop) >= Math.round(viewStart) && Math.round(offsetTop + clientHeight) <= Math.round(viewEnd);
         default:
           return false;
       }
@@ -896,15 +728,13 @@ const TUIChat: any = defineComponent({
 
     const handleDropDownOpen = (value: any) => {
       if (data.dropDownRef) {
-        (data.dropDownRef as any).removeChild(
-          (data.dropDownRef as any).children[0]
-        );
+        (data.dropDownRef as any).removeChild((data.dropDownRef as any).children[0]);
       }
       data.dropDownRef = value;
     };
 
     const handleUploadingImageOrVideo = () => {
-      scrollToTarget('bottom');
+      scrollToTarget("bottom");
     };
 
     const handleImagePreview = (message: any) => {
@@ -915,9 +745,9 @@ const TUIChat: any = defineComponent({
     const resetReplyOrReference = () => {
       data.reference = {
         message: {} as Message,
-        content: '',
+        content: "",
         type: 0,
-        show: ''
+        show: "",
       };
     };
 
@@ -970,9 +800,9 @@ const TUIChat: any = defineComponent({
       handleUploadingImageOrVideo,
       handleImagePreview,
       imageList,
-      resetReplyOrReference
+      resetReplyOrReference,
     };
-  }
+  },
 });
 export default TUIChat;
 </script>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio