perf: 优化消息阅读机制

This commit is contained in:
kuaifan 2024-11-20 20:35:01 +08:00
parent 1882a7baba
commit ec8d48292e

View File

@ -833,7 +833,7 @@ export default {
scrollToBottomRefresh: false, // scrollToBottomRefresh: false, //
androidKeyboardVisible: false, // Android androidKeyboardVisible: false, // Android
replyMsgAutoMention: false, // @ replyMsgAutoMention: false, // @
waitUnreadData: {}, // waitUnreadData: new Map(), //
} }
}, },
@ -844,6 +844,7 @@ export default {
beforeDestroy() { beforeDestroy() {
this.subMsgListener(true) this.subMsgListener(true)
this.generateUnreadData(this.dialogId)
// //
if (!this.isChildComponent) { if (!this.isChildComponent) {
this.$store.dispatch('forgetInDialog', this._uid) this.$store.dispatch('forgetInDialog', this._uid)
@ -1217,7 +1218,8 @@ export default {
dialogId: { dialogId: {
handler(dialog_id, old_id) { handler(dialog_id, old_id) {
this.getDialogBase(dialog_id, old_id) this.getDialogBase(dialog_id)
this.generateUnreadData(old_id)
// //
this.$store.dispatch('closeDialog', old_id) this.$store.dispatch('closeDialog', old_id)
// //
@ -1451,22 +1453,8 @@ export default {
/** /**
* 获取会话基本信息 * 获取会话基本信息
* @param dialog_id * @param dialog_id
* @param old_id
*/ */
getDialogBase(dialog_id, old_id = null) { getDialogBase(dialog_id) {
if (old_id) {
const ens = []
const ids = this.allMsgs.filter(item => item.read_at === null && item.userid != this.userId).map(item => item.id)
const enters = this.$refs.scroller?.$el.querySelectorAll('.item-enter') || []
for (const enter of enters) {
const id = $A.runNum(enter.querySelector(".dialog-view")?.getAttribute('data-id'));
if (id && !ids.includes(id)) {
ids.push(id)
}
}
this.waitUnreadData[old_id] = $A.getLastSameElements(ids, ens)
}
if (!dialog_id) { if (!dialog_id) {
return return
} }
@ -1485,6 +1473,7 @@ export default {
this.allMsgs = this.allMsgList this.allMsgs = this.allMsgList
this.errorId = 0 this.errorId = 0
// //
this.waitUnreadData.delete(dialog_id)
this.getMsgs({ this.getMsgs({
dialog_id, dialog_id,
msg_id: this.msgId, msg_id: this.msgId,
@ -1493,14 +1482,12 @@ export default {
this.openId = dialog_id this.openId = dialog_id
this.msgPrepared = true this.msgPrepared = true
// //
if (this.dialogId !== dialog_id) { const unreadIds = this.waitUnreadData.get(dialog_id) || []
let unreadIds = this.waitUnreadData[dialog_id] || [] if (unreadIds.length > 0) {
if (unreadIds.length > 0) { const ids = [...data.list.map(item => item.id)].reverse();
const ids = [...data.list.map(item => item.id)].reverse(); $A.getLastSameElements(unreadIds, ids).forEach(id => {
$A.getLastSameElements(unreadIds, ids).forEach(id => { this.$store.dispatch("dialogMsgRead", {id, dialog_id})
this.$store.dispatch("dialogMsgRead", {id, dialog_id}) })
})
}
} }
// //
setTimeout(_ => { setTimeout(_ => {
@ -1523,6 +1510,26 @@ export default {
this.getUserApproveStatus() this.getUserApproveStatus()
}, },
/**
* 关闭会话前记录未读数据
* @param dialog_id
*/
generateUnreadData(dialog_id) {
if (!dialog_id) {
return
}
const ens = []
const ids = this.allMsgs.filter(item => item.read_at === null && item.userid != this.userId).map(item => item.id)
const enters = this.$refs.scroller?.$el.querySelectorAll('.item-enter') || []
for (const enter of enters) {
const id = $A.runNum(enter.querySelector(".dialog-view")?.getAttribute('data-id'));
if (id && !ids.includes(id)) {
ids.push(id)
}
}
this.waitUnreadData.set(dialog_id, $A.getLastSameElements(ids, ens))
},
/** /**
* 订阅消息用于独立窗口 * 订阅消息用于独立窗口
* @param unsubscribe * @param unsubscribe
@ -2989,7 +2996,7 @@ export default {
case "newTask": case "newTask":
let content = $A.formatMsgBasic(this.operateItem.msg.text) let content = $A.formatMsgBasic(this.operateItem.msg.text)
content = content.replace(/<img[^>]*?src=(["'])(.*?)(_thumb\.(png|jpg|jpeg))*\1[^>]*?>/g, `<img src="$2">`) content = content.replace(/<img[^>]*?src=(["'])([^"']+?)(_thumb\.(png|jpg|jpeg))?\1[^>]*?>/g, `<img src="$2">`)
content = content.replace(/<li\s+data-list="checked">/g, `<li class="tox-checklist--checked">`) content = content.replace(/<li\s+data-list="checked">/g, `<li class="tox-checklist--checked">`)
content = content.replace(/<li\s+data-list="unchecked">/g, `<li>`) content = content.replace(/<li\s+data-list="unchecked">/g, `<li>`)
content = content.replace(/<ol[^>]*>([\s\S]*?)<\/ol>/g, `<ul class="tox-checklist">$1</ul>`) content = content.replace(/<ol[^>]*>([\s\S]*?)<\/ol>/g, `<ul class="tox-checklist">$1</ul>`)