UNPKG

9.47 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports["default"] = void 0;
7
8var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
10var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
12var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
13
14var _react = _interopRequireDefault(require("react"));
15
16var _propTypes = _interopRequireDefault(require("prop-types"));
17
18var _reactRedux = require("react-redux");
19
20var _createFieldProps2 = _interopRequireDefault(require("./createFieldProps"));
21
22var _plain = _interopRequireDefault(require("./structure/plain"));
23
24var _onChangeValue = _interopRequireDefault(require("./events/onChangeValue"));
25
26var _validateComponentProp = _interopRequireDefault(require("./util/validateComponentProp"));
27
28var propsToNotUpdateFor = ['_reduxForm'];
29
30var createConnectedFields = function createConnectedFields(structure) {
31 var deepEqual = structure.deepEqual,
32 getIn = structure.getIn,
33 size = structure.size;
34
35 var getSyncError = function getSyncError(syncErrors, name) {
36 // Because the error for this field might not be at a level in the error structure where
37 // it can be set directly, it might need to be unwrapped from the _error property
38 return _plain["default"].getIn(syncErrors, name + "._error") || _plain["default"].getIn(syncErrors, name);
39 };
40
41 var getSyncWarning = function getSyncWarning(syncWarnings, name) {
42 var warning = getIn(syncWarnings, name); // Because the warning for this field might not be at a level in the warning structure where
43 // it can be set directly, it might need to be unwrapped from the _warning property
44
45 return warning && warning._warning ? warning._warning : warning;
46 };
47
48 var ConnectedFields =
49 /*#__PURE__*/
50 function (_React$Component) {
51 (0, _inheritsLoose2["default"])(ConnectedFields, _React$Component);
52
53 function ConnectedFields(props) {
54 var _this;
55
56 _this = _React$Component.call(this, props) || this;
57 _this.onChangeFns = {};
58 _this.onFocusFns = {};
59 _this.onBlurFns = {};
60 _this.ref = _react["default"].createRef();
61
62 _this.prepareEventHandlers = function (_ref) {
63 var names = _ref.names;
64 return names.forEach(function (name) {
65 _this.onChangeFns[name] = function (event) {
66 return _this.handleChange(name, event);
67 };
68
69 _this.onFocusFns[name] = function () {
70 return _this.handleFocus(name);
71 };
72
73 _this.onBlurFns[name] = function (event) {
74 return _this.handleBlur(name, event);
75 };
76 });
77 };
78
79 _this.handleChange = function (name, event) {
80 var _this$props = _this.props,
81 dispatch = _this$props.dispatch,
82 parse = _this$props.parse,
83 _reduxForm = _this$props._reduxForm;
84 var value = (0, _onChangeValue["default"])(event, {
85 name: name,
86 parse: parse
87 });
88 dispatch(_reduxForm.change(name, value)); // call post-change callback
89
90 if (_reduxForm.asyncValidate) {
91 _reduxForm.asyncValidate(name, value, 'change');
92 }
93 };
94
95 _this.handleFocus = function (name) {
96 var _this$props2 = _this.props,
97 dispatch = _this$props2.dispatch,
98 _reduxForm = _this$props2._reduxForm;
99 dispatch(_reduxForm.focus(name));
100 };
101
102 _this.handleBlur = function (name, event) {
103 var _this$props3 = _this.props,
104 dispatch = _this$props3.dispatch,
105 parse = _this$props3.parse,
106 _reduxForm = _this$props3._reduxForm;
107 var value = (0, _onChangeValue["default"])(event, {
108 name: name,
109 parse: parse
110 }); // dispatch blur action
111
112 dispatch(_reduxForm.blur(name, value)); // call post-blur callback
113
114 if (_reduxForm.asyncValidate) {
115 _reduxForm.asyncValidate(name, value, 'blur');
116 }
117 };
118
119 _this.prepareEventHandlers(props);
120
121 return _this;
122 }
123
124 var _proto = ConnectedFields.prototype;
125
126 _proto.UNSAFE_componentWillReceiveProps = function UNSAFE_componentWillReceiveProps(nextProps) {
127 var _this2 = this;
128
129 if (this.props.names !== nextProps.names && (size(this.props.names) !== size(nextProps.names) || nextProps.names.some(function (nextName) {
130 return !_this2.props._fields[nextName];
131 }))) {
132 // names has changed. The cached event handlers need to be updated
133 this.prepareEventHandlers(nextProps);
134 }
135 };
136
137 _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {
138 var _this3 = this;
139
140 var nextPropsKeys = Object.keys(nextProps);
141 var thisPropsKeys = Object.keys(this.props); // if we have children, we MUST update in React 16
142 // https://twitter.com/erikras/status/915866544558788608
143
144 return !!(this.props.children || nextProps.children || nextPropsKeys.length !== thisPropsKeys.length || nextPropsKeys.some(function (prop) {
145 return !~propsToNotUpdateFor.indexOf(prop) && !deepEqual(_this3.props[prop], nextProps[prop]);
146 }));
147 };
148
149 _proto.isDirty = function isDirty() {
150 var _fields = this.props._fields;
151 return Object.keys(_fields).some(function (name) {
152 return _fields[name].dirty;
153 });
154 };
155
156 _proto.getValues = function getValues() {
157 var _fields = this.props._fields;
158 return Object.keys(_fields).reduce(function (accumulator, name) {
159 return _plain["default"].setIn(accumulator, name, _fields[name].value);
160 }, {});
161 };
162
163 _proto.getRenderedComponent = function getRenderedComponent() {
164 return this.ref.current;
165 };
166
167 _proto.render = function render() {
168 var _this4 = this;
169
170 var _this$props4 = this.props,
171 component = _this$props4.component,
172 forwardRef = _this$props4.forwardRef,
173 _fields = _this$props4._fields,
174 _reduxForm = _this$props4._reduxForm,
175 rest = (0, _objectWithoutPropertiesLoose2["default"])(_this$props4, ["component", "forwardRef", "_fields", "_reduxForm"]);
176 var sectionPrefix = _reduxForm.sectionPrefix,
177 form = _reduxForm.form;
178
179 var _Object$keys$reduce = Object.keys(_fields).reduce(function (accumulator, name) {
180 var connectedProps = _fields[name];
181
182 var _createFieldProps = (0, _createFieldProps2["default"])(structure, name, (0, _extends2["default"])({}, connectedProps, {}, rest, {
183 form: form,
184 onBlur: _this4.onBlurFns[name],
185 onChange: _this4.onChangeFns[name],
186 onFocus: _this4.onFocusFns[name]
187 })),
188 custom = _createFieldProps.custom,
189 fieldProps = (0, _objectWithoutPropertiesLoose2["default"])(_createFieldProps, ["custom"]);
190
191 accumulator.custom = custom;
192 var fieldName = sectionPrefix ? name.replace(sectionPrefix + ".", '') : name;
193 return _plain["default"].setIn(accumulator, fieldName, fieldProps);
194 }, {}),
195 custom = _Object$keys$reduce.custom,
196 props = (0, _objectWithoutPropertiesLoose2["default"])(_Object$keys$reduce, ["custom"]);
197
198 if (forwardRef) {
199 props.ref = this.ref;
200 }
201
202 return _react["default"].createElement(component, (0, _extends2["default"])({}, props, {}, custom));
203 };
204
205 return ConnectedFields;
206 }(_react["default"].Component);
207
208 ConnectedFields.propTypes = {
209 component: _validateComponentProp["default"],
210 _fields: _propTypes["default"].object.isRequired,
211 props: _propTypes["default"].object
212 };
213 var connector = (0, _reactRedux.connect)(function (state, ownProps) {
214 var names = ownProps.names,
215 _ownProps$_reduxForm = ownProps._reduxForm,
216 initialValues = _ownProps$_reduxForm.initialValues,
217 getFormState = _ownProps$_reduxForm.getFormState;
218 var formState = getFormState(state);
219 return {
220 _fields: names.reduce(function (accumulator, name) {
221 var initialState = getIn(formState, "initial." + name);
222 var initial = initialState !== undefined ? initialState : initialValues && getIn(initialValues, name);
223 var value = getIn(formState, "values." + name);
224 var syncError = getSyncError(getIn(formState, 'syncErrors'), name);
225 var syncWarning = getSyncWarning(getIn(formState, 'syncWarnings'), name);
226 var submitting = getIn(formState, 'submitting');
227 var pristine = value === initial;
228 accumulator[name] = {
229 asyncError: getIn(formState, "asyncErrors." + name),
230 asyncValidating: getIn(formState, 'asyncValidating') === name,
231 dirty: !pristine,
232 initial: initial,
233 pristine: pristine,
234 state: getIn(formState, "fields." + name),
235 submitError: getIn(formState, "submitErrors." + name),
236 submitFailed: getIn(formState, 'submitFailed'),
237 submitting: submitting,
238 syncError: syncError,
239 syncWarning: syncWarning,
240 value: value,
241 _value: ownProps.value // save value passed in (for radios)
242
243 };
244 return accumulator;
245 }, {})
246 };
247 }, undefined, undefined, {
248 forwardRef: true
249 });
250 return connector(ConnectedFields);
251};
252
253var _default = createConnectedFields;
254exports["default"] = _default;
\No newline at end of file