|
|
@@ -4,11 +4,14 @@ import {
|
|
|
} from '@/common/enums.js';
|
|
|
import userStore from './userStore';
|
|
|
|
|
|
+/* uniapp渲染消息性能非常拉胯,所以这里先把离线消息存储到cacheChats,
|
|
|
+ 等待所有离线消息拉取完成后,再统一进行渲染 */
|
|
|
+let cacheChats = [];
|
|
|
+
|
|
|
export default {
|
|
|
state: {
|
|
|
activeIndex: -1,
|
|
|
chats: [],
|
|
|
- copyChats: [],
|
|
|
privateMsgMaxId: 0,
|
|
|
groupMsgMaxId: 0,
|
|
|
loadingPrivateMsg: false,
|
|
|
@@ -17,19 +20,26 @@ export default {
|
|
|
|
|
|
mutations: {
|
|
|
initChats(state, chatsData) {
|
|
|
- state.chats = chatsData.chats || [];
|
|
|
+ // 暂存至缓冲区
|
|
|
+ cacheChats = JSON.parse(JSON.stringify(chatsData.chats))
|
|
|
+ // 只取前10条数据做做样子,一切都为了加快初始化时间
|
|
|
+ let size = Math.min(chatsData.chats.length,10);
|
|
|
+ for (let i = 0; i < size; i++) {
|
|
|
+ let chat = chatsData.chats[i];
|
|
|
+ chat.messages = [];
|
|
|
+ state.chats[i] = chat;
|
|
|
+ }
|
|
|
state.privateMsgMaxId = chatsData.privateMsgMaxId || 0;
|
|
|
state.groupMsgMaxId = chatsData.groupMsgMaxId || 0;
|
|
|
// 防止图片一直处在加载中状态
|
|
|
- state.chats.forEach((chat) => {
|
|
|
+ cacheChats.forEach((chat) => {
|
|
|
chat.messages.forEach((msg) => {
|
|
|
if (msg.loadStatus == "loading") {
|
|
|
msg.loadStatus = "fail"
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
- // 拷贝一份,用于缓存离线消息
|
|
|
- state.copyChats = JSON.parse(JSON.stringify(state.chats))
|
|
|
+
|
|
|
},
|
|
|
openChat(state, chatInfo) {
|
|
|
let chats = this.getters.findChats();
|
|
|
@@ -112,6 +122,10 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
moveTop(state, idx) {
|
|
|
+ // 加载中不移动,防止卡顿
|
|
|
+ if (this.getters.isLoading()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
let chats = this.getters.findChats();
|
|
|
if (idx > 0) {
|
|
|
let chat = chats[idx];
|
|
|
@@ -158,7 +172,7 @@ export default {
|
|
|
}
|
|
|
chat.lastSendTime = msgInfo.sendTime;
|
|
|
chat.sendNickName = msgInfo.sendNickName;
|
|
|
-
|
|
|
+
|
|
|
// 未读加1
|
|
|
if (!msgInfo.selfSend && msgInfo.status != MESSAGE_STATUS.READED &&
|
|
|
msgInfo.type != MESSAGE_TYPE.TIP_TEXT) {
|
|
|
@@ -186,7 +200,7 @@ export default {
|
|
|
// 根据id顺序插入,防止消息乱序
|
|
|
let insertPos = chat.messages.length;
|
|
|
// 防止 图片、文件 在发送方 显示 在顶端 因为还没存库,id=0
|
|
|
- if (msgInfo.id && msgInfo.id > 0 ) {
|
|
|
+ if (msgInfo.id && msgInfo.id > 0) {
|
|
|
for (let idx in chat.messages) {
|
|
|
if (chat.messages[idx].id && msgInfo.id < chat.messages[idx].id) {
|
|
|
insertPos = idx;
|
|
|
@@ -195,10 +209,10 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if(insertPos == chat.messages.length){
|
|
|
+ if (insertPos == chat.messages.length) {
|
|
|
// 这种赋值效率最高
|
|
|
- chat.messages[insertPos]= msgInfo;
|
|
|
- }else{
|
|
|
+ chat.messages[insertPos] = msgInfo;
|
|
|
+ } else {
|
|
|
chat.messages.splice(insertPos, 0, msgInfo);
|
|
|
}
|
|
|
this.commit("saveToStorage");
|
|
|
@@ -268,13 +282,18 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
refreshChats(state) {
|
|
|
- // 将离线消息一次性装载回来
|
|
|
- state.chats = JSON.parse(JSON.stringify(state.copyChats))
|
|
|
+
|
|
|
+ // 排序
|
|
|
+ cacheChats.sort((chat1, chat2) => {
|
|
|
+ return chat2.lastSendTime - chat1.lastSendTime;
|
|
|
+ });
|
|
|
+ // 将消息一次性装载回来,只显示前30个会话,多了卡的不行
|
|
|
+ state.chats = JSON.parse(JSON.stringify(cacheChats.slice(0,30)))
|
|
|
this.commit("saveToStorage");
|
|
|
},
|
|
|
saveToStorage(state) {
|
|
|
// 加载中不保存,防止卡顿
|
|
|
- if(state.loadingPrivateMsg || state.loadingGroupMsg){
|
|
|
+ if (this.getters.isLoading()) {
|
|
|
return;
|
|
|
}
|
|
|
let userId = userStore.state.userInfo.id;
|
|
|
@@ -291,7 +310,6 @@ export default {
|
|
|
},
|
|
|
clear(state) {
|
|
|
state.chats = [];
|
|
|
- state.copyChats = [];
|
|
|
state.activeIndex = -1;
|
|
|
state.privateMsgMaxId = 0;
|
|
|
state.groupMsgMaxId = 0;
|
|
|
@@ -317,11 +335,11 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
getters: {
|
|
|
- findChats: (state) => () => {
|
|
|
- /* uniapp渲染消息性能非常拉胯,所以这里先把离线消息存储到state.copyChats,
|
|
|
- 等待所有离线消息拉取完成后,再统一进行渲染 */
|
|
|
- let isLoading = state.loadingPrivateMsg || state.loadingGroupMsg;
|
|
|
- return isLoading ? state.copyChats : state.chats;
|
|
|
+ isLoading: (state) => () => {
|
|
|
+ return state.loadingPrivateMsg || state.loadingGroupMsg
|
|
|
+ },
|
|
|
+ findChats: (state, getters) => () => {
|
|
|
+ return getters.isLoading() ? cacheChats : state.chats;
|
|
|
},
|
|
|
findChatIdx: (state, getters) => (chat) => {
|
|
|
let chats = getters.findChats();
|