| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- import Vue from 'vue';
- import { emMessages } from '@/EaseIM/emApis';
- import { MESSAGE_STATUS, MESSAGE_TYPE } from '@/EaseIM/constant';
- import ConversationStore from './conversation';
- import { EVENT_BUS_NAME } from '@/constant';
- const { fetchHistoryMessagesFromServer } = emMessages();
- const MessageStore = {
- state: {
- messageCollection: {},
- messageStatusCollection: {}, //readed、unread、recalled
- },
- mutations: {
- RESET_MESSAGE_STORE: (state) => {
- state.messageCollection = {};
- state.messageStatusCollection = {};
- },
- UPDATE_MESSAGE_COLLECTION(state, payload) {
- const { key, message } = payload;
- if (!state.messageCollection[key]) {
- /**
- * Vue 无法检测 property 的添加或移除。由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,
- * 因此使用Vue.set()方法,新增属性引起视图变化。
- */
- Vue.set(state.messageCollection, key, []);
- }
- //如果当前会话中Id为消息from,则发布消息列表更新事件。
- if (ConversationStore.state.chattingId === key) {
- uni.$emit(EVENT_BUS_NAME.EASEIM_MESSAGE_COLLECTION_UPDATE, {
- msgBody: message,
- });
- }
- state.messageCollection[key].unshift(message);
- },
- DELETE_MESSAGE_FROM_COLLECTION(state, payload) {
- const { key, mid } = payload;
- //!现有逻辑如果传了mid,则删除单条,否则置空key。
- if (mid) {
- if (state.messageCollection[key]) {
- const _index = state.messageCollection[key].findIndex(
- (item) => item.id == mid
- );
- console.log('>>>>>>找到对应的下标', _index);
- if (_index >= 0) {
- state.messageCollection[key].splice(_index, 1);
- //如果当前会话中Id为消息from,则发布消息列表更新事件。
- if (ConversationStore.state.chattingId === key) {
- uni.$emit(EVENT_BUS_NAME.EASEIM_MESSAGE_COLLECTION_DELETE, {
- mid: mid,
- });
- }
- }
- }
- } else {
- if (state.messageCollection[key]) {
- Vue.set(state.messageCollection, key, []);
- }
- }
- },
- MODIFY_MESSAGE_FROM_COLLECTION(state, payload) {
- const { key, mid, message } = payload;
- if (state.messageCollection[key]) {
- const _index = state.messageCollection[key].findIndex(
- (o) => o.id === mid
- );
- _index >= 0 &&
- state.messageCollection[key].splice(_index, 1, { ...message });
- console.log('>>>>>找到要修改修改后的消息', _index);
- if (ConversationStore.state.chattingId === key) {
- uni.$emit(EVENT_BUS_NAME.EASEIM_MESSAGE_COLLECTION_MODIFY, message);
- }
- // Object.assign(res, payload?.message);
- }
- },
- UPDATE_MESSAGE_FROM_SERVER(state, payload) {
- const { key, messageList } = payload;
- if (state.messageCollection[key]) {
- state.messageCollection[key].push(...messageList);
- } else {
- Vue.set(state.messageCollection, key, []);
- state.messageCollection[key].push(...messageList);
- }
- },
- UPDATE_MESSAGE_COLLECTION_STATUS(state, payload) {
- //key 为消息serverMsgId
- const { key, status } = payload;
- if (state.messageStatusCollection[key]) {
- state.messageStatusCollection[key] = status;
- } else {
- Vue.set(state.messageStatusCollection, key, status);
- }
- },
- ADD_NEW_GRAY_INFORM_MESSAGE(state, payload) {
- const { key, message } = payload;
- if (!state.messageCollection[key]) {
- Vue.set(state.messageCollection, key, []);
- }
- //如果当前会话中Id为消息from,则发布消息列表更新事件。
- if (ConversationStore.state.chattingId === key) {
- uni.$emit(EVENT_BUS_NAME.EASEIM_MESSAGE_COLLECTION_UPDATE, {
- msgBody: message,
- });
- }
- state.messageCollection[key].unshift(message);
- },
- },
- actions: {
- async fetchHistroyMessageListFromServer({ state, commit }, params) {
- const { targetId, chatType } = params;
- let cursorMsgId = '';
- const messages = state.messageCollection[targetId];
- //查找消息列表数组中的最后一条消息且不为灰色通知消息最为漫游cursorMsgId
- if (messages?.length) {
- const reverseMessages = Object.assign([], messages).reverse();
- const lastMsgBody = reverseMessages.find((message) => {
- return message.type !== MESSAGE_TYPE.GRAY_INFORM;
- });
- cursorMsgId = lastMsgBody?.id;
- }
- return new Promise((resolve, reject) => {
- fetchHistoryMessagesFromServer({
- targetId,
- chatType,
- cursor: cursorMsgId,
- })
- .then((res) => {
- const result = Object.assign({}, res);
- if (result.messages.length) {
- const filterMessages = result.messages.filter((message) => {
- if (message) {
- return message.type !== MESSAGE_TYPE.CMD;
- }
- });
- commit('UPDATE_MESSAGE_FROM_SERVER', {
- key: targetId,
- messageList: filterMessages,
- });
- result.messages = filterMessages;
- }
- resolve(result);
- })
- .catch((error) => {
- reject(error);
- });
- });
- },
- },
- getters: {
- messageCollection(state) {
- return state.messageCollection;
- },
- messageStatusCollection(state) {
- return state.messageStatusCollection;
- },
- },
- };
- export default MessageStore;
|