Chatwoot/app/javascript/widget/store/modules/conversationv2/getters.js

69 lines
2.8 KiB
JavaScript
Raw Normal View History

import { MESSAGE_TYPE } from 'widget/helpers/constants';
import groupBy from 'lodash.groupby';
import { groupConversationBySender } from './helpers';
import { formatUnixDate } from 'shared/helpers/DateHelper';
export const getters = {
isAllMessagesFetched: _state => conversationId =>
_state.conversations[conversationId].uiFlags.allFetched,
isCreating: _state => _state.uiFlags.isCreating,
isAgentTypingIn: _state => conversationId =>
_state.conversations[conversationId].uiFlags.isAgentTyping,
allConversations: _state =>
_state.conversations.allIds.map(id => _state.conversations.byId[id]),
totalConversationsLength: _state => _state.conversations.allIds.length,
firstMessageIn: (...getterArguments) => conversationId => {
const { _state, _rootGetters } = getterArguments;
const messagesInConversation =
_state.conversations.byId[conversationId].messages;
if (messagesInConversation.length) {
const messageId = messagesInConversation[0];
const lastMessage = _rootGetters.messageV2.getMessageById(messageId);
return lastMessage;
}
return {};
},
groupByMessagesIn: (...getterArguments) => conversationId => {
const { _state, _rootGetters } = getterArguments;
const messageIds = _state.conversations.byId[conversationId].messages;
const messagesInConversation = messageIds.map(messageId =>
_rootGetters.messageV2.getMessageById(messageId)
);
const conversationGroupedByDate = groupBy(messagesInConversation, message =>
formatUnixDate(message.created_at)
);
return Object.keys(conversationGroupedByDate).map(date => ({
date,
messages: groupConversationBySender(conversationGroupedByDate[date]),
}));
},
getIsFetchingList: _state => _state.uiFlags.isFetchingList,
getMessageCount: _state => {
return Object.values(_state.conversations).length;
},
getUnreadMessageCount: _state => {
const { userLastSeenAt } = _state.meta;
const count = Object.values(_state.conversations).filter(chat => {
const { created_at: createdAt, message_type: messageType } = chat;
const isOutGoing = messageType === MESSAGE_TYPE.OUTGOING;
const hasNotSeen = userLastSeenAt
? createdAt * 1000 > userLastSeenAt * 1000
: true;
return hasNotSeen && isOutGoing;
}).length;
return count;
},
getUnreadTextMessages: (_state, _getters) => {
const unreadCount = _getters.getUnreadMessageCount;
const allMessages = [...Object.values(_state.conversations)];
const unreadAgentMessages = allMessages.filter(message => {
const { message_type: messageType } = message;
return messageType === MESSAGE_TYPE.OUTGOING;
});
const maxUnreadCount = Math.min(unreadCount, 3);
const allUnreadMessages = unreadAgentMessages.splice(-maxUnreadCount);
return allUnreadMessages;
},
};