|
@@ -25,9 +25,21 @@ const formatMessageExt = (message, ext) => {
|
|
|
// 格式化头像地址
|
|
|
const formatAvatarUrl = (url) => url && /^https?:\/\//.test(url) ? url: (IM_PATH + (url || ''))
|
|
|
|
|
|
-// 发送消息处理
|
|
|
-export const setMessageHook = (message, state) => {
|
|
|
- const wsStore = useWebSocketStore();
|
|
|
+// 消息通知
|
|
|
+const notifications = (state)=>{
|
|
|
+ // 检测是否开启免打扰
|
|
|
+ if (!state.toUserInfo.slience) {
|
|
|
+ setupNotifications(1)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 发送消息处理
|
|
|
+ * @param {{}} message
|
|
|
+ * @param {useWebSocketStore} wsStore
|
|
|
+ */
|
|
|
+export const setMessageHook = (message, wsStore) => {
|
|
|
+ // const wsStore = useWebSocketStore();
|
|
|
const walletStore = useWalletStore();
|
|
|
console.log('发送消息',message)
|
|
|
|
|
@@ -46,75 +58,100 @@ export const setMessageHook = (message, state) => {
|
|
|
|
|
|
// 处理个人消息撤回
|
|
|
if (message.messageType === MsgType.MESSAGE_REVOKE) {
|
|
|
- wsStore.messages = wsStore.messages.filter(item => {
|
|
|
- if (item.id+'' === msg.msgId+'') return false;
|
|
|
- return true;
|
|
|
- });
|
|
|
+ // wsStore.messages = wsStore.messages.filter(item => {
|
|
|
+ // if (item.id+'' === msg.msgId+'') return false;
|
|
|
+ // return true;
|
|
|
+ // });
|
|
|
+ console.log('消息撤回',message)
|
|
|
+ wsStore.deleteMessage(message, msg.msgId, msg.to);
|
|
|
}
|
|
|
|
|
|
- // 语音和视频挂断消息处理
|
|
|
- if (message.contentType === Constant.CANCELL_AUDIO_ONLINE || message.contentType === Constant.CANCELL_VIDEO_ONLINE) {
|
|
|
- state.messages.push({
|
|
|
+ // 语音和视频挂断/拒接消息处理
|
|
|
+ if ([Constant.CANCELL_AUDIO_ONLINE, Constant.CANCELL_VIDEO_ONLINE, Constant.REJECT_AUDIO_ONLINE, Constant.REJECT_VIDEO_ONLINE].includes(message.contentType)) {
|
|
|
+ // wsStore.messages.push({
|
|
|
+ // ...message,
|
|
|
+ // content: '[通话结束]',
|
|
|
+ // sender: wsStore.toUserInfo.sender || {
|
|
|
+ // uuid: walletStore.account,
|
|
|
+ // nickname: walletStore.username,
|
|
|
+ // avatar: walletStore.avatar,
|
|
|
+ // },
|
|
|
+ // });
|
|
|
+ // wsStore.indexs +=1;
|
|
|
+ wsStore.pushMessage({
|
|
|
...message,
|
|
|
- content: '[通话结束]',
|
|
|
+ toUsername: message.to,
|
|
|
+ content:message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE?'[对方拒绝]':'[通话结束]',
|
|
|
sender: wsStore.toUserInfo.sender || {
|
|
|
uuid: walletStore.account,
|
|
|
nickname: walletStore.username,
|
|
|
avatar: walletStore.avatar,
|
|
|
},
|
|
|
});
|
|
|
- wsStore.indexs +=1;
|
|
|
}
|
|
|
// 语音和视频拒绝消息处理
|
|
|
- if (message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE) {
|
|
|
- state.messages.push({
|
|
|
- ...message,
|
|
|
- content: '[对方拒绝]',
|
|
|
- sender: wsStore.toUserInfo.sender || {
|
|
|
- uuid: walletStore.account,
|
|
|
- nickname: walletStore.username,
|
|
|
- avatar: walletStore.avatar,
|
|
|
- },
|
|
|
- });
|
|
|
- wsStore.indexs +=1;
|
|
|
- }
|
|
|
+ // if (message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE) {
|
|
|
+ // wsStore.messages.push({
|
|
|
+ // ...message,
|
|
|
+ // content: '[对方拒绝]',
|
|
|
+ // sender: wsStore.toUserInfo.sender || {
|
|
|
+ // uuid: walletStore.account,
|
|
|
+ // nickname: walletStore.username,
|
|
|
+ // avatar: walletStore.avatar,
|
|
|
+ // },
|
|
|
+ // });
|
|
|
+ // wsStore.indexs +=1;
|
|
|
+ // }
|
|
|
// 文本消息
|
|
|
if (message.contentType == MsgType.MSG_TYPE.TEXT) {
|
|
|
- state.messages.push(formatMessageExt({
|
|
|
+ // state.messages.push(formatMessageExt({
|
|
|
+ // ...message,
|
|
|
+ // toUsername: message.friendUsername
|
|
|
+ // }, msg));
|
|
|
+ // wsStore.indexs +=1;
|
|
|
+ wsStore.pushMessage(formatMessageExt({
|
|
|
...message,
|
|
|
toUsername: message.friendUsername
|
|
|
}, msg));
|
|
|
- wsStore.indexs +=1;
|
|
|
}
|
|
|
// 音频消息
|
|
|
if (message.contentType === MsgType.MSG_TYPE.AUDIO) {
|
|
|
const blob = new Blob([message.file], { type: message.fileSuffix });
|
|
|
const url = URL.createObjectURL(blob);
|
|
|
-
|
|
|
- state.messages.push(formatMessageExt({
|
|
|
+ wsStore.pushMessage(formatMessageExt({
|
|
|
...message,
|
|
|
toUsername: message.to,
|
|
|
localUrl: url,
|
|
|
}, msg));
|
|
|
- wsStore.indexs +=1;
|
|
|
+ // state.messages.push(formatMessageExt({
|
|
|
+ // ...message,
|
|
|
+ // toUsername: message.to,
|
|
|
+ // localUrl: url,
|
|
|
+ // }, msg));
|
|
|
+ // wsStore.indexs +=1;
|
|
|
}
|
|
|
// 图片
|
|
|
if (message.contentType === MsgType.MSG_TYPE.IMAGE) {
|
|
|
const blob = new Blob([message.file], { type: message.fileSuffix });
|
|
|
const url = URL.createObjectURL(blob);
|
|
|
- state.messages.push(formatMessageExt({
|
|
|
+ wsStore.pushMessage(formatMessageExt({
|
|
|
...message,
|
|
|
toUsername: message.to,
|
|
|
localUrl: url,
|
|
|
}, msg));
|
|
|
- wsStore.indexs +=1;
|
|
|
+ // state.messages.push(formatMessageExt({
|
|
|
+ // ...message,
|
|
|
+ // toUsername: message.to,
|
|
|
+ // localUrl: url,
|
|
|
+ // }, msg));
|
|
|
+ // wsStore.indexs +=1;
|
|
|
}
|
|
|
|
|
|
|
|
|
// 同步更新会话列表缓存
|
|
|
- if ((MsgType.MSG_TYPE_MAP.indexOf(message.contentType) >= 0 && !message.type) || msgType.includes(message.contentType)){
|
|
|
- wsStore.updateSessionList(message, 0, msg);
|
|
|
- }
|
|
|
+ // if ((MsgType.MSG_TYPE_MAP.indexOf(message.contentType) >= 0 && !message.type) || msgType.includes(message.contentType)){
|
|
|
+ // wsStore.updateSessionList(message, 0, msg);
|
|
|
+ // }
|
|
|
};
|
|
|
|
|
|
|
|
@@ -122,10 +159,15 @@ export const setMessageHook = (message, state) => {
|
|
|
|
|
|
|
|
|
|
|
|
-// 接收到消息处理
|
|
|
-export const handleMessageHook = async (payload, state) => {
|
|
|
+/**
|
|
|
+ * 接收到消息处理
|
|
|
+ * @param {{}} payload
|
|
|
+ * @param {useWebSocketStore} wsStore
|
|
|
+ * @returns
|
|
|
+ */
|
|
|
+export const handleMessageHook = async (payload, wsStore) => {
|
|
|
console.log('接收消息', payload);
|
|
|
- const wsStore = useWebSocketStore();
|
|
|
+ // const wsStore = useWebSocketStore();
|
|
|
const walletStore = useWalletStore();
|
|
|
const message = {...payload};
|
|
|
if (!message.contentType && !message.messageType) return;
|
|
@@ -142,48 +184,58 @@ export const handleMessageHook = async (payload, state) => {
|
|
|
// 处理消息已到达
|
|
|
if (message.messageType === MsgType.MESSAGE_RECEIPT) {
|
|
|
// 更新消息id
|
|
|
- wsStore.messages = wsStore.messages.map(item => {
|
|
|
- if (item.msgId === msg.msgId) {
|
|
|
- item.id = msg.id;
|
|
|
- delete item.msgId;
|
|
|
- }
|
|
|
- return item;
|
|
|
- });
|
|
|
+ wsStore.modifyMessageId(message, msg)
|
|
|
+ // wsStore.messages = wsStore.messages.map(item => {
|
|
|
+ // if (item.msgId === msg.msgId) {
|
|
|
+ // item.id = msg.id;
|
|
|
+ // delete item.msgId;
|
|
|
+ // }
|
|
|
+ // return item;
|
|
|
+ // });
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 处理消息撤回/阅后即焚(个人和群)
|
|
|
+ // 消息撤回/阅后即焚(个人和群)
|
|
|
if (message.messageType === MsgType.MESSAGE_REVOKE || message.messageType === MsgType.MESSAGE_REVOKE_GROUP) {
|
|
|
- wsStore.messages = msg.isTemp?wsStore.messages.map(item => {
|
|
|
- if (item.id + '' === msg.msgId + '') return {...item, content: "", url: ""};
|
|
|
- return item;
|
|
|
- }):wsStore.messages.filter(item => {
|
|
|
- if (item.id + '' === msg.msgId + '') return false;
|
|
|
- return true;
|
|
|
- });
|
|
|
+ // wsStore.messages = msg.isTemp?wsStore.messages.map(item => {
|
|
|
+ // if (item.id + '' === msg.msgId + '') return {...item, content: "", url: ""};
|
|
|
+ // return item;
|
|
|
+ // }):wsStore.messages.filter(item => {
|
|
|
+ // if (item.id + '' === msg.msgId + '') return false;
|
|
|
+ // return true;
|
|
|
+ // });
|
|
|
+ // 更新消息
|
|
|
+ if (msg && msg.isTemp) {
|
|
|
+ wsStore.modifyMessage(message, msg.msgId)
|
|
|
+ } else {
|
|
|
+ wsStore.deleteMessage(message, msg.msgId);
|
|
|
+ }
|
|
|
+ // 更新会话列表
|
|
|
+ wsStore.updateSessionNewMessage({...message, content: `${message.from == walletStore.account ? '你' : (message.fromUsername || '对方')}撤回了一条消息`});
|
|
|
}
|
|
|
|
|
|
// 兼容图片
|
|
|
message.avatar = formatAvatarUrl(message.avatar);
|
|
|
|
|
|
// 同步更新会话列表缓存
|
|
|
- if ((MsgType.MSG_TYPE_MAP.indexOf(message.contentType) >= 0 && !message.type) || msgType.includes(message.contentType)) {
|
|
|
- // 处理群头像兼容
|
|
|
- const avatar = message.avatar;
|
|
|
- if (Array.isArray(state.toUserInfo.avatar)) {
|
|
|
- message.avatar = state.toUserInfo.avatar.map(val => formatAvatarUrl(val))
|
|
|
- }
|
|
|
- // 更新会话列表
|
|
|
- wsStore.updateSessionList(message, 1, msg);
|
|
|
- // 还原
|
|
|
- message.avatar = avatar;
|
|
|
- }
|
|
|
+
|
|
|
+ // if ((MsgType.MSG_TYPE_MAP.indexOf(message.contentType) >= 0 && !message.type) || msgType.includes(message.contentType)) {
|
|
|
+ // // 处理群头像兼容
|
|
|
+ // const avatar = message.avatar;
|
|
|
+ // if (Array.isArray(wsStore.toUserInfo.avatar)) {
|
|
|
+ // message.avatar = wsStore.toUserInfo.avatar.map(val => formatAvatarUrl(val))
|
|
|
+ // }
|
|
|
+ // // 更新会话列表
|
|
|
+ // wsStore.updateSessionList(message, 1, msg);
|
|
|
+ // // 还原
|
|
|
+ // message.avatar = avatar;
|
|
|
+ // }
|
|
|
|
|
|
// 处理功能
|
|
|
wsStore.funApplyfriend(message); // 好友申请
|
|
|
wsStore.funCancelfriend(message); // 好友取消
|
|
|
- wsStore.funDeleteMessage(message); // 会话禁用
|
|
|
- wsStore.funRestoreMessage(message); // 会话恢复
|
|
|
+ wsStore.funDeleteSessionMessage(message, msg); // 会话禁用
|
|
|
+ wsStore.funRestoreSessionMessage(message, msg); // 会话恢复
|
|
|
|
|
|
// 接收群系统消息
|
|
|
if (MsgType.MSG_TYPE_GROUP.indexOf(message.messageType) >= 0) {
|
|
@@ -195,57 +247,50 @@ export const handleMessageHook = async (payload, state) => {
|
|
|
}
|
|
|
// 处理群置顶
|
|
|
if (message.messageType === MsgType.MESSAGE_STICKY_GROUP) {
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
- state.messages.push({
|
|
|
+ wsStore.pushMessage({
|
|
|
...message,
|
|
|
toUsername: message.to,
|
|
|
content: newContent,
|
|
|
contentType: MsgType.MSG_TYPE.NOTICE,
|
|
|
messageType: MsgType.MESSAGE_TYPE_GROUP
|
|
|
});
|
|
|
- wsStore.indexs +=1;
|
|
|
-
|
|
|
- setupNotifications(1)
|
|
|
+ notifications(wsStore);
|
|
|
return;
|
|
|
}
|
|
|
- // 语音和视频挂断消息处理
|
|
|
- if (message.contentType === Constant.CANCELL_AUDIO_ONLINE || message.contentType === Constant.CANCELL_VIDEO_ONLINE) {
|
|
|
- state.messages.push({
|
|
|
+ // 语音和视频挂断/拒接消息处理
|
|
|
+ if ([Constant.CANCELL_AUDIO_ONLINE, Constant.CANCELL_VIDEO_ONLINE, Constant.REJECT_AUDIO_ONLINE, Constant.REJECT_VIDEO_ONLINE].includes(message.contentType)) {
|
|
|
+ wsStore.pushMessage({
|
|
|
...message,
|
|
|
toUsername: message.to,
|
|
|
- content:'[通话结束]',
|
|
|
+ content:message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE?'[对方拒绝]':'[通话结束]',
|
|
|
sender: wsStore.toUserInfo.sender || {
|
|
|
uuid: walletStore.account,
|
|
|
nickname: walletStore.username,
|
|
|
avatar: walletStore.avatar,
|
|
|
},
|
|
|
});
|
|
|
- wsStore.indexs +=1;
|
|
|
}
|
|
|
// 语音和视频拒绝消息处理
|
|
|
- if (message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE) {
|
|
|
- state.messages.push({
|
|
|
- ...message,
|
|
|
- toUsername: message.to,
|
|
|
- content: '[对方拒绝]',
|
|
|
- sender: wsStore.toUserInfo.sender || {
|
|
|
- uuid: walletStore.account,
|
|
|
- nickname: walletStore.username,
|
|
|
- avatar: walletStore.avatar,
|
|
|
- },
|
|
|
- });
|
|
|
- wsStore.indexs +=1;
|
|
|
- }
|
|
|
+ // if (message.contentType === Constant.REJECT_AUDIO_ONLINE || message.contentType === Constant.REJECT_VIDEO_ONLINE) {
|
|
|
+ // wsStore.pushMessage({
|
|
|
+ // ...message,
|
|
|
+ // toUsername: message.to,
|
|
|
+ // content: '[对方拒绝]',
|
|
|
+ // sender: wsStore.toUserInfo.sender || {
|
|
|
+ // uuid: walletStore.account,
|
|
|
+ // nickname: walletStore.username,
|
|
|
+ // avatar: walletStore.avatar,
|
|
|
+ // },
|
|
|
+ // });
|
|
|
+ // }
|
|
|
// 文本消息
|
|
|
if (message.contentType === MsgType.MSG_TYPE.TEXT) {
|
|
|
- state.messages.push(formatMessageExt({
|
|
|
+ wsStore.pushMessage(formatMessageExt({
|
|
|
...message,
|
|
|
toUsername: message.to,
|
|
|
}, msg));
|
|
|
- wsStore.indexs +=1;
|
|
|
- setupNotifications(1)
|
|
|
+ notifications(wsStore);
|
|
|
return
|
|
|
}
|
|
|
// 音频消息
|
|
@@ -255,37 +300,36 @@ export const handleMessageHook = async (payload, state) => {
|
|
|
});
|
|
|
// 生成可播放的 ObjectURL
|
|
|
const audioUrl = URL.createObjectURL(audioBlob);
|
|
|
- state.messages.push(formatMessageExt({
|
|
|
+ wsStore.pushMessage(formatMessageExt({
|
|
|
...message,
|
|
|
file: audioUrl,
|
|
|
toUsername: message.to,
|
|
|
}, msg));
|
|
|
- wsStore.indexs +=1;
|
|
|
- setupNotifications(1)
|
|
|
+ notifications(wsStore);
|
|
|
return
|
|
|
}
|
|
|
// 图片
|
|
|
if (message.contentType === MsgType.MSG_TYPE.IMAGE) {
|
|
|
const blob = new Blob([message.file], { type: message.fileSuffix });
|
|
|
const url = URL.createObjectURL(blob);
|
|
|
- state.messages.push(formatMessageExt({
|
|
|
+ wsStore.pushMessage(formatMessageExt({
|
|
|
...message,
|
|
|
file: url,
|
|
|
toUsername: message.to,
|
|
|
}, msg));
|
|
|
- wsStore.indexs +=1;
|
|
|
- setupNotifications(1)
|
|
|
+ notifications(wsStore);
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
// 音频在线:被呼叫
|
|
|
if (
|
|
|
message.contentType === Constant.DIAL_AUDIO_ONLINE ||
|
|
|
message.contentType === Constant.DIAL_VIDEO_ONLINE
|
|
|
) {
|
|
|
console.log("收到播号")
|
|
|
- // 接收请求者信息
|
|
|
+ // 接收请求者信息,更新当前会话
|
|
|
wsStore.toUserInfo = {
|
|
|
...wsStore.toUserInfo,
|
|
|
uuid: message.from,
|
|
@@ -352,7 +396,7 @@ export const handleMessageHook = async (payload, state) => {
|
|
|
soundVoice.stop()
|
|
|
const video = message.contentType == Constant.ACCEPT_VIDEO_ONLINE
|
|
|
// 初始化通话p2p配置
|
|
|
- startAudioOnline(video, state);
|
|
|
+ startAudioOnline(video, wsStore);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -433,7 +477,7 @@ export const handleMessageHook = async (payload, state) => {
|
|
|
.then((answer) => {
|
|
|
console.log('发送answer给呼叫者', answer)
|
|
|
// 发送给呼叫者
|
|
|
- state.sendMessage({
|
|
|
+ wsStore.sendMessage({
|
|
|
content: JSON.stringify(answer),
|
|
|
type: Constant.MESSAGE_TRANS_TYPE,
|
|
|
messageType: message.contentType,
|