react-mapfilter
Version:
A React Component for viewing and filtering GeoJSON
92 lines (80 loc) • 3.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _objectAssign = require('object-assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Private action type for controlled-store
var ActionTypes = {
UPDATE: '@@controlled/UPDATE'
/**
* A Redux store enhancer that allows a redux app to operate as a controlled
* component, selectively moving state out of the app and into a container.
*
* Enhances the store with an additional method `controlledUpdate()` that will
* override the redux store state. Any keys on the state object passed to
* `controlledUpdate()` will be "locked" in that any actions in the app will no
* longer directly update that part of the state, but instead call the `onChange`
* function passed to the constructor, with the state key that has been updated
* and the new value.
*
* @param {Function} onChange
* @param {Object} stateOverride
* @return {Function} Redux Store Enhancer
*/
};
exports.default = function (onChange) {
var initialStateOverride = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return function (createStore) {
// These properties of the app state are now controlled
var controlledProps = (0, _keys2.default)(initialStateOverride);
return function (reducer, initialState, enhancer) {
initialState = (0, _objectAssign2.default)({}, initialState, initialStateOverride);
// Create the store with an enhanced reducer
var store = createStore(controlledReducer, initialState, enhancer);
// Enhance the store with an additional method `controlledUpdate()`
return (0, _objectAssign2.default)({}, store, {
controlledUpdate: controlledUpdate
});
function controlledReducer(state, action) {
// Controlled updates skip app reducers and override the state
if (action.type === ActionTypes.UPDATE) {
return (0, _objectAssign2.default)({}, state, action.payload);
}
var hasChanged = false;
var newState = reducer(state, action);
(0, _keys2.default)(newState).forEach(function (key) {
if (newState[key] === state[key]) return;
var value = newState[key];
process.nextTick(function () {
return onChange(key, value);
});
if (controlledProps.indexOf(key) > -1) {
// If any controlled props of the state are updated, we hide the
// initial change in state from the redux store and instead
// call the `onChange` function with the key that has been updated
// and the new value. Needs to run on nextTick to avoid `controlledUpdate()`
// being called in the same tick and resulting in a `store.dispatch()`
// inside this reducer.
newState[key] = state[key];
} else {
// Unless an uncontrolled prop has been changed, we'll just return the existing state
hasChanged = true;
}
});
return hasChanged ? newState : state;
}
function controlledUpdate(stateOverride) {
controlledProps = (0, _keys2.default)(stateOverride);
store.dispatch({
type: ActionTypes.UPDATE,
payload: stateOverride
});
}
};
};
};
//# sourceMappingURL=controlled_store.js.map