wkw 1 месяц назад
Родитель
Сommit
6607a2ec95

+ 8 - 0
src/api/path/im.api.js

@@ -109,10 +109,18 @@ export function setMessageDisturb(uuid, param) {
   return service.post(`/disturb/${uuid}`, param);
 }
 
+// 置顶聊天
 export function stickChat(param) {
   return service.post(`/stick/chat`, param);
 }
 
+// 消息撤回
+// messageId: 消息id , uuid: 当前用户uuid , toUuid: 目标uuid, messageType: 群2或个人1
+export function messageRevoke(param) {
+  return service.post('/message/revoke', param);
+}
+
+
 
 
 

+ 2 - 0
src/common/constant/msgType.js

@@ -60,6 +60,7 @@ export const MSG_SYSTEM_GROUP = [
   CREATE_GROUP,
   INVITATION_GROUP,
   MESSAGE_NOTICE_GROUP,
+  MESSAGE_NICKNAME_GROUP
 
 ]
 
@@ -82,4 +83,5 @@ export const MSG_TYPE_GROUP = [
   MESSAGE_CC_GROUP,
   MESSAGE_NOTICE_GROUP,
   MESSAGE_STICKY_GROUP,
+  MESSAGE_NICKNAME_GROUP
 ]

+ 3 - 1
src/common/login.js

@@ -4,6 +4,7 @@ import { imLogin } from "@/api/path/im.api";
 import { userInfo } from "@/api/path/jdfh.api";
 import { useWalletStore } from "@/stores/modules/walletStore";
 import { useSystemStore } from "@/stores/modules/systemStore";
+import { useWebSocketStore } from "@/stores/modules/webSocketStore.js";
 
 const imgHost = import.meta.env.VITE_IM_PATH_FIlE
 
@@ -12,13 +13,14 @@ const imgHost = import.meta.env.VITE_IM_PATH_FIlE
 export async function sysLogin(address) {
   const walletStore = useWalletStore();
   const systemStore = useSystemStore();
+  const wsStore = useWebSocketStore();
+  wsStore.deleteData();
 
   systemStore.ImsessionList = [];
   const results = await Promise.allSettled([
     login({ wallet_address: address }),
     imLogin({ uuid: address }),
   ]);
-
   const loginResult = results[0].value;
   const imLoginResult = results[1].value;
 

+ 16 - 4
src/stores/modules/webSocketStore.js

@@ -24,7 +24,7 @@ const WS_CONFIG = {
   MESSAGE_QUEUE_FLUSH_INTERVAL: 5000,
 };
 
-const messageList = {};//消息缓存
+let messageList = {};//消息缓存
 
 export const useWebSocketStore = defineStore("webSocketStore", {
   state: () => ({
@@ -496,7 +496,7 @@ export const useWebSocketStore = defineStore("webSocketStore", {
         if(typeof msgId === 'function'){
           let msg = {};
           if(msg = msgId(item, sessionId)){
-            return {...item, ...message, ...msg};
+            return {...item,...msg};
           }
         }
         else if (item.id + '' === msgId + '') return {...item, ...message, content: "", url: ""};
@@ -508,13 +508,14 @@ export const useWebSocketStore = defineStore("webSocketStore", {
           if(typeof msgId === 'function'){
             let msg = {};
             if(msg = msgId(item, sessionId)){
-              return {...item, ...message, ...msg};
+              return {...item,...msg};
             }
           }
           else if (item.id + '' === msgId + '') return {...item, ...message, content: "", url: ""};
           return item;
         });
       }
+      // console.log('this.messages',this.messages)
     },
     // 删除本地消息
     deleteMessage(message, msgId, sessionId = null) { 
@@ -734,7 +735,7 @@ export const useWebSocketStore = defineStore("webSocketStore", {
       }
       // 创建群/加入群/邀请入群
       if (message.messageType == MsgType.CREATE_GROUP || message.messageType == MsgType.JION_GROUP || message.messageType == MsgType.INVITATION_GROUP) {
-        console.log('群系统消息', message, msg);
+        // console.log('群系统消息', message, msg);
         if (message.messageType == MsgType.JION_GROUP || message.messageType == MsgType.INVITATION_GROUP) {
           // 恢复会话功能
           this.funRestoreDelAuth(message.from);
@@ -927,6 +928,17 @@ export const useWebSocketStore = defineStore("webSocketStore", {
         console.error('获取群成员失败', e)
         return []
       }
+    },
+    // 清除数据
+    deleteData(){
+      const systemStore = useSystemStore();
+      messageList = {};
+      this.messages = [];
+      this.groupMembersList = {};
+      this.toUserInfo = {};
+      this.messageQueue = [];
+      systemStore.ImsessionList = [];
+      this.disconnect();
     }
   },
 });

+ 26 - 9
src/views/im/chat/index.vue

@@ -294,6 +294,7 @@ import * as Constant from "@/common/constant/Constant";
 import { soundVoice } from "@/utils/notifications.js";
 import AtUserList from "./components/AtUserList/index.vue";
 import GroupNotice from "./components/GroupNotice/index.vue";
+import { messageRevoke } from '@/api/path/im.api';
 
 const IM_PATH = import.meta.env.VITE_IM_PATH_FIlE;
 // 路由 & store
@@ -522,15 +523,31 @@ const closeMessaageBurning = ()=>{
   showBurn.value = false
 }
 // 撤回消息
-const revokeMessage = (message)=>{
-  wsStore.sendMessage({
-    content: JSON.stringify({ 
-      content: '',
-      msgId: message.id + '',
-    }), 
-    contentType: MsgType.MSG_TYPE.NOTICE, 
-    messageType: wsStore.toUserInfo.type == 'user'?MsgType.MESSAGE_REVOKE:MsgType.MESSAGE_REVOKE_GROUP,
-  });
+const revokeMessage = async (message)=>{
+  try {
+    const res = await messageRevoke({
+      messageId:message.id + '',
+      uuid:message.fromUuid,
+      toUuid:message.toUuid,
+      messageType:message.messageType
+    })
+    if(res.code == 200){
+      wsStore.sendMessage({
+        content: JSON.stringify({ 
+          content: '',
+          msgId: message.id + '',
+          fromUsername:message.fromUsername
+        }), 
+        contentType: MsgType.MSG_TYPE.NOTICE, 
+        messageType: wsStore.toUserInfo.type == 'user'?MsgType.MESSAGE_REVOKE:MsgType.MESSAGE_REVOKE_GROUP,
+      });
+    }else{
+      showToast('撤回失败')
+    }
+  } catch (error) {
+    showToast('撤回失败')
+  }
+  
 }
 // 点击查看阅后即焚消息
 const viewBurnMessage = (message) => {

+ 22 - 3
src/views/im/hook/messagesHook.js

@@ -73,7 +73,15 @@ export const setMessageHook = (message, wsStore) => {
       wsStore.deleteMessage(message, msg.msgId, message.to);
     }
     // 更新会话列表
-    wsStore.updateSessionNewMessage({...message, ...msg, content: msg && !msg.isTemp?'[消息已销毁]':`${message.from == walletStore.account ? '你' : (message.fromUsername || '对方')}撤回了一条消息`}, message.to);
+    // wsStore.updateSessionNewMessage({...message, ...msg, content: msg && !msg.isTemp?'[消息已销毁]':`${message.from == walletStore.account ? '你' : (message.fromUsername || '对方')}撤回了一条消息`}, message.to);
+    wsStore.pushMessage({
+      ...message,
+      align: 'right',
+      fromAvatar: message.avatar,
+      toUuid: message.to,
+      fromUuid: message.from,
+      content: msg && msg.isTemp ? '[消息已销毁]' : `${message.from == walletStore.account ? '你' : (message.fromUsername || '对方')}撤回了一条消息`,
+    }, message.to);
   }
   
   // 语音和视频挂断/拒接消息处理
@@ -174,7 +182,15 @@ export const handleMessageHook = async (payload, wsStore) => {
       wsStore.deleteMessage(message, msg.msgId);
     }
     // 更新会话列表
-    wsStore.updateSessionNewMessage({...message, ...msg, content: msg && !msg.isTemp?'[消息已销毁]':`${message.from == walletStore.account ? '你' : (message.fromUsername || '对方')}撤回了一条消息`}, message.from);
+    // wsStore.updateSessionNewMessage({...message, ...msg, content: msg && !msg.isTemp?'[消息已销毁]':`${message.from == walletStore.account ? '你' : (message.fromUsername || '对方')}撤回了一条消息`}, message.from);
+    wsStore.pushMessage({
+      ...message,
+      toUuid: message.to,
+      fromUuid: message.from,
+      align: 'left',
+      content: msg && msg.isTemp ? '[消息已销毁]' : `${(msg.fromUsername || '对方')}撤回了一条消息`,
+      fromAvatar: message.avatar,
+    });
   }
 
   // 接收好友系统消息
@@ -206,14 +222,17 @@ export const handleMessageHook = async (payload, wsStore) => {
     if(message.messageType == MsgType.MESSAGE_CC_GROUP){
       contentType = MsgType.MSG_TYPE.TEXT
     }
+    // 如果是修改群个人昵称直接返回
+    if (message.messageType == MsgType.MESSAGE_NICKNAME_GROUP) return;
     wsStore.pushMessage({
       ...message,
-      // toUsername: message.to,
       align: 'left',
       content: newContent,
       contentType,
       messageType: MsgType.MESSAGE_TYPE_GROUP,
       fromAvatar: message.avatar,
+      toUuid: message.to,
+      fromUuid: message.from,
     });
     notifications(wsStore);
     return;