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(null) .cases([ actions.fetchActivitiesSuccess, actions.fetchActivitiesByEmailSuccess, ], () => false) .cases([ actions.fetchActivities, actions.fetchActivitiesPending, actions.fetchActivitiesByEmail, ], () => true) const loaded = reducerWithInitialState(false) .case(actions.fetchActivitiesSuccess, () => true) .case(AuthActions.logout, () => false) const activities = reducerWithInitialState([]) .cases([ actions.fetchActivitiesSuccess, actions.receiveActivities, ], (state, activities) => { const filtered = state.filter((activity) => { return !activities.find(a => a.id === activity.id) }) const combined = sortBy(filtered.concat(activities), 'at') if (combined.length > MAX_ACTIVITIES) { return combined.slice(combined.length - MAX_ACTIVITIES) } else { return combined } }) .case(AuthActions.logout, () => []) const activitiesByEmail = reducerWithInitialState([]) .case(actions.fetchActivitiesByEmailSuccess, (state, activities) => sortBy(activities, 'at')) .case(actions.receiveActivitiesByEmail, (state, activities) => { const filtered = state.filter((activity) => { return !activities.find(a => a.id === activity.id) }) const combined = sortBy(filtered.concat(activities), 'at') if (combined.length > MAX_ACTIVITIES) { return combined.slice(combined.length - MAX_ACTIVITIES) } else { return combined } }) .case(AuthActions.logout, () => []) export default combineReducers({ loading, loaded, activities, activitiesByEmail, })