UNPKG

@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
"use strict"; 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