UNPKG

redux-form

Version:

A higher order component decorator for forms using Redux and React

179 lines (138 loc) 5.92 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = createFields; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _react = require("react"); var _propTypes = _interopRequireDefault(require("prop-types")); var _invariant = _interopRequireDefault(require("invariant")); var _get = _interopRequireDefault(require("lodash/get")); var _ConnectedFields = _interopRequireDefault(require("./ConnectedFields")); var _shallowCompare = _interopRequireDefault(require("./util/shallowCompare")); var _plain = _interopRequireDefault(require("./structure/plain")); var _prefixName = _interopRequireDefault(require("./util/prefixName")); var _ReduxFormContext = require("./ReduxFormContext"); var _validateComponentProp = _interopRequireDefault(require("./util/validateComponentProp")); var validateNameProp = function validateNameProp(prop) { if (!prop) { return new Error('No "names" prop was specified <Fields/>'); } if (!Array.isArray(prop) && !prop._isFieldArray) { return new Error('Invalid prop "names" supplied to <Fields/>. Must be either an array of strings or the fields array generated by FieldArray.'); } }; var warnAndValidatePropType = _propTypes["default"].oneOfType([_propTypes["default"].func, _propTypes["default"].arrayOf(_propTypes["default"].func), _propTypes["default"].objectOf(_propTypes["default"].oneOfType([_propTypes["default"].func, _propTypes["default"].arrayOf(_propTypes["default"].func)]))]); var fieldsPropTypes = { component: _validateComponentProp["default"], format: _propTypes["default"].func, parse: _propTypes["default"].func, props: _propTypes["default"].object, forwardRef: _propTypes["default"].bool, validate: warnAndValidatePropType, warn: warnAndValidatePropType }; var getFieldWarnAndValidate = function getFieldWarnAndValidate(prop, name) { return Array.isArray(prop) || typeof prop === 'function' ? prop : (0, _get["default"])(prop, name, undefined); }; function createFields(structure) { var ConnectedFields = (0, _ConnectedFields["default"])(structure); var Fields = /*#__PURE__*/ function (_Component) { (0, _inheritsLoose2["default"])(Fields, _Component); function Fields(props) { var _this; _this = _Component.call(this, props) || this; if (!props._reduxForm) { throw new Error('Fields must be inside a component decorated with reduxForm()'); } var error = validateNameProp(props.names); if (error) { throw error; } return _this; } var _proto = Fields.prototype; _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps) { return (0, _shallowCompare["default"])(this, nextProps); }; _proto.componentDidMount = function componentDidMount() { this.registerFields(this.props.names); }; _proto.UNSAFE_componentWillReceiveProps = function UNSAFE_componentWillReceiveProps(nextProps) { if (!_plain["default"].deepEqual(this.props.names, nextProps.names)) { var props = this.props; var unregister = props._reduxForm.unregister; // unregister old name this.props.names.forEach(function (name) { return unregister((0, _prefixName["default"])(props, name)); }); // register new name this.registerFields(nextProps.names); } }; _proto.componentWillUnmount = function componentWillUnmount() { var props = this.props; var unregister = props._reduxForm.unregister; this.props.names.forEach(function (name) { return unregister((0, _prefixName["default"])(props, name)); }); }; _proto.registerFields = function registerFields(names) { var _this2 = this; var props = this.props; var register = props._reduxForm.register; names.forEach(function (name) { return register((0, _prefixName["default"])(props, name), 'Field', function () { return getFieldWarnAndValidate(_this2.props.validate, name); }, function () { return getFieldWarnAndValidate(_this2.props.warn, name); }); }); }; _proto.getRenderedComponent = function getRenderedComponent() { (0, _invariant["default"])(this.props.forwardRef, 'If you want to access getRenderedComponent(), ' + 'you must specify a forwardRef prop to Fields'); return this.refs.connected.getRenderedComponent(); }; _proto.render = function render() { var props = this.props; return (0, _react.createElement)(ConnectedFields, (0, _extends2["default"])({}, this.props, { names: this.props.names.map(function (name) { return (0, _prefixName["default"])(props, name); }), ref: 'connected' })); }; (0, _createClass2["default"])(Fields, [{ key: "names", get: function get() { var props = this.props; return this.props.names.map(function (name) { return (0, _prefixName["default"])(props, name); }); } }, { key: "dirty", get: function get() { return this.refs.connected.isDirty(); } }, { key: "pristine", get: function get() { return !this.dirty; } }, { key: "values", get: function get() { return this.refs.connected && this.refs.connected.getValues(); } }]); return Fields; }(_react.Component); Fields.propTypes = (0, _extends2["default"])({ names: function names(props, propName) { return validateNameProp(props[propName]); } }, fieldsPropTypes); return (0, _ReduxFormContext.withReduxForm)(Fields); }