149 lines
4.6 KiB
JavaScript
149 lines
4.6 KiB
JavaScript
|
|
import { defineStore } from "pinia";
|
|||
|
|
import { EMClient } from "@/EaseIM";
|
|||
|
|
import { CHAT_TYPE } from "@/EaseIM/constant";
|
|||
|
|
import { getEMKey } from "@/EaseIM/utils";
|
|||
|
|
|
|||
|
|
export const useConversationStore = defineStore("conversation", {
|
|||
|
|
state: () => {
|
|||
|
|
return {
|
|||
|
|
chattingId: "", //进入聊天页面聊天中的目标聊天用户信息
|
|||
|
|
conversationList: [],
|
|||
|
|
userId: "", //好友用户id
|
|||
|
|
userLevel: "", //好友等级
|
|||
|
|
|
|||
|
|
inputBarHeight: 160, // 默认高度
|
|||
|
|
expandedInputBarHeight: 300, // 展开时高度
|
|||
|
|
userFriendInfo: {}, //好友信息
|
|||
|
|
userInfo:{}, //当前登录用户信息
|
|||
|
|
avatar: "", //当前登录用户头像
|
|||
|
|
friendAvatar: "", //好友头像
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
getters: {
|
|||
|
|
//排序会话列表
|
|||
|
|
sortedConversationList() {
|
|||
|
|
return this.conversationList.sort((a, b) => {
|
|||
|
|
return b.time - a.time;
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
//会话未读总数
|
|||
|
|
calcAllUnReadNumFromConversation() {
|
|||
|
|
return this.conversationList.reduce((a, c) => a + c.unread_num, 0);
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
actions: {
|
|||
|
|
//当前登录人的头像
|
|||
|
|
|
|||
|
|
setAvatar(listener) {
|
|||
|
|
this.avatar = listener;
|
|||
|
|
},
|
|||
|
|
//好友头像
|
|||
|
|
setFriendAvatar(listener) {
|
|||
|
|
this.friendAvatar = listener;
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 当前登录用户的信息
|
|||
|
|
setUserInfo(listener) {
|
|||
|
|
this.userInfo = listener;
|
|||
|
|
},
|
|||
|
|
// 好友的信息
|
|||
|
|
setFriendInfo(listener) {
|
|||
|
|
this.userFriendInfo= listener;
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 输入框高度
|
|||
|
|
expandInputBar() {
|
|||
|
|
this.inputBarHeight = this.expandedInputBarHeight;
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
collapseInputBar() {
|
|||
|
|
this.inputBarHeight = 180;
|
|||
|
|
},
|
|||
|
|
// 好友的环信
|
|||
|
|
setChattingUserId(channel_id) {
|
|||
|
|
this.chattingId = channel_id;
|
|||
|
|
},
|
|||
|
|
// 好友用户id
|
|||
|
|
setUserId(userId) {
|
|||
|
|
this.userId = userId;
|
|||
|
|
},
|
|||
|
|
// 和好友的等级
|
|||
|
|
setUserLevel(userLevel) {
|
|||
|
|
this.userLevel = userLevel;
|
|||
|
|
},
|
|||
|
|
setConversationList(conversationList) {
|
|||
|
|
const rePackageConversationList = [];
|
|||
|
|
conversationList?.length &&
|
|||
|
|
conversationList.map((channel) => {
|
|||
|
|
const conversationBody = {
|
|||
|
|
channel_id: "",
|
|||
|
|
chatType: "",
|
|||
|
|
lastMessage: {},
|
|||
|
|
unread_num: 0,
|
|||
|
|
time: 0,
|
|||
|
|
};
|
|||
|
|
const { channel_id, unread_num, lastMessage } = channel;
|
|||
|
|
const { from, to, time } = lastMessage;
|
|||
|
|
const regexp = /.*@easemob.com$/;
|
|||
|
|
const chatType =
|
|||
|
|
(regexp.test(channel_id) && CHAT_TYPE.SINGLE_CHAT) ||
|
|||
|
|
CHAT_TYPE.GROUP_CHAT; //判断是单聊会话还是群组或聊天室会话
|
|||
|
|
conversationBody.channel_id = getEMKey(
|
|||
|
|
EMClient.user,
|
|||
|
|
from,
|
|||
|
|
to,
|
|||
|
|
chatType
|
|||
|
|
);
|
|||
|
|
conversationBody.chatType = chatType;
|
|||
|
|
conversationBody.lastMessage = channel.lastMessage;
|
|||
|
|
conversationBody.unread_num = unread_num;
|
|||
|
|
conversationBody.time = time;
|
|||
|
|
return rePackageConversationList.push(conversationBody);
|
|||
|
|
});
|
|||
|
|
this.conversationList = rePackageConversationList;
|
|||
|
|
},
|
|||
|
|
async deleteConversation(channel_id) {
|
|||
|
|
this.conversationList.length &&
|
|||
|
|
this.conversationList.forEach((channel, index) => {
|
|||
|
|
if (channel.channel_id === channel_id) {
|
|||
|
|
this.conversationList.splice(index, 1);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
updateConversationLastMessage(channel_id, message) {
|
|||
|
|
const { time, from, to } = message;
|
|||
|
|
let foundChannel = false;
|
|||
|
|
this.conversationList.forEach((channel) => {
|
|||
|
|
if (channel.channel_id === channel_id) {
|
|||
|
|
//要更新的lastmsg消息来源不为当前id,且不为正在会话中的id则累加未读数。
|
|||
|
|
if (from !== EMClient.user && this.chattingId !== channel_id) {
|
|||
|
|
channel.unread_num = channel.unread_num + 1;
|
|||
|
|
}
|
|||
|
|
channel.time = time;
|
|||
|
|
channel.lastMessage = message;
|
|||
|
|
foundChannel = true;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 如果没有找到要更新的会话,则新增一个会话对象
|
|||
|
|
if (!foundChannel) {
|
|||
|
|
const conversationBody = {
|
|||
|
|
channel_id: channel_id,
|
|||
|
|
chatType: message.chatType,
|
|||
|
|
lastMessage: message,
|
|||
|
|
unread_num: message.from !== EMClient.user ? 1 : 0,
|
|||
|
|
time: time,
|
|||
|
|
};
|
|||
|
|
this.conversationList.push(conversationBody);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
clearConversationUnReadNum(channel_id) {
|
|||
|
|
this.conversationList.forEach((channel) => {
|
|||
|
|
if (channel.channel_id === channel_id) {
|
|||
|
|
channel.unread_num = 0;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
});
|