cloudhubui
Version:
Various components to use in react projects
98 lines (85 loc) • 3.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _finalForm = require("final-form");
var _isPromise = _interopRequireDefault(require("./isPromise"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var tripleEquals = function tripleEquals(a, b) {
return a === b;
};
var createDecorator = function createDecorator() {
for (var _len = arguments.length, calculations = new Array(_len), _key = 0; _key < _len; _key++) {
calculations[_key] = arguments[_key];
}
return function (form) {
var previousValues = {};
var unsubscribe = form.subscribe(function (_ref) {
var values = _ref.values;
form.batch(function () {
var runUpdates = function runUpdates(field, isEqual, updates) {
var next = values && (0, _finalForm.getIn)(values, field);
var previous = previousValues && (0, _finalForm.getIn)(previousValues, field);
if (!isEqual(next, previous)) {
if (typeof updates === 'function') {
var results = updates(next, field, values, previousValues);
if ((0, _isPromise.default)(results)) {
results.then(function (resolved) {
Object.keys(resolved).forEach(function (destField) {
form.change(destField, resolved[destField]);
});
});
} else {
Object.keys(results).forEach(function (destField) {
form.change(destField, results[destField]);
});
}
} else {
Object.keys(updates).forEach(function (destField) {
var update = updates[destField];
var result = update(next, values, previousValues);
if ((0, _isPromise.default)(result)) {
result.then(function (resolved) {
form.change(destField, resolved);
});
} else {
form.change(destField, result);
}
});
}
}
};
var fields = form.getRegisteredFields();
calculations.forEach(function (_ref2) {
var field = _ref2.field,
isEqual = _ref2.isEqual,
updates = _ref2.updates;
if (typeof field === 'string') {
runUpdates(field, isEqual || tripleEquals, updates);
} else {
// field is a either array or regex
var matches = Array.isArray(field) ? function (name) {
return ~field.indexOf(name) || field.findIndex(function (f) {
return f instanceof RegExp && f.test(name);
}) !== -1;
} : function (name) {
return field.test(name);
};
fields.forEach(function (fieldName) {
if (matches(fieldName)) {
runUpdates(fieldName, isEqual || tripleEquals, updates);
}
});
}
});
previousValues = values;
});
}, {
values: true
});
return unsubscribe;
};
};
var _default = createDecorator;
exports.default = _default;