Procházet zdrojové kódy

添加群个人昵称

wkw před 1 měsícem
rodič
revize
a88eea3106

+ 19 - 105
src/stores/modules/webSocketStore.js

@@ -692,98 +692,6 @@ export const useWebSocketStore = defineStore("webSocketStore", {
       this.chatRefresh += 1;
     },
 
-    // 更新缓存里面的会话列表  type:0 发送者   1:接收者
-    // updateSessionList(payload,type = 0,msg) {
-    //   const walletStore = useWalletStore();
-    //   const message = {...payload};
-    //   console.log('缓存中的列表数据', message, msg)
-    //   const systemStore = useSystemStore();
-    //   const selfUuid = useWalletStore().account; // 当前用户ID
-    //   let sessions = systemStore.ImsessionList ? [...systemStore.ImsessionList] : [];
-    //   const mapSet = {
-    //     [MsgType.MSG_TYPE.FILE]: '[文件]',
-    //     [MsgType.MSG_TYPE.IMAGE]: '[图片]',
-    //     [MsgType.MSG_TYPE.AUDIO]: '[音频]',
-    //     [MsgType.MSG_TYPE.VIDEO]: '[视频]',
-    //     [MsgType.MSG_TYPE.AUDIO_ONLINE]: '[语音通话]',
-    //     [MsgType.MSG_TYPE.VIDEO_ONLINE]: '[视频通话]',
-    //     // [Constant.CANCELL_AUDIO_ONLINE]:'[通话结束]',
-    //     // [Constant.REJECT_AUDIO_ONLINE]: '[对方拒绝]',
-    //     // [Constant.CANCELL_VIDEO_ONLINE]: '[通话结束]',
-    //     // [Constant.REJECT_VIDEO_ONLINE]: '[对方拒绝]',
-
-    //   };
-    //   // console.log(sessions, sessions.length)
-    //   let lastMsg = message.contentType === MsgType.MSG_TYPE.TEXT || message.contentType === MsgType.MSG_TYPE.NOTICE ? (msg?msg.content : message.content) : (mapSet[message.contentType] || '[语音视频]');
-    //   if ([MsgType.MESSAGE_REVOKE, MsgType.MESSAGE_REVOKE_GROUP].includes(message.messageType)){
-    //     lastMsg = `${message.from == walletStore.account ? '你' : (message.fromUsername || '对方')}撤回了一条消息`
-    //   }
-
-    //   let index = -1;
-    //   let uuid = type == 0 ? message.to : message.from;
-    //   index = sessions.findIndex(s => (s.uuid || s.id) === uuid);
-    //   if (message.messageType === 2 && type == 0 && index < 0){
-    //     systemStore.needRefreshIm = true;
-    //     return;
-    //   }
-    //   // 过滤无效的消息体
-    //   if (!uuid) {
-    //     return;
-    //   }
-    //   // if (message.messageType === 2) {
-    //   //   // 群聊
-    //   //   index = sessions.findIndex(s => (s.uuid || s.id) === message.to);
-    //   // } else {
-    //     // 单聊
-    //     // if (message.from === selfUuid) {
-    //     //   index = sessions.findIndex(s => (s.uuid || s.id) === message.to);
-    //     // } else {
-    //     //   index = sessions.findIndex(s => (s.uuid || s.id) === message.from);
-    //     // }
-    //   // }
-    //   let unReadNum = 0;
-    //   const ts = message.timestamp || Math.floor(Date.now() / 1000);
-    //   const time = new Date(ts).toISOString().replace("T", " ").split(".")[0];
-    //   if (index > -1) {
-    //     // 如果退群和踢人需要将用户头像移除
-    //     // let avatar = sessions[index].avatar;
-    //     // if (message.messageType == MsgType.EXIT_GROUP || message.messageType == MsgType.REMOVE_GROUP){
-    //     //   avatar = avatar.filter(val=>{
-    //     //     return !message.avatar.includes(val);
-    //     //   })
-    //     // }
-    //     unReadNum = sessions[index].unReadNum + 1;
-    //     // 更新已有会话
-    //     const updated = {
-    //       ...sessions[index],
-    //       message: lastMsg,
-    //       updatedAt: time,
-    //       unReadNum: type == 0 ? 0 : unReadNum
-    //       // avatar
-    //     };
-    //     sessions.splice(index, 1);
-    //     sessions.unshift(updated);
-    //   } else {
-    //     const isSelfSend = message.from === selfUuid;
-    //     const newSession = {
-    //       // uuid: message.messageType === 2 ? message.to : (isSelfSend ? message.to : message.from),
-    //       uuid,
-    //       name: message.toUsername || message.fromUsername || message.to || message.from,
-    //       type: message.messageType == 2?'group':'user',
-    //       message: lastMsg,
-    //       updatedAt: time,
-    //       avatar: message.avatar || '',
-    //       unReadNum: type == 0 ? 0 : unReadNum
-    //     };
-    //     sessions.unshift(newSession);
-    //   }
-    //   systemStore.ImsessionList = [...sessions];
-    //   // if(type != 0){
-    //   //   this.needRefreshIm +=1;
-    //   // }
-    //   this.needRefreshIm += 1;
-    // },
-
 
     // ************ 接收方 方法 ************//
     // 监听好友系统消息
@@ -843,10 +751,7 @@ export const useWebSocketStore = defineStore("webSocketStore", {
       if (message.messageType === MsgType.MESSAGE_STICKY_GROUP) {
       }
       // 更新群成员列表
-      this.fetchGroupMembers(true);
-      // if (message.messageType != MsgType.DELETE_GROUP){
-      //   this.fetchGroupMembers(true);
-      // }
+      this.fetchGroupMembers(message.from,true);
       // 处理@群成员
       if (message.messageType == MsgType.MESSAGE_CC_GROUP){
         let ccArr = msg?.cc.split(',');
@@ -856,7 +761,13 @@ export const useWebSocketStore = defineStore("webSocketStore", {
       } 
       // 处理群个人昵称
       if (message.messageType == MsgType.MESSAGE_NICKNAME_GROUP){
-        
+        this.modifyMessage(message,(val)=>{
+          return msg.uuid == val.fromUuid?{
+            fromUsername: msg.name
+          } : (msg.uuid == val.toUuid ? {
+            toUsername: msg.name
+          }:{})
+        })
       }
     },
 
@@ -887,12 +798,15 @@ export const useWebSocketStore = defineStore("webSocketStore", {
         // 刷新/更新会话列表
         this.chatRefresh += 1;
       }
+      this.funDeleteFriend(message)
     },
     // 删除好友操作
     funDeleteFriend(message) { 
       if (message.messageType == MsgType.MESSAGE_DELETE_FRIEND) {
         // 禁用会话功能
         this.funDeleteDelAuth(message.to);
+        // 删除本地消息记录
+        this.deleteMessage(message, true,message.to);
         // 更新会话列表
       }
     },
@@ -993,21 +907,21 @@ export const useWebSocketStore = defineStore("webSocketStore", {
       }
     },
     // 群成员列表
-    async fetchGroupMembers(force = false) {
-      if (this.toUserInfo.type !== 'group') {
-        return []
-      }
+    async fetchGroupMembers(uuid,force = false) {
+      // if (this.toUserInfo.type !== 'group') {
+      //   return []
+      // }
 
       // 如果已有缓存且不强制刷新,直接返回
-      if (!force && this.groupMembersList[this.toUserInfo.uuid]) {
-        return this.groupMembersList[this.toUserInfo.uuid]
+      if (!force && this.groupMembersList[uuid]) {
+        return this.groupMembersList[uuid]
       }
 
       try {
-        const res = await groupList(this.toUserInfo.uuid)
+        const res = await groupList(uuid)
         const members = res.data || []
         // 更新缓存
-        this.groupMembersList[this.toUserInfo.uuid] = members
+        this.groupMembersList[uuid] = members
         return members
       } catch (e) {
         console.error('获取群成员失败', e)

+ 6 - 5
src/views/im/chat/index.vue

@@ -332,7 +332,6 @@ const atList = ref();
 const showBurn = ref(false)  // 阅后即焚是否开启
 const showNotice = ref(false);
 const noticeRead = ref(false);
-// const groupMembersArr = ref([]);
 
 const currentMsg = ref('');
 const showActionSheet = ref(false)
@@ -864,11 +863,13 @@ const groupMembersArr = computed(() => wsStore.groupMembersList[wsStore.toUserIn
 // 页面生命周期
 onMounted(async () => {
   wsStore.toUserInfo.uuid = route.query.uuid;
-  if (!wsStore.groupMembersList[wsStore.toUserInfo.uuid]) {
-    // 没有缓存,发请求
-    wsStore.groupMembersList[wsStore.toUserInfo.uuid] = await wsStore.fetchGroupMembers(true);
+  if (wsStore.toUserInfo.type == 'group') {
+    await wsStore.fetchGroupMembers(route.query.uuid);
+      // if (!wsStore.groupMembersList[wsStore.toUserInfo.uuid]) {
+      //   // 没有缓存,发请求
+      //   await wsStore.fetchGroupMembers(route.query.uuid);
+      // }
   }
-  // groupMembersArr.value = wsStore.groupMembersList[wsStore.toUserInfo.uuid];
   await wsStore.getMessages({
     uuid: wsStore.toUserInfo.type == 'user'?walletStore.account : route.query.uuid,
     messageType: wsStore.toUserInfo.type == 'user'?1:2, //1:个人  2:群组

+ 8 - 0
src/views/im/detail/index.vue

@@ -317,6 +317,14 @@ const funSelectEditnickname = async params => {
         const res = await selectEditnickname(wsStore.uuid, params);
         if (res.code == 200) {
             showToast('修改成功');
+            wsStore.sendMessage({
+                content: JSON.stringify({
+                    uuid:wsStore.uuid,
+                    name:params.nickname
+                }),
+                contentType: MsgType.MSG_TYPE.TEXT,
+                messageType: MsgType.MESSAGE_NICKNAME_GROUP,
+            });
 
         } else {
             showToast('修改失败');

+ 20 - 26
src/views/im/hook/messagesHook.js

@@ -19,6 +19,8 @@ const formatMessageExt = (message, ext) => {
       id : ext.id || message.id,
       quote : ext.quote || message.quote, //引用的消息id
       isTemp : ext.isTemp || message.isTemp,//阅后即焚
+      sessionId: ext.sessionId,//会话ID
+      sessionUuid: ext.sessionUuid,//会话UUID
     }
   }
   return message
@@ -41,14 +43,9 @@ const notifications = (state)=>{
  * @param {useWebSocketStore} wsStore 
  */
 export const setMessageHook = (message, wsStore) => {
-  // const wsStore = useWebSocketStore();
   const walletStore = useWalletStore();
-  // console.log('发送消息',message)
+  console.log('发送消息',message)
 
-  // 好友通过处理
-  // if (message.messageType == MsgType.MESSAGE_PASS_FRIEND) {
-  //   wsStore.funRestoreDelAuth(message.to);
-  // }
   // 尝试解析扩展消息JOSON
   let msg;
   try{
@@ -84,8 +81,9 @@ export const setMessageHook = (message, wsStore) => {
     wsStore.pushMessage({
       ...message,
       align:'right',
-      // toUsername: message.to,
       fromAvatar: message.avatar,
+      toUuid: message.to,
+      fromUuid: message.from,
       content:message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE?'[对方拒绝]':'[通话结束]',
       sender: wsStore.toUserInfo.sender || {
         uuid: walletStore.account,
@@ -98,9 +96,10 @@ export const setMessageHook = (message, wsStore) => {
   if (message.contentType == MsgType.MSG_TYPE.TEXT) {
     wsStore.pushMessage(formatMessageExt({
       ...message,
-      // toUsername: message.friendUsername
       align: 'right',
       fromAvatar: message.avatar,
+      toUuid:message.to,
+      fromUuid:message.from
     }, msg), message.to);
   }
   // 音频消息
@@ -109,7 +108,8 @@ export const setMessageHook = (message, wsStore) => {
     const url = URL.createObjectURL(blob);
     wsStore.pushMessage(formatMessageExt({
       ...message,
-      // toUsername: message.to,
+      toUuid: message.to,
+      fromUuid: message.from,
       align: 'right',
       fromAvatar: message.avatar,
       localUrl: url,
@@ -121,18 +121,13 @@ export const setMessageHook = (message, wsStore) => {
     const url = URL.createObjectURL(blob);
     wsStore.pushMessage(formatMessageExt({
       ...message,
-      // toUsername: message.to,
+      toUuid: message.to,
+      fromUuid: message.from,
       align: 'right',
       fromAvatar: message.avatar,
       localUrl: url,
     }, msg), message.to);
   }
-
-
-  // 同步更新会话列表缓存
-  // if ((MsgType.MSG_TYPE_MAP.indexOf(message.contentType) >= 0 && !message.type) || msgType.includes(message.contentType)){
-  //   wsStore.updateSessionList(message, 0, msg);
-  // }
 };
 
 
@@ -147,8 +142,7 @@ export const setMessageHook = (message, wsStore) => {
  * @returns 
  */
 export const handleMessageHook = async (payload, wsStore) => {
-  // console.log('接收消息', payload);
-  // const wsStore = useWebSocketStore();
+  console.log('接收消息', payload);
   const walletStore = useWalletStore();
   const message = {...payload};
 
@@ -230,7 +224,8 @@ export const handleMessageHook = async (payload, wsStore) => {
     wsStore.pushMessage({
       ...message,
       align: 'left',
-      // toUsername: message.to,
+      toUuid: message.to,
+      fromUuid: message.from,
       content:message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE?'[对方拒绝]':'[通话结束]',
       sender: wsStore.toUserInfo.sender || {
         uuid: walletStore.account,
@@ -243,13 +238,10 @@ export const handleMessageHook = async (payload, wsStore) => {
 
   // 文本消息
   if (message.contentType === MsgType.MSG_TYPE.TEXT) {
-    // let ccArr = msg?.cc.split(',');
-    // if (wsStore.groupMembersList && wsStore.groupMembersList[message.from]) {
-    //   wsStore.isassign = wsStore.groupMembersList[message.from].filter(val => ccArr.includes(val.userId + '')).find(val => val.uuid == message.to)
-    // }
     wsStore.pushMessage(formatMessageExt({
       ...message,
-      // toUsername: message.to,
+      toUuid: message.to,
+      fromUuid: message.from,
       align: 'left',
       fromAvatar: message.avatar,
     }, msg));
@@ -266,7 +258,8 @@ export const handleMessageHook = async (payload, wsStore) => {
     wsStore.pushMessage(formatMessageExt({
       ...message,
       file: audioUrl,
-      // toUsername: message.to,
+      toUuid: message.to,
+      fromUuid: message.from,
       align: 'left',
       fromAvatar: message.avatar,
     }, msg));
@@ -280,7 +273,8 @@ export const handleMessageHook = async (payload, wsStore) => {
     wsStore.pushMessage(formatMessageExt({
       ...message,
       file: url,
-      // toUsername: message.to,
+      toUuid: message.to,
+      fromUuid: message.from,
       align: 'left',
       fromAvatar: message.avatar,
     }, msg));