/** * Created by jimsugg on 9/20/16. */ import { combineReducers } from 'redux'; import { createSelector } from 'reselect'; import { BaDmId, EventType } from '../baDmDataTypes'; import { DmEventData, DmEventState } from '../baDmInterfaces'; import { DmInternal } from "../baDmClasses"; import { EventAction } from '../baDmActions' import { NEW_SIGN, ADD_EVENT, UPDATE_EVENT, DELETE_EVENT } from "../baDmActions"; var _ = require('lodash/omit'); type DmState = DmInternal.DmState; type DmEventMap = DmInternal.DmMap; // Return a simple object conforming to DmEventState const createEventState = (id: BaDmId, name: string, type: EventType, mediaStateId: BaDmId, data: DmEventData) => ({ id: id, name: name, type: type, mediaStateId: mediaStateId, data: data }); const eventsById = (state : DmEventMap = {}, {type, id, payload} : EventAction) => { switch (type) { case NEW_SIGN : return {}; case ADD_EVENT : let {name, type, mediaStateId, data} = payload; return Object.assign({}, state, {[id]: createEventState(id, name, type, mediaStateId, data)}); case UPDATE_EVENT : let updatedEvent = Object.assign({}, state[id], payload); return Object.assign({}, state, {[id]: updatedEvent}); case DELETE_EVENT : return _.omit(state, id); } return state; }; const eventReducer = eventsById; export default eventReducer; // Selectors export const getEventById = (state: DmState, props: any) => { let eventState = state.events[props.id]; return eventState ? new DmInternal.BsEvent(eventState) : undefined; } const getEventsById = (state: DmState) => state.events; const getEventIdProp = (state: DmState, props : any) : string => (props.id); export const getEventsForMediaState = createSelector ( getEventsById, getEventIdProp, (events, eventId) => { return Object.keys(events).filter((id, index, idArray): boolean => events[id].id === eventId); } );