import { get, find } from 'lodash' import { createSelector } from 'reselect' import * as ActivityGroupSelectors from '../activityGroups/selectors' import * as PopupSelectors from '../popup/selectors' import { ActivityType } from '../activity/interfaces' import { IDomainObj } from '../settings/interfaces' import { IActivityGroup, INotificationSettingsToActivityType } from '../activityGroups/interfaces' import { IConversation, IMessagesById, IMessageReadReceipts, IMessage } from '../conversations/interfaces' import * as SettingsSelectors from '../settings/selectors' import { emailOnMuteList, emailOnDomainMuteList } from './helpers' import { openAndPendingConversations, messagesByConversationId, readReceipts } from '../conversations/selectors' export const unseenActivityCount = createSelector( [ ActivityGroupSelectors.activityGroups, PopupSelectors.lastSeenAt, openAndPendingConversations, messagesByConversationId, readReceipts, SettingsSelectors.notificationMuteList, SettingsSelectors.domainMuteList, SettingsSelectors.notificationVisitedSite, SettingsSelectors.notificationClickedEmailLink, SettingsSelectors.notificationOpenedEmail, ], ( activityGroups: IActivityGroup[], lastSeenAt: number, openAndPendingConversations: IConversation[], messagesByConversationId: IMessagesById, readReceipts: IMessageReadReceipts, mute: string[], domainMuteList: IDomainObj[], notificationVisitedSite: boolean, notificationClickedEmailLink: boolean, notificationOpenedEmail: boolean, ) => { const conversationsNotificationCount = openAndPendingConversations && openAndPendingConversations .map((conversation) => { const messagesForConversation = get(messagesByConversationId, conversation.id) as IMessage[] const messageReceiptsForConversation = get(readReceipts, conversation.id) as { [messageId: string]: boolean } const hasUnreadMessages = find( messagesForConversation, message => message.updatedAt > lastSeenAt && !get(messageReceiptsForConversation, message.id) ) return hasUnreadMessages ? 1 : 0 }) .reduce((acc, messagesLength) => acc + messagesLength, 0) const NotificationSettingsToActivityType: INotificationSettingsToActivityType = { [ActivityType.PAGE_VIEW]: notificationVisitedSite, [ActivityType.CLICK]: notificationClickedEmailLink, [ActivityType.OPEN]: notificationOpenedEmail, } const activityGroupsNotificationCount = activityGroups .filter(group => !emailOnMuteList(group.email, mute)) .filter(group => !emailOnDomainMuteList(group.email, domainMuteList)) .filter(group => group.latestActivity > lastSeenAt) .filter(group => NotificationSettingsToActivityType[group.type]) .reduce((acc, group) => { return acc + group.activity.filter(activity => activity.at > lastSeenAt).length }, 0) return conversationsNotificationCount + activityGroupsNotificationCount }, )