import { createSelector } from 'reselect' import { map, groupBy, mapValues, maxBy, get, filter, includes, reduce } from 'lodash' import { messageActivityGroups } from '../activityGroups/selectors' import * as PopupSelectors from '../popup/selectors' import { userId } from '../auth/selectors' import { IActivityGroup } from '../activityGroups/interfaces' import { IConversation, IMessagesById } from './interfaces' const root = (state: any) => state.conversations export const iconStatus = (state: any) => root(state).conversationIconStatus export const latestMessageActivityGroups = createSelector([ messageActivityGroups, ], (messageActivityGroups: IActivityGroup[]) => { const messageActivitiesGroupedByConversationId = groupBy(messageActivityGroups, 'conversationId') return mapValues(messageActivitiesGroupedByConversationId, data => maxBy(data, 'latestActivity')) }) export const conversations = (state: any) => root(state).conversations export const openAndPendingConversations = (state: any) => { const currentParticipants = participants(state) const currentUserId = userId(state) return filter(conversations(state), (conversation: IConversation) => { return conversation.status !== 'CLOSED' && includes(get(currentParticipants, [conversation.id, 'participantIds']), currentUserId) }) } export const messagesByConversationId = (state: any): IMessagesById => root(state).messagesForConversation export const getUnreadMessagesForConversationId = (id: number) => (state: any) => { const messages = messagesByConversationId(state)[id] const readReceiptsForConvo = readReceipts(state)[id] return filter(messages, message => !(get(readReceiptsForConvo, message.id))) } export const conversationIds = createSelector([ conversations, ], (conversations: IConversation[]) => map(conversations, 'id')) export const participants = (state: any) => root(state).participants export const readReceipts = (state: any) => root(state).messageReadReceipts export const endUserIds = (state: any) => map(conversations(state), 'endUserId') export const conversationIconStatus = createSelector([ iconStatus, PopupSelectors.searchFocused, openAndPendingConversations, ], ( iconStatus: boolean, searchFocused: boolean, openAndPendingConversations: IConversation[], ) => { return openAndPendingConversations.length > 0 && (searchFocused || iconStatus) }) export const numberOfUnreadMessagesByConversationId = createSelector([ readReceipts, ], readReceipts => mapValues(readReceipts, receipts => reduce(receipts, (acc, receipt) => { return receipt ? acc : acc + 1 }, 0)))