UNPKG

@data-driven-forms/react-form-renderer

Version:

React Form Renderer. Data Driven Forms converts JSON form definitions into fully functional React forms.

102 lines 5.08 kB
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); }; import { useCallback, useContext, useEffect, useMemo, useReducer } from 'react'; import isEqual from 'lodash/isEqual'; import useFormApi from '../use-form-api'; import parseCondition from '../parse-condition'; import RendererContext from '../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'; }; export 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; } }; var Condition = function (_a) { var condition = _a.condition, children = _a.children, field = _a.field; var formOptions = useFormApi(); var formState = formOptions.getState(); var conditionMapper = useContext(RendererContext).conditionMapper; var _b = useReducer(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 = useMemo(function () { return (condition ? parseCondition(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 : []; useEffect(function () { if (!formState.dirty) { dispatch({ type: 'formResetted' }); } }, [formState.dirty]); var setValue = useCallback(function (setter) { Object.entries(setter).forEach(function (_a) { var name = _a[0], value = _a[1]; formOptions.change(name, value); }); }, [formOptions]); useEffect(function () { if (setters && setters.length > 0 && (state.initial || !isEqual(setters, state.sets))) { setters.forEach(function (setter, index) { if (setter && (state.initial || !isEqual(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; }; export default Condition; //# sourceMappingURL=condition.js.map