2021-08-26 14:49:52 +00:00
|
|
|
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 = {
|
2021-09-20 04:43:39 +00:00
|
|
|
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,
|
2021-09-20 04:43:39 +00:00
|
|
|
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,
|
2021-09-20 04:43:39 +00:00
|
|
|
firstMessageIn: (...getterArguments) => conversationId => {
|
2021-09-29 08:58:32 +00:00
|
|
|
const [_state, , , _rootGetters] = getterArguments;
|
2021-09-20 04:43:39 +00:00
|
|
|
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);
|
2021-09-20 04:43:39 +00:00
|
|
|
return lastMessage;
|
2021-08-26 14:49:52 +00:00
|
|
|
}
|
|
|
|
return {};
|
|
|
|
},
|
2021-09-20 04:43:39 +00:00
|
|
|
groupByMessagesIn: (...getterArguments) => conversationId => {
|
2021-09-29 08:58:32 +00:00
|
|
|
const [_state, , , _rootGetters] = getterArguments;
|
2021-09-20 04:43:39 +00:00
|
|
|
const messageIds = _state.conversations.byId[conversationId].messages;
|
|
|
|
const messagesInConversation = messageIds.map(messageId =>
|
2021-09-29 08:58:32 +00:00
|
|
|
_rootGetters['messageV2/messageById'](messageId)
|
2021-09-20 04:43:39 +00:00
|
|
|
);
|
2021-09-20 15:21:48 +00:00
|
|
|
const messagesGroupedByDate = groupBy(messagesInConversation, message =>
|
2021-09-20 04:43:39 +00:00
|
|
|
formatUnixDate(message.created_at)
|
2021-08-26 14:49:52 +00:00
|
|
|
);
|
2021-09-20 15:21:48 +00:00
|
|
|
return Object.keys(messagesGroupedByDate).map(date => ({
|
2021-08-26 14:49:52 +00:00
|
|
|
date,
|
2021-09-20 15:21:48 +00:00
|
|
|
messages: groupConversationBySender(messagesGroupedByDate[date]),
|
2021-08-26 14:49:52 +00:00
|
|
|
}));
|
|
|
|
},
|
2021-09-29 08:58:32 +00:00
|
|
|
isFetchingMessages: _state => conversationId => {
|
|
|
|
const hasConversation = _state.conversations.uiFlags.byId[conversationId];
|
|
|
|
return hasConversation ? hasConversation.isFetching : false;
|
|
|
|
},
|
2021-09-20 15:21:48 +00:00
|
|
|
allMessagesCountIn: _state => conversationId => {
|
2021-09-29 08:58:32 +00:00
|
|
|
const conversation = _state.conversations.byId[conversationId];
|
|
|
|
return conversation ? conversation.messages.length : 0;
|
2021-08-26 14:49:52 +00:00
|
|
|
},
|
2021-09-20 15:21:48 +00:00
|
|
|
unreadMessageCountIn: (...getterArguments) => conversationId => {
|
2021-09-29 08:58:32 +00:00
|
|
|
const [_state, , , _rootGetters] = getterArguments;
|
2021-09-20 15:21:48 +00:00
|
|
|
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)
|
2021-09-20 15:21:48 +00:00
|
|
|
);
|
|
|
|
const { meta: { userLastSeenAt } = {} } = conversation;
|
|
|
|
const count = messagesInConversation.filter(message => {
|
|
|
|
const { created_at: createdAt, message_type: messageType } = message;
|
2021-08-26 14:49:52 +00:00
|
|
|
const isOutGoing = messageType === MESSAGE_TYPE.OUTGOING;
|
|
|
|
const hasNotSeen = userLastSeenAt
|
|
|
|
? createdAt * 1000 > userLastSeenAt * 1000
|
|
|
|
: true;
|
|
|
|
return hasNotSeen && isOutGoing;
|
|
|
|
}).length;
|
|
|
|
return count;
|
|
|
|
},
|
2021-09-20 15:21:48 +00:00
|
|
|
getUnreadMessagesIn: (...getterArguments) => conversationId => {
|
2021-09-29 08:58:32 +00:00
|
|
|
const [_state, _getters, _rootGetters] = getterArguments;
|
2021-09-20 15:21:48 +00:00
|
|
|
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)
|
2021-09-20 15:21:48 +00:00
|
|
|
);
|
|
|
|
const unreadAgentMessages = messagesInConversation.filter(message => {
|
2021-08-26 14:49:52 +00:00
|
|
|
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;
|
|
|
|
},
|
2021-08-26 14:49:52 +00:00
|
|
|
};
|