import { reducerWithInitialState } from 'typescript-fsa-reducers' import { combineReducers } from 'redux' import { sortBy } from 'lodash' import * as actions from './actions' import * as AuthActions from '../auth/actions' const MAX_ACTIVITIES = 200 const loading = reducerWithInitialState(false) .cases([ actions.fetchActivityGroupsSuccess, actions.fetchActivityGroupsByEmailSuccess, ], () => false) .cases([ actions.fetchActivityGroupsPending, actions.fetchActivityGroupsByEmailPending, ], () => true) const loaded = reducerWithInitialState(false) .case(actions.fetchActivityGroupsSuccess, () => true) .case(AuthActions.logout, () => false) const activityGroups = reducerWithInitialState([]) .cases([ actions.fetchActivityGroupsSuccess, actions.receiveActivityGroups, ], (state, activityGroups) => { const filtered = state.filter((activityGroup) => { return !activityGroups.find(a => a.id === activityGroup.id) }) const combined = sortBy(filtered.concat(activityGroups), 'latestActivity') if (combined.length > MAX_ACTIVITIES) { return combined.slice(combined.length - MAX_ACTIVITIES) } else { return combined } }) .case(AuthActions.logout, () => []) const activityGroupsByEmail = reducerWithInitialState([]) .case(actions.fetchActivityGroupsByEmailSuccess, (state, activityGroups) => sortBy(activityGroups, 'latestActivity')) .case(actions.receiveActivityGroupsByEmail, (state, activityGroups) => { const filtered = state.filter((activityGroup) => { return !activityGroups.find(a => a.id === activityGroup.id) }) const combined = sortBy(filtered.concat(activityGroups), 'latestActivity') if (combined.length > MAX_ACTIVITIES) { return combined.slice(combined.length - MAX_ACTIVITIES) } else { return combined } }) .case(AuthActions.logout, () => []) export default combineReducers({ loading, loaded, activityGroups, activityGroupsByEmail, })