import { popularTargetNames } from 'Components/TargetSelection' import computeThemeColours from 'Components/themeColours' import { defaultTo, without } from 'ramda' import reduceReducers from 'reduce-reducers' import { combineReducers } from 'redux' import { reducer as formReducer } from 'redux-form' import storageReducer from '../storage/reducer' import defaultLang from '../i18n' function themeColours(state = computeThemeColours(), { type, colour }) { if (type == 'CHANGE_THEME_COLOUR') return computeThemeColours(colour) else return state } function explainedVariable(state = null, { type, variableName = null }) { switch (type) { case 'EXPLAIN_VARIABLE': return variableName default: return state } } function currentExample(state = null, { type, situation, name, dottedName }) { switch (type) { case 'SET_EXAMPLE': return name != null ? { name, situation, dottedName } : null default: return state } } function conversationStarted(state = false, { type }) { switch (type) { case 'START_CONVERSATION': return true case 'RESET_SIMULATION': return false default: return state } } function activeTargetInput(state = null, { type, name }) { switch (type) { case 'SET_ACTIVE_TARGET_INPUT': return name case 'RESET_SIMULATION': return null default: return state } } function lang(state = defaultLang, { type, lang }) { switch (type) { case 'SWITCH_LANG': return lang default: return state } } function conversationSteps( state = { foldedSteps: [], currentQuestion: null }, { type, name, step } ) { if (type === 'RESET_SIMULATION') return { foldedSteps: [], unfolded: null } if (type !== 'STEP_ACTION') return state if (name === 'fold') return { foldedSteps: [...state.foldedSteps, step], unfoldedStep: null } if (name === 'unfold') { // if a step had already been unfolded, bring it back ! return { foldedSteps: [ ...without([step], state.foldedSteps), ...(state.unfoldedStep ? [state.unfoldedStep] : []) ], unfoldedStep: step } } } export default reduceReducers( storageReducer, combineReducers({ sessionId: defaultTo(Math.floor(Math.random() * 1000000000000) + ''), // this is handled by redux-form, pas touche ! form: formReducer, conversationSteps, lang, targetNames: defaultTo(popularTargetNames), iframe: defaultTo(false), themeColours, explainedVariable, previousSimulation: defaultTo(null), currentExample, conversationStarted, activeTargetInput }) )