import { createSelector } from 'reselect' import * as moment from 'moment' import { IActivityGroup, IActivityGroupWithContext, IActivityGroupState, } from './interfaces' import { ActivityType } from '../activity/interfaces' import { IDomainObj } from '../settings/interfaces' import * as PopupSelectors from '../popup/selectors' import * as SettingsSelectors from '../settings/selectors' import { emailOnMuteList, emailOnDomainMuteList } from '../notification/helpers' import { filter, map, uniq, chain } from 'lodash' export const root = (state: any): IActivityGroupState => state.activityGroups export const isLoading = (state: any) => root(state).loading export const isLoaded = (state: any) => root(state).loaded export const rawActivityGroups = (state: any): IActivityGroup[] => root(state).activityGroups export const rawActivityGroupsByEmail = (state: any): IActivityGroup[] => root(state).activityGroupsByEmail export const messageActivityGroups = (state: any): IActivityGroup[] => filter(root(state).activityGroups, { type: ActivityType.MESSAGE }) export const conversationIds = createSelector([ messageActivityGroups, ], (messageActivityGroups: IActivityGroup[]) => { const listOfConversationIds = map(messageActivityGroups, 'conversationId') return uniq(listOfConversationIds) as number[] }) export const activityGroups = createSelector([ PopupSelectors.searchQuery, rawActivityGroups, rawActivityGroupsByEmail, ], ( searchQuery: string, activityGroups: IActivityGroup[], activityGroupsByEmail: IActivityGroup[], ) => { // reverse() mutates so we slice() to make a copy return !searchQuery ? activityGroups.slice().reverse() : activityGroupsByEmail.slice().reverse() }) export const activityGroupsWithContext = createSelector([ activityGroups, PopupSelectors.previousLastSeenAt, SettingsSelectors.notificationMuteList, SettingsSelectors.domainMuteList, ], ( activityGroups: IActivityGroup[], previousLastSeenAt: number, muteList: string[], domainMuteList: IDomainObj[], ) => { return chain(activityGroups) .filter((group: IActivityGroup) => !emailOnMuteList(group.email, muteList) && !emailOnDomainMuteList(group.email, domainMuteList)) .map((group): IActivityGroupWithContext => { return Object.assign({ date: moment(group.latestActivity).format('YYYY-MM-DD'), unseen: group.latestActivity > previousLastSeenAt, firstOfDate: true, firstOfEmail: true, }, group) }) .map((group, index, groups) => { const prevGroup = index > 0 && groups[index - 1] if (prevGroup && group.date === prevGroup.date) { group.firstOfDate = false } if (prevGroup && !group.firstOfDate && group.email === prevGroup.email) { group.firstOfEmail = false } return group }) .value() })