diff --git a/im/src/im-server/event/talk.js b/im/src/im-server/event/talk.js index 7faeb0070..af6fb2421 100644 --- a/im/src/im-server/event/talk.js +++ b/im/src/im-server/event/talk.js @@ -43,7 +43,8 @@ class Talk extends Base { super(); this.sender_id = resource.fromUser; //发送 this.receiver_id = resource.toUser; //接收 - this.talk_type = resource.messageType; //类型 + // 后端推送的 messageType 是消息内容类型(MESSAGE/PICTURE/GOODS/ORDERS),私聊会话类型固定为 1 + this.talk_type = Number(resource.talk_type) || 1; this.resource = resource; @@ -93,12 +94,22 @@ class Talk extends Base { return userId == this.getAccountId() ? "right" : "left"; } + /** + * 获取消息内容类型(MESSAGE/PICTURE/GOODS/ORDERS) + */ + getMessageType () { + return this.resource.messageType || this.resource.msg_type || "MESSAGE"; + } + /** * 获取聊天列表左侧的对话信息 */ getTalkText () { let text = this.resource.content || this.resource.text; - switch (this.resource.msg_type) { + switch (this.getMessageType()) { + case 'PICTURE': + text = "[图片]"; + break; case 'GOODS': text = "[商品链接]"; break; @@ -224,10 +235,15 @@ class Talk extends Base { } // console.log("%c 准备更新...UPDATE_TALK_ITEM ", "color:red"); + const nowTime = parseTime(new Date()); + const msgText = this.getTalkText() || record.text; talkStore.UPDATE_TALK_ITEM({ index_name: this.getIndexName(), - msg_text: this.getTalkText() || record.text, - updated_at: parseTime(new Date()), + msg_text: msgText, + lastTalkMessage: msgText, + lastTalkTime: nowTime, + lastMessageType: this.getMessageType(), + updated_at: nowTime, }); if (this.talk_type == 1 && this.getAccountId() !== this.sender_id) { @@ -248,6 +264,7 @@ class Talk extends Base { useTalkStore().UPDATE_TALK_MESSAGE({ index_name: this.getIndexName(), msg_text: this.getTalkText(), + lastMessageType: this.getMessageType(), updated_at: parseTime(new Date()), }); } diff --git a/im/src/mixins/main-mixin.js b/im/src/mixins/main-mixin.js index d781d1e96..58aa7a0f6 100644 --- a/im/src/mixins/main-mixin.js +++ b/im/src/mixins/main-mixin.js @@ -38,6 +38,8 @@ export default { await this.createTalk(this.$route.query.id); } else if (typeof this.loadChatList === "function") { await this.loadChatList(); + } else if (typeof this.loadChatListInJs === "function") { + await this.loadChatListInJs(); } } if(this.$route.query.goodsId && this.$route.query.skuId && this.goodsParams){ @@ -104,8 +106,8 @@ export default { items: result.map((item) => formatTalkItem(item)), }); - // 判断 - if (this.$route.query.id) { + // 判断(仅在挂载了 clickTab 的页面组件实例上自动切换会话) + if (this.$route.query.id && typeof this.clickTab === "function") { let takeData, takeIndex; result.forEach((take, index) => { if (take.id == this.$route.query.id) { @@ -113,9 +115,13 @@ export default { takeIndex = index; } }); - this.$nextTick(() => - this.clickTab(this.$route.query.id, takeData, takeIndex) - ); + if (typeof this.$nextTick === "function") { + this.$nextTick(() => + this.clickTab(this.$route.query.id, takeData, takeIndex) + ); + } else { + this.clickTab(this.$route.query.id, takeData, takeIndex); + } } }).finally(() => { this.loadStatus = 1; diff --git a/im/src/stores/talk.js b/im/src/stores/talk.js index d98634b15..d6b508b63 100644 --- a/im/src/stores/talk.js +++ b/im/src/stores/talk.js @@ -71,11 +71,17 @@ export const useTalkStore = defineStore("talks", { UPDATE_TALK_MESSAGE(resource) { let enableGetTalkList = true; this.items.forEach((item) => { - if (item.userId == resource.index_name.split("_")[1]) { + if ( + item.index_name === resource.index_name || + item.userId == resource.index_name.split("_")[1] + ) { item.unread++; item.msg_text = resource.msg_text; item.lastTalkTime = resource.updated_at; item.lastTalkMessage = resource.msg_text; + if (resource.lastMessageType) { + item.lastMessageType = resource.lastMessageType; + } item.updated_at = resource.updated_at; enableGetTalkList = false; } diff --git a/im/src/utils/app-bridge.js b/im/src/utils/app-bridge.js index 493830330..f3ce2bb22 100644 --- a/im/src/utils/app-bridge.js +++ b/im/src/utils/app-bridge.js @@ -28,6 +28,8 @@ const mixinCtx = { return router.currentRoute.value; }, }; +mixinCtx.loadChatListInJs = MainMixin.methods.loadChatListInJs.bind(mixinCtx); +mixinCtx.loadStoreChatList = MainMixin.methods.loadStoreChatList.bind(mixinCtx); export function setRefreshView(fn) { refreshViewFn = fn; diff --git a/im/src/views/message/index.vue b/im/src/views/message/index.vue index d1c04d7e6..6bbf4c64a 100644 --- a/im/src/views/message/index.vue +++ b/im/src/views/message/index.vue @@ -113,8 +113,9 @@
- [商品链接] - [订单链接] + [图片] + [商品链接] + [订单链接]