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

100 lines
4.1 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,
2021-09-29 08:58:32 +00:00
isFetchingConversationsList: _state =>
_state.conversations.uiFlags.isFetching,
allConversations: _state =>
_state.conversations.allIds.map(id => _state.conversations.byId[id]),
2021-09-29 08:58:32 +00:00
totalConversationsLength: _state => _state.conversations.allIds.length || 0,
firstMessageIn: (...getterArguments) => conversationId => {
2021-09-29 08:58:32 +00:00
const [_state, , , _rootGetters] = getterArguments;
const messagesInConversation =
_state.conversations.byId[conversationId].messages;
if (messagesInConversation.length) {
const messageId = messagesInConversation[0];
2021-09-29 08:58:32 +00:00
const lastMessage = _rootGetters['messageV2/messageById'](messageId);
return lastMessage;
}
return {};
},
groupByMessagesIn: (...getterArguments) => conversationId => {
2021-09-29 08:58:32 +00:00
const [_state, , , _rootGetters] = getterArguments;
const messageIds = _state.conversations.byId[conversationId].messages;
const messagesInConversation = messageIds.map(messageId =>
2021-09-29 08:58:32 +00:00
_rootGetters['messageV2/messageById'](messageId)
);
const messagesGroupedByDate = groupBy(messagesInConversation, message =>
formatUnixDate(message.created_at)
);
return Object.keys(messagesGroupedByDate).map(date => ({
date,
messages: groupConversationBySender(messagesGroupedByDate[date]),
}));
},
2021-09-29 08:58:32 +00:00
isFetchingMessages: _state => conversationId => {
const hasConversation = _state.conversations.uiFlags.byId[conversationId];
return hasConversation ? hasConversation.isFetching : false;
},
allMessagesCountIn: _state => conversationId => {
2021-09-29 08:58:32 +00:00
const conversation = _state.conversations.byId[conversationId];
return conversation ? conversation.messages.length : 0;
},
unreadMessageCountIn: (...getterArguments) => conversationId => {
2021-09-29 08:58:32 +00:00
const [_state, , , _rootGetters] = getterArguments;
const conversation = _state.conversations.byId[conversationId];
if (conversation) return 0;
const messageIds = _state.conversations.byId[conversationId].messages;
const messagesInConversation = messageIds.map(messageId =>
2021-09-29 08:58:32 +00:00
_rootGetters['messageV2/messageById'](messageId)
);
const { meta: { userLastSeenAt } = {} } = conversation;
const count = messagesInConversation.filter(message => {
const { created_at: createdAt, message_type: messageType } = message;
const isOutGoing = messageType === MESSAGE_TYPE.OUTGOING;
const hasNotSeen = userLastSeenAt
? createdAt * 1000 > userLastSeenAt * 1000
: true;
return hasNotSeen && isOutGoing;
}).length;
return count;
},
getUnreadMessagesIn: (...getterArguments) => conversationId => {
2021-09-29 08:58:32 +00:00
const [_state, _getters, _rootGetters] = getterArguments;
const unreadCount = _getters.unreadMessageCountIn(conversationId);
const conversation = _state.conversations.byId[conversationId];
if (conversation) return 0;
const messageIds = _state.conversations.byId[conversationId].messages;
const messagesInConversation = messageIds.map(messageId =>
2021-09-29 08:58:32 +00:00
_rootGetters['messageV2/messageById'](messageId)
);
const unreadAgentMessages = messagesInConversation.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;
},
2021-09-29 08:58:32 +00:00
getLastActiveConversation: (...getterArguments) => {
const [_state, _getters] = getterArguments;
const size = _getters.totalConversationsLength;
const conversation = _state.conversations.allIds[size - 1];
if (conversation) {
return conversation;
}
return undefined;
},
};