redux-undo-actions
Version:
Redux middleware for undo/redo actions by dispatching reverting action
87 lines (69 loc) • 4.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.undoActions = exports.undoActionsMiddleware = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _reducers = require('./reducers');
var _reducers2 = _interopRequireDefault(_reducers);
var _types = require('./types');
var types = _interopRequireWildcard(_types);
var _actions = require('./actions');
var undoActions = _interopRequireWildcard(_actions);
var _lodash = require('lodash');
var _ = _interopRequireWildcard(_lodash);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
var dispatchActions = function dispatchActions(dispatch) {
return function (action) {
if (typeof action === 'function') {
return action(dispatchActions(dispatch));
} else {
return dispatch(_extends({}, action, { undoSkipAction: true }));
}
};
};
var undoActionsMiddleware = function undoActionsMiddleware(config) {
return function (_ref) {
var dispatch = _ref.dispatch,
getState = _ref.getState;
return function (next) {
return async function (action) {
var _getState = getState(),
undoHistory = _getState.undoHistory,
restState = _objectWithoutProperties(_getState, ['undoHistory']);
if (action.undoSkipAction) {
return next(_.omit(action, 'undoSkipAction'));
}
if (action.type in config.revertibleActions) {
dispatch(undoActions.addToHistory(action, restState));
return dispatchActions(dispatch)(action);
} else if (action.type === types.UNDO && (0, _reducers.canUndo)(undoHistory)) {
var _getPastHistoryItem = (0, _reducers.getPastHistoryItem)(undoHistory, action.index),
pastAction = _getPastHistoryItem.action,
pastState = _getPastHistoryItem.state;
var revertingAction = config.revertibleActions[pastAction.type];
dispatch(undoActions.historyUndo(action.index));
if (revertingAction.actionCreator && revertingAction.mapStateToArgs) {
var _revertingAction = revertingAction,
actionCreator = _revertingAction.actionCreator,
mapStateToArgs = _revertingAction.mapStateToArgs;
var args = mapStateToArgs(pastAction, pastState);
revertingAction = actionCreator(args);
}
return dispatchActions(dispatch)(revertingAction);
} else if (action.type === types.REDO && (0, _reducers.canRedo)(undoHistory)) {
var _getFutureHistoryItem = (0, _reducers.getFutureHistoryItem)(undoHistory, action.index),
futureAction = _getFutureHistoryItem.action;
dispatch(undoActions.historyRedo(action.index));
return dispatchActions(dispatch)(futureAction);
}
return next(action);
};
};
};
};
exports.undoActionsMiddleware = undoActionsMiddleware;
exports.undoActions = undoActions;
exports.default = _reducers2.default;