Browse Source

消息自动重发

master
xsx 8 months ago
parent
commit
208a560f18
  1. 5
      im-uniapp/components/chat-message-item/chat-message-item.vue
  2. 50
      im-uniapp/pages/chat/chat-box.vue
  3. 20
      im-uniapp/store/chatStore.js
  4. 45
      im-web/src/components/chat/ChatBox.vue
  5. 2
      im-web/src/components/chat/ChatMessageItem.vue
  6. 19
      im-web/src/store/chatStore.js

5
im-uniapp/components/chat-message-item/chat-message-item.vue

@ -118,10 +118,7 @@ export default {
}, },
methods: { methods: {
onSendFail() { onSendFail() {
uni.showToast({ this.$emit("resend", this.msgInfo);
title: "该消息已发送失败,目前不支持自动重新发送,建议手动重新发送",
icon: "none"
})
}, },
onPlayAudio() { onPlayAudio() {
// //

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

@ -9,10 +9,10 @@
<view v-for="(msgInfo, idx) in chat.messages" :key="idx"> <view v-for="(msgInfo, idx) in chat.messages" :key="idx">
<chat-message-item :ref="'message'+msgInfo.id" v-if="idx >= showMinIdx" <chat-message-item :ref="'message'+msgInfo.id" v-if="idx >= showMinIdx"
:headImage="headImage(msgInfo)" @call="onRtCall(msgInfo)" :showName="showName(msgInfo)" :headImage="headImage(msgInfo)" @call="onRtCall(msgInfo)" :showName="showName(msgInfo)"
@recall="onRecallMessage" @delete="onDeleteMessage" @copy="onCopyMessage" @resend="onResendMessage" @recall="onRecallMessage" @delete="onDeleteMessage"
@longPressHead="onLongPressHead(msgInfo)" @download="onDownloadFile" @copy="onCopyMessage" @longPressHead="onLongPressHead(msgInfo)"
@audioStateChange="onAudioStateChange" :id="'chat-item-' + idx" :msgInfo="msgInfo" @download="onDownloadFile" @audioStateChange="onAudioStateChange"
:groupMembers="groupMembers"> :id="'chat-item-' + idx" :msgInfo="msgInfo" :groupMembers="groupMembers">
</chat-message-item> </chat-message-item>
</view> </view>
</view> </view>
@ -338,10 +338,7 @@ export default {
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.insertMessage(tmpMessage, chat);
}).finally(() => { })
//
this.scrollToBottom();
});
} }
}) })
@ -451,8 +448,6 @@ export default {
// file // file
file.msgInfo = msgInfo; file.msgInfo = msgInfo;
file.chat = this.chat; file.chat = this.chat;
//
this.scrollToBottom();
// //
let chat = this.chat; let chat = this.chat;
this.getImageSize(file).then(size => { this.getImageSize(file).then(size => {
@ -511,8 +506,6 @@ export default {
// file // file
file.msgInfo = msgInfo; file.msgInfo = msgInfo;
file.chat = this.chat; file.chat = this.chat;
//
this.scrollToBottom();
return true; return true;
}, },
onUploadFileSuccess(file, res) { onUploadFileSuccess(file, res) {
@ -536,6 +529,37 @@ export default {
msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED; msgInfo.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(msgInfo, file.chat); this.chatStore.insertMessage(msgInfo, file.chat);
}, },
onResendMessage(msgInfo) {
if (msgInfo.type != this.$enums.MESSAGE_TYPE.TEXT) {
uni.showToast({
title: "该消息不支持自动重新发送,建议手动重新发送",
icon: "none"
})
return;
}
//
const chat = this.chat;
//
this.chatStore.deleteMessage(msgInfo, chat);
//
msgInfo.temId = this.generateId();
let tmpMessage = this.buildTmpMessage(msgInfo);
this.chatStore.insertMessage(tmpMessage, chat);
this.moveChatToTop();
this.sendMessageRequest(msgInfo).then(m => {
//
tmpMessage = JSON.parse(JSON.stringify(tmpMessage));
tmpMessage.id = m.id;
tmpMessage.status = m.status;
tmpMessage.content = m.content;
this.chatStore.insertMessage(tmpMessage, chat);
}).catch(() => {
//
tmpMessage = JSON.parse(JSON.stringify(tmpMessage));
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, chat);
})
},
onDeleteMessage(msgInfo) { onDeleteMessage(msgInfo) {
uni.showModal({ uni.showModal({
title: '删除消息', title: '删除消息',
@ -996,7 +1020,7 @@ export default {
if (newSize > oldSize && oldSize > 0) { if (newSize > oldSize && oldSize > 0) {
let lastMessage = this.chat.messages[newSize - 1]; let lastMessage = this.chat.messages[newSize - 1];
if (this.$msgType.isNormal(lastMessage.type)) { if (this.$msgType.isNormal(lastMessage.type)) {
if (this.isInBottom) { if (this.isInBottom || lastMessage.selfSend) {
// , // ,
this.scrollToBottom(); this.scrollToBottom();
} else { } else {

20
im-uniapp/store/chatStore.js

@ -247,25 +247,33 @@ export default defineStore('chatStore', {
} }
}, },
deleteMessage(msgInfo, chatInfo) { deleteMessage(msgInfo, chatInfo) {
// 获取对方id或群id
let chat = this.findChat(chatInfo);
let isColdMessage = false; let isColdMessage = false;
let chat = this.findChat(chatInfo);
let delIdx = -1;
for (let idx in chat.messages) { for (let idx in chat.messages) {
// 已经发送成功的,根据id删除 // 已经发送成功的,根据id删除
if (chat.messages[idx].id && chat.messages[idx].id == msgInfo.id) { if (chat.messages[idx].id && chat.messages[idx].id == msgInfo.id) {
chat.messages.splice(idx, 1); delIdx = idx;
isColdMessage = idx < chat.hotMinIdx;
break; break;
} }
// 正在发送中的消息可能没有id,只有临时id // 正在发送中的消息可能没有id,只有临时id
if (chat.messages[idx].tmpId && chat.messages[idx].tmpId == msgInfo.tmpId) { if (chat.messages[idx].tmpId && chat.messages[idx].tmpId == msgInfo.tmpId) {
chat.messages.splice(idx, 1); delIdx = idx;
isColdMessage = idx < chat.hotMinIdx;
break; break;
} }
} }
if (delIdx >= 0) {
chat.messages.splice(delIdx, 1);
if( delIdx < chat.hotMinIdx){
isColdMessage = true;
chat.hotMinIdx--;
}
if (delIdx < chat.readedMessageIdx) {
chat.readedMessageIdx--;
}
chat.stored = false; chat.stored = false;
this.saveToStorage(isColdMessage); this.saveToStorage(isColdMessage);
}
}, },
recallMessage(msgInfo, chatInfo) { recallMessage(msgInfo, chatInfo) {
let chat = this.findChat(chatInfo); let chat = this.findChat(chatInfo);

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

@ -13,7 +13,8 @@
<div v-for="(msgInfo, idx) in showMessages" :key="showMinIdx + idx"> <div v-for="(msgInfo, idx) in showMessages" :key="showMinIdx + idx">
<chat-message-item @call="onCall(msgInfo.type)" :mine="msgInfo.sendId == mine.id" <chat-message-item @call="onCall(msgInfo.type)" :mine="msgInfo.sendId == mine.id"
:headImage="headImage(msgInfo)" :showName="showName(msgInfo)" :msgInfo="msgInfo" :headImage="headImage(msgInfo)" :showName="showName(msgInfo)" :msgInfo="msgInfo"
:groupMembers="groupMembers" @delete="deleteMessage" @recall="recallMessage"> :groupMembers="groupMembers" @resend="onResendMessage" @delete="deleteMessage"
@recall="recallMessage">
</chat-message-item> </chat-message-item>
</div> </div>
</div> </div>
@ -198,8 +199,6 @@ export default {
this.chatStore.insertMessage(msgInfo, this.chat); this.chatStore.insertMessage(msgInfo, this.chat);
// //
this.moveChatToTop(); this.moveChatToTop();
//
this.scrollToBottom();
// file // file
file.msgInfo = msgInfo; file.msgInfo = msgInfo;
file.chat = this.chat; file.chat = this.chat;
@ -263,8 +262,6 @@ export default {
this.chatStore.insertMessage(msgInfo, this.chat); this.chatStore.insertMessage(msgInfo, this.chat);
// //
this.moveChatToTop(); this.moveChatToTop();
//
this.scrollToBottom();
// file // file
file.msgInfo = msgInfo; file.msgInfo = msgInfo;
file.chat = this.chat; file.chat = this.chat;
@ -492,7 +489,6 @@ export default {
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED; tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, chat); this.chatStore.insertMessage(tmpMessage, chat);
}).finally(() => { }).finally(() => {
this.scrollToBottom();
this.isReceipt = false; this.isReceipt = false;
resolve(); resolve();
}); });
@ -506,6 +502,35 @@ export default {
} }
}) })
}, },
onResendMessage(msgInfo) {
if (msgInfo.type != this.$enums.MESSAGE_TYPE.TEXT) {
this.$message.error("该消息不支持自动重新发送,建议手动重新发送")
return;
}
//
const chat = this.chat;
//
this.chatStore.deleteMessage(msgInfo, chat);
//
msgInfo.temId = this.generateId();
let tmpMessage = this.buildTmpMessage(msgInfo);
this.chatStore.insertMessage(tmpMessage, chat);
this.moveChatToTop();
//
this.sendMessageRequest(msgInfo).then(m => {
//
tmpMessage.id = m.id;
tmpMessage.status = m.status;
tmpMessage.content = m.content;
this.chatStore.insertMessage(tmpMessage, chat);
}).catch(() => {
//
tmpMessage.status = this.$enums.MESSAGE_STATUS.FAILED;
this.chatStore.insertMessage(tmpMessage, chat);
}).finally(() => {
this.scrollToBottom();
});
},
deleteMessage(msgInfo) { deleteMessage(msgInfo) {
this.$confirm('确认删除消息?', '删除消息', { this.$confirm('确认删除消息?', '删除消息', {
confirmButtonText: '确定', confirmButtonText: '确定',
@ -797,16 +822,18 @@ export default {
messageSize: { messageSize: {
handler(newSize, oldSize) { handler(newSize, oldSize) {
if (newSize > oldSize) { if (newSize > oldSize) {
if (this.isInBottom) { // ,
// let lastMessage = this.chat.messages[newSize - 1];
if (lastMessage && this.$msgType.isNormal(lastMessage.type)) {
if (this.isInBottom || lastMessage.selfSend) {
this.scrollToBottom(); this.scrollToBottom();
} else { } else {
//
this.newMessageSize++; this.newMessageSize++;
} }
} }
} }
} }
}
}, },
mounted() { mounted() {
let div = document.getElementById("chatScrollBox"); let div = document.getElementById("chatScrollBox");

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

@ -119,7 +119,7 @@ export default {
}, },
methods: { methods: {
onSendFail() { onSendFail() {
this.$message.error("该消息已发送失败,目前不支持自动重新发送,建议手动重新发送") this.$emit("resend",this.msgInfo);
}, },
showFullImageBox() { showFullImageBox() {
let imageUrl = JSON.parse(this.msgInfo.content).originUrl; let imageUrl = JSON.parse(this.msgInfo.content).originUrl;

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

@ -242,24 +242,33 @@ export default defineStore('chatStore', {
} }
}, },
deleteMessage(msgInfo, chatInfo) { deleteMessage(msgInfo, chatInfo) {
let chat = this.findChat(chatInfo);
let isColdMessage = false; let isColdMessage = false;
let chat = this.findChat(chatInfo);
let delIdx = -1;
for (let idx in chat.messages) { for (let idx in chat.messages) {
// 已经发送成功的,根据id删除 // 已经发送成功的,根据id删除
if (chat.messages[idx].id && chat.messages[idx].id == msgInfo.id) { if (chat.messages[idx].id && chat.messages[idx].id == msgInfo.id) {
chat.messages.splice(idx, 1); delIdx = idx;
isColdMessage = idx < chat.hotMinIdx;
break; break;
} }
// 正在发送中的消息可能没有id,只有临时id // 正在发送中的消息可能没有id,只有临时id
if (chat.messages[idx].tmpId && chat.messages[idx].tmpId == msgInfo.tmpId) { if (chat.messages[idx].tmpId && chat.messages[idx].tmpId == msgInfo.tmpId) {
chat.messages.splice(idx, 1); delIdx = idx;
isColdMessage = idx < chat.hotMinIdx;
break; break;
} }
} }
if (delIdx >= 0) {
chat.messages.splice(delIdx, 1);
if (delIdx < chat.hotMinIdx) {
isColdMessage = true;
chat.hotMinIdx--;
}
if (delIdx < chat.readedMessageIdx) {
chat.readedMessageIdx--;
}
chat.stored = false; chat.stored = false;
this.saveToStorage(isColdMessage); this.saveToStorage(isColdMessage);
}
}, },
recallMessage(msgInfo, chatInfo) { recallMessage(msgInfo, chatInfo) {
let chat = this.findChat(chatInfo); let chat = this.findChat(chatInfo);

Loading…
Cancel
Save