Browse Source

fix: 发送多种图片异常的bug

master
xsx 7 months ago
parent
commit
e08947ac81
  1. 20
      im-uniapp/pages/chat/chat-box.vue
  2. 24
      im-uniapp/store/chatStore.js
  3. 22
      im-web/src/components/chat/ChatBox.vue
  4. 3
      im-web/src/components/chat/ChatMessageItem.vue
  5. 26
      im-web/src/store/chatStore.js

20
im-uniapp/pages/chat/chat-box.vue

@ -188,7 +188,7 @@ export default {
// //
tmpMessage.id = m.id; tmpMessage.id = m.id;
tmpMessage.status = m.status; tmpMessage.status = m.status;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
// //
this.moveChatToTop(); this.moveChatToTop();
// //
@ -335,12 +335,12 @@ export default {
tmpMessage.id = m.id; tmpMessage.id = m.id;
tmpMessage.status = m.status; tmpMessage.status = m.status;
tmpMessage.content = m.content; tmpMessage.content = m.content;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}).catch(() => { }).catch(() => {
// //
tmpMessage = JSON.parse(JSON.stringify(tmpMessage)); tmpMessage = JSON.parse(JSON.stringify(tmpMessage));
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED; tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}) })
} }
}) })
@ -460,7 +460,7 @@ export default {
data.width = size.width; data.width = size.width;
data.height = size.height; data.height = size.height;
msgInfo.content = JSON.stringify(data) msgInfo.content = JSON.stringify(data)
this.chatStore.insertMessage(msgInfo, chat); this.chatStore.updateMessage(msgInfo, chat);
this.scrollToBottom(); this.scrollToBottom();
}) })
return true; return true;
@ -473,13 +473,13 @@ export default {
msgInfo.id = m.id; msgInfo.id = m.id;
msgInfo.status = m.status; msgInfo.status = m.status;
this.isReceipt = false; this.isReceipt = false;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}) })
}, },
onUploadImageFail(file, err) { onUploadImageFail(file, err) {
let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); let msgInfo = JSON.parse(JSON.stringify(file.msgInfo));
msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED; msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}, },
onUploadFileBefore(file) { onUploadFileBefore(file) {
// //
@ -526,13 +526,13 @@ export default {
msgInfo.id = m.id; msgInfo.id = m.id;
msgInfo.status = m.status; msgInfo.status = m.status;
this.isReceipt = false; this.isReceipt = false;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}) })
}, },
onUploadFileFail(file, res) { onUploadFileFail(file, res) {
let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); let msgInfo = JSON.parse(JSON.stringify(file.msgInfo));
msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED; msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}, },
onResendMessage(msgInfo) { onResendMessage(msgInfo) {
if (msgInfo.type != this.$enums.MESSAGE_TYPE.TEXT) { if (msgInfo.type != this.$enums.MESSAGE_TYPE.TEXT) {
@ -557,12 +557,12 @@ export default {
tmpMessage.id = m.id; tmpMessage.id = m.id;
tmpMessage.status = m.status; tmpMessage.status = m.status;
tmpMessage.content = m.content; tmpMessage.content = m.content;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}).catch(() => { }).catch(() => {
// //
tmpMessage = JSON.parse(JSON.stringify(tmpMessage)); tmpMessage = JSON.parse(JSON.stringify(tmpMessage));
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED; tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}) })
}, },
onDeleteMessage(msgInfo) { onDeleteMessage(msgInfo) {

24
im-uniapp/store/chatStore.js

@ -497,21 +497,29 @@ export default defineStore('chatStore', {
if (!chat) { if (!chat) {
return null; return null;
} }
for (let idx = chat.messages.length - 1; idx >= 0; idx--) {
// 通过id判断 // 通过id判断
if (msgInfo.id && chat.messages[idx].id) { if (msgInfo.id) {
if (msgInfo.id == chat.messages[idx].id) { for (let idx = chat.messages.length - 1; idx >= 0; idx--) {
return chat.messages[idx]; let m = chat.messages[idx];
if (m.id && msgInfo.id == m.id) {
return m;
} }
// 如果id比要查询的消息小,说明没有这条消息 // 如果id比要查询的消息小,说明没有这条消息
if (msgInfo.id > chat.messages[idx].id) { if (m.id && m.id < msgInfo.id) {
break; break;
} }
} }
}
// 正在发送中的消息可能没有id,只有tmpId // 正在发送中的消息可能没有id,只有tmpId
if (msgInfo.tmpId && chat.messages[idx].tmpId) { if (msgInfo.tmpId) {
if (msgInfo.tmpId == chat.messages[idx].tmpId) { for (let idx = chat.messages.length - 1; idx >= 0; idx--) {
return chat.messages[idx]; let m = chat.messages[idx];
if (m.tmpId && msgInfo.tmpId == m.tmpId) {
return m;
}
// 如果id比要查询的消息小,说明没有这条消息
if (m.tmpId && m.tmpId < msgInfo.tmpId) {
break;
} }
} }
} }

22
im-web/src/components/chat/ChatBox.vue

@ -163,13 +163,13 @@ export default {
msgInfo.id = m.id; msgInfo.id = m.id;
msgInfo.status = m.status; msgInfo.status = m.status;
this.isReceipt = false; this.isReceipt = false;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}) })
}, },
onImageFail(e, file) { onImageFail(e, file) {
let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); let msgInfo = JSON.parse(JSON.stringify(file.msgInfo));
msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED; msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}, },
onImageBefore(file) { onImageBefore(file) {
// //
@ -208,7 +208,7 @@ export default {
data.width = size.width; data.width = size.width;
data.height = size.height; data.height = size.height;
msgInfo.content = JSON.stringify(data) msgInfo.content = JSON.stringify(data)
this.chatStore.insertMessage(msgInfo, chat); this.chatStore.updateMessage(msgInfo, chat);
this.scrollToBottom(); this.scrollToBottom();
}) })
}, },
@ -226,13 +226,13 @@ export default {
msgInfo.status = m.status; msgInfo.status = m.status;
this.isReceipt = false; this.isReceipt = false;
this.refreshPlaceHolder(); this.refreshPlaceHolder();
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}) })
}, },
onFileFail(e, file) { onFileFail(e, file) {
let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); let msgInfo = JSON.parse(JSON.stringify(file.msgInfo));
msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED; msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.updateMessage(msgInfo, file.chat);
}, },
onFileBefore(file) { onFileBefore(file) {
// //
@ -384,7 +384,7 @@ export default {
// //
tmpMessage.id = m.id; tmpMessage.id = m.id;
tmpMessage.status = m.status; tmpMessage.status = m.status;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
// //
this.moveChatToTop(); this.moveChatToTop();
// //
@ -397,7 +397,7 @@ export default {
this.refreshPlaceHolder(); this.refreshPlaceHolder();
}).catch(() => { }).catch(() => {
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED; tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, this.chat); this.chatStore.updateMessage(tmpMessage, this.chat);
}) })
}, },
fillTargetId(msgInfo, targetId) { fillTargetId(msgInfo, targetId) {
@ -483,11 +483,11 @@ export default {
tmpMessage.id = m.id; tmpMessage.id = m.id;
tmpMessage.status = m.status; tmpMessage.status = m.status;
tmpMessage.content = m.content; tmpMessage.content = m.content;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}).catch(() => { }).catch(() => {
// //
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED; tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}).finally(() => { }).finally(() => {
this.isReceipt = false; this.isReceipt = false;
resolve(); resolve();
@ -522,11 +522,11 @@ export default {
tmpMessage.id = m.id; tmpMessage.id = m.id;
tmpMessage.status = m.status; tmpMessage.status = m.status;
tmpMessage.content = m.content; tmpMessage.content = m.content;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}).catch(() => { }).catch(() => {
// //
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED; tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.updateMessage(tmpMessage, chat);
}).finally(() => { }).finally(() => {
this.scrollToBottom(); this.scrollToBottom();
}); });

3
im-web/src/components/chat/ChatMessageItem.vue

@ -23,11 +23,8 @@
<span class="message-text" v-if="isTextMessage" v-html="htmlText"></span> <span class="message-text" v-if="isTextMessage" v-html="htmlText"></span>
<div class="message-image" v-else-if="msgInfo.type == $enums.MESSAGE_TYPE.IMAGE" <div class="message-image" v-else-if="msgInfo.type == $enums.MESSAGE_TYPE.IMAGE"
@click="showFullImageBox()"> @click="showFullImageBox()">
<div v-loading="sending" element-loading-text="发送中.."
element-loading-background="rgba(0, 0, 0, 0.4)">
<img :style="imageStyle" :src="contentData.thumbUrl" loading="lazy" /> <img :style="imageStyle" :src="contentData.thumbUrl" loading="lazy" />
</div> </div>
</div>
<div class="message-file" v-else-if="msgInfo.type == $enums.MESSAGE_TYPE.FILE"> <div class="message-file" v-else-if="msgInfo.type == $enums.MESSAGE_TYPE.FILE">
<div class="chat-file-box" v-loading="sending"> <div class="chat-file-box" v-loading="sending">
<div class="chat-file-info"> <div class="chat-file-info">

26
im-web/src/store/chatStore.js

@ -466,7 +466,8 @@ export default defineStore('chatStore', {
// 冷热消息合并 // 冷热消息合并
let chat = Object.assign({}, coldChat, hotChat); let chat = Object.assign({}, coldChat, hotChat);
if (hotChat && coldChat) { if (hotChat && coldChat) {
chat.messages = coldChat.messages.concat(hotChat.messages) chat.messages = coldChat.messages.concat(hotChat
.messages)
} }
// 历史版本没有readedMessageIdx字段,做兼容一下 // 历史版本没有readedMessageIdx字段,做兼容一下
chat.readedMessageIdx = chat.readedMessageIdx || 0; chat.readedMessageIdx = chat.readedMessageIdx || 0;
@ -522,21 +523,28 @@ export default defineStore('chatStore', {
if (!chat) { if (!chat) {
return null; return null;
} }
if (msgInfo.id) {
for (let idx = chat.messages.length - 1; idx >= 0; idx--) { for (let idx = chat.messages.length - 1; idx >= 0; idx--) {
// 通过id判断 let m = chat.messages[idx];
if (msgInfo.id && chat.messages[idx].id) { if (m.id && msgInfo.id == m.id) {
if (msgInfo.id == chat.messages[idx].id) { return m;
return chat.messages[idx];
} }
// 如果id比要查询的消息小,说明没有这条消息 // 如果id比要查询的消息小,说明没有这条消息
if (msgInfo.id > chat.messages[idx].id) { if (m.id && m.id < msgInfo.id) {
break; break;
} }
} }
}
// 正在发送中的消息可能没有id,只有tmpId // 正在发送中的消息可能没有id,只有tmpId
if (msgInfo.tmpId && chat.messages[idx].tmpId) { if (msgInfo.tmpId) {
if (msgInfo.tmpId == chat.messages[idx].tmpId) { for (let idx = chat.messages.length - 1; idx >= 0; idx--) {
return chat.messages[idx]; let m = chat.messages[idx];
if (m.tmpId && msgInfo.tmpId == m.tmpId) {
return m;
}
// 如果id比要查询的消息小,说明没有这条消息
if (m.tmpId && m.tmpId < msgInfo.tmpId) {
break;
} }
} }
} }

Loading…
Cancel
Save