@coorpacademy/progression-engine
Version:
94 lines • 2.52 kB
JavaScript
import _isEmpty from "lodash/fp/isEmpty";
import _reduce from "lodash/fp/reduce";
import _pipe from "lodash/fp/pipe";
import _map from "lodash/fp/map";
import _update from "lodash/fp/update";
import allAnswers from './reducers/all-answers';
import content from './reducers/content';
import pendingSlides from './reducers/pending-slides';
import hasViewedAResourceAtThisStep from './reducers/has-viewed-a-resource-at-this-step';
import isCorrect from './reducers/is-correct';
import lives from './reducers/lives';
import livesDisabled from './reducers/lives-disabled';
import nextContent from './reducers/next-content';
import remainingLifeRequests from './reducers/remaining-life-requests';
import requestedClues from './reducers/requested-clues';
import slides from './reducers/slides';
import stars from './reducers/stars';
import step from './reducers/step';
import validate from './reducers/validate';
import viewedResources from './reducers/viewed-resources';
import variables from './reducers/variables';
function combineReducers(fnMap) {
// eslint-disable-next-line flowtype/require-return-type
const fns = _map(({
fn,
key
}) => {
return (config, action) => state => {
if (!key) return fn(config)(state, action);
const newState = _update(key, value => fn(config)(value, action, state), state);
return newState;
};
}, fnMap);
return config => {
return (state, action) => {
validate(config)(state, action);
return _pipe(..._map(fn => fn(config, action), fns))(state);
};
};
}
const reduceAction = combineReducers([{
key: 'livesDisabled',
fn: livesDisabled
}, {
key: 'isCorrect',
fn: isCorrect
}, {
key: 'slides',
fn: slides
}, {
key: 'lives',
fn: lives
}, {
key: 'step',
fn: step
}, {
key: 'stars',
fn: stars
}, {
key: 'requestedClues',
fn: requestedClues
}, {
key: 'viewedResources',
fn: viewedResources
}, {
key: 'remainingLifeRequests',
fn: remainingLifeRequests
}, {
key: 'hasViewedAResourceAtThisStep',
fn: hasViewedAResourceAtThisStep
}, {
key: 'content',
fn: content
}, {
key: 'nextContent',
fn: nextContent
}, {
key: 'allAnswers',
fn: allAnswers
}, {
key: 'pendingSlides',
fn: pendingSlides
}, {
fn: variables
}]);
export default function updateState(config, state, actions) {
if (_isEmpty(actions)) {
return _reduce(reduceAction(config), state, [{
type: 'init'
}]);
}
return _reduce(reduceAction(config), state, actions);
}
//# sourceMappingURL=update-state.js.map