wkw 1 сар өмнө
parent
commit
c9289e36d4
1 өөрчлөгдсөн 106 нэмэгдсэн , 95 устгасан
  1. 106 95
      src/views/im/chat/index.vue

+ 106 - 95
src/views/im/chat/index.vue

@@ -17,120 +17,121 @@
       <div class="m-ellipsis">群公告:{{ wsStore.toUserInfo.notice }}</div>
       <svg-icon class="item-icon" name="right1" />
     </div>
-
     <!-- 聊天消息区域 -->
     <div class="chat-list" ref="chatListRef">
       <van-loading class="load-box" size="24px" v-if="wsStore.loading">加载中...</van-loading>
       <template v-else>
-      <div v-for="(item, index) in imMessages" :key="index">
-        <div class="chat-time">
-          {{ item.createDate || formatTime(Date.now()) }}
-        </div>
-        <div class="box" v-if="item.contentType !== MsgType.MSG_TYPE.NOTICE">
-          <div
-            class="list-item"
-            :class="isSender(item) ? '' : 'flex-reverse'"
-          >
-            <!-- 头像 -->
-            <van-image
-              class="list-img"
-              :class="isSender(item) ? 'mr12' : 'ml12'"
-              round
-              :src="formatAvatarUrl(item)"
-              @click="goToPage(item)"
-            />
-            <!-- 内容 -->
-            <div class="list-cont">
-              <div>{{ item.sender?item.sender.nickname: (item.nickname || item.fromUsername || "匿名用户") }}</div>
-
-              <div v-if="!item.isTemp || item.from == walletStore.account" style="position: relative;"> 
-                <!-- 文本消息 -->
-                <div class="content" v-if="item.contentType === MsgType.MSG_TYPE.TEXT" @click="onLongPress(item)">
-                  <span v-if="item.err" style="color: red;font-size: small;">{{item.messageType == MsgType.MESSAGE_TYPE_USER?'对方已不是您的好友':'您已不在群里'}}</span>
-                  {{ item.content }}
-                </div>
-
-                <!-- 图片消息 -->
-                <div
-                  class="img-message"
-                  v-else-if="item.contentType === MsgType.MSG_TYPE.IMAGE"
-                >
-                  <van-image
-                    :src="item?.localUrl || IM_PATH + item.url"
-                    style="max-width: 120px; border-radius: 8px"
-                    @click="previewImage(item)"
-                  />
-                </div>
-
-                <!-- 名片消息 -->
-                <div
-                  class="content card-message"
-                  v-else-if="item.contentType === 3"
-                >
-                  <div class="card-title">名片</div>
-                  <div class="card-name">{{ item.content }}</div>
-                </div>
+        <van-pull-refresh v-model="refreshLoading" @refresh="onRefresh" style="overflow: initial;">
+        <div v-for="(item, index) in imMessages" :key="index">
+          <div class="chat-time">
+            {{ item.createDate || formatTime(Date.now()) }}
+          </div>
+          <div class="box" v-if="item.contentType !== MsgType.MSG_TYPE.NOTICE">
+            <div
+              class="list-item"
+              :class="isSender(item) ? '' : 'flex-reverse'"
+            >
+              <!-- 头像 -->
+              <van-image
+                class="list-img"
+                :class="isSender(item) ? 'mr12' : 'ml12'"
+                round
+                :src="formatAvatarUrl(item)"
+                @click="goToPage(item)"
+              />
+              <!-- 内容 -->
+              <div class="list-cont">
+                <div>{{ item.sender?item.sender.nickname: (item.nickname || item.fromUsername || "匿名用户") }}</div>
+
+                <div v-if="!item.isTemp || item.from == walletStore.account" style="position: relative;"> 
+                  <!-- 文本消息 -->
+                  <div class="content" v-if="item.contentType === MsgType.MSG_TYPE.TEXT" @click="onLongPress(item)">
+                    <span v-if="item.err" style="color: red;font-size: small;">{{item.messageType == MsgType.MESSAGE_TYPE_USER?'对方已不是您的好友':'您已不在群里'}}</span>
+                    {{ item.content }}
+                  </div>
 
-                <!-- 录音消息 -->
-                <div
-                  class="audio-message"
-                  v-else-if="item.contentType === MsgType.MSG_TYPE.AUDIO"
-                >
-                  <messageAudio
-                    :src="item?.localUrl || IM_PATH + item.url"
-                    :isSender="isSender(item)"
-                  />
-                </div>
-                <!-- 拍摄 -->
-                <video class="video-message" :isSender="isSender(item)" controls v-else-if="item.contentType === MsgType.MSG_TYPE.VIDEO" :src="item?.localUrl || IM_PATH + item.url"></video>
-
-                <!-- 语音消息 -->
-                <div class="content" v-if="item.contentType === Constant.REJECT_AUDIO_ONLINE || item.contentType === Constant.REJECT_VIDEO_ONLINE">[对方拒绝]</div>
-                <div class="content" v-if="item.contentType === Constant.CANCELL_AUDIO_ONLINE || item.contentType === Constant.CANCELL_VIDEO_ONLINE">[通话结束]</div>
-                
-                <div v-if="item.quote > 0" class="quotation">{{ item.quoteMsg?.content }}</div>
-              </div>
-              <!-- 阅后即焚消息 -->
-              <div
-                v-else
-                class="burn-message"
-                @click="viewBurnMessage(item)"
-              >
-                <!-- 未查看 -->
-                <div v-if="!item.view && item.content" class="burn-mask">
-                  阅后即焚,点击查看
-                </div>
+                  <!-- 图片消息 -->
+                  <div
+                    class="img-message"
+                    v-else-if="item.contentType === MsgType.MSG_TYPE.IMAGE"
+                  >
+                    <van-image
+                      :src="item?.localUrl || IM_PATH + item.url"
+                      style="max-width: 120px; border-radius: 8px"
+                      @click="previewImage(item)"
+                    />
+                  </div>
 
-                <!-- 已查看且正在倒计时 -->
-                <template v-else-if="item.view && item.countdown > 0 && item.content">
-                  <!-- 文本类型 -->
-                  <div v-if="item.contentType === MsgType.MSG_TYPE.TEXT" class="burn-content">
-                    {{ item.content }}
-                    <span class="burn-countdown">{{ item.countdown }}s</span>
+                  <!-- 名片消息 -->
+                  <div
+                    class="content card-message"
+                    v-else-if="item.contentType === 3"
+                  >
+                    <div class="card-title">名片</div>
+                    <div class="card-name">{{ item.content }}</div>
                   </div>
 
-                  <!-- 录音类型 -->
-                  <div v-else-if="item.contentType === MsgType.MSG_TYPE.AUDIO" class="burn-audio">
+                  <!-- 录音消息 -->
+                  <div
+                    class="audio-message"
+                    v-else-if="item.contentType === MsgType.MSG_TYPE.AUDIO"
+                  >
                     <messageAudio
                       :src="item?.localUrl || IM_PATH + item.url"
                       :isSender="isSender(item)"
                     />
-                    <span class="burn-countdown">{{ item.countdown }}s</span>
                   </div>
-                </template>
+                  <!-- 拍摄 -->
+                  <video class="video-message" :isSender="isSender(item)" controls v-else-if="item.contentType === MsgType.MSG_TYPE.VIDEO" :src="item?.localUrl || IM_PATH + item.url"></video>
+
+                  <!-- 语音消息 -->
+                  <div class="content" v-if="item.contentType === Constant.REJECT_AUDIO_ONLINE || item.contentType === Constant.REJECT_VIDEO_ONLINE">[对方拒绝]</div>
+                  <div class="content" v-if="item.contentType === Constant.CANCELL_AUDIO_ONLINE || item.contentType === Constant.CANCELL_VIDEO_ONLINE">[通话结束]</div>
+                  
+                  <div v-if="item.quote > 0" class="quotation">{{ item.quoteMsg?.content }}</div>
+                </div>
+                <!-- 阅后即焚消息 -->
+                <div
+                  v-else
+                  class="burn-message"
+                  @click="viewBurnMessage(item)"
+                >
+                  <!-- 未查看 -->
+                  <div v-if="!item.view && item.content" class="burn-mask">
+                    阅后即焚,点击查看
+                  </div>
 
-                <!-- 倒计时结束 -->
-                <div v-else class="burn-destroyed">
-                  该消息已焚毁
+                  <!-- 已查看且正在倒计时 -->
+                  <template v-else-if="item.view && item.countdown > 0 && item.content">
+                    <!-- 文本类型 -->
+                    <div v-if="item.contentType === MsgType.MSG_TYPE.TEXT" class="burn-content">
+                      {{ item.content }}
+                      <span class="burn-countdown">{{ item.countdown }}s</span>
+                    </div>
+
+                    <!-- 录音类型 -->
+                    <div v-else-if="item.contentType === MsgType.MSG_TYPE.AUDIO" class="burn-audio">
+                      <messageAudio
+                        :src="item?.localUrl || IM_PATH + item.url"
+                        :isSender="isSender(item)"
+                      />
+                      <span class="burn-countdown">{{ item.countdown }}s</span>
+                    </div>
+                  </template>
+
+                  <!-- 倒计时结束 -->
+                  <div v-else class="burn-destroyed">
+                    该消息已焚毁
+                  </div>
                 </div>
               </div>
             </div>
           </div>
+          <div class="chat-time" v-if="item.contentType === MsgType.MSG_TYPE.NOTICE">
+            {{ item.content }}
+          </div>
         </div>
-        <div class="chat-time" v-if="item.contentType === MsgType.MSG_TYPE.NOTICE">
-          {{ item.content }}
-        </div>
-      </div>
+      </van-pull-refresh>
       </template>
     </div>
     <!-- 群公告组件 -->
@@ -326,6 +327,7 @@ const rtcStore = useWebRTCStore();
 const text = ref("");
 
 // 状态管理
+const refreshLoading = ref(false);
 const keyboardHeight = ref(0);
 const showEmoji = ref(false);
 const showTools = ref(false);
@@ -357,6 +359,15 @@ const showActionSheet = ref(false)
 const actions = ref([])
 const chatVideo = ref(false);
 
+// 下拉刷新
+const onRefresh = async () => {
+  await wsStore.getMessages({
+    uuid: route.query.uuid,
+    messageType: wsStore.toUserInfo.type == 'user'?1:2, //1:个人  2:群组
+    friendUsername: walletStore.account
+  },true);
+};
+
 const formatAvatarUrl = (item) => {
   const url = item?.sender?.avatar || item?.fromAvatar || ''
   if (/^https?:\/\//.test(url)) {