撤回消息实现

This commit is contained in:
砂糖
2025-07-14 11:04:49 +08:00
parent fc8741c0c1
commit af7ef14ba2
5 changed files with 397 additions and 75 deletions

View File

@@ -188,6 +188,20 @@ export const parseMessageByType = (pmsg) => {
return `${getName(groupNameUpdateUser)}修改了群名称为${
groupNameUpdateDetail.group.groupName
}`;
case MessageType.RevokeMessage:
try {
const revokeDetails = JSON.parse(pmsg.notificationElem.detail);
const revokerID = revokeDetails.revokerID;
const revokerName = revokeDetails.revokerName || "未知用户";
if (revokerID === store.getters.storeCurrentUserID) {
return "你撤回了一条消息";
} else {
return `${revokerName}撤回了一条消息`;
}
} catch (error) {
return "消息已被撤回";
}
default:
return "[暂未支持的消息类型]";
}
@@ -288,6 +302,20 @@ export const tipMessaggeFormat = (msg, currentUserID) => {
const dismissDetails = JSON.parse(msg.notificationElem.detail);
const dismissUser = dismissDetails.opUser;
return `${getName(dismissUser)}解散了群聊`;
case MessageType.RevokeMessage:
try {
const revokeDetails = JSON.parse(msg.notificationElem.detail);
const revokerID = revokeDetails.revokerID;
const revokerName = revokeDetails.revokerName || "未知用户";
if (revokerID === currentUserID) {
return "你撤回了一条消息";
} else {
return `${revokerName}撤回了一条消息`;
}
} catch (error) {
return "消息已被撤回";
}
default:
return "";
}

82
util/revokeMessage.js Normal file
View File

@@ -0,0 +1,82 @@
import IMSDK, { MessageStatus } from "openim-uniapp-polyfill";
/**
* 撤回消息
* @param {string} conversationID - 会话ID
* @param {string} clientMsgID - 消息客户端ID
* @returns {Promise} 撤回结果
*/
export const revokeMessage = async (conversationID, clientMsgID) => {
try {
const result = await IMSDK.asyncApi(
IMSDK.IMMethods.RevokeMessage,
IMSDK.uuid(),
{
conversationID,
clientMsgID,
}
);
return result;
} catch (error) {
console.error("撤回消息失败:", error);
throw error;
}
};
/**
* 检查消息是否可以撤回
* @param {Object} message - 消息对象
* @param {string} currentUserID - 当前用户ID
* @returns {boolean} 是否可以撤回
*/
export const canRevokeMessage = (message, currentUserID) => {
console.log('检查消息是否可以撤回:', {
messageSendID: message.sendID,
currentUserID: currentUserID,
messageStatus: message.status,
contentType: message.contentType,
sendTime: message.sendTime,
now: Date.now()
});
// 只能撤回自己发送的消息
if (message.sendID !== currentUserID) {
console.log('不是自己发送的消息');
return false;
}
// 检查消息状态是否为成功
if (message.status !== MessageStatus.Succeed) {
console.log('消息状态不是成功:', message.status);
return false;
}
// 检查消息类型是否支持撤回
const revokableTypes = [
101, // 文本消息
102, // 图片消息
103, // 语音消息
104, // 视频消息
105, // 文件消息
106, // @消息
110, // 自定义消息
];
if (!revokableTypes.includes(message.contentType)) {
console.log('不支持撤回的消息类型:', message.contentType);
return false;
}
// 检查消息发送时间是否在2分钟内可配置
const now = Date.now();
const messageTime = message.sendTime;
const timeLimit = 2 * 60 * 1000; // 2分钟
if (now - messageTime > timeLimit) {
console.log('消息发送时间超过2分钟');
return false;
}
console.log('消息可以撤回');
return true;
};