/** * Created by jimsugg on 9/26/16. */ import { combineReducers } from 'redux'; import { createSelector } from 'reselect'; import { BaDmId, TransitionType } from '../baDmDataTypes'; import { DmTransitionState } from '../baDmInterfaces'; import { DmInternal } from "../baDmClasses"; import { TransitionAction } from '../baDmActions' import { NEW_SIGN, ADD_TRANSITION, UPDATE_TRANSITION, DELETE_TRANSITION } from "../baDmActions"; var _ = require('lodash/omit'); type DmState = DmInternal.DmState; type DmTransitionMap = DmInternal.DmMap; // Return a simple object conforming to DmTransitionState const createTransitionState = (id: BaDmId, name: string, eventId: BaDmId, targetMediaStateId: BaDmId, transitionType: TransitionType, conditionId: BaDmId) => ({ id: id, name: name, eventId: eventId, targetMediaStateId: targetMediaStateId, transitionType: transitionType, conditionId: conditionId }); const transitionsById = (state : DmTransitionMap = {}, {type, id, payload} : TransitionAction) => { switch (type) { case NEW_SIGN : return {}; case ADD_TRANSITION : let {name, eventId, targetMediaStateId, type : transitionType, conditionId} = payload; return Object.assign({}, state, {[id]: createTransitionState(id, name, eventId, targetMediaStateId, transitionType, conditionId)}); case UPDATE_TRANSITION : let updatedTransition = Object.assign({}, state[id], payload); return Object.assign({}, state, {[id]: updatedTransition}); case DELETE_TRANSITION : return _.omit(state, id); } return state; }; const transitionReducer = transitionsById; export default transitionReducer; // Selectors export const getTransitionById = (state: DmState, props: any) => { let transitionState = state.transitions[props.id]; return transitionState ? new DmInternal.Transition(transitionState) : undefined; } const getTransitionsById = (state: DmState) => state.transitions; const getTransitionIdProp = (state: DmState, props : any) : string => (props.id); export const getTransitionsForEvent = createSelector ( getTransitionsById, getTransitionIdProp, (transitions, transitionId) => { return Object.keys(transitions).filter((id, index, idArray): boolean => transitions[id].id === transitionId); } );