redux-form
Version:
A higher order component decorator for forms using Redux and React
134 lines (101 loc) • 4.94 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports["default"] = createValues;
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _mapValues2 = _interopRequireDefault(require("lodash/mapValues"));
var _isEqual2 = _interopRequireDefault(require("lodash/isEqual"));
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
var _react = _interopRequireDefault(require("react"));
var _reactRedux = require("react-redux");
var _prefixName = _interopRequireDefault(require("./util/prefixName"));
var _ReduxFormContext = require("./ReduxFormContext");
function createValues(_ref) {
var getIn = _ref.getIn;
return function (firstArg) {
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
// create a class that reads current form name and creates a selector
// return
return function (Component) {
var FormValues =
/*#__PURE__*/
function (_React$Component) {
(0, _inheritsLoose2["default"])(FormValues, _React$Component);
function FormValues(props) {
var _this;
_this = _React$Component.call(this, props) || this;
if (!props._reduxForm) {
throw new Error('formValues() must be used inside a React tree decorated with reduxForm()');
}
_this.updateComponent(props);
return _this;
}
var _proto = FormValues.prototype;
_proto.UNSAFE_componentWillReceiveProps = function UNSAFE_componentWillReceiveProps(props) {
if (typeof firstArg === 'function') {
this.updateComponent(props);
}
};
_proto.render = function render() {
var Component = this.Component;
return _react["default"].createElement(Component // so that the connected component updates props when sectionPrefix has changed
, (0, _extends2["default"])({
sectionPrefix: this.props._reduxForm.sectionPrefix
}, this.props));
};
_proto.updateComponent = function updateComponent(props) {
var valuesMap;
var resolvedFirstArg = typeof firstArg === 'function' ? firstArg(props) : firstArg;
if (typeof resolvedFirstArg === 'string') {
var _rest$reduce;
valuesMap = rest.reduce(function (result, k) {
result[k] = k;
return result;
}, (_rest$reduce = {}, _rest$reduce[resolvedFirstArg] = resolvedFirstArg, _rest$reduce));
} else {
valuesMap = resolvedFirstArg;
}
if ((0, _isEmpty2["default"])(valuesMap)) {
// maybe that empty valuesMap is ok if firstArg is a function?
// if this is the case, we probably should set this.Component = Component
throw new Error('formValues(): You must specify values to get as formValues(name1, name2, ...) or formValues({propName1: propPath1, ...}) or formValues((props) => name) or formValues((props) => ({propName1: propPath1, ...}))');
}
if ((0, _isEqual2["default"])(valuesMap, this._valuesMap)) {
// no change in valuesMap
return;
}
this._valuesMap = valuesMap;
this.setComponent();
};
_proto.setComponent = function setComponent() {
var _this2 = this;
var formValuesSelector = function formValuesSelector(_, _ref2) {
var sectionPrefix = _ref2.sectionPrefix;
// Yes, we're only using connect() for listening to updates.
// The second argument needs to be there so that connect calls
// the selector when props change
var getValues = _this2.props._reduxForm.getValues;
var values = getValues();
return (0, _mapValues2["default"])(_this2._valuesMap, function (path) {
return getIn(values, (0, _prefixName["default"])(_this2.props, path));
});
};
this.Component = (0, _reactRedux.connect)(formValuesSelector, function () {
return {};
} // ignore dispatch
)(function (_ref3) {
var sectionPrefix = _ref3.sectionPrefix,
otherProps = (0, _objectWithoutPropertiesLoose2["default"])(_ref3, ["sectionPrefix"]);
return _react["default"].createElement(Component, otherProps);
});
};
return FormValues;
}(_react["default"].Component);
return (0, _ReduxFormContext.withReduxForm)(FormValues);
};
};
}