@data-driven-forms/react-form-renderer
Version:
React Form Renderer. Data Driven Forms converts JSON form definitions into fully functional React forms.
109 lines • 5.55 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.reducer = void 0;
var react_1 = require("react");
var isEqual_1 = __importDefault(require("lodash/isEqual"));
var use_form_api_1 = __importDefault(require("../use-form-api"));
var parse_condition_1 = __importDefault(require("../parse-condition"));
var renderer_context_1 = __importDefault(require("../renderer-context/renderer-context"));
var setterValueCheck = function (setterValue) {
if (setterValue === null || Array.isArray(setterValue)) {
console.error('Received invalid setterValue. Expected object, received: ', setterValue);
return false;
}
return typeof setterValue === 'object';
};
var reducer = function (state, _a) {
var type = _a.type, sets = _a.sets;
switch (type) {
case 'formResetted':
return __assign(__assign({}, state), { initial: true });
case 'rememberSets':
return __assign(__assign({}, state), { initial: false, sets: sets || [] });
default:
return state;
}
};
exports.reducer = reducer;
var Condition = function (_a) {
var condition = _a.condition, children = _a.children, field = _a.field;
var formOptions = (0, use_form_api_1.default)();
var formState = formOptions.getState();
var conditionMapper = (0, react_1.useContext)(renderer_context_1.default).conditionMapper;
var _b = (0, react_1.useReducer)(exports.reducer, {
sets: [],
initial: true,
}), state = _b[0], dispatch = _b[1];
// It is required to get the context state values from in order to get the latest state.
// Using the trigger values can cause issues with the radio field as each input is registered separately to state and does not yield the actual field value.
var conditionResult = (0, react_1.useMemo)(function () { return (condition ? (0, parse_condition_1.default)(condition, formState.values, field, conditionMapper) : { visible: true, result: true }); }, [formState.values, condition, field, conditionMapper]);
var hasSetProperty = function (result) { return 'set' in result; };
var hasSetsProperty = function (result) { return 'sets' in result; };
var setters = hasSetProperty(conditionResult) ? [conditionResult.set] : hasSetsProperty(conditionResult) ? conditionResult.sets : [];
(0, react_1.useEffect)(function () {
if (!formState.dirty) {
dispatch({ type: 'formResetted' });
}
}, [formState.dirty]);
var setValue = (0, react_1.useCallback)(function (setter) {
Object.entries(setter).forEach(function (_a) {
var name = _a[0], value = _a[1];
formOptions.change(name, value);
});
}, [formOptions]);
(0, react_1.useEffect)(function () {
if (setters && setters.length > 0 && (state.initial || !(0, isEqual_1.default)(setters, state.sets))) {
setters.forEach(function (setter, index) {
if (setter && (state.initial || !(0, isEqual_1.default)(setter, state.sets[index]))) {
setTimeout(function () {
/**
* We have to get the meta in the timeout to wait for state initialization
*/
var meta = formOptions.getFieldState(field.name);
var isFormModified = Object.values(formOptions.getState().modified || {}).some(Boolean);
/**
* Apply setter only
* - field has no initial value
* - form is modified
* - when meta is false = field was unmounted before timeout, we finish the condition
*/
if (!meta || isFormModified || typeof meta.initial === 'undefined') {
formOptions.batch(function () {
if (typeof setter !== 'function') {
setValue(setter);
}
else {
var setterValue = setter(formOptions.getState(), formOptions.getFieldState);
if (setterValueCheck(setterValue)) {
setValue(setterValue);
}
else {
console.error('Received invalid setterValue. Expected object, received: ', setterValue);
}
}
});
}
}, 0);
}
});
dispatch({ type: 'rememberSets', sets: setters });
}
}, [setters, state.initial, state.sets, setValue, formOptions, field.name]);
return conditionResult.visible ? children : null;
};
exports.default = Condition;
//# sourceMappingURL=condition.js.map