UNPKG

26.4 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports["default"] = void 0;
7
8var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
9
10var _isFunction2 = _interopRequireDefault(require("lodash/isFunction"));
11
12var _actionTypes = require("./actionTypes");
13
14var _deleteInWithCleanUp = _interopRequireDefault(require("./deleteInWithCleanUp"));
15
16var _plain = _interopRequireDefault(require("./structure/plain"));
17
18var shouldDelete = function shouldDelete(_ref) {
19 var getIn = _ref.getIn;
20 return function (state, path) {
21 var initialValuesPath = null;
22
23 if (/^values/.test(path)) {
24 initialValuesPath = path.replace('values', 'initial');
25 }
26
27 var initialValueComparison = initialValuesPath ? getIn(state, initialValuesPath) === undefined : true;
28 return getIn(state, path) !== undefined && initialValueComparison;
29 };
30};
31
32var isReduxFormAction = function isReduxFormAction(action) {
33 return action && action.type && action.type.length > _actionTypes.prefix.length && action.type.substring(0, _actionTypes.prefix.length) === _actionTypes.prefix;
34};
35
36function createReducer(structure) {
37 var _behaviors;
38
39 var deepEqual = structure.deepEqual,
40 empty = structure.empty,
41 forEach = structure.forEach,
42 getIn = structure.getIn,
43 setIn = structure.setIn,
44 deleteIn = structure.deleteIn,
45 fromJS = structure.fromJS,
46 keys = structure.keys,
47 size = structure.size,
48 some = structure.some,
49 splice = structure.splice;
50 var deleteInWithCleanUp = (0, _deleteInWithCleanUp["default"])(structure)(shouldDelete);
51 var plainDeleteInWithCleanUp = (0, _deleteInWithCleanUp["default"])(_plain["default"])(shouldDelete);
52
53 var doSplice = function doSplice(state, key, field, index, removeNum, value, force) {
54 var existing = getIn(state, key + "." + field);
55 return existing || force ? setIn(state, key + "." + field, splice(existing, index, removeNum, value)) : state;
56 };
57
58 var doPlainSplice = function doPlainSplice(state, key, field, index, removeNum, value, force) {
59 var slice = getIn(state, key);
60
61 var existing = _plain["default"].getIn(slice, field);
62
63 return existing || force ? setIn(state, key, _plain["default"].setIn(slice, field, _plain["default"].splice(existing, index, removeNum, value))) : state;
64 };
65
66 var rootKeys = ['values', 'fields', 'submitErrors', 'asyncErrors'];
67
68 var arraySplice = function arraySplice(state, field, index, removeNum, value) {
69 var result = state;
70 var nonValuesValue = value != null ? empty : undefined;
71 result = doSplice(result, 'values', field, index, removeNum, value, true);
72 result = doSplice(result, 'fields', field, index, removeNum, nonValuesValue);
73 result = doPlainSplice(result, 'syncErrors', field, index, removeNum, undefined);
74 result = doPlainSplice(result, 'syncWarnings', field, index, removeNum, undefined);
75 result = doSplice(result, 'submitErrors', field, index, removeNum, undefined);
76 result = doSplice(result, 'asyncErrors', field, index, removeNum, undefined);
77 return result;
78 };
79
80 var behaviors = (_behaviors = {}, _behaviors[_actionTypes.ARRAY_INSERT] = function (state, _ref2) {
81 var _ref2$meta = _ref2.meta,
82 field = _ref2$meta.field,
83 index = _ref2$meta.index,
84 payload = _ref2.payload;
85 return arraySplice(state, field, index, 0, payload);
86 }, _behaviors[_actionTypes.ARRAY_MOVE] = function (state, _ref3) {
87 var _ref3$meta = _ref3.meta,
88 field = _ref3$meta.field,
89 from = _ref3$meta.from,
90 to = _ref3$meta.to;
91 var array = getIn(state, "values." + field);
92 var length = array ? size(array) : 0;
93 var result = state;
94
95 if (length) {
96 rootKeys.forEach(function (key) {
97 var path = key + "." + field;
98
99 if (getIn(result, path)) {
100 var value = getIn(result, path + "[" + from + "]");
101 result = setIn(result, path, splice(getIn(result, path), from, 1)); // remove
102
103 result = setIn(result, path, splice(getIn(result, path), to, 0, value)); // insert
104 }
105 });
106 }
107
108 return result;
109 }, _behaviors[_actionTypes.ARRAY_POP] = function (state, _ref4) {
110 var field = _ref4.meta.field;
111 var array = getIn(state, "values." + field);
112 var length = array ? size(array) : 0;
113 return length ? arraySplice(state, field, length - 1, 1) : state;
114 }, _behaviors[_actionTypes.ARRAY_PUSH] = function (state, _ref5) {
115 var field = _ref5.meta.field,
116 payload = _ref5.payload;
117 var array = getIn(state, "values." + field);
118 var length = array ? size(array) : 0;
119 return arraySplice(state, field, length, 0, payload);
120 }, _behaviors[_actionTypes.ARRAY_REMOVE] = function (state, _ref6) {
121 var _ref6$meta = _ref6.meta,
122 field = _ref6$meta.field,
123 index = _ref6$meta.index;
124 return arraySplice(state, field, index, 1);
125 }, _behaviors[_actionTypes.ARRAY_REMOVE_ALL] = function (state, _ref7) {
126 var field = _ref7.meta.field;
127 var array = getIn(state, "values." + field);
128 var length = array ? size(array) : 0;
129 return length ? arraySplice(state, field, 0, length) : state;
130 }, _behaviors[_actionTypes.ARRAY_SHIFT] = function (state, _ref8) {
131 var field = _ref8.meta.field;
132 return arraySplice(state, field, 0, 1);
133 }, _behaviors[_actionTypes.ARRAY_SPLICE] = function (state, _ref9) {
134 var _ref9$meta = _ref9.meta,
135 field = _ref9$meta.field,
136 index = _ref9$meta.index,
137 removeNum = _ref9$meta.removeNum,
138 payload = _ref9.payload;
139 return arraySplice(state, field, index, removeNum, payload);
140 }, _behaviors[_actionTypes.ARRAY_SWAP] = function (state, _ref10) {
141 var _ref10$meta = _ref10.meta,
142 field = _ref10$meta.field,
143 indexA = _ref10$meta.indexA,
144 indexB = _ref10$meta.indexB;
145 var result = state;
146 rootKeys.forEach(function (key) {
147 var valueA = getIn(result, key + "." + field + "[" + indexA + "]");
148 var valueB = getIn(result, key + "." + field + "[" + indexB + "]");
149
150 if (valueA !== undefined || valueB !== undefined) {
151 result = setIn(result, key + "." + field + "[" + indexA + "]", valueB);
152 result = setIn(result, key + "." + field + "[" + indexB + "]", valueA);
153 }
154 });
155 return result;
156 }, _behaviors[_actionTypes.ARRAY_UNSHIFT] = function (state, _ref11) {
157 var field = _ref11.meta.field,
158 payload = _ref11.payload;
159 return arraySplice(state, field, 0, 0, payload);
160 }, _behaviors[_actionTypes.AUTOFILL] = function (state, _ref12) {
161 var field = _ref12.meta.field,
162 payload = _ref12.payload;
163 var result = state;
164 result = deleteInWithCleanUp(result, "asyncErrors." + field);
165 result = deleteInWithCleanUp(result, "submitErrors." + field);
166 result = setIn(result, "fields." + field + ".autofilled", true);
167 result = setIn(result, "values." + field, payload);
168 return result;
169 }, _behaviors[_actionTypes.BLUR] = function (state, _ref13) {
170 var _ref13$meta = _ref13.meta,
171 field = _ref13$meta.field,
172 touch = _ref13$meta.touch,
173 payload = _ref13.payload;
174 var result = state;
175 var initial = getIn(result, "initial." + field);
176
177 if (initial === undefined && payload === '') {
178 result = deleteInWithCleanUp(result, "values." + field);
179 } else if (payload !== undefined) {
180 result = setIn(result, "values." + field, payload);
181 }
182
183 if (field === getIn(result, 'active')) {
184 result = deleteIn(result, 'active');
185 }
186
187 result = deleteIn(result, "fields." + field + ".active");
188
189 if (touch) {
190 result = setIn(result, "fields." + field + ".touched", true);
191 result = setIn(result, 'anyTouched', true);
192 }
193
194 return result;
195 }, _behaviors[_actionTypes.CHANGE] = function (state, _ref14) {
196 var _ref14$meta = _ref14.meta,
197 field = _ref14$meta.field,
198 touch = _ref14$meta.touch,
199 persistentSubmitErrors = _ref14$meta.persistentSubmitErrors,
200 payload = _ref14.payload;
201 var result = state;
202 var initial = getIn(result, "initial." + field);
203
204 if (initial === undefined && payload === '' || payload === undefined) {
205 result = deleteInWithCleanUp(result, "values." + field);
206 } else if ((0, _isFunction2["default"])(payload)) {
207 var fieldCurrentValue = getIn(state, "values." + field);
208 result = setIn(result, "values." + field, payload(fieldCurrentValue, state.values));
209 } else {
210 result = setIn(result, "values." + field, payload);
211 }
212
213 result = deleteInWithCleanUp(result, "asyncErrors." + field);
214
215 if (!persistentSubmitErrors) {
216 result = deleteInWithCleanUp(result, "submitErrors." + field);
217 }
218
219 result = deleteInWithCleanUp(result, "fields." + field + ".autofilled");
220
221 if (touch) {
222 result = setIn(result, "fields." + field + ".touched", true);
223 result = setIn(result, 'anyTouched', true);
224 }
225
226 return result;
227 }, _behaviors[_actionTypes.CLEAR_SUBMIT] = function (state) {
228 return deleteIn(state, 'triggerSubmit');
229 }, _behaviors[_actionTypes.CLEAR_SUBMIT_ERRORS] = function (state) {
230 var result = state;
231 result = deleteInWithCleanUp(result, 'submitErrors');
232 result = deleteIn(result, 'error');
233 return result;
234 }, _behaviors[_actionTypes.CLEAR_ASYNC_ERROR] = function (state, _ref15) {
235 var field = _ref15.meta.field;
236 return deleteIn(state, "asyncErrors." + field);
237 }, _behaviors[_actionTypes.CLEAR_FIELDS] = function (state, _ref16) {
238 var _ref16$meta = _ref16.meta,
239 keepTouched = _ref16$meta.keepTouched,
240 persistentSubmitErrors = _ref16$meta.persistentSubmitErrors,
241 fields = _ref16$meta.fields;
242 var result = state;
243 fields.forEach(function (field) {
244 result = deleteInWithCleanUp(result, "asyncErrors." + field);
245
246 if (!persistentSubmitErrors) {
247 result = deleteInWithCleanUp(result, "submitErrors." + field);
248 }
249
250 result = deleteInWithCleanUp(result, "fields." + field + ".autofilled");
251
252 if (!keepTouched) {
253 result = deleteIn(result, "fields." + field + ".touched");
254 }
255
256 var values = getIn(state, "initial." + field);
257 result = values ? setIn(result, "values." + field, values) : deleteInWithCleanUp(result, "values." + field);
258 });
259 var anyTouched = some(keys(getIn(result, 'registeredFields')), function (key) {
260 return getIn(result, "fields." + key + ".touched");
261 });
262 result = anyTouched ? setIn(result, 'anyTouched', true) : deleteIn(result, 'anyTouched');
263 return result;
264 }, _behaviors[_actionTypes.FOCUS] = function (state, _ref17) {
265 var field = _ref17.meta.field;
266 var result = state;
267 var previouslyActive = getIn(state, 'active');
268 result = deleteIn(result, "fields." + previouslyActive + ".active");
269 result = setIn(result, "fields." + field + ".visited", true);
270 result = setIn(result, "fields." + field + ".active", true);
271 result = setIn(result, 'active', field);
272 return result;
273 }, _behaviors[_actionTypes.INITIALIZE] = function (state, _ref18) {
274 var payload = _ref18.payload,
275 _ref18$meta = _ref18.meta,
276 keepDirty = _ref18$meta.keepDirty,
277 keepSubmitSucceeded = _ref18$meta.keepSubmitSucceeded,
278 updateUnregisteredFields = _ref18$meta.updateUnregisteredFields,
279 keepValues = _ref18$meta.keepValues;
280 var mapData = fromJS(payload);
281 var result = empty; // clean all field state
282 // persist old warnings, they will get recalculated if the new form values are different from the old values
283
284 var warning = getIn(state, 'warning');
285
286 if (warning) {
287 result = setIn(result, 'warning', warning);
288 }
289
290 var syncWarnings = getIn(state, 'syncWarnings');
291
292 if (syncWarnings) {
293 result = setIn(result, 'syncWarnings', syncWarnings);
294 } // persist old errors, they will get recalculated if the new form values are different from the old values
295
296
297 var error = getIn(state, 'error');
298
299 if (error) {
300 result = setIn(result, 'error', error);
301 }
302
303 var syncErrors = getIn(state, 'syncErrors');
304
305 if (syncErrors) {
306 result = setIn(result, 'syncErrors', syncErrors);
307 }
308
309 var registeredFields = getIn(state, 'registeredFields');
310
311 if (registeredFields) {
312 result = setIn(result, 'registeredFields', registeredFields);
313 }
314
315 var previousValues = getIn(state, 'values');
316 var previousInitialValues = getIn(state, 'initial');
317 var newInitialValues = mapData;
318 var newValues = previousValues;
319
320 if (keepDirty && registeredFields) {
321 if (!deepEqual(newInitialValues, previousInitialValues)) {
322 //
323 // Keep the value of dirty fields while updating the value of
324 // pristine fields. This way, apps can reinitialize forms while
325 // avoiding stomping on user edits.
326 //
327 // Note 1: The initialize action replaces all initial values
328 // regardless of keepDirty.
329 //
330 // Note 2: When a field is dirty, keepDirty is enabled, and the field
331 // value is the same as the new initial value for the field, the
332 // initialize action causes the field to become pristine. That effect
333 // is what we want.
334 //
335 var overwritePristineValue = function overwritePristineValue(name) {
336 var previousInitialValue = getIn(previousInitialValues, name);
337 var previousValue = getIn(previousValues, name);
338
339 if (deepEqual(previousValue, previousInitialValue)) {
340 // Overwrite the old pristine value with the new pristine value
341 var newInitialValue = getIn(newInitialValues, name); // This check prevents any 'setIn' call that would create useless
342 // nested objects, since the path to the new field value would
343 // evaluate to the same (especially for undefined values)
344
345 if (getIn(newValues, name) !== newInitialValue) {
346 newValues = setIn(newValues, name, newInitialValue);
347 }
348 }
349 };
350
351 if (!updateUnregisteredFields) {
352 forEach(keys(registeredFields), function (name) {
353 return overwritePristineValue(name);
354 });
355 }
356
357 forEach(keys(newInitialValues), function (name) {
358 var previousInitialValue = getIn(previousInitialValues, name);
359
360 if (typeof previousInitialValue === 'undefined') {
361 // Add new values at the root level.
362 var newInitialValue = getIn(newInitialValues, name);
363 newValues = setIn(newValues, name, newInitialValue);
364 }
365
366 if (updateUnregisteredFields) {
367 overwritePristineValue(name);
368 }
369 });
370 }
371 } else {
372 newValues = newInitialValues;
373 }
374
375 if (keepValues) {
376 forEach(keys(previousValues), function (name) {
377 var previousValue = getIn(previousValues, name);
378 newValues = setIn(newValues, name, previousValue);
379 });
380 forEach(keys(previousInitialValues), function (name) {
381 var previousInitialValue = getIn(previousInitialValues, name);
382 newInitialValues = setIn(newInitialValues, name, previousInitialValue);
383 });
384 }
385
386 if (keepSubmitSucceeded && getIn(state, 'submitSucceeded')) {
387 result = setIn(result, 'submitSucceeded', true);
388 }
389
390 result = setIn(result, 'values', newValues);
391 result = setIn(result, 'initial', newInitialValues);
392 return result;
393 }, _behaviors[_actionTypes.REGISTER_FIELD] = function (state, _ref19) {
394 var _ref19$payload = _ref19.payload,
395 name = _ref19$payload.name,
396 type = _ref19$payload.type;
397 var key = "registeredFields['" + name + "']";
398 var field = getIn(state, key);
399
400 if (field) {
401 var count = getIn(field, 'count') + 1;
402 field = setIn(field, 'count', count);
403 } else {
404 field = fromJS({
405 name: name,
406 type: type,
407 count: 1
408 });
409 }
410
411 return setIn(state, key, field);
412 }, _behaviors[_actionTypes.RESET] = function (state) {
413 var result = empty;
414 var registeredFields = getIn(state, 'registeredFields');
415
416 if (registeredFields) {
417 result = setIn(result, 'registeredFields', registeredFields);
418 }
419
420 var values = getIn(state, 'initial');
421
422 if (values) {
423 result = setIn(result, 'values', values);
424 result = setIn(result, 'initial', values);
425 }
426
427 return result;
428 }, _behaviors[_actionTypes.RESET_SECTION] = function (state, _ref20) {
429 var sections = _ref20.meta.sections;
430 var result = state;
431 sections.forEach(function (section) {
432 result = deleteInWithCleanUp(result, "asyncErrors." + section);
433 result = deleteInWithCleanUp(result, "submitErrors." + section);
434 result = deleteInWithCleanUp(result, "fields." + section);
435 var values = getIn(state, "initial." + section);
436 result = values ? setIn(result, "values." + section, values) : deleteInWithCleanUp(result, "values." + section);
437 });
438 var anyTouched = some(keys(getIn(result, 'registeredFields')), function (key) {
439 return getIn(result, "fields." + key + ".touched");
440 });
441 result = anyTouched ? setIn(result, 'anyTouched', true) : deleteIn(result, 'anyTouched');
442 return result;
443 }, _behaviors[_actionTypes.SUBMIT] = function (state) {
444 return setIn(state, 'triggerSubmit', true);
445 }, _behaviors[_actionTypes.START_ASYNC_VALIDATION] = function (state, _ref21) {
446 var field = _ref21.meta.field;
447 return setIn(state, 'asyncValidating', field || true);
448 }, _behaviors[_actionTypes.START_SUBMIT] = function (state) {
449 return setIn(state, 'submitting', true);
450 }, _behaviors[_actionTypes.STOP_ASYNC_VALIDATION] = function (state, _ref22) {
451 var payload = _ref22.payload;
452 var result = state;
453 result = deleteIn(result, 'asyncValidating');
454
455 if (payload && Object.keys(payload).length) {
456 var _error = payload._error,
457 fieldErrors = (0, _objectWithoutPropertiesLoose2["default"])(payload, ["_error"]);
458
459 if (_error) {
460 result = setIn(result, 'error', _error);
461 }
462
463 if (Object.keys(fieldErrors).length) {
464 result = setIn(result, 'asyncErrors', fromJS(fieldErrors));
465 }
466 } else {
467 result = deleteIn(result, 'error');
468 result = deleteIn(result, 'asyncErrors');
469 }
470
471 return result;
472 }, _behaviors[_actionTypes.STOP_SUBMIT] = function (state, _ref23) {
473 var payload = _ref23.payload;
474 var result = state;
475 result = deleteIn(result, 'submitting');
476 result = deleteIn(result, 'submitFailed');
477 result = deleteIn(result, 'submitSucceeded');
478
479 if (payload && Object.keys(payload).length) {
480 var _error = payload._error,
481 fieldErrors = (0, _objectWithoutPropertiesLoose2["default"])(payload, ["_error"]);
482
483 if (_error) {
484 result = setIn(result, 'error', _error);
485 } else {
486 result = deleteIn(result, 'error');
487 }
488
489 if (Object.keys(fieldErrors).length) {
490 result = setIn(result, 'submitErrors', fromJS(fieldErrors));
491 } else {
492 result = deleteIn(result, 'submitErrors');
493 }
494
495 result = setIn(result, 'submitFailed', true);
496 } else {
497 result = deleteIn(result, 'error');
498 result = deleteIn(result, 'submitErrors');
499 }
500
501 return result;
502 }, _behaviors[_actionTypes.SET_SUBMIT_FAILED] = function (state, _ref24) {
503 var fields = _ref24.meta.fields;
504 var result = state;
505 result = setIn(result, 'submitFailed', true);
506 result = deleteIn(result, 'submitSucceeded');
507 result = deleteIn(result, 'submitting');
508 fields.forEach(function (field) {
509 return result = setIn(result, "fields." + field + ".touched", true);
510 });
511
512 if (fields.length) {
513 result = setIn(result, 'anyTouched', true);
514 }
515
516 return result;
517 }, _behaviors[_actionTypes.SET_SUBMIT_SUCCEEDED] = function (state) {
518 var result = state;
519 result = deleteIn(result, 'submitFailed');
520 result = setIn(result, 'submitSucceeded', true);
521 return result;
522 }, _behaviors[_actionTypes.TOUCH] = function (state, _ref25) {
523 var fields = _ref25.meta.fields;
524 var result = state;
525 fields.forEach(function (field) {
526 return result = setIn(result, "fields." + field + ".touched", true);
527 });
528 result = setIn(result, 'anyTouched', true);
529 return result;
530 }, _behaviors[_actionTypes.UNREGISTER_FIELD] = function (state, _ref26) {
531 var _ref26$payload = _ref26.payload,
532 name = _ref26$payload.name,
533 destroyOnUnmount = _ref26$payload.destroyOnUnmount;
534 var result = state;
535 var key = "registeredFields['" + name + "']";
536 var field = getIn(result, key);
537
538 if (!field) {
539 return result;
540 }
541
542 var count = getIn(field, 'count') - 1;
543
544 if (count <= 0 && destroyOnUnmount) {
545 // Note: Cannot use deleteWithCleanUp here because of the flat nature of registeredFields
546 result = deleteIn(result, key);
547
548 if (deepEqual(getIn(result, 'registeredFields'), empty)) {
549 result = deleteIn(result, 'registeredFields');
550 }
551
552 var syncErrors = getIn(result, 'syncErrors');
553
554 if (syncErrors) {
555 syncErrors = plainDeleteInWithCleanUp(syncErrors, name);
556
557 if (_plain["default"].deepEqual(syncErrors, _plain["default"].empty)) {
558 result = deleteIn(result, 'syncErrors');
559 } else {
560 result = setIn(result, 'syncErrors', syncErrors);
561 }
562 }
563
564 var syncWarnings = getIn(result, 'syncWarnings');
565
566 if (syncWarnings) {
567 syncWarnings = plainDeleteInWithCleanUp(syncWarnings, name);
568
569 if (_plain["default"].deepEqual(syncWarnings, _plain["default"].empty)) {
570 result = deleteIn(result, 'syncWarnings');
571 } else {
572 result = setIn(result, 'syncWarnings', syncWarnings);
573 }
574 }
575
576 result = deleteInWithCleanUp(result, "submitErrors." + name);
577 result = deleteInWithCleanUp(result, "asyncErrors." + name);
578 } else {
579 field = setIn(field, 'count', count);
580 result = setIn(result, key, field);
581 }
582
583 return result;
584 }, _behaviors[_actionTypes.UNTOUCH] = function (state, _ref27) {
585 var fields = _ref27.meta.fields;
586 var result = state;
587 fields.forEach(function (field) {
588 return result = deleteIn(result, "fields." + field + ".touched");
589 });
590 var anyTouched = some(keys(getIn(result, 'registeredFields')), function (key) {
591 return getIn(result, "fields." + key + ".touched");
592 });
593 result = anyTouched ? setIn(result, 'anyTouched', true) : deleteIn(result, 'anyTouched');
594 return result;
595 }, _behaviors[_actionTypes.UPDATE_SYNC_ERRORS] = function (state, _ref28) {
596 var _ref28$payload = _ref28.payload,
597 syncErrors = _ref28$payload.syncErrors,
598 error = _ref28$payload.error;
599 var result = state;
600
601 if (error) {
602 result = setIn(result, 'error', error);
603 result = setIn(result, 'syncError', true);
604 } else {
605 result = deleteIn(result, 'error');
606 result = deleteIn(result, 'syncError');
607 }
608
609 if (Object.keys(syncErrors).length) {
610 result = setIn(result, 'syncErrors', syncErrors);
611 } else {
612 result = deleteIn(result, 'syncErrors');
613 }
614
615 return result;
616 }, _behaviors[_actionTypes.UPDATE_SYNC_WARNINGS] = function (state, _ref29) {
617 var _ref29$payload = _ref29.payload,
618 syncWarnings = _ref29$payload.syncWarnings,
619 warning = _ref29$payload.warning;
620 var result = state;
621
622 if (warning) {
623 result = setIn(result, 'warning', warning);
624 } else {
625 result = deleteIn(result, 'warning');
626 }
627
628 if (Object.keys(syncWarnings).length) {
629 result = setIn(result, 'syncWarnings', syncWarnings);
630 } else {
631 result = deleteIn(result, 'syncWarnings');
632 }
633
634 return result;
635 }, _behaviors);
636
637 var reducer = function reducer(state, action) {
638 if (state === void 0) {
639 state = empty;
640 }
641
642 var behavior = behaviors[action.type];
643 return behavior ? behavior(state, action) : state;
644 };
645
646 var byForm = function byForm(reducer) {
647 return function (state, action) {
648 if (state === void 0) {
649 state = empty;
650 }
651
652 if (action === void 0) {
653 action = {
654 type: 'NONE'
655 };
656 }
657
658 var form = action && action.meta && action.meta.form;
659
660 if (!form || !isReduxFormAction(action)) {
661 return state;
662 }
663
664 if (action.type === _actionTypes.DESTROY && action.meta && action.meta.form) {
665 return action.meta.form.reduce(function (result, form) {
666 return deleteInWithCleanUp(result, form);
667 }, state);
668 }
669
670 var formState = getIn(state, form);
671 var result = reducer(formState, action);
672 return result === formState ? state : setIn(state, form, result);
673 };
674 };
675 /**
676 * Adds additional functionality to the reducer
677 */
678
679
680 function decorate(target) {
681 target.plugin = function (reducers, config) {
682 var _this = this;
683
684 if (config === void 0) {
685 config = {};
686 }
687
688 // use 'function' keyword to enable 'this'
689 return decorate(function (state, action) {
690 if (state === void 0) {
691 state = empty;
692 }
693
694 if (action === void 0) {
695 action = {
696 type: 'NONE'
697 };
698 }
699
700 var callPlugin = function callPlugin(processed, key) {
701 var previousState = getIn(processed, key);
702 var nextState = reducers[key](previousState, action, getIn(state, key));
703 return nextState !== previousState ? setIn(processed, key, nextState) : processed;
704 };
705
706 var processed = _this(state, action); // run through redux-form reducer
707
708
709 var form = action && action.meta && action.meta.form;
710
711 if (form && !config.receiveAllFormActions) {
712 // this is an action aimed at forms, so only give it to the specified form's plugin
713 return reducers[form] ? callPlugin(processed, form) : processed;
714 } else {
715 // this is not a form-specific action, so send it to all the plugins
716 return Object.keys(reducers).reduce(callPlugin, processed);
717 }
718 });
719 };
720
721 return target;
722 }
723
724 return decorate(byForm(reducer));
725}
726
727var _default = createReducer;
728exports["default"] = _default;
\No newline at end of file